Commit e4d68dae authored by Yunsheng Lin's avatar Yunsheng Lin Committed by David S. Miller

net: hns3: refactor the loopback related function

This patch refactors the loopback related function in order
to support the serdes loopback.
Signed-off-by: default avatarYunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: default avatarPeng Li <lipeng321@huawei.com>
Signed-off-by: default avatarSalil Mehta <salil.mehta@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent beebca3a
...@@ -74,7 +74,7 @@ struct hns3_link_mode_mapping { ...@@ -74,7 +74,7 @@ struct hns3_link_mode_mapping {
u32 ethtool_link_mode; u32 ethtool_link_mode;
}; };
static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop) static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
{ {
struct hnae3_handle *h = hns3_get_handle(ndev); struct hnae3_handle *h = hns3_get_handle(ndev);
int ret; int ret;
...@@ -85,11 +85,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop) ...@@ -85,11 +85,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop)
switch (loop) { switch (loop) {
case HNAE3_MAC_INTER_LOOP_MAC: case HNAE3_MAC_INTER_LOOP_MAC:
ret = h->ae_algo->ops->set_loopback(h, loop, true); ret = h->ae_algo->ops->set_loopback(h, loop, en);
break;
case HNAE3_MAC_LOOP_NONE:
ret = h->ae_algo->ops->set_loopback(h,
HNAE3_MAC_INTER_LOOP_MAC, false);
break; break;
default: default:
ret = -ENOTSUPP; ret = -ENOTSUPP;
...@@ -99,10 +95,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop) ...@@ -99,10 +95,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop)
if (ret) if (ret)
return ret; return ret;
if (loop == HNAE3_MAC_LOOP_NONE) h->ae_algo->ops->set_promisc_mode(h, en);
h->ae_algo->ops->set_promisc_mode(h, ndev->flags & IFF_PROMISC);
else
h->ae_algo->ops->set_promisc_mode(h, 1);
return ret; return ret;
} }
...@@ -122,13 +115,13 @@ static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode) ...@@ -122,13 +115,13 @@ static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode)
return ret; return ret;
} }
ret = hns3_lp_setup(ndev, loop_mode); ret = hns3_lp_setup(ndev, loop_mode, true);
usleep_range(10000, 20000); usleep_range(10000, 20000);
return ret; return ret;
} }
static int hns3_lp_down(struct net_device *ndev) static int hns3_lp_down(struct net_device *ndev, enum hnae3_loop loop_mode)
{ {
struct hnae3_handle *h = hns3_get_handle(ndev); struct hnae3_handle *h = hns3_get_handle(ndev);
int ret; int ret;
...@@ -136,7 +129,7 @@ static int hns3_lp_down(struct net_device *ndev) ...@@ -136,7 +129,7 @@ static int hns3_lp_down(struct net_device *ndev)
if (!h->ae_algo->ops->stop) if (!h->ae_algo->ops->stop)
return -EOPNOTSUPP; return -EOPNOTSUPP;
ret = hns3_lp_setup(ndev, HNAE3_MAC_LOOP_NONE); ret = hns3_lp_setup(ndev, loop_mode, false);
if (ret) { if (ret) {
netdev_err(ndev, "lb_setup return error: %d\n", ret); netdev_err(ndev, "lb_setup return error: %d\n", ret);
return ret; return ret;
...@@ -332,7 +325,7 @@ static void hns3_self_test(struct net_device *ndev, ...@@ -332,7 +325,7 @@ static void hns3_self_test(struct net_device *ndev,
data[test_index] = hns3_lp_up(ndev, loop_type); data[test_index] = hns3_lp_up(ndev, loop_type);
if (!data[test_index]) { if (!data[test_index]) {
data[test_index] = hns3_lp_run_test(ndev, loop_type); data[test_index] = hns3_lp_run_test(ndev, loop_type);
hns3_lp_down(ndev); hns3_lp_down(ndev, loop_type);
} }
if (data[test_index]) if (data[test_index])
......
...@@ -3682,48 +3682,50 @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable) ...@@ -3682,48 +3682,50 @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable)
"mac enable fail, ret =%d.\n", ret); "mac enable fail, ret =%d.\n", ret);
} }
static int hclge_set_loopback(struct hnae3_handle *handle, static int hclge_set_mac_loopback(struct hclge_dev *hdev, bool en)
enum hnae3_loop loop_mode, bool en)
{ {
struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_config_mac_mode_cmd *req; struct hclge_config_mac_mode_cmd *req;
struct hclge_dev *hdev = vport->back;
struct hclge_desc desc; struct hclge_desc desc;
u32 loop_en; u32 loop_en;
int ret; int ret;
switch (loop_mode) { req = (struct hclge_config_mac_mode_cmd *)&desc.data[0];
case HNAE3_MAC_INTER_LOOP_MAC: /* 1 Read out the MAC mode config at first */
req = (struct hclge_config_mac_mode_cmd *)&desc.data[0]; hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAC_MODE, true);
/* 1 Read out the MAC mode config at first */ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
hclge_cmd_setup_basic_desc(&desc, if (ret) {
HCLGE_OPC_CONFIG_MAC_MODE, dev_err(&hdev->pdev->dev,
true); "mac loopback get fail, ret =%d.\n", ret);
ret = hclge_cmd_send(&hdev->hw, &desc, 1); return ret;
if (ret) { }
dev_err(&hdev->pdev->dev,
"mac loopback get fail, ret =%d.\n",
ret);
return ret;
}
/* 2 Then setup the loopback flag */ /* 2 Then setup the loopback flag */
loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en); loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en);
if (en) hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, en ? 1 : 0);
hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 1);
else
hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 0);
req->txrx_pad_fcs_loop_en = cpu_to_le32(loop_en); req->txrx_pad_fcs_loop_en = cpu_to_le32(loop_en);
/* 3 Config mac work mode with loopback flag /* 3 Config mac work mode with loopback flag
* and its original configure parameters * and its original configure parameters
*/ */
hclge_cmd_reuse_desc(&desc, false); hclge_cmd_reuse_desc(&desc, false);
ret = hclge_cmd_send(&hdev->hw, &desc, 1); ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret) if (ret)
dev_err(&hdev->pdev->dev, dev_err(&hdev->pdev->dev,
"mac loopback set fail, ret =%d.\n", ret); "mac loopback set fail, ret =%d.\n", ret);
return ret;
}
static int hclge_set_loopback(struct hnae3_handle *handle,
enum hnae3_loop loop_mode, bool en)
{
struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back;
int ret;
switch (loop_mode) {
case HNAE3_MAC_INTER_LOOP_MAC:
ret = hclge_set_mac_loopback(hdev, en);
break; break;
default: default:
ret = -ENOTSUPP; ret = -ENOTSUPP;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment