diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2008-12-10 04:09:53 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-10 04:09:53 -0500 |
commit | 5e8427e5e25e3f844113cf67d07e7806bbe8c0e2 (patch) | |
tree | 80851d045a850dc981c071fc4bb9ea763dbd8cd4 /drivers/net/igb/e1000_mac.c | |
parent | b4557be23dc959f38eed21d359ec7164e42bcbd6 (diff) |
igb: Correctly determine pci-e function number in virtual environment
When running in a virtual environment the ports of an 82575/6 can appear to
be single function devices which is not correct. To resolve this we rely
on the function number stored in the status register.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/igb/e1000_mac.c')
-rw-r--r-- | drivers/net/igb/e1000_mac.c | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/drivers/net/igb/e1000_mac.c b/drivers/net/igb/e1000_mac.c index e18747c70bec..137269daeb2e 100644 --- a/drivers/net/igb/e1000_mac.c +++ b/drivers/net/igb/e1000_mac.c | |||
@@ -83,8 +83,8 @@ s32 igb_get_bus_info_pcie(struct e1000_hw *hw) | |||
83 | { | 83 | { |
84 | struct e1000_bus_info *bus = &hw->bus; | 84 | struct e1000_bus_info *bus = &hw->bus; |
85 | s32 ret_val; | 85 | s32 ret_val; |
86 | u32 status; | 86 | u32 reg; |
87 | u16 pcie_link_status, pci_header_type; | 87 | u16 pcie_link_status; |
88 | 88 | ||
89 | bus->type = e1000_bus_type_pci_express; | 89 | bus->type = e1000_bus_type_pci_express; |
90 | bus->speed = e1000_bus_speed_2500; | 90 | bus->speed = e1000_bus_speed_2500; |
@@ -99,14 +99,8 @@ s32 igb_get_bus_info_pcie(struct e1000_hw *hw) | |||
99 | PCIE_LINK_WIDTH_MASK) >> | 99 | PCIE_LINK_WIDTH_MASK) >> |
100 | PCIE_LINK_WIDTH_SHIFT); | 100 | PCIE_LINK_WIDTH_SHIFT); |
101 | 101 | ||
102 | igb_read_pci_cfg(hw, PCI_HEADER_TYPE_REGISTER, &pci_header_type); | 102 | reg = rd32(E1000_STATUS); |
103 | if (pci_header_type & PCI_HEADER_TYPE_MULTIFUNC) { | 103 | bus->func = (reg & E1000_STATUS_FUNC_MASK) >> E1000_STATUS_FUNC_SHIFT; |
104 | status = rd32(E1000_STATUS); | ||
105 | bus->func = (status & E1000_STATUS_FUNC_MASK) | ||
106 | >> E1000_STATUS_FUNC_SHIFT; | ||
107 | } else { | ||
108 | bus->func = 0; | ||
109 | } | ||
110 | 104 | ||
111 | return 0; | 105 | return 0; |
112 | } | 106 | } |
@@ -229,8 +223,8 @@ void igb_rar_set(struct e1000_hw *hw, u8 *addr, u32 index) | |||
229 | if (!hw->mac.disable_av) | 223 | if (!hw->mac.disable_av) |
230 | rar_high |= E1000_RAH_AV; | 224 | rar_high |= E1000_RAH_AV; |
231 | 225 | ||
232 | array_wr32(E1000_RA, (index << 1), rar_low); | 226 | wr32(E1000_RAL(index), rar_low); |
233 | array_wr32(E1000_RA, ((index << 1) + 1), rar_high); | 227 | wr32(E1000_RAH(index), rar_high); |
234 | } | 228 | } |
235 | 229 | ||
236 | /** | 230 | /** |