diff options
Diffstat (limited to 'drivers/scsi/mpi3mr/mpi3mr_fw.c')
| -rw-r--r-- | drivers/scsi/mpi3mr/mpi3mr_fw.c | 42 | 
1 files changed, 26 insertions, 16 deletions
diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c index 528f19f782f2..c2a22e96f7b7 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c @@ -11,7 +11,7 @@  #include <linux/io-64-nonatomic-lo-hi.h>  static int -mpi3mr_issue_reset(struct mpi3mr_ioc *mrioc, u16 reset_type, u32 reset_reason); +mpi3mr_issue_reset(struct mpi3mr_ioc *mrioc, u16 reset_type, u16 reset_reason);  static int mpi3mr_setup_admin_qpair(struct mpi3mr_ioc *mrioc);  static void mpi3mr_process_factsdata(struct mpi3mr_ioc *mrioc,  	struct mpi3_ioc_facts_data *facts_data); @@ -1195,7 +1195,7 @@ static inline void mpi3mr_clear_reset_history(struct mpi3mr_ioc *mrioc)  static int mpi3mr_issue_and_process_mur(struct mpi3mr_ioc *mrioc,  	u32 reset_reason)  { -	u32 ioc_config, timeout, ioc_status; +	u32 ioc_config, timeout, ioc_status, scratch_pad0;  	int retval = -1;  	ioc_info(mrioc, "Issuing Message unit Reset(MUR)\n"); @@ -1204,7 +1204,11 @@ static int mpi3mr_issue_and_process_mur(struct mpi3mr_ioc *mrioc,  		return retval;  	}  	mpi3mr_clear_reset_history(mrioc); -	writel(reset_reason, &mrioc->sysif_regs->scratchpad[0]); +	scratch_pad0 = ((MPI3MR_RESET_REASON_OSTYPE_LINUX << +			 MPI3MR_RESET_REASON_OSTYPE_SHIFT) | +			(mrioc->facts.ioc_num << +			 MPI3MR_RESET_REASON_IOCNUM_SHIFT) | reset_reason); +	writel(scratch_pad0, &mrioc->sysif_regs->scratchpad[0]);  	ioc_config = readl(&mrioc->sysif_regs->ioc_configuration);  	ioc_config &= ~MPI3_SYSIF_IOC_CONFIG_ENABLE_IOC;  	writel(ioc_config, &mrioc->sysif_regs->ioc_configuration); @@ -1276,7 +1280,7 @@ mpi3mr_revalidate_factsdata(struct mpi3mr_ioc *mrioc)  			    mrioc->shost->max_sectors * 512, mrioc->facts.max_data_length);  	if ((mrioc->sas_transport_enabled) && (mrioc->facts.ioc_capabilities & -	    MPI3_IOCFACTS_CAPABILITY_MULTIPATH_ENABLED)) +	    MPI3_IOCFACTS_CAPABILITY_MULTIPATH_SUPPORTED))  		ioc_err(mrioc,  		    "critical error: multipath capability is enabled at the\n"  		    "\tcontroller while sas transport support is enabled at the\n" @@ -1520,11 +1524,11 @@ static inline void mpi3mr_set_diagsave(struct mpi3mr_ioc *mrioc)   * Return: 0 on success, non-zero on failure.   */  static int mpi3mr_issue_reset(struct mpi3mr_ioc *mrioc, u16 reset_type, -	u32 reset_reason) +	u16 reset_reason)  {  	int retval = -1;  	u8 unlock_retry_count = 0; -	u32 host_diagnostic, ioc_status, ioc_config; +	u32 host_diagnostic, ioc_status, ioc_config, scratch_pad0;  	u32 timeout = MPI3MR_RESET_ACK_TIMEOUT * 10;  	if ((reset_type != MPI3_SYSIF_HOST_DIAG_RESET_ACTION_SOFT_RESET) && @@ -1576,6 +1580,9 @@ static int mpi3mr_issue_reset(struct mpi3mr_ioc *mrioc, u16 reset_type,  		    unlock_retry_count, host_diagnostic);  	} while (!(host_diagnostic & MPI3_SYSIF_HOST_DIAG_DIAG_WRITE_ENABLE)); +	scratch_pad0 = ((MPI3MR_RESET_REASON_OSTYPE_LINUX << +	    MPI3MR_RESET_REASON_OSTYPE_SHIFT) | (mrioc->facts.ioc_num << +	    MPI3MR_RESET_REASON_IOCNUM_SHIFT) | reset_reason);  	writel(reset_reason, &mrioc->sysif_regs->scratchpad[0]);  	writel(host_diagnostic | reset_type,  	    &mrioc->sysif_regs->host_diagnostic); @@ -2581,7 +2588,7 @@ static void mpi3mr_watchdog_work(struct work_struct *work)  	unsigned long flags;  	enum mpi3mr_iocstate ioc_state;  	u32 fault, host_diagnostic, ioc_status; -	u32 reset_reason = MPI3MR_RESET_FROM_FAULT_WATCH; +	u16 reset_reason = MPI3MR_RESET_FROM_FAULT_WATCH;  	if (mrioc->reset_in_progress)  		return; @@ -3302,6 +3309,8 @@ static int mpi3mr_issue_iocinit(struct mpi3mr_ioc *mrioc)  	iocinit_req.msg_flags |=  	    MPI3_IOCINIT_MSGFLAGS_SCSIIOSTATUSREPLY_SUPPORTED; +	iocinit_req.msg_flags |= +		MPI3_IOCINIT_MSGFLAGS_WRITESAMEDIVERT_SUPPORTED;  	init_completion(&mrioc->init_cmds.done);  	retval = mpi3mr_admin_request_post(mrioc, &iocinit_req, @@ -3668,15 +3677,15 @@ static const struct {  	u32 capability;  	char *name;  } mpi3mr_capabilities[] = { -	{ MPI3_IOCFACTS_CAPABILITY_RAID_CAPABLE, "RAID" }, -	{ MPI3_IOCFACTS_CAPABILITY_MULTIPATH_ENABLED, "MultiPath" }, +	{ MPI3_IOCFACTS_CAPABILITY_RAID_SUPPORTED, "RAID" }, +	{ MPI3_IOCFACTS_CAPABILITY_MULTIPATH_SUPPORTED, "MultiPath" },  };  /**   * mpi3mr_print_ioc_info - Display controller information   * @mrioc: Adapter instance reference   * - * Display controller personalit, capability, supported + * Display controller personality, capability, supported   * protocols etc.   *   * Return: Nothing @@ -3685,20 +3694,20 @@ static void  mpi3mr_print_ioc_info(struct mpi3mr_ioc *mrioc)  {  	int i = 0, bytes_written = 0; -	char personality[16]; +	const char *personality;  	char protocol[50] = {0};  	char capabilities[100] = {0};  	struct mpi3mr_compimg_ver *fwver = &mrioc->facts.fw_ver;  	switch (mrioc->facts.personality) {  	case MPI3_IOCFACTS_FLAGS_PERSONALITY_EHBA: -		strncpy(personality, "Enhanced HBA", sizeof(personality)); +		personality = "Enhanced HBA";  		break;  	case MPI3_IOCFACTS_FLAGS_PERSONALITY_RAID_DDR: -		strncpy(personality, "RAID", sizeof(personality)); +		personality = "RAID";  		break;  	default: -		strncpy(personality, "Unknown", sizeof(personality)); +		personality = "Unknown";  		break;  	} @@ -3951,7 +3960,7 @@ retry_init:  		    MPI3MR_HOST_IOS_KDUMP);  	if (!(mrioc->facts.ioc_capabilities & -	    MPI3_IOCFACTS_CAPABILITY_MULTIPATH_ENABLED)) { +	    MPI3_IOCFACTS_CAPABILITY_MULTIPATH_SUPPORTED)) {  		mrioc->sas_transport_enabled = 1;  		mrioc->scsi_device_channel = 1;  		mrioc->shost->max_channel = 1; @@ -4966,7 +4975,7 @@ cleanup_drv_cmd:   * Return: 0 on success, non-zero on failure.   */  int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc, -	u32 reset_reason, u8 snapdump) +	u16 reset_reason, u8 snapdump)  {  	int retval = 0, i;  	unsigned long flags; @@ -5102,6 +5111,7 @@ out:  		mrioc->device_refresh_on = 0;  		mrioc->unrecoverable = 1;  		mrioc->reset_in_progress = 0; +		mrioc->stop_bsgs = 0;  		retval = -1;  		mpi3mr_flush_cmds_for_unrecovered_controller(mrioc);  	}  |