From 7103a56128136fbe8997047abf7dbfb3ef04d278 Mon Sep 17 00:00:00 2001 From: shenjian Date: Mon, 13 May 2019 16:53:24 +0800 Subject: [PATCH] net: hns3: configure user fec mode after reset driver inclusion category: bugfix bugzilla: NA CVE: NA Previously, the user fec mode may be lost after reset, the firmware always uses the default fec mode, which may cause link down if the link partner is using the usr fec mod. This patch fixes it. Signed-off-by: shenjian (K) Reviewed-by: lipeng Reviewed-by: Yang Yingliang Signed-off-by: Yang Yingliang --- drivers/net/ethernet/hisilicon/hns3/hnae3.h | 1 + .../net/ethernet/hisilicon/hns3/hns3_ethtool.c | 2 +- .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 17 ++++++++++++++++- .../ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 3 ++- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h index 7f075df37d75..1440a74c6b5d 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h @@ -133,6 +133,7 @@ enum hnae3_fec_mode { HNAE3_FEC_AUTO = 0, HNAE3_FEC_BASER, HNAE3_FEC_RS, + HNAE3_FEC_USER_DEF, }; enum hnae3_reset_notify_type { diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c index 41ebe79ad933..070e8a360af1 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c @@ -687,7 +687,7 @@ static int hns3_check_ksettings_param(struct net_device *netdev, } if (ops->check_port_speed) { - ret = ops->check_port_speed(handle, speed); + ret = ops->check_port_speed(handle, cmd->base.speed); if (ret) { netdev_err(netdev, "unsupported speed\n"); return ret; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index e0f36767a8e8..1cb2c21de2f0 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -2377,13 +2377,19 @@ static int hclge_set_fec(struct hnae3_handle *handle, u32 fec_mode) struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_dev *hdev = vport->back; struct hclge_mac *mac = &hdev->hw.mac; + int ret; if (fec_mode && !(mac->fec_ability & fec_mode)) { dev_err(&hdev->pdev->dev, "unsupported fec mode\n"); return -EINVAL; } - return hclge_set_fec_hw(hdev, fec_mode); + ret = hclge_set_fec_hw(hdev, fec_mode); + if (ret) + return ret; + + mac->user_fec_mode = fec_mode | BIT(HNAE3_FEC_USER_DEF); + return 0; } static void hclge_get_fec(struct hnae3_handle *handle, u8 *fec_ability, @@ -2416,6 +2422,15 @@ static int hclge_mac_init(struct hclge_dev *hdev) mac->link = 0; + if (mac->user_fec_mode & BIT(HNAE3_FEC_USER_DEF)) { + ret = hclge_set_fec_hw(hdev, mac->user_fec_mode); + if (ret) { + dev_err(&hdev->pdev->dev, + "Fec mode init fail, ret = %d\n", ret); + return ret; + } + } + ret = hclge_set_mac_mtu(hdev, hdev->mps); if (ret) { dev_err(&hdev->pdev->dev, "set mtu failed ret=%d\n", ret); diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h index dc62034ef5fa..1fbbfe2a59ba 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h @@ -201,7 +201,8 @@ struct hclge_mac { u32 speed; u32 speed_ability; /* speed ability supported by current media */ u32 module_type; /* sub media type, e.g. kr/cr/sr/lr */ - u32 fec_mode; + u32 fec_mode; /* active fec mode */ + u32 user_fec_mode; u32 fec_ability; int link; /* store the link status of mac & phy (if phy exit) */ struct phy_device *phydev; -- GitLab