Skip to content

Commit

Permalink
net: hns3: refactor the loopback related function
Browse files Browse the repository at this point in the history
This patch refactors the loopback related function in order
to support the serdes loopback.

Signed-off-by: Yunsheng Lin <linyunsheng@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>
  • Loading branch information
Yunsheng Lin authored and David S. Miller committed May 10, 2018
1 parent beebca3 commit e4d68da
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 47 deletions.
21 changes: 7 additions & 14 deletions drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ struct hns3_link_mode_mapping {
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);
int ret;
Expand All @@ -85,11 +85,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop)

switch (loop) {
case HNAE3_MAC_INTER_LOOP_MAC:
ret = h->ae_algo->ops->set_loopback(h, loop, true);
break;
case HNAE3_MAC_LOOP_NONE:
ret = h->ae_algo->ops->set_loopback(h,
HNAE3_MAC_INTER_LOOP_MAC, false);
ret = h->ae_algo->ops->set_loopback(h, loop, en);
break;
default:
ret = -ENOTSUPP;
Expand All @@ -99,10 +95,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop)
if (ret)
return ret;

if (loop == HNAE3_MAC_LOOP_NONE)
h->ae_algo->ops->set_promisc_mode(h, ndev->flags & IFF_PROMISC);
else
h->ae_algo->ops->set_promisc_mode(h, 1);
h->ae_algo->ops->set_promisc_mode(h, en);

return ret;
}
Expand All @@ -122,21 +115,21 @@ static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode)
return ret;
}

ret = hns3_lp_setup(ndev, loop_mode);
ret = hns3_lp_setup(ndev, loop_mode, true);
usleep_range(10000, 20000);

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);
int ret;

if (!h->ae_algo->ops->stop)
return -EOPNOTSUPP;

ret = hns3_lp_setup(ndev, HNAE3_MAC_LOOP_NONE);
ret = hns3_lp_setup(ndev, loop_mode, false);
if (ret) {
netdev_err(ndev, "lb_setup return error: %d\n", ret);
return ret;
Expand Down Expand Up @@ -332,7 +325,7 @@ static void hns3_self_test(struct net_device *ndev,
data[test_index] = hns3_lp_up(ndev, loop_type);
if (!data[test_index]) {
data[test_index] = hns3_lp_run_test(ndev, loop_type);
hns3_lp_down(ndev);
hns3_lp_down(ndev, loop_type);
}

if (data[test_index])
Expand Down
68 changes: 35 additions & 33 deletions drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3682,48 +3682,50 @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable)
"mac enable fail, ret =%d.\n", ret);
}

static int hclge_set_loopback(struct hnae3_handle *handle,
enum hnae3_loop loop_mode, bool en)
static int hclge_set_mac_loopback(struct hclge_dev *hdev, bool en)
{
struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_config_mac_mode_cmd *req;
struct hclge_dev *hdev = vport->back;
struct hclge_desc desc;
u32 loop_en;
int ret;

switch (loop_mode) {
case HNAE3_MAC_INTER_LOOP_MAC:
req = (struct hclge_config_mac_mode_cmd *)&desc.data[0];
/* 1 Read out the MAC mode config at first */
hclge_cmd_setup_basic_desc(&desc,
HCLGE_OPC_CONFIG_MAC_MODE,
true);
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret) {
dev_err(&hdev->pdev->dev,
"mac loopback get fail, ret =%d.\n",
ret);
return ret;
}
req = (struct hclge_config_mac_mode_cmd *)&desc.data[0];
/* 1 Read out the MAC mode config at first */
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAC_MODE, true);
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret) {
dev_err(&hdev->pdev->dev,
"mac loopback get fail, ret =%d.\n", ret);
return ret;
}

/* 2 Then setup the loopback flag */
loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en);
if (en)
hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 1);
else
hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 0);
/* 2 Then setup the loopback flag */
loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en);
hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, en ? 1 : 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
* and its original configure parameters
*/
hclge_cmd_reuse_desc(&desc, false);
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret)
dev_err(&hdev->pdev->dev,
"mac loopback set fail, ret =%d.\n", ret);
/* 3 Config mac work mode with loopback flag
* and its original configure parameters
*/
hclge_cmd_reuse_desc(&desc, false);
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret)
dev_err(&hdev->pdev->dev,
"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;
default:
ret = -ENOTSUPP;
Expand Down

0 comments on commit e4d68da

Please sign in to comment.