2 * Minimal wrappers to allow compiling igb_uio on older kernels.
5 #ifndef RHEL_RELEASE_VERSION
6 #define RHEL_RELEASE_VERSION(a, b) (((a) << 8) + (b))
9 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)
10 #define pci_cfg_access_lock pci_block_user_cfg_access
11 #define pci_cfg_access_unlock pci_unblock_user_cfg_access
14 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0)
15 #define HAVE_PTE_MASK_PAGE_IOMAP
18 #ifndef PCI_MSIX_ENTRY_SIZE
19 #define PCI_MSIX_ENTRY_SIZE 16
20 #define PCI_MSIX_ENTRY_LOWER_ADDR 0
21 #define PCI_MSIX_ENTRY_UPPER_ADDR 4
22 #define PCI_MSIX_ENTRY_DATA 8
23 #define PCI_MSIX_ENTRY_VECTOR_CTRL 12
24 #define PCI_MSIX_ENTRY_CTRL_MASKBIT 1
28 * for kernels < 2.6.38 and backported patch that moves MSI-X entry definition
29 * to pci_regs.h Those kernels has PCI_MSIX_ENTRY_SIZE defined but not
30 * PCI_MSIX_ENTRY_CTRL_MASKBIT
32 #ifndef PCI_MSIX_ENTRY_CTRL_MASKBIT
33 #define PCI_MSIX_ENTRY_CTRL_MASKBIT 1
36 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34) && \
37 (!(defined(RHEL_RELEASE_CODE) && \
38 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5, 9)))
40 static int pci_num_vf(struct pci_dev *dev)
50 } *iov = (struct iov *)dev->sriov;
55 return iov->nr_virtfn;
60 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && \
61 (!(defined(RHEL_RELEASE_CODE) && \
62 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 4)))
64 #define kstrtoul strict_strtoul
68 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) && \
69 (!(defined(RHEL_RELEASE_CODE) && \
70 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 3)))
72 /* Check if INTX works to control irq's.
73 * Set's INTX_DISABLE flag and reads it back
75 static bool pci_intx_mask_supported(struct pci_dev *pdev)
77 bool mask_supported = false;
80 pci_block_user_cfg_access(pdev);
81 pci_read_config_word(pdev, PCI_COMMAND, &orig);
82 pci_write_config_word(pdev, PCI_COMMAND,
83 orig ^ PCI_COMMAND_INTX_DISABLE);
84 pci_read_config_word(pdev, PCI_COMMAND, &new);
86 if ((new ^ orig) & ~PCI_COMMAND_INTX_DISABLE) {
87 dev_err(&pdev->dev, "Command register changed from "
88 "0x%x to 0x%x: driver or hardware bug?\n", orig, new);
89 } else if ((new ^ orig) & PCI_COMMAND_INTX_DISABLE) {
90 mask_supported = true;
91 pci_write_config_word(pdev, PCI_COMMAND, orig);
93 pci_unblock_user_cfg_access(pdev);
95 return mask_supported;
98 static bool pci_check_and_mask_intx(struct pci_dev *pdev)
103 pci_block_user_cfg_access(pdev);
104 pci_read_config_dword(pdev, PCI_COMMAND, &status);
106 /* interrupt is not ours, goes to out */
107 pending = (((status >> 16) & PCI_STATUS_INTERRUPT) != 0);
113 new = old & (~PCI_COMMAND_INTX_DISABLE);
115 new = old | PCI_COMMAND_INTX_DISABLE;
118 pci_write_config_word(pdev, PCI_COMMAND, new);
120 pci_unblock_user_cfg_access(pdev);
127 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0)
128 #define HAVE_PCI_ENABLE_MSIX