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 #ifndef PCI_MSIX_ENTRY_SIZE
15 #define PCI_MSIX_ENTRY_SIZE 16
16 #define PCI_MSIX_ENTRY_LOWER_ADDR 0
17 #define PCI_MSIX_ENTRY_UPPER_ADDR 4
18 #define PCI_MSIX_ENTRY_DATA 8
19 #define PCI_MSIX_ENTRY_VECTOR_CTRL 12
20 #define PCI_MSIX_ENTRY_CTRL_MASKBIT 1
23 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34) && \
24 (!(defined(RHEL_RELEASE_CODE) && \
25 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5, 9)))
27 static int pci_num_vf(struct pci_dev *dev)
37 } *iov = (struct iov *)dev->sriov;
42 return iov->nr_virtfn;
47 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && \
48 (!(defined(RHEL_RELEASE_CODE) && \
49 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 4)))
51 #define kstrtoul strict_strtoul
55 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) && \
56 (!(defined(RHEL_RELEASE_CODE) && \
57 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 3)))
59 /* Check if INTX works to control irq's.
60 * Set's INTX_DISABLE flag and reads it back
62 static bool pci_intx_mask_supported(struct pci_dev *pdev)
64 bool mask_supported = false;
67 pci_block_user_cfg_access(pdev);
68 pci_read_config_word(pdev, PCI_COMMAND, &orig);
69 pci_write_config_word(pdev, PCI_COMMAND,
70 orig ^ PCI_COMMAND_INTX_DISABLE);
71 pci_read_config_word(pdev, PCI_COMMAND, &new);
73 if ((new ^ orig) & ~PCI_COMMAND_INTX_DISABLE) {
74 dev_err(&pdev->dev, "Command register changed from "
75 "0x%x to 0x%x: driver or hardware bug?\n", orig, new);
76 } else if ((new ^ orig) & PCI_COMMAND_INTX_DISABLE) {
77 mask_supported = true;
78 pci_write_config_word(pdev, PCI_COMMAND, orig);
80 pci_unblock_user_cfg_access(pdev);
82 return mask_supported;
85 static bool pci_check_and_mask_intx(struct pci_dev *pdev)
90 pci_block_user_cfg_access(pdev);
91 pci_read_config_dword(pdev, PCI_COMMAND, &status);
93 /* interrupt is not ours, goes to out */
94 pending = (((status >> 16) & PCI_STATUS_INTERRUPT) != 0);
100 new = old & (~PCI_COMMAND_INTX_DISABLE);
102 new = old | PCI_COMMAND_INTX_DISABLE;
105 pci_write_config_word(pdev, PCI_COMMAND, new);
107 pci_unblock_user_cfg_access(pdev);