Skip to content

Commit

Permalink
net: hns3: disable loopback setting in hclge_mac_init
Browse files Browse the repository at this point in the history
If the selftest and reset are performed at the same time, the loopback
setting may be still in the enable state after the reset. As a result,
packets cannot be sent out.

This patch fixes this issue by disabling loopback in hclge_mac_init.

Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Yufeng Mo authored and David S. Miller committed Sep 6, 2019
1 parent 1483fa4 commit 1cbc662
Showing 1 changed file with 33 additions and 1 deletion.
34 changes: 33 additions & 1 deletion drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ static void hclge_rfs_filter_expire(struct hclge_dev *hdev);
static void hclge_clear_arfs_rules(struct hnae3_handle *handle);
static enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,
unsigned long *addr);
static int hclge_set_default_loopback(struct hclge_dev *hdev);

static struct hnae3_ae_algo ae_algo;

Expand Down Expand Up @@ -2599,6 +2600,10 @@ static int hclge_mac_init(struct hclge_dev *hdev)
return ret;
}

ret = hclge_set_default_loopback(hdev);
if (ret)
return ret;

ret = hclge_buffer_alloc(hdev);
if (ret)
dev_err(&hdev->pdev->dev,
Expand Down Expand Up @@ -6331,7 +6336,7 @@ static int hclge_set_app_loopback(struct hclge_dev *hdev, bool en)
return ret;
}

static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en,
static int hclge_cfg_serdes_loopback(struct hclge_dev *hdev, bool en,
enum hnae3_loop loop_mode)
{
#define HCLGE_SERDES_RETRY_MS 10
Expand Down Expand Up @@ -6392,6 +6397,17 @@ static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en,
dev_err(&hdev->pdev->dev, "serdes loopback set failed in fw\n");
return -EIO;
}
return ret;
}

static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en,
enum hnae3_loop loop_mode)
{
int ret;

ret = hclge_cfg_serdes_loopback(hdev, en, loop_mode);
if (ret)
return ret;

hclge_cfg_mac_mode(hdev, en);

Expand Down Expand Up @@ -6535,6 +6551,22 @@ static int hclge_set_loopback(struct hnae3_handle *handle,
return 0;
}

static int hclge_set_default_loopback(struct hclge_dev *hdev)
{
int ret;

ret = hclge_set_app_loopback(hdev, false);
if (ret)
return ret;

ret = hclge_cfg_serdes_loopback(hdev, false, HNAE3_LOOP_SERIAL_SERDES);
if (ret)
return ret;

return hclge_cfg_serdes_loopback(hdev, false,
HNAE3_LOOP_PARALLEL_SERDES);
}

static void hclge_reset_tqp_stats(struct hnae3_handle *handle)
{
struct hclge_vport *vport = hclge_get_vport(handle);
Expand Down

0 comments on commit 1cbc662

Please sign in to comment.