patch-2.2.11 linux/drivers/net/tulip.c
Next file: linux/drivers/net/via-rhine.c
Previous file: linux/drivers/net/syncppp.c
Back to the patch index
Back to the overall index
- Lines: 41
- Date:
Mon Aug 9 12:04:39 1999
- Orig file:
v2.2.10/linux/drivers/net/tulip.c
- Orig date:
Tue Jan 19 13:18:45 1999
diff -u --recursive --new-file v2.2.10/linux/drivers/net/tulip.c linux/drivers/net/tulip.c
@@ -327,6 +327,10 @@
TxFIFOUnderflow=0x20, TxJabber=0x08, TxNoBuf=0x04, TxDied=0x02, TxIntr=0x01,
};
+enum desc_status_bits {
+ DescOwned=0x80000000, RxDescFatalErr=0x8000, RxWholePkt=0x0300,
+};
+
/* The Tulip Rx and Tx buffer descriptors. */
struct tulip_rx_desc {
s32 status;
@@ -2698,8 +2702,8 @@
/* Same setup recently queued, we need not add it. */
} else {
unsigned long flags;
- unsigned int entry;
-
+ unsigned int entry, dummy = 0;
+
save_flags(flags); cli();
entry = tp->cur_tx++ % TX_RING_SIZE;
@@ -2709,7 +2713,8 @@
tp->tx_ring[entry].length =
(entry == TX_RING_SIZE-1) ? 0x02000000 : 0;
tp->tx_ring[entry].buffer1 = 0;
- tp->tx_ring[entry].status = 0x80000000;
+ /* race with chip, set DescOwned later */
+ dummy = entry;
entry = tp->cur_tx++ % TX_RING_SIZE;
}
@@ -2724,6 +2729,8 @@
dev->tbusy = 1;
tp->tx_full = 1;
}
+ if (dummy >= 0)
+ tp->tx_ring[dummy].status = DescOwned;
restore_flags(flags);
/* Trigger an immediate transmit demand. */
outl(0, ioaddr + CSR1);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)