|
@@ -4308,11 +4308,43 @@ static void
|
|
|
_scsih_sas_device_status_change_event(struct MPT2SAS_ADAPTER *ioc,
|
|
|
struct fw_event_work *fw_event)
|
|
|
{
|
|
|
+ struct MPT2SAS_TARGET *target_priv_data;
|
|
|
+ struct _sas_device *sas_device;
|
|
|
+ __le64 sas_address;
|
|
|
+ unsigned long flags;
|
|
|
+ Mpi2EventDataSasDeviceStatusChange_t *event_data =
|
|
|
+ fw_event->event_data;
|
|
|
+
|
|
|
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
|
|
if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
|
|
|
_scsih_sas_device_status_change_event_debug(ioc,
|
|
|
- fw_event->event_data);
|
|
|
+ event_data);
|
|
|
#endif
|
|
|
+
|
|
|
+ if (!(event_data->ReasonCode ==
|
|
|
+ MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET &&
|
|
|
+ event_data->ReasonCode ==
|
|
|
+ MPI2_EVENT_SAS_DEV_STAT_RC_CMP_INTERNAL_DEV_RESET))
|
|
|
+ return;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&ioc->sas_device_lock, flags);
|
|
|
+ sas_address = le64_to_cpu(event_data->SASAddress);
|
|
|
+ sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc,
|
|
|
+ sas_address);
|
|
|
+ spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
|
|
+
|
|
|
+ if (!sas_device || !sas_device->starget)
|
|
|
+ return;
|
|
|
+
|
|
|
+ target_priv_data = sas_device->starget->hostdata;
|
|
|
+ if (!target_priv_data)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (event_data->ReasonCode ==
|
|
|
+ MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET)
|
|
|
+ target_priv_data->tm_busy = 1;
|
|
|
+ else
|
|
|
+ target_priv_data->tm_busy = 0;
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|