diff options
Diffstat (limited to 'drivers/net/tg3.c')
| -rw-r--r-- | drivers/net/tg3.c | 20 |
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); |
