irqreturn_t for drivers/net/pcmcia

Zwane Mwaikambo (zwane@linuxpower.ca)
Sun, 4 May 2003 10:04:10 -0400 (EDT)


Only the smc91c92 has been tested. The patch is against current BK/CVS

Index: linux-2.5/drivers/net/pcmcia/3c589_cs.c
===================================================================
RCS file: /home/cvs/linux-2.5/drivers/net/pcmcia/3c589_cs.c,v
retrieving revision 1.17
diff -u -p -B -r1.17 3c589_cs.c
--- linux-2.5/drivers/net/pcmcia/3c589_cs.c 29 Apr 2003 22:46:23 -0000 1.17
+++ linux-2.5/drivers/net/pcmcia/3c589_cs.c 4 May 2003 13:09:58 -0000
@@ -159,7 +159,7 @@ static void media_check(unsigned long ar
static int el3_config(struct net_device *dev, struct ifmap *map);
static int el3_open(struct net_device *dev);
static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev);
-static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t el3_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static void update_stats(struct net_device *dev);
static struct net_device_stats *el3_get_stats(struct net_device *dev);
static int el3_rx(struct net_device *dev);
@@ -816,15 +816,16 @@ static int el3_start_xmit(struct sk_buff
}

/* The EL3 interrupt handler. */
-static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t el3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
struct el3_private *lp = dev_id;
struct net_device *dev = &lp->dev;
ioaddr_t ioaddr, status;
- int i = 0;
+ int i = 0, handled = 1;

if (!netif_device_present(dev))
- return;
+ return IRQ_NONE;
+
ioaddr = dev->base_addr;

