/* When txgbe do LAN reset, PCS will change to default 10GBASE-R mode */
        ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_CTRL2);
        ret &= MDIO_PCS_CTRL2_TYPE;
-       if (ret == MDIO_PCS_CTRL2_10GBR &&
-           xpcs->interface != PHY_INTERFACE_MODE_10GBASER)
+       if ((ret == MDIO_PCS_CTRL2_10GBR &&
+            xpcs->interface != PHY_INTERFACE_MODE_10GBASER) ||
+           xpcs->interface == PHY_INTERFACE_MODE_SGMII)
                return true;
 
        return false;
 
 static int xpcs_config_aneg_c37_sgmii(struct dw_xpcs *xpcs,
                                      unsigned int neg_mode)
 {
-       int ret, mdio_ctrl;
+       int ret, mdio_ctrl, tx_conf;
+
+       if (xpcs->dev_flag == DW_DEV_TXGBE)
+               xpcs_write_vpcs(xpcs, DW_VR_XS_PCS_DIG_CTRL1, DW_CL37_BP | DW_EN_VSMMD1);
 
        /* For AN for C37 SGMII mode, the settings are :-
         * 1) VR_MII_MMD_CTRL Bit(12) [AN_ENABLE] = 0b (Disable SGMII AN in case
        ret |= (DW_VR_MII_PCS_MODE_C37_SGMII <<
                DW_VR_MII_AN_CTRL_PCS_MODE_SHIFT &
                DW_VR_MII_PCS_MODE_MASK);
-       ret |= (DW_VR_MII_TX_CONFIG_MAC_SIDE_SGMII <<
-               DW_VR_MII_AN_CTRL_TX_CONFIG_SHIFT &
-               DW_VR_MII_TX_CONFIG_MASK);
+       if (xpcs->dev_flag == DW_DEV_TXGBE) {
+               ret |= DW_VR_MII_AN_CTRL_8BIT;
+               /* Hardware requires it to be PHY side SGMII */
+               tx_conf = DW_VR_MII_TX_CONFIG_PHY_SIDE_SGMII;
+       } else {
+               tx_conf = DW_VR_MII_TX_CONFIG_MAC_SIDE_SGMII;
+       }
+       ret |= tx_conf << DW_VR_MII_AN_CTRL_TX_CONFIG_SHIFT &
+               DW_VR_MII_TX_CONFIG_MASK;
        ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_CTRL, ret);
        if (ret < 0)
                return ret;
        else
                ret &= ~DW_VR_MII_DIG_CTRL1_MAC_AUTO_SW;
 
+       if (xpcs->dev_flag == DW_DEV_TXGBE)
+               ret |= DW_VR_MII_DIG_CTRL1_PHY_MODE_CTRL;
+
        ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1, ret);
        if (ret < 0)
                return ret;
                        state->duplex = DUPLEX_FULL;
                else
                        state->duplex = DUPLEX_HALF;
+       } else if (ret == DW_VR_MII_AN_STS_C37_ANCMPLT_INTR) {
+               int speed, duplex;
+
+               state->link = true;
+
+               speed = xpcs_read(xpcs, MDIO_MMD_VEND2, MDIO_CTRL1);
+               if (speed < 0)
+                       return speed;
+
+               speed &= SGMII_SPEED_SS13 | SGMII_SPEED_SS6;
+               if (speed == SGMII_SPEED_SS6)
+                       state->speed = SPEED_1000;
+               else if (speed == SGMII_SPEED_SS13)
+                       state->speed = SPEED_100;
+               else if (speed == 0)
+                       state->speed = SPEED_10;
+
+               duplex = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_ADVERTISE);
+               if (duplex < 0)
+                       return duplex;
+
+               if (duplex & DW_FULL_DUPLEX)
+                       state->duplex = DUPLEX_FULL;
+               else if (duplex & DW_HALF_DUPLEX)
+                       state->duplex = DUPLEX_HALF;
+
+               xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_INTR_STS, 0);
        }
 
        return 0;
 
 
 /* VR_MII_DIG_CTRL1 */
 #define DW_VR_MII_DIG_CTRL1_MAC_AUTO_SW                BIT(9)
+#define DW_VR_MII_DIG_CTRL1_PHY_MODE_CTRL      BIT(0)
 
 /* VR_MII_DIG_CTRL2 */
 #define DW_VR_MII_DIG_CTRL2_TX_POL_INV         BIT(4)
 #define DW_VR_MII_DIG_CTRL2_RX_POL_INV         BIT(0)
 
 /* VR_MII_AN_CTRL */
+#define DW_VR_MII_AN_CTRL_8BIT                 BIT(8)
 #define DW_VR_MII_AN_CTRL_TX_CONFIG_SHIFT      3
 #define DW_VR_MII_TX_CONFIG_MASK               BIT(3)
 #define DW_VR_MII_TX_CONFIG_PHY_SIDE_SGMII     0x1
 #define SGMII_SPEED_SS13               BIT(13) /* SGMII speed along with SS6 */
 #define SGMII_SPEED_SS6                        BIT(6)  /* SGMII speed along with SS13 */
 
+/* SR MII MMD AN Advertisement defines */
+#define DW_HALF_DUPLEX                 BIT(6)
+#define DW_FULL_DUPLEX                 BIT(5)
+
 /* VR MII EEE Control 0 defines */
 #define DW_VR_MII_EEE_LTX_EN                   BIT(0)  /* LPI Tx Enable */
 #define DW_VR_MII_EEE_LRX_EN                   BIT(1)  /* LPI Rx Enable */