diff options
Diffstat (limited to 'drivers/scsi/mpt2sas')
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_scsih.c | 49 |
1 files changed, 40 insertions, 9 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index b0d598ec71c0..1f0466aa6c18 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | |||
@@ -5506,6 +5506,26 @@ _scsih_task_set_full(struct MPT2SAS_ADAPTER *ioc, struct fw_event_work | |||
5506 | } | 5506 | } |
5507 | 5507 | ||
5508 | /** | 5508 | /** |
5509 | * _scsih_prep_device_scan - initialize parameters prior to device scan | ||
5510 | * @ioc: per adapter object | ||
5511 | * | ||
5512 | * Set the deleted flag prior to device scan. If the device is found during | ||
5513 | * the scan, then we clear the deleted flag. | ||
5514 | */ | ||
5515 | static void | ||
5516 | _scsih_prep_device_scan(struct MPT2SAS_ADAPTER *ioc) | ||
5517 | { | ||
5518 | struct MPT2SAS_DEVICE *sas_device_priv_data; | ||
5519 | struct scsi_device *sdev; | ||
5520 | |||
5521 | shost_for_each_device(sdev, ioc->shost) { | ||
5522 | sas_device_priv_data = sdev->hostdata; | ||
5523 | if (sas_device_priv_data && sas_device_priv_data->sas_target) | ||
5524 | sas_device_priv_data->sas_target->deleted = 1; | ||
5525 | } | ||
5526 | } | ||
5527 | |||
5528 | /** | ||
5509 | * _scsih_mark_responding_sas_device - mark a sas_devices as responding | 5529 | * _scsih_mark_responding_sas_device - mark a sas_devices as responding |
5510 | * @ioc: per adapter object | 5530 | * @ioc: per adapter object |
5511 | * @sas_address: sas address | 5531 | * @sas_address: sas address |
@@ -5532,8 +5552,12 @@ _scsih_mark_responding_sas_device(struct MPT2SAS_ADAPTER *ioc, u64 sas_address, | |||
5532 | sas_device->slot == slot && sas_device->starget) { | 5552 | sas_device->slot == slot && sas_device->starget) { |
5533 | sas_device->responding = 1; | 5553 | sas_device->responding = 1; |
5534 | starget = sas_device->starget; | 5554 | starget = sas_device->starget; |
5535 | sas_target_priv_data = starget->hostdata; | 5555 | if (starget && starget->hostdata) { |
5536 | sas_target_priv_data->tm_busy = 0; | 5556 | sas_target_priv_data = starget->hostdata; |
5557 | sas_target_priv_data->tm_busy = 0; | ||
5558 | sas_target_priv_data->deleted = 0; | ||
5559 | } else | ||
5560 | sas_target_priv_data = NULL; | ||
5537 | starget_printk(KERN_INFO, sas_device->starget, | 5561 | starget_printk(KERN_INFO, sas_device->starget, |
5538 | "handle(0x%04x), sas_addr(0x%016llx), enclosure " | 5562 | "handle(0x%04x), sas_addr(0x%016llx), enclosure " |
5539 | "logical id(0x%016llx), slot(%d)\n", handle, | 5563 | "logical id(0x%016llx), slot(%d)\n", handle, |
@@ -5546,7 +5570,8 @@ _scsih_mark_responding_sas_device(struct MPT2SAS_ADAPTER *ioc, u64 sas_address, | |||
5546 | printk(KERN_INFO "\thandle changed from(0x%04x)!!!\n", | 5570 | printk(KERN_INFO "\thandle changed from(0x%04x)!!!\n", |
5547 | sas_device->handle); | 5571 | sas_device->handle); |
5548 | sas_device->handle = handle; | 5572 | sas_device->handle = handle; |
5549 | sas_target_priv_data->handle = handle; | 5573 | if (sas_target_priv_data) |
5574 | sas_target_priv_data->handle = handle; | ||
5550 | goto out; | 5575 | goto out; |
5551 | } | 5576 | } |
5552 | } | 5577 | } |
@@ -5621,6 +5646,12 @@ _scsih_mark_responding_raid_device(struct MPT2SAS_ADAPTER *ioc, u64 wwid, | |||
5621 | spin_lock_irqsave(&ioc->raid_device_lock, flags); | 5646 | spin_lock_irqsave(&ioc->raid_device_lock, flags); |
5622 | list_for_each_entry(raid_device, &ioc->raid_device_list, list) { | 5647 | list_for_each_entry(raid_device, &ioc->raid_device_list, list) { |
5623 | if (raid_device->wwid == wwid && raid_device->starget) { | 5648 | if (raid_device->wwid == wwid && raid_device->starget) { |
5649 | starget = raid_device->starget; | ||
5650 | if (starget && starget->hostdata) { | ||
5651 | sas_target_priv_data = starget->hostdata; | ||
5652 | sas_target_priv_data->deleted = 0; | ||
5653 | } else | ||
5654 | sas_target_priv_data = NULL; | ||
5624 | raid_device->responding = 1; | 5655 | raid_device->responding = 1; |
5625 | starget_printk(KERN_INFO, raid_device->starget, | 5656 | starget_printk(KERN_INFO, raid_device->starget, |
5626 | "handle(0x%04x), wwid(0x%016llx)\n", handle, | 5657 | "handle(0x%04x), wwid(0x%016llx)\n", handle, |
@@ -5630,9 +5661,8 @@ _scsih_mark_responding_raid_device(struct MPT2SAS_ADAPTER *ioc, u64 wwid, | |||
5630 | printk(KERN_INFO "\thandle changed from(0x%04x)!!!\n", | 5661 | printk(KERN_INFO "\thandle changed from(0x%04x)!!!\n", |
5631 | raid_device->handle); | 5662 | raid_device->handle); |
5632 | raid_device->handle = handle; | 5663 | raid_device->handle = handle; |
5633 | starget = raid_device->starget; | 5664 | if (sas_target_priv_data) |
5634 | sas_target_priv_data = starget->hostdata; | 5665 | sas_target_priv_data->handle = handle; |
5635 | sas_target_priv_data->handle = handle; | ||
5636 | goto out; | 5666 | goto out; |
5637 | } | 5667 | } |
5638 | } | 5668 | } |
@@ -5857,6 +5887,10 @@ mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase) | |||
5857 | dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " | 5887 | dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " |
5858 | "MPT2_IOC_DONE_RESET\n", ioc->name, __func__)); | 5888 | "MPT2_IOC_DONE_RESET\n", ioc->name, __func__)); |
5859 | _scsih_sas_host_refresh(ioc); | 5889 | _scsih_sas_host_refresh(ioc); |
5890 | _scsih_prep_device_scan(ioc); | ||
5891 | _scsih_search_responding_sas_devices(ioc); | ||
5892 | _scsih_search_responding_raid_devices(ioc); | ||
5893 | _scsih_search_responding_expanders(ioc); | ||
5860 | break; | 5894 | break; |
5861 | } | 5895 | } |
5862 | } | 5896 | } |
@@ -5894,9 +5928,6 @@ _firmware_event_work(struct work_struct *work) | |||
5894 | } else | 5928 | } else |
5895 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, | 5929 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, |
5896 | flags); | 5930 | flags); |
5897 | _scsih_search_responding_sas_devices(ioc); | ||
5898 | _scsih_search_responding_raid_devices(ioc); | ||
5899 | _scsih_search_responding_expanders(ioc); | ||
5900 | _scsih_remove_unresponding_sas_devices(ioc); | 5931 | _scsih_remove_unresponding_sas_devices(ioc); |
5901 | return; | 5932 | return; |
5902 | } | 5933 | } |