| From 9703afa7b479d08ac472e38cf7683d83d1844ea2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 19 Jul 2021 17:13:05 +0800 |
| Subject: net: hns3: fix possible mismatches resp of mailbox |
| |
| From: Chengwen Feng <fengchengwen@huawei.com> |
| |
| [ Upstream commit 1b713d14dc3c077ec45e65dab4ea01a8bc41b8c1 ] |
| |
| Currently, the mailbox synchronous communication between VF and PF use |
| the following fields to maintain communication: |
| 1. Origin_mbx_msg which was combined by message code and subcode, used |
| to match request and response. |
| 2. Received_resp which means whether received response. |
| |
| There may possible mismatches of the following situation: |
| 1. VF sends message A with code=1 subcode=1. |
| 2. PF was blocked about 500ms when processing the message A. |
| 3. VF will detect message A timeout because it can't get the response |
| within 500ms. |
| 4. VF sends message B with code=1 subcode=1 which equal message A. |
| 5. PF processes the first message A and send the response message to |
| VF. |
| 6. VF will identify the response matched the message B because the |
| code/subcode is the same. This will lead to mismatch of request and |
| response. |
| |
| To fix the above bug, we use the following scheme: |
| 1. The message sent from VF was labelled with match_id which was a |
| unique 16-bit non-zero value. |
| 2. The response sent from PF will label with match_id which got from |
| the request. |
| 3. The VF uses the match_id to match request and response message. |
| |
| As for PF driver, it only needs to copy the match_id from request to |
| response. |
| |
| Fixes: dde1a86e93ca ("net: hns3: Add mailbox support to PF driver") |
| Signed-off-by: Chengwen Feng <fengchengwen@huawei.com> |
| Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com> |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h | 6 ++++-- |
| drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 1 + |
| 2 files changed, 5 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h |
| index a2c17af57fde..d283beec9f66 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h |
| @@ -135,7 +135,8 @@ struct hclge_mbx_vf_to_pf_cmd { |
| u8 mbx_need_resp; |
| u8 rsv1[1]; |
| u8 msg_len; |
| - u8 rsv2[3]; |
| + u8 rsv2; |
| + u16 match_id; |
| struct hclge_vf_to_pf_msg msg; |
| }; |
| |
| @@ -145,7 +146,8 @@ struct hclge_mbx_pf_to_vf_cmd { |
| u8 dest_vfid; |
| u8 rsv[3]; |
| u8 msg_len; |
| - u8 rsv1[3]; |
| + u8 rsv1; |
| + u16 match_id; |
| struct hclge_pf_to_vf_msg msg; |
| }; |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c |
| index f1c9f4ada348..38b601031db4 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c |
| @@ -47,6 +47,7 @@ static int hclge_gen_resp_to_vf(struct hclge_vport *vport, |
| |
| resp_pf_to_vf->dest_vfid = vf_to_pf_req->mbx_src_vfid; |
| resp_pf_to_vf->msg_len = vf_to_pf_req->msg_len; |
| + resp_pf_to_vf->match_id = vf_to_pf_req->match_id; |
| |
| resp_pf_to_vf->msg.code = HCLGE_MBX_PF_VF_RESP; |
| resp_pf_to_vf->msg.vf_mbx_msg_code = vf_to_pf_req->msg.code; |
| -- |
| 2.30.2 |
| |