net: hns3: add support for querying advertised pause frame by ethtool ethx
authorPeng Li <lipeng321@huawei.com>
Fri, 22 Dec 2017 04:21:54 +0000 (12:21 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 27 Dec 2017 15:42:11 +0000 (10:42 -0500)
This patch adds support for querying advertised pause frame by using
ethtool command(ethtool ethx).

Fixes: 496d03e960ae ("net: hns3: Add Ethtool support to HNS3 driver")
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Fuyun Liang <liangfuyun1@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hnae3.h
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index a67d02a90aacf775419eb193c8a2f3a1ac95623e..82e9a80345577d4b7465f7c1d387baa5b9a0d699 100644 (file)
@@ -394,6 +394,8 @@ struct hnae3_ae_ops {
        void (*get_tqps_and_rss_info)(struct hnae3_handle *h,
                                      u16 *free_tqps, u16 *max_rss_size);
        int (*set_channels)(struct hnae3_handle *handle, u32 new_tqps_num);
+       void (*get_flowctrl_adv)(struct hnae3_handle *handle,
+                                u32 *flowctrl_adv);
 };
 
 struct hnae3_dcb_ops {
index b829ec7246855e918c29f41a6a4eec358501bb88..2ae4d39798c104a04c831c632a79b25e2c0797ba 100644 (file)
@@ -575,6 +575,7 @@ static int hns3_get_link_ksettings(struct net_device *netdev,
                                   struct ethtool_link_ksettings *cmd)
 {
        struct hnae3_handle *h = hns3_get_handle(netdev);
+       u32 flowctrl_adv = 0;
        u32 supported_caps;
        u32 advertised_caps;
        u8 media_type = HNAE3_MEDIA_TYPE_UNKNOWN;
@@ -650,6 +651,8 @@ static int hns3_get_link_ksettings(struct net_device *netdev,
                if (!cmd->base.autoneg)
                        advertised_caps &= ~HNS3_LM_AUTONEG_BIT;
 
+               advertised_caps &= ~HNS3_LM_PAUSE_BIT;
+
                /* now, map driver link modes to ethtool link modes */
                hns3_driv_to_eth_caps(supported_caps, cmd, false);
                hns3_driv_to_eth_caps(advertised_caps, cmd, true);
@@ -662,6 +665,18 @@ static int hns3_get_link_ksettings(struct net_device *netdev,
        /* 4.mdio_support */
        cmd->base.mdio_support = ETH_MDIO_SUPPORTS_C22;
 
+       /* 5.get flow control setttings */
+       if (h->ae_algo->ops->get_flowctrl_adv)
+               h->ae_algo->ops->get_flowctrl_adv(h, &flowctrl_adv);
+
+       if (flowctrl_adv & ADVERTISED_Pause)
+               ethtool_link_ksettings_add_link_mode(cmd, advertising,
+                                                    Pause);
+
+       if (flowctrl_adv & ADVERTISED_Asym_Pause)
+               ethtool_link_ksettings_add_link_mode(cmd, advertising,
+                                                    Asym_Pause);
+
        return 0;
 }
 
index bb312123cef3802f1b8038d6f09572cfccf79457..4d69688d5cf0ebef51509353cc945e2497846a46 100644 (file)
@@ -4660,6 +4660,20 @@ static u32 hclge_get_fw_version(struct hnae3_handle *handle)
        return hdev->fw_version;
 }
 
+static void hclge_get_flowctrl_adv(struct hnae3_handle *handle,
+                                  u32 *flowctrl_adv)
+{
+       struct hclge_vport *vport = hclge_get_vport(handle);
+       struct hclge_dev *hdev = vport->back;
+       struct phy_device *phydev = hdev->hw.mac.phydev;
+
+       if (!phydev)
+               return;
+
+       *flowctrl_adv |= (phydev->advertising & ADVERTISED_Pause) |
+                        (phydev->advertising & ADVERTISED_Asym_Pause);
+}
+
 static void hclge_set_flowctrl_adv(struct hclge_dev *hdev, u32 rx_en, u32 tx_en)
 {
        struct phy_device *phydev = hdev->hw.mac.phydev;
@@ -5478,6 +5492,7 @@ static const struct hnae3_ae_ops hclge_ops = {
        .get_tqps_and_rss_info = hclge_get_tqps_and_rss_info,
        .set_channels = hclge_set_channels,
        .get_channels = hclge_get_channels,
+       .get_flowctrl_adv = hclge_get_flowctrl_adv,
 };
 
 static struct hnae3_ae_algo ae_algo = {