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

Commit 7af7d6ec authored by Sudarsana Reddy Kalluru's avatar Sudarsana Reddy Kalluru Committed by Greg Kroah-Hartman
Browse files

bnx2x: Fix receiving tx-timeout in error or recovery state.



[ Upstream commit 484c016d9392786ce5c74017c206c706f29f823d ]

Driver performs the internal reload when it receives tx-timeout event from
the OS. Internal reload might fail in some scenarios e.g., fatal HW issues.
In such cases OS still see the link, which would result in undesirable
functionalities such as re-generation of tx-timeouts.
The patch addresses this issue by indicating the link-down to OS when
tx-timeout is detected, and keeping the link in down state till the
internal reload is successful.

Please consider applying it to 'net' branch.

Signed-off-by: default avatarSudarsana Reddy Kalluru <Sudarsana.Kalluru@cavium.com>
Signed-off-by: default avatarAriel Elior <ariel.elior@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f4ed9d9d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1613,6 +1613,7 @@ struct bnx2x {
	struct link_vars	link_vars;
	u32			link_cnt;
	struct bnx2x_link_report_data last_reported_link;
	bool			force_link_down;

	struct mdio_if_info	mdio;

+6 −0
Original line number Diff line number Diff line
@@ -1257,6 +1257,11 @@ void __bnx2x_link_report(struct bnx2x *bp)
{
	struct bnx2x_link_report_data cur_data;

	if (bp->force_link_down) {
		bp->link_vars.link_up = 0;
		return;
	}

	/* reread mf_cfg */
	if (IS_PF(bp) && !CHIP_IS_E1(bp))
		bnx2x_read_mf_cfg(bp);
@@ -2799,6 +2804,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
		bp->pending_max = 0;
	}

	bp->force_link_down = false;
	if (bp->port.pmf) {
		rc = bnx2x_initial_phy_init(bp, load_mode);
		if (rc)
+6 −0
Original line number Diff line number Diff line
@@ -10036,6 +10036,12 @@ static void bnx2x_sp_rtnl_task(struct work_struct *work)
		bp->sp_rtnl_state = 0;
		smp_mb();

		/* Immediately indicate link as down */
		bp->link_vars.link_up = 0;
		bp->force_link_down = true;
		netif_carrier_off(bp->dev);
		BNX2X_ERR("Indicating link is down due to Tx-timeout\n");

		bnx2x_nic_unload(bp, UNLOAD_NORMAL, true);
		bnx2x_nic_load(bp, LOAD_NORMAL);