diff options
author | Emilio G. Cota <cota@braap.org> | 2010-11-12 11:14:47 (GMT) |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-11-16 19:40:15 (GMT) |
commit | a82ad05ecd9dbd909509a332d3aa5f4ac439a054 (patch) | |
tree | 5f2a9234e612e2f50f6c90c19db7177d16f83302 /drivers/staging/vme | |
parent | b12ef0b1f5d0358bc13cc716155d6e9b5584af48 (diff) | |
download | linux-a82ad05ecd9dbd909509a332d3aa5f4ac439a054.tar.xz |
staging: vme: tsi148: fix warning in free_irq
The cookie passed to request_irq isn't the same as the one passed
to free_irq, which results in the following warning:
[ 63.243533] WARNING: at kernel/irq/manage.c:899 __free_irq+0x9b/0x17d()
[ 63.243533] Hardware name:
[ 63.243533] Trying to free already-free IRQ 17
[ 63.243533] Modules linked in: vme_tsi148(-) vme e1000e iTCO_wdt iTCO_vendor_support [last unloaded: scsi_wait_scan]
[ 63.243533] Pid: 2013, comm: rmmod Not tainted 2.6.35 #2
[ 63.243533] Call Trace:
[ 63.243533] [<ffffffff81036ea3>] warn_slowpath_common+0x80/0x98
[ 63.243533] [<ffffffff81036f4f>] warn_slowpath_fmt+0x41/0x43
[ 63.243533] [<ffffffff810678c4>] __free_irq+0x9b/0x17d
[ 63.243533] [<ffffffff810679d9>] free_irq+0x33/0x4e
[ 63.243533] [<ffffffffa004a897>] tsi148_irq_exit+0x6b/0x70 [vme_tsi148]
[...]
[ 63.243533] ---[ end trace bbf92311d969efb4 ]---
Fix it by passing the same cookie to both functions.
Signed-off-by: Emilio G. Cota <cota@braap.org>
[martyn.welch@ge.com: modified to remove checkpatch warnings]
Signed-off-by: Martyn Welch <martyn.welch@ge.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/vme')
-rw-r--r-- | drivers/staging/vme/bridges/Module.symvers | 0 | ||||
-rw-r--r-- | drivers/staging/vme/bridges/vme_tsi148.c | 11 |
2 files changed, 7 insertions, 4 deletions
diff --git a/drivers/staging/vme/bridges/Module.symvers b/drivers/staging/vme/bridges/Module.symvers new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/drivers/staging/vme/bridges/Module.symvers diff --git a/drivers/staging/vme/bridges/vme_tsi148.c b/drivers/staging/vme/bridges/vme_tsi148.c index 2f8f399..70c9e41 100644 --- a/drivers/staging/vme/bridges/vme_tsi148.c +++ b/drivers/staging/vme/bridges/vme_tsi148.c @@ -374,8 +374,11 @@ static int tsi148_irq_init(struct vme_bridge *tsi148_bridge) return 0; } -static void tsi148_irq_exit(struct tsi148_driver *bridge, struct pci_dev *pdev) +static void tsi148_irq_exit(struct vme_bridge *tsi148_bridge, + struct pci_dev *pdev) { + struct tsi148_driver *bridge = tsi148_bridge->driver_priv; + /* Turn off interrupts */ iowrite32be(0x0, bridge->base + TSI148_LCSR_INTEO); iowrite32be(0x0, bridge->base + TSI148_LCSR_INTEN); @@ -384,7 +387,7 @@ static void tsi148_irq_exit(struct tsi148_driver *bridge, struct pci_dev *pdev) iowrite32be(0xFFFFFFFF, bridge->base + TSI148_LCSR_INTC); /* Detach interrupt handler */ - free_irq(pdev->irq, pdev); + free_irq(pdev->irq, tsi148_bridge); } /* @@ -2511,7 +2514,7 @@ err_master: kfree(master_image); } - tsi148_irq_exit(tsi148_device, pdev); + tsi148_irq_exit(tsi148_bridge, pdev); err_irq: err_test: iounmap(tsi148_device->base); @@ -2583,7 +2586,7 @@ static void tsi148_remove(struct pci_dev *pdev) iowrite32be(0x0, bridge->base + TSI148_LCSR_INTM1); iowrite32be(0x0, bridge->base + TSI148_LCSR_INTM2); - tsi148_irq_exit(bridge, pdev); + tsi148_irq_exit(tsi148_bridge, pdev); vme_unregister_bridge(tsi148_bridge); |