--- /dev/null
+From: Hannes Reinecke <hare@suse.de>
+Date: Wed, 25 Mar 2009 11:18:16 +0100
+Subject: aic7xxx leaves timer running on init failure
+References: bnc#469576
+
+aic79xx leaves timers inserted when ahd_init() (which inserts
+two timers at its very end) succeeds but ahd_pci_map_int()
+fails. In this case ahd->init_level gets incremented to 5 only
+when that function succeeds, but ahd_free() calls ahd_shutdown()
+only when ahd->init_level == 5, and ahd_shutdown() is where the
+timers get removed. Since the freeing of the IRQ is not controlled
+by ahd->init_level, we should increment init_level prior to
+calling ahd_pci_map_int().
+
+Reported-by: Jan Beulich <jbeulich@novell.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/aic7xxx/aic79xx_pci.c | 6 ++----
+ drivers/scsi/aic7xxx/aic7xxx_pci.c | 8 ++------
+ 2 files changed, 4 insertions(+), 10 deletions(-)
+
+--- a/drivers/scsi/aic7xxx/aic79xx_pci.c
++++ b/drivers/scsi/aic7xxx/aic79xx_pci.c
+@@ -379,14 +379,12 @@ ahd_pci_config(struct ahd_softc *ahd, co
+ error = ahd_init(ahd);
+ if (error != 0)
+ return (error);
++ ahd->init_level++;
+
+ /*
+ * Allow interrupts now that we are completely setup.
+ */
+- error = ahd_pci_map_int(ahd);
+- if (!error)
+- ahd->init_level++;
+- return error;
++ return ahd_pci_map_int(ahd);
+ }
+
+ #ifdef CONFIG_PM
+--- a/drivers/scsi/aic7xxx/aic7xxx_pci.c
++++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c
+@@ -960,16 +960,12 @@ ahc_pci_config(struct ahc_softc *ahc, co
+ error = ahc_init(ahc);
+ if (error != 0)
+ return (error);
++ ahc->init_level++;
+
+ /*
+ * Allow interrupts now that we are completely setup.
+ */
+- error = ahc_pci_map_int(ahc);
+- if (error != 0)
+- return (error);
+-
+- ahc->init_level++;
+- return (0);
++ return ahc_pci_map_int(ahc);
+ }
+
+ /*