tulip: make tulip_stop_rxtx() wait for DMA to fully stop
Subsystems (2)
PATCH 1/1 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]>
---
This was submitted through my employer -- I am not the original author of this patch. However, I passed it by Jeff Garizk and he expressed interest in having it upstream.
drivers/net/tulip/21142.c | 2 +- drivers/net/tulip/eeprom.c | 1 + drivers/net/tulip/interrupt.c | 2 +- drivers/net/tulip/media.c | 1 + drivers/net/tulip/pnic.c | 1 + drivers/net/tulip/pnic2.c | 2 +- drivers/net/tulip/timer.c | 1 + drivers/net/tulip/tulip.h | 15 ++++++++++++++- drivers/net/tulip/tulip_core.c | 2 +- 9 files changed, 22 insertions(+), 5 deletions(-)
drivers/net/tulip/tulip_core.c renamed from drivers/net/tulip/tulip_core.c.orig +1 -1
@@ -26,8 +26,8 @@#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>
drivers/net/tulip/media.c renamed from drivers/net/tulip/media.c.orig +1 -0
@@ -18,6 +18,7 @@#include <linux/mii.h> #include <linux/init.h> #include <linux/delay.h> +#include <linux/pci.h> #include "tulip.h"
drivers/net/tulip/21142.c renamed from drivers/net/tulip/21142.c.orig +1 -1
@@ -14,9 +14,9 @@*/ -#include "tulip.h" #include <linux/pci.h> #include <linux/delay.h> +#include "tulip.h" static u16 t21142_csr13[] = {0x0001 ,0x0009 ,0x0009 ,0x0000 ,0x0001 , };
drivers/net/tulip/timer.c renamed from drivers/net/tulip/timer.c.orig +1 -0
@@ -14,6 +14,7 @@*/ +#include <linux/pci.h> #include "tulip.h"
drivers/net/tulip/tulip.h renamed from drivers/net/tulip/tulip.h.orig +14 -1
@@ -149,6 +149,9 @@ enum status_bits { TxIntr = 0x01, }; +/* bit mask for CSR5 TX/RX process state */ +#define CSR5_TS 0x00700000 +#define CSR5_RS 0x000e0000enum tulip_mode_bits { TxThreshold = (1 <<22 ),
@@ -460,9 +463,19 @@ static inline void tulip_stop_rxtx(strucu32 csr6 =ioread32 (ioaddr +CSR6 );if (csr6 & RxTx) { +unsigned i=1300 /10 ;iowrite32 (csr6 & ~RxTx, ioaddr +CSR6 );barrier (); - (void )ioread32 (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 < 50 us on 100BT. +*/ +while (--i && (ioread32 (ioaddr +CSR5 ) & (CSR5_TS |CSR5_RS ))) +udelay (10 ); + +if (!i) +printk (KERN_DEBUG "%s: tulip_stop_rxtx() failed\n" , + tp->pdev->slot_name); } }
drivers/net/tulip/pnic.c renamed from drivers/net/tulip/pnic.c.orig +1 -0
@@ -15,6 +15,7 @@*/ #include <linux/kernel.h> +#include <linux/pci.h> #include "tulip.h"
drivers/net/tulip/pnic2.c renamed from drivers/net/tulip/pnic2.c.orig +1 -1
@@ -76,8 +76,8 @@ -#include "tulip.h" #include <linux/pci.h> +#include "tulip.h" #include <linux/delay.h>
drivers/net/tulip/eeprom.c renamed from drivers/net/tulip/eeprom.c.orig +1 -0
@@ -14,6 +14,7 @@*/ +#include <linux/pci.h> #include "tulip.h" #include <linux/init.h> #include <asm/unaligned.h>
drivers/net/tulip/interrupt.c renamed from drivers/net/tulip/interrupt.c.orig +1 -1
@@ -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;unsigned int tulip_max_interrupt_work;
Quoted 4 lines · John W. Linville
tulip_stop_rxtx()doesn't wait for DMA to fully stop like the function call name implies.Acked-by Grant Grundler <[email protected]>
John,
I can provide a proper:
Signed-off-by Grant Grundler <[email protected]>
ditto for the 2.4.28 version of the patch.
Quoted 3 lines
This was submitted through my employer -- I am not the original author of this patch. However, I passed it by Jeff Garizk and he expressed interest in having it upstream.
Excellent!
thanks,
grant