e1000 CSA fix for 82547

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



There was a change to the e1000 gigabit ethernet driver in kernel
2.4.27-pre1 that removed an interrupt processing fix for 82547 chips.
The comment in the source says "Back out the CSA fix for 82547 as it
continues to cause systems lock-ups with production system".  Without
this fix, I have been getting network communication timeouts under high
load with syslog messages such as "NETDEV WATCHDOG: eth0: transmit timed
out".  When I put the fix back in (with the patch below), the timeouts
go away.  Can you tell me anything more about why this fix was removed
from the driver?  Should I expect to have problems with the fix put back
in?

I am using a SuperMicro P4SCI motherboard with dual built-in PRO/1000
ethernet ports.  The output of lspci -n is as follows:
01:01.0 Class 0200: 8086:1075
03:0a.0 Class 0200: 8086:1076

Thanks,
Anthony J. Battersby
Cybernetics

diff -urN linux-2.4.27-vanilla/drivers/net/e1000/e1000_main.c
linux-2.4.27-e1000/drivers/net/e1000/e1000_main.c
--- linux-2.4.27-vanilla/drivers/net/e1000/e1000_main.c	Sat Aug  7 19:26:05 2004
+++ linux-2.4.27-e1000/drivers/net/e1000/e1000_main.c	Thu Aug 12 16:13:41 2004
@@ -2120,10 +2120,26 @@
 		__netif_rx_schedule(netdev);
 	}
 #else
+        /* Writing IMC and IMS is needed for 82547.
+	   Due to Hub Link bus being occupied, an interrupt
+	   de-assertion message is not able to be sent.
+	   When an interrupt assertion message is generated later,
+	   two messages are re-ordered and sent out.
+	   That causes APIC to think 82547 is in de-assertion
+	   state, while 82547 is in assertion state, resulting
+	   in dead lock. Writing IMC forces 82547 into
+	   de-assertion state.
+        */
+	if(hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2)
+		e1000_irq_disable(adapter);
+
 	for(i = 0; i < E1000_MAX_INTR; i++)
 		if(!e1000_clean_rx_irq(adapter) &
 		   !e1000_clean_tx_irq(adapter))
 			break;
+
+	if(hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2)
+		e1000_irq_enable(adapter);
 #endif
 
 	return IRQ_HANDLED;

-
: send the line "unsubscribe linux-net" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux