Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1c96c9f1 authored by Manish Chopra's avatar Manish Chopra Committed by Greg Kroah-Hartman
Browse files

bnx2x: Do not handle requests from VFs after parity



[ Upstream commit 7113f796bbbced2470cd6d7379d50d7a7a78bf34 ]

Parity error from the hardware will cause PF to lose the state
of their VFs due to PF's internal reload and hardware reset following
the parity error. Restrict any configuration request from the VFs after
the parity as it could cause unexpected hardware behavior, only way
for VFs to recover would be to trigger FLR on VFs and reload them.

Signed-off-by: default avatarManish Chopra <manishc@marvell.com>
Signed-off-by: default avatarAriel Elior <aelior@marvell.com>
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent e3d5f12b
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -9995,10 +9995,18 @@ static void bnx2x_recovery_failed(struct bnx2x *bp)
 */
static void bnx2x_parity_recover(struct bnx2x *bp)
{
	bool global = false;
	u32 error_recovered, error_unrecovered;
	bool is_parity;
	bool is_parity, global = false;
#ifdef CONFIG_BNX2X_SRIOV
	int vf_idx;

	for (vf_idx = 0; vf_idx < bp->requested_nr_virtfn; vf_idx++) {
		struct bnx2x_virtf *vf = BP_VF(bp, vf_idx);

		if (vf)
			vf->state = VF_LOST;
	}
#endif
	DP(NETIF_MSG_HW, "Handling parity\n");
	while (1) {
		switch (bp->recovery_state) {
+1 −0
Original line number Diff line number Diff line
@@ -139,6 +139,7 @@ struct bnx2x_virtf {
#define VF_ACQUIRED	1	/* VF acquired, but not initialized */
#define VF_ENABLED	2	/* VF Enabled */
#define VF_RESET	3	/* VF FLR'd, pending cleanup */
#define VF_LOST		4	/* Recovery while VFs are loaded */

	bool flr_clnup_stage;	/* true during flr cleanup */
	bool malicious;		/* true if FW indicated so, until FLR */
+12 −0
Original line number Diff line number Diff line
@@ -2114,6 +2114,18 @@ static void bnx2x_vf_mbx_request(struct bnx2x *bp, struct bnx2x_virtf *vf,
{
	int i;

	if (vf->state == VF_LOST) {
		/* Just ack the FW and return if VFs are lost
		 * in case of parity error. VFs are supposed to be timedout
		 * on waiting for PF response.
		 */
		DP(BNX2X_MSG_IOV,
		   "VF 0x%x lost, not handling the request\n", vf->abs_vfid);

		storm_memset_vf_mbx_ack(bp, vf->abs_vfid);
		return;
	}

	/* check if tlv type is known */
	if (bnx2x_tlv_supported(mbx->first_tlv.tl.type)) {
		/* Lock the per vf op mutex and note the locker's identity.