From a82ad05ecd9dbd909509a332d3aa5f4ac439a054 Mon Sep 17 00:00:00 2001 From: "Emilio G. Cota" Date: Fri, 12 Nov 2010 11:14:47 +0000 Subject: [PATCH] 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] [] warn_slowpath_common+0x80/0x98 [ 63.243533] [] warn_slowpath_fmt+0x41/0x43 [ 63.243533] [] __free_irq+0x9b/0x17d [ 63.243533] [] free_irq+0x33/0x4e [ 63.243533] [] 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 [martyn.welch@ge.com: modified to remove checkpatch warnings] Signed-off-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman --- drivers/staging/vme/bridges/Module.symvers | 0 drivers/staging/vme/bridges/vme_tsi148.c | 11 +++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 drivers/staging/vme/bridges/Module.symvers diff --git a/drivers/staging/vme/bridges/Module.symvers b/drivers/staging/vme/bridges/Module.symvers new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/drivers/staging/vme/bridges/vme_tsi148.c b/drivers/staging/vme/bridges/vme_tsi148.c index 2f8f399df85b..70c9e41154e7 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); -- 2.34.1