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

Reply via email to