diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_scsih.c | 109 |
1 files changed, 62 insertions, 47 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 8822cda852ba..d4e890d8b992 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | |||
@@ -2386,16 +2386,10 @@ _scsih_tm_tr_send(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
2386 | 2386 | ||
2387 | spin_lock_irqsave(&ioc->sas_device_lock, flags); | 2387 | spin_lock_irqsave(&ioc->sas_device_lock, flags); |
2388 | sas_device = _scsih_sas_device_find_by_handle(ioc, handle); | 2388 | sas_device = _scsih_sas_device_find_by_handle(ioc, handle); |
2389 | if (!sas_device) { | ||
2390 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | ||
2391 | printk(MPT2SAS_ERR_FMT "%s: failed finding sas_device\n", | ||
2392 | ioc->name, __func__); | ||
2393 | return; | ||
2394 | } | ||
2395 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | 2389 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); |
2396 | 2390 | ||
2397 | /* skip is hidden raid component */ | 2391 | /* skip is hidden raid component */ |
2398 | if (sas_device->hidden_raid_component) | 2392 | if (sas_device && sas_device->hidden_raid_component) |
2399 | return; | 2393 | return; |
2400 | 2394 | ||
2401 | smid = mpt2sas_base_get_smid_hpr(ioc, ioc->tm_tr_cb_idx); | 2395 | smid = mpt2sas_base_get_smid_hpr(ioc, ioc->tm_tr_cb_idx); |
@@ -2408,18 +2402,31 @@ _scsih_tm_tr_send(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
2408 | delayed_tr->state = MPT2SAS_REQ_SAS_CNTRL; | 2402 | delayed_tr->state = MPT2SAS_REQ_SAS_CNTRL; |
2409 | list_add_tail(&delayed_tr->list, | 2403 | list_add_tail(&delayed_tr->list, |
2410 | &ioc->delayed_tr_list); | 2404 | &ioc->delayed_tr_list); |
2411 | if (sas_device->starget) | 2405 | if (sas_device && sas_device->starget) { |
2412 | dewtprintk(ioc, starget_printk(KERN_INFO, | 2406 | dewtprintk(ioc, starget_printk(KERN_INFO, |
2413 | sas_device->starget, "DELAYED:tr:handle(0x%04x), " | 2407 | sas_device->starget, "DELAYED:tr:handle(0x%04x), " |
2414 | "(open)\n", sas_device->handle)); | 2408 | "(open)\n", handle)); |
2409 | } else { | ||
2410 | dewtprintk(ioc, printk(MPT2SAS_INFO_FMT | ||
2411 | "DELAYED:tr:handle(0x%04x), (open)\n", | ||
2412 | ioc->name, handle)); | ||
2413 | } | ||
2415 | return; | 2414 | return; |
2416 | } | 2415 | } |
2417 | 2416 | ||
2418 | if (sas_device->starget && sas_device->starget->hostdata) { | 2417 | if (sas_device) { |
2419 | sas_target_priv_data = sas_device->starget->hostdata; | 2418 | sas_device->state |= MPTSAS_STATE_TR_SEND; |
2420 | sas_target_priv_data->tm_busy = 1; | 2419 | sas_device->state |= MPT2SAS_REQ_SAS_CNTRL; |
2421 | dewtprintk(ioc, starget_printk(KERN_INFO, sas_device->starget, | 2420 | if (sas_device->starget && sas_device->starget->hostdata) { |
2422 | "tr:handle(0x%04x), (open)\n", sas_device->handle)); | 2421 | sas_target_priv_data = sas_device->starget->hostdata; |
2422 | sas_target_priv_data->tm_busy = 1; | ||
2423 | dewtprintk(ioc, starget_printk(KERN_INFO, | ||
2424 | sas_device->starget, "tr:handle(0x%04x), (open)\n", | ||
2425 | handle)); | ||
2426 | } | ||
2427 | } else { | ||
2428 | dewtprintk(ioc, printk(MPT2SAS_INFO_FMT | ||
2429 | "tr:handle(0x%04x), (open)\n", ioc->name, handle)); | ||
2423 | } | 2430 | } |
2424 | 2431 | ||
2425 | mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); | 2432 | mpi_request = mpt2sas_base_get_msg_frame(ioc, smid); |
@@ -2427,8 +2434,6 @@ _scsih_tm_tr_send(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
2427 | mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; | 2434 | mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; |
2428 | mpi_request->DevHandle = cpu_to_le16(handle); | 2435 | mpi_request->DevHandle = cpu_to_le16(handle); |
2429 | mpi_request->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET; | 2436 | mpi_request->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET; |
2430 | sas_device->state |= MPTSAS_STATE_TR_SEND; | ||
2431 | sas_device->state |= MPT2SAS_REQ_SAS_CNTRL; | ||
2432 | mpt2sas_base_put_smid_hi_priority(ioc, smid); | 2437 | mpt2sas_base_put_smid_hi_priority(ioc, smid); |
2433 | } | 2438 | } |
2434 | 2439 | ||
@@ -2463,21 +2468,25 @@ _scsih_sas_control_complete(struct MPT2SAS_ADAPTER *ioc, u16 smid, | |||
2463 | 2468 | ||
2464 | spin_lock_irqsave(&ioc->sas_device_lock, flags); | 2469 | spin_lock_irqsave(&ioc->sas_device_lock, flags); |
2465 | sas_device = _scsih_sas_device_find_by_handle(ioc, handle); | 2470 | sas_device = _scsih_sas_device_find_by_handle(ioc, handle); |
2466 | if (!sas_device) { | ||
2467 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | ||
2468 | printk(MPT2SAS_ERR_FMT "%s: failed finding sas_device\n", | ||
2469 | ioc->name, __func__); | ||
2470 | return 1; | ||
2471 | } | ||
2472 | sas_device->state |= MPTSAS_STATE_CNTRL_COMPLETE; | ||
2473 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | 2471 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); |
2474 | 2472 | ||
2475 | if (sas_device->starget) | 2473 | if (sas_device) { |
2476 | dewtprintk(ioc, starget_printk(KERN_INFO, sas_device->starget, | 2474 | sas_device->state |= MPTSAS_STATE_CNTRL_COMPLETE; |
2475 | if (sas_device->starget) | ||
2476 | dewtprintk(ioc, starget_printk(KERN_INFO, | ||
2477 | sas_device->starget, | ||
2478 | "sc_complete:handle(0x%04x), " | ||
2479 | "ioc_status(0x%04x), loginfo(0x%08x)\n", | ||
2480 | handle, le16_to_cpu(mpi_reply->IOCStatus), | ||
2481 | le32_to_cpu(mpi_reply->IOCLogInfo))); | ||
2482 | } else { | ||
2483 | dewtprintk(ioc, printk(MPT2SAS_INFO_FMT | ||
2477 | "sc_complete:handle(0x%04x), " | 2484 | "sc_complete:handle(0x%04x), " |
2478 | "ioc_status(0x%04x), loginfo(0x%08x)\n", | 2485 | "ioc_status(0x%04x), loginfo(0x%08x)\n", |
2479 | handle, le16_to_cpu(mpi_reply->IOCStatus), | 2486 | ioc->name, handle, le16_to_cpu(mpi_reply->IOCStatus), |
2480 | le32_to_cpu(mpi_reply->IOCLogInfo))); | 2487 | le32_to_cpu(mpi_reply->IOCLogInfo))); |
2488 | } | ||
2489 | |||
2481 | return 1; | 2490 | return 1; |
2482 | } | 2491 | } |
2483 | 2492 | ||
@@ -2515,28 +2524,33 @@ _scsih_tm_tr_complete(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, | |||
2515 | handle = le16_to_cpu(mpi_reply->DevHandle); | 2524 | handle = le16_to_cpu(mpi_reply->DevHandle); |
2516 | spin_lock_irqsave(&ioc->sas_device_lock, flags); | 2525 | spin_lock_irqsave(&ioc->sas_device_lock, flags); |
2517 | sas_device = _scsih_sas_device_find_by_handle(ioc, handle); | 2526 | sas_device = _scsih_sas_device_find_by_handle(ioc, handle); |
2518 | if (!sas_device) { | ||
2519 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | ||
2520 | printk(MPT2SAS_ERR_FMT "%s: failed finding sas_device\n", | ||
2521 | ioc->name, __func__); | ||
2522 | return 1; | ||
2523 | } | ||
2524 | sas_device->state |= MPTSAS_STATE_TR_COMPLETE; | ||
2525 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | 2527 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); |
2526 | 2528 | ||
2527 | if (sas_device->starget) | 2529 | if (sas_device) { |
2528 | dewtprintk(ioc, starget_printk(KERN_INFO, sas_device->starget, | 2530 | sas_device->state |= MPTSAS_STATE_TR_COMPLETE; |
2529 | "tr_complete:handle(0x%04x), (%s) ioc_status(0x%04x), " | 2531 | if (sas_device->starget) { |
2530 | "loginfo(0x%08x), completed(%d)\n", | 2532 | dewtprintk(ioc, starget_printk(KERN_INFO, |
2531 | sas_device->handle, (sas_device->state & | 2533 | sas_device->starget, "tr_complete:handle(0x%04x), " |
2532 | MPT2SAS_REQ_SAS_CNTRL) ? "open" : "active", | 2534 | "(%s) ioc_status(0x%04x), loginfo(0x%08x), " |
2533 | le16_to_cpu(mpi_reply->IOCStatus), | 2535 | "completed(%d)\n", sas_device->handle, |
2536 | (sas_device->state & MPT2SAS_REQ_SAS_CNTRL) ? | ||
2537 | "open" : "active", | ||
2538 | le16_to_cpu(mpi_reply->IOCStatus), | ||
2539 | le32_to_cpu(mpi_reply->IOCLogInfo), | ||
2540 | le32_to_cpu(mpi_reply->TerminationCount))); | ||
2541 | if (sas_device->starget->hostdata) { | ||
2542 | sas_target_priv_data = | ||
2543 | sas_device->starget->hostdata; | ||
2544 | sas_target_priv_data->tm_busy = 0; | ||
2545 | } | ||
2546 | } | ||
2547 | } else { | ||
2548 | dewtprintk(ioc, printk(MPT2SAS_INFO_FMT | ||
2549 | "tr_complete:handle(0x%04x), (open) ioc_status(0x%04x), " | ||
2550 | "loginfo(0x%08x), completed(%d)\n", ioc->name, | ||
2551 | handle, le16_to_cpu(mpi_reply->IOCStatus), | ||
2534 | le32_to_cpu(mpi_reply->IOCLogInfo), | 2552 | le32_to_cpu(mpi_reply->IOCLogInfo), |
2535 | le32_to_cpu(mpi_reply->TerminationCount))); | 2553 | le32_to_cpu(mpi_reply->TerminationCount))); |
2536 | |||
2537 | if (sas_device->starget && sas_device->starget->hostdata) { | ||
2538 | sas_target_priv_data = sas_device->starget->hostdata; | ||
2539 | sas_target_priv_data->tm_busy = 0; | ||
2540 | } | 2554 | } |
2541 | 2555 | ||
2542 | if (!list_empty(&ioc->delayed_tr_list)) { | 2556 | if (!list_empty(&ioc->delayed_tr_list)) { |
@@ -2551,8 +2565,7 @@ _scsih_tm_tr_complete(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, | |||
2551 | } else | 2565 | } else |
2552 | rc = 1; | 2566 | rc = 1; |
2553 | 2567 | ||
2554 | 2568 | if (sas_device && !(sas_device->state & MPT2SAS_REQ_SAS_CNTRL)) | |
2555 | if (!(sas_device->state & MPT2SAS_REQ_SAS_CNTRL)) | ||
2556 | return rc; | 2569 | return rc; |
2557 | 2570 | ||
2558 | if (ioc->shost_recovery) { | 2571 | if (ioc->shost_recovery) { |
@@ -2568,12 +2581,14 @@ _scsih_tm_tr_complete(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, | |||
2568 | return rc; | 2581 | return rc; |
2569 | } | 2582 | } |
2570 | 2583 | ||
2584 | if (sas_device) | ||
2585 | sas_device->state |= MPTSAS_STATE_CNTRL_SEND; | ||
2586 | |||
2571 | mpi_request = mpt2sas_base_get_msg_frame(ioc, smid_sas_ctrl); | 2587 | mpi_request = mpt2sas_base_get_msg_frame(ioc, smid_sas_ctrl); |
2572 | memset(mpi_request, 0, sizeof(Mpi2SasIoUnitControlRequest_t)); | 2588 | memset(mpi_request, 0, sizeof(Mpi2SasIoUnitControlRequest_t)); |
2573 | mpi_request->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL; | 2589 | mpi_request->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL; |
2574 | mpi_request->Operation = MPI2_SAS_OP_REMOVE_DEVICE; | 2590 | mpi_request->Operation = MPI2_SAS_OP_REMOVE_DEVICE; |
2575 | mpi_request->DevHandle = mpi_reply->DevHandle; | 2591 | mpi_request->DevHandle = mpi_reply->DevHandle; |
2576 | sas_device->state |= MPTSAS_STATE_CNTRL_SEND; | ||
2577 | mpt2sas_base_put_smid_default(ioc, smid_sas_ctrl); | 2592 | mpt2sas_base_put_smid_default(ioc, smid_sas_ctrl); |
2578 | return rc; | 2593 | return rc; |
2579 | } | 2594 | } |