Skip to content

Commit

Permalink
r6040: handle RX fifo full and no descriptor interrupts
Browse files Browse the repository at this point in the history
This patch allows the MAC to handle the RX FIFO full
and no descriptor available interrupts. While we are at it
replace the TX interrupt with its corresponding definition.

Signed-off-by: Florian Fainelli <florian.fainelli@telecomint.eu>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
  • Loading branch information
Florian Fainelli authored and Jeff Garzik committed Jul 22, 2008
1 parent 31718de commit e24ddf3
Showing 1 changed file with 15 additions and 7 deletions.
22 changes: 15 additions & 7 deletions drivers/net/r6040.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,9 @@ MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("RDC R6040 NAPI PCI FastEthernet driver");

/* RX and TX interrupts that we handle */
#define RX_INT (RX_FINISH)
#define TX_INT (TX_FINISH)
#define INT_MASK (RX_INT | TX_INT)
#define RX_INTS (RX_FIFO_FULL | RX_NO_DESC | RX_FINISH)
#define TX_INTS (TX_FINISH)
#define INT_MASK (RX_INTS | TX_INTS)

struct r6040_descriptor {
u16 status, len; /* 0-3 */
Expand Down Expand Up @@ -671,7 +671,7 @@ static int r6040_poll(struct napi_struct *napi, int budget)
if (work_done < budget) {
netif_rx_complete(dev, napi);
/* Enable RX interrupt */
iowrite16(ioread16(ioaddr + MIER) | RX_INT, ioaddr + MIER);
iowrite16(ioread16(ioaddr + MIER) | RX_INTS, ioaddr + MIER);
}
return work_done;
}
Expand All @@ -693,14 +693,22 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)
return IRQ_NONE;

/* RX interrupt request */
if (status & 0x01) {
if (status & RX_INTS) {
if (status & RX_NO_DESC) {
/* RX descriptor unavailable */
dev->stats.rx_dropped++;
dev->stats.rx_missed_errors++;
}
if (status & RX_FIFO_FULL)
dev->stats.rx_fifo_errors++;

/* Mask off RX interrupt */
iowrite16(ioread16(ioaddr + MIER) & ~RX_INT, ioaddr + MIER);
iowrite16(ioread16(ioaddr + MIER) & ~RX_INTS, ioaddr + MIER);
netif_rx_schedule(dev, &lp->napi);
}

/* TX interrupt request */
if (status & 0x10)
if (status & TX_INTS)
r6040_tx(dev);

return IRQ_HANDLED;
Expand Down

0 comments on commit e24ddf3

Please sign in to comment.