aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/tg3.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r--drivers/net/tg3.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 4eef798fbb7b..6af8ebcf35f0 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -6690,13 +6690,29 @@ static void tg3_timer(unsigned long __opaque)
6690 tp->timer_counter = tp->timer_multiplier; 6690 tp->timer_counter = tp->timer_multiplier;
6691 } 6691 }
6692 6692
6693 /* Heartbeat is only sent once every 2 seconds. */ 6693 /* Heartbeat is only sent once every 2 seconds.
6694 *
6695 * The heartbeat is to tell the ASF firmware that the host
6696 * driver is still alive. In the event that the OS crashes,
6697 * ASF needs to reset the hardware to free up the FIFO space
6698 * that may be filled with rx packets destined for the host.
6699 * If the FIFO is full, ASF will no longer function properly.
6700 *
6701 * Unintended resets have been reported on real time kernels
6702 * where the timer doesn't run on time. Netpoll will also have
6703 * same problem.
6704 *
6705 * The new FWCMD_NICDRV_ALIVE3 command tells the ASF firmware
6706 * to check the ring condition when the heartbeat is expiring
6707 * before doing the reset. This will prevent most unintended
6708 * resets.
6709 */
6694 if (!--tp->asf_counter) { 6710 if (!--tp->asf_counter) {
6695 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { 6711 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
6696 u32 val; 6712 u32 val;
6697 6713
6698 tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, 6714 tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX,
6699 FWCMD_NICDRV_ALIVE2); 6715 FWCMD_NICDRV_ALIVE3);
6700 tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); 6716 tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4);
6701 /* 5 seconds timeout */ 6717 /* 5 seconds timeout */
6702 tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); 6718 tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5);