diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-06-24 08:41:41 -0400 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-06-24 13:07:53 -0400 |
| commit | 816724e65c72a90a44fbad0ef0b59b186c85fa90 (patch) | |
| tree | 421fa29aedff988e392f92780637553e275d37a0 /drivers/message/fusion/mptbase.c | |
| parent | 70ac4385a13f78bc478f26d317511893741b05bd (diff) | |
| parent | d384ea691fe4ea8c2dd5b9b8d9042eb181776f18 (diff) | |
Merge branch 'master' of /home/trondmy/kernel/linux-2.6/
Conflicts:
fs/nfs/inode.c
fs/super.c
Fix conflicts between patch 'NFS: Split fs/nfs/inode.c' and patch
'VFS: Permit filesystem to override root dentry on mount'
Diffstat (limited to 'drivers/message/fusion/mptbase.c')
| -rw-r--r-- | drivers/message/fusion/mptbase.c | 225 |
1 files changed, 53 insertions, 172 deletions
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index a30084076ac8..12dd8d493ee2 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
| @@ -63,9 +63,6 @@ | |||
| 63 | #ifdef CONFIG_MTRR | 63 | #ifdef CONFIG_MTRR |
| 64 | #include <asm/mtrr.h> | 64 | #include <asm/mtrr.h> |
| 65 | #endif | 65 | #endif |
| 66 | #ifdef __sparc__ | ||
| 67 | #include <asm/irq.h> /* needed for __irq_itoa() proto */ | ||
| 68 | #endif | ||
| 69 | 66 | ||
| 70 | #include "mptbase.h" | 67 | #include "mptbase.h" |
| 71 | 68 | ||
| @@ -1188,7 +1185,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1188 | ioc->pcidev = pdev; | 1185 | ioc->pcidev = pdev; |
| 1189 | ioc->diagPending = 0; | 1186 | ioc->diagPending = 0; |
| 1190 | spin_lock_init(&ioc->diagLock); | 1187 | spin_lock_init(&ioc->diagLock); |
| 1191 | spin_lock_init(&ioc->fc_rescan_work_lock); | ||
| 1192 | spin_lock_init(&ioc->initializing_hba_lock); | 1188 | spin_lock_init(&ioc->initializing_hba_lock); |
| 1193 | 1189 | ||
| 1194 | /* Initialize the event logging. | 1190 | /* Initialize the event logging. |
| @@ -1386,39 +1382,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1386 | /* Set lookup ptr. */ | 1382 | /* Set lookup ptr. */ |
| 1387 | list_add_tail(&ioc->list, &ioc_list); | 1383 | list_add_tail(&ioc->list, &ioc_list); |
| 1388 | 1384 | ||
| 1389 | ioc->pci_irq = -1; | ||
| 1390 | if (pdev->irq) { | ||
| 1391 | if (mpt_msi_enable && !pci_enable_msi(pdev)) | ||
| 1392 | printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", ioc->name); | ||
| 1393 | |||
| 1394 | r = request_irq(pdev->irq, mpt_interrupt, SA_SHIRQ, ioc->name, ioc); | ||
| 1395 | |||
| 1396 | if (r < 0) { | ||
| 1397 | #ifndef __sparc__ | ||
| 1398 | printk(MYIOC_s_ERR_FMT "Unable to allocate interrupt %d!\n", | ||
| 1399 | ioc->name, pdev->irq); | ||
| 1400 | #else | ||
| 1401 | printk(MYIOC_s_ERR_FMT "Unable to allocate interrupt %s!\n", | ||
| 1402 | ioc->name, __irq_itoa(pdev->irq)); | ||
| 1403 | #endif | ||
| 1404 | list_del(&ioc->list); | ||
| 1405 | iounmap(mem); | ||
| 1406 | kfree(ioc); | ||
| 1407 | return -EBUSY; | ||
| 1408 | } | ||
| 1409 | |||
| 1410 | ioc->pci_irq = pdev->irq; | ||
| 1411 | |||
| 1412 | pci_set_master(pdev); /* ?? */ | ||
| 1413 | pci_set_drvdata(pdev, ioc); | ||
| 1414 | |||
| 1415 | #ifndef __sparc__ | ||
| 1416 | dprintk((KERN_INFO MYNAM ": %s installed at interrupt %d\n", ioc->name, pdev->irq)); | ||
| 1417 | #else | ||
| 1418 | dprintk((KERN_INFO MYNAM ": %s installed at interrupt %s\n", ioc->name, __irq_itoa(pdev->irq))); | ||
| 1419 | #endif | ||
| 1420 | } | ||
| 1421 | |||
| 1422 | /* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets. | 1385 | /* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets. |
| 1423 | */ | 1386 | */ |
| 1424 | mpt_detect_bound_ports(ioc, pdev); | 1387 | mpt_detect_bound_ports(ioc, pdev); |
| @@ -1428,11 +1391,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1428 | printk(KERN_WARNING MYNAM | 1391 | printk(KERN_WARNING MYNAM |
| 1429 | ": WARNING - %s did not initialize properly! (%d)\n", | 1392 | ": WARNING - %s did not initialize properly! (%d)\n", |
| 1430 | ioc->name, r); | 1393 | ioc->name, r); |
| 1431 | |||
| 1432 | list_del(&ioc->list); | 1394 | list_del(&ioc->list); |
| 1433 | free_irq(ioc->pci_irq, ioc); | ||
| 1434 | if (mpt_msi_enable) | ||
| 1435 | pci_disable_msi(pdev); | ||
| 1436 | if (ioc->alt_ioc) | 1395 | if (ioc->alt_ioc) |
| 1437 | ioc->alt_ioc->alt_ioc = NULL; | 1396 | ioc->alt_ioc->alt_ioc = NULL; |
| 1438 | iounmap(mem); | 1397 | iounmap(mem); |
| @@ -1651,6 +1610,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 1651 | int handlers; | 1610 | int handlers; |
| 1652 | int ret = 0; | 1611 | int ret = 0; |
| 1653 | int reset_alt_ioc_active = 0; | 1612 | int reset_alt_ioc_active = 0; |
| 1613 | int irq_allocated = 0; | ||
| 1654 | 1614 | ||
| 1655 | printk(KERN_INFO MYNAM ": Initiating %s %s\n", | 1615 | printk(KERN_INFO MYNAM ": Initiating %s %s\n", |
| 1656 | ioc->name, reason==MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery"); | 1616 | ioc->name, reason==MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery"); |
| @@ -1734,6 +1694,36 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 1734 | } | 1694 | } |
| 1735 | } | 1695 | } |
| 1736 | 1696 | ||
| 1697 | /* | ||
| 1698 | * Device is reset now. It must have de-asserted the interrupt line | ||
| 1699 | * (if it was asserted) and it should be safe to register for the | ||
| 1700 | * interrupt now. | ||
| 1701 | */ | ||
| 1702 | if ((ret == 0) && (reason == MPT_HOSTEVENT_IOC_BRINGUP)) { | ||
| 1703 | ioc->pci_irq = -1; | ||
| 1704 | if (ioc->pcidev->irq) { | ||
| 1705 | if (mpt_msi_enable && !pci_enable_msi(ioc->pcidev)) | ||
| 1706 | printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", | ||
| 1707 | ioc->name); | ||
| 1708 | rc = request_irq(ioc->pcidev->irq, mpt_interrupt, | ||
| 1709 | SA_SHIRQ, ioc->name, ioc); | ||
| 1710 | if (rc < 0) { | ||
| 1711 | printk(MYIOC_s_ERR_FMT "Unable to allocate " | ||
| 1712 | "interrupt %d!\n", ioc->name, | ||
| 1713 | ioc->pcidev->irq); | ||
| 1714 | if (mpt_msi_enable) | ||
| 1715 | pci_disable_msi(ioc->pcidev); | ||
| 1716 | return -EBUSY; | ||
| 1717 | } | ||
| 1718 | irq_allocated = 1; | ||
| 1719 | ioc->pci_irq = ioc->pcidev->irq; | ||
| 1720 | pci_set_master(ioc->pcidev); /* ?? */ | ||
| 1721 | pci_set_drvdata(ioc->pcidev, ioc); | ||
| 1722 | dprintk((KERN_INFO MYNAM ": %s installed at interrupt " | ||
| 1723 | "%d\n", ioc->name, ioc->pcidev->irq)); | ||
| 1724 | } | ||
| 1725 | } | ||
| 1726 | |||
| 1737 | /* Prime reply & request queues! | 1727 | /* Prime reply & request queues! |
| 1738 | * (mucho alloc's) Must be done prior to | 1728 | * (mucho alloc's) Must be done prior to |
| 1739 | * init as upper addresses are needed for init. | 1729 | * init as upper addresses are needed for init. |
| @@ -1833,7 +1823,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 1833 | ret = mptbase_sas_persist_operation(ioc, | 1823 | ret = mptbase_sas_persist_operation(ioc, |
| 1834 | MPI_SAS_OP_CLEAR_NOT_PRESENT); | 1824 | MPI_SAS_OP_CLEAR_NOT_PRESENT); |
| 1835 | if(ret != 0) | 1825 | if(ret != 0) |
| 1836 | return -1; | 1826 | goto out; |
| 1837 | } | 1827 | } |
| 1838 | 1828 | ||
| 1839 | /* Find IM volumes | 1829 | /* Find IM volumes |
| @@ -1841,14 +1831,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 1841 | mpt_findImVolumes(ioc); | 1831 | mpt_findImVolumes(ioc); |
| 1842 | 1832 | ||
| 1843 | } else if (ioc->bus_type == FC) { | 1833 | } else if (ioc->bus_type == FC) { |
| 1844 | /* | ||
| 1845 | * Pre-fetch FC port WWN and stuff... | ||
| 1846 | * (FCPortPage0_t stuff) | ||
| 1847 | */ | ||
| 1848 | for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { | ||
| 1849 | (void) mptbase_GetFcPortPage0(ioc, ii); | ||
| 1850 | } | ||
| 1851 | |||
| 1852 | if ((ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN) && | 1834 | if ((ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN) && |
| 1853 | (ioc->lan_cnfg_page0.Header.PageLength == 0)) { | 1835 | (ioc->lan_cnfg_page0.Header.PageLength == 0)) { |
| 1854 | /* | 1836 | /* |
| @@ -1914,6 +1896,12 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 1914 | /* FIXME? Examine results here? */ | 1896 | /* FIXME? Examine results here? */ |
| 1915 | } | 1897 | } |
| 1916 | 1898 | ||
| 1899 | out: | ||
| 1900 | if ((ret != 0) && irq_allocated) { | ||
| 1901 | free_irq(ioc->pci_irq, ioc); | ||
| 1902 | if (mpt_msi_enable) | ||
| 1903 | pci_disable_msi(ioc->pcidev); | ||
| 1904 | } | ||
| 1917 | return ret; | 1905 | return ret; |
| 1918 | } | 1906 | } |
| 1919 | 1907 | ||
| @@ -2288,7 +2276,7 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag) | |||
| 2288 | } | 2276 | } |
| 2289 | 2277 | ||
| 2290 | if (sleepFlag == CAN_SLEEP) { | 2278 | if (sleepFlag == CAN_SLEEP) { |
| 2291 | msleep_interruptible(1); | 2279 | msleep(1); |
| 2292 | } else { | 2280 | } else { |
| 2293 | mdelay (1); /* 1 msec delay */ | 2281 | mdelay (1); /* 1 msec delay */ |
| 2294 | } | 2282 | } |
| @@ -2676,7 +2664,7 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag) | |||
| 2676 | state = mpt_GetIocState(ioc, 1); | 2664 | state = mpt_GetIocState(ioc, 1); |
| 2677 | while (state != MPI_IOC_STATE_OPERATIONAL && --cntdn) { | 2665 | while (state != MPI_IOC_STATE_OPERATIONAL && --cntdn) { |
| 2678 | if (sleepFlag == CAN_SLEEP) { | 2666 | if (sleepFlag == CAN_SLEEP) { |
| 2679 | msleep_interruptible(1); | 2667 | msleep(1); |
| 2680 | } else { | 2668 | } else { |
| 2681 | mdelay(1); | 2669 | mdelay(1); |
| 2682 | } | 2670 | } |
| @@ -2928,7 +2916,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag) | |||
| 2928 | 2916 | ||
| 2929 | /* wait 1 msec */ | 2917 | /* wait 1 msec */ |
| 2930 | if (sleepFlag == CAN_SLEEP) { | 2918 | if (sleepFlag == CAN_SLEEP) { |
| 2931 | msleep_interruptible(1); | 2919 | msleep(1); |
| 2932 | } else { | 2920 | } else { |
| 2933 | mdelay (1); | 2921 | mdelay (1); |
| 2934 | } | 2922 | } |
| @@ -2945,7 +2933,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag) | |||
| 2945 | } | 2933 | } |
| 2946 | /* wait .1 sec */ | 2934 | /* wait .1 sec */ |
| 2947 | if (sleepFlag == CAN_SLEEP) { | 2935 | if (sleepFlag == CAN_SLEEP) { |
| 2948 | msleep_interruptible (100); | 2936 | msleep (100); |
| 2949 | } else { | 2937 | } else { |
| 2950 | mdelay (100); | 2938 | mdelay (100); |
| 2951 | } | 2939 | } |
| @@ -3035,7 +3023,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag) | |||
| 3035 | 3023 | ||
| 3036 | /* wait 1 msec */ | 3024 | /* wait 1 msec */ |
| 3037 | if (sleepFlag == CAN_SLEEP) { | 3025 | if (sleepFlag == CAN_SLEEP) { |
| 3038 | msleep_interruptible (1); | 3026 | msleep (1); |
| 3039 | } else { | 3027 | } else { |
| 3040 | mdelay (1); | 3028 | mdelay (1); |
| 3041 | } | 3029 | } |
| @@ -3083,7 +3071,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag) | |||
| 3083 | return 0; | 3071 | return 0; |
| 3084 | } | 3072 | } |
| 3085 | if (sleepFlag == CAN_SLEEP) { | 3073 | if (sleepFlag == CAN_SLEEP) { |
| 3086 | msleep_interruptible (10); | 3074 | msleep (10); |
| 3087 | } else { | 3075 | } else { |
| 3088 | mdelay (10); | 3076 | mdelay (10); |
| 3089 | } | 3077 | } |
| @@ -3134,7 +3122,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag) | |||
| 3134 | SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag); | 3122 | SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag); |
| 3135 | 3123 | ||
| 3136 | if (sleepFlag == CAN_SLEEP) { | 3124 | if (sleepFlag == CAN_SLEEP) { |
| 3137 | msleep_interruptible (1000); | 3125 | msleep (1000); |
| 3138 | } else { | 3126 | } else { |
| 3139 | mdelay (1000); | 3127 | mdelay (1000); |
| 3140 | } | 3128 | } |
| @@ -3156,7 +3144,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag) | |||
| 3156 | return hard_reset_done; | 3144 | return hard_reset_done; |
| 3157 | } | 3145 | } |
| 3158 | if (sleepFlag == CAN_SLEEP) { | 3146 | if (sleepFlag == CAN_SLEEP) { |
| 3159 | msleep_interruptible (10); | 3147 | msleep (10); |
| 3160 | } else { | 3148 | } else { |
| 3161 | mdelay (10); | 3149 | mdelay (10); |
| 3162 | } | 3150 | } |
| @@ -3227,7 +3215,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) | |||
| 3227 | 3215 | ||
| 3228 | /* wait 100 msec */ | 3216 | /* wait 100 msec */ |
| 3229 | if (sleepFlag == CAN_SLEEP) { | 3217 | if (sleepFlag == CAN_SLEEP) { |
| 3230 | msleep_interruptible (100); | 3218 | msleep (100); |
| 3231 | } else { | 3219 | } else { |
| 3232 | mdelay (100); | 3220 | mdelay (100); |
| 3233 | } | 3221 | } |
| @@ -3306,7 +3294,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) | |||
| 3306 | 3294 | ||
| 3307 | /* wait 1 sec */ | 3295 | /* wait 1 sec */ |
| 3308 | if (sleepFlag == CAN_SLEEP) { | 3296 | if (sleepFlag == CAN_SLEEP) { |
| 3309 | msleep_interruptible (1000); | 3297 | msleep (1000); |
| 3310 | } else { | 3298 | } else { |
| 3311 | mdelay (1000); | 3299 | mdelay (1000); |
| 3312 | } | 3300 | } |
| @@ -3334,7 +3322,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) | |||
| 3334 | 3322 | ||
| 3335 | /* wait 1 sec */ | 3323 | /* wait 1 sec */ |
| 3336 | if (sleepFlag == CAN_SLEEP) { | 3324 | if (sleepFlag == CAN_SLEEP) { |
| 3337 | msleep_interruptible (1000); | 3325 | msleep (1000); |
| 3338 | } else { | 3326 | } else { |
| 3339 | mdelay (1000); | 3327 | mdelay (1000); |
| 3340 | } | 3328 | } |
| @@ -3368,7 +3356,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) | |||
| 3368 | 3356 | ||
| 3369 | /* wait 100 msec */ | 3357 | /* wait 100 msec */ |
| 3370 | if (sleepFlag == CAN_SLEEP) { | 3358 | if (sleepFlag == CAN_SLEEP) { |
| 3371 | msleep_interruptible (100); | 3359 | msleep (100); |
| 3372 | } else { | 3360 | } else { |
| 3373 | mdelay (100); | 3361 | mdelay (100); |
| 3374 | } | 3362 | } |
| @@ -3462,7 +3450,7 @@ SendIocReset(MPT_ADAPTER *ioc, u8 reset_type, int sleepFlag) | |||
| 3462 | } | 3450 | } |
| 3463 | 3451 | ||
| 3464 | if (sleepFlag == CAN_SLEEP) { | 3452 | if (sleepFlag == CAN_SLEEP) { |
| 3465 | msleep_interruptible(1); | 3453 | msleep(1); |
| 3466 | } else { | 3454 | } else { |
| 3467 | mdelay (1); /* 1 msec delay */ | 3455 | mdelay (1); /* 1 msec delay */ |
| 3468 | } | 3456 | } |
| @@ -3902,7 +3890,7 @@ WaitForDoorbellAck(MPT_ADAPTER *ioc, int howlong, int sleepFlag) | |||
| 3902 | intstat = CHIPREG_READ32(&ioc->chip->IntStatus); | 3890 | intstat = CHIPREG_READ32(&ioc->chip->IntStatus); |
| 3903 | if (! (intstat & MPI_HIS_IOP_DOORBELL_STATUS)) | 3891 | if (! (intstat & MPI_HIS_IOP_DOORBELL_STATUS)) |
| 3904 | break; | 3892 | break; |
| 3905 | msleep_interruptible (1); | 3893 | msleep (1); |
| 3906 | count++; | 3894 | count++; |
| 3907 | } | 3895 | } |
| 3908 | } else { | 3896 | } else { |
| @@ -3951,7 +3939,7 @@ WaitForDoorbellInt(MPT_ADAPTER *ioc, int howlong, int sleepFlag) | |||
| 3951 | intstat = CHIPREG_READ32(&ioc->chip->IntStatus); | 3939 | intstat = CHIPREG_READ32(&ioc->chip->IntStatus); |
| 3952 | if (intstat & MPI_HIS_DOORBELL_INTERRUPT) | 3940 | if (intstat & MPI_HIS_DOORBELL_INTERRUPT) |
| 3953 | break; | 3941 | break; |
| 3954 | msleep_interruptible(1); | 3942 | msleep(1); |
| 3955 | count++; | 3943 | count++; |
| 3956 | } | 3944 | } |
| 3957 | } else { | 3945 | } else { |
| @@ -4174,108 +4162,6 @@ GetLanConfigPages(MPT_ADAPTER *ioc) | |||
| 4174 | 4162 | ||
| 4175 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 4163 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
| 4176 | /* | 4164 | /* |
| 4177 | * mptbase_GetFcPortPage0 - Fetch FCPort config Page0. | ||
| 4178 | * @ioc: Pointer to MPT_ADAPTER structure | ||
| 4179 | * @portnum: IOC Port number | ||
| 4180 | * | ||
| 4181 | * Return: 0 for success | ||
| 4182 | * -ENOMEM if no memory available | ||
| 4183 | * -EPERM if not allowed due to ISR context | ||
| 4184 | * -EAGAIN if no msg frames currently available | ||
| 4185 | * -EFAULT for non-successful reply or no reply (timeout) | ||
| 4186 | */ | ||
| 4187 | int | ||
| 4188 | mptbase_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum) | ||
| 4189 | { | ||
| 4190 | ConfigPageHeader_t hdr; | ||
| 4191 | CONFIGPARMS cfg; | ||
| 4192 | FCPortPage0_t *ppage0_alloc; | ||
| 4193 | FCPortPage0_t *pp0dest; | ||
| 4194 | dma_addr_t page0_dma; | ||
| 4195 | int data_sz; | ||
| 4196 | int copy_sz; | ||
| 4197 | int rc; | ||
| 4198 | int count = 400; | ||
| 4199 | |||
| 4200 | |||
| 4201 | /* Get FCPort Page 0 header */ | ||
| 4202 | hdr.PageVersion = 0; | ||
| 4203 | hdr.PageLength = 0; | ||
| 4204 | hdr.PageNumber = 0; | ||
| 4205 | hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT; | ||
| 4206 | cfg.cfghdr.hdr = &hdr; | ||
| 4207 | cfg.physAddr = -1; | ||
| 4208 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; | ||
| 4209 | cfg.dir = 0; | ||
| 4210 | cfg.pageAddr = portnum; | ||
| 4211 | cfg.timeout = 0; | ||
| 4212 | |||
| 4213 | if ((rc = mpt_config(ioc, &cfg)) != 0) | ||
| 4214 | return rc; | ||
| 4215 | |||
| 4216 | if (hdr.PageLength == 0) | ||
| 4217 | return 0; | ||
| 4218 | |||
| 4219 | data_sz = hdr.PageLength * 4; | ||
| 4220 | rc = -ENOMEM; | ||
| 4221 | ppage0_alloc = (FCPortPage0_t *) pci_alloc_consistent(ioc->pcidev, data_sz, &page0_dma); | ||
| 4222 | if (ppage0_alloc) { | ||
| 4223 | |||
| 4224 | try_again: | ||
| 4225 | memset((u8 *)ppage0_alloc, 0, data_sz); | ||
| 4226 | cfg.physAddr = page0_dma; | ||
| 4227 | cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; | ||
| 4228 | |||
| 4229 | if ((rc = mpt_config(ioc, &cfg)) == 0) { | ||
| 4230 | /* save the data */ | ||
| 4231 | pp0dest = &ioc->fc_port_page0[portnum]; | ||
| 4232 | copy_sz = min_t(int, sizeof(FCPortPage0_t), data_sz); | ||
| 4233 | memcpy(pp0dest, ppage0_alloc, copy_sz); | ||
| 4234 | |||
| 4235 | /* | ||
| 4236 | * Normalize endianness of structure data, | ||
| 4237 | * by byte-swapping all > 1 byte fields! | ||
| 4238 | */ | ||
| 4239 | pp0dest->Flags = le32_to_cpu(pp0dest->Flags); | ||
| 4240 | pp0dest->PortIdentifier = le32_to_cpu(pp0dest->PortIdentifier); | ||
| 4241 | pp0dest->WWNN.Low = le32_to_cpu(pp0dest->WWNN.Low); | ||
| 4242 | pp0dest->WWNN.High = le32_to_cpu(pp0dest->WWNN.High); | ||
| 4243 | pp0dest->WWPN.Low = le32_to_cpu(pp0dest->WWPN.Low); | ||
| 4244 | pp0dest->WWPN.High = le32_to_cpu(pp0dest->WWPN.High); | ||
| 4245 | pp0dest->SupportedServiceClass = le32_to_cpu(pp0dest->SupportedServiceClass); | ||
| 4246 | pp0dest->SupportedSpeeds = le32_to_cpu(pp0dest->SupportedSpeeds); | ||
| 4247 | pp0dest->CurrentSpeed = le32_to_cpu(pp0dest->CurrentSpeed); | ||
| 4248 | pp0dest->MaxFrameSize = le32_to_cpu(pp0dest->MaxFrameSize); | ||
| 4249 | pp0dest->FabricWWNN.Low = le32_to_cpu(pp0dest->FabricWWNN.Low); | ||
| 4250 | pp0dest->FabricWWNN.High = le32_to_cpu(pp0dest->FabricWWNN.High); | ||
| 4251 | pp0dest->FabricWWPN.Low = le32_to_cpu(pp0dest->FabricWWPN.Low); | ||
| 4252 | pp0dest->FabricWWPN.High = le32_to_cpu(pp0dest->FabricWWPN.High); | ||
| 4253 | pp0dest->DiscoveredPortsCount = le32_to_cpu(pp0dest->DiscoveredPortsCount); | ||
| 4254 | pp0dest->MaxInitiators = le32_to_cpu(pp0dest->MaxInitiators); | ||
| 4255 | |||
| 4256 | /* | ||
| 4257 | * if still doing discovery, | ||
| 4258 | * hang loose a while until finished | ||
| 4259 | */ | ||
| 4260 | if (pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) { | ||
| 4261 | if (count-- > 0) { | ||
| 4262 | msleep_interruptible(100); | ||
| 4263 | goto try_again; | ||
| 4264 | } | ||
| 4265 | printk(MYIOC_s_INFO_FMT "Firmware discovery not" | ||
| 4266 | " complete.\n", | ||
| 4267 | ioc->name); | ||
| 4268 | } | ||
| 4269 | } | ||
| 4270 | |||
| 4271 | pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma); | ||
| 4272 | } | ||
| 4273 | |||
| 4274 | return rc; | ||
| 4275 | } | ||
| 4276 | |||
| 4277 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | ||
| 4278 | /* | ||
| 4279 | * mptbase_sas_persist_operation - Perform operation on SAS Persitent Table | 4165 | * mptbase_sas_persist_operation - Perform operation on SAS Persitent Table |
| 4280 | * @ioc: Pointer to MPT_ADAPTER structure | 4166 | * @ioc: Pointer to MPT_ADAPTER structure |
| 4281 | * @sas_address: 64bit SAS Address for operation. | 4167 | * @sas_address: 64bit SAS Address for operation. |
| @@ -5647,11 +5533,7 @@ mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buffer, int *size, int len, int sh | |||
| 5647 | a[5], a[4], a[3], a[2], a[1], a[0]); | 5533 | a[5], a[4], a[3], a[2], a[1], a[0]); |
| 5648 | } | 5534 | } |
| 5649 | 5535 | ||
| 5650 | #ifndef __sparc__ | ||
| 5651 | y += sprintf(buffer+len+y, ", IRQ=%d", ioc->pci_irq); | 5536 | y += sprintf(buffer+len+y, ", IRQ=%d", ioc->pci_irq); |
| 5652 | #else | ||
| 5653 | y += sprintf(buffer+len+y, ", IRQ=%s", __irq_itoa(ioc->pci_irq)); | ||
| 5654 | #endif | ||
| 5655 | 5537 | ||
| 5656 | if (!ioc->active) | 5538 | if (!ioc->active) |
| 5657 | y += sprintf(buffer+len+y, " (disabled)"); | 5539 | y += sprintf(buffer+len+y, " (disabled)"); |
| @@ -6483,7 +6365,6 @@ EXPORT_SYMBOL(mpt_findImVolumes); | |||
| 6483 | EXPORT_SYMBOL(mpt_alloc_fw_memory); | 6365 | EXPORT_SYMBOL(mpt_alloc_fw_memory); |
| 6484 | EXPORT_SYMBOL(mpt_free_fw_memory); | 6366 | EXPORT_SYMBOL(mpt_free_fw_memory); |
| 6485 | EXPORT_SYMBOL(mptbase_sas_persist_operation); | 6367 | EXPORT_SYMBOL(mptbase_sas_persist_operation); |
| 6486 | EXPORT_SYMBOL(mptbase_GetFcPortPage0); | ||
| 6487 | 6368 | ||
| 6488 | 6369 | ||
| 6489 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 6370 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
