提交 c87cd8fa 编写于 作者: Y Yufeng Mo 提交者: Zheng Zengkai

net: hns3: fix GRO configuration error after reset

mainline inclusion
from mainline-v5.14
commit 3462207d
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I46N6O
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3462207d2d684658d97499ca77c00c9ac7c87ea8

----------------------------------------------------------------------

The GRO configuration is enabled by default after reset. This
is incorrect and should be restored to the user-configured value.
So this restoration is added during reset initialization.
Signed-off-by: NYufeng Mo <moyufeng@huawei.com>
Signed-off-by: NGuangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: NJakub Kicinski <kuba@kernel.org>
Reviewed-by: NYongxin Li <liyongxin1@huawei.com>
Signed-off-by: NJunxin Chen <chenjunxin1@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 d843e610
...@@ -1551,6 +1551,7 @@ static int hclge_configure(struct hclge_dev *hdev) ...@@ -1551,6 +1551,7 @@ static int hclge_configure(struct hclge_dev *hdev)
hdev->tm_info.hw_pfc_map = 0; hdev->tm_info.hw_pfc_map = 0;
hdev->wanted_umv_size = cfg.umv_space; hdev->wanted_umv_size = cfg.umv_space;
hdev->tx_spare_buf_size = cfg.tx_spare_buf_size; hdev->tx_spare_buf_size = cfg.tx_spare_buf_size;
hdev->gro_en = true;
if (cfg.vlan_fliter_cap == HCLGE_VLAN_FLTR_CAN_MDF) if (cfg.vlan_fliter_cap == HCLGE_VLAN_FLTR_CAN_MDF)
set_bit(HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, ae_dev->caps); set_bit(HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, ae_dev->caps);
...@@ -1619,7 +1620,7 @@ static int hclge_config_tso(struct hclge_dev *hdev, u16 tso_mss_min, ...@@ -1619,7 +1620,7 @@ static int hclge_config_tso(struct hclge_dev *hdev, u16 tso_mss_min,
return hclge_cmd_send(&hdev->hw, &desc, 1); return hclge_cmd_send(&hdev->hw, &desc, 1);
} }
static int hclge_config_gro(struct hclge_dev *hdev, bool en) static int hclge_config_gro(struct hclge_dev *hdev)
{ {
struct hclge_cfg_gro_status_cmd *req; struct hclge_cfg_gro_status_cmd *req;
struct hclge_desc desc; struct hclge_desc desc;
...@@ -1631,7 +1632,7 @@ static int hclge_config_gro(struct hclge_dev *hdev, bool en) ...@@ -1631,7 +1632,7 @@ static int hclge_config_gro(struct hclge_dev *hdev, bool en)
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_GRO_GENERIC_CONFIG, false); hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_GRO_GENERIC_CONFIG, false);
req = (struct hclge_cfg_gro_status_cmd *)desc.data; req = (struct hclge_cfg_gro_status_cmd *)desc.data;
req->gro_en = en ? 1 : 0; req->gro_en = hdev->gro_en ? 1 : 0;
ret = hclge_cmd_send(&hdev->hw, &desc, 1); ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret) if (ret)
...@@ -11597,7 +11598,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -11597,7 +11598,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
goto err_mdiobus_unreg; goto err_mdiobus_unreg;
} }
ret = hclge_config_gro(hdev, true); ret = hclge_config_gro(hdev);
if (ret) if (ret)
goto err_mdiobus_unreg; goto err_mdiobus_unreg;
...@@ -11980,7 +11981,7 @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -11980,7 +11981,7 @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev)
return ret; return ret;
} }
ret = hclge_config_gro(hdev, true); ret = hclge_config_gro(hdev);
if (ret) if (ret)
return ret; return ret;
...@@ -12715,8 +12716,15 @@ static int hclge_gro_en(struct hnae3_handle *handle, bool enable) ...@@ -12715,8 +12716,15 @@ static int hclge_gro_en(struct hnae3_handle *handle, bool enable)
{ {
struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
bool gro_en_old = hdev->gro_en;
int ret;
hdev->gro_en = enable;
ret = hclge_config_gro(hdev);
if (ret)
hdev->gro_en = gro_en_old;
return hclge_config_gro(hdev, enable); return ret;
} }
static void hclge_sync_promisc_mode(struct hclge_dev *hdev) static void hclge_sync_promisc_mode(struct hclge_dev *hdev)
......
...@@ -929,6 +929,7 @@ struct hclge_dev { ...@@ -929,6 +929,7 @@ struct hclge_dev {
unsigned long fd_bmap[BITS_TO_LONGS(MAX_FD_FILTER_NUM)]; unsigned long fd_bmap[BITS_TO_LONGS(MAX_FD_FILTER_NUM)];
enum HCLGE_FD_ACTIVE_RULE_TYPE fd_active_type; enum HCLGE_FD_ACTIVE_RULE_TYPE fd_active_type;
u8 fd_en; u8 fd_en;
bool gro_en;
u16 wanted_umv_size; u16 wanted_umv_size;
/* max available unicast mac vlan space */ /* max available unicast mac vlan space */
......
...@@ -2488,6 +2488,8 @@ static int hclgevf_configure(struct hclgevf_dev *hdev) ...@@ -2488,6 +2488,8 @@ static int hclgevf_configure(struct hclgevf_dev *hdev)
{ {
int ret; int ret;
hdev->gro_en = true;
ret = hclgevf_get_basic_info(hdev); ret = hclgevf_get_basic_info(hdev);
if (ret) if (ret)
return ret; return ret;
...@@ -2550,7 +2552,7 @@ static int hclgevf_init_roce_base_info(struct hclgevf_dev *hdev) ...@@ -2550,7 +2552,7 @@ static int hclgevf_init_roce_base_info(struct hclgevf_dev *hdev)
return 0; return 0;
} }
static int hclgevf_config_gro(struct hclgevf_dev *hdev, bool en) static int hclgevf_config_gro(struct hclgevf_dev *hdev)
{ {
struct hclgevf_cfg_gro_status_cmd *req; struct hclgevf_cfg_gro_status_cmd *req;
struct hclgevf_desc desc; struct hclgevf_desc desc;
...@@ -2563,7 +2565,7 @@ static int hclgevf_config_gro(struct hclgevf_dev *hdev, bool en) ...@@ -2563,7 +2565,7 @@ static int hclgevf_config_gro(struct hclgevf_dev *hdev, bool en)
false); false);
req = (struct hclgevf_cfg_gro_status_cmd *)desc.data; req = (struct hclgevf_cfg_gro_status_cmd *)desc.data;
req->gro_en = en ? 1 : 0; req->gro_en = hdev->gro_en ? 1 : 0;
ret = hclgevf_cmd_send(&hdev->hw, &desc, 1); ret = hclgevf_cmd_send(&hdev->hw, &desc, 1);
if (ret) if (ret)
...@@ -3309,7 +3311,7 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev) ...@@ -3309,7 +3311,7 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev)
return ret; return ret;
} }
ret = hclgevf_config_gro(hdev, true); ret = hclgevf_config_gro(hdev);
if (ret) if (ret)
return ret; return ret;
...@@ -3394,7 +3396,7 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) ...@@ -3394,7 +3396,7 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
if (ret) if (ret)
goto err_config; goto err_config;
ret = hclgevf_config_gro(hdev, true); ret = hclgevf_config_gro(hdev);
if (ret) if (ret)
goto err_config; goto err_config;
...@@ -3646,8 +3648,15 @@ void hclgevf_update_speed_duplex(struct hclgevf_dev *hdev, u32 speed, ...@@ -3646,8 +3648,15 @@ void hclgevf_update_speed_duplex(struct hclgevf_dev *hdev, u32 speed,
static int hclgevf_gro_en(struct hnae3_handle *handle, bool enable) static int hclgevf_gro_en(struct hnae3_handle *handle, bool enable)
{ {
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
bool gro_en_old = hdev->gro_en;
int ret;
return hclgevf_config_gro(hdev, enable); hdev->gro_en = enable;
ret = hclgevf_config_gro(hdev);
if (ret)
hdev->gro_en = gro_en_old;
return ret;
} }
static void hclgevf_get_media_type(struct hnae3_handle *handle, u8 *media_type, static void hclgevf_get_media_type(struct hnae3_handle *handle, u8 *media_type,
......
...@@ -311,6 +311,8 @@ struct hclgevf_dev { ...@@ -311,6 +311,8 @@ struct hclgevf_dev {
u16 *vector_status; u16 *vector_status;
int *vector_irq; int *vector_irq;
bool gro_en;
unsigned long vlan_del_fail_bmap[BITS_TO_LONGS(VLAN_N_VID)]; unsigned long vlan_del_fail_bmap[BITS_TO_LONGS(VLAN_N_VID)];
struct hclgevf_mac_table_cfg mac_table; struct hclgevf_mac_table_cfg mac_table;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册