|
@@ -1387,39 +1387,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
/* Set lookup ptr. */
|
|
|
list_add_tail(&ioc->list, &ioc_list);
|
|
|
|
|
|
- ioc->pci_irq = -1;
|
|
|
- if (pdev->irq) {
|
|
|
- if (mpt_msi_enable && !pci_enable_msi(pdev))
|
|
|
- printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", ioc->name);
|
|
|
-
|
|
|
- r = request_irq(pdev->irq, mpt_interrupt, SA_SHIRQ, ioc->name, ioc);
|
|
|
-
|
|
|
- if (r < 0) {
|
|
|
-#ifndef __sparc__
|
|
|
- printk(MYIOC_s_ERR_FMT "Unable to allocate interrupt %d!\n",
|
|
|
- ioc->name, pdev->irq);
|
|
|
-#else
|
|
|
- printk(MYIOC_s_ERR_FMT "Unable to allocate interrupt %s!\n",
|
|
|
- ioc->name, __irq_itoa(pdev->irq));
|
|
|
-#endif
|
|
|
- list_del(&ioc->list);
|
|
|
- iounmap(mem);
|
|
|
- kfree(ioc);
|
|
|
- return -EBUSY;
|
|
|
- }
|
|
|
-
|
|
|
- ioc->pci_irq = pdev->irq;
|
|
|
-
|
|
|
- pci_set_master(pdev); /* ?? */
|
|
|
- pci_set_drvdata(pdev, ioc);
|
|
|
-
|
|
|
-#ifndef __sparc__
|
|
|
- dprintk((KERN_INFO MYNAM ": %s installed at interrupt %d\n", ioc->name, pdev->irq));
|
|
|
-#else
|
|
|
- dprintk((KERN_INFO MYNAM ": %s installed at interrupt %s\n", ioc->name, __irq_itoa(pdev->irq)));
|
|
|
-#endif
|
|
|
- }
|
|
|
-
|
|
|
/* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets.
|
|
|
*/
|
|
|
mpt_detect_bound_ports(ioc, pdev);
|
|
@@ -1429,11 +1396,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
printk(KERN_WARNING MYNAM
|
|
|
": WARNING - %s did not initialize properly! (%d)\n",
|
|
|
ioc->name, r);
|
|
|
-
|
|
|
list_del(&ioc->list);
|
|
|
- free_irq(ioc->pci_irq, ioc);
|
|
|
- if (mpt_msi_enable)
|
|
|
- pci_disable_msi(pdev);
|
|
|
if (ioc->alt_ioc)
|
|
|
ioc->alt_ioc->alt_ioc = NULL;
|
|
|
iounmap(mem);
|
|
@@ -1637,6 +1600,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
|
|
int handlers;
|
|
|
int ret = 0;
|
|
|
int reset_alt_ioc_active = 0;
|
|
|
+ int irq_allocated = 0;
|
|
|
|
|
|
printk(KERN_INFO MYNAM ": Initiating %s %s\n",
|
|
|
ioc->name, reason==MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery");
|
|
@@ -1720,6 +1684,48 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Device is reset now. It must have de-asserted the interrupt line
|
|
|
+ * (if it was asserted) and it should be safe to register for the
|
|
|
+ * interrupt now.
|
|
|
+ */
|
|
|
+ if ((ret == 0) && (reason == MPT_HOSTEVENT_IOC_BRINGUP)) {
|
|
|
+ ioc->pci_irq = -1;
|
|
|
+ if (ioc->pcidev->irq) {
|
|
|
+ if (mpt_msi_enable && !pci_enable_msi(ioc->pcidev))
|
|
|
+ printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n",
|
|
|
+ ioc->name);
|
|
|
+ rc = request_irq(ioc->pcidev->irq, mpt_interrupt,
|
|
|
+ SA_SHIRQ, ioc->name, ioc);
|
|
|
+ if (rc < 0) {
|
|
|
+#ifndef __sparc__
|
|
|
+ printk(MYIOC_s_ERR_FMT "Unable to allocate "
|
|
|
+ "interrupt %d!\n", ioc->name,
|
|
|
+ ioc->pcidev->irq);
|
|
|
+#else
|
|
|
+ printk(MYIOC_s_ERR_FMT "Unable to allocate "
|
|
|
+ "interrupt %s!\n", ioc->name,
|
|
|
+ __irq_itoa(ioc->pcidev->irq));
|
|
|
+#endif
|
|
|
+ if (mpt_msi_enable)
|
|
|
+ pci_disable_msi(ioc->pcidev);
|
|
|
+ return -EBUSY;
|
|
|
+ }
|
|
|
+ irq_allocated = 1;
|
|
|
+ ioc->pci_irq = ioc->pcidev->irq;
|
|
|
+ pci_set_master(ioc->pcidev); /* ?? */
|
|
|
+ pci_set_drvdata(ioc->pcidev, ioc);
|
|
|
+#ifndef __sparc__
|
|
|
+ dprintk((KERN_INFO MYNAM ": %s installed at interrupt "
|
|
|
+ "%d\n", ioc->name, ioc->pcidev->irq));
|
|
|
+#else
|
|
|
+ dprintk((KERN_INFO MYNAM ": %s installed at interrupt "
|
|
|
+ "%s\n", ioc->name,
|
|
|
+ __irq_itoa(ioc->pcidev->irq)));
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/* Prime reply & request queues!
|
|
|
* (mucho alloc's) Must be done prior to
|
|
|
* init as upper addresses are needed for init.
|
|
@@ -1819,7 +1825,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
|
|
ret = mptbase_sas_persist_operation(ioc,
|
|
|
MPI_SAS_OP_CLEAR_NOT_PRESENT);
|
|
|
if(ret != 0)
|
|
|
- return -1;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
/* Find IM volumes
|
|
@@ -1900,6 +1906,12 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
|
|
/* FIXME? Examine results here? */
|
|
|
}
|
|
|
|
|
|
+out:
|
|
|
+ if ((ret != 0) && irq_allocated) {
|
|
|
+ free_irq(ioc->pci_irq, ioc);
|
|
|
+ if (mpt_msi_enable)
|
|
|
+ pci_disable_msi(ioc->pcidev);
|
|
|
+ }
|
|
|
return ret;
|
|
|
}
|
|
|
|