Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next
[linux-2.6-microblaze.git] / drivers / net / ethernet / hisilicon / hns3 / hns3pf / hclge_mdio.c
index 24b1f2a..dabb843 100644 (file)
@@ -12,7 +12,7 @@
                                         SUPPORTED_TP | \
                                         PHY_10BT_FEATURES | \
                                         PHY_100BT_FEATURES | \
-                                        PHY_1000BT_FEATURES)
+                                        SUPPORTED_1000baseT_Full)
 
 enum hclge_mdio_c22_op_seq {
        HCLGE_MDIO_C22_WRITE = 1,
@@ -52,7 +52,7 @@ static int hclge_mdio_write(struct mii_bus *bus, int phyid, int regnum,
        struct hclge_desc desc;
        int ret;
 
-       if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
+       if (test_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state))
                return 0;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_MDIO_CONFIG, false);
@@ -90,7 +90,7 @@ static int hclge_mdio_read(struct mii_bus *bus, int phyid, int regnum)
        struct hclge_desc desc;
        int ret;
 
-       if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
+       if (test_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state))
                return 0;
 
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_MDIO_CONFIG, true);
@@ -179,6 +179,10 @@ static void hclge_mac_adjust_link(struct net_device *netdev)
        int duplex, speed;
        int ret;
 
+       /* When phy link down, do nothing */
+       if (netdev->phydev->link == 0)
+               return;
+
        speed = netdev->phydev->speed;
        duplex = netdev->phydev->duplex;
 
@@ -195,12 +199,13 @@ int hclge_mac_connect_phy(struct hclge_dev *hdev)
 {
        struct net_device *netdev = hdev->vport[0].nic.netdev;
        struct phy_device *phydev = hdev->hw.mac.phydev;
+       __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
        int ret;
 
        if (!phydev)
                return 0;
 
-       phydev->supported &= ~SUPPORTED_FIBRE;
+       linkmode_clear_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, phydev->supported);
 
        ret = phy_connect_direct(netdev, phydev,
                                 hclge_mac_adjust_link,
@@ -210,7 +215,15 @@ int hclge_mac_connect_phy(struct hclge_dev *hdev)
                return ret;
        }
 
-       phydev->supported &= HCLGE_PHY_SUPPORTED_FEATURES;
+       linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, mask);
+       linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, mask);
+       linkmode_set_bit_array(phy_10_100_features_array,
+                              ARRAY_SIZE(phy_10_100_features_array),
+                              mask);
+       linkmode_set_bit_array(phy_gbit_features_array,
+                              ARRAY_SIZE(phy_gbit_features_array),
+                              mask);
+       linkmode_and(phydev->supported, phydev->supported, mask);
        phy_support_asym_pause(phydev);
 
        return 0;