[PATCH] tulip: make tulip_stop_rxtx() wait for DMA to fully stop
Linux Kernel Mailing List <[email protected]> Sat, 26 Feb 2005 09:19:29 +0000
| Newsgroups | gmane.linux.kernel.commits.2-4 |
|---|---|
| Message-ID | <[email protected]> |
ChangeSet 1.1548.1.11, 2005/02/26 04:19:29-05:00, [email protected] [PATCH] tulip: make tulip_stop_rxtx() wait for DMA to fully stop tulip_stop_rxtx() doesn't wait for DMA to fully stop like the function call name implies. Acked-by: Grant Grundler <[email protected]> Acked-by: Charlie Brett <[email protected]> Signed-off-by: John W. Linville <[email protected]> Signed-off-by: Jeff Garzik <[email protected]> 21142.c | 2 +- eeprom.c | 1 + interrupt.c | 2 +- media.c | 1 + pnic.c | 1 + pnic2.c | 2 +- timer.c | 1 + tulip.h | 15 ++++++++++++++- tulip_core.c | 2 +- 9 files changed, 22 insertions(+), 5 deletions(-) diff -Nru a/drivers/net/tulip/21142.c b/drivers/net/tulip/21142.c --- a/drivers/net/tulip/21142.c 2005-03-04 12:03:17 -08:00 +++ b/drivers/net/tulip/21142.c 2005-03-04 12:03:17 -08:00 @@ -14,8 +14,8 @@ */ -#include "tulip.h" #include <linux/pci.h> +#include "tulip.h" #include <linux/delay.h> diff -Nru a/drivers/net/tulip/eeprom.c b/drivers/net/tulip/eeprom.c --- a/drivers/net/tulip/eeprom.c 2005-03-04 12:03:17 -08:00 +++ b/drivers/net/tulip/eeprom.c 2005-03-04 12:03:17 -08:00 @@ -14,6 +14,7 @@ */ +#include <linux/pci.h> #include "tulip.h" #include <linux/init.h> #include <asm/unaligned.h> diff -Nru a/drivers/net/tulip/interrupt.c b/drivers/net/tulip/interrupt.c --- a/drivers/net/tulip/interrupt.c 2005-03-04 12:03:17 -08:00 +++ b/drivers/net/tulip/interrupt.c 2005-03-04 12:03:17 -08:00 @@ -14,10 +14,10 @@ */ +#include <linux/pci.h> #include "tulip.h" #include <linux/config.h> #include <linux/etherdevice.h> -#include <linux/pci.h> int tulip_rx_copybreak; diff -Nru a/drivers/net/tulip/media.c b/drivers/net/tulip/media.c --- a/drivers/net/tulip/media.c 2005-03-04 12:03:17 -08:00 +++ b/drivers/net/tulip/media.c 2005-03-04 12:03:17 -08:00 @@ -18,6 +18,7 @@ #include <linux/mii.h> #include <linux/init.h> #include <linux/delay.h> +#include <linux/pci.h> #include "tulip.h" diff -Nru a/drivers/net/tulip/pnic.c b/drivers/net/tulip/pnic.c --- a/drivers/net/tulip/pnic.c 2005-03-04 12:03:17 -08:00 +++ b/drivers/net/tulip/pnic.c 2005-03-04 12:03:17 -08:00 @@ -15,6 +15,7 @@ */ #include <linux/kernel.h> +#include <linux/pci.h> #include "tulip.h" diff -Nru a/drivers/net/tulip/pnic2.c b/drivers/net/tulip/pnic2.c --- a/drivers/net/tulip/pnic2.c 2005-03-04 12:03:17 -08:00 +++ b/drivers/net/tulip/pnic2.c 2005-03-04 12:03:17 -08:00 @@ -76,8 +76,8 @@ -#include "tulip.h" #include <linux/pci.h> +#include "tulip.h" #include <linux/delay.h> diff -Nru a/drivers/net/tulip/timer.c b/drivers/net/tulip/timer.c --- a/drivers/net/tulip/timer.c 2005-03-04 12:03:17 -08:00 +++ b/drivers/net/tulip/timer.c 2005-03-04 12:03:17 -08:00 @@ -14,6 +14,7 @@ */ +#include <linux/pci.h> #include "tulip.h" diff -Nru a/drivers/net/tulip/tulip.h b/drivers/net/tulip/tulip.h --- a/drivers/net/tulip/tulip.h 2005-03-04 12:03:17 -08:00 +++ b/drivers/net/tulip/tulip.h 2005-03-04 12:03:17 -08:00 @@ -146,6 +146,9 @@ TxIntr = 0x01, }; +/* bit mask for CSR5 TX/RX process state */ +#define CSR5_TS 0x00700000 +#define CSR5_RS 0x000e0000 enum tulip_mode_bits { TxThreshold = (1 << 22), @@ -484,9 +487,19 @@ u32 csr6 = inl(ioaddr + CSR6); if (csr6 & RxTx) { + unsigned i=1300/10; outl(csr6 & ~RxTx, ioaddr + CSR6); barrier(); - (void) inl(ioaddr + CSR6); /* mmio sync */ + /* wait until in-flight frame completes. + * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin) + * Typically expect this loop to end in < 50us on 100BT. + */ + while (--i && (inl(ioaddr + CSR5) & (CSR5_TS|CSR5_RS))) + udelay(10); + + if (!i) + printk (KERN_DEBUG "%s: tulip_stop_rxtx() failed\n", + tp->pdev->slot_name); } } diff -Nru a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c --- a/drivers/net/tulip/tulip_core.c 2005-03-04 12:03:17 -08:00 +++ b/drivers/net/tulip/tulip_core.c 2005-03-04 12:03:17 -08:00 @@ -20,8 +20,8 @@ #include <linux/config.h> #include <linux/module.h> -#include "tulip.h" #include <linux/pci.h> +#include "tulip.h" #include <linux/init.h> #include <linux/etherdevice.h> #include <linux/delay.h>