Commit 4c868664 authored by Eilon Greenstein's avatar Eilon Greenstein Committed by David S. Miller

bnx2x: Prevent mistaken hangup between driver & FW

When system CPU is stressed it's possible that the driver will not be able
to pulse the FW every second, which will cause the log to be filled with
error messages.

Increasing the threshold to 5 seconds seems to be enough to eliminate the
issue.
Signed-off-by: default avatarEilon Greenstein <eilong@broadcom.com>
Signed-off-by: default avatarYuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: default avatarAriel Elior <ariele@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 343f7dc4
...@@ -5447,27 +5447,25 @@ static void bnx2x_timer(unsigned long data) ...@@ -5447,27 +5447,25 @@ static void bnx2x_timer(unsigned long data)
if (IS_PF(bp) && if (IS_PF(bp) &&
!BP_NOMCP(bp)) { !BP_NOMCP(bp)) {
int mb_idx = BP_FW_MB_IDX(bp); int mb_idx = BP_FW_MB_IDX(bp);
u32 drv_pulse; u16 drv_pulse;
u32 mcp_pulse; u16 mcp_pulse;
++bp->fw_drv_pulse_wr_seq; ++bp->fw_drv_pulse_wr_seq;
bp->fw_drv_pulse_wr_seq &= DRV_PULSE_SEQ_MASK; bp->fw_drv_pulse_wr_seq &= DRV_PULSE_SEQ_MASK;
/* TBD - add SYSTEM_TIME */
drv_pulse = bp->fw_drv_pulse_wr_seq; drv_pulse = bp->fw_drv_pulse_wr_seq;
bnx2x_drv_pulse(bp); bnx2x_drv_pulse(bp);
mcp_pulse = (SHMEM_RD(bp, func_mb[mb_idx].mcp_pulse_mb) & mcp_pulse = (SHMEM_RD(bp, func_mb[mb_idx].mcp_pulse_mb) &
MCP_PULSE_SEQ_MASK); MCP_PULSE_SEQ_MASK);
/* The delta between driver pulse and mcp response /* The delta between driver pulse and mcp response
* should be 1 (before mcp response) or 0 (after mcp response) * should not get too big. If the MFW is more than 5 pulses
* behind, we should worry about it enough to generate an error
* log.
*/ */
if ((drv_pulse != mcp_pulse) && if (((drv_pulse - mcp_pulse) & MCP_PULSE_SEQ_MASK) > 5)
(drv_pulse != ((mcp_pulse + 1) & MCP_PULSE_SEQ_MASK))) { BNX2X_ERR("MFW seems hanged: drv_pulse (0x%x) != mcp_pulse (0x%x)\n",
/* someone lost a heartbeat... */
BNX2X_ERR("drv_pulse (0x%x) != mcp_pulse (0x%x)\n",
drv_pulse, mcp_pulse); drv_pulse, mcp_pulse);
} }
}
if (bp->state == BNX2X_STATE_OPEN) if (bp->state == BNX2X_STATE_OPEN)
bnx2x_stats_handle(bp, STATS_EVENT_UPDATE); bnx2x_stats_handle(bp, STATS_EVENT_UPDATE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment