diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h index 7f075df37d75ead9c59714aed267ed07767591e2..1440a74c6b5d68cb595f4b0245fb02f7bb176531 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 41ebe79ad9335e473154e220d707d451bb805268..070e8a360af19f3f14fdc8279da75a839b6a3986 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 e0f36767a8e81adb8a8e3676846caa29aa2657f1..1cb2c21de2f0db228e11026e240cf7e15ea2c13e 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 dc62034ef5fa95abb10db208b36ac2f2b1d5e891..1fbbfe2a59bafb09cc0804500a54d94a07cdcd27 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;