Re: [PATCH 2/3] pcmcia: Handle request_irq() failure while opening device

From: Dmitriy Monakhov
Date: Mon Feb 26 2007 - 13:08:41 EST


Monakhov Dmitriy <dmonakhov@xxxxxxxxxx> writes:

> Signed-off-by: Monakhov Dmitriy <dmonakhov@xxxxxxxxxx>
> ---
> drivers/net/pcmcia/axnet_cs.c | 8 +++++++-
> drivers/net/pcmcia/pcnet_cs.c | 8 +++++++-
> 2 files changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c
> index 6139048..9b57bab 100644
> --- a/drivers/net/pcmcia/axnet_cs.c
> +++ b/drivers/net/pcmcia/axnet_cs.c
> @@ -523,6 +523,7 @@ static int axnet_open(struct net_device *dev)
> {
> axnet_dev_t *info = PRIV(dev);
> struct pcmcia_device *link = info->p_dev;
> + int err = 0;
>
> DEBUG(2, "axnet_open('%s')\n", dev->name);
>
> @@ -531,7 +532,12 @@ static int axnet_open(struct net_device *dev)
>
> link->open++;
>
> - request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev);
> + err = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev);
> + if (err) {
> + printk("axnet_cs: request_irq() failed %s\n", dev->name);
> + link->open--;
> + return -EBUSY;
As David Miller noted it is better to return exact error code from request_irq(),
truly most net_device->open() functions return error code without changing.
The updated patch version following:

Signed-off-by: Monakhov Dmitriy <dmonakhov@xxxxxxxxxx>
---
drivers/net/pcmcia/axnet_cs.c | 8 +++++++-
drivers/net/pcmcia/pcnet_cs.c | 8 +++++++-
2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c
index 6139048..9b57bab 100644
--- a/drivers/net/pcmcia/axnet_cs.c
+++ b/drivers/net/pcmcia/axnet_cs.c
@@ -523,6 +523,7 @@ static int axnet_open(struct net_device *dev)
{
axnet_dev_t *info = PRIV(dev);
struct pcmcia_device *link = info->p_dev;
+ int err = 0;

DEBUG(2, "axnet_open('%s')\n", dev->name);

@@ -531,7 +532,12 @@ static int axnet_open(struct net_device *dev)

link->open++;

- request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev);
+ err = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev);
+ if (err) {
+ printk("axnet_cs: request_irq() failed %s\n", dev->name);
+ link->open--;
+ return err;
+ }

info->link_status = 0x00;
init_timer(&info->watchdog);
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c
index d88e9b2..13923ea 100644
--- a/drivers/net/pcmcia/pcnet_cs.c
+++ b/drivers/net/pcmcia/pcnet_cs.c
@@ -962,6 +962,7 @@ static int pcnet_open(struct net_device *dev)
{
pcnet_dev_t *info = PRIV(dev);
struct pcmcia_device *link = info->p_dev;
+ int err = 0;

DEBUG(2, "pcnet_open('%s')\n", dev->name);

@@ -971,7 +972,12 @@ static int pcnet_open(struct net_device *dev)
link->open++;

set_misc_reg(dev);
- request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev);
+ err = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev);
+ if (err) {
+ printk("pcnet_open: request_irq() failed %s\n", dev->name);
+ link->open--;
+ return err;
+ }

info->phy_id = info->eth_phy;
info->link_status = 0x00;
--
1.5.0.1

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