Skip to content

Commit 1a426f8

Browse files
321lipengdavem330
authored andcommitted
net: hns3: fix the VF queue reset flow error
VF queue reset flow is different from PF queue reset flow. VF driver should stop VF queue first, then send message to PF and PF do the reset. PF should send a response to VF after PF complete the queue reset, VF can initialize the queue hw after get the response. This patch fixes the VF queue reset flow as the correct step. Signed-off-by: Peng Li <lipeng321@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent dd72140 commit 1a426f8

File tree

4 files changed

+53
-6
lines changed

4 files changed

+53
-6
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4926,6 +4926,43 @@ void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id)
49264926
}
49274927
}
49284928

4929+
void hclge_reset_vf_queue(struct hclge_vport *vport, u16 queue_id)
4930+
{
4931+
struct hclge_dev *hdev = vport->back;
4932+
int reset_try_times = 0;
4933+
int reset_status;
4934+
u16 queue_gid;
4935+
int ret;
4936+
4937+
queue_gid = hclge_covert_handle_qid_global(&vport->nic, queue_id);
4938+
4939+
ret = hclge_send_reset_tqp_cmd(hdev, queue_gid, true);
4940+
if (ret) {
4941+
dev_warn(&hdev->pdev->dev,
4942+
"Send reset tqp cmd fail, ret = %d\n", ret);
4943+
return;
4944+
}
4945+
4946+
reset_try_times = 0;
4947+
while (reset_try_times++ < HCLGE_TQP_RESET_TRY_TIMES) {
4948+
/* Wait for tqp hw reset */
4949+
msleep(20);
4950+
reset_status = hclge_get_reset_status(hdev, queue_gid);
4951+
if (reset_status)
4952+
break;
4953+
}
4954+
4955+
if (reset_try_times >= HCLGE_TQP_RESET_TRY_TIMES) {
4956+
dev_warn(&hdev->pdev->dev, "Reset TQP fail\n");
4957+
return;
4958+
}
4959+
4960+
ret = hclge_send_reset_tqp_cmd(hdev, queue_gid, false);
4961+
if (ret)
4962+
dev_warn(&hdev->pdev->dev,
4963+
"Deassert the soft reset fail, ret = %d\n", ret);
4964+
}
4965+
49294966
static u32 hclge_get_fw_version(struct hnae3_handle *handle)
49304967
{
49314968
struct hclge_vport *vport = hclge_get_vport(handle);

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,5 +646,6 @@ void hclge_rss_indir_init_cfg(struct hclge_dev *hdev);
646646

647647
void hclge_mbx_handler(struct hclge_dev *hdev);
648648
void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id);
649+
void hclge_reset_vf_queue(struct hclge_vport *vport, u16 queue_id);
649650
int hclge_cfg_flowctrl(struct hclge_dev *hdev);
650651
#endif

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -322,14 +322,17 @@ static int hclge_get_link_info(struct hclge_vport *vport,
322322
HCLGE_MBX_LINK_STAT_CHANGE, dest_vfid);
323323
}
324324

325-
static void hclge_reset_vf_queue(struct hclge_vport *vport,
326-
struct hclge_mbx_vf_to_pf_cmd *mbx_req)
325+
static void hclge_mbx_reset_vf_queue(struct hclge_vport *vport,
326+
struct hclge_mbx_vf_to_pf_cmd *mbx_req)
327327
{
328328
u16 queue_id;
329329

330330
memcpy(&queue_id, &mbx_req->msg[2], sizeof(queue_id));
331331

332-
hclge_reset_tqp(&vport->nic, queue_id);
332+
hclge_reset_vf_queue(vport, queue_id);
333+
334+
/* send response msg to VF after queue reset complete*/
335+
hclge_gen_resp_to_vf(vport, mbx_req, 0, NULL, 0);
333336
}
334337

335338
void hclge_mbx_handler(struct hclge_dev *hdev)
@@ -407,7 +410,7 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
407410
ret);
408411
break;
409412
case HCLGE_MBX_QUEUE_RESET:
410-
hclge_reset_vf_queue(vport, req);
413+
hclge_mbx_reset_vf_queue(vport, req);
411414
break;
412415
default:
413416
dev_err(&hdev->pdev->dev,

drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -817,11 +817,17 @@ static void hclgevf_reset_tqp(struct hnae3_handle *handle, u16 queue_id)
817817
{
818818
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
819819
u8 msg_data[2];
820+
int ret;
820821

821822
memcpy(&msg_data[0], &queue_id, sizeof(queue_id));
822823

823-
hclgevf_send_mbx_msg(hdev, HCLGE_MBX_QUEUE_RESET, 0, msg_data, 2, false,
824-
NULL, 0);
824+
/* disable vf queue before send queue reset msg to PF */
825+
ret = hclgevf_tqp_enable(hdev, queue_id, 0, false);
826+
if (ret)
827+
return;
828+
829+
hclgevf_send_mbx_msg(hdev, HCLGE_MBX_QUEUE_RESET, 0, msg_data,
830+
2, true, NULL, 0);
825831
}
826832

827833
static u32 hclgevf_get_fw_version(struct hnae3_handle *handle)

0 commit comments

Comments
 (0)