|
@@ -842,7 +842,7 @@ static inline int de_is_running (struct de_private *de)
|
|
|
static void de_stop_rxtx (struct de_private *de)
|
|
|
{
|
|
|
u32 macmode;
|
|
|
- unsigned int work = 1000;
|
|
|
+ unsigned int i = 1300/100;
|
|
|
|
|
|
macmode = dr32(MacMode);
|
|
|
if (macmode & RxTx) {
|
|
@@ -850,10 +850,14 @@ static void de_stop_rxtx (struct de_private *de)
|
|
|
dr32(MacMode);
|
|
|
}
|
|
|
|
|
|
- while (--work > 0) {
|
|
|
+ /* 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) {
|
|
|
if (!de_is_running(de))
|
|
|
return;
|
|
|
- cpu_relax();
|
|
|
+ udelay(100);
|
|
|
}
|
|
|
|
|
|
printk(KERN_WARNING "%s: timeout expired stopping DMA\n", de->dev->name);
|