diff --git a/src/igb/Makefile b/src/igb/Makefile index ab8c68cef32d..e9cf478d2953 100644 --- a/src/igb/Makefile +++ b/src/igb/Makefile @@ -12,6 +12,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Patch pushd ./igb-$(IGB_DRIVER_VERSION) patch -p1 < ../patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch + patch -p4 < ../patch/0002-Force-disable-MII-isolate-mode.patch # Build the package pushd src diff --git a/src/igb/patch/0002-Force-disable-MII-isolate-mode.patch b/src/igb/patch/0002-Force-disable-MII-isolate-mode.patch new file mode 100644 index 000000000000..15647ae38352 --- /dev/null +++ b/src/igb/patch/0002-Force-disable-MII-isolate-mode.patch @@ -0,0 +1,93 @@ +Force disable MII isolate mode +From: wadelnn + +--- + src/igb/igb-5.3.5.4/src/e1000_82575.c | 7 ++++++- + src/igb/igb-5.3.5.4/src/e1000_hw.h | 1 + + src/igb/igb-5.3.5.4/src/e1000_phy.c | 13 +++++++++++++ + src/igb/igb-5.3.5.4/src/e1000_phy.h | 1 + + 4 files changed, 21 insertions(+), 1 deletion(-) + +diff --git a/src/igb/igb-5.3.5.4/src/e1000_82575.c b/src/igb/igb-5.3.5.4/src/e1000_82575.c +index 049ab7b..49ec487 100644 +--- a/src/igb/igb-5.3.5.4/src/e1000_82575.c ++++ b/src/igb/igb-5.3.5.4/src/e1000_82575.c +@@ -223,7 +223,6 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) + case M88E1112_E_PHY_ID: + case M88E1340M_E_PHY_ID: + case M88E1111_I_PHY_ID: +- case BCM54616_E_PHY_ID: + phy->type = e1000_phy_m88; + phy->ops.check_polarity = e1000_check_polarity_m88; + phy->ops.get_info = e1000_get_phy_info_m88; +@@ -273,6 +272,9 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) + goto out; + } + break; ++ case BCM54616_E_PHY_ID: ++ phy->type = e1000_phy_bcm54616; ++ break; + case IGP03E1000_E_PHY_ID: + case IGP04E1000_E_PHY_ID: + phy->type = e1000_phy_igp_3; +@@ -1603,6 +1605,9 @@ static s32 e1000_setup_copper_link_82575(struct e1000_hw *hw) + case e1000_phy_82580: + ret_val = e1000_copper_link_setup_82577(hw); + break; ++ case e1000_phy_bcm54616: ++ ret_val = e1000_copper_link_setup_bcm54616(hw); ++ break; + default: + ret_val = -E1000_ERR_PHY; + break; +diff --git a/src/igb/igb-5.3.5.4/src/e1000_hw.h b/src/igb/igb-5.3.5.4/src/e1000_hw.h +index 3bcecf1..cca5d77 100644 +--- a/src/igb/igb-5.3.5.4/src/e1000_hw.h ++++ b/src/igb/igb-5.3.5.4/src/e1000_hw.h +@@ -133,6 +133,7 @@ enum e1000_phy_type { + e1000_phy_82580, + e1000_phy_vf, + e1000_phy_i210, ++ e1000_phy_bcm54616, + }; + + enum e1000_bus_type { +diff --git a/src/igb/igb-5.3.5.4/src/e1000_phy.c b/src/igb/igb-5.3.5.4/src/e1000_phy.c +index 5172691..7c79f69 100644 +--- a/src/igb/igb-5.3.5.4/src/e1000_phy.c ++++ b/src/igb/igb-5.3.5.4/src/e1000_phy.c +@@ -1367,6 +1367,19 @@ s32 e1000_copper_link_setup_igp(struct e1000_hw *hw) + return ret_val; + } + ++s32 e1000_copper_link_setup_bcm54616(struct e1000_hw *hw) ++{ ++ struct e1000_phy_info *phy = &hw->phy; ++ s32 ret_val; ++ u16 phy_data; ++ ++ ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_data); ++ phy_data &=~(MII_CR_ISOLATE); ++ ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_data); ++ ++ return 0; ++} ++ + /** + * e1000_phy_setup_autoneg - Configure PHY for auto-negotiation + * @hw: pointer to the HW structure +diff --git a/src/igb/igb-5.3.5.4/src/e1000_phy.h b/src/igb/igb-5.3.5.4/src/e1000_phy.h +index a109c91..f852b5b 100644 +--- a/src/igb/igb-5.3.5.4/src/e1000_phy.h ++++ b/src/igb/igb-5.3.5.4/src/e1000_phy.h +@@ -43,6 +43,7 @@ s32 e1000_check_reset_block_generic(struct e1000_hw *hw); + s32 e1000_copper_link_setup_igp(struct e1000_hw *hw); + s32 e1000_copper_link_setup_m88(struct e1000_hw *hw); + s32 e1000_copper_link_setup_m88_gen2(struct e1000_hw *hw); ++s32 e1000_copper_link_setup_bcm54616(struct e1000_hw *hw); + s32 e1000_phy_force_speed_duplex_igp(struct e1000_hw *hw); + s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw); + s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw); +-- +2.1.4 +