|
@@ -53,17 +53,30 @@ s32 igb_get_bus_info_pcie(struct e1000_hw *hw)
|
|
|
u16 pcie_link_status;
|
|
|
|
|
|
bus->type = e1000_bus_type_pci_express;
|
|
|
- bus->speed = e1000_bus_speed_2500;
|
|
|
|
|
|
ret_val = igb_read_pcie_cap_reg(hw,
|
|
|
- PCIE_LINK_STATUS,
|
|
|
- &pcie_link_status);
|
|
|
- if (ret_val)
|
|
|
+ PCI_EXP_LNKSTA,
|
|
|
+ &pcie_link_status);
|
|
|
+ if (ret_val) {
|
|
|
bus->width = e1000_bus_width_unknown;
|
|
|
- else
|
|
|
+ bus->speed = e1000_bus_speed_unknown;
|
|
|
+ } else {
|
|
|
+ switch (pcie_link_status & PCI_EXP_LNKSTA_CLS) {
|
|
|
+ case PCI_EXP_LNKSTA_CLS_2_5GB:
|
|
|
+ bus->speed = e1000_bus_speed_2500;
|
|
|
+ break;
|
|
|
+ case PCI_EXP_LNKSTA_CLS_5_0GB:
|
|
|
+ bus->speed = e1000_bus_speed_5000;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ bus->speed = e1000_bus_speed_unknown;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
bus->width = (enum e1000_bus_width)((pcie_link_status &
|
|
|
- PCIE_LINK_WIDTH_MASK) >>
|
|
|
- PCIE_LINK_WIDTH_SHIFT);
|
|
|
+ PCI_EXP_LNKSTA_NLW) >>
|
|
|
+ PCI_EXP_LNKSTA_NLW_SHIFT);
|
|
|
+ }
|
|
|
|
|
|
reg = rd32(E1000_STATUS);
|
|
|
bus->func = (reg & E1000_STATUS_FUNC_MASK) >> E1000_STATUS_FUNC_SHIFT;
|