|
@@ -2783,17 +2783,36 @@ san_mac_addr_out:
|
|
|
* Read PCIe configuration space, and get the MSI-X vector count from
|
|
|
* the capabilities table.
|
|
|
**/
|
|
|
-u32 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw)
|
|
|
+u16 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw)
|
|
|
{
|
|
|
struct ixgbe_adapter *adapter = hw->back;
|
|
|
- u16 msix_count;
|
|
|
- pci_read_config_word(adapter->pdev, IXGBE_PCIE_MSIX_82599_CAPS,
|
|
|
- &msix_count);
|
|
|
+ u16 msix_count = 1;
|
|
|
+ u16 max_msix_count;
|
|
|
+ u16 pcie_offset;
|
|
|
+
|
|
|
+ switch (hw->mac.type) {
|
|
|
+ case ixgbe_mac_82598EB:
|
|
|
+ pcie_offset = IXGBE_PCIE_MSIX_82598_CAPS;
|
|
|
+ max_msix_count = IXGBE_MAX_MSIX_VECTORS_82598;
|
|
|
+ break;
|
|
|
+ case ixgbe_mac_82599EB:
|
|
|
+ case ixgbe_mac_X540:
|
|
|
+ pcie_offset = IXGBE_PCIE_MSIX_82599_CAPS;
|
|
|
+ max_msix_count = IXGBE_MAX_MSIX_VECTORS_82599;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return msix_count;
|
|
|
+ }
|
|
|
+
|
|
|
+ pci_read_config_word(adapter->pdev, pcie_offset, &msix_count);
|
|
|
msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK;
|
|
|
|
|
|
- /* MSI-X count is zero-based in HW, so increment to give proper value */
|
|
|
+ /* MSI-X count is zero-based in HW */
|
|
|
msix_count++;
|
|
|
|
|
|
+ if (msix_count > max_msix_count)
|
|
|
+ msix_count = max_msix_count;
|
|
|
+
|
|
|
return msix_count;
|
|
|
}
|
|
|
|