The current code will allow an infinite number of frames to be received
during one interrupt. Tested ia32.
--- linux-2.4.27-pre3/drivers/net/ltint.pcnet32.c Fri May 21 12:43:19 2004
+++ linux-2.4.27-pre3/drivers/net/pcnet32.c Sat May 22 13:26:44 2004
@@ -22,8 +22,8 @@
*************************************************************************/
#define DRV_NAME "pcnet32"
-#define DRV_VERSION "1.30"
-#define DRV_RELDATE "05.18.2004"
+#define DRV_VERSION "1.30a"
+#define DRV_RELDATE "05.22.2004"
#define PFX DRV_NAME ": "
static const char *version =
@@ -86,7 +86,7 @@
static struct net_device *pcnet32_dev;
-static int max_interrupt_work = 80;
+static int max_interrupt_work = 2;
static int rx_copybreak = 200;
#define PCNET32_PORT_AUI 0x00
@@ -241,6 +241,7 @@
* forever.
* v1.30 18 May 2004 Don Fry removed timer and Last Transmit Interrupt
* (ltint) as they added complexity and didn't give good throughput.
+ * v1.30a 22 May 2004 Don Fry limit frames received during interrupt.
*/
@@ -1857,6 +1858,7 @@
{
struct pcnet32_private *lp = dev->priv;
int entry = lp->cur_rx & RX_RING_MOD_MASK;
+ int boguscnt = RX_RING_SIZE / 2;
/* If we own the next entry, it's a new packet. Send it up. */
while ((short)le16_to_cpu(lp->rx_ring[entry].status) >= 0) {
@@ -1955,6 +1957,7 @@
wmb(); /* Make sure owner changes after all others are visible */
lp->rx_ring[entry].status |= le16_to_cpu(0x8000);
entry = (++lp->cur_rx) & RX_RING_MOD_MASK;
+ if (--boguscnt <= 0) break; /* don't stay in loop forever */
}
return 0;
--
Don Fry
brazilnut@xxxxxxxxxx
|