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 0301863..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,
@@ -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;