Add necessary configurations for Amber-Lite's hardware reset process, which differs from the 10G NIC's. These configurations may be modified in future to accommodate further changes.
Signed-off-by: Zaiyu Wang <zaiyuw...@trustnetic.com> --- drivers/net/txgbe/base/txgbe_hw.c | 72 ++++++++++++++++++++++------- drivers/net/txgbe/base/txgbe_regs.h | 2 + 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/drivers/net/txgbe/base/txgbe_hw.c b/drivers/net/txgbe/base/txgbe_hw.c index 4fc4b4e284..f82bbee6f0 100644 --- a/drivers/net/txgbe/base/txgbe_hw.c +++ b/drivers/net/txgbe/base/txgbe_hw.c @@ -267,6 +267,8 @@ s32 txgbe_start_hw(struct txgbe_hw *hw) /* Cache bit indicating need for crosstalk fix */ switch (hw->mac.type) { case txgbe_mac_raptor: + case txgbe_mac_aml: + case txgbe_mac_aml40: hw->mac.get_device_caps(hw, &device_caps); if (device_caps & TXGBE_DEVICE_CAPS_NO_CROSSTALK_WR) hw->need_crosstalk_fix = false; @@ -3500,13 +3502,37 @@ txgbe_reset_misc(struct txgbe_hw *hw) { int i; u32 value; + int err = 0; + u32 speed; wr32(hw, TXGBE_ISBADDRL, hw->isb_dma & 0x00000000FFFFFFFF); wr32(hw, TXGBE_ISBADDRH, hw->isb_dma >> 32); - value = rd32_epcs(hw, SR_XS_PCS_CTRL2); - if ((value & 0x3) != SR_PCS_CTRL2_TYPE_SEL_X) - hw->link_status = TXGBE_LINK_STATUS_NONE; + if (hw->mac.type == txgbe_mac_aml) { + if ((rd32(hw, TXGBE_EPHY_STAT) & TXGBE_EPHY_STAT_PPL_LOCK) + != TXGBE_EPHY_STAT_PPL_LOCK) { + speed = TXGBE_LINK_SPEED_25GB_FULL + | TXGBE_LINK_SPEED_10GB_FULL; + err = hw->mac.setup_link(hw, speed, false); + if (err) { + DEBUGOUT("setup phy failed"); + return; + } + } + } else if (hw->mac.type == txgbe_mac_aml40) { + if (!(rd32(hw, TXGBE_EPHY_STAT) & TXGBE_EPHY_STAT_PPL_LOCK)) { + speed = TXGBE_LINK_SPEED_40GB_FULL; + err = hw->mac.setup_link(hw, speed, false); + if (err) { + DEBUGOUT("setup phy failed"); + return; + } + } + } else { + value = rd32_epcs(hw, SR_XS_PCS_CTRL2); + if ((value & 0x3) != SR_PCS_CTRL2_TYPE_SEL_X) + hw->link_status = TXGBE_LINK_STATUS_NONE; + } /* receive packets that size > 2048 */ wr32m(hw, TXGBE_MACRXCFG, @@ -3596,9 +3622,10 @@ s32 txgbe_reset_hw(struct txgbe_hw *hw) if (!hw->phy.reset_disable) hw->phy.reset(hw); - /* remember AUTOC from before we reset */ - autoc = hw->mac.autoc_read(hw); - + if (hw->mac.type == txgbe_mac_raptor) { + /* remember AUTOC from before we reset */ + autoc = hw->mac.autoc_read(hw); + } mac_reset_top: /* Do LAN reset, the MNG domain will not be reset. */ wr32(hw, TXGBE_RST, TXGBE_RST_LAN(hw->bus.lan_id)); @@ -3629,16 +3656,28 @@ s32 txgbe_reset_hw(struct txgbe_hw *hw) goto mac_reset_top; } - /* - * Store the original AUTOC/AUTOC2 values if they have not been - * stored off yet. Otherwise restore the stored original - * values since the reset operation sets back to defaults. - */ - if (!hw->mac.orig_link_settings_stored) { - hw->mac.orig_autoc = hw->mac.autoc_read(hw); - hw->mac.orig_link_settings_stored = true; + /* amlite TODO*/ + if (hw->mac.type == txgbe_mac_aml || hw->mac.type == txgbe_mac_aml40) { + wr32(hw, TXGBE_LINKUP_FILTER, 30); + wr32m(hw, TXGBE_MAC_MISC_CTL, TXGBE_MAC_MISC_LINK_STS_MOD, + TXGBE_LINK_BOTH_PCS_MAC); + /* amlite: bme */ + wr32(hw, TXGBE_PX_PF_BME, TXGBE_PX_PF_BME_EN); + /* amlite: rdm_rsc_ctl_free_ctl set to 1 */ + wr32m(hw, TXGBE_RDM_RSC_CTL, TXGBE_RDM_RSC_CTL_FREE_CTL, + TXGBE_RDM_RSC_CTL_FREE_CTL); } else { - hw->mac.orig_autoc = autoc; + /* + * Store the original AUTOC/AUTOC2 values if they have not been + * stored off yet. Otherwise restore the stored original + * values since the reset operation sets back to defaults. + */ + if (!hw->mac.orig_link_settings_stored) { + hw->mac.orig_autoc = hw->mac.autoc_read(hw); + hw->mac.orig_link_settings_stored = true; + } else { + hw->mac.orig_autoc = autoc; + } } if (hw->phy.ffe_set) { @@ -3646,7 +3685,8 @@ s32 txgbe_reset_hw(struct txgbe_hw *hw) msec_delay(50); /* A temporary solution to set phy */ - txgbe_set_phy_temp(hw); + if (hw->mac.type == txgbe_mac_raptor) + txgbe_set_phy_temp(hw); } /* Store the permanent mac address */ diff --git a/drivers/net/txgbe/base/txgbe_regs.h b/drivers/net/txgbe/base/txgbe_regs.h index 7830abac7b..e24bd1eb03 100644 --- a/drivers/net/txgbe/base/txgbe_regs.h +++ b/drivers/net/txgbe/base/txgbe_regs.h @@ -1236,6 +1236,8 @@ enum txgbe_5tuple_protocol { TXGBE_ICRMISC_LNKUP) #define TXGBE_ICSMISC 0x000104 #define TXGBE_IENMISC 0x000108 +#define TXGBE_PX_PF_BME 0x0004B8 +#define TXGBE_PX_PF_BME_EN MS(0, 0x1) #define TXGBE_IVARMISC 0x0004FC #define TXGBE_IVARMISC_VEC(v) LS(v, 0, 0x7) #define TXGBE_IVARMISC_VLD MS(7, 0x1) -- 2.21.0.windows.1