| From 9c2a0e8abdba080a098f077519defe13b8e99bb6 Mon Sep 17 00:00:00 2001 |
| From: Manish Chopra <manishc@marvell.com> |
| Date: Mon, 28 Jan 2019 10:05:06 -0800 |
| Subject: qed: Fix VF probe failure while FLR |
| |
| [ Upstream commit 327852ec64205bb651be391a069784872098a3b2 ] |
| |
| VFs may hit VF-PF channel timeout while probing, as in some |
| cases it was observed that VF FLR and VF "acquire" message |
| transaction (i.e first message from VF to PF in VF's probe flow) |
| could occur simultaneously which could lead VF to fail sending |
| "acquire" message to PF as VF is marked disabled from HW perspective |
| due to FLR, which will result into channel timeout and VF probe failure. |
| |
| In such cases, try retrying VF "acquire" message so that in later |
| attempts it could be successful to pass message to PF after the VF |
| FLR is completed and can be probed successfully. |
| |
| Signed-off-by: Manish Chopra <manishc@marvell.com> |
| Signed-off-by: Ariel Elior <aelior@marvell.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/qlogic/qed/qed_vf.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| diff --git a/drivers/net/ethernet/qlogic/qed/qed_vf.c b/drivers/net/ethernet/qlogic/qed/qed_vf.c |
| index be118d057b92..6ab3fb008139 100644 |
| --- a/drivers/net/ethernet/qlogic/qed/qed_vf.c |
| +++ b/drivers/net/ethernet/qlogic/qed/qed_vf.c |
| @@ -261,6 +261,7 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn) |
| struct pfvf_acquire_resp_tlv *resp = &p_iov->pf2vf_reply->acquire_resp; |
| struct pf_vf_pfdev_info *pfdev_info = &resp->pfdev_info; |
| struct vf_pf_resc_request *p_resc; |
| + u8 retry_cnt = VF_ACQUIRE_THRESH; |
| bool resources_acquired = false; |
| struct vfpf_acquire_tlv *req; |
| int rc = 0, attempts = 0; |
| @@ -314,6 +315,15 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn) |
| |
| /* send acquire request */ |
| rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp)); |
| + |
| + /* Re-try acquire in case of vf-pf hw channel timeout */ |
| + if (retry_cnt && rc == -EBUSY) { |
| + DP_VERBOSE(p_hwfn, QED_MSG_IOV, |
| + "VF retrying to acquire due to VPC timeout\n"); |
| + retry_cnt--; |
| + continue; |
| + } |
| + |
| if (rc) |
| goto exit; |
| |
| -- |
| 2.19.1 |
| |