net: hns: Add mac pcs config when enable|disable mac
authorYonglong Liu <liuyonglong@huawei.com>
Sat, 15 Dec 2018 03:53:28 +0000 (11:53 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 16 Dec 2018 20:07:32 +0000 (12:07 -0800)
In some case, when mac enable|disable and adjust link, may cause hard to
link(or abnormal) between mac and phy. This patch adds the code for rx PCS
to avoid this bug.

Disable the rx PCS when driver disable the gmac, and enable the rx PCS
when driver enable the mac.

Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h

index aaf72c055711ce2051d982c3f91b4fb674117a29..1790cdafd9b823ec32e10e7a301c3e259a4d467a 100644 (file)
@@ -67,11 +67,14 @@ static void hns_gmac_enable(void *mac_drv, enum mac_commom_mode mode)
        struct mac_driver *drv = (struct mac_driver *)mac_drv;
 
        /*enable GE rX/tX */
-       if ((mode == MAC_COMM_MODE_TX) || (mode == MAC_COMM_MODE_RX_AND_TX))
+       if (mode == MAC_COMM_MODE_TX || mode == MAC_COMM_MODE_RX_AND_TX)
                dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_TX_EN_B, 1);
 
-       if ((mode == MAC_COMM_MODE_RX) || (mode == MAC_COMM_MODE_RX_AND_TX))
+       if (mode == MAC_COMM_MODE_RX || mode == MAC_COMM_MODE_RX_AND_TX) {
+               /* enable rx pcs */
+               dsaf_set_dev_bit(drv, GMAC_PCS_RX_EN_REG, 0, 0);
                dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_RX_EN_B, 1);
+       }
 }
 
 static void hns_gmac_disable(void *mac_drv, enum mac_commom_mode mode)
@@ -79,11 +82,14 @@ static void hns_gmac_disable(void *mac_drv, enum mac_commom_mode mode)
        struct mac_driver *drv = (struct mac_driver *)mac_drv;
 
        /*disable GE rX/tX */
-       if ((mode == MAC_COMM_MODE_TX) || (mode == MAC_COMM_MODE_RX_AND_TX))
+       if (mode == MAC_COMM_MODE_TX || mode == MAC_COMM_MODE_RX_AND_TX)
                dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_TX_EN_B, 0);
 
-       if ((mode == MAC_COMM_MODE_RX) || (mode == MAC_COMM_MODE_RX_AND_TX))
+       if (mode == MAC_COMM_MODE_RX || mode == MAC_COMM_MODE_RX_AND_TX) {
+               /* disable rx pcs */
+               dsaf_set_dev_bit(drv, GMAC_PCS_RX_EN_REG, 0, 1);
                dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_RX_EN_B, 0);
+       }
 }
 
 /* hns_gmac_get_en - get port enable
index f171d11b9b4446b51a09838fb46fcc3e65d07286..b9733b0b848263bc9a25ccf42f3d8b433a7b9e5e 100644 (file)
 #define GMAC_LD_LINK_COUNTER_REG               0x01D0UL
 #define GMAC_LOOP_REG                          0x01DCUL
 #define GMAC_RECV_CONTROL_REG                  0x01E0UL
+#define GMAC_PCS_RX_EN_REG                     0x01E4UL
 #define GMAC_VLAN_CODE_REG                     0x01E8UL
 #define GMAC_RX_OVERRUN_CNT_REG                        0x01ECUL
 #define GMAC_RX_LENGTHFIELD_ERR_CNT_REG                0x01F4UL