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

Khaled Elmously khalid.elmously at canonical.com
Mon Oct 22 07:20:57 UTC 2018


On 2018-10-12 17:13:55 , dann frazier wrote:
> From: Fuyun Liang <liangfuyun1 at 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 at huawei.com>
> Signed-off-by: Peng Li <lipeng321 at huawei.com>
> Signed-off-by: Salil Mehta <salil.mehta at huawei.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit b01b7cf19bf4a677d5dd4e63b12d86a021db751d)
> Signed-off-by: dann frazier <dann.frazier at 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 at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team




More information about the kernel-team mailing list