Commit 3462207d authored by Yufeng Mo's avatar Yufeng Mo Committed by Jakub Kicinski

net: hns3: fix GRO configuration error after reset

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: default avatarYufeng Mo <moyufeng@huawei.com>
Signed-off-by: default avatarGuangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 55649d56
...@@ -1550,6 +1550,7 @@ static int hclge_configure(struct hclge_dev *hdev) ...@@ -1550,6 +1550,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);
...@@ -1618,7 +1619,7 @@ static int hclge_config_tso(struct hclge_dev *hdev, u16 tso_mss_min, ...@@ -1618,7 +1619,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;
...@@ -1630,7 +1631,7 @@ static int hclge_config_gro(struct hclge_dev *hdev, bool en) ...@@ -1630,7 +1631,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)
...@@ -11586,7 +11587,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -11586,7 +11587,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;
...@@ -11967,7 +11968,7 @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -11967,7 +11968,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;
...@@ -12701,8 +12702,15 @@ static int hclge_gro_en(struct hnae3_handle *handle, bool enable) ...@@ -12701,8 +12702,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)
......
...@@ -927,6 +927,7 @@ struct hclge_dev { ...@@ -927,6 +927,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 */
......
...@@ -2487,6 +2487,8 @@ static int hclgevf_configure(struct hclgevf_dev *hdev) ...@@ -2487,6 +2487,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;
...@@ -2549,7 +2551,7 @@ static int hclgevf_init_roce_base_info(struct hclgevf_dev *hdev) ...@@ -2549,7 +2551,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;
...@@ -2562,7 +2564,7 @@ static int hclgevf_config_gro(struct hclgevf_dev *hdev, bool en) ...@@ -2562,7 +2564,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)
...@@ -3308,7 +3310,7 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev) ...@@ -3308,7 +3310,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;
...@@ -3389,7 +3391,7 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) ...@@ -3389,7 +3391,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;
...@@ -3638,8 +3640,15 @@ void hclgevf_update_speed_duplex(struct hclgevf_dev *hdev, u32 speed, ...@@ -3638,8 +3640,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,
......
...@@ -310,6 +310,8 @@ struct hclgevf_dev { ...@@ -310,6 +310,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%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment