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:
Bjoern A. Zeeb 2021-07-01 13:33:01 +00:00
parent 30c6d98219
commit 366d68f283

View file

@ -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)
{