]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qed: Set HW-channel to ready before ACKing VF
authorMintz, Yuval <Yuval.Mintz@cavium.com>
Sun, 19 Mar 2017 11:08:14 +0000 (13:08 +0200)
committerChuck Anderson <chuck.anderson@oracle.com>
Wed, 26 Jul 2017 03:46:45 +0000 (20:46 -0700)
Orabug: 2593305326439680

When PF responds to the VF requests it also cleans the HW-channel
indication in firmware to allow further VF messages to arrive,
but the order currently applied is wrong -
The PF is copying by DMAE the response the VF is polling on for
completion, and only afterwards sets the HW-channel to ready state.

This creates a race condition where the VF would be able to send
an additional message to the PF before the channel would get ready
again, causing the firmware to consider the VF as malicious.

Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/net/ethernet/qlogic/qed/qed_sriov.c

index 9cef64cdcaa163526513307fe20b9298b16d1477..e9d534af224f51a96cb34ce9c37806b2167033b9 100644 (file)
@@ -1135,13 +1135,17 @@ static void qed_iov_send_response(struct qed_hwfn *p_hwfn,
                           (sizeof(union pfvf_tlvs) - sizeof(u64)) / 4,
                           &params);
 
-       qed_dmae_host2host(p_hwfn, p_ptt, mbx->reply_phys,
-                          mbx->req_virt->first_tlv.reply_address,
-                          sizeof(u64) / 4, &params);
-
+       /* Once PF copies the rc to the VF, the latter can continue
+        * and send an additional message. So we have to make sure the
+        * channel would be re-set to ready prior to that.
+        */
        REG_WR(p_hwfn,
               GTT_BAR0_MAP_REG_USDM_RAM +
               USTORM_VF_PF_CHANNEL_READY_OFFSET(eng_vf_id), 1);
+
+       qed_dmae_host2host(p_hwfn, p_ptt, mbx->reply_phys,
+                          mbx->req_virt->first_tlv.reply_address,
+                          sizeof(u64) / 4, &params);
 }
 
 static u16 qed_iov_vport_to_tlv(struct qed_hwfn *p_hwfn,