Messages in this thread Patch in this message | | | Date | Thu, 26 Jun 1997 18:24:50 +0100 (BST) | From | Mark Hemment <> | Subject | EtherExpress 16 stall fix |
| |
Hi,
I had to swap my network card for an EtherExpress16, and noticed than when I was ftp'ing _into_ my box (from a local machine) the transfer would stall. The ftp was the only network traffic.
It appears that the networking layer calls the driver's xmit function when 'tbusy' is set. For the eexpress, this caused the cards interrupts to be disabled, but not immediately re-enabled. Hence the stall.
The attached patch (against 2.1.43) solves the problem. Please note, the "udelay(50)" appears necessary on my box or else I get some (not many) tx-interrupts with no status. (Infact, I still do get some under heavy transmit, but no longer for receive).
Could anyone with this card, confirm they see this problem and the patch fixes it. Thanks.
Regards,
markhe
PS: I couldn't find any doc on the i82586 online. Does anyone have any references?
----------------------------------------------------- Mark Hemment UNIX/C Software Engineer (contractor) "Success has many fathers. Failure is a b**tard" ----------------------------------------------------- --- linux/drivers/net/eexpress.c Thu Jun 26 15:28:45 1997 +++ linux-new/drivers/net/eexpress.c Thu Jun 26 17:46:51 1997 @@ -510,10 +510,17 @@ * is calling us anyway. Check that nothing bad is happening. */ if (dev->tbusy) { - int status = scb_status(dev); + int status; unstick_cu(dev); - if ((jiffies - lp->last_tx) < HZ) + if ((jiffies - lp->last_tx) < HZ) { + /* Without a short delay, the card (well, mine) issues a + * tx intr with no status. + */ + udelay(50); + outb(SIRQ_en|irqrmap[dev->irq],dev->base_addr+SET_IRQ); return 1; + } + status = scb_status(dev); printk(KERN_INFO "%s: transmit timed out, %s?", dev->name, (SCB_complete(status)?"lost interrupt": "board on fire"));
| |