]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] tulip: make tulip_stop_rxtx() wait for DMA to fully stop
authorAndrew Morton <akpm@osdl.org>
Wed, 24 Nov 2004 09:58:03 +0000 (04:58 -0500)
committerJeff Garzik <jgarzik@pobox.com>
Wed, 24 Nov 2004 09:58:03 +0000 (04:58 -0500)
From: "John W. Linville" <linville@tuxdriver.com>

tulip_stop_rxtx() doesn't wait for DMA to fully stop like the function
call name implies.

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.

Signed-off-by: Grant Grundler <iod00d@hp.com>
Acked-by: Charlie Brett <charlie.brett@hp.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
drivers/net/tulip/21142.c
drivers/net/tulip/eeprom.c
drivers/net/tulip/interrupt.c
drivers/net/tulip/media.c
drivers/net/tulip/pnic.c
drivers/net/tulip/pnic2.c
drivers/net/tulip/timer.c
drivers/net/tulip/tulip.h
drivers/net/tulip/tulip_core.c

index cae60c3fc3015fcb9eb81a5332047c81762d05a3..5db694c4eb020cc6c2ba7164dc5889ed0d34115b 100644 (file)
@@ -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, };
index f7d1bbcdc1a8ee4092e4868f37c120cf34af4735..ac5bf49ff60f6bcd77a385f3755fb4da16527766 100644 (file)
@@ -14,6 +14,7 @@
 
 */
 
+#include <linux/pci.h>
 #include "tulip.h"
 #include <linux/init.h>
 #include <asm/unaligned.h>
index b4587bbb64b8cf9653540ca375e2d05f46ca81d7..7650fd97c3673dbae3ab53c98fabe321aa966dcd 100644 (file)
 
 */
 
+#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;
index 7b3cc34441d29e0e00fa82c5cf05c0dba92d30f0..0b914b46b9a43952abde15b5c409e8ac3f7d3966 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/mii.h>
 #include <linux/init.h>
 #include <linux/delay.h>
+#include <linux/pci.h>
 #include "tulip.h"
 
 
index aa12ca3d16f5da22fcfe349ac8019ed85de5f3df..d9980bde75080b47a01c410ff7efa458e183bb85 100644 (file)
@@ -15,6 +15,7 @@
 */
 
 #include <linux/kernel.h>
+#include <linux/pci.h>
 #include "tulip.h"
 
 
index 88ea9d8118aada968c74cb96ecc9c61516dc8c12..55f4a9a631bc62226b670cdfcbd7bdaced3c931c 100644 (file)
@@ -76,8 +76,8 @@
 
 
 
-#include "tulip.h"
 #include <linux/pci.h>
+#include "tulip.h"
 #include <linux/delay.h>
 
 
index 64a8a1fd032303215a3b325dd5cd0f73f49cadd9..e058a9fbfe884414308b005926e9d81a33e94392 100644 (file)
@@ -14,6 +14,7 @@
 
 */
 
+#include <linux/pci.h>
 #include "tulip.h"
 
 
index 5459b0e32ee3d0e4378531d4723a8014521227ba..6cce2834d6c70cf9031790ba4afe405d7870c256 100644 (file)
@@ -149,6 +149,9 @@ enum status_bits {
        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),
@@ -460,9 +463,19 @@ static inline void tulip_stop_rxtx(struct tulip_private *tp)
        u32 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);
        }
 }
 
index 29707804716bdd7ddcad3ee1bb69ecedc0c04db6..94195e94a0394f214474815ea38d7c2229abf81a 100644 (file)
@@ -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>