diff options
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_scsih.c')
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_scsih.c | 47 | 
1 files changed, 46 insertions, 1 deletions
| diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 6a1c036a6f3f..3f26147bbc64 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c @@ -3,7 +3,8 @@   *   * This code is based on drivers/scsi/mpt2sas/mpt2_scsih.c   * Copyright (C) 2007-2014  LSI Corporation - *  (mailto:[email protected]) + * Copyright (C) 20013-2014 Avago Technologies + *  (mailto: [email protected])   *   * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License @@ -2729,9 +2730,18 @@ _scsih_host_reset(struct scsi_cmnd *scmd)  	    ioc->name, scmd);  	scsi_print_command(scmd); +	if (ioc->is_driver_loading) { +		printk(MPT2SAS_INFO_FMT "Blocking the host reset\n", +							  ioc->name); +		r = FAILED; +		goto out; +	} +  	retval = mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP,  	    FORCE_BIG_HAMMER);  	r = (retval < 0) ? FAILED : SUCCESS; + + out:  	printk(MPT2SAS_INFO_FMT "host reset: %s scmd(%p)\n",  	    ioc->name, ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); @@ -3647,6 +3657,31 @@ _scsih_check_volume_delete_events(struct MPT2SAS_ADAPTER *ioc,  }  /** + * _scsih_temp_threshold_events - display temperature threshold exceeded events + * @ioc: per adapter object + * @event_data: the temp threshold event data + * Context: interrupt time. + * + * Return nothing. + */ +static void +_scsih_temp_threshold_events(struct MPT2SAS_ADAPTER *ioc, +	Mpi2EventDataTemperature_t *event_data) +{ +	if (ioc->temp_sensors_count >= event_data->SensorNum) { +		printk(MPT2SAS_ERR_FMT "Temperature Threshold flags %s%s%s%s" +		  " exceeded for Sensor: %d !!!\n", ioc->name, +		  ((le16_to_cpu(event_data->Status) & 0x1) == 1) ? "0 " : " ", +		  ((le16_to_cpu(event_data->Status) & 0x2) == 2) ? "1 " : " ", +		  ((le16_to_cpu(event_data->Status) & 0x4) == 4) ? "2 " : " ", +		  ((le16_to_cpu(event_data->Status) & 0x8) == 8) ? "3 " : " ", +		  event_data->SensorNum); +		printk(MPT2SAS_ERR_FMT "Current Temp In Celsius: %d\n", +			ioc->name, event_data->CurrentTemperature); +	} +} + +/**   * _scsih_flush_running_cmds - completing outstanding commands.   * @ioc: per adapter object   * @@ -4509,6 +4544,10 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)  			scmd->result = DID_TRANSPORT_DISRUPTED << 16;  			goto out;  		} +		if (log_info == 0x32010081) { +			scmd->result = DID_RESET << 16; +			break; +		}  		scmd->result = DID_SOFT_ERROR << 16;  		break;  	case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED: @@ -7557,6 +7596,12 @@ mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,  	case MPI2_EVENT_IR_PHYSICAL_DISK:  		break; +	case MPI2_EVENT_TEMP_THRESHOLD: +		_scsih_temp_threshold_events(ioc, +			(Mpi2EventDataTemperature_t *) +			mpi_reply->EventData); +		break; +  	default: /* ignore the rest */  		return;  	} |