mirror of
https://github.com/opnsense/src.git
synced 2026-02-20 00:11:07 -05:00
LinuxKPI: add module_pci_driver() and pci_alloc_irq_vectors()
Add the two new functions needed by rtw88 to register the driver and handle the module bits as well as a version of pci_alloc_irq_vectors() for what is needed. Reviewed by: hselasky MFC after: 10 days Differential Revision: https://reviews.freebsd.org/D30981
This commit is contained in:
parent
30c6d98219
commit
366d68f283
1 changed files with 59 additions and 0 deletions
|
|
@ -186,6 +186,10 @@ typedef int pci_power_t;
|
|||
|
||||
#define PCI_EXT_CAP_ID_ERR PCIZ_AER
|
||||
|
||||
#define PCI_IRQ_LEGACY 0x01
|
||||
#define PCI_IRQ_MSI 0x02
|
||||
#define PCI_IRQ_MSIX 0x04
|
||||
|
||||
struct pci_dev;
|
||||
|
||||
struct pci_driver {
|
||||
|
|
@ -221,6 +225,25 @@ extern spinlock_t pci_lock;
|
|||
|
||||
#define __devexit_p(x) x
|
||||
|
||||
#define module_pci_driver(_driver) \
|
||||
\
|
||||
static inline int \
|
||||
_pci_init(void) \
|
||||
{ \
|
||||
\
|
||||
return (linux_pci_register_driver(&_driver)); \
|
||||
} \
|
||||
\
|
||||
static inline void \
|
||||
_pci_exit(void) \
|
||||
{ \
|
||||
\
|
||||
linux_pci_unregister_driver(&_driver); \
|
||||
} \
|
||||
\
|
||||
module_init(_pci_init); \
|
||||
module_exit(_pci_exit)
|
||||
|
||||
/*
|
||||
* If we find drivers accessing this from multiple KPIs we may have to
|
||||
* refcount objects of this structure.
|
||||
|
|
@ -817,6 +840,42 @@ pci_enable_msi(struct pci_dev *pdev)
|
|||
return (0);
|
||||
}
|
||||
|
||||
static inline int
|
||||
pci_alloc_irq_vectors(struct pci_dev *pdev, int minv, int maxv,
|
||||
unsigned int flags)
|
||||
{
|
||||
int error;
|
||||
|
||||
if (flags & PCI_IRQ_MSIX) {
|
||||
struct msix_entry *entries;
|
||||
int i;
|
||||
|
||||
entries = kcalloc(maxv, sizeof(*entries), GFP_KERNEL);
|
||||
if (entries == NULL) {
|
||||
error = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
for (i = 0; i < maxv; ++i)
|
||||
entries[i].entry = i;
|
||||
error = pci_enable_msix(pdev, entries, maxv);
|
||||
out:
|
||||
kfree(entries);
|
||||
if (error == 0 && pdev->msix_enabled)
|
||||
return (pdev->dev.irq_end - pdev->dev.irq_start);
|
||||
}
|
||||
if (flags & PCI_IRQ_MSI) {
|
||||
error = pci_enable_msi(pdev);
|
||||
if (error == 0 && pdev->msi_enabled)
|
||||
return (pdev->dev.irq_end - pdev->dev.irq_start);
|
||||
}
|
||||
if (flags & PCI_IRQ_LEGACY) {
|
||||
if (pdev->irq)
|
||||
return (1);
|
||||
}
|
||||
|
||||
return (-EINVAL);
|
||||
}
|
||||
|
||||
static inline int
|
||||
pci_channel_offline(struct pci_dev *pdev)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue