[PATCH][SRU Cosmic][SRU Bionic] net: hns3: Fix for information of phydev lost problem when down/up

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH][SRU Cosmic][SRU Bionic] net: hns3: Fix for information of phydev lost problem when down/up

dann frazier-4
From: Fuyun Liang <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1797654

Function call of phy_connect_direct will reinitialize phydev. Some
information like advertising will be lost. Phy_connect_direct only
needs to be called once. And driver can run well. This patch adds
some functions to ensure that phy_connect_direct is called only once
to solve the information of phydev lost problem occurring when we stop
the net and open it again.

Fixes: 46a3df9f9718 ("net: hns3: Add HNS3 Acceleration Engine & Compatibility Layer Support
Signed-off-by: Fuyun Liang <[hidden email]>
Signed-off-by: Peng Li <[hidden email]>
Signed-off-by: Salil Mehta <[hidden email]>
Signed-off-by: David S. Miller <[hidden email]>
(cherry picked from commit b01b7cf19bf4a677d5dd4e63b12d86a021db751d)
Signed-off-by: dann frazier <[hidden email]>
---
 .../hisilicon/hns3/hns3pf/hclge_main.c        | 24 +++++++++++++++---
 .../hisilicon/hns3/hns3pf/hclge_mdio.c        | 25 ++++++++++++++++---
 .../hisilicon/hns3/hns3pf/hclge_mdio.h        |  4 ++-
 3 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
index 81c8efb9de4a1..226855ff5436e 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -3827,7 +3827,7 @@ static int hclge_ae_start(struct hnae3_handle *handle)
 {
  struct hclge_vport *vport = hclge_get_vport(handle);
  struct hclge_dev *hdev = vport->back;
- int i, ret;
+ int i;
 
  for (i = 0; i < vport->alloc_tqps; i++)
  hclge_tqp_enable(hdev, i, 0, true);
@@ -3841,9 +3841,7 @@ static int hclge_ae_start(struct hnae3_handle *handle)
  /* reset tqp stats */
  hclge_reset_tqp_stats(handle);
 
- ret = hclge_mac_start_phy(hdev);
- if (ret)
- return ret;
+ hclge_mac_start_phy(hdev);
 
  return 0;
 }
@@ -5462,6 +5460,16 @@ static void hclge_get_mdix_mode(struct hnae3_handle *handle,
  *tp_mdix = ETH_TP_MDI;
 }
 
+static int hclge_init_instance_hw(struct hclge_dev *hdev)
+{
+ return hclge_mac_connect_phy(hdev);
+}
+
+static void hclge_uninit_instance_hw(struct hclge_dev *hdev)
+{
+ hclge_mac_disconnect_phy(hdev);
+}
+
 static int hclge_init_client_instance(struct hnae3_client *client,
       struct hnae3_ae_dev *ae_dev)
 {
@@ -5481,6 +5489,13 @@ static int hclge_init_client_instance(struct hnae3_client *client,
  if (ret)
  return ret;
 
+ ret = hclge_init_instance_hw(hdev);
+ if (ret) {
+        client->ops->uninit_instance(&vport->nic,
+                                     0);
+        return ret;
+ }
+
  if (hdev->roce_client &&
     hnae3_dev_roce_supported(hdev)) {
  struct hnae3_client *rc = hdev->roce_client;
@@ -5543,6 +5558,7 @@ static void hclge_uninit_client_instance(struct hnae3_client *client,
  if (client->type == HNAE3_CLIENT_ROCE)
  return;
  if (client->ops->uninit_instance) {
+ hclge_uninit_instance_hw(hdev);
  client->ops->uninit_instance(&vport->nic, 0);
  hdev->nic_client = NULL;
  vport->nic.client = NULL;
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
index ff6de4718ca31..398971a062f47 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
@@ -193,7 +193,7 @@ static void hclge_mac_adjust_link(struct net_device *netdev)
  netdev_err(netdev, "failed to configure flow control.\n");
 }
 
-int hclge_mac_start_phy(struct hclge_dev *hdev)
+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;
@@ -215,11 +215,29 @@ int hclge_mac_start_phy(struct hclge_dev *hdev)
  phydev->supported &= HCLGE_PHY_SUPPORTED_FEATURES;
  phydev->advertising = phydev->supported;
 
- phy_start(phydev);
-
  return 0;
 }
 
+void hclge_mac_disconnect_phy(struct hclge_dev *hdev)
+{
+ struct phy_device *phydev = hdev->hw.mac.phydev;
+
+ if (!phydev)
+ return;
+
+ phy_disconnect(phydev);
+}
+
+void hclge_mac_start_phy(struct hclge_dev *hdev)
+{
+ struct phy_device *phydev = hdev->hw.mac.phydev;
+
+ if (!phydev)
+ return;
+
+ phy_start(phydev);
+}
+
 void hclge_mac_stop_phy(struct hclge_dev *hdev)
 {
  struct net_device *netdev = hdev->vport[0].nic.netdev;
@@ -229,5 +247,4 @@ void hclge_mac_stop_phy(struct hclge_dev *hdev)
  return;
 
  phy_stop(phydev);
- phy_disconnect(phydev);
 }
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
index bb3ce35e0d665..5fbf7dddb5d9b 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
@@ -5,7 +5,9 @@
 #define __HCLGE_MDIO_H
 
 int hclge_mac_mdio_config(struct hclge_dev *hdev);
-int hclge_mac_start_phy(struct hclge_dev *hdev);
+int hclge_mac_connect_phy(struct hclge_dev *hdev);
+void hclge_mac_disconnect_phy(struct hclge_dev *hdev);
+void hclge_mac_start_phy(struct hclge_dev *hdev);
 void hclge_mac_stop_phy(struct hclge_dev *hdev);
 
 #endif
--
2.19.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

ACK: [PATCH][SRU Cosmic][SRU Bionic] net: hns3: Fix for information of phydev lost problem when down/up

Kleber Souza
On 10/13/18 01:13, dann frazier wrote:

> From: Fuyun Liang <[hidden email]>
>
> BugLink: https://bugs.launchpad.net/bugs/1797654
>
> Function call of phy_connect_direct will reinitialize phydev. Some
> information like advertising will be lost. Phy_connect_direct only
> needs to be called once. And driver can run well. This patch adds
> some functions to ensure that phy_connect_direct is called only once
> to solve the information of phydev lost problem occurring when we stop
> the net and open it again.
>
> Fixes: 46a3df9f9718 ("net: hns3: Add HNS3 Acceleration Engine & Compatibility Layer Support
> Signed-off-by: Fuyun Liang <[hidden email]>
> Signed-off-by: Peng Li <[hidden email]>
> Signed-off-by: Salil Mehta <[hidden email]>
> Signed-off-by: David S. Miller <[hidden email]>
> (cherry picked from commit b01b7cf19bf4a677d5dd4e63b12d86a021db751d)
> Signed-off-by: dann frazier <[hidden email]>
> ---
>  .../hisilicon/hns3/hns3pf/hclge_main.c        | 24 +++++++++++++++---
>  .../hisilicon/hns3/hns3pf/hclge_mdio.c        | 25 ++++++++++++++++---
>  .../hisilicon/hns3/hns3pf/hclge_mdio.h        |  4 ++-
>  3 files changed, 44 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> index 81c8efb9de4a1..226855ff5436e 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> @@ -3827,7 +3827,7 @@ static int hclge_ae_start(struct hnae3_handle *handle)
>  {
>   struct hclge_vport *vport = hclge_get_vport(handle);
>   struct hclge_dev *hdev = vport->back;
> - int i, ret;
> + int i;
>  
>   for (i = 0; i < vport->alloc_tqps; i++)
>   hclge_tqp_enable(hdev, i, 0, true);
> @@ -3841,9 +3841,7 @@ static int hclge_ae_start(struct hnae3_handle *handle)
>   /* reset tqp stats */
>   hclge_reset_tqp_stats(handle);
>  
> - ret = hclge_mac_start_phy(hdev);
> - if (ret)
> - return ret;
> + hclge_mac_start_phy(hdev);
>  
>   return 0;
>  }
> @@ -5462,6 +5460,16 @@ static void hclge_get_mdix_mode(struct hnae3_handle *handle,
>   *tp_mdix = ETH_TP_MDI;
>  }
>  
> +static int hclge_init_instance_hw(struct hclge_dev *hdev)
> +{
> + return hclge_mac_connect_phy(hdev);
> +}
> +
> +static void hclge_uninit_instance_hw(struct hclge_dev *hdev)
> +{
> + hclge_mac_disconnect_phy(hdev);
> +}
> +
>  static int hclge_init_client_instance(struct hnae3_client *client,
>        struct hnae3_ae_dev *ae_dev)
>  {
> @@ -5481,6 +5489,13 @@ static int hclge_init_client_instance(struct hnae3_client *client,
>   if (ret)
>   return ret;
>  
> + ret = hclge_init_instance_hw(hdev);
> + if (ret) {
> +        client->ops->uninit_instance(&vport->nic,
> +                                     0);
> +        return ret;
> + }
> +
>   if (hdev->roce_client &&
>      hnae3_dev_roce_supported(hdev)) {
>   struct hnae3_client *rc = hdev->roce_client;
> @@ -5543,6 +5558,7 @@ static void hclge_uninit_client_instance(struct hnae3_client *client,
>   if (client->type == HNAE3_CLIENT_ROCE)
>   return;
>   if (client->ops->uninit_instance) {
> + hclge_uninit_instance_hw(hdev);
>   client->ops->uninit_instance(&vport->nic, 0);
>   hdev->nic_client = NULL;
>   vport->nic.client = NULL;
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
> index ff6de4718ca31..398971a062f47 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
> @@ -193,7 +193,7 @@ static void hclge_mac_adjust_link(struct net_device *netdev)
>   netdev_err(netdev, "failed to configure flow control.\n");
>  }
>  
> -int hclge_mac_start_phy(struct hclge_dev *hdev)
> +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;
> @@ -215,11 +215,29 @@ int hclge_mac_start_phy(struct hclge_dev *hdev)
>   phydev->supported &= HCLGE_PHY_SUPPORTED_FEATURES;
>   phydev->advertising = phydev->supported;
>  
> - phy_start(phydev);
> -
>   return 0;
>  }
>  
> +void hclge_mac_disconnect_phy(struct hclge_dev *hdev)
> +{
> + struct phy_device *phydev = hdev->hw.mac.phydev;
> +
> + if (!phydev)
> + return;
> +
> + phy_disconnect(phydev);
> +}
> +
> +void hclge_mac_start_phy(struct hclge_dev *hdev)
> +{
> + struct phy_device *phydev = hdev->hw.mac.phydev;
> +
> + if (!phydev)
> + return;
> +
> + phy_start(phydev);
> +}
> +
>  void hclge_mac_stop_phy(struct hclge_dev *hdev)
>  {
>   struct net_device *netdev = hdev->vport[0].nic.netdev;
> @@ -229,5 +247,4 @@ void hclge_mac_stop_phy(struct hclge_dev *hdev)
>   return;
>  
>   phy_stop(phydev);
> - phy_disconnect(phydev);
>  }
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
> index bb3ce35e0d665..5fbf7dddb5d9b 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
> @@ -5,7 +5,9 @@
>  #define __HCLGE_MDIO_H
>  
>  int hclge_mac_mdio_config(struct hclge_dev *hdev);
> -int hclge_mac_start_phy(struct hclge_dev *hdev);
> +int hclge_mac_connect_phy(struct hclge_dev *hdev);
> +void hclge_mac_disconnect_phy(struct hclge_dev *hdev);
> +void hclge_mac_start_phy(struct hclge_dev *hdev);
>  void hclge_mac_stop_phy(struct hclge_dev *hdev);
>  
>  #endif
>

Clean cherry-pick, limited to platform driver.

Acked-by: Kleber Sacilotto de Souza <[hidden email]>

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

ACK: [PATCH][SRU Cosmic][SRU Bionic] net: hns3: Fix for information of phydev lost problem when down/up

Stefan Bader-2
In reply to this post by dann frazier-4
On 13.10.18 01:13, dann frazier wrote:

> From: Fuyun Liang <[hidden email]>
>
> BugLink: https://bugs.launchpad.net/bugs/1797654
>
> Function call of phy_connect_direct will reinitialize phydev. Some
> information like advertising will be lost. Phy_connect_direct only
> needs to be called once. And driver can run well. This patch adds
> some functions to ensure that phy_connect_direct is called only once
> to solve the information of phydev lost problem occurring when we stop
> the net and open it again.
>
> Fixes: 46a3df9f9718 ("net: hns3: Add HNS3 Acceleration Engine & Compatibility Layer Support
> Signed-off-by: Fuyun Liang <[hidden email]>
> Signed-off-by: Peng Li <[hidden email]>
> Signed-off-by: Salil Mehta <[hidden email]>
> Signed-off-by: David S. Miller <[hidden email]>
> (cherry picked from commit b01b7cf19bf4a677d5dd4e63b12d86a021db751d)
> Signed-off-by: dann frazier <[hidden email]>
Acked-by: Stefan Bader <[hidden email]>
> ---

This driver has a long history of not being quality... how that ever got into
anything else than staging is mind boggling... :-P

>  .../hisilicon/hns3/hns3pf/hclge_main.c        | 24 +++++++++++++++---
>  .../hisilicon/hns3/hns3pf/hclge_mdio.c        | 25 ++++++++++++++++---
>  .../hisilicon/hns3/hns3pf/hclge_mdio.h        |  4 ++-
>  3 files changed, 44 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> index 81c8efb9de4a1..226855ff5436e 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> @@ -3827,7 +3827,7 @@ static int hclge_ae_start(struct hnae3_handle *handle)
>  {
>   struct hclge_vport *vport = hclge_get_vport(handle);
>   struct hclge_dev *hdev = vport->back;
> - int i, ret;
> + int i;
>  
>   for (i = 0; i < vport->alloc_tqps; i++)
>   hclge_tqp_enable(hdev, i, 0, true);
> @@ -3841,9 +3841,7 @@ static int hclge_ae_start(struct hnae3_handle *handle)
>   /* reset tqp stats */
>   hclge_reset_tqp_stats(handle);
>  
> - ret = hclge_mac_start_phy(hdev);
> - if (ret)
> - return ret;
> + hclge_mac_start_phy(hdev);
>  
>   return 0;
>  }
> @@ -5462,6 +5460,16 @@ static void hclge_get_mdix_mode(struct hnae3_handle *handle,
>   *tp_mdix = ETH_TP_MDI;
>  }
>  
> +static int hclge_init_instance_hw(struct hclge_dev *hdev)
> +{
> + return hclge_mac_connect_phy(hdev);
> +}
> +
> +static void hclge_uninit_instance_hw(struct hclge_dev *hdev)
> +{
> + hclge_mac_disconnect_phy(hdev);
> +}
> +
>  static int hclge_init_client_instance(struct hnae3_client *client,
>        struct hnae3_ae_dev *ae_dev)
>  {
> @@ -5481,6 +5489,13 @@ static int hclge_init_client_instance(struct hnae3_client *client,
>   if (ret)
>   return ret;
>  
> + ret = hclge_init_instance_hw(hdev);
> + if (ret) {
> +        client->ops->uninit_instance(&vport->nic,
> +                                     0);
> +        return ret;
> + }
> +
>   if (hdev->roce_client &&
>      hnae3_dev_roce_supported(hdev)) {
>   struct hnae3_client *rc = hdev->roce_client;
> @@ -5543,6 +5558,7 @@ static void hclge_uninit_client_instance(struct hnae3_client *client,
>   if (client->type == HNAE3_CLIENT_ROCE)
>   return;
>   if (client->ops->uninit_instance) {
> + hclge_uninit_instance_hw(hdev);
>   client->ops->uninit_instance(&vport->nic, 0);
>   hdev->nic_client = NULL;
>   vport->nic.client = NULL;
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
> index ff6de4718ca31..398971a062f47 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
> @@ -193,7 +193,7 @@ static void hclge_mac_adjust_link(struct net_device *netdev)
>   netdev_err(netdev, "failed to configure flow control.\n");
>  }
>  
> -int hclge_mac_start_phy(struct hclge_dev *hdev)
> +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;
> @@ -215,11 +215,29 @@ int hclge_mac_start_phy(struct hclge_dev *hdev)
>   phydev->supported &= HCLGE_PHY_SUPPORTED_FEATURES;
>   phydev->advertising = phydev->supported;
>  
> - phy_start(phydev);
> -
>   return 0;
>  }
>  
> +void hclge_mac_disconnect_phy(struct hclge_dev *hdev)
> +{
> + struct phy_device *phydev = hdev->hw.mac.phydev;
> +
> + if (!phydev)
> + return;
> +
> + phy_disconnect(phydev);
> +}
> +
> +void hclge_mac_start_phy(struct hclge_dev *hdev)
> +{
> + struct phy_device *phydev = hdev->hw.mac.phydev;
> +
> + if (!phydev)
> + return;
> +
> + phy_start(phydev);
> +}
> +
>  void hclge_mac_stop_phy(struct hclge_dev *hdev)
>  {
>   struct net_device *netdev = hdev->vport[0].nic.netdev;
> @@ -229,5 +247,4 @@ void hclge_mac_stop_phy(struct hclge_dev *hdev)
>   return;
>  
>   phy_stop(phydev);
> - phy_disconnect(phydev);
>  }
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
> index bb3ce35e0d665..5fbf7dddb5d9b 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
> @@ -5,7 +5,9 @@
>  #define __HCLGE_MDIO_H
>  
>  int hclge_mac_mdio_config(struct hclge_dev *hdev);
> -int hclge_mac_start_phy(struct hclge_dev *hdev);
> +int hclge_mac_connect_phy(struct hclge_dev *hdev);
> +void hclge_mac_disconnect_phy(struct hclge_dev *hdev);
> +void hclge_mac_start_phy(struct hclge_dev *hdev);
>  void hclge_mac_stop_phy(struct hclge_dev *hdev);
>  
>  #endif
>


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team

signature.asc (836 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

APPLIED: [PATCH][SRU Cosmic][SRU Bionic] net: hns3: Fix for information of phydev lost problem when down/up

Khaled Elmously
In reply to this post by dann frazier-4
On 2018-10-12 17:13:55 , dann frazier wrote:

> From: Fuyun Liang <[hidden email]>
>
> BugLink: https://bugs.launchpad.net/bugs/1797654
>
> Function call of phy_connect_direct will reinitialize phydev. Some
> information like advertising will be lost. Phy_connect_direct only
> needs to be called once. And driver can run well. This patch adds
> some functions to ensure that phy_connect_direct is called only once
> to solve the information of phydev lost problem occurring when we stop
> the net and open it again.
>
> Fixes: 46a3df9f9718 ("net: hns3: Add HNS3 Acceleration Engine & Compatibility Layer Support
> Signed-off-by: Fuyun Liang <[hidden email]>
> Signed-off-by: Peng Li <[hidden email]>
> Signed-off-by: Salil Mehta <[hidden email]>
> Signed-off-by: David S. Miller <[hidden email]>
> (cherry picked from commit b01b7cf19bf4a677d5dd4e63b12d86a021db751d)
> Signed-off-by: dann frazier <[hidden email]>
> ---
>  .../hisilicon/hns3/hns3pf/hclge_main.c        | 24 +++++++++++++++---
>  .../hisilicon/hns3/hns3pf/hclge_mdio.c        | 25 ++++++++++++++++---
>  .../hisilicon/hns3/hns3pf/hclge_mdio.h        |  4 ++-
>  3 files changed, 44 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> index 81c8efb9de4a1..226855ff5436e 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
> @@ -3827,7 +3827,7 @@ static int hclge_ae_start(struct hnae3_handle *handle)
>  {
>   struct hclge_vport *vport = hclge_get_vport(handle);
>   struct hclge_dev *hdev = vport->back;
> - int i, ret;
> + int i;
>  
>   for (i = 0; i < vport->alloc_tqps; i++)
>   hclge_tqp_enable(hdev, i, 0, true);
> @@ -3841,9 +3841,7 @@ static int hclge_ae_start(struct hnae3_handle *handle)
>   /* reset tqp stats */
>   hclge_reset_tqp_stats(handle);
>  
> - ret = hclge_mac_start_phy(hdev);
> - if (ret)
> - return ret;
> + hclge_mac_start_phy(hdev);
>  
>   return 0;
>  }
> @@ -5462,6 +5460,16 @@ static void hclge_get_mdix_mode(struct hnae3_handle *handle,
>   *tp_mdix = ETH_TP_MDI;
>  }
>  
> +static int hclge_init_instance_hw(struct hclge_dev *hdev)
> +{
> + return hclge_mac_connect_phy(hdev);
> +}
> +
> +static void hclge_uninit_instance_hw(struct hclge_dev *hdev)
> +{
> + hclge_mac_disconnect_phy(hdev);
> +}
> +
>  static int hclge_init_client_instance(struct hnae3_client *client,
>        struct hnae3_ae_dev *ae_dev)
>  {
> @@ -5481,6 +5489,13 @@ static int hclge_init_client_instance(struct hnae3_client *client,
>   if (ret)
>   return ret;
>  
> + ret = hclge_init_instance_hw(hdev);
> + if (ret) {
> +        client->ops->uninit_instance(&vport->nic,
> +                                     0);
> +        return ret;
> + }
> +
>   if (hdev->roce_client &&
>      hnae3_dev_roce_supported(hdev)) {
>   struct hnae3_client *rc = hdev->roce_client;
> @@ -5543,6 +5558,7 @@ static void hclge_uninit_client_instance(struct hnae3_client *client,
>   if (client->type == HNAE3_CLIENT_ROCE)
>   return;
>   if (client->ops->uninit_instance) {
> + hclge_uninit_instance_hw(hdev);
>   client->ops->uninit_instance(&vport->nic, 0);
>   hdev->nic_client = NULL;
>   vport->nic.client = NULL;
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
> index ff6de4718ca31..398971a062f47 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
> @@ -193,7 +193,7 @@ static void hclge_mac_adjust_link(struct net_device *netdev)
>   netdev_err(netdev, "failed to configure flow control.\n");
>  }
>  
> -int hclge_mac_start_phy(struct hclge_dev *hdev)
> +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;
> @@ -215,11 +215,29 @@ int hclge_mac_start_phy(struct hclge_dev *hdev)
>   phydev->supported &= HCLGE_PHY_SUPPORTED_FEATURES;
>   phydev->advertising = phydev->supported;
>  
> - phy_start(phydev);
> -
>   return 0;
>  }
>  
> +void hclge_mac_disconnect_phy(struct hclge_dev *hdev)
> +{
> + struct phy_device *phydev = hdev->hw.mac.phydev;
> +
> + if (!phydev)
> + return;
> +
> + phy_disconnect(phydev);
> +}
> +
> +void hclge_mac_start_phy(struct hclge_dev *hdev)
> +{
> + struct phy_device *phydev = hdev->hw.mac.phydev;
> +
> + if (!phydev)
> + return;
> +
> + phy_start(phydev);
> +}
> +
>  void hclge_mac_stop_phy(struct hclge_dev *hdev)
>  {
>   struct net_device *netdev = hdev->vport[0].nic.netdev;
> @@ -229,5 +247,4 @@ void hclge_mac_stop_phy(struct hclge_dev *hdev)
>   return;
>  
>   phy_stop(phydev);
> - phy_disconnect(phydev);
>  }
> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
> index bb3ce35e0d665..5fbf7dddb5d9b 100644
> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h
> @@ -5,7 +5,9 @@
>  #define __HCLGE_MDIO_H
>  
>  int hclge_mac_mdio_config(struct hclge_dev *hdev);
> -int hclge_mac_start_phy(struct hclge_dev *hdev);
> +int hclge_mac_connect_phy(struct hclge_dev *hdev);
> +void hclge_mac_disconnect_phy(struct hclge_dev *hdev);
> +void hclge_mac_start_phy(struct hclge_dev *hdev);
>  void hclge_mac_stop_phy(struct hclge_dev *hdev);
>  
>  #endif
> --
> 2.19.1
>
>
> --
> kernel-team mailing list
> [hidden email]
> https://lists.ubuntu.com/mailman/listinfo/kernel-team

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team