diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-14 20:53:36 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-14 20:53:36 -0400 |
| commit | 39695224bd84dc4be29abad93a0ec232a16fc519 (patch) | |
| tree | 2bfa5cb50788a4c8be9f2e9f4412e47a565f4508 /drivers/message/fusion | |
| parent | a9bbd210a44102cc50b30a5f3d111dbf5f2f9cd4 (diff) | |
| parent | ea038f63ac52439e7816295fa6064fe95e6c1f51 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (209 commits)
[SCSI] fix oops during scsi scanning
[SCSI] libsrp: fix memory leak in srp_ring_free()
[SCSI] libiscsi, bnx2i: make bound ep check common
[SCSI] libiscsi: add completion function for drivers that do not need pdu processing
[SCSI] scsi_dh_rdac: changes for rdac debug logging
[SCSI] scsi_dh_rdac: changes to collect the rdac debug information during the initialization
[SCSI] scsi_dh_rdac: move the init code from rdac_activate to rdac_bus_attach
[SCSI] sg: fix oops in the error path in sg_build_indirect()
[SCSI] mptsas : Bump version to 3.04.12
[SCSI] mptsas : FW event thread and scsi mid layer deadlock in SYNCHRONIZE CACHE command
[SCSI] mptsas : Send DID_NO_CONNECT for pending IOs of removed device
[SCSI] mptsas : PAE Kernel more than 4 GB kernel panic
[SCSI] mptsas : NULL pointer on big endian systems causing Expander not to tear off
[SCSI] mptsas : Sanity check for phyinfo is added
[SCSI] scsi_dh_rdac: Add support for Sun StorageTek ST2500, ST2510 and ST2530
[SCSI] pmcraid: PMC-Sierra MaxRAID driver to support 6Gb/s SAS RAID controller
[SCSI] qla2xxx: Update version number to 8.03.01-k6.
[SCSI] qla2xxx: Properly delete rports attached to a vport.
[SCSI] qla2xxx: Correct various NPIV issues.
[SCSI] qla2xxx: Correct qla2x00_eh_wait_on_command() to wait correctly.
...
Diffstat (limited to 'drivers/message/fusion')
| -rw-r--r-- | drivers/message/fusion/mptbase.c | 94 | ||||
| -rw-r--r-- | drivers/message/fusion/mptbase.h | 21 | ||||
| -rw-r--r-- | drivers/message/fusion/mptfc.c | 19 | ||||
| -rw-r--r-- | drivers/message/fusion/mptsas.c | 62 | ||||
| -rw-r--r-- | drivers/message/fusion/mptscsih.c | 67 | ||||
| -rw-r--r-- | drivers/message/fusion/mptscsih.h | 1 | ||||
| -rw-r--r-- | drivers/message/fusion/mptspi.c | 21 |
7 files changed, 77 insertions, 208 deletions
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 5d0ba4f5924c..76fa2ee0b574 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
| @@ -1015,9 +1015,9 @@ mpt_add_sge_64bit(void *pAddr, u32 flagslength, dma_addr_t dma_addr) | |||
| 1015 | { | 1015 | { |
| 1016 | SGESimple64_t *pSge = (SGESimple64_t *) pAddr; | 1016 | SGESimple64_t *pSge = (SGESimple64_t *) pAddr; |
| 1017 | pSge->Address.Low = cpu_to_le32 | 1017 | pSge->Address.Low = cpu_to_le32 |
| 1018 | (lower_32_bits((unsigned long)(dma_addr))); | 1018 | (lower_32_bits(dma_addr)); |
| 1019 | pSge->Address.High = cpu_to_le32 | 1019 | pSge->Address.High = cpu_to_le32 |
| 1020 | (upper_32_bits((unsigned long)dma_addr)); | 1020 | (upper_32_bits(dma_addr)); |
| 1021 | pSge->FlagsLength = cpu_to_le32 | 1021 | pSge->FlagsLength = cpu_to_le32 |
| 1022 | ((flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING)); | 1022 | ((flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING)); |
| 1023 | } | 1023 | } |
| @@ -1038,8 +1038,8 @@ mpt_add_sge_64bit_1078(void *pAddr, u32 flagslength, dma_addr_t dma_addr) | |||
| 1038 | u32 tmp; | 1038 | u32 tmp; |
| 1039 | 1039 | ||
| 1040 | pSge->Address.Low = cpu_to_le32 | 1040 | pSge->Address.Low = cpu_to_le32 |
| 1041 | (lower_32_bits((unsigned long)(dma_addr))); | 1041 | (lower_32_bits(dma_addr)); |
| 1042 | tmp = (u32)(upper_32_bits((unsigned long)dma_addr)); | 1042 | tmp = (u32)(upper_32_bits(dma_addr)); |
| 1043 | 1043 | ||
| 1044 | /* | 1044 | /* |
| 1045 | * 1078 errata workaround for the 36GB limitation | 1045 | * 1078 errata workaround for the 36GB limitation |
| @@ -1101,7 +1101,7 @@ mpt_add_chain_64bit(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr) | |||
| 1101 | pChain->NextChainOffset = next; | 1101 | pChain->NextChainOffset = next; |
| 1102 | 1102 | ||
| 1103 | pChain->Address.Low = cpu_to_le32(tmp); | 1103 | pChain->Address.Low = cpu_to_le32(tmp); |
| 1104 | tmp = (u32)(upper_32_bits((unsigned long)dma_addr)); | 1104 | tmp = (u32)(upper_32_bits(dma_addr)); |
| 1105 | pChain->Address.High = cpu_to_le32(tmp); | 1105 | pChain->Address.High = cpu_to_le32(tmp); |
| 1106 | } | 1106 | } |
| 1107 | 1107 | ||
| @@ -1297,12 +1297,8 @@ mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init) | |||
| 1297 | psge = (char *)&ioc_init->HostPageBufferSGE; | 1297 | psge = (char *)&ioc_init->HostPageBufferSGE; |
| 1298 | flags_length = MPI_SGE_FLAGS_SIMPLE_ELEMENT | | 1298 | flags_length = MPI_SGE_FLAGS_SIMPLE_ELEMENT | |
| 1299 | MPI_SGE_FLAGS_SYSTEM_ADDRESS | | 1299 | MPI_SGE_FLAGS_SYSTEM_ADDRESS | |
| 1300 | MPI_SGE_FLAGS_32_BIT_ADDRESSING | | ||
| 1301 | MPI_SGE_FLAGS_HOST_TO_IOC | | 1300 | MPI_SGE_FLAGS_HOST_TO_IOC | |
| 1302 | MPI_SGE_FLAGS_END_OF_BUFFER; | 1301 | MPI_SGE_FLAGS_END_OF_BUFFER; |
| 1303 | if (sizeof(dma_addr_t) == sizeof(u64)) { | ||
| 1304 | flags_length |= MPI_SGE_FLAGS_64_BIT_ADDRESSING; | ||
| 1305 | } | ||
| 1306 | flags_length = flags_length << MPI_SGE_FLAGS_SHIFT; | 1302 | flags_length = flags_length << MPI_SGE_FLAGS_SHIFT; |
| 1307 | flags_length |= ioc->HostPageBuffer_sz; | 1303 | flags_length |= ioc->HostPageBuffer_sz; |
| 1308 | ioc->add_sge(psge, flags_length, ioc->HostPageBuffer_dma); | 1304 | ioc->add_sge(psge, flags_length, ioc->HostPageBuffer_dma); |
| @@ -2224,8 +2220,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 2224 | int hard; | 2220 | int hard; |
| 2225 | int rc=0; | 2221 | int rc=0; |
| 2226 | int ii; | 2222 | int ii; |
| 2227 | u8 cb_idx; | ||
| 2228 | int handlers; | ||
| 2229 | int ret = 0; | 2223 | int ret = 0; |
| 2230 | int reset_alt_ioc_active = 0; | 2224 | int reset_alt_ioc_active = 0; |
| 2231 | int irq_allocated = 0; | 2225 | int irq_allocated = 0; |
| @@ -2548,34 +2542,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
| 2548 | mpt_get_manufacturing_pg_0(ioc); | 2542 | mpt_get_manufacturing_pg_0(ioc); |
| 2549 | } | 2543 | } |
| 2550 | 2544 | ||
| 2551 | /* | ||
| 2552 | * Call each currently registered protocol IOC reset handler | ||
| 2553 | * with post-reset indication. | ||
| 2554 | * NOTE: If we're doing _IOC_BRINGUP, there can be no | ||
| 2555 | * MptResetHandlers[] registered yet. | ||
| 2556 | */ | ||
| 2557 | if (hard_reset_done) { | ||
| 2558 | rc = handlers = 0; | ||
| 2559 | for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { | ||
| 2560 | if ((ret == 0) && MptResetHandlers[cb_idx]) { | ||
| 2561 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT | ||
| 2562 | "Calling IOC post_reset handler #%d\n", | ||
| 2563 | ioc->name, cb_idx)); | ||
| 2564 | rc += mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET); | ||
| 2565 | handlers++; | ||
| 2566 | } | ||
| 2567 | |||
| 2568 | if (alt_ioc_ready && MptResetHandlers[cb_idx]) { | ||
| 2569 | drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT | ||
| 2570 | "Calling IOC post_reset handler #%d\n", | ||
| 2571 | ioc->alt_ioc->name, cb_idx)); | ||
| 2572 | rc += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_POST_RESET); | ||
| 2573 | handlers++; | ||
| 2574 | } | ||
| 2575 | } | ||
| 2576 | /* FIXME? Examine results here? */ | ||
| 2577 | } | ||
| 2578 | |||
| 2579 | out: | 2545 | out: |
| 2580 | if ((ret != 0) && irq_allocated) { | 2546 | if ((ret != 0) && irq_allocated) { |
| 2581 | free_irq(ioc->pci_irq, ioc); | 2547 | free_irq(ioc->pci_irq, ioc); |
| @@ -3938,6 +3904,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) | |||
| 3938 | int count = 0; | 3904 | int count = 0; |
| 3939 | u32 diag1val = 0; | 3905 | u32 diag1val = 0; |
| 3940 | MpiFwHeader_t *cached_fw; /* Pointer to FW */ | 3906 | MpiFwHeader_t *cached_fw; /* Pointer to FW */ |
| 3907 | u8 cb_idx; | ||
| 3941 | 3908 | ||
| 3942 | /* Clear any existing interrupts */ | 3909 | /* Clear any existing interrupts */ |
| 3943 | CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); | 3910 | CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); |
| @@ -3956,6 +3923,18 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) | |||
| 3956 | else | 3923 | else |
| 3957 | mdelay(1); | 3924 | mdelay(1); |
| 3958 | 3925 | ||
| 3926 | /* | ||
| 3927 | * Call each currently registered protocol IOC reset handler | ||
| 3928 | * with pre-reset indication. | ||
| 3929 | * NOTE: If we're doing _IOC_BRINGUP, there can be no | ||
| 3930 | * MptResetHandlers[] registered yet. | ||
| 3931 | */ | ||
| 3932 | for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { | ||
| 3933 | if (MptResetHandlers[cb_idx]) | ||
| 3934 | (*(MptResetHandlers[cb_idx]))(ioc, | ||
| 3935 | MPT_IOC_PRE_RESET); | ||
| 3936 | } | ||
| 3937 | |||
| 3959 | for (count = 0; count < 60; count ++) { | 3938 | for (count = 0; count < 60; count ++) { |
| 3960 | doorbell = CHIPREG_READ32(&ioc->chip->Doorbell); | 3939 | doorbell = CHIPREG_READ32(&ioc->chip->Doorbell); |
| 3961 | doorbell &= MPI_IOC_STATE_MASK; | 3940 | doorbell &= MPI_IOC_STATE_MASK; |
| @@ -4052,25 +4031,15 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) | |||
| 4052 | * NOTE: If we're doing _IOC_BRINGUP, there can be no | 4031 | * NOTE: If we're doing _IOC_BRINGUP, there can be no |
| 4053 | * MptResetHandlers[] registered yet. | 4032 | * MptResetHandlers[] registered yet. |
| 4054 | */ | 4033 | */ |
| 4055 | { | 4034 | for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { |
| 4056 | u8 cb_idx; | 4035 | if (MptResetHandlers[cb_idx]) { |
| 4057 | int r = 0; | 4036 | mpt_signal_reset(cb_idx, |
| 4058 | 4037 | ioc, MPT_IOC_PRE_RESET); | |
| 4059 | for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { | 4038 | if (ioc->alt_ioc) { |
| 4060 | if (MptResetHandlers[cb_idx]) { | 4039 | mpt_signal_reset(cb_idx, |
| 4061 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT | 4040 | ioc->alt_ioc, MPT_IOC_PRE_RESET); |
| 4062 | "Calling IOC pre_reset handler #%d\n", | ||
| 4063 | ioc->name, cb_idx)); | ||
| 4064 | r += mpt_signal_reset(cb_idx, ioc, MPT_IOC_PRE_RESET); | ||
| 4065 | if (ioc->alt_ioc) { | ||
| 4066 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT | ||
| 4067 | "Calling alt-%s pre_reset handler #%d\n", | ||
| 4068 | ioc->name, ioc->alt_ioc->name, cb_idx)); | ||
| 4069 | r += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_PRE_RESET); | ||
| 4070 | } | ||
| 4071 | } | 4041 | } |
| 4072 | } | 4042 | } |
| 4073 | /* FIXME? Examine results here? */ | ||
| 4074 | } | 4043 | } |
| 4075 | 4044 | ||
| 4076 | if (ioc->cached_fw) | 4045 | if (ioc->cached_fw) |
| @@ -6956,7 +6925,7 @@ EXPORT_SYMBOL(mpt_halt_firmware); | |||
| 6956 | int | 6925 | int |
| 6957 | mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) | 6926 | mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) |
| 6958 | { | 6927 | { |
| 6959 | int rc; | 6928 | int rc; |
| 6960 | u8 cb_idx; | 6929 | u8 cb_idx; |
| 6961 | unsigned long flags; | 6930 | unsigned long flags; |
| 6962 | unsigned long time_count; | 6931 | unsigned long time_count; |
| @@ -6982,8 +6951,6 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) | |||
| 6982 | ioc->alt_ioc->ioc_reset_in_progress = 1; | 6951 | ioc->alt_ioc->ioc_reset_in_progress = 1; |
| 6983 | spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); | 6952 | spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); |
| 6984 | 6953 | ||
| 6985 | /* FIXME: If do_ioc_recovery fails, repeat.... | ||
| 6986 | */ | ||
| 6987 | 6954 | ||
| 6988 | /* The SCSI driver needs to adjust timeouts on all current | 6955 | /* The SCSI driver needs to adjust timeouts on all current |
| 6989 | * commands prior to the diagnostic reset being issued. | 6956 | * commands prior to the diagnostic reset being issued. |
| @@ -7020,6 +6987,15 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) | |||
| 7020 | } | 6987 | } |
| 7021 | spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); | 6988 | spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); |
| 7022 | 6989 | ||
| 6990 | for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { | ||
| 6991 | if (MptResetHandlers[cb_idx]) { | ||
| 6992 | mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET); | ||
| 6993 | if (ioc->alt_ioc) | ||
| 6994 | mpt_signal_reset(cb_idx, | ||
| 6995 | ioc->alt_ioc, MPT_IOC_POST_RESET); | ||
| 6996 | } | ||
| 6997 | } | ||
| 6998 | |||
| 7023 | dtmprintk(ioc, | 6999 | dtmprintk(ioc, |
| 7024 | printk(MYIOC_s_DEBUG_FMT | 7000 | printk(MYIOC_s_DEBUG_FMT |
| 7025 | "HardResetHandler: completed (%d seconds): %s\n", ioc->name, | 7001 | "HardResetHandler: completed (%d seconds): %s\n", ioc->name, |
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index 1c8514dc31ca..8dd4d219e433 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h | |||
| @@ -76,8 +76,8 @@ | |||
| 76 | #define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR | 76 | #define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR |
| 77 | #endif | 77 | #endif |
| 78 | 78 | ||
| 79 | #define MPT_LINUX_VERSION_COMMON "3.04.10" | 79 | #define MPT_LINUX_VERSION_COMMON "3.04.12" |
| 80 | #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.09" | 80 | #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.12" |
| 81 | #define WHAT_MAGIC_STRING "@" "(" "#" ")" | 81 | #define WHAT_MAGIC_STRING "@" "(" "#" ")" |
| 82 | 82 | ||
| 83 | #define show_mptmod_ver(s,ver) \ | 83 | #define show_mptmod_ver(s,ver) \ |
| @@ -157,8 +157,9 @@ | |||
| 157 | /* | 157 | /* |
| 158 | * Try to keep these at 2^N-1 | 158 | * Try to keep these at 2^N-1 |
| 159 | */ | 159 | */ |
| 160 | #define MPT_FC_CAN_QUEUE 127 | 160 | #define MPT_FC_CAN_QUEUE 1024 |
| 161 | #define MPT_SCSI_CAN_QUEUE 127 | 161 | #define MPT_SCSI_CAN_QUEUE 127 |
| 162 | #define MPT_SAS_CAN_QUEUE 127 | ||
| 162 | 163 | ||
| 163 | /* | 164 | /* |
| 164 | * Set the MAX_SGE value based on user input. | 165 | * Set the MAX_SGE value based on user input. |
| @@ -879,23 +880,9 @@ typedef enum { | |||
| 879 | 880 | ||
| 880 | typedef struct _MPT_SCSI_HOST { | 881 | typedef struct _MPT_SCSI_HOST { |
| 881 | MPT_ADAPTER *ioc; | 882 | MPT_ADAPTER *ioc; |
| 882 | int port; | ||
| 883 | u32 pad0; | ||
| 884 | MPT_LOCAL_REPLY *pLocal; /* used for internal commands */ | ||
| 885 | struct timer_list timer; | ||
| 886 | /* Pool of memory for holding SCpnts before doing | ||
| 887 | * OS callbacks. freeQ is the free pool. | ||
| 888 | */ | ||
| 889 | u8 negoNvram; /* DV disabled, nego NVRAM */ | ||
| 890 | u8 pad1; | ||
| 891 | u8 rsvd[2]; | ||
| 892 | MPT_FRAME_HDR *cmdPtr; /* Ptr to nonOS request */ | ||
| 893 | struct scsi_cmnd *abortSCpnt; | ||
| 894 | MPT_LOCAL_REPLY localReply; /* internal cmd reply struct */ | ||
| 895 | ushort sel_timeout[MPT_MAX_FC_DEVICES]; | 883 | ushort sel_timeout[MPT_MAX_FC_DEVICES]; |
| 896 | char *info_kbuf; | 884 | char *info_kbuf; |
| 897 | long last_queue_full; | 885 | long last_queue_full; |
| 898 | u16 tm_iocstatus; | ||
| 899 | u16 spi_pending; | 886 | u16 spi_pending; |
| 900 | struct list_head target_reset_list; | 887 | struct list_head target_reset_list; |
| 901 | } MPT_SCSI_HOST; | 888 | } MPT_SCSI_HOST; |
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index e61df133a59e..ebf6ae024da4 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c | |||
| @@ -1288,25 +1288,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1288 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", | 1288 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", |
| 1289 | ioc->name, ioc->ScsiLookup)); | 1289 | ioc->name, ioc->ScsiLookup)); |
| 1290 | 1290 | ||
| 1291 | /* Clear the TM flags | ||
| 1292 | */ | ||
| 1293 | hd->abortSCpnt = NULL; | ||
| 1294 | |||
| 1295 | /* Clear the pointer used to store | ||
| 1296 | * single-threaded commands, i.e., those | ||
| 1297 | * issued during a bus scan, dv and | ||
| 1298 | * configuration pages. | ||
| 1299 | */ | ||
| 1300 | hd->cmdPtr = NULL; | ||
| 1301 | |||
| 1302 | /* Initialize this SCSI Hosts' timers | ||
| 1303 | * To use, set the timer expires field | ||
| 1304 | * and add_timer | ||
| 1305 | */ | ||
| 1306 | init_timer(&hd->timer); | ||
| 1307 | hd->timer.data = (unsigned long) hd; | ||
| 1308 | hd->timer.function = mptscsih_timer_expired; | ||
| 1309 | |||
| 1310 | hd->last_queue_full = 0; | 1291 | hd->last_queue_full = 0; |
| 1311 | 1292 | ||
| 1312 | sh->transportt = mptfc_transport_template; | 1293 | sh->transportt = mptfc_transport_template; |
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index 55ff25244af4..83873e3d0ce7 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c | |||
| @@ -72,6 +72,7 @@ | |||
| 72 | */ | 72 | */ |
| 73 | #define MPTSAS_RAID_CHANNEL 1 | 73 | #define MPTSAS_RAID_CHANNEL 1 |
| 74 | 74 | ||
| 75 | #define SAS_CONFIG_PAGE_TIMEOUT 30 | ||
| 75 | MODULE_AUTHOR(MODULEAUTHOR); | 76 | MODULE_AUTHOR(MODULEAUTHOR); |
| 76 | MODULE_DESCRIPTION(my_NAME); | 77 | MODULE_DESCRIPTION(my_NAME); |
| 77 | MODULE_LICENSE("GPL"); | 78 | MODULE_LICENSE("GPL"); |
| @@ -324,7 +325,6 @@ mptsas_cleanup_fw_event_q(MPT_ADAPTER *ioc) | |||
| 324 | { | 325 | { |
| 325 | struct fw_event_work *fw_event, *next; | 326 | struct fw_event_work *fw_event, *next; |
| 326 | struct mptsas_target_reset_event *target_reset_list, *n; | 327 | struct mptsas_target_reset_event *target_reset_list, *n; |
| 327 | u8 flush_q; | ||
| 328 | MPT_SCSI_HOST *hd = shost_priv(ioc->sh); | 328 | MPT_SCSI_HOST *hd = shost_priv(ioc->sh); |
| 329 | 329 | ||
| 330 | /* flush the target_reset_list */ | 330 | /* flush the target_reset_list */ |
| @@ -344,15 +344,10 @@ mptsas_cleanup_fw_event_q(MPT_ADAPTER *ioc) | |||
| 344 | !ioc->fw_event_q || in_interrupt()) | 344 | !ioc->fw_event_q || in_interrupt()) |
| 345 | return; | 345 | return; |
| 346 | 346 | ||
| 347 | flush_q = 0; | ||
| 348 | list_for_each_entry_safe(fw_event, next, &ioc->fw_event_list, list) { | 347 | list_for_each_entry_safe(fw_event, next, &ioc->fw_event_list, list) { |
| 349 | if (cancel_delayed_work(&fw_event->work)) | 348 | if (cancel_delayed_work(&fw_event->work)) |
| 350 | mptsas_free_fw_event(ioc, fw_event); | 349 | mptsas_free_fw_event(ioc, fw_event); |
| 351 | else | ||
| 352 | flush_q = 1; | ||
| 353 | } | 350 | } |
| 354 | if (flush_q) | ||
| 355 | flush_workqueue(ioc->fw_event_q); | ||
| 356 | } | 351 | } |
| 357 | 352 | ||
| 358 | 353 | ||
| @@ -661,7 +656,7 @@ mptsas_add_device_component_starget_ir(MPT_ADAPTER *ioc, | |||
| 661 | cfg.pageAddr = starget->id; | 656 | cfg.pageAddr = starget->id; |
| 662 | cfg.cfghdr.hdr = &hdr; | 657 | cfg.cfghdr.hdr = &hdr; |
| 663 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; | 658 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; |
| 664 | cfg.timeout = 10; | 659 | cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; |
| 665 | 660 | ||
| 666 | if (mpt_config(ioc, &cfg) != 0) | 661 | if (mpt_config(ioc, &cfg) != 0) |
| 667 | goto out; | 662 | goto out; |
| @@ -851,7 +846,13 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) | |||
| 851 | port_details->num_phys--; | 846 | port_details->num_phys--; |
| 852 | port_details->phy_bitmask &= ~ (1 << phy_info->phy_id); | 847 | port_details->phy_bitmask &= ~ (1 << phy_info->phy_id); |
| 853 | memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo)); | 848 | memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo)); |
| 854 | sas_port_delete_phy(port_details->port, phy_info->phy); | 849 | if (phy_info->phy) { |
| 850 | devtprintk(ioc, dev_printk(KERN_DEBUG, | ||
| 851 | &phy_info->phy->dev, MYIOC_s_FMT | ||
| 852 | "delete phy %d, phy-obj (0x%p)\n", ioc->name, | ||
| 853 | phy_info->phy_id, phy_info->phy)); | ||
| 854 | sas_port_delete_phy(port_details->port, phy_info->phy); | ||
| 855 | } | ||
| 855 | phy_info->port_details = NULL; | 856 | phy_info->port_details = NULL; |
| 856 | } | 857 | } |
| 857 | 858 | ||
| @@ -1272,7 +1273,6 @@ mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) | |||
| 1272 | } | 1273 | } |
| 1273 | mptsas_cleanup_fw_event_q(ioc); | 1274 | mptsas_cleanup_fw_event_q(ioc); |
| 1274 | mptsas_queue_rescan(ioc); | 1275 | mptsas_queue_rescan(ioc); |
| 1275 | mptsas_fw_event_on(ioc); | ||
| 1276 | break; | 1276 | break; |
| 1277 | default: | 1277 | default: |
| 1278 | break; | 1278 | break; |
| @@ -1318,7 +1318,7 @@ mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure, | |||
| 1318 | cfg.pageAddr = form + form_specific; | 1318 | cfg.pageAddr = form + form_specific; |
| 1319 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; | 1319 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; |
| 1320 | cfg.dir = 0; /* read */ | 1320 | cfg.dir = 0; /* read */ |
| 1321 | cfg.timeout = 10; | 1321 | cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; |
| 1322 | 1322 | ||
| 1323 | error = mpt_config(ioc, &cfg); | 1323 | error = mpt_config(ioc, &cfg); |
| 1324 | if (error) | 1324 | if (error) |
| @@ -1592,6 +1592,7 @@ mptsas_firmware_event_work(struct work_struct *work) | |||
| 1592 | mptsas_scan_sas_topology(ioc); | 1592 | mptsas_scan_sas_topology(ioc); |
| 1593 | ioc->in_rescan = 0; | 1593 | ioc->in_rescan = 0; |
| 1594 | mptsas_free_fw_event(ioc, fw_event); | 1594 | mptsas_free_fw_event(ioc, fw_event); |
| 1595 | mptsas_fw_event_on(ioc); | ||
| 1595 | return; | 1596 | return; |
| 1596 | } | 1597 | } |
| 1597 | 1598 | ||
| @@ -1891,7 +1892,7 @@ static struct scsi_host_template mptsas_driver_template = { | |||
| 1891 | .eh_bus_reset_handler = mptscsih_bus_reset, | 1892 | .eh_bus_reset_handler = mptscsih_bus_reset, |
| 1892 | .eh_host_reset_handler = mptscsih_host_reset, | 1893 | .eh_host_reset_handler = mptscsih_host_reset, |
| 1893 | .bios_param = mptscsih_bios_param, | 1894 | .bios_param = mptscsih_bios_param, |
| 1894 | .can_queue = MPT_FC_CAN_QUEUE, | 1895 | .can_queue = MPT_SAS_CAN_QUEUE, |
| 1895 | .this_id = -1, | 1896 | .this_id = -1, |
| 1896 | .sg_tablesize = MPT_SCSI_SG_DEPTH, | 1897 | .sg_tablesize = MPT_SCSI_SG_DEPTH, |
| 1897 | .max_sectors = 8192, | 1898 | .max_sectors = 8192, |
| @@ -1926,7 +1927,7 @@ static int mptsas_get_linkerrors(struct sas_phy *phy) | |||
| 1926 | cfg.pageAddr = phy->identify.phy_identifier; | 1927 | cfg.pageAddr = phy->identify.phy_identifier; |
| 1927 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; | 1928 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; |
| 1928 | cfg.dir = 0; /* read */ | 1929 | cfg.dir = 0; /* read */ |
| 1929 | cfg.timeout = 10; | 1930 | cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; |
| 1930 | 1931 | ||
| 1931 | error = mpt_config(ioc, &cfg); | 1932 | error = mpt_config(ioc, &cfg); |
| 1932 | if (error) | 1933 | if (error) |
| @@ -2278,7 +2279,7 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) | |||
| 2278 | cfg.pageAddr = 0; | 2279 | cfg.pageAddr = 0; |
| 2279 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; | 2280 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; |
| 2280 | cfg.dir = 0; /* read */ | 2281 | cfg.dir = 0; /* read */ |
| 2281 | cfg.timeout = 10; | 2282 | cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; |
| 2282 | 2283 | ||
| 2283 | error = mpt_config(ioc, &cfg); | 2284 | error = mpt_config(ioc, &cfg); |
| 2284 | if (error) | 2285 | if (error) |
| @@ -2349,7 +2350,7 @@ mptsas_sas_io_unit_pg1(MPT_ADAPTER *ioc) | |||
| 2349 | 2350 | ||
| 2350 | cfg.cfghdr.ehdr = &hdr; | 2351 | cfg.cfghdr.ehdr = &hdr; |
| 2351 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; | 2352 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; |
| 2352 | cfg.timeout = 10; | 2353 | cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; |
| 2353 | cfg.cfghdr.ehdr->PageType = MPI_CONFIG_PAGETYPE_EXTENDED; | 2354 | cfg.cfghdr.ehdr->PageType = MPI_CONFIG_PAGETYPE_EXTENDED; |
| 2354 | cfg.cfghdr.ehdr->ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; | 2355 | cfg.cfghdr.ehdr->ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; |
| 2355 | cfg.cfghdr.ehdr->PageVersion = MPI_SASIOUNITPAGE1_PAGEVERSION; | 2356 | cfg.cfghdr.ehdr->PageVersion = MPI_SASIOUNITPAGE1_PAGEVERSION; |
| @@ -2411,7 +2412,7 @@ mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, | |||
| 2411 | 2412 | ||
| 2412 | cfg.cfghdr.ehdr = &hdr; | 2413 | cfg.cfghdr.ehdr = &hdr; |
| 2413 | cfg.dir = 0; /* read */ | 2414 | cfg.dir = 0; /* read */ |
| 2414 | cfg.timeout = 10; | 2415 | cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; |
| 2415 | 2416 | ||
| 2416 | /* Get Phy Pg 0 for each Phy. */ | 2417 | /* Get Phy Pg 0 for each Phy. */ |
| 2417 | cfg.physAddr = -1; | 2418 | cfg.physAddr = -1; |
| @@ -2479,7 +2480,7 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info, | |||
| 2479 | cfg.physAddr = -1; | 2480 | cfg.physAddr = -1; |
| 2480 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; | 2481 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; |
| 2481 | cfg.dir = 0; /* read */ | 2482 | cfg.dir = 0; /* read */ |
| 2482 | cfg.timeout = 10; | 2483 | cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; |
| 2483 | 2484 | ||
| 2484 | memset(device_info, 0, sizeof(struct mptsas_devinfo)); | 2485 | memset(device_info, 0, sizeof(struct mptsas_devinfo)); |
| 2485 | error = mpt_config(ioc, &cfg); | 2486 | error = mpt_config(ioc, &cfg); |
| @@ -2554,7 +2555,7 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info, | |||
| 2554 | cfg.pageAddr = form + form_specific; | 2555 | cfg.pageAddr = form + form_specific; |
| 2555 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; | 2556 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; |
| 2556 | cfg.dir = 0; /* read */ | 2557 | cfg.dir = 0; /* read */ |
| 2557 | cfg.timeout = 10; | 2558 | cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; |
| 2558 | 2559 | ||
| 2559 | memset(port_info, 0, sizeof(struct mptsas_portinfo)); | 2560 | memset(port_info, 0, sizeof(struct mptsas_portinfo)); |
| 2560 | error = mpt_config(ioc, &cfg); | 2561 | error = mpt_config(ioc, &cfg); |
| @@ -2635,7 +2636,7 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, | |||
| 2635 | cfg.pageAddr = form + form_specific; | 2636 | cfg.pageAddr = form + form_specific; |
| 2636 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; | 2637 | cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; |
| 2637 | cfg.dir = 0; /* read */ | 2638 | cfg.dir = 0; /* read */ |
| 2638 | cfg.timeout = 10; | 2639 | cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT; |
| 2639 | 2640 | ||
| 2640 | error = mpt_config(ioc, &cfg); | 2641 | error = mpt_config(ioc, &cfg); |
| 2641 | if (error) | 2642 | if (error) |
| @@ -3307,6 +3308,7 @@ mptsas_send_expander_event(struct fw_event_work *fw_event) | |||
| 3307 | expander_data = (MpiEventDataSasExpanderStatusChange_t *) | 3308 | expander_data = (MpiEventDataSasExpanderStatusChange_t *) |
| 3308 | fw_event->event_data; | 3309 | fw_event->event_data; |
| 3309 | memcpy(&sas_address, &expander_data->SASAddress, sizeof(__le64)); | 3310 | memcpy(&sas_address, &expander_data->SASAddress, sizeof(__le64)); |
| 3311 | sas_address = le64_to_cpu(sas_address); | ||
| 3310 | port_info = mptsas_find_portinfo_by_sas_address(ioc, sas_address); | 3312 | port_info = mptsas_find_portinfo_by_sas_address(ioc, sas_address); |
| 3311 | 3313 | ||
| 3312 | if (expander_data->ReasonCode == MPI_EVENT_SAS_EXP_RC_ADDED) { | 3314 | if (expander_data->ReasonCode == MPI_EVENT_SAS_EXP_RC_ADDED) { |
| @@ -4760,10 +4762,9 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 4760 | 4762 | ||
| 4761 | /* set 16 byte cdb's */ | 4763 | /* set 16 byte cdb's */ |
| 4762 | sh->max_cmd_len = 16; | 4764 | sh->max_cmd_len = 16; |
| 4763 | 4765 | sh->can_queue = min_t(int, ioc->req_depth - 10, sh->can_queue); | |
| 4764 | sh->max_id = ioc->pfacts[0].PortSCSIID; | 4766 | sh->max_id = -1; |
| 4765 | sh->max_lun = max_lun; | 4767 | sh->max_lun = max_lun; |
| 4766 | |||
| 4767 | sh->transportt = mptsas_transport_template; | 4768 | sh->transportt = mptsas_transport_template; |
| 4768 | 4769 | ||
| 4769 | /* Required entry. | 4770 | /* Required entry. |
| @@ -4821,25 +4822,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 4821 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", | 4822 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", |
| 4822 | ioc->name, ioc->ScsiLookup)); | 4823 | ioc->name, ioc->ScsiLookup)); |
| 4823 | 4824 | ||
| 4824 | /* Clear the TM flags | ||
| 4825 | */ | ||
| 4826 | hd->abortSCpnt = NULL; | ||
| 4827 | |||
| 4828 | /* Clear the pointer used to store | ||
| 4829 | * single-threaded commands, i.e., those | ||
| 4830 | * issued during a bus scan, dv and | ||
| 4831 | * configuration pages. | ||
| 4832 | */ | ||
| 4833 | hd->cmdPtr = NULL; | ||
| 4834 | |||
| 4835 | /* Initialize this SCSI Hosts' timers | ||
| 4836 | * To use, set the timer expires field | ||
| 4837 | * and add_timer | ||
| 4838 | */ | ||
| 4839 | init_timer(&hd->timer); | ||
| 4840 | hd->timer.data = (unsigned long) hd; | ||
| 4841 | hd->timer.function = mptscsih_timer_expired; | ||
| 4842 | |||
| 4843 | ioc->sas_data.ptClear = mpt_pt_clear; | 4825 | ioc->sas_data.ptClear = mpt_pt_clear; |
| 4844 | 4826 | ||
| 4845 | hd->last_queue_full = 0; | 4827 | hd->last_queue_full = 0; |
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index 8440f78f6969..c29578614504 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c | |||
| @@ -628,6 +628,16 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) | |||
| 628 | return 1; | 628 | return 1; |
| 629 | } | 629 | } |
| 630 | 630 | ||
| 631 | if (ioc->bus_type == SAS) { | ||
| 632 | VirtDevice *vdevice = sc->device->hostdata; | ||
| 633 | |||
| 634 | if (!vdevice || !vdevice->vtarget || | ||
| 635 | vdevice->vtarget->deleted) { | ||
| 636 | sc->result = DID_NO_CONNECT << 16; | ||
| 637 | goto out; | ||
| 638 | } | ||
| 639 | } | ||
| 640 | |||
| 631 | sc->host_scribble = NULL; | 641 | sc->host_scribble = NULL; |
| 632 | sc->result = DID_OK << 16; /* Set default reply as OK */ | 642 | sc->result = DID_OK << 16; /* Set default reply as OK */ |
| 633 | pScsiReq = (SCSIIORequest_t *) mf; | 643 | pScsiReq = (SCSIIORequest_t *) mf; |
| @@ -689,6 +699,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) | |||
| 689 | 699 | ||
| 690 | switch(status) { | 700 | switch(status) { |
| 691 | case MPI_IOCSTATUS_BUSY: /* 0x0002 */ | 701 | case MPI_IOCSTATUS_BUSY: /* 0x0002 */ |
| 702 | case MPI_IOCSTATUS_INSUFFICIENT_RESOURCES: /* 0x0006 */ | ||
| 692 | /* CHECKME! | 703 | /* CHECKME! |
| 693 | * Maybe: DRIVER_BUSY | SUGGEST_RETRY | DID_SOFT_ERROR (retry) | 704 | * Maybe: DRIVER_BUSY | SUGGEST_RETRY | DID_SOFT_ERROR (retry) |
| 694 | * But not: DID_BUS_BUSY lest one risk | 705 | * But not: DID_BUS_BUSY lest one risk |
| @@ -872,7 +883,6 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) | |||
| 872 | case MPI_IOCSTATUS_INVALID_SGL: /* 0x0003 */ | 883 | case MPI_IOCSTATUS_INVALID_SGL: /* 0x0003 */ |
| 873 | case MPI_IOCSTATUS_INTERNAL_ERROR: /* 0x0004 */ | 884 | case MPI_IOCSTATUS_INTERNAL_ERROR: /* 0x0004 */ |
| 874 | case MPI_IOCSTATUS_RESERVED: /* 0x0005 */ | 885 | case MPI_IOCSTATUS_RESERVED: /* 0x0005 */ |
| 875 | case MPI_IOCSTATUS_INSUFFICIENT_RESOURCES: /* 0x0006 */ | ||
| 876 | case MPI_IOCSTATUS_INVALID_FIELD: /* 0x0007 */ | 886 | case MPI_IOCSTATUS_INVALID_FIELD: /* 0x0007 */ |
| 877 | case MPI_IOCSTATUS_INVALID_STATE: /* 0x0008 */ | 887 | case MPI_IOCSTATUS_INVALID_STATE: /* 0x0008 */ |
| 878 | case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */ | 888 | case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */ |
| @@ -892,7 +902,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) | |||
| 892 | #endif | 902 | #endif |
| 893 | 903 | ||
| 894 | } /* end of address reply case */ | 904 | } /* end of address reply case */ |
| 895 | 905 | out: | |
| 896 | /* Unmap the DMA buffers, if any. */ | 906 | /* Unmap the DMA buffers, if any. */ |
| 897 | scsi_dma_unmap(sc); | 907 | scsi_dma_unmap(sc); |
| 898 | 908 | ||
| @@ -1729,9 +1739,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt) | |||
| 1729 | */ | 1739 | */ |
| 1730 | mf = MPT_INDEX_2_MFPTR(ioc, scpnt_idx); | 1740 | mf = MPT_INDEX_2_MFPTR(ioc, scpnt_idx); |
| 1731 | ctx2abort = mf->u.frame.hwhdr.msgctxu.MsgContext; | 1741 | ctx2abort = mf->u.frame.hwhdr.msgctxu.MsgContext; |
| 1732 | |||
| 1733 | hd->abortSCpnt = SCpnt; | ||
| 1734 | |||
| 1735 | retval = mptscsih_IssueTaskMgmt(hd, | 1742 | retval = mptscsih_IssueTaskMgmt(hd, |
| 1736 | MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK, | 1743 | MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK, |
| 1737 | vdevice->vtarget->channel, | 1744 | vdevice->vtarget->channel, |
| @@ -2293,7 +2300,10 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth) | |||
| 2293 | else | 2300 | else |
| 2294 | max_depth = MPT_SCSI_CMD_PER_DEV_LOW; | 2301 | max_depth = MPT_SCSI_CMD_PER_DEV_LOW; |
| 2295 | } else | 2302 | } else |
| 2296 | max_depth = MPT_SCSI_CMD_PER_DEV_HIGH; | 2303 | max_depth = ioc->sh->can_queue; |
| 2304 | |||
| 2305 | if (!sdev->tagged_supported) | ||
| 2306 | max_depth = 1; | ||
| 2297 | 2307 | ||
| 2298 | if (qdepth > max_depth) | 2308 | if (qdepth > max_depth) |
| 2299 | qdepth = max_depth; | 2309 | qdepth = max_depth; |
| @@ -2627,50 +2637,6 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, | |||
| 2627 | return 1; | 2637 | return 1; |
| 2628 | } | 2638 | } |
| 2629 | 2639 | ||
| 2630 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | ||
| 2631 | /* mptscsih_timer_expired - Call back for timer process. | ||
| 2632 | * Used only for dv functionality. | ||
| 2633 | * @data: Pointer to MPT_SCSI_HOST recast as an unsigned long | ||
| 2634 | * | ||
| 2635 | */ | ||
| 2636 | void | ||
| 2637 | mptscsih_timer_expired(unsigned long data) | ||
| 2638 | { | ||
| 2639 | MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) data; | ||
| 2640 | MPT_ADAPTER *ioc = hd->ioc; | ||
| 2641 | |||
| 2642 | ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired! Cmd %p\n", ioc->name, hd->cmdPtr)); | ||
| 2643 | |||
| 2644 | if (hd->cmdPtr) { | ||
| 2645 | MPIHeader_t *cmd = (MPIHeader_t *)hd->cmdPtr; | ||
| 2646 | |||
| 2647 | if (cmd->Function == MPI_FUNCTION_SCSI_IO_REQUEST) { | ||
| 2648 | /* Desire to issue a task management request here. | ||
| 2649 | * TM requests MUST be single threaded. | ||
| 2650 | * If old eh code and no TM current, issue request. | ||
| 2651 | * If new eh code, do nothing. Wait for OS cmd timeout | ||
| 2652 | * for bus reset. | ||
| 2653 | */ | ||
| 2654 | } else { | ||
| 2655 | /* Perform a FW reload */ | ||
| 2656 | if (mpt_HardResetHandler(ioc, NO_SLEEP) < 0) { | ||
| 2657 | printk(MYIOC_s_WARN_FMT "Firmware Reload FAILED!\n", ioc->name); | ||
| 2658 | } | ||
| 2659 | } | ||
| 2660 | } else { | ||
| 2661 | /* This should NEVER happen */ | ||
| 2662 | printk(MYIOC_s_WARN_FMT "Null cmdPtr!!!!\n", ioc->name); | ||
| 2663 | } | ||
| 2664 | |||
| 2665 | /* No more processing. | ||
| 2666 | * TM call will generate an interrupt for SCSI TM Management. | ||
| 2667 | * The FW will reply to all outstanding commands, callback will finish cleanup. | ||
| 2668 | * Hard reset clean-up will free all resources. | ||
| 2669 | */ | ||
| 2670 | ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired Complete!\n", ioc->name)); | ||
| 2671 | |||
| 2672 | return; | ||
| 2673 | } | ||
| 2674 | 2640 | ||
| 2675 | /** | 2641 | /** |
| 2676 | * mptscsih_get_completion_code - | 2642 | * mptscsih_get_completion_code - |
| @@ -3265,6 +3231,5 @@ EXPORT_SYMBOL(mptscsih_scandv_complete); | |||
| 3265 | EXPORT_SYMBOL(mptscsih_event_process); | 3231 | EXPORT_SYMBOL(mptscsih_event_process); |
| 3266 | EXPORT_SYMBOL(mptscsih_ioc_reset); | 3232 | EXPORT_SYMBOL(mptscsih_ioc_reset); |
| 3267 | EXPORT_SYMBOL(mptscsih_change_queue_depth); | 3233 | EXPORT_SYMBOL(mptscsih_change_queue_depth); |
| 3268 | EXPORT_SYMBOL(mptscsih_timer_expired); | ||
| 3269 | 3234 | ||
| 3270 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 3235 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
diff --git a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h index eb3f677528ac..e0b33e04a33b 100644 --- a/drivers/message/fusion/mptscsih.h +++ b/drivers/message/fusion/mptscsih.h | |||
| @@ -129,7 +129,6 @@ extern int mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRA | |||
| 129 | extern int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply); | 129 | extern int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply); |
| 130 | extern int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset); | 130 | extern int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset); |
| 131 | extern int mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth); | 131 | extern int mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth); |
| 132 | extern void mptscsih_timer_expired(unsigned long data); | ||
| 133 | extern u8 mptscsih_raid_id_to_num(MPT_ADAPTER *ioc, u8 channel, u8 id); | 132 | extern u8 mptscsih_raid_id_to_num(MPT_ADAPTER *ioc, u8 channel, u8 id); |
| 134 | extern int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, u8 channel, u8 id); | 133 | extern int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, u8 channel, u8 id); |
| 135 | extern struct device_attribute *mptscsih_host_attrs[]; | 134 | extern struct device_attribute *mptscsih_host_attrs[]; |
diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index c5b808fd55ba..69f4257419b5 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c | |||
| @@ -1472,28 +1472,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1472 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", | 1472 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", |
| 1473 | ioc->name, ioc->ScsiLookup)); | 1473 | ioc->name, ioc->ScsiLookup)); |
| 1474 | 1474 | ||
| 1475 | /* Clear the TM flags | ||
| 1476 | */ | ||
| 1477 | hd->abortSCpnt = NULL; | ||
| 1478 | |||
| 1479 | /* Clear the pointer used to store | ||
| 1480 | * single-threaded commands, i.e., those | ||
| 1481 | * issued during a bus scan, dv and | ||
| 1482 | * configuration pages. | ||
| 1483 | */ | ||
| 1484 | hd->cmdPtr = NULL; | ||
| 1485 | |||
| 1486 | /* Initialize this SCSI Hosts' timers | ||
| 1487 | * To use, set the timer expires field | ||
| 1488 | * and add_timer | ||
| 1489 | */ | ||
| 1490 | init_timer(&hd->timer); | ||
| 1491 | hd->timer.data = (unsigned long) hd; | ||
| 1492 | hd->timer.function = mptscsih_timer_expired; | ||
| 1493 | |||
| 1494 | ioc->spi_data.Saf_Te = mpt_saf_te; | 1475 | ioc->spi_data.Saf_Te = mpt_saf_te; |
| 1495 | |||
| 1496 | hd->negoNvram = MPT_SCSICFG_USE_NVRAM; | ||
| 1497 | ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT | 1476 | ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT |
| 1498 | "saf_te %x\n", | 1477 | "saf_te %x\n", |
| 1499 | ioc->name, | 1478 | ioc->name, |
