aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/tg3.c
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2006-09-27 19:00:40 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2006-09-28 21:01:35 -0400
commit130b8e4d0e4edadcecee9fdff2c32f33d77c4fe9 (patch)
tree1c0f165309fa5a6b5d23fdad038ae932470d0cf9 /drivers/net/tg3.c
parent3d3ebe741b2c06fe3df67739d09f6ef0e25ee41a (diff)
[TG3]: Improve ASF heartbeat.
Change to a different ASF heartbeat message code to improve reliability. There were some reports of unintended resets on real time kernels where the timer may be slow and cause the heartbeat to be late. Netpoll will also have the same problem because the timer irq will be unavailable. Using the new heartbeat code, the ASF firmware will also check the ring condition before resetting the chip when the heartbeat is expiring. Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
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);