diff options
| -rw-r--r-- | drivers/message/fusion/mptbase.c | 88 |
1 files changed, 50 insertions, 38 deletions
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 266414ca2814..bb7ad4d0678a 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
| @@ -1387,39 +1387,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1387 | /* Set lookup ptr. */ | 1387 | /* Set lookup ptr. */ |
| 1388 | list_add_tail(&ioc->list, &ioc_list); | 1388 | list_add_tail(&ioc->list, &ioc_list); |
| 1389 | 1389 | ||
| 1390 | ioc->pci_irq = -1; | ||
| 1391 | if (pdev->irq) { | ||
| 1392 | if (mpt_msi_enable && !pci_enable_msi(pdev)) | ||
| 1393 | printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", ioc->name); | ||
| 1394 | |||
| 1395 | r = request_irq(pdev->irq, mpt_interrupt, SA_SHIRQ, ioc->name, ioc); | ||
| 1396 | |||
| 1397 | if (r < 0) { | ||
| 1398 | #ifndef __sparc__ | ||
| 1399 | printk(MYIOC_s_ERR_FMT "Unable to allocate interrupt %d!\n", | ||
| 1400 | ioc->name, pdev->irq); | ||
| 1401 | #else | ||
| 1402 | printk(MYIOC_s_ERR_FMT "Unable to allocate interrupt %s!\n", | ||
| 1403 | ioc->name, __irq_itoa(pdev->irq)); | ||
| 1404 | #endif | ||
| 1405 | list_del(&ioc->list); | ||
| 1406 | iounmap(mem); | ||
| 1407 | kfree(ioc); | ||
| 1408 | return -EBUSY; | ||
| 1409 | } | ||
| 1410 | |||
| 1411 | ioc->pci_irq = pdev->irq; | ||
| 1412 | |||
| 1413 | pci_set_master(pdev); /* ?? */ | ||
| 1414 | pci_set_drvdata(pdev, ioc); | ||
| 1415 | |||
| 1416 | #ifndef __sparc__ | ||
| 1417 | dprintk((KERN_INFO MYNAM ": %s installed at interrupt %d\n", ioc->name, pdev->irq)); | ||
| 1418 | #else | ||
| 1419 | dprintk((KERN_INFO MYNAM ": %s installed at interrupt %s\n", ioc->name, __irq_itoa(pdev->irq))); | ||
| 1420 | #endif | ||
| 1421 | } | ||
| 1422 | |||
| 1423 | /* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets. | 1390 | /* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets. |
| 1424 | */ | 1391 | */ |
| 1425 | mpt_detect_bound_ports(ioc, pdev); | 1392 | mpt_detect_bound_ports(ioc, pdev); |
| @@ -1429,11 +1396,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1429 | printk(KERN_WARNING MYNAM | 1396 | printk(KERN_WARNING MYNAM |
| 1430 | ": WARNING - %s did not initialize properly! (%d)\n", | 1397 | ": WARNING - %s did not initialize properly! (%d)\n", |
| 1431 | ioc->name, r); | 1398 | ioc->name, r); |
| 1432 | |||
| 1433 | list_del(&ioc->list); | 1399 | list_del(&ioc->list); |
| 1434 | free_irq(ioc->pci_irq, ioc); | ||
| 1435 | if (mpt_msi_enable) | ||
| 1436 | pci_disable_msi(pdev); | ||
| 1437 | if (ioc->alt_ioc) | 1400 | if (ioc->alt_ioc) |
| 1438 | ioc->alt_ioc->alt_ioc = NULL; | 1401 | ioc->alt_ioc->alt_ioc = NULL; |
| 1439 | iounmap(mem); | 1402 | iounmap(mem); |
| @@ -1637,6 +1600,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 1637 | int handlers; | 1600 | int handlers; |
| 1638 | int ret = 0; | 1601 | int ret = 0; |
| 1639 | int reset_alt_ioc_active = 0; | 1602 | int reset_alt_ioc_active = 0; |
| 1603 | int irq_allocated = 0; | ||
| 1640 | 1604 | ||
| 1641 | printk(KERN_INFO MYNAM ": Initiating %s %s\n", | 1605 | printk(KERN_INFO MYNAM ": Initiating %s %s\n", |
| 1642 | ioc->name, reason==MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery"); | 1606 | ioc->name, reason==MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery"); |
| @@ -1720,6 +1684,48 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 1720 | } | 1684 | } |
| 1721 | } | 1685 | } |
| 1722 | 1686 | ||
| 1687 | /* | ||
| 1688 | * Device is reset now. It must have de-asserted the interrupt line | ||
| 1689 | * (if it was asserted) and it should be safe to register for the | ||
| 1690 | * interrupt now. | ||
| 1691 | */ | ||
| 1692 | if ((ret == 0) && (reason == MPT_HOSTEVENT_IOC_BRINGUP)) { | ||
| 1693 | ioc->pci_irq = -1; | ||
| 1694 | if (ioc->pcidev->irq) { | ||
| 1695 | if (mpt_msi_enable && !pci_enable_msi(ioc->pcidev)) | ||
| 1696 | printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", | ||
| 1697 | ioc->name); | ||
| 1698 | rc = request_irq(ioc->pcidev->irq, mpt_interrupt, | ||
| 1699 | SA_SHIRQ, ioc->name, ioc); | ||
| 1700 | if (rc < 0) { | ||
| 1701 | #ifndef __sparc__ | ||
| 1702 | printk(MYIOC_s_ERR_FMT "Unable to allocate " | ||
| 1703 | "interrupt %d!\n", ioc->name, | ||
| 1704 | ioc->pcidev->irq); | ||
| 1705 | #else | ||
| 1706 | printk(MYIOC_s_ERR_FMT "Unable to allocate " | ||
| 1707 | "interrupt %s!\n", ioc->name, | ||
| 1708 | __irq_itoa(ioc->pcidev->irq)); | ||
| 1709 | #endif | ||
| 1710 | if (mpt_msi_enable) | ||
| 1711 | pci_disable_msi(ioc->pcidev); | ||
| 1712 | return -EBUSY; | ||
| 1713 | } | ||
| 1714 | irq_allocated = 1; | ||
| 1715 | ioc->pci_irq = ioc->pcidev->irq; | ||
| 1716 | pci_set_master(ioc->pcidev); /* ?? */ | ||
| 1717 | pci_set_drvdata(ioc->pcidev, ioc); | ||
| 1718 | #ifndef __sparc__ | ||
| 1719 | dprintk((KERN_INFO MYNAM ": %s installed at interrupt " | ||
| 1720 | "%d\n", ioc->name, ioc->pcidev->irq)); | ||
| 1721 | #else | ||
| 1722 | dprintk((KERN_INFO MYNAM ": %s installed at interrupt " | ||
| 1723 | "%s\n", ioc->name, | ||
| 1724 | __irq_itoa(ioc->pcidev->irq))); | ||
| 1725 | #endif | ||
| 1726 | } | ||
| 1727 | } | ||
| 1728 | |||
| 1723 | /* Prime reply & request queues! | 1729 | /* Prime reply & request queues! |
| 1724 | * (mucho alloc's) Must be done prior to | 1730 | * (mucho alloc's) Must be done prior to |
| 1725 | * init as upper addresses are needed for init. | 1731 | * init as upper addresses are needed for init. |
| @@ -1819,7 +1825,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 1819 | ret = mptbase_sas_persist_operation(ioc, | 1825 | ret = mptbase_sas_persist_operation(ioc, |
| 1820 | MPI_SAS_OP_CLEAR_NOT_PRESENT); | 1826 | MPI_SAS_OP_CLEAR_NOT_PRESENT); |
| 1821 | if(ret != 0) | 1827 | if(ret != 0) |
| 1822 | return -1; | 1828 | goto out; |
| 1823 | } | 1829 | } |
| 1824 | 1830 | ||
| 1825 | /* Find IM volumes | 1831 | /* Find IM volumes |
| @@ -1900,6 +1906,12 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 1900 | /* FIXME? Examine results here? */ | 1906 | /* FIXME? Examine results here? */ |
| 1901 | } | 1907 | } |
| 1902 | 1908 | ||
| 1909 | out: | ||
| 1910 | if ((ret != 0) && irq_allocated) { | ||
| 1911 | free_irq(ioc->pci_irq, ioc); | ||
| 1912 | if (mpt_msi_enable) | ||
| 1913 | pci_disable_msi(ioc->pcidev); | ||
| 1914 | } | ||
| 1903 | return ret; | 1915 | return ret; |
| 1904 | } | 1916 | } |
| 1905 | 1917 | ||
