diff options
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_transport.c')
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_transport.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_transport.c b/drivers/scsi/mpt2sas/mpt2sas_transport.c index 686695b155c..a53086d0381 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_transport.c +++ b/drivers/scsi/mpt2sas/mpt2sas_transport.c | |||
@@ -140,11 +140,18 @@ _transport_set_identify(struct MPT2SAS_ADAPTER *ioc, u16 handle, | |||
140 | u32 device_info; | 140 | u32 device_info; |
141 | u32 ioc_status; | 141 | u32 ioc_status; |
142 | 142 | ||
143 | if (ioc->shost_recovery) { | ||
144 | printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", | ||
145 | __func__, ioc->name); | ||
146 | return -EFAULT; | ||
147 | } | ||
148 | |||
143 | if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0, | 149 | if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0, |
144 | MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) { | 150 | MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) { |
145 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | 151 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", |
152 | |||
146 | ioc->name, __FILE__, __LINE__, __func__); | 153 | ioc->name, __FILE__, __LINE__, __func__); |
147 | return -1; | 154 | return -ENXIO; |
148 | } | 155 | } |
149 | 156 | ||
150 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | 157 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & |
@@ -153,7 +160,7 @@ _transport_set_identify(struct MPT2SAS_ADAPTER *ioc, u16 handle, | |||
153 | printk(MPT2SAS_ERR_FMT "handle(0x%04x), ioc_status(0x%04x)" | 160 | printk(MPT2SAS_ERR_FMT "handle(0x%04x), ioc_status(0x%04x)" |
154 | "\nfailure at %s:%d/%s()!\n", ioc->name, handle, ioc_status, | 161 | "\nfailure at %s:%d/%s()!\n", ioc->name, handle, ioc_status, |
155 | __FILE__, __LINE__, __func__); | 162 | __FILE__, __LINE__, __func__); |
156 | return -1; | 163 | return -EIO; |
157 | } | 164 | } |
158 | 165 | ||
159 | memset(identify, 0, sizeof(identify)); | 166 | memset(identify, 0, sizeof(identify)); |
@@ -288,21 +295,17 @@ _transport_expander_report_manufacture(struct MPT2SAS_ADAPTER *ioc, | |||
288 | void *psge; | 295 | void *psge; |
289 | u32 sgl_flags; | 296 | u32 sgl_flags; |
290 | u8 issue_reset = 0; | 297 | u8 issue_reset = 0; |
291 | unsigned long flags; | ||
292 | void *data_out = NULL; | 298 | void *data_out = NULL; |
293 | dma_addr_t data_out_dma; | 299 | dma_addr_t data_out_dma; |
294 | u32 sz; | 300 | u32 sz; |
295 | u64 *sas_address_le; | 301 | u64 *sas_address_le; |
296 | u16 wait_state_count; | 302 | u16 wait_state_count; |
297 | 303 | ||
298 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | 304 | if (ioc->shost_recovery) { |
299 | if (ioc->ioc_reset_in_progress) { | ||
300 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
301 | printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", | 305 | printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", |
302 | __func__, ioc->name); | 306 | __func__, ioc->name); |
303 | return -EFAULT; | 307 | return -EFAULT; |
304 | } | 308 | } |
305 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
306 | 309 | ||
307 | mutex_lock(&ioc->transport_cmds.mutex); | 310 | mutex_lock(&ioc->transport_cmds.mutex); |
308 | 311 | ||
@@ -806,6 +809,12 @@ mpt2sas_transport_update_phy_link_change(struct MPT2SAS_ADAPTER *ioc, | |||
806 | struct _sas_node *sas_node; | 809 | struct _sas_node *sas_node; |
807 | struct _sas_phy *mpt2sas_phy; | 810 | struct _sas_phy *mpt2sas_phy; |
808 | 811 | ||
812 | if (ioc->shost_recovery) { | ||
813 | printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", | ||
814 | __func__, ioc->name); | ||
815 | return; | ||
816 | } | ||
817 | |||
809 | spin_lock_irqsave(&ioc->sas_node_lock, flags); | 818 | spin_lock_irqsave(&ioc->sas_node_lock, flags); |
810 | sas_node = _transport_sas_node_find_by_handle(ioc, handle); | 819 | sas_node = _transport_sas_node_find_by_handle(ioc, handle); |
811 | spin_unlock_irqrestore(&ioc->sas_node_lock, flags); | 820 | spin_unlock_irqrestore(&ioc->sas_node_lock, flags); |
@@ -1025,7 +1034,6 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, | |||
1025 | void *psge; | 1034 | void *psge; |
1026 | u32 sgl_flags; | 1035 | u32 sgl_flags; |
1027 | u8 issue_reset = 0; | 1036 | u8 issue_reset = 0; |
1028 | unsigned long flags; | ||
1029 | dma_addr_t dma_addr_in = 0; | 1037 | dma_addr_t dma_addr_in = 0; |
1030 | dma_addr_t dma_addr_out = 0; | 1038 | dma_addr_t dma_addr_out = 0; |
1031 | u16 wait_state_count; | 1039 | u16 wait_state_count; |
@@ -1045,14 +1053,11 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, | |||
1045 | return -EINVAL; | 1053 | return -EINVAL; |
1046 | } | 1054 | } |
1047 | 1055 | ||
1048 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | 1056 | if (ioc->shost_recovery) { |
1049 | if (ioc->ioc_reset_in_progress) { | ||
1050 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
1051 | printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", | 1057 | printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n", |
1052 | __func__, ioc->name); | 1058 | __func__, ioc->name); |
1053 | return -EFAULT; | 1059 | return -EFAULT; |
1054 | } | 1060 | } |
1055 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
1056 | 1061 | ||
1057 | rc = mutex_lock_interruptible(&ioc->transport_cmds.mutex); | 1062 | rc = mutex_lock_interruptible(&ioc->transport_cmds.mutex); |
1058 | if (rc) | 1063 | if (rc) |