DEBUG(3, "%s: interrupt, status %4.4x.\n",
@@ -833,9 +834,9 @@ static void el3_interrupt(int irq, void
spin_lock(&lp->lock);
while ((status = inw(ioaddr + EL3_STATUS)) &
(IntLatch | RxComplete | StatsFull)) {
- if (!netif_device_present(dev) ||
- ((status & 0xe000) != 0x2000)) {
+ if ((status & 0xe000) != 0x2000) {
DEBUG(1, "%s: interrupt from dead card\n", dev->name);
+ handled = 0;
break;
}

@@ -897,7 +898,7 @@ static void el3_interrupt(int irq, void
spin_unlock(&lp->lock);
DEBUG(3, "%s: exiting interrupt, status %4.4x.\n",
dev->name, inw(ioaddr + EL3_STATUS));
- return;
+ return IRQ_RETVAL(handled);
}

static void media_check(unsigned long arg)
Index: linux-2.5/drivers/net/pcmcia/fmvj18x_cs.c
===================================================================
RCS file: /home/cvs/linux-2.5/drivers/net/pcmcia/fmvj18x_cs.c,v
retrieving revision 1.20
diff -u -p -B -r1.20 fmvj18x_cs.c
--- linux-2.5/drivers/net/pcmcia/fmvj18x_cs.c 29 Apr 2003 22:46:23 -0000 1.20
+++ linux-2.5/drivers/net/pcmcia/fmvj18x_cs.c 4 May 2003 13:09:59 -0000
@@ -107,7 +107,7 @@ static int fjn_config(struct net_device
static int fjn_open(struct net_device *dev);
static int fjn_close(struct net_device *dev);
static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev);
-static void fjn_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t fjn_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static void fjn_rx(struct net_device *dev);
static void fjn_reset(struct net_device *dev);
static struct net_device_stats *fjn_get_stats(struct net_device *dev);
@@ -845,7 +845,7 @@ module_exit(exit_fmvj18x_cs);

/*====================================================================*/

-static void fjn_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t fjn_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
local_info_t *lp = dev_id;
struct net_device *dev = &lp->dev;
@@ -855,7 +855,7 @@ static void fjn_interrupt(int irq, void
if (lp == NULL) {
printk(KERN_NOTICE "fjn_interrupt(): irq %d for "
"unknown device.\n", irq);
- return;
+ return IRQ_NONE;
}
ioaddr = dev->base_addr;

@@ -899,6 +899,7 @@ static void fjn_interrupt(int irq, void

outb(D_TX_INTR, ioaddr + TX_INTR);
outb(D_RX_INTR, ioaddr + RX_INTR);
+ return IRQ_HANDLED;

} /* fjn_interrupt */

Index: linux-2.5/drivers/net/pcmcia/ibmtr_cs.c
===================================================================
RCS file: /home/cvs/linux-2.5/drivers/net/pcmcia/ibmtr_cs.c,v
retrieving revision 1.13
diff -u -p -B -r1.13 ibmtr_cs.c
--- linux-2.5/drivers/net/pcmcia/ibmtr_cs.c 29 Apr 2003 22:46:23 -0000 1.13
+++ linux-2.5/drivers/net/pcmcia/ibmtr_cs.c 4 May 2003 13:09:59 -0000
@@ -127,7 +127,7 @@ static dev_link_t *dev_list;

extern int ibmtr_probe(struct net_device *dev);
extern int trdev_init(struct net_device *dev);
-extern void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs);
+extern irqreturn_t tok_interrupt (int irq, void *dev_id, struct pt_regs *regs);

/*====================================================================*/

Index: linux-2.5/drivers/net/pcmcia/nmclan_cs.c
===================================================================
RCS file: /home/cvs/linux-2.5/drivers/net/pcmcia/nmclan_cs.c,v
retrieving revision 1.14
diff -u -p -B -r1.14 nmclan_cs.c
--- linux-2.5/drivers/net/pcmcia/nmclan_cs.c 29 Apr 2003 22:46:23 -0000 1.14
+++ linux-2.5/drivers/net/pcmcia/nmclan_cs.c 4 May 2003 13:10:00 -0000
@@ -431,7 +431,7 @@ static int mace_open(struct net_device *
static int mace_close(struct net_device *dev);
static int mace_start_xmit(struct sk_buff *skb, struct net_device *dev);
static void mace_tx_timeout(struct net_device *dev);
-static void mace_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t mace_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static struct net_device_stats *mace_get_stats(struct net_device *dev);
static int mace_rx(struct net_device *dev, unsigned char RxCnt);
static void restore_multicast_list(struct net_device *dev);
@@ -1143,7 +1143,7 @@ static int mace_start_xmit(struct sk_buf
mace_interrupt
The interrupt handler.
---------------------------------------------------------------------------- */
-static void mace_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t mace_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
mace_private *lp = (mace_private *)dev_id;
struct net_device *dev = &lp->dev;
@@ -1154,7 +1154,7 @@ static void mace_interrupt(int irq, void
if (dev == NULL) {
DEBUG(2, "mace_interrupt(): irq 0x%X for unknown device.\n",
irq);
- return;
+ return IRQ_NONE;
}

if (lp->tx_irq_disabled) {
@@ -1169,12 +1169,12 @@ static void mace_interrupt(int irq, void
inb(ioaddr + AM2150_MACE_BASE + MACE_IMR)
);
/* WARNING: MACE_IR has been read! */
- return;
+ return IRQ_NONE;
}

if (!netif_device_present(dev)) {
DEBUG(2, "%s: interrupt from dead card\n", dev->name);
- goto exception;
+ return IRQ_NONE;
}

do {
@@ -1279,8 +1279,7 @@ static void mace_interrupt(int irq, void

} while ((status & ~MACE_IMR_DEFAULT) && (--IntrCnt));

-exception:
- return;
+ return IRQ_HANDLED;
} /* mace_interrupt */

/* ----------------------------------------------------------------------------
Index: linux-2.5/drivers/net/pcmcia/smc91c92_cs.c
===================================================================
RCS file: /home/cvs/linux-2.5/drivers/net/pcmcia/smc91c92_cs.c,v
retrieving revision 1.18
diff -u -p -B -r1.18 smc91c92_cs.c
--- linux-2.5/drivers/net/pcmcia/smc91c92_cs.c 29 Apr 2003 22:46:23 -0000 1.18
+++ linux-2.5/drivers/net/pcmcia/smc91c92_cs.c 4 May 2003 13:10:02 -0000
@@ -293,7 +293,7 @@ static int smc_close(struct net_device *
static int smc_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
static void smc_tx_timeout(struct net_device *dev);
static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev);
-static void smc_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static void smc_rx(struct net_device *dev);
static struct net_device_stats *smc_get_stats(struct net_device *dev);
static void set_rx_mode(struct net_device *dev);
@@ -1574,16 +1574,18 @@ static void smc_eph_irq(struct net_devic

/*====================================================================*/

-static void smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
struct smc_private *smc = dev_id;
struct net_device *dev = &smc->dev;
ioaddr_t ioaddr;
u_short saved_bank, saved_pointer, mask, status;
+ unsigned int handled = 1;
char bogus_cnt = INTR_WORK; /* Work we are willing to do. */

if (!netif_device_present(dev))
- return;
+ return IRQ_NONE;
+
ioaddr = dev->base_addr;

DEBUG(3, "%s: SMC91c92 interrupt %d at %#x.\n", dev->name,
@@ -1596,6 +1598,7 @@ static void smc_interrupt(int irq, void
maybe it has been ejected. */
DEBUG(1, "%s: SMC91c92 interrupt %d for non-existent"
"/ejected device.\n", dev->name, irq);
+ handled = 0;
goto irq_done;
}

@@ -1609,9 +1612,11 @@ static void smc_interrupt(int irq, void
status = inw(ioaddr + INTERRUPT) & 0xff;
DEBUG(3, "%s: Status is %#2.2x (mask %#2.2x).\n", dev->name,
status, mask);
- if ((status & mask) == 0)
+ if ((status & mask) == 0) {
+ if (bogus_cnt == INTR_WORK)
+ handled = 0;
break;
-
+ }
if (status & IM_RCV_INT) {
/* Got a packet(s). */
smc_rx(dev);
@@ -1683,6 +1688,7 @@ irq_done:
readb(smc->base+MEGAHERTZ_ISR);
}
#endif
+ return IRQ_RETVAL(handled);
}

/*====================================================================*/
Index: linux-2.5/drivers/net/pcmcia/xirc2ps_cs.c
===================================================================
RCS file: /home/cvs/linux-2.5/drivers/net/pcmcia/xirc2ps_cs.c,v
retrieving revision 1.18
diff -u -p -B -r1.18 xirc2ps_cs.c
--- linux-2.5/drivers/net/pcmcia/xirc2ps_cs.c 29 Apr 2003 22:46:23 -0000 1.18
+++ linux-2.5/drivers/net/pcmcia/xirc2ps_cs.c 4 May 2003 13:10:02 -0000
@@ -317,7 +317,7 @@ static void xirc2ps_detach(dev_link_t *)
* less on other parts of the kernel.
*/

-static void xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs);

/*
* The dev_info variable is the "key" that is used to match up this
@@ -1296,7 +1296,7 @@ xirc2ps_event(event_t event, int priorit
/****************
* This is the Interrupt service route.
*/
-static void
+static irqreturn_t
xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
struct net_device *dev = (struct net_device *)dev_id;
@@ -1305,14 +1305,14 @@ xirc2ps_interrupt(int irq, void *dev_id,
u_char saved_page;
unsigned bytes_rcvd;
unsigned int_status, eth_status, rx_status, tx_status;
- unsigned rsr, pktlen;
+ unsigned rsr, pktlen, handled = 1;
ulong start_ticks = jiffies; /* fixme: jiffies rollover every 497 days
* is this something to worry about?
* -- on a laptop?
*/

if (!netif_device_present(dev))
- return;
+ return IRQ_NONE;

ioaddr = dev->base_addr;
if (lp->mohawk) { /* must disable the interrupt */
@@ -1330,6 +1330,7 @@ xirc2ps_interrupt(int irq, void *dev_id,
loop_entry:
if (int_status == 0xff) { /* card may be ejected */
DEBUG(3, "%s: interrupt %d for dead card\n", dev->name, irq);
+ handled = 0;
goto leave;
}
eth_status = GetByte(XIRCREG_ESR);
@@ -1514,6 +1515,7 @@ xirc2ps_interrupt(int irq, void *dev_id,
* force an interrupt with this command:
* PutByte(XIRCREG_CR, EnableIntr|ForceIntr);
*/
+ return IRQ_RETVAL(handled);
} /* xirc2ps_interrupt */

/*====================================================================*/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/