aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmilio G. Cota <cota@braap.org>2010-11-12 11:14:47 +0000
committerGreg Kroah-Hartman <gregkh@suse.de>2010-11-16 11:40:15 -0800
commita82ad05ecd9dbd909509a332d3aa5f4ac439a054 (patch)
tree5f2a9234e612e2f50f6c90c19db7177d16f83302
parentb12ef0b1f5d0358bc13cc716155d6e9b5584af48 (diff)
downloadkernel_samsung_smdk4412-a82ad05ecd9dbd909509a332d3aa5f4ac439a054.zip
kernel_samsung_smdk4412-a82ad05ecd9dbd909509a332d3aa5f4ac439a054.tar.gz
kernel_samsung_smdk4412-a82ad05ecd9dbd909509a332d3aa5f4ac439a054.tar.bz2
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>
-rw-r--r--drivers/staging/vme/bridges/Module.symvers0
-rw-r--r--drivers/staging/vme/bridges/vme_tsi148.c11
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);