diff options
Diffstat (limited to 'drivers/scsi/aacraid/linit.c')
| -rw-r--r-- | drivers/scsi/aacraid/linit.c | 27 | 
1 files changed, 18 insertions, 9 deletions
| diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 87cc4a93e637..c9252b138c1f 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -906,12 +906,14 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd)  	bus = aac_logical_to_phys(scmd_channel(cmd));  	cid = scmd_id(cmd); -	info = &aac->hba_map[bus][cid]; -	if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS || -	    info->devtype != AAC_DEVTYPE_NATIVE_RAW) + +	if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS)  		return FAILED; -	if (info->reset_state > 0) +	info = &aac->hba_map[bus][cid]; + +	if (info->devtype != AAC_DEVTYPE_NATIVE_RAW && +	    info->reset_state > 0)  		return FAILED;  	pr_err("%s: Host adapter reset request. SCSI hang ?\n", @@ -962,12 +964,14 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)  	bus = aac_logical_to_phys(scmd_channel(cmd));  	cid = scmd_id(cmd); -	info = &aac->hba_map[bus][cid]; -	if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS || -	    info->devtype != AAC_DEVTYPE_NATIVE_RAW) + +	if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS)  		return FAILED; -	if (info->reset_state > 0) +	info = &aac->hba_map[bus][cid]; + +	if (info->devtype != AAC_DEVTYPE_NATIVE_RAW && +	    info->reset_state > 0)  		return FAILED;  	pr_err("%s: Host adapter reset request. SCSI hang ?\n", @@ -1547,8 +1551,9 @@ static void __aac_shutdown(struct aac_dev * aac)  {  	int i; +	mutex_lock(&aac->ioctl_mutex);  	aac->adapter_shutdown = 1; -	aac_send_shutdown(aac); +	mutex_unlock(&aac->ioctl_mutex);  	if (aac->aif_thread) {  		int i; @@ -1561,7 +1566,11 @@ static void __aac_shutdown(struct aac_dev * aac)  		}  		kthread_stop(aac->thread);  	} + +	aac_send_shutdown(aac); +  	aac_adapter_disable_int(aac); +  	if (aac_is_src(aac)) {  		if (aac->max_msix > 1) {  			for (i = 0; i < aac->max_msix; i++) { |