diff mbox series

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

Message ID 20181012231355.GA28156@xps13.dannf
State New
Headers show
Series [SRU,Cosmic,SRU,Bionic] net: hns3: Fix for information of phydev lost problem when down/up | expand

Commit Message

dann frazier Oct. 12, 2018, 11:13 p.m. UTC
From: Fuyun Liang <liangfuyun1@huawei.com>

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 <liangfuyun1@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit b01b7cf19bf4a677d5dd4e63b12d86a021db751d)
Signed-off-by: dann frazier <dann.frazier@canonical.com>
---
 .../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(-)

Comments

Kleber Sacilotto de Souza Oct. 15, 2018, 10:19 a.m. UTC | #1
On 10/13/18 01:13, dann frazier wrote:
> From: Fuyun Liang <liangfuyun1@huawei.com>
> 
> 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 <liangfuyun1@huawei.com>
> Signed-off-by: Peng Li <lipeng321@huawei.com>
> Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> (cherry picked from commit b01b7cf19bf4a677d5dd4e63b12d86a021db751d)
> Signed-off-by: dann frazier <dann.frazier@canonical.com>
> ---
>  .../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 <kleber.souza@canonical.com>
Stefan Bader Oct. 17, 2018, 7:22 a.m. UTC | #2
On 13.10.18 01:13, dann frazier wrote:
> From: Fuyun Liang <liangfuyun1@huawei.com>
> 
> 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 <liangfuyun1@huawei.com>
> Signed-off-by: Peng Li <lipeng321@huawei.com>
> Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> (cherry picked from commit b01b7cf19bf4a677d5dd4e63b12d86a021db751d)
> Signed-off-by: dann frazier <dann.frazier@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
> ---

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
>
Khalid Elmously Oct. 22, 2018, 7:20 a.m. UTC | #3
On 2018-10-12 17:13:55 , dann frazier wrote:
> From: Fuyun Liang <liangfuyun1@huawei.com>
> 
> 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 <liangfuyun1@huawei.com>
> Signed-off-by: Peng Li <lipeng321@huawei.com>
> Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> (cherry picked from commit b01b7cf19bf4a677d5dd4e63b12d86a021db751d)
> Signed-off-by: dann frazier <dann.frazier@canonical.com>
> ---
>  .../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
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
diff mbox series

Patch

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