diff options
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.c | 98 | ||||
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.h | 6 | ||||
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_config.c | 91 | ||||
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_scsih.c | 124 |
4 files changed, 185 insertions, 134 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index f3da592f7bcc..35a13867495e 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c | |||
| @@ -119,6 +119,64 @@ _base_fault_reset_work(struct work_struct *work) | |||
| 119 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | 119 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | /** | ||
| 123 | * mpt2sas_base_start_watchdog - start the fault_reset_work_q | ||
| 124 | * @ioc: pointer to scsi command object | ||
| 125 | * Context: sleep. | ||
| 126 | * | ||
| 127 | * Return nothing. | ||
| 128 | */ | ||
| 129 | void | ||
| 130 | mpt2sas_base_start_watchdog(struct MPT2SAS_ADAPTER *ioc) | ||
| 131 | { | ||
| 132 | unsigned long flags; | ||
| 133 | |||
| 134 | if (ioc->fault_reset_work_q) | ||
| 135 | return; | ||
| 136 | |||
| 137 | /* initialize fault polling */ | ||
| 138 | INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work); | ||
| 139 | snprintf(ioc->fault_reset_work_q_name, | ||
| 140 | sizeof(ioc->fault_reset_work_q_name), "poll_%d_status", ioc->id); | ||
| 141 | ioc->fault_reset_work_q = | ||
| 142 | create_singlethread_workqueue(ioc->fault_reset_work_q_name); | ||
| 143 | if (!ioc->fault_reset_work_q) { | ||
| 144 | printk(MPT2SAS_ERR_FMT "%s: failed (line=%d)\n", | ||
| 145 | ioc->name, __func__, __LINE__); | ||
| 146 | return; | ||
| 147 | } | ||
| 148 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 149 | if (ioc->fault_reset_work_q) | ||
| 150 | queue_delayed_work(ioc->fault_reset_work_q, | ||
| 151 | &ioc->fault_reset_work, | ||
| 152 | msecs_to_jiffies(FAULT_POLLING_INTERVAL)); | ||
| 153 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 154 | } | ||
| 155 | |||
| 156 | /** | ||
| 157 | * mpt2sas_base_stop_watchdog - stop the fault_reset_work_q | ||
| 158 | * @ioc: pointer to scsi command object | ||
| 159 | * Context: sleep. | ||
| 160 | * | ||
| 161 | * Return nothing. | ||
| 162 | */ | ||
| 163 | void | ||
| 164 | mpt2sas_base_stop_watchdog(struct MPT2SAS_ADAPTER *ioc) | ||
| 165 | { | ||
| 166 | unsigned long flags; | ||
| 167 | struct workqueue_struct *wq; | ||
| 168 | |||
| 169 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 170 | wq = ioc->fault_reset_work_q; | ||
| 171 | ioc->fault_reset_work_q = NULL; | ||
| 172 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 173 | if (wq) { | ||
| 174 | if (!cancel_delayed_work(&ioc->fault_reset_work)) | ||
| 175 | flush_workqueue(wq); | ||
| 176 | destroy_workqueue(wq); | ||
| 177 | } | ||
| 178 | } | ||
| 179 | |||
| 122 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING | 180 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING |
| 123 | /** | 181 | /** |
| 124 | * _base_sas_ioc_info - verbose translation of the ioc status | 182 | * _base_sas_ioc_info - verbose translation of the ioc status |
| @@ -440,6 +498,10 @@ _base_sas_log_info(struct MPT2SAS_ADAPTER *ioc , u32 log_info) | |||
| 440 | if (sas_loginfo.dw.bus_type != 3 /*SAS*/) | 498 | if (sas_loginfo.dw.bus_type != 3 /*SAS*/) |
| 441 | return; | 499 | return; |
| 442 | 500 | ||
| 501 | /* each nexus loss loginfo */ | ||
| 502 | if (log_info == 0x31170000) | ||
| 503 | return; | ||
| 504 | |||
| 443 | /* eat the loginfos associated with task aborts */ | 505 | /* eat the loginfos associated with task aborts */ |
| 444 | if (ioc->ignore_loginfos && (log_info == 30050000 || log_info == | 506 | if (ioc->ignore_loginfos && (log_info == 30050000 || log_info == |
| 445 | 0x31140000 || log_info == 0x31130000)) | 507 | 0x31140000 || log_info == 0x31130000)) |
| @@ -1109,7 +1171,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc) | |||
| 1109 | } | 1171 | } |
| 1110 | } | 1172 | } |
| 1111 | 1173 | ||
| 1112 | pci_set_drvdata(pdev, ioc->shost); | ||
| 1113 | _base_mask_interrupts(ioc); | 1174 | _base_mask_interrupts(ioc); |
| 1114 | r = _base_enable_msix(ioc); | 1175 | r = _base_enable_msix(ioc); |
| 1115 | if (r) | 1176 | if (r) |
| @@ -1132,7 +1193,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc) | |||
| 1132 | ioc->pci_irq = -1; | 1193 | ioc->pci_irq = -1; |
| 1133 | pci_release_selected_regions(ioc->pdev, ioc->bars); | 1194 | pci_release_selected_regions(ioc->pdev, ioc->bars); |
| 1134 | pci_disable_device(pdev); | 1195 | pci_disable_device(pdev); |
| 1135 | pci_set_drvdata(pdev, NULL); | ||
| 1136 | return r; | 1196 | return r; |
| 1137 | } | 1197 | } |
| 1138 | 1198 | ||
| @@ -3191,7 +3251,6 @@ mpt2sas_base_free_resources(struct MPT2SAS_ADAPTER *ioc) | |||
| 3191 | ioc->chip_phys = 0; | 3251 | ioc->chip_phys = 0; |
| 3192 | pci_release_selected_regions(ioc->pdev, ioc->bars); | 3252 | pci_release_selected_regions(ioc->pdev, ioc->bars); |
| 3193 | pci_disable_device(pdev); | 3253 | pci_disable_device(pdev); |
| 3194 | pci_set_drvdata(pdev, NULL); | ||
| 3195 | return; | 3254 | return; |
| 3196 | } | 3255 | } |
| 3197 | 3256 | ||
| @@ -3205,7 +3264,6 @@ int | |||
| 3205 | mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | 3264 | mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) |
| 3206 | { | 3265 | { |
| 3207 | int r, i; | 3266 | int r, i; |
| 3208 | unsigned long flags; | ||
| 3209 | 3267 | ||
| 3210 | dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, | 3268 | dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, |
| 3211 | __func__)); | 3269 | __func__)); |
| @@ -3214,6 +3272,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | |||
| 3214 | if (r) | 3272 | if (r) |
| 3215 | return r; | 3273 | return r; |
| 3216 | 3274 | ||
| 3275 | pci_set_drvdata(ioc->pdev, ioc->shost); | ||
| 3217 | r = _base_make_ioc_ready(ioc, CAN_SLEEP, SOFT_RESET); | 3276 | r = _base_make_ioc_ready(ioc, CAN_SLEEP, SOFT_RESET); |
| 3218 | if (r) | 3277 | if (r) |
| 3219 | goto out_free_resources; | 3278 | goto out_free_resources; |
| @@ -3288,23 +3347,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | |||
| 3288 | if (r) | 3347 | if (r) |
| 3289 | goto out_free_resources; | 3348 | goto out_free_resources; |
| 3290 | 3349 | ||
| 3291 | /* initialize fault polling */ | 3350 | mpt2sas_base_start_watchdog(ioc); |
| 3292 | INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work); | ||
| 3293 | snprintf(ioc->fault_reset_work_q_name, | ||
| 3294 | sizeof(ioc->fault_reset_work_q_name), "poll_%d_status", ioc->id); | ||
| 3295 | ioc->fault_reset_work_q = | ||
| 3296 | create_singlethread_workqueue(ioc->fault_reset_work_q_name); | ||
| 3297 | if (!ioc->fault_reset_work_q) { | ||
| 3298 | printk(MPT2SAS_ERR_FMT "%s: failed (line=%d)\n", | ||
| 3299 | ioc->name, __func__, __LINE__); | ||
| 3300 | goto out_free_resources; | ||
| 3301 | } | ||
| 3302 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 3303 | if (ioc->fault_reset_work_q) | ||
| 3304 | queue_delayed_work(ioc->fault_reset_work_q, | ||
| 3305 | &ioc->fault_reset_work, | ||
| 3306 | msecs_to_jiffies(FAULT_POLLING_INTERVAL)); | ||
| 3307 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 3308 | return 0; | 3351 | return 0; |
| 3309 | 3352 | ||
| 3310 | out_free_resources: | 3353 | out_free_resources: |
| @@ -3312,6 +3355,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | |||
| 3312 | ioc->remove_host = 1; | 3355 | ioc->remove_host = 1; |
| 3313 | mpt2sas_base_free_resources(ioc); | 3356 | mpt2sas_base_free_resources(ioc); |
| 3314 | _base_release_memory_pools(ioc); | 3357 | _base_release_memory_pools(ioc); |
| 3358 | pci_set_drvdata(ioc->pdev, NULL); | ||
| 3315 | kfree(ioc->tm_cmds.reply); | 3359 | kfree(ioc->tm_cmds.reply); |
| 3316 | kfree(ioc->transport_cmds.reply); | 3360 | kfree(ioc->transport_cmds.reply); |
| 3317 | kfree(ioc->config_cmds.reply); | 3361 | kfree(ioc->config_cmds.reply); |
| @@ -3337,22 +3381,14 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | |||
| 3337 | void | 3381 | void |
| 3338 | mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc) | 3382 | mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc) |
| 3339 | { | 3383 | { |
| 3340 | unsigned long flags; | ||
| 3341 | struct workqueue_struct *wq; | ||
| 3342 | 3384 | ||
| 3343 | dexitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, | 3385 | dexitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, |
| 3344 | __func__)); | 3386 | __func__)); |
| 3345 | 3387 | ||
| 3346 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | 3388 | mpt2sas_base_stop_watchdog(ioc); |
| 3347 | wq = ioc->fault_reset_work_q; | ||
| 3348 | ioc->fault_reset_work_q = NULL; | ||
| 3349 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 3350 | if (!cancel_delayed_work(&ioc->fault_reset_work)) | ||
| 3351 | flush_workqueue(wq); | ||
| 3352 | destroy_workqueue(wq); | ||
| 3353 | |||
| 3354 | mpt2sas_base_free_resources(ioc); | 3389 | mpt2sas_base_free_resources(ioc); |
| 3355 | _base_release_memory_pools(ioc); | 3390 | _base_release_memory_pools(ioc); |
| 3391 | pci_set_drvdata(ioc->pdev, NULL); | ||
| 3356 | kfree(ioc->pfacts); | 3392 | kfree(ioc->pfacts); |
| 3357 | kfree(ioc->ctl_cmds.reply); | 3393 | kfree(ioc->ctl_cmds.reply); |
| 3358 | kfree(ioc->base_cmds.reply); | 3394 | kfree(ioc->base_cmds.reply); |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.h b/drivers/scsi/mpt2sas/mpt2sas_base.h index 286c185fa9e4..acdcff150a35 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.h +++ b/drivers/scsi/mpt2sas/mpt2sas_base.h | |||
| @@ -69,10 +69,10 @@ | |||
| 69 | #define MPT2SAS_DRIVER_NAME "mpt2sas" | 69 | #define MPT2SAS_DRIVER_NAME "mpt2sas" |
| 70 | #define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>" | 70 | #define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>" |
| 71 | #define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver" | 71 | #define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver" |
| 72 | #define MPT2SAS_DRIVER_VERSION "01.100.03.00" | 72 | #define MPT2SAS_DRIVER_VERSION "01.100.04.00" |
| 73 | #define MPT2SAS_MAJOR_VERSION 01 | 73 | #define MPT2SAS_MAJOR_VERSION 01 |
| 74 | #define MPT2SAS_MINOR_VERSION 100 | 74 | #define MPT2SAS_MINOR_VERSION 100 |
| 75 | #define MPT2SAS_BUILD_VERSION 03 | 75 | #define MPT2SAS_BUILD_VERSION 04 |
| 76 | #define MPT2SAS_RELEASE_VERSION 00 | 76 | #define MPT2SAS_RELEASE_VERSION 00 |
| 77 | 77 | ||
| 78 | /* | 78 | /* |
| @@ -673,6 +673,8 @@ typedef void (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, | |||
| 673 | 673 | ||
| 674 | /* base shared API */ | 674 | /* base shared API */ |
| 675 | extern struct list_head mpt2sas_ioc_list; | 675 | extern struct list_head mpt2sas_ioc_list; |
| 676 | void mpt2sas_base_start_watchdog(struct MPT2SAS_ADAPTER *ioc); | ||
| 677 | void mpt2sas_base_stop_watchdog(struct MPT2SAS_ADAPTER *ioc); | ||
| 676 | 678 | ||
| 677 | int mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc); | 679 | int mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc); |
| 678 | void mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc); | 680 | void mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc); |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_config.c b/drivers/scsi/mpt2sas/mpt2sas_config.c index 58cfb97846f7..6ddee161beb3 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_config.c +++ b/drivers/scsi/mpt2sas/mpt2sas_config.c | |||
| @@ -236,17 +236,25 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
| 236 | Mpi2ConfigRequest_t *config_request; | 236 | Mpi2ConfigRequest_t *config_request; |
| 237 | int r; | 237 | int r; |
| 238 | u8 retry_count; | 238 | u8 retry_count; |
| 239 | u8 issue_reset; | 239 | u8 issue_host_reset = 0; |
| 240 | u16 wait_state_count; | 240 | u16 wait_state_count; |
| 241 | 241 | ||
| 242 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 242 | if (ioc->config_cmds.status != MPT2_CMD_NOT_USED) { | 243 | if (ioc->config_cmds.status != MPT2_CMD_NOT_USED) { |
| 243 | printk(MPT2SAS_ERR_FMT "%s: config_cmd in use\n", | 244 | printk(MPT2SAS_ERR_FMT "%s: config_cmd in use\n", |
| 244 | ioc->name, __func__); | 245 | ioc->name, __func__); |
| 246 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 245 | return -EAGAIN; | 247 | return -EAGAIN; |
| 246 | } | 248 | } |
| 247 | retry_count = 0; | 249 | retry_count = 0; |
| 248 | 250 | ||
| 249 | retry_config: | 251 | retry_config: |
| 252 | if (retry_count) { | ||
| 253 | if (retry_count > 2) /* attempt only 2 retries */ | ||
| 254 | return -EFAULT; | ||
| 255 | printk(MPT2SAS_INFO_FMT "%s: attempting retry (%d)\n", | ||
| 256 | ioc->name, __func__, retry_count); | ||
| 257 | } | ||
| 250 | wait_state_count = 0; | 258 | wait_state_count = 0; |
| 251 | ioc_state = mpt2sas_base_get_iocstate(ioc, 1); | 259 | ioc_state = mpt2sas_base_get_iocstate(ioc, 1); |
| 252 | while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { | 260 | while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { |
| @@ -254,8 +262,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
| 254 | printk(MPT2SAS_ERR_FMT | 262 | printk(MPT2SAS_ERR_FMT |
| 255 | "%s: failed due to ioc not operational\n", | 263 | "%s: failed due to ioc not operational\n", |
| 256 | ioc->name, __func__); | 264 | ioc->name, __func__); |
| 257 | ioc->config_cmds.status = MPT2_CMD_NOT_USED; | 265 | r = -EFAULT; |
| 258 | return -EFAULT; | 266 | goto out; |
| 259 | } | 267 | } |
| 260 | ssleep(1); | 268 | ssleep(1); |
| 261 | ioc_state = mpt2sas_base_get_iocstate(ioc, 1); | 269 | ioc_state = mpt2sas_base_get_iocstate(ioc, 1); |
| @@ -271,8 +279,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
| 271 | if (!smid) { | 279 | if (!smid) { |
| 272 | printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", | 280 | printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", |
| 273 | ioc->name, __func__); | 281 | ioc->name, __func__); |
| 274 | ioc->config_cmds.status = MPT2_CMD_NOT_USED; | 282 | r = -EAGAIN; |
| 275 | return -EAGAIN; | 283 | goto out; |
| 276 | } | 284 | } |
| 277 | 285 | ||
| 278 | r = 0; | 286 | r = 0; |
| @@ -292,9 +300,15 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
| 292 | ioc->name, __func__); | 300 | ioc->name, __func__); |
| 293 | _debug_dump_mf(mpi_request, | 301 | _debug_dump_mf(mpi_request, |
| 294 | sizeof(Mpi2ConfigRequest_t)/4); | 302 | sizeof(Mpi2ConfigRequest_t)/4); |
| 295 | if (!(ioc->config_cmds.status & MPT2_CMD_RESET)) | 303 | retry_count++; |
| 296 | issue_reset = 1; | 304 | if (ioc->config_cmds.smid == smid) |
| 297 | goto issue_host_reset; | 305 | mpt2sas_base_free_smid(ioc, smid); |
| 306 | if ((ioc->shost_recovery) || | ||
| 307 | (ioc->config_cmds.status & MPT2_CMD_RESET)) | ||
| 308 | goto retry_config; | ||
| 309 | issue_host_reset = 1; | ||
| 310 | r = -EFAULT; | ||
| 311 | goto out; | ||
| 298 | } | 312 | } |
| 299 | if (ioc->config_cmds.status & MPT2_CMD_REPLY_VALID) | 313 | if (ioc->config_cmds.status & MPT2_CMD_REPLY_VALID) |
| 300 | memcpy(mpi_reply, ioc->config_cmds.reply, | 314 | memcpy(mpi_reply, ioc->config_cmds.reply, |
| @@ -302,21 +316,13 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
| 302 | if (retry_count) | 316 | if (retry_count) |
| 303 | printk(MPT2SAS_INFO_FMT "%s: retry completed!!\n", | 317 | printk(MPT2SAS_INFO_FMT "%s: retry completed!!\n", |
| 304 | ioc->name, __func__); | 318 | ioc->name, __func__); |
| 319 | out: | ||
| 305 | ioc->config_cmds.status = MPT2_CMD_NOT_USED; | 320 | ioc->config_cmds.status = MPT2_CMD_NOT_USED; |
| 306 | return r; | 321 | mutex_unlock(&ioc->config_cmds.mutex); |
| 307 | 322 | if (issue_host_reset) | |
| 308 | issue_host_reset: | ||
| 309 | if (issue_reset) | ||
| 310 | mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, | 323 | mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, |
| 311 | FORCE_BIG_HAMMER); | 324 | FORCE_BIG_HAMMER); |
| 312 | ioc->config_cmds.status = MPT2_CMD_NOT_USED; | 325 | return r; |
| 313 | if (!retry_count) { | ||
| 314 | printk(MPT2SAS_INFO_FMT "%s: attempting retry\n", | ||
| 315 | ioc->name, __func__); | ||
| 316 | retry_count++; | ||
| 317 | goto retry_config; | ||
| 318 | } | ||
| 319 | return -EFAULT; | ||
| 320 | } | 326 | } |
| 321 | 327 | ||
| 322 | /** | 328 | /** |
| @@ -375,7 +381,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 375 | int r; | 381 | int r; |
| 376 | struct config_request mem; | 382 | struct config_request mem; |
| 377 | 383 | ||
| 378 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 379 | memset(config_page, 0, sizeof(Mpi2ManufacturingPage0_t)); | 384 | memset(config_page, 0, sizeof(Mpi2ManufacturingPage0_t)); |
| 380 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 385 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 381 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 386 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -417,7 +422,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 417 | _config_free_config_dma_memory(ioc, &mem); | 422 | _config_free_config_dma_memory(ioc, &mem); |
| 418 | 423 | ||
| 419 | out: | 424 | out: |
| 420 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 421 | return r; | 425 | return r; |
| 422 | } | 426 | } |
| 423 | 427 | ||
| @@ -438,7 +442,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc, | |||
| 438 | int r; | 442 | int r; |
| 439 | struct config_request mem; | 443 | struct config_request mem; |
| 440 | 444 | ||
| 441 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 442 | memset(config_page, 0, sizeof(Mpi2BiosPage2_t)); | 445 | memset(config_page, 0, sizeof(Mpi2BiosPage2_t)); |
| 443 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 446 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 444 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 447 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -480,7 +483,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc, | |||
| 480 | _config_free_config_dma_memory(ioc, &mem); | 483 | _config_free_config_dma_memory(ioc, &mem); |
| 481 | 484 | ||
| 482 | out: | 485 | out: |
| 483 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 484 | return r; | 486 | return r; |
| 485 | } | 487 | } |
| 486 | 488 | ||
| @@ -501,7 +503,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 501 | int r; | 503 | int r; |
| 502 | struct config_request mem; | 504 | struct config_request mem; |
| 503 | 505 | ||
| 504 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 505 | memset(config_page, 0, sizeof(Mpi2BiosPage3_t)); | 506 | memset(config_page, 0, sizeof(Mpi2BiosPage3_t)); |
| 506 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 507 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 507 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 508 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -543,7 +544,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 543 | _config_free_config_dma_memory(ioc, &mem); | 544 | _config_free_config_dma_memory(ioc, &mem); |
| 544 | 545 | ||
| 545 | out: | 546 | out: |
| 546 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 547 | return r; | 547 | return r; |
| 548 | } | 548 | } |
| 549 | 549 | ||
| @@ -564,7 +564,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 564 | int r; | 564 | int r; |
| 565 | struct config_request mem; | 565 | struct config_request mem; |
| 566 | 566 | ||
| 567 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 568 | memset(config_page, 0, sizeof(Mpi2IOUnitPage0_t)); | 567 | memset(config_page, 0, sizeof(Mpi2IOUnitPage0_t)); |
| 569 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 568 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 570 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 569 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -606,7 +605,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 606 | _config_free_config_dma_memory(ioc, &mem); | 605 | _config_free_config_dma_memory(ioc, &mem); |
| 607 | 606 | ||
| 608 | out: | 607 | out: |
| 609 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 610 | return r; | 608 | return r; |
| 611 | } | 609 | } |
| 612 | 610 | ||
| @@ -627,7 +625,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 627 | int r; | 625 | int r; |
| 628 | struct config_request mem; | 626 | struct config_request mem; |
| 629 | 627 | ||
| 630 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 631 | memset(config_page, 0, sizeof(Mpi2IOUnitPage1_t)); | 628 | memset(config_page, 0, sizeof(Mpi2IOUnitPage1_t)); |
| 632 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 629 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 633 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 630 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -669,7 +666,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 669 | _config_free_config_dma_memory(ioc, &mem); | 666 | _config_free_config_dma_memory(ioc, &mem); |
| 670 | 667 | ||
| 671 | out: | 668 | out: |
| 672 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 673 | return r; | 669 | return r; |
| 674 | } | 670 | } |
| 675 | 671 | ||
| @@ -690,7 +686,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 690 | int r; | 686 | int r; |
| 691 | struct config_request mem; | 687 | struct config_request mem; |
| 692 | 688 | ||
| 693 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 694 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 689 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 695 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 690 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| 696 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; | 691 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; |
| @@ -732,7 +727,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 732 | _config_free_config_dma_memory(ioc, &mem); | 727 | _config_free_config_dma_memory(ioc, &mem); |
| 733 | 728 | ||
| 734 | out: | 729 | out: |
| 735 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 736 | return r; | 730 | return r; |
| 737 | } | 731 | } |
| 738 | 732 | ||
| @@ -753,7 +747,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, | |||
| 753 | int r; | 747 | int r; |
| 754 | struct config_request mem; | 748 | struct config_request mem; |
| 755 | 749 | ||
| 756 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 757 | memset(config_page, 0, sizeof(Mpi2IOCPage8_t)); | 750 | memset(config_page, 0, sizeof(Mpi2IOCPage8_t)); |
| 758 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 751 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 759 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 752 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -795,7 +788,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, | |||
| 795 | _config_free_config_dma_memory(ioc, &mem); | 788 | _config_free_config_dma_memory(ioc, &mem); |
| 796 | 789 | ||
| 797 | out: | 790 | out: |
| 798 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 799 | return r; | 791 | return r; |
| 800 | } | 792 | } |
| 801 | 793 | ||
| @@ -818,7 +810,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 818 | int r; | 810 | int r; |
| 819 | struct config_request mem; | 811 | struct config_request mem; |
| 820 | 812 | ||
| 821 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 822 | memset(config_page, 0, sizeof(Mpi2SasDevicePage0_t)); | 813 | memset(config_page, 0, sizeof(Mpi2SasDevicePage0_t)); |
| 823 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 814 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 824 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 815 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -863,7 +854,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 863 | _config_free_config_dma_memory(ioc, &mem); | 854 | _config_free_config_dma_memory(ioc, &mem); |
| 864 | 855 | ||
| 865 | out: | 856 | out: |
| 866 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 867 | return r; | 857 | return r; |
| 868 | } | 858 | } |
| 869 | 859 | ||
| @@ -886,7 +876,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 886 | int r; | 876 | int r; |
| 887 | struct config_request mem; | 877 | struct config_request mem; |
| 888 | 878 | ||
| 889 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 890 | memset(config_page, 0, sizeof(Mpi2SasDevicePage1_t)); | 879 | memset(config_page, 0, sizeof(Mpi2SasDevicePage1_t)); |
| 891 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 880 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 892 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 881 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -931,7 +920,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 931 | _config_free_config_dma_memory(ioc, &mem); | 920 | _config_free_config_dma_memory(ioc, &mem); |
| 932 | 921 | ||
| 933 | out: | 922 | out: |
| 934 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 935 | return r; | 923 | return r; |
| 936 | } | 924 | } |
| 937 | 925 | ||
| @@ -953,7 +941,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys) | |||
| 953 | Mpi2ConfigReply_t mpi_reply; | 941 | Mpi2ConfigReply_t mpi_reply; |
| 954 | Mpi2SasIOUnitPage0_t config_page; | 942 | Mpi2SasIOUnitPage0_t config_page; |
| 955 | 943 | ||
| 956 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 957 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 944 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 958 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 945 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| 959 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; | 946 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; |
| @@ -1002,7 +989,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys) | |||
| 1002 | _config_free_config_dma_memory(ioc, &mem); | 989 | _config_free_config_dma_memory(ioc, &mem); |
| 1003 | 990 | ||
| 1004 | out: | 991 | out: |
| 1005 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1006 | return r; | 992 | return r; |
| 1007 | } | 993 | } |
| 1008 | 994 | ||
| @@ -1026,8 +1012,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1026 | Mpi2ConfigRequest_t mpi_request; | 1012 | Mpi2ConfigRequest_t mpi_request; |
| 1027 | int r; | 1013 | int r; |
| 1028 | struct config_request mem; | 1014 | struct config_request mem; |
| 1029 | |||
| 1030 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1031 | memset(config_page, 0, sz); | 1015 | memset(config_page, 0, sz); |
| 1032 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1016 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1033 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1017 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1070,7 +1054,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1070 | _config_free_config_dma_memory(ioc, &mem); | 1054 | _config_free_config_dma_memory(ioc, &mem); |
| 1071 | 1055 | ||
| 1072 | out: | 1056 | out: |
| 1073 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1074 | return r; | 1057 | return r; |
| 1075 | } | 1058 | } |
| 1076 | 1059 | ||
| @@ -1095,7 +1078,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1095 | int r; | 1078 | int r; |
| 1096 | struct config_request mem; | 1079 | struct config_request mem; |
| 1097 | 1080 | ||
| 1098 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1099 | memset(config_page, 0, sz); | 1081 | memset(config_page, 0, sz); |
| 1100 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1082 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1101 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1083 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1138,7 +1120,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1138 | _config_free_config_dma_memory(ioc, &mem); | 1120 | _config_free_config_dma_memory(ioc, &mem); |
| 1139 | 1121 | ||
| 1140 | out: | 1122 | out: |
| 1141 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1142 | return r; | 1123 | return r; |
| 1143 | } | 1124 | } |
| 1144 | 1125 | ||
| @@ -1161,7 +1142,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1161 | int r; | 1142 | int r; |
| 1162 | struct config_request mem; | 1143 | struct config_request mem; |
| 1163 | 1144 | ||
| 1164 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1165 | memset(config_page, 0, sizeof(Mpi2ExpanderPage0_t)); | 1145 | memset(config_page, 0, sizeof(Mpi2ExpanderPage0_t)); |
| 1166 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1146 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1167 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1147 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1206,7 +1186,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1206 | _config_free_config_dma_memory(ioc, &mem); | 1186 | _config_free_config_dma_memory(ioc, &mem); |
| 1207 | 1187 | ||
| 1208 | out: | 1188 | out: |
| 1209 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1210 | return r; | 1189 | return r; |
| 1211 | } | 1190 | } |
| 1212 | 1191 | ||
| @@ -1230,7 +1209,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1230 | int r; | 1209 | int r; |
| 1231 | struct config_request mem; | 1210 | struct config_request mem; |
| 1232 | 1211 | ||
| 1233 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1234 | memset(config_page, 0, sizeof(Mpi2ExpanderPage1_t)); | 1212 | memset(config_page, 0, sizeof(Mpi2ExpanderPage1_t)); |
| 1235 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1213 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1236 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1214 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1277,7 +1255,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1277 | _config_free_config_dma_memory(ioc, &mem); | 1255 | _config_free_config_dma_memory(ioc, &mem); |
| 1278 | 1256 | ||
| 1279 | out: | 1257 | out: |
| 1280 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1281 | return r; | 1258 | return r; |
| 1282 | } | 1259 | } |
| 1283 | 1260 | ||
| @@ -1300,7 +1277,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1300 | int r; | 1277 | int r; |
| 1301 | struct config_request mem; | 1278 | struct config_request mem; |
| 1302 | 1279 | ||
| 1303 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1304 | memset(config_page, 0, sizeof(Mpi2SasEnclosurePage0_t)); | 1280 | memset(config_page, 0, sizeof(Mpi2SasEnclosurePage0_t)); |
| 1305 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1281 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1306 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1282 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1345,7 +1321,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1345 | _config_free_config_dma_memory(ioc, &mem); | 1321 | _config_free_config_dma_memory(ioc, &mem); |
| 1346 | 1322 | ||
| 1347 | out: | 1323 | out: |
| 1348 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1349 | return r; | 1324 | return r; |
| 1350 | } | 1325 | } |
| 1351 | 1326 | ||
| @@ -1367,7 +1342,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1367 | int r; | 1342 | int r; |
| 1368 | struct config_request mem; | 1343 | struct config_request mem; |
| 1369 | 1344 | ||
| 1370 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1371 | memset(config_page, 0, sizeof(Mpi2SasPhyPage0_t)); | 1345 | memset(config_page, 0, sizeof(Mpi2SasPhyPage0_t)); |
| 1372 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1346 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1373 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1347 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1413,7 +1387,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1413 | _config_free_config_dma_memory(ioc, &mem); | 1387 | _config_free_config_dma_memory(ioc, &mem); |
| 1414 | 1388 | ||
| 1415 | out: | 1389 | out: |
| 1416 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1417 | return r; | 1390 | return r; |
| 1418 | } | 1391 | } |
| 1419 | 1392 | ||
| @@ -1435,7 +1408,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1435 | int r; | 1408 | int r; |
| 1436 | struct config_request mem; | 1409 | struct config_request mem; |
| 1437 | 1410 | ||
| 1438 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1439 | memset(config_page, 0, sizeof(Mpi2SasPhyPage1_t)); | 1411 | memset(config_page, 0, sizeof(Mpi2SasPhyPage1_t)); |
| 1440 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1412 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1441 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1413 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1481,7 +1453,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1481 | _config_free_config_dma_memory(ioc, &mem); | 1453 | _config_free_config_dma_memory(ioc, &mem); |
| 1482 | 1454 | ||
| 1483 | out: | 1455 | out: |
| 1484 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1485 | return r; | 1456 | return r; |
| 1486 | } | 1457 | } |
| 1487 | 1458 | ||
| @@ -1505,7 +1476,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 1505 | int r; | 1476 | int r; |
| 1506 | struct config_request mem; | 1477 | struct config_request mem; |
| 1507 | 1478 | ||
| 1508 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1509 | memset(config_page, 0, sizeof(Mpi2RaidVolPage1_t)); | 1479 | memset(config_page, 0, sizeof(Mpi2RaidVolPage1_t)); |
| 1510 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1480 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1511 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1481 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1548,7 +1518,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 1548 | _config_free_config_dma_memory(ioc, &mem); | 1518 | _config_free_config_dma_memory(ioc, &mem); |
| 1549 | 1519 | ||
| 1550 | out: | 1520 | out: |
| 1551 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1552 | return r; | 1521 | return r; |
| 1553 | } | 1522 | } |
| 1554 | 1523 | ||
| @@ -1572,7 +1541,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle, | |||
| 1572 | struct config_request mem; | 1541 | struct config_request mem; |
| 1573 | u16 ioc_status; | 1542 | u16 ioc_status; |
| 1574 | 1543 | ||
| 1575 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1576 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1544 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1577 | *num_pds = 0; | 1545 | *num_pds = 0; |
| 1578 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1546 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1620,7 +1588,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle, | |||
| 1620 | _config_free_config_dma_memory(ioc, &mem); | 1588 | _config_free_config_dma_memory(ioc, &mem); |
| 1621 | 1589 | ||
| 1622 | out: | 1590 | out: |
| 1623 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1624 | return r; | 1591 | return r; |
| 1625 | } | 1592 | } |
| 1626 | 1593 | ||
| @@ -1645,7 +1612,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 1645 | int r; | 1612 | int r; |
| 1646 | struct config_request mem; | 1613 | struct config_request mem; |
| 1647 | 1614 | ||
| 1648 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1649 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1615 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1650 | memset(config_page, 0, sz); | 1616 | memset(config_page, 0, sz); |
| 1651 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1617 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1687,7 +1653,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 1687 | _config_free_config_dma_memory(ioc, &mem); | 1653 | _config_free_config_dma_memory(ioc, &mem); |
| 1688 | 1654 | ||
| 1689 | out: | 1655 | out: |
| 1690 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1691 | return r; | 1656 | return r; |
| 1692 | } | 1657 | } |
| 1693 | 1658 | ||
| @@ -1711,7 +1676,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1711 | int r; | 1676 | int r; |
| 1712 | struct config_request mem; | 1677 | struct config_request mem; |
| 1713 | 1678 | ||
| 1714 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1715 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1679 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1716 | memset(config_page, 0, sizeof(Mpi2RaidPhysDiskPage0_t)); | 1680 | memset(config_page, 0, sizeof(Mpi2RaidPhysDiskPage0_t)); |
| 1717 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1681 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1754,7 +1718,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1754 | _config_free_config_dma_memory(ioc, &mem); | 1718 | _config_free_config_dma_memory(ioc, &mem); |
| 1755 | 1719 | ||
| 1756 | out: | 1720 | out: |
| 1757 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1758 | return r; | 1721 | return r; |
| 1759 | } | 1722 | } |
| 1760 | 1723 | ||
| @@ -1778,7 +1741,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle, | |||
| 1778 | struct config_request mem; | 1741 | struct config_request mem; |
| 1779 | u16 ioc_status; | 1742 | u16 ioc_status; |
| 1780 | 1743 | ||
| 1781 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1782 | *volume_handle = 0; | 1744 | *volume_handle = 0; |
| 1783 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1745 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1784 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1746 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1842,7 +1804,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle, | |||
| 1842 | _config_free_config_dma_memory(ioc, &mem); | 1804 | _config_free_config_dma_memory(ioc, &mem); |
| 1843 | 1805 | ||
| 1844 | out: | 1806 | out: |
| 1845 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1846 | return r; | 1807 | return r; |
| 1847 | } | 1808 | } |
| 1848 | 1809 | ||
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 2a01a5f2a84d..2e9a4445596f 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | |||
| @@ -2767,6 +2767,10 @@ _scsih_scsi_ioc_info(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd *scmd, | |||
| 2767 | char *desc_ioc_state = NULL; | 2767 | char *desc_ioc_state = NULL; |
| 2768 | char *desc_scsi_status = NULL; | 2768 | char *desc_scsi_status = NULL; |
| 2769 | char *desc_scsi_state = ioc->tmp_string; | 2769 | char *desc_scsi_state = ioc->tmp_string; |
| 2770 | u32 log_info = le32_to_cpu(mpi_reply->IOCLogInfo); | ||
| 2771 | |||
| 2772 | if (log_info == 0x31170000) | ||
| 2773 | return; | ||
| 2770 | 2774 | ||
| 2771 | switch (ioc_status) { | 2775 | switch (ioc_status) { |
| 2772 | case MPI2_IOCSTATUS_SUCCESS: | 2776 | case MPI2_IOCSTATUS_SUCCESS: |
| @@ -3426,7 +3430,7 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
| 3426 | __le64 sas_address; | 3430 | __le64 sas_address; |
| 3427 | int i; | 3431 | int i; |
| 3428 | unsigned long flags; | 3432 | unsigned long flags; |
| 3429 | struct _sas_port *mpt2sas_port; | 3433 | struct _sas_port *mpt2sas_port = NULL; |
| 3430 | int rc = 0; | 3434 | int rc = 0; |
| 3431 | 3435 | ||
| 3432 | if (!handle) | 3436 | if (!handle) |
| @@ -3518,12 +3522,20 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
| 3518 | &expander_pg1, i, handle))) { | 3522 | &expander_pg1, i, handle))) { |
| 3519 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | 3523 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", |
| 3520 | ioc->name, __FILE__, __LINE__, __func__); | 3524 | ioc->name, __FILE__, __LINE__, __func__); |
| 3521 | continue; | 3525 | rc = -1; |
| 3526 | goto out_fail; | ||
| 3522 | } | 3527 | } |
| 3523 | sas_expander->phy[i].handle = handle; | 3528 | sas_expander->phy[i].handle = handle; |
| 3524 | sas_expander->phy[i].phy_id = i; | 3529 | sas_expander->phy[i].phy_id = i; |
| 3525 | mpt2sas_transport_add_expander_phy(ioc, &sas_expander->phy[i], | 3530 | |
| 3526 | expander_pg1, sas_expander->parent_dev); | 3531 | if ((mpt2sas_transport_add_expander_phy(ioc, |
| 3532 | &sas_expander->phy[i], expander_pg1, | ||
| 3533 | sas_expander->parent_dev))) { | ||
| 3534 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
| 3535 | ioc->name, __FILE__, __LINE__, __func__); | ||
| 3536 | rc = -1; | ||
| 3537 | goto out_fail; | ||
| 3538 | } | ||
| 3527 | } | 3539 | } |
| 3528 | 3540 | ||
| 3529 | if (sas_expander->enclosure_handle) { | 3541 | if (sas_expander->enclosure_handle) { |
| @@ -3540,8 +3552,9 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
| 3540 | 3552 | ||
| 3541 | out_fail: | 3553 | out_fail: |
| 3542 | 3554 | ||
| 3543 | if (sas_expander) | 3555 | if (mpt2sas_port) |
| 3544 | kfree(sas_expander->phy); | 3556 | mpt2sas_transport_port_remove(ioc, sas_expander->sas_address, |
| 3557 | sas_expander->parent_handle); | ||
| 3545 | kfree(sas_expander); | 3558 | kfree(sas_expander); |
| 3546 | return rc; | 3559 | return rc; |
| 3547 | } | 3560 | } |
| @@ -3663,12 +3676,11 @@ _scsih_add_device(struct MPT2SAS_ADAPTER *ioc, u16 handle, u8 phy_num, u8 is_pd) | |||
| 3663 | sas_device->hidden_raid_component = is_pd; | 3676 | sas_device->hidden_raid_component = is_pd; |
| 3664 | 3677 | ||
| 3665 | /* get enclosure_logical_id */ | 3678 | /* get enclosure_logical_id */ |
| 3666 | if (!(mpt2sas_config_get_enclosure_pg0(ioc, &mpi_reply, &enclosure_pg0, | 3679 | if (sas_device->enclosure_handle && !(mpt2sas_config_get_enclosure_pg0( |
| 3667 | MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE, | 3680 | ioc, &mpi_reply, &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE, |
| 3668 | sas_device->enclosure_handle))) { | 3681 | sas_device->enclosure_handle))) |
| 3669 | sas_device->enclosure_logical_id = | 3682 | sas_device->enclosure_logical_id = |
| 3670 | le64_to_cpu(enclosure_pg0.EnclosureLogicalID); | 3683 | le64_to_cpu(enclosure_pg0.EnclosureLogicalID); |
| 3671 | } | ||
| 3672 | 3684 | ||
| 3673 | /* get device name */ | 3685 | /* get device name */ |
| 3674 | sas_device->device_name = le64_to_cpu(sas_device_pg0.DeviceName); | 3686 | sas_device->device_name = le64_to_cpu(sas_device_pg0.DeviceName); |
| @@ -4250,12 +4262,6 @@ _scsih_sas_volume_add(struct MPT2SAS_ADAPTER *ioc, | |||
| 4250 | u16 handle = le16_to_cpu(element->VolDevHandle); | 4262 | u16 handle = le16_to_cpu(element->VolDevHandle); |
| 4251 | int rc; | 4263 | int rc; |
| 4252 | 4264 | ||
| 4253 | #if 0 /* RAID_HACKS */ | ||
| 4254 | if (le32_to_cpu(event_data->Flags) & | ||
| 4255 | MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) | ||
| 4256 | return; | ||
| 4257 | #endif | ||
| 4258 | |||
| 4259 | mpt2sas_config_get_volume_wwid(ioc, handle, &wwid); | 4265 | mpt2sas_config_get_volume_wwid(ioc, handle, &wwid); |
| 4260 | if (!wwid) { | 4266 | if (!wwid) { |
| 4261 | printk(MPT2SAS_ERR_FMT | 4267 | printk(MPT2SAS_ERR_FMT |
| @@ -4310,12 +4316,6 @@ _scsih_sas_volume_delete(struct MPT2SAS_ADAPTER *ioc, | |||
| 4310 | unsigned long flags; | 4316 | unsigned long flags; |
| 4311 | struct MPT2SAS_TARGET *sas_target_priv_data; | 4317 | struct MPT2SAS_TARGET *sas_target_priv_data; |
| 4312 | 4318 | ||
| 4313 | #if 0 /* RAID_HACKS */ | ||
| 4314 | if (le32_to_cpu(event_data->Flags) & | ||
| 4315 | MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) | ||
| 4316 | return; | ||
| 4317 | #endif | ||
| 4318 | |||
| 4319 | spin_lock_irqsave(&ioc->raid_device_lock, flags); | 4319 | spin_lock_irqsave(&ioc->raid_device_lock, flags); |
| 4320 | raid_device = _scsih_raid_device_find_by_handle(ioc, handle); | 4320 | raid_device = _scsih_raid_device_find_by_handle(ioc, handle); |
| 4321 | spin_unlock_irqrestore(&ioc->raid_device_lock, flags); | 4321 | spin_unlock_irqrestore(&ioc->raid_device_lock, flags); |
| @@ -4428,14 +4428,38 @@ _scsih_sas_pd_add(struct MPT2SAS_ADAPTER *ioc, | |||
| 4428 | struct _sas_device *sas_device; | 4428 | struct _sas_device *sas_device; |
| 4429 | unsigned long flags; | 4429 | unsigned long flags; |
| 4430 | u16 handle = le16_to_cpu(element->PhysDiskDevHandle); | 4430 | u16 handle = le16_to_cpu(element->PhysDiskDevHandle); |
| 4431 | Mpi2ConfigReply_t mpi_reply; | ||
| 4432 | Mpi2SasDevicePage0_t sas_device_pg0; | ||
| 4433 | u32 ioc_status; | ||
| 4431 | 4434 | ||
| 4432 | spin_lock_irqsave(&ioc->sas_device_lock, flags); | 4435 | spin_lock_irqsave(&ioc->sas_device_lock, flags); |
| 4433 | sas_device = _scsih_sas_device_find_by_handle(ioc, handle); | 4436 | sas_device = _scsih_sas_device_find_by_handle(ioc, handle); |
| 4434 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | 4437 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); |
| 4435 | if (sas_device) | 4438 | if (sas_device) { |
| 4436 | sas_device->hidden_raid_component = 1; | 4439 | sas_device->hidden_raid_component = 1; |
| 4437 | else | 4440 | return; |
| 4438 | _scsih_add_device(ioc, handle, 0, 1); | 4441 | } |
| 4442 | |||
| 4443 | if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0, | ||
| 4444 | MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) { | ||
| 4445 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
| 4446 | ioc->name, __FILE__, __LINE__, __func__); | ||
| 4447 | return; | ||
| 4448 | } | ||
| 4449 | |||
| 4450 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | ||
| 4451 | MPI2_IOCSTATUS_MASK; | ||
| 4452 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { | ||
| 4453 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
| 4454 | ioc->name, __FILE__, __LINE__, __func__); | ||
| 4455 | return; | ||
| 4456 | } | ||
| 4457 | |||
| 4458 | _scsih_link_change(ioc, | ||
| 4459 | le16_to_cpu(sas_device_pg0.ParentDevHandle), | ||
| 4460 | handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5); | ||
| 4461 | |||
| 4462 | _scsih_add_device(ioc, handle, 0, 1); | ||
| 4439 | } | 4463 | } |
| 4440 | 4464 | ||
| 4441 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING | 4465 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING |
| @@ -4535,12 +4559,15 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, | |||
| 4535 | { | 4559 | { |
| 4536 | Mpi2EventIrConfigElement_t *element; | 4560 | Mpi2EventIrConfigElement_t *element; |
| 4537 | int i; | 4561 | int i; |
| 4562 | u8 foreign_config; | ||
| 4538 | 4563 | ||
| 4539 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING | 4564 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING |
| 4540 | if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) | 4565 | if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) |
| 4541 | _scsih_sas_ir_config_change_event_debug(ioc, event_data); | 4566 | _scsih_sas_ir_config_change_event_debug(ioc, event_data); |
| 4542 | 4567 | ||
| 4543 | #endif | 4568 | #endif |
| 4569 | foreign_config = (le32_to_cpu(event_data->Flags) & | ||
| 4570 | MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? 1 : 0; | ||
| 4544 | 4571 | ||
| 4545 | element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; | 4572 | element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; |
| 4546 | for (i = 0; i < event_data->NumElements; i++, element++) { | 4573 | for (i = 0; i < event_data->NumElements; i++, element++) { |
| @@ -4548,11 +4575,13 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, | |||
| 4548 | switch (element->ReasonCode) { | 4575 | switch (element->ReasonCode) { |
| 4549 | case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED: | 4576 | case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED: |
| 4550 | case MPI2_EVENT_IR_CHANGE_RC_ADDED: | 4577 | case MPI2_EVENT_IR_CHANGE_RC_ADDED: |
| 4551 | _scsih_sas_volume_add(ioc, element); | 4578 | if (!foreign_config) |
| 4579 | _scsih_sas_volume_add(ioc, element); | ||
| 4552 | break; | 4580 | break; |
| 4553 | case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED: | 4581 | case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED: |
| 4554 | case MPI2_EVENT_IR_CHANGE_RC_REMOVED: | 4582 | case MPI2_EVENT_IR_CHANGE_RC_REMOVED: |
| 4555 | _scsih_sas_volume_delete(ioc, element); | 4583 | if (!foreign_config) |
| 4584 | _scsih_sas_volume_delete(ioc, element); | ||
| 4556 | break; | 4585 | break; |
| 4557 | case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED: | 4586 | case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED: |
| 4558 | _scsih_sas_pd_hide(ioc, element); | 4587 | _scsih_sas_pd_hide(ioc, element); |
| @@ -4671,6 +4700,9 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, | |||
| 4671 | u32 state; | 4700 | u32 state; |
| 4672 | struct _sas_device *sas_device; | 4701 | struct _sas_device *sas_device; |
| 4673 | unsigned long flags; | 4702 | unsigned long flags; |
| 4703 | Mpi2ConfigReply_t mpi_reply; | ||
| 4704 | Mpi2SasDevicePage0_t sas_device_pg0; | ||
| 4705 | u32 ioc_status; | ||
| 4674 | 4706 | ||
| 4675 | if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED) | 4707 | if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED) |
| 4676 | return; | 4708 | return; |
| @@ -4687,22 +4719,40 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, | |||
| 4687 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | 4719 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); |
| 4688 | 4720 | ||
| 4689 | switch (state) { | 4721 | switch (state) { |
| 4690 | #if 0 | ||
| 4691 | case MPI2_RAID_PD_STATE_OFFLINE: | ||
| 4692 | if (sas_device) | ||
| 4693 | _scsih_remove_device(ioc, handle); | ||
| 4694 | break; | ||
| 4695 | #endif | ||
| 4696 | case MPI2_RAID_PD_STATE_ONLINE: | 4722 | case MPI2_RAID_PD_STATE_ONLINE: |
| 4697 | case MPI2_RAID_PD_STATE_DEGRADED: | 4723 | case MPI2_RAID_PD_STATE_DEGRADED: |
| 4698 | case MPI2_RAID_PD_STATE_REBUILDING: | 4724 | case MPI2_RAID_PD_STATE_REBUILDING: |
| 4699 | case MPI2_RAID_PD_STATE_OPTIMAL: | 4725 | case MPI2_RAID_PD_STATE_OPTIMAL: |
| 4700 | if (sas_device) | 4726 | if (sas_device) { |
| 4701 | sas_device->hidden_raid_component = 1; | 4727 | sas_device->hidden_raid_component = 1; |
| 4702 | else | 4728 | return; |
| 4703 | _scsih_add_device(ioc, handle, 0, 1); | 4729 | } |
| 4730 | |||
| 4731 | if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, | ||
| 4732 | &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, | ||
| 4733 | handle))) { | ||
| 4734 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
| 4735 | ioc->name, __FILE__, __LINE__, __func__); | ||
| 4736 | return; | ||
| 4737 | } | ||
| 4738 | |||
| 4739 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | ||
| 4740 | MPI2_IOCSTATUS_MASK; | ||
| 4741 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { | ||
| 4742 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
| 4743 | ioc->name, __FILE__, __LINE__, __func__); | ||
| 4744 | return; | ||
| 4745 | } | ||
| 4746 | |||
| 4747 | _scsih_link_change(ioc, | ||
| 4748 | le16_to_cpu(sas_device_pg0.ParentDevHandle), | ||
| 4749 | handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5); | ||
| 4750 | |||
| 4751 | _scsih_add_device(ioc, handle, 0, 1); | ||
| 4752 | |||
| 4704 | break; | 4753 | break; |
| 4705 | 4754 | ||
| 4755 | case MPI2_RAID_PD_STATE_OFFLINE: | ||
| 4706 | case MPI2_RAID_PD_STATE_NOT_CONFIGURED: | 4756 | case MPI2_RAID_PD_STATE_NOT_CONFIGURED: |
| 4707 | case MPI2_RAID_PD_STATE_NOT_COMPATIBLE: | 4757 | case MPI2_RAID_PD_STATE_NOT_COMPATIBLE: |
| 4708 | case MPI2_RAID_PD_STATE_HOT_SPARE: | 4758 | case MPI2_RAID_PD_STATE_HOT_SPARE: |
| @@ -5774,6 +5824,7 @@ _scsih_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 5774 | struct MPT2SAS_ADAPTER *ioc = shost_priv(shost); | 5824 | struct MPT2SAS_ADAPTER *ioc = shost_priv(shost); |
| 5775 | u32 device_state; | 5825 | u32 device_state; |
| 5776 | 5826 | ||
| 5827 | mpt2sas_base_stop_watchdog(ioc); | ||
| 5777 | flush_scheduled_work(); | 5828 | flush_scheduled_work(); |
| 5778 | scsi_block_requests(shost); | 5829 | scsi_block_requests(shost); |
| 5779 | device_state = pci_choose_state(pdev, state); | 5830 | device_state = pci_choose_state(pdev, state); |
| @@ -5816,6 +5867,7 @@ _scsih_resume(struct pci_dev *pdev) | |||
| 5816 | 5867 | ||
| 5817 | mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, SOFT_RESET); | 5868 | mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, SOFT_RESET); |
| 5818 | scsi_unblock_requests(shost); | 5869 | scsi_unblock_requests(shost); |
| 5870 | mpt2sas_base_start_watchdog(ioc); | ||
| 5819 | return 0; | 5871 | return 0; |
| 5820 | } | 5872 | } |
| 5821 | #endif /* CONFIG_PM */ | 5873 | #endif /* CONFIG_PM */ |
