diff options
Diffstat (limited to 'drivers/message')
27 files changed, 1564 insertions, 1213 deletions
diff --git a/drivers/message/fusion/Kconfig b/drivers/message/fusion/Kconfig index f55cc03a75c..a34a11d2fef 100644 --- a/drivers/message/fusion/Kconfig +++ b/drivers/message/fusion/Kconfig @@ -1,15 +1,19 @@ -menu "Fusion MPT device support" +menuconfig FUSION +	bool "Fusion MPT device support"  	depends on PCI +	---help--- +	Say Y here to get to see options for Fusion Message +	Passing Technology (MPT) drivers. +	This option alone does not add any kernel code. + +	If you say N, all options in this submenu will be skipped and disabled. -config FUSION -	bool -	default n +if FUSION  config FUSION_SPI  	tristate "Fusion MPT ScsiHost drivers for SPI"  	depends on PCI && SCSI -	select FUSION  	select SCSI_SPI_ATTRS  	---help---  	  SCSI HOST support for a parallel SCSI host adapters. @@ -20,11 +24,11 @@ config FUSION_SPI  	  LSI53C1020A  	  LSI53C1030  	  LSI53C1035 +	  ATTO UL4D  config FUSION_FC  	tristate "Fusion MPT ScsiHost drivers for FC"  	depends on PCI && SCSI -	select FUSION  	select SCSI_FC_ATTRS  	---help---  	  SCSI HOST support for a Fiber Channel host adapters. @@ -37,12 +41,13 @@ config FUSION_FC  	  LSIFC929  	  LSIFC929X  	  LSIFC929XL +	  LSIFC949X +	  LSIFC949E  	  Brocade FC 410/420  config FUSION_SAS  	tristate "Fusion MPT ScsiHost drivers for SAS"  	depends on PCI && SCSI - 	select FUSION  	select SCSI_SAS_ATTRS  	---help---  	  SCSI HOST support for a SAS host adapters. @@ -53,10 +58,10 @@ config FUSION_SAS  	  LSISAS1068  	  LSISAS1064E  	  LSISAS1068E +	  LSISAS1078  config FUSION_MAX_SGE  	int "Maximum number of scatter gather entries (16 - 128)" -	depends on FUSION  	default "128"  	range 16 128  	help @@ -104,7 +109,6 @@ config FUSION_LAN  config FUSION_LOGGING  	bool "Fusion MPT logging facility" -	depends on FUSION  	---help---  	  This turns on a logging facility that can be used to debug a number  	  of Fusion MPT related problems. @@ -113,7 +117,7 @@ config FUSION_LOGGING  	  echo [level] > /sys/class/scsi_host/host#/debug_level -	  There are various debug levels that an be found in the source: +	  There are various debug levels that can be found in the source:  	  file:drivers/message/fusion/mptdebug.h -endmenu +endif # FUSION diff --git a/drivers/message/fusion/lsi/mpi.h b/drivers/message/fusion/lsi/mpi.h index 6a92e3d118f..1acbdd61b67 100644 --- a/drivers/message/fusion/lsi/mpi.h +++ b/drivers/message/fusion/lsi/mpi.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2000-2007 LSI Logic Corporation. + *  Copyright (c) 2000-2007 LSI Corporation.   *   *   *           Name:  mpi.h diff --git a/drivers/message/fusion/lsi/mpi_cnfg.h b/drivers/message/fusion/lsi/mpi_cnfg.h index eda769730e3..2bd8adae0f0 100644 --- a/drivers/message/fusion/lsi/mpi_cnfg.h +++ b/drivers/message/fusion/lsi/mpi_cnfg.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2000-2007 LSI Logic Corporation. + *  Copyright (c) 2000-2007 LSI Corporation.   *   *   *           Name:  mpi_cnfg.h diff --git a/drivers/message/fusion/lsi/mpi_fc.h b/drivers/message/fusion/lsi/mpi_fc.h index 51a6aeb990b..627acfbb862 100644 --- a/drivers/message/fusion/lsi/mpi_fc.h +++ b/drivers/message/fusion/lsi/mpi_fc.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2000-2004 LSI Logic Corporation. + *  Copyright (c) 2000-2004 LSI Corporation.   *   *   *           Name:  mpi_fc.h diff --git a/drivers/message/fusion/lsi/mpi_history.txt b/drivers/message/fusion/lsi/mpi_history.txt index a1f479057ea..241592ab13a 100644 --- a/drivers/message/fusion/lsi/mpi_history.txt +++ b/drivers/message/fusion/lsi/mpi_history.txt @@ -3,7 +3,7 @@   MPI Header File Change History   ============================== - Copyright (c) 2000-2007 LSI Logic Corporation. + Copyright (c) 2000-2007 LSI Corporation.   ---------------------------------------   Header Set Release Version:    01.05.16 diff --git a/drivers/message/fusion/lsi/mpi_init.h b/drivers/message/fusion/lsi/mpi_init.h index 3a02615f12d..a9e3693601a 100644 --- a/drivers/message/fusion/lsi/mpi_init.h +++ b/drivers/message/fusion/lsi/mpi_init.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2000-2007 LSI Logic Corporation. + *  Copyright (c) 2000-2007 LSI Corporation.   *   *   *           Name:  mpi_init.h diff --git a/drivers/message/fusion/lsi/mpi_ioc.h b/drivers/message/fusion/lsi/mpi_ioc.h index b1893d185bc..5cbb6bd048e 100644 --- a/drivers/message/fusion/lsi/mpi_ioc.h +++ b/drivers/message/fusion/lsi/mpi_ioc.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2000-2007 LSI Logic Corporation. + *  Copyright (c) 2000-2007 LSI Corporation.   *   *   *           Name:  mpi_ioc.h diff --git a/drivers/message/fusion/lsi/mpi_lan.h b/drivers/message/fusion/lsi/mpi_lan.h index dc0b52ae83d..03253b53b78 100644 --- a/drivers/message/fusion/lsi/mpi_lan.h +++ b/drivers/message/fusion/lsi/mpi_lan.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2000-2004 LSI Logic Corporation. + *  Copyright (c) 2000-2004 LSI Corporation.   *   *   *           Name:  mpi_lan.h diff --git a/drivers/message/fusion/lsi/mpi_log_fc.h b/drivers/message/fusion/lsi/mpi_log_fc.h index dc98d46f907..e4dafcefeec 100644 --- a/drivers/message/fusion/lsi/mpi_log_fc.h +++ b/drivers/message/fusion/lsi/mpi_log_fc.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2000-2001 LSI Logic Corporation. All rights reserved. + *  Copyright (c) 2000-2001 LSI Corporation. All rights reserved.   *   *  NAME:           fc_log.h   *  SUMMARY:        MPI IocLogInfo definitions for the SYMFC9xx chips diff --git a/drivers/message/fusion/lsi/mpi_log_sas.h b/drivers/message/fusion/lsi/mpi_log_sas.h index 635bbe04513..6be1f6b6577 100644 --- a/drivers/message/fusion/lsi/mpi_log_sas.h +++ b/drivers/message/fusion/lsi/mpi_log_sas.h @@ -1,6 +1,6 @@  /***************************************************************************   *                                                                         * - *  Copyright 2003 LSI Logic Corporation.  All rights reserved.            * + *  Copyright 2003 LSI Corporation.  All rights reserved.            *   *                                                                         *   * Description                                                             *   * ------------                                                            * diff --git a/drivers/message/fusion/lsi/mpi_raid.h b/drivers/message/fusion/lsi/mpi_raid.h index 32819b1ec8e..2856108421d 100644 --- a/drivers/message/fusion/lsi/mpi_raid.h +++ b/drivers/message/fusion/lsi/mpi_raid.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2001-2007 LSI Logic Corporation. + *  Copyright (c) 2001-2007 LSI Corporation.   *   *   *           Name:  mpi_raid.h diff --git a/drivers/message/fusion/lsi/mpi_sas.h b/drivers/message/fusion/lsi/mpi_sas.h index 8e990a0fa7a..33fca83cefc 100644 --- a/drivers/message/fusion/lsi/mpi_sas.h +++ b/drivers/message/fusion/lsi/mpi_sas.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2004-2006 LSI Logic Corporation. + *  Copyright (c) 2004-2006 LSI Corporation.   *   *   *           Name:  mpi_sas.h diff --git a/drivers/message/fusion/lsi/mpi_targ.h b/drivers/message/fusion/lsi/mpi_targ.h index 20b66731577..ff8c37d3fdc 100644 --- a/drivers/message/fusion/lsi/mpi_targ.h +++ b/drivers/message/fusion/lsi/mpi_targ.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2000-2004 LSI Logic Corporation. + *  Copyright (c) 2000-2004 LSI Corporation.   *   *   *           Name:  mpi_targ.h diff --git a/drivers/message/fusion/lsi/mpi_tool.h b/drivers/message/fusion/lsi/mpi_tool.h index aa9053da1f5..8834ae6ce0f 100644 --- a/drivers/message/fusion/lsi/mpi_tool.h +++ b/drivers/message/fusion/lsi/mpi_tool.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2001-2005 LSI Logic Corporation. + *  Copyright (c) 2001-2005 LSI Corporation.   *   *   *           Name:  mpi_tool.h diff --git a/drivers/message/fusion/lsi/mpi_type.h b/drivers/message/fusion/lsi/mpi_type.h index 32cc9b1151b..08dad9c1e44 100644 --- a/drivers/message/fusion/lsi/mpi_type.h +++ b/drivers/message/fusion/lsi/mpi_type.h @@ -1,5 +1,5 @@  /* - *  Copyright (c) 2000-2004 LSI Logic Corporation. + *  Copyright (c) 2000-2004 LSI Corporation.   *   *   *           Name:  mpi_type.h diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 414c109f4cf..52fb216dfe7 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c @@ -2,10 +2,10 @@   *  linux/drivers/message/fusion/mptbase.c   *      This is the Fusion MPT base driver which supports multiple   *      (SCSI + LAN) specialized protocol drivers. - *      For use with LSI Logic PCI chip/adapter(s) - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      For use with LSI PCI chip/adapter(s) + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 1999-2007 LSI Logic Corporation + *  Copyright (c) 1999-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com)   *   */ @@ -102,8 +102,6 @@ static int mfcounter = 0;  /*   *  Public data...   */ -int mpt_lan_index = -1; -int mpt_stm_index = -1;  struct proc_dir_entry *mpt_proc_root_dir; @@ -125,11 +123,14 @@ static MPT_EVHANDLER		 MptEvHandlers[MPT_MAX_PROTOCOL_DRIVERS];  static MPT_RESETHANDLER		 MptResetHandlers[MPT_MAX_PROTOCOL_DRIVERS];  static struct mpt_pci_driver 	*MptDeviceDriverHandlers[MPT_MAX_PROTOCOL_DRIVERS]; -static int	mpt_base_index = -1; -static int	last_drv_idx = -1; -  static DECLARE_WAIT_QUEUE_HEAD(mpt_waitq); +/* + *  Driver Callback Index's + */ +static u8 mpt_base_index = MPT_MAX_PROTOCOL_DRIVERS; +static u8 last_drv_idx; +  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/  /*   *  Forward protos... @@ -235,6 +236,23 @@ static int mpt_set_debug_level(const char *val, struct kernel_param *kp)  	return 0;  } +/** + *	mpt_get_cb_idx - obtain cb_idx for registered driver + *	@dclass: class driver enum + * + *	Returns cb_idx, or zero means it wasn't found + **/ +static u8 +mpt_get_cb_idx(MPT_DRIVER_CLASS dclass) +{ +	u8 cb_idx; + +	for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) +		if (MptDriverClass[cb_idx] == dclass) +			return cb_idx; +	return 0; +} +  /*   *  Process turbo (context) reply...   */ @@ -243,8 +261,8 @@ mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa)  {  	MPT_FRAME_HDR *mf = NULL;  	MPT_FRAME_HDR *mr = NULL; -	int req_idx = 0; -	int cb_idx; +	u16 req_idx = 0; +	u8 cb_idx;  	dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got TURBO reply req_idx=%08x\n",  				ioc->name, pa)); @@ -256,7 +274,7 @@ mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa)  		mf = MPT_INDEX_2_MFPTR(ioc, req_idx);  		break;  	case MPI_CONTEXT_REPLY_TYPE_LAN: -		cb_idx = mpt_lan_index; +		cb_idx = mpt_get_cb_idx(MPTLAN_DRIVER);  		/*  		 *  Blind set of mf to NULL here was fatal  		 *  after lan_reply says "freeme" @@ -277,7 +295,7 @@ mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa)  		mr = (MPT_FRAME_HDR *) CAST_U32_TO_PTR(pa);  		break;  	case MPI_CONTEXT_REPLY_TYPE_SCSI_TARGET: -		cb_idx = mpt_stm_index; +		cb_idx = mpt_get_cb_idx(MPTSTM_DRIVER);  		mr = (MPT_FRAME_HDR *) CAST_U32_TO_PTR(pa);  		break;  	default: @@ -286,8 +304,8 @@ mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa)  	}  	/*  Check for (valid) IO callback!  */ -	if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS || -			MptCallbacks[cb_idx] == NULL) { +	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS || +		MptCallbacks[cb_idx] == NULL) {  		printk(MYIOC_s_WARN_FMT "%s: Invalid cb_idx (%d)!\n",  				__FUNCTION__, ioc->name, cb_idx);  		goto out; @@ -304,8 +322,8 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa)  {  	MPT_FRAME_HDR	*mf;  	MPT_FRAME_HDR	*mr; -	int		 req_idx; -	int		 cb_idx; +	u16		 req_idx; +	u8		 cb_idx;  	int		 freeme;  	u32 reply_dma_low; @@ -331,7 +349,7 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa)  	dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got non-TURBO reply=%p req_idx=%x cb_idx=%x Function=%x\n",  			ioc->name, mr, req_idx, cb_idx, mr->u.hdr.Function)); -	DBG_DUMP_REPLY_FRAME(ioc, (u32 *)mr) +	DBG_DUMP_REPLY_FRAME(ioc, (u32 *)mr);  	 /*  Check/log IOC log info  	 */ @@ -350,8 +368,8 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa)  		mpt_iocstatus_info(ioc, (u32)ioc_stat, mf);  	/*  Check for (valid) IO callback!  */ -	if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS || -			MptCallbacks[cb_idx] == NULL) { +	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS || +		MptCallbacks[cb_idx] == NULL) {  		printk(MYIOC_s_WARN_FMT "%s: Invalid cb_idx (%d)!\n",  				__FUNCTION__, ioc->name, cb_idx);  		freeme = 0; @@ -433,8 +451,9 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)  #ifdef CONFIG_FUSION_LOGGING  	if ((ioc->debug_level & MPT_DEBUG_MSG_FRAME) &&  			!(reply->u.hdr.MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY)) { -		dmfprintk(ioc, printk(KERN_INFO MYNAM ": Original request frame (@%p) header\n", mf)); -		DBG_DUMP_REQUEST_FRAME_HDR(ioc, (u32 *)mf) +		dmfprintk(ioc, printk(MYIOC_s_INFO_FMT ": Original request frame (@%p) header\n", +		    ioc->name, mf)); +		DBG_DUMP_REQUEST_FRAME_HDR(ioc, (u32 *)mf);  	}  #endif @@ -499,8 +518,8 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)  				u16		 status;  				status = le16_to_cpu(pReply->IOCStatus) & MPI_IOCSTATUS_MASK; -				dcprintk(ioc, printk(KERN_NOTICE "  IOCStatus=%04xh, IOCLogInfo=%08xh\n", -				     status, le32_to_cpu(pReply->IOCLogInfo))); +				dcprintk(ioc, printk(MYIOC_s_NOTE_FMT "  IOCStatus=%04xh, IOCLogInfo=%08xh\n", +				     ioc->name, status, le32_to_cpu(pReply->IOCLogInfo)));  				pCfg->status = status;  				if (status == MPI_IOCSTATUS_SUCCESS) { @@ -563,28 +582,27 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)   *	in order to register separate callbacks; one for "normal" SCSI IO;   *	one for MptScsiTaskMgmt requests; one for Scan/DV requests.   * - *	Returns a positive integer valued "handle" in the - *	range (and S.O.D. order) {N,...,7,6,5,...,1} if successful. - *	Any non-positive return value (including zero!) should be considered - *	an error by the caller. + *	Returns u8 valued "handle" in the range (and S.O.D. order) + *	{N,...,7,6,5,...,1} if successful. + *	A return value of MPT_MAX_PROTOCOL_DRIVERS (including zero!) should be + *	considered an error by the caller.   */ -int +u8  mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass)  { -	int i; - -	last_drv_idx = -1; +	u8 cb_idx; +	last_drv_idx = MPT_MAX_PROTOCOL_DRIVERS;  	/*  	 *  Search for empty callback slot in this order: {N,...,7,6,5,...,1}  	 *  (slot/handle 0 is reserved!)  	 */ -	for (i = MPT_MAX_PROTOCOL_DRIVERS-1; i; i--) { -		if (MptCallbacks[i] == NULL) { -			MptCallbacks[i] = cbfunc; -			MptDriverClass[i] = dclass; -			MptEvHandlers[i] = NULL; -			last_drv_idx = i; +	for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { +		if (MptCallbacks[cb_idx] == NULL) { +			MptCallbacks[cb_idx] = cbfunc; +			MptDriverClass[cb_idx] = dclass; +			MptEvHandlers[cb_idx] = NULL; +			last_drv_idx = cb_idx;  			break;  		}  	} @@ -601,9 +619,9 @@ mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass)   *	module is unloaded.   */  void -mpt_deregister(int cb_idx) +mpt_deregister(u8 cb_idx)  { -	if ((cb_idx >= 0) && (cb_idx < MPT_MAX_PROTOCOL_DRIVERS)) { +	if (cb_idx && (cb_idx < MPT_MAX_PROTOCOL_DRIVERS)) {  		MptCallbacks[cb_idx] = NULL;  		MptDriverClass[cb_idx] = MPTUNKNOWN_DRIVER;  		MptEvHandlers[cb_idx] = NULL; @@ -625,9 +643,9 @@ mpt_deregister(int cb_idx)   *	Returns 0 for success.   */  int -mpt_event_register(int cb_idx, MPT_EVHANDLER ev_cbfunc) +mpt_event_register(u8 cb_idx, MPT_EVHANDLER ev_cbfunc)  { -	if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) +	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)  		return -1;  	MptEvHandlers[cb_idx] = ev_cbfunc; @@ -645,9 +663,9 @@ mpt_event_register(int cb_idx, MPT_EVHANDLER ev_cbfunc)   *	or when its module is unloaded.   */  void -mpt_event_deregister(int cb_idx) +mpt_event_deregister(u8 cb_idx)  { -	if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) +	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)  		return;  	MptEvHandlers[cb_idx] = NULL; @@ -665,9 +683,9 @@ mpt_event_deregister(int cb_idx)   *	Returns 0 for success.   */  int -mpt_reset_register(int cb_idx, MPT_RESETHANDLER reset_func) +mpt_reset_register(u8 cb_idx, MPT_RESETHANDLER reset_func)  { -	if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) +	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)  		return -1;  	MptResetHandlers[cb_idx] = reset_func; @@ -684,9 +702,9 @@ mpt_reset_register(int cb_idx, MPT_RESETHANDLER reset_func)   *	or when its module is unloaded.   */  void -mpt_reset_deregister(int cb_idx) +mpt_reset_deregister(u8 cb_idx)  { -	if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) +	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)  		return;  	MptResetHandlers[cb_idx] = NULL; @@ -699,12 +717,12 @@ mpt_reset_deregister(int cb_idx)   *	@cb_idx: MPT protocol driver index   */  int -mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx) +mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, u8 cb_idx)  {  	MPT_ADAPTER	*ioc;  	const struct pci_device_id *id; -	if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) +	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)  		return -EINVAL;  	MptDeviceDriverHandlers[cb_idx] = dd_cbfunc; @@ -726,12 +744,12 @@ mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx)   *	@cb_idx: MPT protocol driver index   */  void -mpt_device_driver_deregister(int cb_idx) +mpt_device_driver_deregister(u8 cb_idx)  {  	struct mpt_pci_driver *dd_cbfunc;  	MPT_ADAPTER	*ioc; -	if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) +	if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)  		return;  	dd_cbfunc = MptDeviceDriverHandlers[cb_idx]; @@ -749,14 +767,14 @@ mpt_device_driver_deregister(int cb_idx)  /**   *	mpt_get_msg_frame - Obtain a MPT request frame from the pool (of 1024)   *	allocated per MPT adapter. - *	@handle: Handle of registered MPT protocol driver + *	@cb_idx: Handle of registered MPT protocol driver   *	@ioc: Pointer to MPT adapter structure   *   *	Returns pointer to a MPT request frame or %NULL if none are available   *	or IOC is not active.   */  MPT_FRAME_HDR* -mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc) +mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc)  {  	MPT_FRAME_HDR *mf;  	unsigned long flags; @@ -766,7 +784,8 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)  #ifdef MFCNT  	if (!ioc->active) -		printk(KERN_WARNING "IOC Not Active! mpt_get_msg_frame returning NULL!\n"); +		printk(MYIOC_s_WARN_FMT "IOC Not Active! mpt_get_msg_frame " +		    "returning NULL!\n", ioc->name);  #endif  	/* If interrupts are not attached, do not return a request frame */ @@ -781,13 +800,14 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)  				u.frame.linkage.list);  		list_del(&mf->u.frame.linkage.list);  		mf->u.frame.linkage.arg1 = 0; -		mf->u.frame.hwhdr.msgctxu.fld.cb_idx = handle;	/* byte */ +		mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx;	/* byte */  		req_offset = (u8 *)mf - (u8 *)ioc->req_frames;  								/* u16! */  		req_idx = req_offset / ioc->req_sz;  		mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx);  		mf->u.frame.hwhdr.msgctxu.fld.rsvd = 0; -		ioc->RequestNB[req_idx] = ioc->NB_for_64_byte_frame; /* Default, will be changed if necessary in SG generation */ +		/* Default, will be changed if necessary in SG generation */ +		ioc->RequestNB[req_idx] = ioc->NB_for_64_byte_frame;  #ifdef MFCNT  		ioc->mfcnt++;  #endif @@ -798,14 +818,17 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)  #ifdef MFCNT  	if (mf == NULL) -		printk(KERN_WARNING "IOC Active. No free Msg Frames! Count 0x%x Max 0x%x\n", ioc->mfcnt, ioc->req_depth); +		printk(MYIOC_s_WARN_FMT "IOC Active. No free Msg Frames! " +		    "Count 0x%x Max 0x%x\n", ioc->name, ioc->mfcnt, +		    ioc->req_depth);  	mfcounter++;  	if (mfcounter == PRINT_MF_COUNT) -		printk(KERN_INFO "MF Count 0x%x Max 0x%x \n", ioc->mfcnt, ioc->req_depth); +		printk(MYIOC_s_INFO_FMT "MF Count 0x%x Max 0x%x \n", ioc->name, +		    ioc->mfcnt, ioc->req_depth);  #endif -	dmfprintk(ioc, printk(KERN_INFO MYNAM ": %s: mpt_get_msg_frame(%d,%d), got mf=%p\n", -			ioc->name, handle, ioc->id, mf)); +	dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_get_msg_frame(%d,%d), got mf=%p\n", +	    ioc->name, cb_idx, ioc->id, mf));  	return mf;  } @@ -813,7 +836,7 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)  /**   *	mpt_put_msg_frame - Send a protocol specific MPT request frame   *	to a IOC. - *	@handle: Handle of registered MPT protocol driver + *	@cb_idx: Handle of registered MPT protocol driver   *	@ioc: Pointer to MPT adapter structure   *	@mf: Pointer to MPT request frame   * @@ -821,14 +844,14 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)   *	specific MPT adapter.   */  void -mpt_put_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf) +mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)  {  	u32 mf_dma_addr;  	int req_offset;  	u16	 req_idx;	/* Request index */  	/* ensure values are reset properly! */ -	mf->u.frame.hwhdr.msgctxu.fld.cb_idx = handle;		/* byte */ +	mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx;		/* byte */  	req_offset = (u8 *)mf - (u8 *)ioc->req_frames;  								/* u16! */  	req_idx = req_offset / ioc->req_sz; @@ -838,10 +861,44 @@ mpt_put_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)  	DBG_DUMP_PUT_MSG_FRAME(ioc, (u32 *)mf);  	mf_dma_addr = (ioc->req_frames_low_dma + req_offset) | ioc->RequestNB[req_idx]; -	dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mf_dma_addr=%x req_idx=%d RequestNB=%x\n", ioc->name, mf_dma_addr, req_idx, ioc->RequestNB[req_idx])); +	dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mf_dma_addr=%x req_idx=%d " +	    "RequestNB=%x\n", ioc->name, mf_dma_addr, req_idx, +	    ioc->RequestNB[req_idx]));  	CHIPREG_WRITE32(&ioc->chip->RequestFifo, mf_dma_addr);  } +/** + *	mpt_put_msg_frame_hi_pri - Send a protocol specific MPT request frame + *	to a IOC using hi priority request queue. + *	@cb_idx: Handle of registered MPT protocol driver + *	@ioc: Pointer to MPT adapter structure + *	@mf: Pointer to MPT request frame + * + *	This routine posts a MPT request frame to the request post FIFO of a + *	specific MPT adapter. + **/ +void +mpt_put_msg_frame_hi_pri(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf) +{ +	u32 mf_dma_addr; +	int req_offset; +	u16	 req_idx;	/* Request index */ + +	/* ensure values are reset properly! */ +	mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx; +	req_offset = (u8 *)mf - (u8 *)ioc->req_frames; +	req_idx = req_offset / ioc->req_sz; +	mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx); +	mf->u.frame.hwhdr.msgctxu.fld.rsvd = 0; + +	DBG_DUMP_PUT_MSG_FRAME(ioc, (u32 *)mf); + +	mf_dma_addr = (ioc->req_frames_low_dma + req_offset); +	dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mf_dma_addr=%x req_idx=%d\n", +		ioc->name, mf_dma_addr, req_idx)); +	CHIPREG_WRITE32(&ioc->chip->RequestHiPriFifo, mf_dma_addr); +} +  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/  /**   *	mpt_free_msg_frame - Place MPT request frame back on FreeQ. @@ -899,7 +956,7 @@ mpt_add_sge(char *pAddr, u32 flagslength, dma_addr_t dma_addr)  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/  /**   *	mpt_send_handshake_request - Send MPT request via doorbell handshake method. - *	@handle: Handle of registered MPT protocol driver + *	@cb_idx: Handle of registered MPT protocol driver   *	@ioc: Pointer to MPT adapter structure   *	@reqBytes: Size of the request in bytes   *	@req: Pointer to MPT request frame @@ -914,7 +971,7 @@ mpt_add_sge(char *pAddr, u32 flagslength, dma_addr_t dma_addr)   *	Returns 0 for success, non-zero for failure.   */  int -mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag) +mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag)  {  	int	r = 0;  	u8	*req_as_bytes; @@ -934,7 +991,7 @@ mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req,  	if (reqBytes >= 12 && ii >= 0 && ii < ioc->req_depth) {  		MPT_FRAME_HDR *mf = (MPT_FRAME_HDR*)req;  		mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(ii); -		mf->u.frame.hwhdr.msgctxu.fld.cb_idx = handle; +		mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx;  	}  	/* Make sure there are no doorbells */ @@ -953,7 +1010,7 @@ mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req,  	if (!(CHIPREG_READ32(&ioc->chip->Doorbell) & MPI_DOORBELL_ACTIVE))  		return -5; -	dhsprintk(ioc, printk(KERN_INFO MYNAM ": %s: mpt_send_handshake_request start, WaitCnt=%d\n", +	dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_send_handshake_request start, WaitCnt=%d\n",  		ioc->name, ii));  	CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); @@ -1395,11 +1452,13 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)  {  	MPT_ADAPTER	*ioc;  	u8		__iomem *mem; +	u8		__iomem *pmem;  	unsigned long	 mem_phys;  	unsigned long	 port;  	u32		 msize;  	u32		 psize;  	int		 ii; +	u8		 cb_idx;  	int		 r = -ENODEV;  	u8		 revision;  	u8		 pcixcmd; @@ -1408,35 +1467,39 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)  	struct proc_dir_entry *dent, *ent;  #endif +	if (mpt_debug_level) +		printk(KERN_INFO MYNAM ": mpt_debug_level=%xh\n", mpt_debug_level); + +	if (pci_enable_device(pdev)) +		return r; +  	ioc = kzalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC);  	if (ioc == NULL) {  		printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n");  		return -ENOMEM;  	} -  	ioc->debug_level = mpt_debug_level; -	if (mpt_debug_level) -		printk(KERN_INFO MYNAM ": mpt_debug_level=%xh\n", mpt_debug_level); - -	if (pci_enable_device(pdev)) -		return r; +	ioc->id = mpt_ids++; +	sprintf(ioc->name, "ioc%d", ioc->id); -	dinitprintk(ioc, printk(KERN_WARNING MYNAM ": mpt_adapter_install\n")); +	dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": mpt_adapter_install\n", ioc->name));  	if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) { -		dprintk(ioc, printk(KERN_INFO MYNAM -			": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n")); +		dprintk(ioc, printk(MYIOC_s_INFO_FMT +			": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n", ioc->name));  	} else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { -		printk(KERN_WARNING MYNAM ": 32 BIT PCI BUS DMA ADDRESSING NOT SUPPORTED\n"); +		printk(MYIOC_s_WARN_FMT ": 32 BIT PCI BUS DMA ADDRESSING NOT SUPPORTED\n", +		    ioc->name); +		kfree(ioc);  		return r;  	}  	if (!pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) { -		dprintk(ioc, printk(KERN_INFO MYNAM -			": Using 64 bit consistent mask\n")); +		dprintk(ioc, printk(MYIOC_s_INFO_FMT +			": Using 64 bit consistent mask\n", ioc->name));  	} else { -		dprintk(ioc, printk(KERN_INFO MYNAM -			": Not using 64 bit consistent mask\n")); +		dprintk(ioc, printk(MYIOC_s_INFO_FMT +			": Not using 64 bit consistent mask\n", ioc->name));  	}  	ioc->alloc_total = sizeof(MPT_ADAPTER); @@ -1475,7 +1538,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)  	/* Find lookup slot. */  	INIT_LIST_HEAD(&ioc->list); -	ioc->id = mpt_ids++;  	mem_phys = msize = 0;  	port = psize = 0; @@ -1501,25 +1563,23 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)  	/*mem = ioremap(mem_phys, msize);*/  	mem = ioremap(mem_phys, msize);  	if (mem == NULL) { -		printk(KERN_ERR MYNAM ": ERROR - Unable to map adapter memory!\n"); +		printk(MYIOC_s_ERR_FMT "Unable to map adapter memory!\n", ioc->name);  		kfree(ioc);  		return -EINVAL;  	}  	ioc->memmap = mem; -	dinitprintk(ioc, printk(KERN_INFO MYNAM ": mem = %p, mem_phys = %lx\n", mem, mem_phys)); +	dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "mem = %p, mem_phys = %lx\n", ioc->name, mem, mem_phys)); -	dinitprintk(ioc, printk(KERN_INFO MYNAM ": facts @ %p, pfacts[0] @ %p\n", -			&ioc->facts, &ioc->pfacts[0])); +	dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "facts @ %p, pfacts[0] @ %p\n", +	    ioc->name, &ioc->facts, &ioc->pfacts[0]));  	ioc->mem_phys = mem_phys;  	ioc->chip = (SYSIF_REGS __iomem *)mem;  	/* Save Port IO values in case we need to do downloadboot */ -	{ -		u8 *pmem = (u8*)port; -		ioc->pio_mem_phys = port; -		ioc->pio_chip = (SYSIF_REGS __iomem *)pmem; -	} +	ioc->pio_mem_phys = port; +	pmem = (u8 __iomem *)port; +	ioc->pio_chip = (SYSIF_REGS __iomem *)pmem;  	pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);  	mpt_get_product_name(pdev->vendor, pdev->device, revision, ioc->prod_name); @@ -1591,8 +1651,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)  	if (ioc->errata_flag_1064)  		pci_disable_io_access(pdev); -	sprintf(ioc->name, "ioc%d", ioc->id); -  	spin_lock_init(&ioc->FreeQlock);  	/* Disable all! */ @@ -1609,9 +1667,8 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)  	if ((r = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP,  	    CAN_SLEEP)) != 0){ -		printk(KERN_WARNING MYNAM -		  ": WARNING - %s did not initialize properly! (%d)\n", -		  ioc->name, r); +		printk(MYIOC_s_ERR_FMT "didn't initialize properly! (%d)\n", +		    ioc->name, r);  		list_del(&ioc->list);  		if (ioc->alt_ioc) @@ -1623,10 +1680,10 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)  	}  	/* call per device driver probe entry point */ -	for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) { -		if(MptDeviceDriverHandlers[ii] && -		  MptDeviceDriverHandlers[ii]->probe) { -			MptDeviceDriverHandlers[ii]->probe(pdev,id); +	for(cb_idx = 0; cb_idx < MPT_MAX_PROTOCOL_DRIVERS; cb_idx++) { +		if(MptDeviceDriverHandlers[cb_idx] && +		  MptDeviceDriverHandlers[cb_idx]->probe) { +			MptDeviceDriverHandlers[cb_idx]->probe(pdev,id);  		}  	} @@ -1663,7 +1720,7 @@ mpt_detach(struct pci_dev *pdev)  {  	MPT_ADAPTER 	*ioc = pci_get_drvdata(pdev);  	char pname[32]; -	int ii; +	u8 cb_idx;  	sprintf(pname, MPT_PROCFS_MPTBASEDIR "/%s/summary", ioc->name);  	remove_proc_entry(pname, NULL); @@ -1673,10 +1730,10 @@ mpt_detach(struct pci_dev *pdev)  	remove_proc_entry(pname, NULL);  	/* call per device driver remove entry point */ -	for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) { -		if(MptDeviceDriverHandlers[ii] && -		  MptDeviceDriverHandlers[ii]->remove) { -			MptDeviceDriverHandlers[ii]->remove(pdev); +	for(cb_idx = 0; cb_idx < MPT_MAX_PROTOCOL_DRIVERS; cb_idx++) { +		if(MptDeviceDriverHandlers[cb_idx] && +		  MptDeviceDriverHandlers[cb_idx]->remove) { +			MptDeviceDriverHandlers[cb_idx]->remove(pdev);  		}  	} @@ -1788,7 +1845,7 @@ mpt_resume(struct pci_dev *pdev)  #endif  static int -mpt_signal_reset(int index, MPT_ADAPTER *ioc, int reset_phase) +mpt_signal_reset(u8 index, MPT_ADAPTER *ioc, int reset_phase)  {  	if ((MptDriverClass[index] == MPTSPI_DRIVER &&  	     ioc->bus_type != SPI) || @@ -1830,14 +1887,15 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  	int	 hard;  	int	 rc=0;  	int	 ii; +	u8	 cb_idx;  	int	 handlers;  	int	 ret = 0;  	int	 reset_alt_ioc_active = 0;  	int	 irq_allocated = 0;  	u8	*a; -	printk(KERN_INFO MYNAM ": Initiating %s %s\n", -			ioc->name, reason==MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery"); +	printk(MYIOC_s_INFO_FMT "Initiating %s\n", ioc->name, +	    reason == MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery");  	/* Disable reply interrupts (also blocks FreeQ) */  	CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); @@ -1858,21 +1916,19 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  	if ((hard_reset_done = MakeIocReady(ioc, hard, sleepFlag)) < 0) {  		if (hard_reset_done == -4) { -			printk(KERN_WARNING MYNAM ": %s Owned by PEER..skipping!\n", -					ioc->name); +			printk(MYIOC_s_WARN_FMT "Owned by PEER..skipping!\n", +			    ioc->name);  			if (reset_alt_ioc_active && ioc->alt_ioc) {  				/* (re)Enable alt-IOC! (reply interrupt, FreeQ) */ -				dprintk(ioc, printk(KERN_INFO MYNAM -					": alt-%s reply irq re-enabled\n", -						ioc->alt_ioc->name)); +				dprintk(ioc, printk(MYIOC_s_INFO_FMT +				    "alt_ioc reply irq re-enabled\n", ioc->alt_ioc->name));  				CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, MPI_HIM_DIM);  				ioc->alt_ioc->active = 1;  			}  		} else { -			printk(KERN_WARNING MYNAM ": %s NOT READY WARNING!\n", -					ioc->name); +			printk(MYIOC_s_WARN_FMT "NOT READY!\n", ioc->name);  		}  		return -1;  	} @@ -1884,9 +1940,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  		if ((rc = MakeIocReady(ioc->alt_ioc, 0, sleepFlag)) == 0)  			alt_ioc_ready = 1;  		else -			printk(KERN_WARNING MYNAM -					": alt-%s: Not ready WARNING!\n", -					ioc->alt_ioc->name); +			printk(MYIOC_s_WARN_FMT "alt_ioc not ready!\n", ioc->alt_ioc->name);  	}  	for (ii=0; ii<5; ii++) { @@ -1897,7 +1951,8 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  	if (ii == 5) { -		dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Retry IocFacts failed rc=%x\n", ioc->name, rc)); +		dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT +		    "Retry IocFacts failed rc=%x\n", ioc->name, rc));  		ret = -2;  	} else if (reason == MPT_HOSTEVENT_IOC_BRINGUP) {  		MptDisplayIocCapabilities(ioc); @@ -1906,14 +1961,14 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  	if (alt_ioc_ready) {  		if ((rc = GetIocFacts(ioc->alt_ioc, sleepFlag, reason)) != 0) {  			dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT -				"Initial Alt IocFacts failed rc=%x\n", ioc->name, rc)); +			    "Initial Alt IocFacts failed rc=%x\n", ioc->name, rc));  			/* Retry - alt IOC was initialized once  			 */  			rc = GetIocFacts(ioc->alt_ioc, sleepFlag, reason);  		}  		if (rc) {  			dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT -				"Retry Alt IocFacts failed rc=%x\n", ioc->name, rc)); +			    "Retry Alt IocFacts failed rc=%x\n", ioc->name, rc));  			alt_ioc_ready = 0;  			reset_alt_ioc_active = 0;  		} else if (reason == MPT_HOSTEVENT_IOC_BRINGUP) { @@ -1931,13 +1986,12 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  		if (ioc->pcidev->irq) {  			if (mpt_msi_enable && !pci_enable_msi(ioc->pcidev))  				printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", -					ioc->name); +				    ioc->name);  			rc = request_irq(ioc->pcidev->irq, mpt_interrupt, -					IRQF_SHARED, ioc->name, ioc); +			    IRQF_SHARED, ioc->name, ioc);  			if (rc < 0) {  				printk(MYIOC_s_ERR_FMT "Unable to allocate " -					"interrupt %d!\n", ioc->name, -					ioc->pcidev->irq); +				    "interrupt %d!\n", ioc->name, ioc->pcidev->irq);  				if (mpt_msi_enable)  					pci_disable_msi(ioc->pcidev);  				return -EBUSY; @@ -1946,8 +2000,8 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  			ioc->pci_irq = ioc->pcidev->irq;  			pci_set_master(ioc->pcidev);		/* ?? */  			pci_set_drvdata(ioc->pcidev, ioc); -			dprintk(ioc, printk(KERN_INFO MYNAM ": %s installed at interrupt " -				"%d\n", ioc->name, ioc->pcidev->irq)); +			dprintk(ioc, printk(MYIOC_s_INFO_FMT "installed at interrupt " +			    "%d\n", ioc->name, ioc->pcidev->irq));  		}  	} @@ -1966,8 +2020,8 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  		ret = -4;  // NEW!  	if (alt_ioc_ready && ((rc = PrimeIocFifos(ioc->alt_ioc)) != 0)) { -		printk(KERN_WARNING MYNAM ": alt-%s: (%d) FIFO mgmt alloc WARNING!\n", -				ioc->alt_ioc->name, rc); +		printk(MYIOC_s_WARN_FMT ": alt_ioc (%d) FIFO mgmt alloc!\n", +		    ioc->alt_ioc->name, rc);  		alt_ioc_ready = 0;  		reset_alt_ioc_active = 0;  	} @@ -1976,16 +2030,15 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  		if ((rc = SendIocInit(ioc->alt_ioc, sleepFlag)) != 0) {  			alt_ioc_ready = 0;  			reset_alt_ioc_active = 0; -			printk(KERN_WARNING MYNAM -				": alt-%s: (%d) init failure WARNING!\n", -					ioc->alt_ioc->name, rc); +			printk(MYIOC_s_WARN_FMT "alt_ioc (%d) init failure!\n", +			    ioc->alt_ioc->name, rc);  		}  	}  	if (reason == MPT_HOSTEVENT_IOC_BRINGUP){  		if (ioc->upload_fw) {  			ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT -				"firmware upload required!\n", ioc->name)); +			    "firmware upload required!\n", ioc->name));  			/* Controller is not operational, cannot do upload  			 */ @@ -2001,12 +2054,13 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  						 * mpt_diag_reset)  						 */  						ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT -							": mpt_upload:  alt_%s has cached_fw=%p \n", -							ioc->name, ioc->alt_ioc->name, ioc->alt_ioc->cached_fw)); +						    "mpt_upload:  alt_%s has cached_fw=%p \n", +						    ioc->name, ioc->alt_ioc->name, ioc->alt_ioc->cached_fw));  						ioc->alt_ioc->cached_fw = NULL;  					}  				} else { -					printk(KERN_WARNING MYNAM ": firmware upload failure!\n"); +					printk(MYIOC_s_WARN_FMT +					    "firmware upload failure!\n", ioc->name);  					ret = -5;  				}  			} @@ -2021,8 +2075,8 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  	if (reset_alt_ioc_active && ioc->alt_ioc) {  		/* (re)Enable alt-IOC! (reply interrupt) */ -		dinitprintk(ioc, printk(KERN_INFO MYNAM ": alt-%s reply irq re-enabled\n", -				ioc->alt_ioc->name)); +		dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "alt_ioc reply irq re-enabled\n", +		    ioc->alt_ioc->name));  		CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, MPI_HIM_DIM);  		ioc->alt_ioc->active = 1;  	} @@ -2075,10 +2129,8 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  				(void) GetLanConfigPages(ioc);  				a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow;  				dprintk(ioc, printk(MYIOC_s_DEBUG_FMT -					"LanAddr = %02X:%02X:%02X:" -					"%02X:%02X:%02X\n", -					ioc->name, a[5], a[4], -					a[3], a[2], a[1], a[0] )); +				    "LanAddr = %02X:%02X:%02X:%02X:%02X:%02X\n", +				    ioc->name, a[5], a[4], a[3], a[2], a[1], a[0]));  			}  		} else { @@ -2114,20 +2166,20 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)  	 */  	if (hard_reset_done) {  		rc = handlers = 0; -		for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) { -			if ((ret == 0) && MptResetHandlers[ii]) { +		for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { +			if ((ret == 0) && MptResetHandlers[cb_idx]) {  				dprintk(ioc, printk(MYIOC_s_DEBUG_FMT -					"Calling IOC post_reset handler #%d\n", -					ioc->name, ii)); -				rc += mpt_signal_reset(ii, ioc, MPT_IOC_POST_RESET); +				    "Calling IOC post_reset handler #%d\n", +				    ioc->name, cb_idx)); +				rc += mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET);  				handlers++;  			} -			if (alt_ioc_ready && MptResetHandlers[ii]) { +			if (alt_ioc_ready && MptResetHandlers[cb_idx]) {  				drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT -					"Calling alt-%s post_reset handler #%d\n", -					ioc->name, ioc->alt_ioc->name, ii)); -				rc += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_POST_RESET); +				    "Calling IOC post_reset handler #%d\n", +				    ioc->alt_ioc->name, cb_idx)); +				rc += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_POST_RESET);  				handlers++;  			}  		} @@ -2166,8 +2218,8 @@ mpt_detect_bound_ports(MPT_ADAPTER *ioc, struct pci_dev *pdev)  	dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PCI device %s devfn=%x/%x,"  	    " searching for devfn match on %x or %x\n", -		ioc->name, pci_name(pdev), pdev->bus->number, -		pdev->devfn, func-1, func+1)); +	    ioc->name, pci_name(pdev), pdev->bus->number, +	    pdev->devfn, func-1, func+1));  	peer = pci_get_slot(pdev->bus, PCI_DEVFN(slot,func-1));  	if (!peer) { @@ -2181,15 +2233,15 @@ mpt_detect_bound_ports(MPT_ADAPTER *ioc, struct pci_dev *pdev)  		if (_pcidev == peer) {  			/* Paranoia checks */  			if (ioc->alt_ioc != NULL) { -				printk(KERN_WARNING MYNAM ": Oops, already bound (%s <==> %s)!\n", +				printk(MYIOC_s_WARN_FMT "Oops, already bound to %s!\n",  					ioc->name, ioc->alt_ioc->name);  				break;  			} else if (ioc_srch->alt_ioc != NULL) { -				printk(KERN_WARNING MYNAM ": Oops, already bound (%s <==> %s)!\n", +				printk(MYIOC_s_WARN_FMT "Oops, already bound to %s!\n",  					ioc_srch->name, ioc_srch->alt_ioc->name);  				break;  			} -			dprintk(ioc, printk(KERN_INFO MYNAM ": FOUND! binding %s <==> %s\n", +			dprintk(ioc, printk(MYIOC_s_INFO_FMT "FOUND! binding to %s\n",  				ioc->name, ioc_srch->name));  			ioc_srch->alt_ioc = ioc;  			ioc->alt_ioc = ioc_srch; @@ -2210,10 +2262,11 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)  	int ret;  	if (ioc->cached_fw != NULL) { -		ddlprintk(ioc, printk(KERN_INFO MYNAM ": mpt_adapter_disable: Pushing FW onto adapter\n")); +		ddlprintk(ioc, printk(MYIOC_s_INFO_FMT +		    "mpt_adapter_disable: Pushing FW onto adapter\n", ioc->name));  		if ((ret = mpt_downloadboot(ioc, (MpiFwHeader_t *)ioc->cached_fw, NO_SLEEP)) < 0) { -			printk(KERN_WARNING MYNAM -				": firmware downloadboot failure (%d)!\n", ret); +			printk(MYIOC_s_WARN_FMT "firmware downloadboot failure (%d)!\n", +			    ioc->name, ret);  		}  	} @@ -2225,8 +2278,8 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)  	if (ioc->alloc != NULL) {  		sz = ioc->alloc_sz; -		dexitprintk(ioc, printk(KERN_INFO MYNAM ": %s.free  @ %p, sz=%d bytes\n", -		 	ioc->name, ioc->alloc, ioc->alloc_sz)); +		dexitprintk(ioc, printk(MYIOC_s_INFO_FMT "free  @ %p, sz=%d bytes\n", +		    ioc->name, ioc->alloc, ioc->alloc_sz));  		pci_free_consistent(ioc->pcidev, sz,  				ioc->alloc, ioc->alloc_dma);  		ioc->reply_frames = NULL; @@ -2286,15 +2339,14 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)  	if (ioc->HostPageBuffer != NULL) {  		if((ret = mpt_host_page_access_control(ioc,  		    MPI_DB_HPBAC_FREE_BUFFER, NO_SLEEP)) != 0) { -			printk(KERN_ERR MYNAM -			   ": %s: host page buffers free failed (%d)!\n", -			    __FUNCTION__, ret); +			printk(MYIOC_s_ERR_FMT +			   "host page buffers free failed (%d)!\n", +			    ioc->name, ret);  		} -		dexitprintk(ioc, printk(KERN_INFO MYNAM ": %s HostPageBuffer free  @ %p, sz=%d bytes\n", +		dexitprintk(ioc, printk(MYIOC_s_INFO_FMT "HostPageBuffer free  @ %p, sz=%d bytes\n",  		 	ioc->name, ioc->HostPageBuffer, ioc->HostPageBuffer_sz));  		pci_free_consistent(ioc->pcidev, ioc->HostPageBuffer_sz, -				ioc->HostPageBuffer, -				ioc->HostPageBuffer_dma); +		    ioc->HostPageBuffer, ioc->HostPageBuffer_dma);  		ioc->HostPageBuffer = NULL;  		ioc->HostPageBuffer_sz = 0;  		ioc->alloc_total -= ioc->HostPageBuffer_sz; @@ -2336,7 +2388,7 @@ mpt_adapter_dispose(MPT_ADAPTER *ioc)  #if defined(CONFIG_MTRR) && 0  	if (ioc->mtrr_reg > 0) {  		mtrr_del(ioc->mtrr_reg, 0, 0); -		dprintk(ioc, printk(KERN_INFO MYNAM ": %s: MTRR region de-registered\n", ioc->name)); +		dprintk(ioc, printk(MYIOC_s_INFO_FMT "MTRR region de-registered\n", ioc->name));  	}  #endif @@ -2344,8 +2396,8 @@ mpt_adapter_dispose(MPT_ADAPTER *ioc)  	list_del(&ioc->list);  	sz_last = ioc->alloc_total; -	dprintk(ioc, printk(KERN_INFO MYNAM ": %s: free'd %d of %d bytes\n", -			ioc->name, sz_first-sz_last+(int)sizeof(*ioc), sz_first)); +	dprintk(ioc, printk(MYIOC_s_INFO_FMT "free'd %d of %d bytes\n", +	    ioc->name, sz_first-sz_last+(int)sizeof(*ioc), sz_first));  	if (ioc->alt_ioc)  		ioc->alt_ioc->alt_ioc = NULL; @@ -2424,7 +2476,7 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag)  	/* Get current [raw] IOC state  */  	ioc_state = mpt_GetIocState(ioc, 0); -	dhsprintk(ioc, printk(KERN_INFO MYNAM "::MakeIocReady, %s [raw] state=%08x\n", ioc->name, ioc_state)); +	dhsprintk(ioc, printk(MYIOC_s_INFO_FMT "MakeIocReady [raw] state=%08x\n", ioc->name, ioc_state));  	/*  	 *	Check to see if IOC got left/stuck in doorbell handshake @@ -2446,9 +2498,9 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag)  	if ((ioc_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_FAULT) {  		statefault = 2;  		printk(MYIOC_s_WARN_FMT "IOC is in FAULT state!!!\n", -				ioc->name); -		printk(KERN_WARNING "           FAULT code = %04xh\n", -				ioc_state & MPI_DOORBELL_DATA_MASK); +		    ioc->name); +		printk(MYIOC_s_WARN_FMT "           FAULT code = %04xh\n", +		    ioc->name, ioc_state & MPI_DOORBELL_DATA_MASK);  	}  	/* @@ -2464,9 +2516,9 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag)  		 * Else, fall through to KickStart case  		 */  		whoinit = (ioc_state & MPI_DOORBELL_WHO_INIT_MASK) >> MPI_DOORBELL_WHO_INIT_SHIFT; -		dinitprintk(ioc, printk(KERN_INFO MYNAM -			": whoinit 0x%x statefault %d force %d\n", -			whoinit, statefault, force)); +		dinitprintk(ioc, printk(MYIOC_s_INFO_FMT +			"whoinit 0x%x statefault %d force %d\n", +			ioc->name, whoinit, statefault, force));  		if (whoinit == MPI_WHOINIT_PCI_PEER)  			return -4;  		else { @@ -2549,7 +2601,6 @@ mpt_GetIocState(MPT_ADAPTER *ioc, int cooked)  	/*  Get!  */  	s = CHIPREG_READ32(&ioc->chip->Doorbell); -//	dprintk((MYIOC_s_INFO_FMT "raw state = %08x\n", ioc->name, s));  	sc = s & MPI_IOC_STATE_MASK;  	/*  Save!  */ @@ -2581,9 +2632,8 @@ GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason)  	/* IOC *must* NOT be in RESET state! */  	if (ioc->last_state == MPI_IOC_STATE_RESET) { -		printk(KERN_ERR MYNAM ": ERROR - Can't get IOCFacts, %s NOT READY! (%08x)\n", -				ioc->name, -				ioc->last_state ); +		printk(MYIOC_s_ERR_FMT "Can't get IOCFacts NOT READY! (%08x)\n", +		    ioc->name, ioc->last_state );  		return -44;  	} @@ -2703,8 +2753,8 @@ GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason)  		}  		ioc->NBShiftFactor  = shiftFactor;  		dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT -			"NB_for_64_byte_frame=%x NBShiftFactor=%x BlockSize=%x\n", -			ioc->name, vv, shiftFactor, r)); +		    "NB_for_64_byte_frame=%x NBShiftFactor=%x BlockSize=%x\n", +		    ioc->name, vv, shiftFactor, r));  		if (reason == MPT_HOSTEVENT_IOC_BRINGUP) {  			/* @@ -2757,9 +2807,8 @@ GetPortFacts(MPT_ADAPTER *ioc, int portnum, int sleepFlag)  	/* IOC *must* NOT be in RESET state! */  	if (ioc->last_state == MPI_IOC_STATE_RESET) { -		printk(KERN_ERR MYNAM ": ERROR - Can't get PortFacts, %s NOT READY! (%08x)\n", -				ioc->name, -				ioc->last_state ); +		printk(MYIOC_s_ERR_FMT "Can't get PortFacts NOT READY! (%08x)\n", +		    ioc->name, ioc->last_state );  		return -4;  	} @@ -2934,7 +2983,7 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag)  		state = mpt_GetIocState(ioc, 1);  		count++;  	} -	dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "INFO - Wait IOC_OPERATIONAL state (cnt=%d)\n", +	dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Wait IOC_OPERATIONAL state (cnt=%d)\n",  			ioc->name, count));  	ioc->aen_event_read_flag=0; @@ -3027,10 +3076,9 @@ mpt_free_fw_memory(MPT_ADAPTER *ioc)  	int sz;  	sz = ioc->facts.FWImageSize; -	dinitprintk(ioc, printk(KERN_INFO MYNAM "free_fw_memory: FW Image  @ %p[%p], sz=%d[%x] bytes\n", -		 ioc->cached_fw, (void *)(ulong)ioc->cached_fw_dma, sz, sz)); -	pci_free_consistent(ioc->pcidev, sz, -			ioc->cached_fw, ioc->cached_fw_dma); +	dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "free_fw_memory: FW Image  @ %p[%p], sz=%d[%x] bytes\n", +	    ioc->name, ioc->cached_fw, (void *)(ulong)ioc->cached_fw_dma, sz, sz)); +	pci_free_consistent(ioc->pcidev, sz, ioc->cached_fw, ioc->cached_fw_dma);  	ioc->cached_fw = NULL;  	return; @@ -3054,7 +3102,6 @@ mpt_free_fw_memory(MPT_ADAPTER *ioc)  static int  mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag)  { -	u8			 request[ioc->req_sz];  	u8			 reply[sizeof(FWUploadReply_t)];  	FWUpload_t		*prequest;  	FWUploadReply_t		*preply; @@ -3071,8 +3118,8 @@ mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag)  	mpt_alloc_fw_memory(ioc, sz); -	dinitprintk(ioc, printk(KERN_INFO MYNAM ": FW Image  @ %p[%p], sz=%d[%x] bytes\n", -		 ioc->cached_fw, (void *)(ulong)ioc->cached_fw_dma, sz, sz)); +	dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": FW Image  @ %p[%p], sz=%d[%x] bytes\n", +	    ioc->name, ioc->cached_fw, (void *)(ulong)ioc->cached_fw_dma, sz, sz));  	if (ioc->cached_fw == NULL) {  		/* Major Failure. @@ -3080,11 +3127,16 @@ mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag)  		return -ENOMEM;  	} -	prequest = (FWUpload_t *)&request; -	preply = (FWUploadReply_t *)&reply; +	prequest = (sleepFlag == NO_SLEEP) ? kzalloc(ioc->req_sz, GFP_ATOMIC) : +	    kzalloc(ioc->req_sz, GFP_KERNEL); +	if (!prequest) { +		dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "fw upload failed " +		    "while allocating memory \n", ioc->name)); +		mpt_free_fw_memory(ioc); +		return -ENOMEM; +	} -	/*  Destination...  */ -	memset(prequest, 0, ioc->req_sz); +	preply = (FWUploadReply_t *)&reply;  	reply_sz = sizeof(reply);  	memset(preply, 0, reply_sz); @@ -3096,21 +3148,22 @@ mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag)  	ptcsge->DetailsLength = 12;  	ptcsge->Flags = MPI_SGE_FLAGS_TRANSACTION_ELEMENT;  	ptcsge->ImageSize = cpu_to_le32(sz); +	ptcsge++;  	sgeoffset = sizeof(FWUpload_t) - sizeof(SGE_MPI_UNION) + sizeof(FWUploadTCSGE_t);  	flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ | sz; -	mpt_add_sge(&request[sgeoffset], flagsLength, ioc->cached_fw_dma); +	mpt_add_sge((char *)ptcsge, flagsLength, ioc->cached_fw_dma);  	sgeoffset += sizeof(u32) + sizeof(dma_addr_t); -	dinitprintk(ioc, printk(KERN_INFO MYNAM ": Sending FW Upload (req @ %p) sgeoffset=%d \n", -			prequest, sgeoffset)); -	DBG_DUMP_FW_REQUEST_FRAME(ioc, (u32 *)prequest) +	dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": Sending FW Upload (req @ %p) sgeoffset=%d \n", +	    ioc->name, prequest, sgeoffset)); +	DBG_DUMP_FW_REQUEST_FRAME(ioc, (u32 *)prequest);  	ii = mpt_handshake_req_reply_wait(ioc, sgeoffset, (u32*)prequest,  				reply_sz, (u16*)preply, 65 /*seconds*/, sleepFlag); -	dinitprintk(ioc, printk(KERN_INFO MYNAM ": FW Upload completed rc=%x \n", ii)); +	dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": FW Upload completed rc=%x \n", ioc->name, ii));  	cmdStatus = -EFAULT;  	if (ii == 0) { @@ -3135,6 +3188,7 @@ mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag)  			ioc->name));  		mpt_free_fw_memory(ioc);  	} +	kfree(prequest);  	return cmdStatus;  } @@ -3381,7 +3435,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)  	u32 ioc_state=0;  	int cnt,cntdn; -	dinitprintk(ioc, printk(KERN_WARNING MYNAM ": KickStarting %s!\n", ioc->name)); +	dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "KickStarting!\n", ioc->name));  	if (ioc->bus_type == SPI) {  		/* Always issue a Msg Unit Reset first. This will clear some  		 * SCSI bus hang conditions. @@ -3400,7 +3454,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)  		return hard_reset_done;  	dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Diagnostic reset successful!\n", -			ioc->name)); +		ioc->name));  	cntdn = ((sleepFlag == CAN_SLEEP) ? HZ : 1000) * 2;	/* 2 seconds */  	for (cnt=0; cnt<cntdn; cnt++) { @@ -3417,8 +3471,8 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)  		}  	} -	printk(MYIOC_s_ERR_FMT "Failed to come READY after reset! IocState=%x\n", -			ioc->name, ioc_state); +	dinitprintk(ioc, printk(MYIOC_s_ERR_FMT "Failed to come READY after reset! IocState=%x\n", +		ioc->name, mpt_GetIocState(ioc, 0)));  	return -1;  } @@ -3560,20 +3614,20 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)  		 * MptResetHandlers[] registered yet.  		 */  		{ -			int	 ii; +			u8	 cb_idx;  			int	 r = 0; -			for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) { -				if (MptResetHandlers[ii]) { +			for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { +				if (MptResetHandlers[cb_idx]) {  					dprintk(ioc, printk(MYIOC_s_DEBUG_FMT  						"Calling IOC pre_reset handler #%d\n", -						ioc->name, ii)); -					r += mpt_signal_reset(ii, ioc, MPT_IOC_PRE_RESET); +						ioc->name, cb_idx)); +					r += mpt_signal_reset(cb_idx, ioc, MPT_IOC_PRE_RESET);  					if (ioc->alt_ioc) {  						dprintk(ioc, printk(MYIOC_s_DEBUG_FMT  							"Calling alt-%s pre_reset handler #%d\n", -							ioc->name, ioc->alt_ioc->name, ii)); -						r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_PRE_RESET); +							ioc->name, ioc->alt_ioc->name, cb_idx)); +						r += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_PRE_RESET);  					}  				}  			} @@ -3606,8 +3660,8 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)  			}  			if ((count = mpt_downloadboot(ioc,  				(MpiFwHeader_t *)iocp->cached_fw, sleepFlag)) < 0) { -				printk(KERN_WARNING MYNAM -					": firmware downloadboot failure (%d)!\n", count); +				printk(MYIOC_s_WARN_FMT +					"firmware downloadboot failure (%d)!\n", ioc->name, count);  			}  		} else { @@ -3750,8 +3804,8 @@ SendIocReset(MPT_ADAPTER *ioc, u8 reset_type, int sleepFlag)  			if (sleepFlag != CAN_SLEEP)  				count *= 10; -			printk(KERN_ERR MYNAM ": %s: ERROR - Wait IOC_READY state timeout(%d)!\n", -					ioc->name, (int)((count+5)/HZ)); +			printk(MYIOC_s_ERR_FMT "Wait IOC_READY state timeout(%d)!\n", +			    ioc->name, (int)((count+5)/HZ));  			return -ETIME;  		} @@ -4144,7 +4198,7 @@ mpt_handshake_req_reply_wait(MPT_ADAPTER *ioc, int reqBytes, u32 *req,  		}  		dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handshake request frame (@%p) header\n", ioc->name, req)); -		DBG_DUMP_REQUEST_FRAME_HDR(ioc, (u32 *)req) +		DBG_DUMP_REQUEST_FRAME_HDR(ioc, (u32 *)req);  		dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "HandShake request post done, WaitCnt=%d%s\n",  				ioc->name, t, failcnt ? " - MISSING DOORBELL ACK!" : "")); @@ -4349,7 +4403,7 @@ WaitForDoorbellReply(MPT_ADAPTER *ioc, int howlong, int sleepFlag)  #endif  	dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got Handshake reply:\n", ioc->name)); -	DBG_DUMP_REPLY_FRAME(ioc, (u32 *)mptReply) +	DBG_DUMP_REPLY_FRAME(ioc, (u32 *)mptReply);  	dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "WaitForDoorbell REPLY WaitCnt=%d (sz=%d)\n",  			ioc->name, t, u16cnt/2)); @@ -4824,8 +4878,8 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum)  				if ( (pPP0->Capabilities & MPI_SCSIPORTPAGE0_CAP_QAS) == 0 ) {  					ioc->spi_data.noQas |= MPT_TARGET_NO_NEGO_QAS; -					ddvprintk(ioc, printk(KERN_INFO MYNAM -						" :%s noQas due to Capabilities=%x\n", +					ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT +						"noQas due to Capabilities=%x\n",  						ioc->name, pPP0->Capabilities));  				}  				ioc->spi_data.maxBusWidth = pPP0->Capabilities & MPI_SCSIPORTPAGE0_CAP_WIDE ? 1 : 0; @@ -4888,6 +4942,38 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum)  				/* Nvram data is left with INVALID mark  				 */  				rc = 1; +			} else if (ioc->pcidev->vendor == PCI_VENDOR_ID_ATTO) { + +				/* This is an ATTO adapter, read Page2 accordingly +				*/ +				ATTO_SCSIPortPage2_t *pPP2 = (ATTO_SCSIPortPage2_t  *) pbuf; +				ATTODeviceInfo_t *pdevice = NULL; +				u16 ATTOFlags; + +				/* Save the Port Page 2 data +				 * (reformat into a 32bit quantity) +				 */ +				for (ii=0; ii < MPT_MAX_SCSI_DEVICES; ii++) { +				  pdevice = &pPP2->DeviceSettings[ii]; +				  ATTOFlags = le16_to_cpu(pdevice->ATTOFlags); +				  data = 0; + +				  /* Translate ATTO device flags to LSI format +				   */ +				  if (ATTOFlags & ATTOFLAG_DISC) +				    data |= (MPI_SCSIPORTPAGE2_DEVICE_DISCONNECT_ENABLE); +				  if (ATTOFlags & ATTOFLAG_ID_ENB) +				    data |= (MPI_SCSIPORTPAGE2_DEVICE_ID_SCAN_ENABLE); +				  if (ATTOFlags & ATTOFLAG_LUN_ENB) +				    data |= (MPI_SCSIPORTPAGE2_DEVICE_LUN_SCAN_ENABLE); +				  if (ATTOFlags & ATTOFLAG_TAGGED) +				    data |= (MPI_SCSIPORTPAGE2_DEVICE_TAG_QUEUE_ENABLE); +				  if (!(ATTOFlags & ATTOFLAG_WIDE_ENB)) +				    data |= (MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE); + +				  data = (data << 16) | (pdevice->Period << 8) | 10; +				  ioc->spi_data.nvram[ii] = data; +				}  			} else {  				SCSIPortPage2_t *pPP2 = (SCSIPortPage2_t  *) pbuf;  				MpiDeviceInfo_t	*pdevice = NULL; @@ -5701,10 +5787,10 @@ mpt_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)  	CONFIGPARMS *pCfg;  	unsigned long flags; -	dprintk(ioc, printk(KERN_DEBUG MYNAM -			": IOC %s_reset routed to MPT base driver!\n", -			reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( -			reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); +	dprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    ": IOC %s_reset routed to MPT base driver!\n", +	    ioc->name, reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( +	    reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));  	if (reset_phase == MPT_IOC_SETUP_RESET) {  		; @@ -5843,7 +5929,7 @@ procmpt_summary_read(char *buf, char **start, off_t offset, int request, int *eo  static int  procmpt_version_read(char *buf, char **start, off_t offset, int request, int *eof, void *data)  { -	int	 ii; +	u8	 cb_idx;  	int	 scsi, fc, sas, lan, ctl, targ, dmp;  	char	*drvname;  	int	 len; @@ -5852,10 +5938,10 @@ procmpt_version_read(char *buf, char **start, off_t offset, int request, int *eo  	len += sprintf(buf+len, "  Fusion MPT base driver\n");  	scsi = fc = sas = lan = ctl = targ = dmp = 0; -	for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) { +	for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {  		drvname = NULL; -		if (MptCallbacks[ii]) { -			switch (MptDriverClass[ii]) { +		if (MptCallbacks[cb_idx]) { +			switch (MptDriverClass[cb_idx]) {  			case MPTSPI_DRIVER:  				if (!scsi++) drvname = "SPI host";  				break; @@ -6099,26 +6185,25 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)  	 * For all other protocol drivers, this is a no-op.  	 */  	{ -		int	 ii; +		u8	 cb_idx;  		int	 r = 0; -		for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) { -			if (MptResetHandlers[ii]) { +		for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { +			if (MptResetHandlers[cb_idx]) {  				dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Calling IOC reset_setup handler #%d\n", -						ioc->name, ii)); -				r += mpt_signal_reset(ii, ioc, MPT_IOC_SETUP_RESET); +						ioc->name, cb_idx)); +				r += mpt_signal_reset(cb_idx, ioc, MPT_IOC_SETUP_RESET);  				if (ioc->alt_ioc) {  					dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Calling alt-%s setup reset handler #%d\n", -							ioc->name, ioc->alt_ioc->name, ii)); -					r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_SETUP_RESET); +							ioc->name, ioc->alt_ioc->name, cb_idx)); +					r += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_SETUP_RESET);  				}  			}  		}  	}  	if ((rc = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_RECOVER, sleepFlag)) != 0) { -		printk(KERN_WARNING MYNAM ": WARNING - (%d) Cannot recover %s\n", -			rc, ioc->name); +		printk(MYIOC_s_WARN_FMT "Cannot recover rc = %d!\n", ioc->name, rc);  	}  	ioc->reload_fw = 0;  	if (ioc->alt_ioc) @@ -6515,6 +6600,7 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply  	u32 evData0 = 0;  //	u32 evCtx;  	int ii; +	u8 cb_idx;  	int r = 0;  	int handlers = 0;  	char evStr[EVENT_DESCR_STR_SZ]; @@ -6537,12 +6623,12 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply  			evStr));  #ifdef CONFIG_FUSION_LOGGING -	devtverboseprintk(ioc, printk(KERN_DEBUG MYNAM -	    ": Event data:\n")); +	devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    ": Event data:\n", ioc->name));  	for (ii = 0; ii < evDataLen; ii++)  		devtverboseprintk(ioc, printk(" %08x",  		    le32_to_cpu(pEventReply->Data[ii]))); -	devtverboseprintk(ioc, printk(KERN_DEBUG "\n")); +	devtverboseprintk(ioc, printk("\n"));  #endif  	/* @@ -6595,11 +6681,11 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply  	/*  	 *  Call each currently registered protocol event handler.  	 */ -	for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) { -		if (MptEvHandlers[ii]) { +	for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { +		if (MptEvHandlers[cb_idx]) {  			devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Routing Event to event handler #%d\n", -					ioc->name, ii)); -			r += (*(MptEvHandlers[ii]))(ioc, pEventReply); +					ioc->name, cb_idx)); +			r += (*(MptEvHandlers[cb_idx]))(ioc, pEventReply);  			handlers++;  		}  	} @@ -7034,8 +7120,8 @@ mpt_iocstatus_info_config(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)  	if (!desc)  		return; -	printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04X): %s: %s\n", -	    ioc->name, ioc_status, desc, extend_desc); +	dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IOCStatus(0x%04X): %s: %s\n", +	    ioc->name, ioc_status, desc, extend_desc));  }  /** @@ -7261,7 +7347,8 @@ mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)  	if (!desc)  		return; -	printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04X): %s\n", ioc->name, status, desc); +	dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IOCStatus(0x%04X): %s\n", +	    ioc->name, status, desc));  }  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -7283,14 +7370,13 @@ EXPORT_SYMBOL(mpt_device_driver_register);  EXPORT_SYMBOL(mpt_device_driver_deregister);  EXPORT_SYMBOL(mpt_get_msg_frame);  EXPORT_SYMBOL(mpt_put_msg_frame); +EXPORT_SYMBOL(mpt_put_msg_frame_hi_pri);  EXPORT_SYMBOL(mpt_free_msg_frame);  EXPORT_SYMBOL(mpt_add_sge);  EXPORT_SYMBOL(mpt_send_handshake_request);  EXPORT_SYMBOL(mpt_verify_adapter);  EXPORT_SYMBOL(mpt_GetIocState);  EXPORT_SYMBOL(mpt_print_ioc_summary); -EXPORT_SYMBOL(mpt_lan_index); -EXPORT_SYMBOL(mpt_stm_index);  EXPORT_SYMBOL(mpt_HardResetHandler);  EXPORT_SYMBOL(mpt_config);  EXPORT_SYMBOL(mpt_findImVolumes); @@ -7308,16 +7394,16 @@ EXPORT_SYMBOL(mpt_raid_phys_disk_pg0);  static int __init  fusion_init(void)  { -	int i; +	u8 cb_idx;  	show_mptmod_ver(my_NAME, my_VERSION);  	printk(KERN_INFO COPYRIGHT "\n"); -	for (i = 0; i < MPT_MAX_PROTOCOL_DRIVERS; i++) { -		MptCallbacks[i] = NULL; -		MptDriverClass[i] = MPTUNKNOWN_DRIVER; -		MptEvHandlers[i] = NULL; -		MptResetHandlers[i] = NULL; +	for (cb_idx = 0; cb_idx < MPT_MAX_PROTOCOL_DRIVERS; cb_idx++) { +		MptCallbacks[cb_idx] = NULL; +		MptDriverClass[cb_idx] = MPTUNKNOWN_DRIVER; +		MptEvHandlers[cb_idx] = NULL; +		MptResetHandlers[cb_idx] = NULL;  	}  	/*  Register ourselves (mptbase) in order to facilitate diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index 15ff2264584..d7682e083f5 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h @@ -3,9 +3,9 @@   *      High performance SCSI + LAN / Fibre Channel device drivers.   *      For use with PCI chip/adapter(s):   *          LSIFC9xx/LSI409xx Fibre Channel - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 1999-2007 LSI Logic Corporation + *  Copyright (c) 1999-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com)   *   */ @@ -68,15 +68,15 @@  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/  #ifndef MODULEAUTHOR -#define MODULEAUTHOR	"LSI Logic Corporation" +#define MODULEAUTHOR	"LSI Corporation"  #endif  #ifndef COPYRIGHT  #define COPYRIGHT	"Copyright (c) 1999-2007 " MODULEAUTHOR  #endif -#define MPT_LINUX_VERSION_COMMON	"3.04.05" -#define MPT_LINUX_PACKAGE_NAME		"@(#)mptlinux-3.04.05" +#define MPT_LINUX_VERSION_COMMON	"3.04.06" +#define MPT_LINUX_PACKAGE_NAME		"@(#)mptlinux-3.04.06"  #define WHAT_MAGIC_STRING		"@" "(" "#" ")"  #define show_mptmod_ver(s,ver)  \ @@ -186,6 +186,7 @@   * MPT drivers.  NOTE: Users of these macro defs must   * themselves define their own MYNAM.   */ +#define MYIOC_s_FMT			MYNAM ": %s: "  #define MYIOC_s_DEBUG_FMT		KERN_DEBUG MYNAM ": %s: "  #define MYIOC_s_INFO_FMT		KERN_INFO MYNAM ": %s: "  #define MYIOC_s_NOTE_FMT		KERN_NOTICE MYNAM ": %s: " @@ -194,6 +195,35 @@  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/  /* + *  ATTO UL4D associated structures and defines + */ +#define ATTOFLAG_DISC     0x0001 +#define ATTOFLAG_TAGGED   0x0002 +#define ATTOFLAG_WIDE_ENB 0x0008 +#define ATTOFLAG_ID_ENB   0x0010 +#define ATTOFLAG_LUN_ENB  0x0060 + +typedef struct _ATTO_DEVICE_INFO +{ +	u8	Offset;					/* 00h */ +	u8	Period;					/* 01h */ +	u16	ATTOFlags;				/* 02h */ +} ATTO_DEVICE_INFO, MPI_POINTER PTR_ATTO_DEVICE_INFO, +  ATTODeviceInfo_t, MPI_POINTER pATTODeviceInfo_t; + +typedef struct _ATTO_CONFIG_PAGE_SCSI_PORT_2 +{ +	CONFIG_PAGE_HEADER	Header;			/* 00h */ +	u16			PortFlags;		/* 04h */ +	u16			Unused1;		/* 06h */ +	u32			Unused2;		/* 08h */ +	ATTO_DEVICE_INFO	DeviceSettings[16];	/* 0Ch */ +} fATTO_CONFIG_PAGE_SCSI_PORT_2, MPI_POINTER PTR_ATTO_CONFIG_PAGE_SCSI_PORT_2, +  ATTO_SCSIPortPage2_t, MPI_POINTER pATTO_SCSIPortPage2_t; + + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/*   *  MPT protocol driver defs...   */  typedef enum { @@ -307,7 +337,8 @@ typedef struct _SYSIF_REGS  	u32	Reserved2[2];	/* 38-3F  reserved for future use    */  	u32	RequestFifo;	/* 40     Request Post/Free FIFO     */  	u32	ReplyFifo;	/* 44     Reply   Post/Free FIFO     */ -	u32	Reserved3[2];	/* 48-4F  reserved for future use    */ +	u32	RequestHiPriFifo; /* 48   Hi Priority Request FIFO   */ +	u32	Reserved3;	/* 4C-4F  reserved for future use    */  	u32	HostIndex;	/* 50     Host Index register        */  	u32	Reserved4[15];	/* 54-8F                             */  	u32	Fubar;		/* 90     For Fubar usage            */ @@ -649,9 +680,9 @@ typedef struct _MPT_ADAPTER  	u8			 reload_fw;	/* Force a FW Reload on next reset */  	u8			 NBShiftFactor;  /* NB Shift Factor based on Block Size (Facts)  */  	u8			 pad1[4]; -	int			 DoneCtx; -	int			 TaskCtx; -	int			 InternalCtx; +	u8			 DoneCtx; +	u8			 TaskCtx; +	u8			 InternalCtx;  	spinlock_t		 initializing_hba_lock;  	int 	 		 initializing_hba_lock_flag;  	struct list_head	 list; @@ -668,10 +699,14 @@ typedef struct _MPT_ADAPTER  	struct work_struct	 fc_setup_reset_work;  	struct list_head	 fc_rports; +	struct work_struct	 fc_lsc_work; +	u8			 fc_link_speed[2];  	spinlock_t		 fc_rescan_work_lock;  	struct work_struct	 fc_rescan_work;  	char			 fc_rescan_work_q_name[KOBJ_NAME_LEN];  	struct workqueue_struct *fc_rescan_work_q; +	struct scsi_cmnd	**ScsiLookup; +	spinlock_t		  scsi_lookup_lock;  } MPT_ADAPTER;  /* @@ -785,7 +820,6 @@ typedef struct _MPT_SCSI_HOST {  	MPT_ADAPTER		 *ioc;  	int			  port;  	u32			  pad0; -	struct scsi_cmnd	**ScsiLookup;  	MPT_LOCAL_REPLY		 *pLocal;		/* used for internal commands */  	struct timer_list	  timer;  		/* Pool of memory for holding SCpnts before doing @@ -853,20 +887,21 @@ extern void	 mpt_detach(struct pci_dev *pdev);  extern int	 mpt_suspend(struct pci_dev *pdev, pm_message_t state);  extern int	 mpt_resume(struct pci_dev *pdev);  #endif -extern int	 mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass); -extern void	 mpt_deregister(int cb_idx); -extern int	 mpt_event_register(int cb_idx, MPT_EVHANDLER ev_cbfunc); -extern void	 mpt_event_deregister(int cb_idx); -extern int	 mpt_reset_register(int cb_idx, MPT_RESETHANDLER reset_func); -extern void	 mpt_reset_deregister(int cb_idx); -extern int	 mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx); -extern void	 mpt_device_driver_deregister(int cb_idx); -extern MPT_FRAME_HDR	*mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc); +extern u8	 mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass); +extern void	 mpt_deregister(u8 cb_idx); +extern int	 mpt_event_register(u8 cb_idx, MPT_EVHANDLER ev_cbfunc); +extern void	 mpt_event_deregister(u8 cb_idx); +extern int	 mpt_reset_register(u8 cb_idx, MPT_RESETHANDLER reset_func); +extern void	 mpt_reset_deregister(u8 cb_idx); +extern int	 mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, u8 cb_idx); +extern void	 mpt_device_driver_deregister(u8 cb_idx); +extern MPT_FRAME_HDR	*mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc);  extern void	 mpt_free_msg_frame(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf); -extern void	 mpt_put_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf); +extern void	 mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf); +extern void	 mpt_put_msg_frame_hi_pri(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);  extern void	 mpt_add_sge(char *pAddr, u32 flagslength, dma_addr_t dma_addr); -extern int	 mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag); +extern int	 mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag);  extern int	 mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp);  extern u32	 mpt_GetIocState(MPT_ADAPTER *ioc, int cooked);  extern void	 mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buf, int *size, int len, int showlan); @@ -884,9 +919,6 @@ extern int	 mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, pRaidPhys  extern struct list_head	  ioc_list;  extern struct proc_dir_entry	*mpt_proc_root_dir; -extern int		  mpt_lan_index;	/* needed by mptlan.c */ -extern int		  mpt_stm_index;	/* needed by mptstm.c */ -  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/  #endif		/* } __KERNEL__ */ diff --git a/drivers/message/fusion/mptctl.c b/drivers/message/fusion/mptctl.c index 89695e705bd..6029509702d 100644 --- a/drivers/message/fusion/mptctl.c +++ b/drivers/message/fusion/mptctl.c @@ -1,10 +1,10 @@  /*   *  linux/drivers/message/fusion/mptctl.c   *      mpt Ioctl driver. - *      For use with LSI Logic PCI chip/adapters - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      For use with LSI PCI chip/adapters + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 1999-2007 LSI Logic Corporation + *  Copyright (c) 1999-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com)   *   */ @@ -66,8 +66,8 @@  #include <scsi/scsi_host.h>  #include <scsi/scsi_tcq.h> -#define COPYRIGHT	"Copyright (c) 1999-2007 LSI Logic Corporation" -#define MODULEAUTHOR	"LSI Logic Corporation" +#define COPYRIGHT	"Copyright (c) 1999-2007 LSI Corporation" +#define MODULEAUTHOR	"LSI Corporation"  #include "mptbase.h"  #include "mptctl.h" @@ -83,7 +83,7 @@ MODULE_VERSION(my_VERSION);  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -static int mptctl_id = -1; +static u8 mptctl_id = MPT_MAX_PROTOCOL_DRIVERS;  static DECLARE_WAIT_QUEUE_HEAD ( mptctl_wait ); @@ -181,7 +181,6 @@ static inline int  mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock)  {  	int rc = 0; -//	dctlprintk(ioc, printk(KERN_DEBUG MYNAM "::mptctl_syscall_down(%p,%d) called\n", ioc, nonblock));  	if (nonblock) {  		if (!mutex_trylock(&ioc->ioctl->ioctl_mutex)) @@ -190,7 +189,6 @@ mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock)  		if (mutex_lock_interruptible(&ioc->ioctl->ioctl_mutex))  			rc = -ERESTARTSYS;  	} -//	dctlprintk(ioc, printk(KERN_DEBUG MYNAM "::mptctl_syscall_down return %d\n", rc));  	return rc;  } @@ -342,7 +340,7 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)  	SCSITaskMgmt_t	*pScsiTm;  	MPT_SCSI_HOST	*hd;  	int		 ii; -	int		 retval; +	int		 retval=0;  	ioctl->reset &= ~MPTCTL_RESET_OK; @@ -350,7 +348,7 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)  	if (ioctl->ioc->sh == NULL)  		return -EPERM; -	hd = (MPT_SCSI_HOST *) ioctl->ioc->sh->hostdata; +	hd = shost_priv(ioctl->ioc->sh);  	if (hd == NULL)  		return -EPERM; @@ -395,12 +393,19 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)  	DBG_DUMP_TM_REQUEST_FRAME(ioctl->ioc, (u32 *)mf);  	ioctl->wait_done=0; -	if ((retval = mpt_send_handshake_request(mptctl_id, ioctl->ioc, -	     sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP)) != 0) { -		dfailprintk(ioctl->ioc, printk(MYIOC_s_ERR_FMT "_send_handshake FAILED!" -			" (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd, -			hd->ioc, mf)); -		goto mptctl_bus_reset_done; + +	if ((ioctl->ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q) && +	    (ioctl->ioc->facts.MsgVersion >= MPI_VERSION_01_05)) +		mpt_put_msg_frame_hi_pri(mptctl_id, ioctl->ioc, mf); +	else { +		retval = mpt_send_handshake_request(mptctl_id, ioctl->ioc, +			sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP); +		if (retval != 0) { +			dfailprintk(ioctl->ioc, printk(MYIOC_s_ERR_FMT "_send_handshake FAILED!" +				" (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd, +				hd->ioc, mf)); +			goto mptctl_bus_reset_done; +		}  	}  	/* Now wait for the command to complete */ @@ -444,7 +449,7 @@ mptctl_free_tm_flags(MPT_ADAPTER *ioc)  	MPT_SCSI_HOST * hd;  	unsigned long flags; -	hd = (MPT_SCSI_HOST *) ioc->sh->hostdata; +	hd = shost_priv(ioc->sh);  	if (hd == NULL)  		return; @@ -468,7 +473,7 @@ static int  mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)  {  	MPT_IOCTL *ioctl = ioc->ioctl; -	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": IOC %s_reset routed to IOCTL driver!\n",ioc->name, +	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IOC %s_reset routed to IOCTL driver!\n", ioc->name,  		reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (  		reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); @@ -574,7 +579,7 @@ __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	MPT_ADAPTER *iocp = NULL;  	if (copy_from_user(&khdr, uhdr, sizeof(khdr))) { -		printk(KERN_ERR "%s::mptctl_ioctl() @%d - " +		printk(KERN_ERR MYNAM "%s::mptctl_ioctl() @%d - "  				"Unable to copy mpt_ioctl_header data @ %p\n",  				__FILE__, __LINE__, uhdr);  		return -EFAULT; @@ -587,13 +592,13 @@ __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	iocnumX = khdr.iocnum & 0xFF;  	if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||  	    (iocp == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_ioctl() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_ioctl() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnumX);  		return -ENODEV;  	}  	if (!iocp->active) { -		printk(KERN_DEBUG "%s::mptctl_ioctl() @%d - Controller disabled.\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_ioctl() @%d - Controller disabled.\n",  				__FILE__, __LINE__);  		return -EFAULT;  	} @@ -660,14 +665,14 @@ static int mptctl_do_reset(unsigned long arg)  	MPT_ADAPTER		*iocp;  	if (copy_from_user(&krinfo, urinfo, sizeof(struct mpt_ioctl_diag_reset))) { -		printk(KERN_ERR "%s@%d::mptctl_do_reset - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_do_reset - "  				"Unable to copy mpt_ioctl_diag_reset struct @ %p\n",  				__FILE__, __LINE__, urinfo);  		return -EFAULT;  	}  	if (mpt_verify_adapter(krinfo.hdr.iocnum, &iocp) < 0) { -		printk(KERN_DEBUG "%s@%d::mptctl_do_reset - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s@%d::mptctl_do_reset - ioc%d not found!\n",  				__FILE__, __LINE__, krinfo.hdr.iocnum);  		return -ENODEV; /* (-6) No such device or address */  	} @@ -676,8 +681,8 @@ static int mptctl_do_reset(unsigned long arg)  	    iocp->name));  	if (mpt_HardResetHandler(iocp, CAN_SLEEP) != 0) { -		printk (KERN_ERR "%s@%d::mptctl_do_reset - reset failed.\n", -			__FILE__, __LINE__); +		printk (MYIOC_s_ERR_FMT "%s@%d::mptctl_do_reset - reset failed.\n", +			iocp->name, __FILE__, __LINE__);  		return -1;  	} @@ -708,7 +713,7 @@ mptctl_fw_download(unsigned long arg)  	struct mpt_fw_xfer	 kfwdl;  	if (copy_from_user(&kfwdl, ufwdl, sizeof(struct mpt_fw_xfer))) { -		printk(KERN_ERR "%s@%d::_ioctl_fwdl - " +		printk(KERN_ERR MYNAM "%s@%d::_ioctl_fwdl - "  				"Unable to copy mpt_fw_xfer struct @ %p\n",  				__FILE__, __LINE__, ufwdl);  		return -EFAULT; @@ -756,7 +761,8 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)  	pFWDownloadReply_t	 ReplyMsg = NULL;  	if (mpt_verify_adapter(ioc, &iocp) < 0) { -		printk(KERN_DEBUG "ioctl_fwdl - ioc%d not found!\n",				 ioc); +		printk(KERN_DEBUG MYNAM "ioctl_fwdl - ioc%d not found!\n", +				 ioc);  		return -ENODEV; /* (-6) No such device or address */  	} else { @@ -868,9 +874,9 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)  			mpt_add_sge(sgOut, sgIn->FlagsLength, sgIn->Address);  			n++;  			if (copy_from_user(bl->kptr, ufwbuf+fw_bytes_copied, bl->len)) { -				printk(KERN_ERR "%s@%d::_ioctl_fwdl - " -						"Unable to copy f/w buffer hunk#%d @ %p\n", -						__FILE__, __LINE__, n, ufwbuf); +				printk(MYIOC_s_ERR_FMT "%s@%d::_ioctl_fwdl - " +					"Unable to copy f/w buffer hunk#%d @ %p\n", +					iocp->name, __FILE__, __LINE__, n, ufwbuf);  				goto fwdl_out;  			}  			fw_bytes_copied += bl->len; @@ -906,21 +912,22 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)  	ReplyMsg = (pFWDownloadReply_t)iocp->ioctl->ReplyFrame;  	iocstat = le16_to_cpu(ReplyMsg->IOCStatus) & MPI_IOCSTATUS_MASK;  	if (iocstat == MPI_IOCSTATUS_SUCCESS) { -		printk(KERN_INFO MYNAM ": F/W update successfully sent to %s!\n", iocp->name); +		printk(MYIOC_s_INFO_FMT "F/W update successfull!\n", iocp->name);  		return 0;  	} else if (iocstat == MPI_IOCSTATUS_INVALID_FUNCTION) { -		printk(KERN_WARNING MYNAM ": ?Hmmm...  %s says it doesn't support F/W download!?!\n", -				iocp->name); -		printk(KERN_WARNING MYNAM ": (time to go bang on somebodies door)\n"); +		printk(MYIOC_s_WARN_FMT "Hmmm...  F/W download not supported!?!\n", +			iocp->name); +		printk(MYIOC_s_WARN_FMT "(time to go bang on somebodies door)\n", +			iocp->name);  		return -EBADRQC;  	} else if (iocstat == MPI_IOCSTATUS_BUSY) { -		printk(KERN_WARNING MYNAM ": Warning!  %s says: IOC_BUSY!\n", iocp->name); -		printk(KERN_WARNING MYNAM ": (try again later?)\n"); +		printk(MYIOC_s_WARN_FMT "IOC_BUSY!\n", iocp->name); +		printk(MYIOC_s_WARN_FMT "(try again later?)\n", iocp->name);  		return -EBUSY;  	} else { -		printk(KERN_WARNING MYNAM "::ioctl_fwdl() ERROR!  %s returned [bad] status = %04xh\n", -				    iocp->name, iocstat); -		printk(KERN_WARNING MYNAM ": (bad VooDoo)\n"); +		printk(MYIOC_s_WARN_FMT "ioctl_fwdl() returned [bad] status = %04xh\n", +			iocp->name, iocstat); +		printk(MYIOC_s_WARN_FMT "(bad VooDoo)\n", iocp->name);  		return -ENOMSG;  	}  	return 0; @@ -970,10 +977,9 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,  	 * structures for the SG elements.  	 */  	i = MAX_SGL_BYTES / 8; -	buflist = kmalloc(i, GFP_USER); -	if (buflist == NULL) +	buflist = kzalloc(i, GFP_USER); +	if (!buflist)  		return NULL; -	memset(buflist, 0, i);  	buflist_ent = 0;  	/* Allocate a single block of memory to store the sg elements and @@ -1008,10 +1014,10 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,  		if (buflist[buflist_ent].kptr == NULL) {  			alloc_sz = alloc_sz / 2;  			if (alloc_sz == 0) { -				printk(KERN_WARNING MYNAM "-SG: No can do - " -						    "not enough memory!   :-(\n"); -				printk(KERN_WARNING MYNAM "-SG: (freeing %d frags)\n", -						    numfrags); +				printk(MYIOC_s_WARN_FMT "-SG: No can do - " +				    "not enough memory!   :-(\n", ioc->name); +				printk(MYIOC_s_WARN_FMT "-SG: (freeing %d frags)\n", +					ioc->name, numfrags);  				goto free_and_fail;  			}  			continue; @@ -1034,18 +1040,19 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,  		/* Need to chain? */  		if (fragcnt == sg_spill) { -			printk(KERN_WARNING MYNAM "-SG: No can do - " "Chain required!   :-(\n"); -			printk(KERN_WARNING MYNAM "(freeing %d frags)\n", numfrags); +			printk(MYIOC_s_WARN_FMT +			    "-SG: No can do - " "Chain required!   :-(\n", ioc->name); +			printk(MYIOC_s_WARN_FMT "(freeing %d frags)\n", ioc->name, numfrags);  			goto free_and_fail;  		}  		/* overflow check... */  		if (numfrags*8 > MAX_SGL_BYTES){  			/* GRRRRR... */ -			printk(KERN_WARNING MYNAM "-SG: No can do - " -					    "too many SG frags!   :-(\n"); -			printk(KERN_WARNING MYNAM "-SG: (freeing %d frags)\n", -					    numfrags); +			printk(MYIOC_s_WARN_FMT "-SG: No can do - " +				"too many SG frags!   :-(\n", ioc->name); +			printk(MYIOC_s_WARN_FMT "-SG: (freeing %d frags)\n", +				ioc->name, numfrags);  			goto free_and_fail;  		}  	} @@ -1066,8 +1073,6 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,  free_and_fail:  	if (sglbuf != NULL) { -		int i; -  		for (i = 0; i < numfrags; i++) {  			dma_addr_t dma_addr;  			u8 *kptr; @@ -1170,7 +1175,7 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)  	int			cim_rev;  	u8			revision;  	struct scsi_device 	*sdev; -	VirtDevice		*vdev; +	VirtDevice		*vdevice;  	/* Add of PCI INFO results in unaligned access for  	 * IA64 and Sparc. Reset long to int. Return no PCI @@ -1189,13 +1194,13 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)  	karg = kmalloc(data_size, GFP_KERNEL);  	if (karg == NULL) { -		printk(KERN_ERR "%s::mpt_ioctl_iocinfo() @%d - no memory available!\n", +		printk(KERN_ERR MYNAM "%s::mpt_ioctl_iocinfo() @%d - no memory available!\n",  				__FILE__, __LINE__);  		return -ENOMEM;  	}  	if (copy_from_user(karg, uarg, data_size)) { -		printk(KERN_ERR "%s@%d::mptctl_getiocinfo - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_getiocinfo - "  			"Unable to read in mpt_ioctl_iocinfo struct @ %p\n",  				__FILE__, __LINE__, uarg);  		kfree(karg); @@ -1204,7 +1209,7 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)  	if (((iocnum = mpt_verify_adapter(karg->hdr.iocnum, &ioc)) < 0) ||  	    (ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_getiocinfo() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_getiocinfo() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		kfree(karg);  		return -ENODEV; @@ -1212,9 +1217,9 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)  	/* Verify the data transfer size is correct. */  	if (karg->hdr.maxDataSize != data_size) { -		printk(KERN_ERR "%s@%d::mptctl_getiocinfo - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_getiocinfo - "  			"Structure size mismatch. Command not completed.\n", -				__FILE__, __LINE__); +			ioc->name, __FILE__, __LINE__);  		kfree(karg);  		return -EFAULT;  	} @@ -1265,8 +1270,8 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)  	karg->numDevices = 0;  	if (ioc->sh) {  		shost_for_each_device(sdev, ioc->sh) { -			vdev = sdev->hostdata; -			if (vdev->vtarget->tflags & +			vdevice = sdev->hostdata; +			if (vdevice->vtarget->tflags &  			    MPT_TARGET_FLAGS_RAID_COMPONENT)  				continue;  			karg->numDevices++; @@ -1290,9 +1295,9 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)  	/* Copy the data from kernel memory to user memory  	 */  	if (copy_to_user((char __user *)arg, karg, data_size)) { -		printk(KERN_ERR "%s@%d::mptctl_getiocinfo - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_getiocinfo - "  			"Unable to write out mpt_ioctl_iocinfo struct @ %p\n", -				__FILE__, __LINE__, uarg); +			ioc->name, __FILE__, __LINE__, uarg);  		kfree(karg);  		return -EFAULT;  	} @@ -1317,7 +1322,7 @@ mptctl_gettargetinfo (unsigned long arg)  	struct mpt_ioctl_targetinfo __user *uarg = (void __user *) arg;  	struct mpt_ioctl_targetinfo karg;  	MPT_ADAPTER		*ioc; -	VirtDevice		*vdev; +	VirtDevice		*vdevice;  	char			*pmem;  	int			*pdata;  	int			iocnum; @@ -1329,7 +1334,7 @@ mptctl_gettargetinfo (unsigned long arg)  	struct scsi_device 	*sdev;  	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_targetinfo))) { -		printk(KERN_ERR "%s@%d::mptctl_gettargetinfo - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_gettargetinfo - "  			"Unable to read in mpt_ioctl_targetinfo struct @ %p\n",  				__FILE__, __LINE__, uarg);  		return -EFAULT; @@ -1337,7 +1342,7 @@ mptctl_gettargetinfo (unsigned long arg)  	if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||  	    (ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_gettargetinfo() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_gettargetinfo() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		return -ENODEV;  	} @@ -1353,8 +1358,8 @@ mptctl_gettargetinfo (unsigned long arg)  	port = karg.hdr.port;  	if (maxWordsLeft <= 0) { -		printk(KERN_ERR "%s::mptctl_gettargetinfo() @%d - no memory available!\n", -				__FILE__, __LINE__); +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo() - no memory available!\n", +			ioc->name, __FILE__, __LINE__);  		return -ENOMEM;  	} @@ -1372,13 +1377,12 @@ mptctl_gettargetinfo (unsigned long arg)  	 *      15- 8: Bus Number  	 *       7- 0: Target ID  	 */ -	pmem = kmalloc(numBytes, GFP_KERNEL); -	if (pmem == NULL) { -		printk(KERN_ERR "%s::mptctl_gettargetinfo() @%d - no memory available!\n", -				__FILE__, __LINE__); +	pmem = kzalloc(numBytes, GFP_KERNEL); +	if (!pmem) { +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo() - no memory available!\n", +			ioc->name, __FILE__, __LINE__);  		return -ENOMEM;  	} -	memset(pmem, 0, numBytes);  	pdata =  (int *) pmem;  	/* Get number of devices @@ -1387,13 +1391,13 @@ mptctl_gettargetinfo (unsigned long arg)  		shost_for_each_device(sdev, ioc->sh) {  			if (!maxWordsLeft)  				continue; -			vdev = sdev->hostdata; -			if (vdev->vtarget->tflags & +			vdevice = sdev->hostdata; +			if (vdevice->vtarget->tflags &  			    MPT_TARGET_FLAGS_RAID_COMPONENT)  				continue; -			lun = (vdev->vtarget->raidVolume) ? 0x80 : vdev->lun; -			*pdata = (((u8)lun << 16) + (vdev->vtarget->channel << 8) + -			    (vdev->vtarget->id )); +			lun = (vdevice->vtarget->raidVolume) ? 0x80 : vdevice->lun; +			*pdata = (((u8)lun << 16) + (vdevice->vtarget->channel << 8) + +			    (vdevice->vtarget->id ));  			pdata++;  			numDevices++;  			--maxWordsLeft; @@ -1405,9 +1409,9 @@ mptctl_gettargetinfo (unsigned long arg)  	 */  	if (copy_to_user((char __user *)arg, &karg,  				sizeof(struct mpt_ioctl_targetinfo))) { -		printk(KERN_ERR "%s@%d::mptctl_gettargetinfo - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo - "  			"Unable to write out mpt_ioctl_targetinfo struct @ %p\n", -				__FILE__, __LINE__, uarg); +			ioc->name, __FILE__, __LINE__, uarg);  		kfree(pmem);  		return -EFAULT;  	} @@ -1415,9 +1419,9 @@ mptctl_gettargetinfo (unsigned long arg)  	/* Copy the remaining data from kernel memory to user memory  	 */  	if (copy_to_user(uarg->targetInfo, pmem, numBytes)) { -		printk(KERN_ERR "%s@%d::mptctl_gettargetinfo - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_gettargetinfo - "  			"Unable to write out mpt_ioctl_targetinfo struct @ %p\n", -				__FILE__, __LINE__, pdata); +			ioc->name, __FILE__, __LINE__, pdata);  		kfree(pmem);  		return -EFAULT;  	} @@ -1444,7 +1448,7 @@ mptctl_readtest (unsigned long arg)  	int iocnum;  	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_test))) { -		printk(KERN_ERR "%s@%d::mptctl_readtest - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_readtest - "  			"Unable to read in mpt_ioctl_test struct @ %p\n",  				__FILE__, __LINE__, uarg);  		return -EFAULT; @@ -1452,7 +1456,7 @@ mptctl_readtest (unsigned long arg)  	if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||  	    (ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_readtest() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_readtest() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		return -ENODEV;  	} @@ -1476,9 +1480,9 @@ mptctl_readtest (unsigned long arg)  	/* Copy the data from kernel memory to user memory  	 */  	if (copy_to_user((char __user *)arg, &karg, sizeof(struct mpt_ioctl_test))) { -		printk(KERN_ERR "%s@%d::mptctl_readtest - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_readtest - "  			"Unable to write out mpt_ioctl_test struct @ %p\n", -				__FILE__, __LINE__, uarg); +			ioc->name, __FILE__, __LINE__, uarg);  		return -EFAULT;  	} @@ -1505,7 +1509,7 @@ mptctl_eventquery (unsigned long arg)  	int iocnum;  	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventquery))) { -		printk(KERN_ERR "%s@%d::mptctl_eventquery - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_eventquery - "  			"Unable to read in mpt_ioctl_eventquery struct @ %p\n",  				__FILE__, __LINE__, uarg);  		return -EFAULT; @@ -1513,7 +1517,7 @@ mptctl_eventquery (unsigned long arg)  	if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||  	    (ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_eventquery() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_eventquery() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		return -ENODEV;  	} @@ -1526,9 +1530,9 @@ mptctl_eventquery (unsigned long arg)  	/* Copy the data from kernel memory to user memory  	 */  	if (copy_to_user((char __user *)arg, &karg, sizeof(struct mpt_ioctl_eventquery))) { -		printk(KERN_ERR "%s@%d::mptctl_eventquery - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_eventquery - "  			"Unable to write out mpt_ioctl_eventquery struct @ %p\n", -				__FILE__, __LINE__, uarg); +			ioc->name, __FILE__, __LINE__, uarg);  		return -EFAULT;  	}  	return 0; @@ -1544,7 +1548,7 @@ mptctl_eventenable (unsigned long arg)  	int iocnum;  	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventenable))) { -		printk(KERN_ERR "%s@%d::mptctl_eventenable - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_eventenable - "  			"Unable to read in mpt_ioctl_eventenable struct @ %p\n",  				__FILE__, __LINE__, uarg);  		return -EFAULT; @@ -1552,7 +1556,7 @@ mptctl_eventenable (unsigned long arg)  	if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||  	    (ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_eventenable() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_eventenable() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		return -ENODEV;  	} @@ -1563,12 +1567,13 @@ mptctl_eventenable (unsigned long arg)  		/* Have not yet allocated memory - do so now.  		 */  		int sz = MPTCTL_EVENT_LOG_SIZE * sizeof(MPT_IOCTL_EVENTS); -		ioc->events = kmalloc(sz, GFP_KERNEL); -		if (ioc->events == NULL) { -			printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n"); +		ioc->events = kzalloc(sz, GFP_KERNEL); +		if (!ioc->events) { +			printk(MYIOC_s_ERR_FMT +			    ": ERROR - Insufficient memory to add adapter!\n", +			    ioc->name);  			return -ENOMEM;  		} -		memset(ioc->events, 0, sz);  		ioc->alloc_total += sz;  		ioc->eventContext = 0; @@ -1592,7 +1597,7 @@ mptctl_eventreport (unsigned long arg)  	int			 numBytes, maxEvents, max;  	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventreport))) { -		printk(KERN_ERR "%s@%d::mptctl_eventreport - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_eventreport - "  			"Unable to read in mpt_ioctl_eventreport struct @ %p\n",  				__FILE__, __LINE__, uarg);  		return -EFAULT; @@ -1600,7 +1605,7 @@ mptctl_eventreport (unsigned long arg)  	if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||  	    (ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_eventreport() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_eventreport() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		return -ENODEV;  	} @@ -1626,9 +1631,9 @@ mptctl_eventreport (unsigned long arg)  	 */  	numBytes = max * sizeof(MPT_IOCTL_EVENTS);  	if (copy_to_user(uarg->eventData, ioc->events, numBytes)) { -		printk(KERN_ERR "%s@%d::mptctl_eventreport - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_eventreport - "  			"Unable to write out mpt_ioctl_eventreport struct @ %p\n", -				__FILE__, __LINE__, ioc->events); +			ioc->name, __FILE__, __LINE__, ioc->events);  		return -EFAULT;  	} @@ -1646,7 +1651,7 @@ mptctl_replace_fw (unsigned long arg)  	int			 newFwSize;  	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_replace_fw))) { -		printk(KERN_ERR "%s@%d::mptctl_replace_fw - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_replace_fw - "  			"Unable to read in mpt_ioctl_replace_fw struct @ %p\n",  				__FILE__, __LINE__, uarg);  		return -EFAULT; @@ -1654,7 +1659,7 @@ mptctl_replace_fw (unsigned long arg)  	if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||  	    (ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_replace_fw() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_replace_fw() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		return -ENODEV;  	} @@ -1684,9 +1689,9 @@ mptctl_replace_fw (unsigned long arg)  	/* Copy the data from user memory to kernel space  	 */  	if (copy_from_user(ioc->cached_fw, uarg->newImage, newFwSize)) { -		printk(KERN_ERR "%s@%d::mptctl_replace_fw - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_replace_fw - "  				"Unable to read in mpt_ioctl_replace_fw image " -				"@ %p\n", __FILE__, __LINE__, uarg); +				"@ %p\n", ioc->name, __FILE__, __LINE__, uarg);  		mpt_free_fw_memory(ioc);  		return -EFAULT;  	} @@ -1720,7 +1725,7 @@ mptctl_mpt_command (unsigned long arg)  	if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_command))) { -		printk(KERN_ERR "%s@%d::mptctl_mpt_command - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_mpt_command - "  			"Unable to read in mpt_ioctl_command struct @ %p\n",  				__FILE__, __LINE__, uarg);  		return -EFAULT; @@ -1728,7 +1733,7 @@ mptctl_mpt_command (unsigned long arg)  	if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||  	    (ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_mpt_command() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_mpt_command() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		return -ENODEV;  	} @@ -1769,21 +1774,24 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  	ulong 		timeout;  	struct scsi_device *sdev; +	/* bufIn and bufOut are used for user to kernel space transfers +	 */  	bufIn.kptr = bufOut.kptr = NULL; +	bufIn.len = bufOut.len = 0;  	if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||  	    (ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_do_mpt_command() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_do_mpt_command() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		return -ENODEV;  	}  	if (!ioc->ioctl) { -		printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_do_mpt_command - "  			"No memory available during driver init.\n",  				__FILE__, __LINE__);  		return -ENOMEM;  	} else if (ioc->ioctl->status & MPT_IOCTL_STATUS_DID_IOCRESET) { -		printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_do_mpt_command - "  			"Busy with IOC Reset \n", __FILE__, __LINE__);  		return -EBUSY;  	} @@ -1797,9 +1805,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  		sz += sizeof(dma_addr_t) + sizeof(u32);  	if (sz > ioc->req_sz) { -		printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  			"Request frame too large (%d) maximum (%d)\n", -				__FILE__, __LINE__, sz, ioc->req_sz); +			ioc->name, __FILE__, __LINE__, sz, ioc->req_sz);  		return -EFAULT;  	} @@ -1817,9 +1825,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  	 * Request frame in user space  	 */  	if (copy_from_user(mf, mfPtr, karg.dataSgeOffset * 4)) { -		printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  			"Unable to read MF from mpt_ioctl_command struct @ %p\n", -			__FILE__, __LINE__, mfPtr); +			ioc->name, __FILE__, __LINE__, mfPtr);  		rc = -EFAULT;  		goto done_free_mem;  	} @@ -1870,17 +1878,17 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  			id = (ioc->devices_per_bus == 0) ? 256 : ioc->devices_per_bus;  			if (pScsiReq->TargetID > id) { -				printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +				printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  					"Target ID out of bounds. \n", -					__FILE__, __LINE__); +					ioc->name, __FILE__, __LINE__);  				rc = -ENODEV;  				goto done_free_mem;  			}  			if (pScsiReq->Bus >= ioc->number_of_buses) { -				printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +				printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  					"Target Bus out of bounds. \n", -					__FILE__, __LINE__); +					ioc->name, __FILE__, __LINE__);  				rc = -ENODEV;  				goto done_free_mem;  			} @@ -1932,9 +1940,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  			ioc->ioctl->id = pScsiReq->TargetID;  		} else { -			printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +			printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  				"SCSI driver is not loaded. \n", -					__FILE__, __LINE__); +				ioc->name, __FILE__, __LINE__);  			rc = -EFAULT;  			goto done_free_mem;  		} @@ -1951,9 +1959,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  	case MPI_FUNCTION_SATA_PASSTHROUGH:  		if (!ioc->sh) { -			printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +			printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  				"SCSI driver is not loaded. \n", -					__FILE__, __LINE__); +				ioc->name, __FILE__, __LINE__);  			rc = -EFAULT;  			goto done_free_mem;  		} @@ -2010,9 +2018,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  			ioc->ioctl->reset = MPTCTL_RESET_OK;  			ioc->ioctl->id = pScsiReq->TargetID;  		} else { -			printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +			printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  				"SCSI driver is not loaded. \n", -					__FILE__, __LINE__); +				ioc->name, __FILE__, __LINE__);  			rc = -EFAULT;  			goto done_free_mem;  		} @@ -2021,10 +2029,10 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  	case MPI_FUNCTION_SCSI_TASK_MGMT:  		{  			MPT_SCSI_HOST *hd = NULL; -			if ((ioc->sh == NULL) || ((hd = (MPT_SCSI_HOST *)ioc->sh->hostdata) == NULL)) { -				printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +			if ((ioc->sh == NULL) || ((hd = shost_priv(ioc->sh)) == NULL)) { +				printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  					"SCSI driver not loaded or SCSI host not found. \n", -					__FILE__, __LINE__); +					ioc->name, __FILE__, __LINE__);  				rc = -EFAULT;  				goto done_free_mem;  			} else if (mptctl_set_tm_flags(hd) != 0) { @@ -2055,9 +2063,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  				(pInit->ReplyFrameSize != cpu_to_le16(ioc->reply_sz)) ||  				(pInit->HostMfaHighAddr != high_addr) ||  				(pInit->SenseBufferHighAddr != sense_high)) { -				printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +				printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  					"IOC_INIT issued with 1 or more incorrect parameters. Rejected.\n", -					__FILE__, __LINE__); +					ioc->name, __FILE__, __LINE__);  				rc = -EFAULT;  				goto done_free_mem;  			} @@ -2088,9 +2096,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  		 	MPI_FUNCTION_LAN_RESET  		*/ -		printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  			"Illegal request (function 0x%x) \n", -			__FILE__, __LINE__, hdr->Function); +			ioc->name, __FILE__, __LINE__, hdr->Function);  		rc = -EFAULT;  		goto done_free_mem;  	} @@ -2103,11 +2111,6 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  	psge = (char *) (((int *) mf) + karg.dataSgeOffset);  	flagsLength = 0; -	/* bufIn and bufOut are used for user to kernel space transfers -	 */ -	bufIn.kptr = bufOut.kptr = NULL; -	bufIn.len = bufOut.len = 0; -  	if (karg.dataOutSize > 0)  		sgSize ++; @@ -2147,11 +2150,11 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  				if (copy_from_user(bufOut.kptr,  						karg.dataOutBufPtr,  						bufOut.len)) { -					printk(KERN_ERR +					printk(MYIOC_s_ERR_FMT  						"%s@%d::mptctl_do_mpt_command - Unable "  						"to read user data "  						"struct @ %p\n", -						__FILE__, __LINE__,karg.dataOutBufPtr); +						ioc->name, __FILE__, __LINE__,karg.dataOutBufPtr);  					rc =  -EFAULT;  					goto done_free_mem;  				} @@ -2187,15 +2190,20 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  		DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf); -		if (mpt_send_handshake_request(mptctl_id, ioc, -			sizeof(SCSITaskMgmt_t), (u32*)mf, -			CAN_SLEEP) != 0) { -			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "_send_handshake FAILED!" -				" (ioc %p, mf %p) \n", ioc->name, -				ioc, mf)); -			mptctl_free_tm_flags(ioc); -			rc = -ENODATA; -			goto done_free_mem; +		if ((ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q) && +		    (ioc->facts.MsgVersion >= MPI_VERSION_01_05)) +			mpt_put_msg_frame_hi_pri(mptctl_id, ioc, mf); +		else { +			rc =mpt_send_handshake_request(mptctl_id, ioc, +				sizeof(SCSITaskMgmt_t), (u32*)mf, CAN_SLEEP); +			if (rc != 0) { +				dfailprintk(ioc, printk(MYIOC_s_ERR_FMT +				    "_send_handshake FAILED! (ioc %p, mf %p)\n", +				    ioc->name, ioc, mf)); +				mptctl_free_tm_flags(ioc); +				rc = -ENODATA; +				goto done_free_mem; +			}  		}  	} else @@ -2233,10 +2241,10 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  		if (sz > 0) {  			if (copy_to_user(karg.replyFrameBufPtr,  				 &ioc->ioctl->ReplyFrame, sz)){ -				 printk(KERN_ERR +				 printk(MYIOC_s_ERR_FMT  				     "%s@%d::mptctl_do_mpt_command - "  				 "Unable to write out reply frame %p\n", -				 __FILE__, __LINE__, karg.replyFrameBufPtr); +				 ioc->name, __FILE__, __LINE__, karg.replyFrameBufPtr);  				 rc =  -ENODATA;  				 goto done_free_mem;  			} @@ -2249,9 +2257,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  		sz = min(karg.maxSenseBytes, MPT_SENSE_BUFFER_SIZE);  		if (sz > 0) {  			if (copy_to_user(karg.senseDataPtr, ioc->ioctl->sense, sz)) { -				printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +				printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  				"Unable to write sense data to user %p\n", -				__FILE__, __LINE__, +				ioc->name, __FILE__, __LINE__,  				karg.senseDataPtr);  				rc =  -ENODATA;  				goto done_free_mem; @@ -2267,9 +2275,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)  		if (copy_to_user(karg.dataInBufPtr,  				 bufIn.kptr, karg.dataInSize)) { -			printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " +			printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_do_mpt_command - "  				"Unable to write data to user %p\n", -				__FILE__, __LINE__, +				ioc->name, __FILE__, __LINE__,  				karg.dataInBufPtr);  			rc =  -ENODATA;  		} @@ -2340,7 +2348,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)  		return -EFAULT;  	if (copy_from_user(&karg, uarg, sizeof(hp_host_info_t))) { -		printk(KERN_ERR "%s@%d::mptctl_hp_host_info - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_hp_host_info - "  			"Unable to read in hp_host_info struct @ %p\n",  				__FILE__, __LINE__, uarg);  		return -EFAULT; @@ -2348,7 +2356,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)  	if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||  	    (ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_hp_hostinfo() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_hp_hostinfo() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		return -ENODEV;  	} @@ -2456,7 +2464,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)  	karg.soft_resets = 0;  	karg.timeouts = 0;  	if (ioc->sh != NULL) { -		MPT_SCSI_HOST *hd =  (MPT_SCSI_HOST *)ioc->sh->hostdata; +		MPT_SCSI_HOST *hd =  shost_priv(ioc->sh);  		if (hd && (cim_rev == 1)) {  			karg.hard_resets = hd->hard_resets; @@ -2529,9 +2537,9 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)  	/* Copy the data from kernel memory to user memory  	 */  	if (copy_to_user((char __user *)arg, &karg, sizeof(hp_host_info_t))) { -		printk(KERN_ERR "%s@%d::mptctl_hpgethostinfo - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_hpgethostinfo - "  			"Unable to write out hp_host_info @ %p\n", -				__FILE__, __LINE__, uarg); +			ioc->name, __FILE__, __LINE__, uarg);  		return -EFAULT;  	} @@ -2567,7 +2575,7 @@ mptctl_hp_targetinfo(unsigned long arg)  	int			tmp, np, rc = 0;  	if (copy_from_user(&karg, uarg, sizeof(hp_target_info_t))) { -		printk(KERN_ERR "%s@%d::mptctl_hp_targetinfo - " +		printk(KERN_ERR MYNAM "%s@%d::mptctl_hp_targetinfo - "  			"Unable to read in hp_host_targetinfo struct @ %p\n",  				__FILE__, __LINE__, uarg);  		return -EFAULT; @@ -2575,11 +2583,11 @@ mptctl_hp_targetinfo(unsigned long arg)  	if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||  		(ioc == NULL)) { -		printk(KERN_DEBUG "%s::mptctl_hp_targetinfo() @%d - ioc%d not found!\n", +		printk(KERN_DEBUG MYNAM "%s::mptctl_hp_targetinfo() @%d - ioc%d not found!\n",  				__FILE__, __LINE__, iocnum);  		return -ENODEV;  	} -	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": mptctl_hp_targetinfo called.\n", +	dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_hp_targetinfo called.\n",  	    ioc->name));  	/*  There is nothing to do for FCP parts. @@ -2673,16 +2681,16 @@ mptctl_hp_targetinfo(unsigned long arg)  			pci_free_consistent(ioc->pcidev, data_sz, (u8 *) pg3_alloc, page_dma);  		}  	} -	hd = (MPT_SCSI_HOST *) ioc->sh->hostdata; +	hd = shost_priv(ioc->sh);  	if (hd != NULL)  		karg.select_timeouts = hd->sel_timeout[karg.hdr.id];  	/* Copy the data from kernel memory to user memory  	 */  	if (copy_to_user((char __user *)arg, &karg, sizeof(hp_target_info_t))) { -		printk(KERN_ERR "%s@%d::mptctl_hp_target_info - " +		printk(MYIOC_s_ERR_FMT "%s@%d::mptctl_hp_target_info - "  			"Unable to write out mpt_ioctl_targetinfo struct @ %p\n", -				__FILE__, __LINE__, uarg); +			ioc->name, __FILE__, __LINE__, uarg);  		return -EFAULT;  	} @@ -2732,7 +2740,7 @@ compat_mptfwxfer_ioctl(struct file *filp, unsigned int cmd,  	if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||  	    (iocp == NULL)) {  		printk(KERN_DEBUG MYNAM "::compat_mptfwxfer_ioctl @%d - ioc%d not found!\n", -				__LINE__, iocnumX); +			__LINE__, iocnumX);  		return -ENODEV;  	} @@ -2772,7 +2780,7 @@ compat_mpt_command(struct file *filp, unsigned int cmd,  	if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||  	    (iocp == NULL)) {  		printk(KERN_DEBUG MYNAM "::compat_mpt_command @%d - ioc%d not found!\n", -				__LINE__, iocnumX); +			__LINE__, iocnumX);  		return -ENODEV;  	} @@ -2853,31 +2861,22 @@ static long compat_mpctl_ioctl(struct file *f, unsigned int cmd, unsigned long a  static int  mptctl_probe(struct pci_dev *pdev, const struct pci_device_id *id)  { -	int err; -	int sz; -	u8 *mem; +	MPT_IOCTL *mem;  	MPT_ADAPTER *ioc = pci_get_drvdata(pdev);  	/*  	 * Allocate and inite a MPT_IOCTL structure  	*/ -	sz = sizeof (MPT_IOCTL); -	mem = kmalloc(sz, GFP_KERNEL); -	if (mem == NULL) { -		err = -ENOMEM; -		goto out_fail; +	mem = kzalloc(sizeof(MPT_IOCTL), GFP_KERNEL); +	if (!mem) { +		mptctl_remove(pdev); +		return -ENOMEM;  	} -	memset(mem, 0, sz); -	ioc->ioctl = (MPT_IOCTL *) mem; +	ioc->ioctl = mem;  	ioc->ioctl->ioc = ioc;  	mutex_init(&ioc->ioctl->ioctl_mutex);  	return 0; - -out_fail: - -	mptctl_remove(pdev); -	return err;  }  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -2924,7 +2923,8 @@ static int __init mptctl_init(void)  	 *  Install our handler  	 */  	++where; -	if ((mptctl_id = mpt_register(mptctl_reply, MPTCTL_DRIVER)) < 0) { +	mptctl_id = mpt_register(mptctl_reply, MPTCTL_DRIVER); +	if (!mptctl_id || mptctl_id >= MPT_MAX_PROTOCOL_DRIVERS) {  		printk(KERN_ERR MYNAM ": ERROR: Failed to register with Fusion MPT base driver\n");  		misc_deregister(&mptctl_miscdev);  		err = -EBUSY; diff --git a/drivers/message/fusion/mptctl.h b/drivers/message/fusion/mptctl.h index 180b3c15624..2c1890127e1 100644 --- a/drivers/message/fusion/mptctl.h +++ b/drivers/message/fusion/mptctl.h @@ -3,9 +3,9 @@   *      Fusion MPT misc device (ioctl) driver.   *      For use with PCI chip/adapter(s):   *          LSIFC9xx/LSI409xx Fibre Channel - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 1999-2007 LSI Logic Corporation + *  Copyright (c) 1999-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com)   *   */ diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index 8422c25e4a3..3cdd4e96211 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c @@ -1,9 +1,9 @@  /*   *  linux/drivers/message/fusion/mptfc.c - *      For use with LSI Logic PCI chip/adapter(s) - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      For use with LSI PCI chip/adapter(s) + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 1999-2007 LSI Logic Corporation + *  Copyright (c) 1999-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com)   *   */ @@ -90,9 +90,9 @@ static int max_lun = MPTFC_MAX_LUN;  module_param(max_lun, int, 0);  MODULE_PARM_DESC(max_lun, " max lun, default=16895 "); -static int	mptfcDoneCtx = -1; -static int	mptfcTaskCtx = -1; -static int	mptfcInternalCtx = -1; /* Used only for internal commands */ +static u8	mptfcDoneCtx = MPT_MAX_PROTOCOL_DRIVERS; +static u8	mptfcTaskCtx = MPT_MAX_PROTOCOL_DRIVERS; +static u8	mptfcInternalCtx = MPT_MAX_PROTOCOL_DRIVERS;  static int mptfc_target_alloc(struct scsi_target *starget);  static int mptfc_slave_alloc(struct scsi_device *sdev); @@ -194,37 +194,36 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt,  	struct fc_rport		*rport = starget_to_rport(scsi_target(sdev));  	unsigned long		flags;  	int			ready; +	MPT_ADAPTER 		*ioc; -	hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata; +	hd = shost_priv(SCpnt->device->host); +	ioc = hd->ioc;  	spin_lock_irqsave(shost->host_lock, flags);  	while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) {  		spin_unlock_irqrestore(shost->host_lock, flags); -		dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT +		dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT  			"mptfc_block_error_handler.%d: %d:%d, port status is "  			"DID_IMM_RETRY, deferring %s recovery.\n", -			((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, -			((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, -			SCpnt->device->id,SCpnt->device->lun,caller)); +			ioc->name, ioc->sh->host_no, +			SCpnt->device->id, SCpnt->device->lun, caller));  		msleep(1000);  		spin_lock_irqsave(shost->host_lock, flags);  	}  	spin_unlock_irqrestore(shost->host_lock, flags);  	if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) { -		dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT +		dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT  			"%s.%d: %d:%d, failing recovery, " -			"port state %d, vdev %p.\n", caller, -			((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, -			((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, -			SCpnt->device->id,SCpnt->device->lun,ready, +			"port state %d, vdevice %p.\n", caller, +			ioc->name, ioc->sh->host_no, +			SCpnt->device->id, SCpnt->device->lun, ready,  			SCpnt->device->hostdata));  		return FAILED;  	} -	dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT +	dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT  		"%s.%d: %d:%d, executing recovery.\n", caller, -		((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, -		((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, -		SCpnt->device->id,SCpnt->device->lun)); +		ioc->name, ioc->sh->host_no, +		SCpnt->device->id, SCpnt->device->lun));  	return (*func)(SCpnt);  } @@ -470,7 +469,7 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0)  			/*  			 * if already mapped, remap here.  If not mapped,  			 * target_alloc will allocate vtarget and map, -			 * slave_alloc will fill in vdev from vtarget. +			 * slave_alloc will fill in vdevice from vtarget.  			 */  			if (ri->starget) {  				vtarget = ri->starget->hostdata; @@ -602,10 +601,10 @@ mptfc_slave_alloc(struct scsi_device *sdev)  {  	MPT_SCSI_HOST		*hd;  	VirtTarget		*vtarget; -	VirtDevice		*vdev; +	VirtDevice		*vdevice;  	struct scsi_target	*starget;  	struct fc_rport		*rport; - +	MPT_ADAPTER 		*ioc;  	starget = scsi_target(sdev);  	rport = starget_to_rport(starget); @@ -613,31 +612,32 @@ mptfc_slave_alloc(struct scsi_device *sdev)  	if (!rport || fc_remote_port_chkready(rport))  		return -ENXIO; -	hd = (MPT_SCSI_HOST *)sdev->host->hostdata; +	hd = shost_priv(sdev->host); +	ioc = hd->ioc; -	vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL); -	if (!vdev) { +	vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL); +	if (!vdevice) {  		printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n", -				hd->ioc->name, sizeof(VirtDevice)); +				ioc->name, sizeof(VirtDevice));  		return -ENOMEM;  	} -	sdev->hostdata = vdev; +	sdev->hostdata = vdevice;  	vtarget = starget->hostdata;  	if (vtarget->num_luns == 0) { -		vtarget->ioc_id = hd->ioc->id; +		vtarget->ioc_id = ioc->id;  		vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;  	} -	vdev->vtarget = vtarget; -	vdev->lun = sdev->lun; +	vdevice->vtarget = vtarget; +	vdevice->lun = sdev->lun;  	vtarget->num_luns++; -	mptfc_dump_lun_info(hd->ioc, rport, sdev, vtarget); +	mptfc_dump_lun_info(ioc, rport, sdev, vtarget);  	return 0;  } @@ -648,9 +648,9 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	struct mptfc_rport_info	*ri;  	struct fc_rport	*rport = starget_to_rport(scsi_target(SCpnt->device));  	int		err; -	VirtDevice	*vdev = SCpnt->device->hostdata; +	VirtDevice	*vdevice = SCpnt->device->hostdata; -	if (!vdev || !vdev->vtarget) { +	if (!vdevice || !vdevice->vtarget) {  		SCpnt->result = DID_NO_CONNECT << 16;  		done(SCpnt);  		return 0; @@ -675,6 +675,50 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  }  /* + *	mptfc_display_port_link_speed - displaying link speed + *	@ioc: Pointer to MPT_ADAPTER structure + *	@portnum: IOC Port number + *	@pp0dest: port page0 data payload + * + */ +static void +mptfc_display_port_link_speed(MPT_ADAPTER *ioc, int portnum, FCPortPage0_t *pp0dest) +{ +	u8	old_speed, new_speed, state; +	char	*old, *new; + +	if (portnum >= 2) +		return; + +	old_speed = ioc->fc_link_speed[portnum]; +	new_speed = pp0dest->CurrentSpeed; +	state = pp0dest->PortState; + +	if (state != MPI_FCPORTPAGE0_PORTSTATE_OFFLINE && +	    new_speed != MPI_FCPORTPAGE0_CURRENT_SPEED_UKNOWN) { + +		old = old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT ? "1 Gbps" : +		       old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT ? "2 Gbps" : +			old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT ? "4 Gbps" : +			 "Unknown"; +		new = new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT ? "1 Gbps" : +		       new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT ? "2 Gbps" : +			new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT ? "4 Gbps" : +			 "Unknown"; +		if (old_speed == 0) +			printk(MYIOC_s_NOTE_FMT +				"FC Link Established, Speed = %s\n", +				ioc->name, new); +		else if (old_speed != new_speed) +			printk(MYIOC_s_WARN_FMT +				"FC Link Speed Change, Old Speed = %s, New Speed = %s\n", +				ioc->name, old, new); + +		ioc->fc_link_speed[portnum] = new_speed; +	} +} + +/*   *	mptfc_GetFcPortPage0 - Fetch FCPort config Page0.   *	@ioc: Pointer to MPT_ADAPTER structure   *	@portnum: IOC Port number @@ -773,6 +817,7 @@ mptfc_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum)  							" complete.\n",  						ioc->name);  			} +			mptfc_display_port_link_speed(ioc, portnum, pp0dest);  		}  		pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma); @@ -1023,6 +1068,18 @@ mptfc_init_host_attr(MPT_ADAPTER *ioc,int portnum)  }  static void +mptfc_link_status_change(struct work_struct *work) +{ +	MPT_ADAPTER             *ioc = +		container_of(work, MPT_ADAPTER, fc_rescan_work); +	int ii; + +	for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) +		(void) mptfc_GetFcPortPage0(ioc, ii); + +} + +static void  mptfc_setup_reset(struct work_struct *work)  {  	MPT_ADAPTER		*ioc = @@ -1163,6 +1220,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	spin_lock_init(&ioc->fc_rescan_work_lock);  	INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices);  	INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset); +	INIT_WORK(&ioc->fc_lsc_work, mptfc_link_status_change);  	spin_lock_irqsave(&ioc->FreeQlock, flags); @@ -1218,20 +1276,21 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	spin_unlock_irqrestore(&ioc->FreeQlock, flags); -	hd = (MPT_SCSI_HOST *) sh->hostdata; +	hd = shost_priv(sh);  	hd->ioc = ioc;  	/* SCSI needs scsi_cmnd lookup table!  	 * (with size equal to req_depth*PtrSz!)  	 */ -	hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC); -	if (!hd->ScsiLookup) { +	ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC); +	if (!ioc->ScsiLookup) {  		error = -ENOMEM;  		goto out_mptfc_probe;  	} +	spin_lock_init(&ioc->scsi_lookup_lock);  	dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", -		 ioc->name, hd->ScsiLookup)); +		 ioc->name, ioc->ScsiLookup));  	/* Clear the TM flags  	 */ @@ -1262,8 +1321,8 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	sh->transportt = mptfc_transport_template;  	error = scsi_add_host (sh, &ioc->pcidev->dev);  	if(error) { -		dprintk(ioc, printk(KERN_ERR MYNAM -		  "scsi_add_host failed\n")); +		dprintk(ioc, printk(MYIOC_s_ERR_FMT +		  "scsi_add_host failed\n", ioc->name));  		goto out_mptfc_probe;  	} @@ -1325,7 +1384,7 @@ mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)  			ioc->name, event));  	if (ioc->sh == NULL || -		((hd = (MPT_SCSI_HOST *)ioc->sh->hostdata) == NULL)) +		((hd = shost_priv(ioc->sh)) == NULL))  		return 1;  	switch (event) { @@ -1337,6 +1396,14 @@ mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)  		}  		spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);  		break; +	case MPI_EVENT_LINK_STATUS_CHANGE: +		spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); +		if (ioc->fc_rescan_work_q) { +			queue_work(ioc->fc_rescan_work_q, +				   &ioc->fc_lsc_work); +		} +		spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); +		break;  	default:  		rc = mptscsih_event_process(ioc,pEvReply);  		break; diff --git a/drivers/message/fusion/mptlan.c b/drivers/message/fusion/mptlan.c index 3da4c37846e..7950fc678ed 100644 --- a/drivers/message/fusion/mptlan.c +++ b/drivers/message/fusion/mptlan.c @@ -1,10 +1,10 @@  /*   *  linux/drivers/message/fusion/mptlan.c   *      IP Over Fibre Channel device driver. - *      For use with LSI Logic Fibre Channel PCI chip/adapters - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      For use with LSI Fibre Channel PCI chip/adapters + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 2000-2007 LSI Logic Corporation + *  Copyright (c) 2000-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com)   *   */ @@ -154,7 +154,7 @@ static unsigned short mpt_lan_type_trans(struct sk_buff *skb,  /*   *  Fusion MPT LAN private data   */ -static int LanCtx = -1; +static u8 LanCtx = MPT_MAX_PROTOCOL_DRIVERS;  static u32 max_buckets_out = 127;  static u32 tx_max_out_p = 127 - 16; @@ -165,12 +165,6 @@ DEFINE_RWLOCK(bad_naa_lock);  #endif  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -/* - * Fusion MPT LAN external data - */ -extern int mpt_lan_index; - -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/  /**   *	lan_reply - Handle all data sent from the hardware.   *	@ioc: Pointer to MPT_ADAPTER structure @@ -1230,6 +1224,8 @@ mpt_lan_post_receive_buckets(struct mpt_lan_priv *priv)  		}  		pRecvReq = (LANReceivePostRequest_t *) mf; +		i = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); +		mpt_dev->RequestNB[i] = 0;  		count = buckets;  		if (count > max)  			count = max; @@ -1351,10 +1347,11 @@ mpt_lan_post_receive_buckets_work(struct work_struct *work)  static struct net_device *  mpt_register_lan_device (MPT_ADAPTER *mpt_dev, int pnum)  { -	struct net_device *dev = alloc_fcdev(sizeof(struct mpt_lan_priv)); -	struct mpt_lan_priv *priv = NULL; +	struct net_device *dev; +	struct mpt_lan_priv *priv;  	u8 HWaddr[FC_ALEN], *a; +	dev = alloc_fcdev(sizeof(struct mpt_lan_priv));  	if (!dev)  		return NULL; @@ -1366,7 +1363,6 @@ mpt_register_lan_device (MPT_ADAPTER *mpt_dev, int pnum)  	priv->mpt_dev = mpt_dev;  	priv->pnum = pnum; -	memset(&priv->post_buckets_task, 0, sizeof(priv->post_buckets_task));  	INIT_DELAYED_WORK(&priv->post_buckets_task,  			  mpt_lan_post_receive_buckets_work);  	priv->post_buckets_active = 0; @@ -1391,8 +1387,6 @@ mpt_register_lan_device (MPT_ADAPTER *mpt_dev, int pnum)  	spin_lock_init(&priv->txfidx_lock);  	spin_lock_init(&priv->rxfidx_lock); -	memset(&priv->stats, 0, sizeof(priv->stats)); -  	/*  Grab pre-fetched LANPage1 stuff. :-) */  	a = (u8 *) &mpt_dev->lan_cnfg_page1.HardwareAddressLow; @@ -1508,9 +1502,6 @@ static int __init mpt_lan_init (void)  		return -EBUSY;  	} -	/* Set the callback index to be used by driver core for turbo replies */ -	mpt_lan_index = LanCtx; -  	dlprintk((KERN_INFO MYNAM ": assigned context of %d\n", LanCtx));  	if (mpt_reset_register(LanCtx, mpt_lan_ioc_reset)) { @@ -1531,10 +1522,9 @@ static void __exit mpt_lan_exit(void)  	mpt_device_driver_deregister(MPTLAN_DRIVER);  	mpt_reset_deregister(LanCtx); -	if (LanCtx >= 0) { +	if (LanCtx) {  		mpt_deregister(LanCtx); -		LanCtx = -1; -		mpt_lan_index = 0; +		LanCtx = MPT_MAX_PROTOCOL_DRIVERS;  	}  } diff --git a/drivers/message/fusion/mptlan.h b/drivers/message/fusion/mptlan.h index 8d08c2bed24..bafb67fc818 100644 --- a/drivers/message/fusion/mptlan.h +++ b/drivers/message/fusion/mptlan.h @@ -1,10 +1,10 @@  /*   *  linux/drivers/message/fusion/mptlan.h   *      IP Over Fibre Channel device driver. - *      For use with LSI Logic Fibre Channel PCI chip/adapters - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      For use with LSI Fibre Channel PCI chip/adapters + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 2000-2007 LSI Logic Corporation + *  Copyright (c) 2000-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com)   *   */ @@ -75,7 +75,7 @@  #include <asm/io.h>      /* Override mptbase.h by pre-defining these! */ -#define MODULEAUTHOR	"LSI Logic Corporation" +#define MODULEAUTHOR	"LSI Corporation"  #include "mptbase.h" diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index b9c69bff218..e4c94f93de1 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c @@ -1,11 +1,10 @@  /*   *  linux/drivers/message/fusion/mptsas.c - *      For use with LSI Logic PCI chip/adapter(s) - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      For use with LSI PCI chip/adapter(s) + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 1999-2007 LSI Logic Corporation + *  Copyright (c) 1999-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com) - *  Copyright (c) 2005-2007 Dell   */  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/  /* @@ -61,6 +60,7 @@  #include "mptbase.h"  #include "mptscsih.h" +#include "mptsas.h"  #define my_NAME		"Fusion MPT SAS Host driver" @@ -89,134 +89,35 @@ static int max_lun = MPTSAS_MAX_LUN;  module_param(max_lun, int, 0);  MODULE_PARM_DESC(max_lun, " max lun, default=16895 "); -static int	mptsasDoneCtx = -1; -static int	mptsasTaskCtx = -1; -static int	mptsasInternalCtx = -1; /* Used only for internal commands */ -static int	mptsasMgmtCtx = -1; +static u8	mptsasDoneCtx = MPT_MAX_PROTOCOL_DRIVERS; +static u8	mptsasTaskCtx = MPT_MAX_PROTOCOL_DRIVERS; +static u8	mptsasInternalCtx = MPT_MAX_PROTOCOL_DRIVERS; /* Used only for internal commands */ +static u8	mptsasMgmtCtx = MPT_MAX_PROTOCOL_DRIVERS;  static void mptsas_hotplug_work(struct work_struct *work); -struct mptsas_target_reset_event { -	struct list_head 	list; -	EVENT_DATA_SAS_DEVICE_STATUS_CHANGE sas_event_data; -	u8	target_reset_issued; -}; - -enum mptsas_hotplug_action { -	MPTSAS_ADD_DEVICE, -	MPTSAS_DEL_DEVICE, -	MPTSAS_ADD_RAID, -	MPTSAS_DEL_RAID, -	MPTSAS_ADD_INACTIVE_VOLUME, -	MPTSAS_IGNORE_EVENT, -}; - -struct mptsas_hotplug_event { -	struct work_struct	work; -	MPT_ADAPTER		*ioc; -	enum mptsas_hotplug_action event_type; -	u64			sas_address; -	u8			channel; -	u8			id; -	u32			device_info; -	u16			handle; -	u16			parent_handle; -	u8			phy_id; -	u8			phys_disk_num_valid;	/* hrc (hidden raid component) */ -	u8			phys_disk_num;		/* hrc - unique index*/ -	u8			hidden_raid_component;	/* hrc - don't expose*/ -}; - -struct mptsas_discovery_event { -	struct work_struct	work; -	MPT_ADAPTER		*ioc; -}; - -/* - * SAS topology structures - * - * The MPT Fusion firmware interface spreads information about the - * SAS topology over many manufacture pages, thus we need some data - * structure to collect it and process it for the SAS transport class. - */ - -struct mptsas_devinfo { -	u16	handle;		/* unique id to address this device */ -	u16	handle_parent;	/* unique id to address parent device */ -	u16	handle_enclosure; /* enclosure identifier of the enclosure */ -	u16	slot;		/* physical slot in enclosure */ -	u8	phy_id;		/* phy number of parent device */ -	u8	port_id;	/* sas physical port this device -				   is assoc'd with */ -	u8	id;		/* logical target id of this device */ -	u32	phys_disk_num;	/* phys disk id, for csmi-ioctls */ -	u8	channel;	/* logical bus number of this device */ -	u64	sas_address;    /* WWN of this device, -				   SATA is assigned by HBA,expander */ -	u32	device_info;	/* bitfield detailed info about this device */ -}; - -/* - * Specific details on ports, wide/narrow - */ -struct mptsas_portinfo_details{ -	u16	num_phys;	/* number of phys belong to this port */ -	u64	phy_bitmask; 	/* TODO, extend support for 255 phys */ -	struct sas_rphy *rphy;	/* transport layer rphy object */ -	struct sas_port *port;	/* transport layer port object */ -	struct scsi_target *starget; -	struct mptsas_portinfo *port_info; -}; - -struct mptsas_phyinfo { -	u16	handle;			/* unique id to address this */ -	u8	phy_id; 		/* phy index */ -	u8	port_id; 		/* firmware port identifier */ -	u8	negotiated_link_rate;	/* nego'd link rate for this phy */ -	u8	hw_link_rate; 		/* hardware max/min phys link rate */ -	u8	programmed_link_rate;	/* programmed max/min phy link rate */ -	u8	sas_port_add_phy;	/* flag to request sas_port_add_phy*/ -	struct mptsas_devinfo identify;	/* point to phy device info */ -	struct mptsas_devinfo attached;	/* point to attached device info */ -	struct sas_phy *phy;		/* transport layer phy object */ -	struct mptsas_portinfo *portinfo; -	struct mptsas_portinfo_details * port_details; -}; - -struct mptsas_portinfo { -	struct list_head list; -	u16		num_phys;	/* number of phys */ -	struct mptsas_phyinfo *phy_info; -}; - -struct mptsas_enclosure { -	u64	enclosure_logical_id;	/* The WWN for the enclosure */ -	u16	enclosure_handle;	/* unique id to address this */ -	u16	flags;			/* details enclosure management */ -	u16	num_slot;		/* num slots */ -	u16	start_slot;		/* first slot */ -	u8	start_id;		/* starting logical target id */ -	u8	start_channel;		/* starting logical channel id */ -	u8	sep_id;			/* SEP device logical target id */ -	u8	sep_channel;		/* SEP channel logical channel id */ -}; -  static void mptsas_print_phy_data(MPT_ADAPTER *ioc,  					MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)  { -	dsasprintk(ioc, printk(KERN_DEBUG "---- IO UNIT PAGE 0 ------------\n")); -	dsasprintk(ioc, printk(KERN_DEBUG "Handle=0x%X\n", -		le16_to_cpu(phy_data->AttachedDeviceHandle))); -	dsasprintk(ioc, printk(KERN_DEBUG "Controller Handle=0x%X\n", -		le16_to_cpu(phy_data->ControllerDevHandle))); -	dsasprintk(ioc, printk(KERN_DEBUG "Port=0x%X\n", phy_data->Port)); -	dsasprintk(ioc, printk(KERN_DEBUG "Port Flags=0x%X\n", phy_data->PortFlags)); -	dsasprintk(ioc, printk(KERN_DEBUG "PHY Flags=0x%X\n", phy_data->PhyFlags)); -	dsasprintk(ioc, printk(KERN_DEBUG "Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate)); -	dsasprintk(ioc, printk(KERN_DEBUG "Controller PHY Device Info=0x%X\n", -		le32_to_cpu(phy_data->ControllerPhyDeviceInfo))); -	dsasprintk(ioc, printk(KERN_DEBUG "DiscoveryStatus=0x%X\n\n", -		le32_to_cpu(phy_data->DiscoveryStatus))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "---- IO UNIT PAGE 0 ------------\n", ioc->name)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handle=0x%X\n", +	    ioc->name, le16_to_cpu(phy_data->AttachedDeviceHandle))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Controller Handle=0x%X\n", +	    ioc->name, le16_to_cpu(phy_data->ControllerDevHandle))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Port=0x%X\n", +	    ioc->name, phy_data->Port)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Port Flags=0x%X\n", +	    ioc->name, phy_data->PortFlags)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Flags=0x%X\n", +	    ioc->name, phy_data->PhyFlags)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Negotiated Link Rate=0x%X\n", +	    ioc->name, phy_data->NegotiatedLinkRate)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "Controller PHY Device Info=0x%X\n", ioc->name, +	    le32_to_cpu(phy_data->ControllerPhyDeviceInfo))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DiscoveryStatus=0x%X\n\n", +	    ioc->name, le32_to_cpu(phy_data->DiscoveryStatus)));  }  static void mptsas_print_phy_pg0(MPT_ADAPTER *ioc, SasPhyPage0_t *pg0) @@ -225,27 +126,41 @@ static void mptsas_print_phy_pg0(MPT_ADAPTER *ioc, SasPhyPage0_t *pg0)  	memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); -	dsasprintk(ioc, printk(KERN_DEBUG "---- SAS PHY PAGE 0 ------------\n")); -	dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Handle=0x%X\n", -			le16_to_cpu(pg0->AttachedDevHandle))); -	dsasprintk(ioc, printk(KERN_DEBUG "SAS Address=0x%llX\n", -			(unsigned long long)le64_to_cpu(sas_address))); -	dsasprintk(ioc, printk(KERN_DEBUG "Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier)); -	dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Info=0x%X\n", -			le32_to_cpu(pg0->AttachedDeviceInfo))); -	dsasprintk(ioc, printk(KERN_DEBUG "Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate)); -	dsasprintk(ioc, printk(KERN_DEBUG "Change Count=0x%X\n", pg0->ChangeCount)); -	dsasprintk(ioc, printk(KERN_DEBUG "PHY Info=0x%X\n\n", le32_to_cpu(pg0->PhyInfo))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "---- SAS PHY PAGE 0 ------------\n", ioc->name)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "Attached Device Handle=0x%X\n", ioc->name, +	    le16_to_cpu(pg0->AttachedDevHandle))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SAS Address=0x%llX\n", +	    ioc->name, (unsigned long long)le64_to_cpu(sas_address))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "Attached PHY Identifier=0x%X\n", ioc->name, +	    pg0->AttachedPhyIdentifier)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Attached Device Info=0x%X\n", +	    ioc->name, le32_to_cpu(pg0->AttachedDeviceInfo))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Programmed Link Rate=0x%X\n", +	    ioc->name,  pg0->ProgrammedLinkRate)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Change Count=0x%X\n", +	    ioc->name, pg0->ChangeCount)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Info=0x%X\n\n", +	    ioc->name, le32_to_cpu(pg0->PhyInfo)));  }  static void mptsas_print_phy_pg1(MPT_ADAPTER *ioc, SasPhyPage1_t *pg1)  { -	dsasprintk(ioc, printk(KERN_DEBUG "---- SAS PHY PAGE 1 ------------\n")); -	dsasprintk(ioc, printk(KERN_DEBUG "Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount)); -	dsasprintk(ioc, printk(KERN_DEBUG "Running Disparity Error Count=0x%x\n", -			pg1->RunningDisparityErrorCount)); -	dsasprintk(ioc, printk(KERN_DEBUG "Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount)); -	dsasprintk(ioc, printk(KERN_DEBUG "PHY Reset Problem Count=0x%x\n\n", pg1->PhyResetProblemCount)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "---- SAS PHY PAGE 1 ------------\n", ioc->name)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Invalid Dword Count=0x%x\n", +	    ioc->name,  pg1->InvalidDwordCount)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "Running Disparity Error Count=0x%x\n", ioc->name, +	    pg1->RunningDisparityErrorCount)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "Loss Dword Synch Count=0x%x\n", ioc->name, +	    pg1->LossDwordSynchCount)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "PHY Reset Problem Count=0x%x\n\n", ioc->name, +	    pg1->PhyResetProblemCount));  }  static void mptsas_print_device_pg0(MPT_ADAPTER *ioc, SasDevicePage0_t *pg0) @@ -254,37 +169,53 @@ static void mptsas_print_device_pg0(MPT_ADAPTER *ioc, SasDevicePage0_t *pg0)  	memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); -	dsasprintk(ioc, printk(KERN_DEBUG "---- SAS DEVICE PAGE 0 ---------\n")); -	dsasprintk(ioc, printk(KERN_DEBUG "Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle))); -	dsasprintk(ioc, printk(KERN_DEBUG "Parent Handle=0x%X\n" ,le16_to_cpu(pg0->ParentDevHandle))); -	dsasprintk(ioc, printk(KERN_DEBUG "Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle))); -	dsasprintk(ioc, printk(KERN_DEBUG "Slot=0x%X\n", le16_to_cpu(pg0->Slot))); -	dsasprintk(ioc, printk(KERN_DEBUG "SAS Address=0x%llX\n", (unsigned long long) -	    le64_to_cpu(sas_address))); -	dsasprintk(ioc, printk(KERN_DEBUG "Target ID=0x%X\n", pg0->TargetID)); -	dsasprintk(ioc, printk(KERN_DEBUG "Bus=0x%X\n", pg0->Bus)); -	/* The PhyNum field specifies the PHY number of the parent -	 * device this device is linked to -	 */ -	dsasprintk(ioc, printk(KERN_DEBUG "Parent Phy Num=0x%X\n", pg0->PhyNum)); -	dsasprintk(ioc, printk(KERN_DEBUG "Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus))); -	dsasprintk(ioc, printk(KERN_DEBUG "Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo))); -	dsasprintk(ioc, printk(KERN_DEBUG "Flags=0x%X\n", le16_to_cpu(pg0->Flags))); -	dsasprintk(ioc, printk(KERN_DEBUG "Physical Port=0x%X\n\n", pg0->PhysicalPort)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "---- SAS DEVICE PAGE 0 ---------\n", ioc->name)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handle=0x%X\n", +	    ioc->name, le16_to_cpu(pg0->DevHandle))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Parent Handle=0x%X\n", +	    ioc->name, le16_to_cpu(pg0->ParentDevHandle))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Enclosure Handle=0x%X\n", +	    ioc->name, le16_to_cpu(pg0->EnclosureHandle))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Slot=0x%X\n", +	    ioc->name, le16_to_cpu(pg0->Slot))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SAS Address=0x%llX\n", +	    ioc->name, (unsigned long long)le64_to_cpu(sas_address))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Target ID=0x%X\n", +	    ioc->name, pg0->TargetID)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Bus=0x%X\n", +	    ioc->name, pg0->Bus)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Parent Phy Num=0x%X\n", +	    ioc->name, pg0->PhyNum)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Access Status=0x%X\n", +	    ioc->name, le16_to_cpu(pg0->AccessStatus))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Device Info=0x%X\n", +	    ioc->name, le32_to_cpu(pg0->DeviceInfo))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Flags=0x%X\n", +	    ioc->name, le16_to_cpu(pg0->Flags))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Physical Port=0x%X\n\n", +	    ioc->name, pg0->PhysicalPort));  }  static void mptsas_print_expander_pg1(MPT_ADAPTER *ioc, SasExpanderPage1_t *pg1)  { -	dsasprintk(ioc, printk(KERN_DEBUG "---- SAS EXPANDER PAGE 1 ------------\n")); -	dsasprintk(ioc, printk(KERN_DEBUG "Physical Port=0x%X\n", pg1->PhysicalPort)); -	dsasprintk(ioc, printk(KERN_DEBUG "PHY Identifier=0x%X\n", pg1->PhyIdentifier)); -	dsasprintk(ioc, printk(KERN_DEBUG "Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate)); -	dsasprintk(ioc, printk(KERN_DEBUG "Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate)); -	dsasprintk(ioc, printk(KERN_DEBUG "Hardware Link Rate=0x%X\n", pg1->HwLinkRate)); -	dsasprintk(ioc, printk(KERN_DEBUG "Owner Device Handle=0x%X\n", -			le16_to_cpu(pg1->OwnerDevHandle))); -	dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Handle=0x%X\n\n", -			le16_to_cpu(pg1->AttachedDevHandle))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "---- SAS EXPANDER PAGE 1 ------------\n", ioc->name)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Physical Port=0x%X\n", +	    ioc->name, pg1->PhysicalPort)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Identifier=0x%X\n", +	    ioc->name, pg1->PhyIdentifier)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Negotiated Link Rate=0x%X\n", +	    ioc->name, pg1->NegotiatedLinkRate)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Programmed Link Rate=0x%X\n", +	    ioc->name, pg1->ProgrammedLinkRate)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Hardware Link Rate=0x%X\n", +	    ioc->name, pg1->HwLinkRate)); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Owner Device Handle=0x%X\n", +	    ioc->name, le16_to_cpu(pg1->OwnerDevHandle))); +	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    "Attached Device Handle=0x%X\n\n", ioc->name, +	    le16_to_cpu(pg1->AttachedDevHandle)));  }  static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy) @@ -354,8 +285,8 @@ mptsas_port_delete(MPT_ADAPTER *ioc, struct mptsas_portinfo_details * port_detai  	port_info = port_details->port_info;  	phy_info = port_info->phy_info; -	dsaswideprintk(ioc, printk(KERN_DEBUG "%s: [%p]: num_phys=%02d " -	    "bitmask=0x%016llX\n", __FUNCTION__, port_details, +	dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: [%p]: num_phys=%02d " +	    "bitmask=0x%016llX\n", ioc->name, __FUNCTION__, port_details,  	    port_details->num_phys, (unsigned long long)  	    port_details->phy_bitmask)); @@ -382,14 +313,15 @@ mptsas_set_rphy(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_rp  {  	if (phy_info->port_details) {  		phy_info->port_details->rphy = rphy; -		dsaswideprintk(ioc, printk(KERN_DEBUG "sas_rphy_add: rphy=%p\n", rphy)); +		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_rphy_add: rphy=%p\n", +		    ioc->name, rphy));  	}  	if (rphy) {  		dsaswideprintk(ioc, dev_printk(KERN_DEBUG, -		    &rphy->dev, "add:")); -		dsaswideprintk(ioc, printk(KERN_DEBUG "rphy=%p release=%p\n", -			rphy, rphy->dev.release)); +		    &rphy->dev, MYIOC_s_FMT "add:", ioc->name)); +		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "rphy=%p release=%p\n", +		    ioc->name, rphy, rphy->dev.release));  	}  } @@ -410,9 +342,9 @@ mptsas_set_port(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_po  	if (port) {  		dsaswideprintk(ioc, dev_printk(KERN_DEBUG, -		    &port->dev, "add:")); -		dsaswideprintk(ioc, printk(KERN_DEBUG "port=%p release=%p\n", -			port, port->dev.release)); +		    &port->dev, MYIOC_s_FMT "add:", ioc->name)); +		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "port=%p release=%p\n", +		    ioc->name, port, port->dev.release));  	}  } @@ -463,9 +395,9 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)  		 * Removing a phy from a port, letting the last  		 * phy be removed by firmware events.  		 */ -		dsaswideprintk(ioc, printk(KERN_DEBUG -			"%s: [%p]: deleting phy = %d\n", -			__FUNCTION__, port_details, i)); +		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT +		    "%s: [%p]: deleting phy = %d\n", +		    ioc->name, __FUNCTION__, port_details, i));  		port_details->num_phys--;  		port_details->phy_bitmask &= ~ (1 << phy_info->phy_id);  		memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo)); @@ -479,8 +411,8 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)  	phy_info = port_info->phy_info;  	for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {  		sas_address = phy_info->attached.sas_address; -		dsaswideprintk(ioc, printk(KERN_DEBUG "phy_id=%d sas_address=0x%018llX\n", -		    i, (unsigned long long)sas_address)); +		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "phy_id=%d sas_address=0x%018llX\n", +		    ioc->name, i, (unsigned long long)sas_address));  		if (!sas_address)  			continue;  		port_details = phy_info->port_details; @@ -498,9 +430,9 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)  				port_details->phy_bitmask |=  				    (1 << phy_info->phy_id);  			phy_info->sas_port_add_phy=1; -			dsaswideprintk(ioc, printk(KERN_DEBUG "\t\tForming port\n\t\t" +			dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tForming port\n\t\t"  			    "phy_id=%d sas_address=0x%018llX\n", -			    i, (unsigned long long)sas_address)); +			    ioc->name, i, (unsigned long long)sas_address));  			phy_info->port_details = port_details;  		} @@ -515,9 +447,9 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)  				continue;  			if (phy_info_cmp->port_details == port_details )  				continue; -			dsaswideprintk(ioc, printk(KERN_DEBUG +			dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT  			    "\t\tphy_id=%d sas_address=0x%018llX\n", -			    j, (unsigned long long) +			    ioc->name, j, (unsigned long long)  			    phy_info_cmp->attached.sas_address));  			if (phy_info_cmp->port_details) {  				port_details->rphy = @@ -549,15 +481,15 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)  		port_details = port_info->phy_info[i].port_details;  		if (!port_details)  			continue; -		dsaswideprintk(ioc, printk(KERN_DEBUG +		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT  		    "%s: [%p]: phy_id=%02d num_phys=%02d " -		    "bitmask=0x%016llX\n", __FUNCTION__, +		    "bitmask=0x%016llX\n", ioc->name, __FUNCTION__,  		    port_details, i, port_details->num_phys,  		    (unsigned long long)port_details->phy_bitmask)); -		dsaswideprintk(ioc, printk(KERN_DEBUG"\t\tport = %p rphy=%p\n", -			port_details->port, port_details->rphy)); +		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tport = %p rphy=%p\n", +		    ioc->name, port_details->port, port_details->rphy));  	} -	dsaswideprintk(ioc, printk(KERN_DEBUG"\n")); +	dsaswideprintk(ioc, printk("\n"));  	mutex_unlock(&ioc->sas_topology_mutex);  } @@ -573,15 +505,15 @@ static VirtTarget *  mptsas_find_vtarget(MPT_ADAPTER *ioc, u8 channel, u8 id)  {  	struct scsi_device 		*sdev; -	VirtDevice			*vdev; +	VirtDevice			*vdevice;  	VirtTarget 			*vtarget = NULL;  	shost_for_each_device(sdev, ioc->sh) { -		if ((vdev = sdev->hostdata) == NULL) +		if ((vdevice = sdev->hostdata) == NULL)  			continue; -		if (vdev->vtarget->id == id && -		    vdev->vtarget->channel == channel) -			vtarget = vdev->vtarget; +		if (vdevice->vtarget->id == id && +		    vdevice->vtarget->channel == channel) +			vtarget = vdevice->vtarget;  	}  	return vtarget;  } @@ -623,13 +555,7 @@ mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)  	DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf); -	if (mpt_send_handshake_request(ioc->TaskCtx, ioc, -	    sizeof(SCSITaskMgmt_t), (u32 *)mf, NO_SLEEP)) { -		mpt_free_msg_frame(ioc, mf); -		dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, tm handshake failed @%d!!\n", -		    ioc->name,__FUNCTION__, __LINE__)); -		return 0; -	} +	mpt_put_msg_frame_hi_pri(ioc->TaskCtx, ioc, mf);  	return 1;  } @@ -649,7 +575,7 @@ static void  mptsas_target_reset_queue(MPT_ADAPTER *ioc,      EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)  { -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)ioc->sh->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(ioc->sh);  	VirtTarget *vtarget = NULL;  	struct mptsas_target_reset_event *target_reset_list;  	u8		id, channel; @@ -696,7 +622,7 @@ mptsas_target_reset_queue(MPT_ADAPTER *ioc,  static void  mptsas_dev_reset_complete(MPT_ADAPTER *ioc)  { -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)ioc->sh->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(ioc->sh);          struct list_head *head = &hd->target_reset_list;  	struct mptsas_target_reset_event *target_reset_list;  	struct mptsas_hotplug_event *ev; @@ -813,7 +739,7 @@ mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)  	if (!ioc->sh || !ioc->sh->hostdata)  		goto out; -	hd = (MPT_SCSI_HOST *)ioc->sh->hostdata; +	hd = shost_priv(ioc->sh);  	if (!hd->ioc)  		goto out; @@ -913,19 +839,20 @@ static int  mptsas_target_alloc(struct scsi_target *starget)  {  	struct Scsi_Host *host = dev_to_shost(&starget->dev); -	MPT_SCSI_HOST		*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST		*hd = shost_priv(host);  	VirtTarget		*vtarget;  	u8			id, channel;  	struct sas_rphy		*rphy;  	struct mptsas_portinfo	*p;  	int 			 i; +	MPT_ADAPTER		*ioc = hd->ioc;  	vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);  	if (!vtarget)  		return -ENOMEM;  	vtarget->starget = starget; -	vtarget->ioc_id = hd->ioc->id; +	vtarget->ioc_id = ioc->id;  	vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;  	id = starget->id;  	channel = 0; @@ -934,15 +861,15 @@ mptsas_target_alloc(struct scsi_target *starget)  	 * RAID volumes placed beyond the last expected port.  	 */  	if (starget->channel == MPTSAS_RAID_CHANNEL) { -		for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++) -			if (id == hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID) -				channel = hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus; +		for (i=0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) +			if (id == ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID) +				channel = ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus;  		goto out;  	}  	rphy = dev_to_rphy(starget->dev.parent); -	mutex_lock(&hd->ioc->sas_topology_mutex); -	list_for_each_entry(p, &hd->ioc->sas_topology, list) { +	mutex_lock(&ioc->sas_topology_mutex); +	list_for_each_entry(p, &ioc->sas_topology, list) {  		for (i = 0; i < p->num_phys; i++) {  			if (p->phy_info[i].attached.sas_address !=  					rphy->identify.sas_address) @@ -954,18 +881,18 @@ mptsas_target_alloc(struct scsi_target *starget)  			/*  			 * Exposing hidden raid components  			 */ -			if (mptscsih_is_phys_disk(hd->ioc, channel, id)) { -				id = mptscsih_raid_id_to_num(hd->ioc, +			if (mptscsih_is_phys_disk(ioc, channel, id)) { +				id = mptscsih_raid_id_to_num(ioc,  						channel, id);  				vtarget->tflags |=  				    MPT_TARGET_FLAGS_RAID_COMPONENT;  				p->phy_info[i].attached.phys_disk_num = id;  			} -			mutex_unlock(&hd->ioc->sas_topology_mutex); +			mutex_unlock(&ioc->sas_topology_mutex);  			goto out;  		}  	} -	mutex_unlock(&hd->ioc->sas_topology_mutex); +	mutex_unlock(&ioc->sas_topology_mutex);  	kfree(vtarget);  	return -ENXIO; @@ -981,10 +908,11 @@ static void  mptsas_target_destroy(struct scsi_target *starget)  {  	struct Scsi_Host *host = dev_to_shost(&starget->dev); -	MPT_SCSI_HOST		*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST		*hd = shost_priv(host);  	struct sas_rphy		*rphy;  	struct mptsas_portinfo	*p;  	int 			 i; +	MPT_ADAPTER *ioc = hd->ioc;  	if (!starget->hostdata)  		return; @@ -993,7 +921,7 @@ mptsas_target_destroy(struct scsi_target *starget)  		goto out;  	rphy = dev_to_rphy(starget->dev.parent); -	list_for_each_entry(p, &hd->ioc->sas_topology, list) { +	list_for_each_entry(p, &ioc->sas_topology, list) {  		for (i = 0; i < p->num_phys; i++) {  			if (p->phy_info[i].attached.sas_address !=  					rphy->identify.sas_address) @@ -1013,61 +941,62 @@ static int  mptsas_slave_alloc(struct scsi_device *sdev)  {  	struct Scsi_Host	*host = sdev->host; -	MPT_SCSI_HOST		*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST		*hd = shost_priv(host);  	struct sas_rphy		*rphy;  	struct mptsas_portinfo	*p; -	VirtDevice		*vdev; +	VirtDevice		*vdevice;  	struct scsi_target 	*starget;  	int 			i; +	MPT_ADAPTER *ioc = hd->ioc; -	vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL); -	if (!vdev) { +	vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL); +	if (!vdevice) {  		printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n", -				hd->ioc->name, sizeof(VirtDevice)); +				ioc->name, sizeof(VirtDevice));  		return -ENOMEM;  	}  	starget = scsi_target(sdev); -	vdev->vtarget = starget->hostdata; +	vdevice->vtarget = starget->hostdata;  	if (sdev->channel == MPTSAS_RAID_CHANNEL)  		goto out;  	rphy = dev_to_rphy(sdev->sdev_target->dev.parent); -	mutex_lock(&hd->ioc->sas_topology_mutex); -	list_for_each_entry(p, &hd->ioc->sas_topology, list) { +	mutex_lock(&ioc->sas_topology_mutex); +	list_for_each_entry(p, &ioc->sas_topology, list) {  		for (i = 0; i < p->num_phys; i++) {  			if (p->phy_info[i].attached.sas_address !=  					rphy->identify.sas_address)  				continue; -			vdev->lun = sdev->lun; +			vdevice->lun = sdev->lun;  			/*  			 * Exposing hidden raid components  			 */ -			if (mptscsih_is_phys_disk(hd->ioc, +			if (mptscsih_is_phys_disk(ioc,  			    p->phy_info[i].attached.channel,  			    p->phy_info[i].attached.id))  				sdev->no_uld_attach = 1; -			mutex_unlock(&hd->ioc->sas_topology_mutex); +			mutex_unlock(&ioc->sas_topology_mutex);  			goto out;  		}  	} -	mutex_unlock(&hd->ioc->sas_topology_mutex); +	mutex_unlock(&ioc->sas_topology_mutex); -	kfree(vdev); +	kfree(vdevice);  	return -ENXIO;   out: -	vdev->vtarget->num_luns++; -	sdev->hostdata = vdev; +	vdevice->vtarget->num_luns++; +	sdev->hostdata = vdevice;  	return 0;  }  static int  mptsas_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  { -	VirtDevice	*vdev = SCpnt->device->hostdata; +	VirtDevice	*vdevice = SCpnt->device->hostdata; -	if (!vdev || !vdev->vtarget || vdev->vtarget->deleted) { +	if (!vdevice || !vdevice->vtarget || vdevice->vtarget->deleted) {  		SCpnt->result = DID_NO_CONNECT << 16;  		done(SCpnt);  		return 0; @@ -1239,10 +1168,8 @@ static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)  	/* process the completed Reply Message Frame */  	reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply;  	if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) { -		printk("%s: IOCStatus=0x%X IOCLogInfo=0x%X\n", -		    __FUNCTION__, -		    reply->IOCStatus, -		    reply->IOCLogInfo); +		printk(MYIOC_s_INFO_FMT "%s: IOCStatus=0x%X IOCLogInfo=0x%X\n", +		    ioc->name, __FUNCTION__, reply->IOCStatus, reply->IOCLogInfo);  		error = -ENXIO;  		goto out_unlock;  	} @@ -1328,16 +1255,16 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,  	u64 sas_address = 0;  	if (!rsp) { -		printk(KERN_ERR "%s: the smp response space is missing\n", -		       __FUNCTION__); +		printk(MYIOC_s_ERR_FMT "%s: the smp response space is missing\n", +		    ioc->name, __FUNCTION__);  		return -EINVAL;  	}  	/* do we need to support multiple segments? */  	if (req->bio->bi_vcnt > 1 || rsp->bio->bi_vcnt > 1) { -		printk(KERN_ERR "%s: multiple segments req %u %u, rsp %u %u\n", -		       __FUNCTION__, req->bio->bi_vcnt, req->data_len, -		       rsp->bio->bi_vcnt, rsp->data_len); +		printk(MYIOC_s_ERR_FMT "%s: multiple segments req %u %u, rsp %u %u\n", +		    ioc->name, __FUNCTION__, req->bio->bi_vcnt, req->data_len, +		    rsp->bio->bi_vcnt, rsp->data_len);  		return -EINVAL;  	} @@ -1402,7 +1329,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,  	timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, 10 * HZ);  	if (!timeleft) { -		printk(KERN_ERR "%s: smp timeout!\n", __FUNCTION__); +		printk(MYIOC_s_ERR_FMT "%s: smp timeout!\n", ioc->name, __FUNCTION__);  		/* On timeout reset the board */  		mpt_HardResetHandler(ioc, CAN_SLEEP);  		ret = -ETIMEDOUT; @@ -1417,8 +1344,8 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,  		memcpy(req->sense, smprep, sizeof(*smprep));  		req->sense_len = sizeof(*smprep);  	} else { -		printk(KERN_ERR "%s: smp passthru reply failed to be returned\n", -		       __FUNCTION__); +		printk(MYIOC_s_ERR_FMT "%s: smp passthru reply failed to be returned\n", +		    ioc->name, __FUNCTION__);  		ret = -ENXIO;  	}  unmap: @@ -2062,12 +1989,12 @@ static int mptsas_probe_one_phy(struct device *dev,  				goto out;  			}  			mptsas_set_port(ioc, phy_info, port); -			dsaswideprintk(ioc, printk(KERN_DEBUG +			dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT  			    "sas_port_alloc: port=%p dev=%p port_id=%d\n", -			    port, dev, port->port_identifier)); +			    ioc->name, port, dev, port->port_identifier));  		} -		dsaswideprintk(ioc, printk(KERN_DEBUG "sas_port_add_phy: phy_id=%d\n", -		    phy_info->phy_id)); +		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_port_add_phy: phy_id=%d\n", +		    ioc->name, phy_info->phy_id));  		sas_port_add_phy(port, phy_info->phy);  		phy_info->sas_port_add_phy = 0;  	} @@ -2369,8 +2296,9 @@ mptsas_delete_expander_phys(MPT_ADAPTER *ioc)  					expander_sas_address)  					continue;  				dsaswideprintk(ioc, -					dev_printk(KERN_DEBUG, &port->dev, -					"delete port (%d)\n", port->port_identifier)); +				    dev_printk(KERN_DEBUG, &port->dev, +				    MYIOC_s_FMT "delete port (%d)\n", ioc->name, +				    port->port_identifier));  				sas_port_delete(port);  				mptsas_port_delete(ioc, phy_info->port_details);  			} @@ -2613,7 +2541,7 @@ mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id)  		ev = kzalloc(sizeof(*ev), GFP_ATOMIC);  		if (!ev) { -			printk(KERN_WARNING "mptsas: lost hotplug event\n"); +			printk(MYIOC_s_WARN_FMT "mptsas: lost hotplug event\n", ioc->name);  			goto out;  		} @@ -2754,8 +2682,8 @@ mptsas_hotplug_work(struct work_struct *work)  		printk(MYIOC_s_INFO_FMT  		       "removing %s device, channel %d, id %d, phy %d\n",  		       ioc->name, ds, ev->channel, ev->id, phy_info->phy_id); -		dev_printk(KERN_DEBUG, &port->dev, -		    "delete port (%d)\n", port->port_identifier); +		dev_printk(KERN_DEBUG, &port->dev, MYIOC_s_FMT +		    "delete port (%d)\n", ioc->name, port->port_identifier);  		sas_port_delete(port);  		mptsas_port_delete(ioc, phy_info->port_details);  		break; @@ -2796,8 +2724,8 @@ mptsas_hotplug_work(struct work_struct *work)  			if (!vtarget) {  				dfailprintk(ioc, printk(MYIOC_s_ERR_FMT -					"%s: exit at line=%d\n", ioc->name, -				       	__FUNCTION__, __LINE__)); +				    "%s: exit at line=%d\n", ioc->name, +				    __FUNCTION__, __LINE__));  				break;  			}  			/* @@ -2930,7 +2858,7 @@ mptsas_send_sas_event(MPT_ADAPTER *ioc,  	case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:  		ev = kzalloc(sizeof(*ev), GFP_ATOMIC);  		if (!ev) { -			printk(KERN_WARNING "mptsas: lost hotplug event\n"); +			printk(MYIOC_s_WARN_FMT "lost hotplug event\n", ioc->name);  			break;  		} @@ -2989,7 +2917,7 @@ mptsas_send_raid_event(MPT_ADAPTER *ioc,  	ev = kzalloc(sizeof(*ev), GFP_ATOMIC);  	if (!ev) { -		printk(KERN_WARNING "mptsas: lost hotplug event\n"); +		printk(MYIOC_s_WARN_FMT "lost hotplug event\n", ioc->name);  		return;  	} @@ -3288,20 +3216,22 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)  		sh->sg_tablesize = numSGE;  	} -	hd = (MPT_SCSI_HOST *) sh->hostdata; +	hd = shost_priv(sh);  	hd->ioc = ioc;  	/* SCSI needs scsi_cmnd lookup table!  	 * (with size equal to req_depth*PtrSz!)  	 */ -	hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC); -	if (!hd->ScsiLookup) { +	ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC); +	if (!ioc->ScsiLookup) {  		error = -ENOMEM; +		spin_unlock_irqrestore(&ioc->FreeQlock, flags);  		goto out_mptsas_probe;  	} +	spin_lock_init(&ioc->scsi_lookup_lock);  	dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", -		 ioc->name, hd->ScsiLookup)); +		 ioc->name, ioc->ScsiLookup));  	/* Clear the TM flags  	 */ @@ -3340,8 +3270,8 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	error = scsi_add_host(sh, &ioc->pcidev->dev);  	if (error) { -		dprintk(ioc, printk(KERN_ERR MYNAM -		  "scsi_add_host failed\n")); +		dprintk(ioc, printk(MYIOC_s_ERR_FMT +		  "scsi_add_host failed\n", ioc->name));  		goto out_mptsas_probe;  	} diff --git a/drivers/message/fusion/mptsas.h b/drivers/message/fusion/mptsas.h new file mode 100644 index 00000000000..7c150f50629 --- /dev/null +++ b/drivers/message/fusion/mptsas.h @@ -0,0 +1,158 @@ +/* + *  linux/drivers/message/fusion/mptsas.h + *      High performance SCSI + LAN / Fibre Channel device drivers. + *      For use with PCI chip/adapter(s): + *          LSIFC9xx/LSI409xx Fibre Channel + *      running LSI MPT (Message Passing Technology) firmware. + * + *  Copyright (c) 1999-2007 LSI Corporation + *  (mailto:DL-MPTFusionLinux@lsi.com) + * + */ +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* +    This program is free software; you can redistribute it and/or modify +    it under the terms of the GNU General Public License as published by +    the Free Software Foundation; version 2 of the License. + +    This program is distributed in the hope that it will be useful, +    but WITHOUT ANY WARRANTY; without even the implied warranty of +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +    GNU General Public License for more details. + +    NO WARRANTY +    THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR +    CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT +    LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, +    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is +    solely responsible for determining the appropriateness of using and +    distributing the Program and assumes all risks associated with its +    exercise of rights under this Agreement, including but not limited to +    the risks and costs of program errors, damage to or loss of data, +    programs or equipment, and unavailability or interruption of operations. + +    DISCLAIMER OF LIABILITY +    NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY +    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +    DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND +    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +    USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES + +    You should have received a copy of the GNU General Public License +    along with this program; if not, write to the Free Software +    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA +*/ + +#ifndef MPTSAS_H_INCLUDED +#define MPTSAS_H_INCLUDED +/*{-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + +struct mptsas_target_reset_event { +	struct list_head 	list; +	EVENT_DATA_SAS_DEVICE_STATUS_CHANGE sas_event_data; +	u8	target_reset_issued; +}; + +enum mptsas_hotplug_action { +	MPTSAS_ADD_DEVICE, +	MPTSAS_DEL_DEVICE, +	MPTSAS_ADD_RAID, +	MPTSAS_DEL_RAID, +	MPTSAS_ADD_INACTIVE_VOLUME, +	MPTSAS_IGNORE_EVENT, +}; + +struct mptsas_hotplug_event { +	struct work_struct	work; +	MPT_ADAPTER		*ioc; +	enum mptsas_hotplug_action event_type; +	u64			sas_address; +	u8			channel; +	u8			id; +	u32			device_info; +	u16			handle; +	u16			parent_handle; +	u8			phy_id; +	u8			phys_disk_num_valid;	/* hrc (hidden raid component) */ +	u8			phys_disk_num;		/* hrc - unique index*/ +	u8			hidden_raid_component;	/* hrc - don't expose*/ +}; + +struct mptsas_discovery_event { +	struct work_struct	work; +	MPT_ADAPTER		*ioc; +}; + +/* + * SAS topology structures + * + * The MPT Fusion firmware interface spreads information about the + * SAS topology over many manufacture pages, thus we need some data + * structure to collect it and process it for the SAS transport class. + */ + +struct mptsas_devinfo { +	u16	handle;		/* unique id to address this device */ +	u16	handle_parent;	/* unique id to address parent device */ +	u16	handle_enclosure; /* enclosure identifier of the enclosure */ +	u16	slot;		/* physical slot in enclosure */ +	u8	phy_id;		/* phy number of parent device */ +	u8	port_id;	/* sas physical port this device +				   is assoc'd with */ +	u8	id;		/* logical target id of this device */ +	u32	phys_disk_num;	/* phys disk id, for csmi-ioctls */ +	u8	channel;	/* logical bus number of this device */ +	u64	sas_address;    /* WWN of this device, +				   SATA is assigned by HBA,expander */ +	u32	device_info;	/* bitfield detailed info about this device */ +}; + +/* + * Specific details on ports, wide/narrow + */ +struct mptsas_portinfo_details{ +	u16	num_phys;	/* number of phys belong to this port */ +	u64	phy_bitmask; 	/* TODO, extend support for 255 phys */ +	struct sas_rphy *rphy;	/* transport layer rphy object */ +	struct sas_port *port;	/* transport layer port object */ +	struct scsi_target *starget; +	struct mptsas_portinfo *port_info; +}; + +struct mptsas_phyinfo { +	u16	handle;			/* unique id to address this */ +	u8	phy_id; 		/* phy index */ +	u8	port_id; 		/* firmware port identifier */ +	u8	negotiated_link_rate;	/* nego'd link rate for this phy */ +	u8	hw_link_rate; 		/* hardware max/min phys link rate */ +	u8	programmed_link_rate;	/* programmed max/min phy link rate */ +	u8	sas_port_add_phy;	/* flag to request sas_port_add_phy*/ +	struct mptsas_devinfo identify;	/* point to phy device info */ +	struct mptsas_devinfo attached;	/* point to attached device info */ +	struct sas_phy *phy;		/* transport layer phy object */ +	struct mptsas_portinfo *portinfo; +	struct mptsas_portinfo_details * port_details; +}; + +struct mptsas_portinfo { +	struct list_head list; +	u16		num_phys;	/* number of phys */ +	struct mptsas_phyinfo *phy_info; +}; + +struct mptsas_enclosure { +	u64	enclosure_logical_id;	/* The WWN for the enclosure */ +	u16	enclosure_handle;	/* unique id to address this */ +	u16	flags;			/* details enclosure management */ +	u16	num_slot;		/* num slots */ +	u16	start_slot;		/* first slot */ +	u8	start_id;		/* starting logical target id */ +	u8	start_channel;		/* starting logical channel id */ +	u8	sep_id;			/* SEP device logical target id */ +	u8	sep_channel;		/* SEP channel logical channel id */ +}; + +/*}-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +#endif diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index 5431529741a..bdff950a54a 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c @@ -1,9 +1,9 @@  /*   *  linux/drivers/message/fusion/mptscsih.c - *      For use with LSI Logic PCI chip/adapter(s) - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      For use with LSI PCI chip/adapter(s) + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 1999-2007 LSI Logic Corporation + *  Copyright (c) 1999-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com)   *   */ @@ -80,6 +80,10 @@ MODULE_VERSION(my_VERSION);  /*   *  Other private/forward protos...   */ +static struct scsi_cmnd * mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i); +static struct scsi_cmnd * mptscsih_getclear_scsi_lookup(MPT_ADAPTER *ioc, int i); +static void	mptscsih_set_scsi_lookup(MPT_ADAPTER *ioc, int i, struct scsi_cmnd *scmd); +static int	SCPNT_TO_LOOKUP_IDX(MPT_ADAPTER *ioc, struct scsi_cmnd *scmd);  int		mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);  static void	mptscsih_report_queue_full(struct scsi_cmnd *sc, SCSIIOReply_t *pScsiReply, SCSIIORequest_t *pScsiReq);  int		mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r); @@ -90,7 +94,6 @@ static void	mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx);  static void	mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply);  static int	mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd);  static int	mptscsih_tm_wait_for_completion(MPT_SCSI_HOST * hd, ulong timeout ); -static int	SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc);  static int	mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int ctx2abort, ulong timeout); @@ -192,7 +195,7 @@ mptscsih_getFreeChainBuffer(MPT_ADAPTER *ioc, int *retIndex)  	int chain_idx;  	dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "getFreeChainBuffer called\n", -			ioc->name)); +	    ioc->name));  	spin_lock_irqsave(&ioc->FreeQlock, flags);  	if (!list_empty(&ioc->FreeChainQ)) {  		int offset; @@ -203,13 +206,14 @@ mptscsih_getFreeChainBuffer(MPT_ADAPTER *ioc, int *retIndex)  		offset = (u8 *)chainBuf - (u8 *)ioc->ChainBuffer;  		chain_idx = offset / ioc->req_sz;  		rc = SUCCESS; -		dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "getFreeChainBuffer chainBuf=%p ChainBuffer=%p offset=%d chain_idx=%d\n", -			ioc->name, chainBuf, ioc->ChainBuffer, offset, chain_idx)); +		dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT +		    "getFreeChainBuffer chainBuf=%p ChainBuffer=%p offset=%d chain_idx=%d\n", +		    ioc->name, chainBuf, ioc->ChainBuffer, offset, chain_idx));  	} else {  		rc = FAILED;  		chain_idx = MPT_HOST_NO_CHAIN; -		dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT "getFreeChainBuffer failed\n", -			ioc->name)); +		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "getFreeChainBuffer failed\n", +		    ioc->name));  	}  	spin_unlock_irqrestore(&ioc->FreeQlock, flags); @@ -419,8 +423,8 @@ nextSGEset:  		 *   out the Address and Flags fields.  		 */  		chainSge = (char *) psge; -		dsgprintk(ioc, printk(KERN_DEBUG "  Current buff @ %p (index 0x%x)", -				psge, req_idx)); +		dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "  Current buff @ %p (index 0x%x)", +		    ioc->name, psge, req_idx));  		/* Start the SGE for the next buffer  		 */ @@ -428,8 +432,8 @@ nextSGEset:  		sgeOffset = 0;  		sg_done = 0; -		dsgprintk(ioc, printk(KERN_DEBUG "  Chain buff @ %p (index 0x%x)\n", -				psge, chain_idx)); +		dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "  Chain buff @ %p (index 0x%x)\n", +		    ioc->name, psge, chain_idx));  		/* Start the SGE for the next buffer  		 */ @@ -588,18 +592,17 @@ mptscsih_info_scsiio(MPT_ADAPTER *ioc, struct scsi_cmnd *sc, SCSIIOReply_t * pSc  	}  	scsi_print_command(sc); -	printk(KERN_DEBUG "\tfw_channel = %d, fw_id = %d\n", -	    pScsiReply->Bus, pScsiReply->TargetID); -	printk(KERN_DEBUG "\trequest_len = %d, underflow = %d, resid = %d\n", -	    scsi_bufflen(sc), sc->underflow, scsi_get_resid(sc)); -	printk(KERN_DEBUG "\ttag = %d, transfer_count = %d, sc->result = %08X\n", -	    le16_to_cpu(pScsiReply->TaskTag), +	printk(MYIOC_s_DEBUG_FMT "\tfw_channel = %d, fw_id = %d\n", +	    ioc->name, pScsiReply->Bus, pScsiReply->TargetID); +	printk(MYIOC_s_DEBUG_FMT "\trequest_len = %d, underflow = %d, " +	    "resid = %d\n", ioc->name, scsi_bufflen(sc), sc->underflow, +	    scsi_get_resid(sc)); +	printk(MYIOC_s_DEBUG_FMT "\ttag = %d, transfer_count = %d, " +	    "sc->result = %08X\n", ioc->name, le16_to_cpu(pScsiReply->TaskTag),  	    le32_to_cpu(pScsiReply->TransferCount), sc->result); - -	printk(KERN_DEBUG "\tiocstatus = %s (0x%04x), " +	printk(MYIOC_s_DEBUG_FMT "\tiocstatus = %s (0x%04x), "  	    "scsi_status = %s (0x%02x), scsi_state = (0x%02x)\n", -	    desc, ioc_status, -	    desc1, pScsiReply->SCSIStatus, +	    ioc->name, desc, ioc_status, desc1, pScsiReply->SCSIStatus,  	    pScsiReply->SCSIState);  	if (pScsiReply->SCSIState & MPI_SCSI_STATE_AUTOSENSE_VALID) { @@ -607,9 +610,8 @@ mptscsih_info_scsiio(MPT_ADAPTER *ioc, struct scsi_cmnd *sc, SCSIIOReply_t * pSc  		asc = sc->sense_buffer[12];  		ascq = sc->sense_buffer[13]; -		printk(KERN_DEBUG "\t[sense_key,asc,ascq]: " -		    "[0x%02x,0x%02x,0x%02x]\n", -		    skey, asc, ascq); +		printk(MYIOC_s_DEBUG_FMT "\t[sense_key,asc,ascq]: " +		    "[0x%02x,0x%02x,0x%02x]\n", ioc->name, skey, asc, ascq);  	}  	/* @@ -617,8 +619,8 @@ mptscsih_info_scsiio(MPT_ADAPTER *ioc, struct scsi_cmnd *sc, SCSIIOReply_t * pSc  	 */  	if (pScsiReply->SCSIState & MPI_SCSI_STATE_RESPONSE_INFO_VALID &&  	    pScsiReply->ResponseInfo) -		printk(KERN_DEBUG "response_info = %08xh\n", -		    le32_to_cpu(pScsiReply->ResponseInfo)); +		printk(MYIOC_s_DEBUG_FMT "response_info = %08xh\n", +		    ioc->name, le32_to_cpu(pScsiReply->ResponseInfo));  }  #endif @@ -645,11 +647,10 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)  	SCSIIORequest_t	*pScsiReq;  	SCSIIOReply_t	*pScsiReply;  	u16		 req_idx, req_idx_MR; -	VirtDevice	 *vdev; +	VirtDevice	 *vdevice;  	VirtTarget	 *vtarget; -	hd = (MPT_SCSI_HOST *) ioc->sh->hostdata; - +	hd = shost_priv(ioc->sh);  	req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);  	req_idx_MR = (mr != NULL) ?  	    le16_to_cpu(mr->u.frame.hwhdr.msgctxu.fld.req_idx) : req_idx; @@ -660,12 +661,11 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)  		printk (MYIOC_s_ERR_FMT  		    "req_idx=%x req_idx_MR=%x mf=%p mr=%p sc=%p\n",  		    ioc->name, req_idx, req_idx_MR, mf, mr, -		    hd->ScsiLookup[req_idx_MR]); +		    mptscsih_get_scsi_lookup(ioc, req_idx_MR));  		return 0;  	} -	sc = hd->ScsiLookup[req_idx]; -	hd->ScsiLookup[req_idx] = NULL; +	sc = mptscsih_getclear_scsi_lookup(ioc, req_idx);  	if (sc == NULL) {  		MPIHeader_t *hdr = (MPIHeader_t *)mf; @@ -738,8 +738,8 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)  		 */  		if (scsi_state & MPI_SCSI_STATE_RESPONSE_INFO_VALID &&  		    pScsiReply->ResponseInfo) { -			printk(KERN_NOTICE "[%d:%d:%d:%d] " -			"FCP_ResponseInfo=%08xh\n", +			printk(MYIOC_s_NOTE_FMT "[%d:%d:%d:%d] " +			"FCP_ResponseInfo=%08xh\n", ioc->name,  			sc->device->host->host_no, sc->device->channel,  			sc->device->id, sc->device->lun,  			le32_to_cpu(pScsiReply->ResponseInfo)); @@ -771,10 +771,10 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)  			if (hd->sel_timeout[pScsiReq->TargetID] < 0xFFFF)  				hd->sel_timeout[pScsiReq->TargetID]++; -			vdev = sc->device->hostdata; -			if (!vdev) +			vdevice = sc->device->hostdata; +			if (!vdevice)  				break; -			vtarget = vdev->vtarget; +			vtarget = vdevice->vtarget;  			if (vtarget->tflags & MPT_TARGET_FLAGS_LED_ON) {  				mptscsih_issue_sep_command(ioc, vtarget,  				    MPI_SEP_REQ_SLOTSTATUS_UNCONFIGURED); @@ -824,9 +824,9 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)  				sc->result=DID_SOFT_ERROR << 16;  			else /* Sufficient data transfer occurred */  				sc->result = (DID_OK << 16) | scsi_status; -			dreplyprintk(ioc, printk(KERN_DEBUG +			dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT  			    "RESIDUAL_MISMATCH: result=%x on channel=%d id=%d\n", -			    sc->result, sc->device->channel, sc->device->id)); +			    ioc->name, sc->result, sc->device->channel, sc->device->id));  			break;  		case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN:		/* 0x0045 */ @@ -858,9 +858,11 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)  			} -			dreplyprintk(ioc, printk(KERN_DEBUG "  sc->underflow={report ERR if < %02xh bytes xfer'd}\n", -					sc->underflow)); -			dreplyprintk(ioc, printk(KERN_DEBUG "  ActBytesXferd=%02xh\n", xfer_cnt)); +			dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT +			    "  sc->underflow={report ERR if < %02xh bytes xfer'd}\n", +			    ioc->name, sc->underflow)); +			dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT +			    "  ActBytesXferd=%02xh\n", ioc->name, xfer_cnt));  			/* Report Queue Full  			 */ @@ -969,48 +971,32 @@ static void  mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)  {  	MPT_ADAPTER *ioc = hd->ioc; -	struct scsi_cmnd	*SCpnt; -	MPT_FRAME_HDR	*mf; +	struct scsi_cmnd *sc; +	SCSIIORequest_t	*mf = NULL;  	int		 ii; -	int		 max = ioc->req_depth; - -	dprintk(ioc, printk(KERN_DEBUG MYNAM ": flush_ScsiLookup called\n")); -	for (ii= 0; ii < max; ii++) { -		if ((SCpnt = hd->ScsiLookup[ii]) != NULL) { - -			/* Command found. -			 */ - -			/* Null ScsiLookup index -			 */ -			hd->ScsiLookup[ii] = NULL; - -			mf = MPT_INDEX_2_MFPTR(ioc, ii); -			dmfprintk(ioc, printk(KERN_DEBUG MYNAM ": flush: ScsiDone (mf=%p,sc=%p)\n", -					mf, SCpnt)); - -			/* Free Chain buffers */ -			mptscsih_freeChainBuffers(ioc, ii); - -			/* Free Message frames */ -			mpt_free_msg_frame(ioc, mf); - -			if ((unsigned char *)mf != SCpnt->host_scribble) -				continue; - -			/* Set status, free OS resources (SG DMA buffers) -			 * Do OS callback -			 */ -			scsi_dma_unmap(SCpnt); - -			SCpnt->result = DID_RESET << 16; -			SCpnt->host_scribble = NULL; +	int		 channel, id; -			SCpnt->scsi_done(SCpnt);	/* Issue the command callback */ -		} +	for (ii= 0; ii < ioc->req_depth; ii++) { +		sc = mptscsih_getclear_scsi_lookup(ioc, ii); +		if (!sc) +			continue; +		mf = (SCSIIORequest_t *)MPT_INDEX_2_MFPTR(ioc, ii); +		if (!mf) +			continue; +		channel = mf->Bus; +		id = mf->TargetID; +		mptscsih_freeChainBuffers(ioc, ii); +		mpt_free_msg_frame(ioc, (MPT_FRAME_HDR *)mf); +		if ((unsigned char *)mf != sc->host_scribble) +			continue; +		scsi_dma_unmap(sc); +		sc->result = DID_RESET << 16; +		sc->host_scribble = NULL; +		sdev_printk(KERN_INFO, sc->device, MYIOC_s_FMT +		    "completing cmds: fw_channel %d, fw_id %d, sc=%p," +		    " mf = %p, idx=%x\n", ioc->name, channel, id, sc, mf, ii); +		sc->scsi_done(sc);  	} - -	return;  }  /* @@ -1032,17 +1018,16 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)  {  	SCSIIORequest_t	*mf = NULL;  	int		 ii; -	int		 max = hd->ioc->req_depth;  	struct scsi_cmnd *sc;  	struct scsi_lun  lun; +	MPT_ADAPTER *ioc = hd->ioc; +	unsigned long	flags; -	dsprintk(hd->ioc, printk(KERN_DEBUG MYNAM ": search_running channel %d id %d lun %d max %d\n", -	    vdevice->vtarget->channel, vdevice->vtarget->id, vdevice->lun, max)); - -	for (ii=0; ii < max; ii++) { -		if ((sc = hd->ScsiLookup[ii]) != NULL) { +	spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); +	for (ii = 0; ii < ioc->req_depth; ii++) { +		if ((sc = ioc->ScsiLookup[ii]) != NULL) { -			mf = (SCSIIORequest_t *)MPT_INDEX_2_MFPTR(hd->ioc, ii); +			mf = (SCSIIORequest_t *)MPT_INDEX_2_MFPTR(ioc, ii);  			if (mf == NULL)  				continue;  			/* If the device is a hidden raid component, then its @@ -1059,22 +1044,23 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)  			    memcmp(lun.scsi_lun, mf->LUN, 8))  				continue; -			/* Cleanup -			 */ -			hd->ScsiLookup[ii] = NULL; -			mptscsih_freeChainBuffers(hd->ioc, ii); -			mpt_free_msg_frame(hd->ioc, (MPT_FRAME_HDR *)mf);  			if ((unsigned char *)mf != sc->host_scribble)  				continue; +			ioc->ScsiLookup[ii] = NULL; +			spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); +			mptscsih_freeChainBuffers(ioc, ii); +			mpt_free_msg_frame(ioc, (MPT_FRAME_HDR *)mf);  			scsi_dma_unmap(sc);  			sc->host_scribble = NULL;  			sc->result = DID_NO_CONNECT << 16; -			sdev_printk(KERN_INFO, sc->device, "completing cmds: fw_channel %d," -			   "fw_id %d, sc=%p, mf = %p, idx=%x\n", vdevice->vtarget->channel, +			sdev_printk(KERN_INFO, sc->device, MYIOC_s_FMT "completing cmds: fw_channel %d," +			   "fw_id %d, sc=%p, mf = %p, idx=%x\n", ioc->name, vdevice->vtarget->channel,  			   vdevice->vtarget->id, sc, mf, ii);  			sc->scsi_done(sc); +			spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);  		}  	} +	spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);  	return;  } @@ -1097,17 +1083,18 @@ mptscsih_report_queue_full(struct scsi_cmnd *sc, SCSIIOReply_t *pScsiReply, SCSI  {  	long time = jiffies;  	MPT_SCSI_HOST		*hd; +	MPT_ADAPTER	*ioc;  	if (sc->device == NULL)  		return;  	if (sc->device->host == NULL)  		return; -	if ((hd = (MPT_SCSI_HOST *)sc->device->host->hostdata) == NULL) +	if ((hd = shost_priv(sc->device->host)) == NULL)  		return; - +	ioc = hd->ioc;  	if (time - hd->last_queue_full > 10 * HZ) { -		dprintk(hd->ioc, printk(MYIOC_s_WARN_FMT "Device (%d:%d:%d) reported QUEUE_FULL!\n", -				hd->ioc->name, 0, sc->device->id, sc->device->lun)); +		dprintk(ioc, printk(MYIOC_s_WARN_FMT "Device (%d:%d:%d) reported QUEUE_FULL!\n", +				ioc->name, 0, sc->device->id, sc->device->lun));  		hd->last_queue_full = time;  	}  } @@ -1134,28 +1121,28 @@ mptscsih_remove(struct pci_dev *pdev)  	scsi_remove_host(host); -	if((hd = (MPT_SCSI_HOST *)host->hostdata) == NULL) +	if((hd = shost_priv(host)) == NULL)  		return;  	mptscsih_shutdown(pdev);  	sz1=0; -	if (hd->ScsiLookup != NULL) { -		sz1 = hd->ioc->req_depth * sizeof(void *); -		kfree(hd->ScsiLookup); -		hd->ScsiLookup = NULL; +	if (ioc->ScsiLookup != NULL) { +		sz1 = ioc->req_depth * sizeof(void *); +		kfree(ioc->ScsiLookup); +		ioc->ScsiLookup = NULL;  	} -	dprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT +	dprintk(ioc, printk(MYIOC_s_DEBUG_FMT  	    "Free'd ScsiLookup (%d) memory\n", -	    hd->ioc->name, sz1)); +	    ioc->name, sz1));  	kfree(hd->info_kbuf);  	/* NULL the Scsi_Host pointer  	 */ -	hd->ioc->sh = NULL; +	ioc->sh = NULL;  	scsi_host_put(host); @@ -1171,15 +1158,6 @@ mptscsih_remove(struct pci_dev *pdev)  void  mptscsih_shutdown(struct pci_dev *pdev)  { -	MPT_ADAPTER 		*ioc = pci_get_drvdata(pdev); -	struct Scsi_Host 	*host = ioc->sh; -	MPT_SCSI_HOST		*hd; - -	if(!host) -		return; - -	hd = (MPT_SCSI_HOST *)host->hostdata; -  }  #ifdef CONFIG_PM @@ -1225,7 +1203,7 @@ mptscsih_info(struct Scsi_Host *SChost)  	MPT_SCSI_HOST *h;  	int size = 0; -	h = (MPT_SCSI_HOST *)SChost->hostdata; +	h = shost_priv(SChost);  	if (h) {  		if (h->info_kbuf == NULL) @@ -1319,7 +1297,7 @@ int  mptscsih_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,  			int length, int func)  { -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER	*ioc = hd->ioc;  	int size = 0; @@ -1358,7 +1336,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	MPT_SCSI_HOST		*hd;  	MPT_FRAME_HDR		*mf;  	SCSIIORequest_t		*pScsiReq; -	VirtDevice		*vdev = SCpnt->device->hostdata; +	VirtDevice		*vdevice = SCpnt->device->hostdata;  	int	 lun;  	u32	 datalen;  	u32	 scsictl; @@ -1368,7 +1346,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	int	 ii;  	MPT_ADAPTER *ioc; -	hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata; +	hd = shost_priv(SCpnt->device->host);  	ioc = hd->ioc;  	lun = SCpnt->device->lun;  	SCpnt->scsi_done = done; @@ -1385,7 +1363,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	/*  	 *  Put together a MPT SCSI request...  	 */ -	if ((mf = mpt_get_msg_frame(hd->ioc->DoneCtx, hd->ioc)) == NULL) { +	if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) {  		dprintk(ioc, printk(MYIOC_s_WARN_FMT "QueueCmd, no msg frames!!\n",  				ioc->name));  		return SCSI_MLQUEUE_HOST_BUSY; @@ -1415,8 +1393,8 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	/* Default to untagged. Once a target structure has been allocated,  	 * use the Inquiry data to determine if device supports tagged.  	 */ -	if (vdev -	    && (vdev->vtarget->tflags & MPT_TARGET_FLAGS_Q_YES) +	if (vdevice +	    && (vdevice->vtarget->tflags & MPT_TARGET_FLAGS_Q_YES)  	    && (SCpnt->device->tagged_supported)) {  		scsictl = scsidir | MPI_SCSIIO_CONTROL_SIMPLEQ;  	} else { @@ -1425,10 +1403,10 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	/* Use the above information to set up the message frame  	 */ -	pScsiReq->TargetID = (u8) vdev->vtarget->id; -	pScsiReq->Bus = vdev->vtarget->channel; +	pScsiReq->TargetID = (u8) vdevice->vtarget->id; +	pScsiReq->Bus = vdevice->vtarget->channel;  	pScsiReq->ChainOffset = 0; -	if (vdev->vtarget->tflags &  MPT_TARGET_FLAGS_RAID_COMPONENT) +	if (vdevice->vtarget->tflags &  MPT_TARGET_FLAGS_RAID_COMPONENT)  		pScsiReq->Function = MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH;  	else  		pScsiReq->Function = MPI_FUNCTION_SCSI_IO_REQUEST; @@ -1453,7 +1431,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	pScsiReq->DataLength = cpu_to_le32(datalen);  	/* SenseBuffer low address */ -	pScsiReq->SenseBufferLowAddr = cpu_to_le32(hd->ioc->sense_buf_low_dma +	pScsiReq->SenseBufferLowAddr = cpu_to_le32(ioc->sense_buf_low_dma  					   + (my_idx * MPT_SENSE_BUFFER_ALLOC));  	/* Now add the SG list @@ -1465,23 +1443,22 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  			(dma_addr_t) -1);  	} else {  		/* Add a 32 or 64 bit SGE */ -		if (mptscsih_AddSGE(hd->ioc, SCpnt, pScsiReq, my_idx) != SUCCESS) +		if (mptscsih_AddSGE(ioc, SCpnt, pScsiReq, my_idx) != SUCCESS)  			goto fail;  	}  	SCpnt->host_scribble = (unsigned char *)mf; -	hd->ScsiLookup[my_idx] = SCpnt; +	mptscsih_set_scsi_lookup(ioc, my_idx, SCpnt); -	mpt_put_msg_frame(hd->ioc->DoneCtx, hd->ioc, mf); +	mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);  	dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Issued SCSI cmd (%p) mf=%p idx=%d\n",  			ioc->name, SCpnt, mf, my_idx)); -	DBG_DUMP_REQUEST_FRAME(ioc, (u32 *)mf) +	DBG_DUMP_REQUEST_FRAME(ioc, (u32 *)mf);  	return 0;   fail: -	hd->ScsiLookup[my_idx] = NULL; -	mptscsih_freeChainBuffers(hd->ioc, my_idx); -	mpt_free_msg_frame(hd->ioc, mf); +	mptscsih_freeChainBuffers(ioc, my_idx); +	mpt_free_msg_frame(ioc, mf);  	return SCSI_MLQUEUE_HOST_BUSY;  } @@ -1590,38 +1567,38 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int c  	 */  	if (mptscsih_tm_pending_wait(hd) == FAILED) {  		if (type == MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK) { -			dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: TMHandler abort: " +			dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TMHandler abort: "  			   "Timed out waiting for last TM (%d) to complete! \n",  			   ioc->name, hd->tmPending));  			return FAILED;  		} else if (type == MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET) { -			dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: TMHandler target " +			dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TMHandler target "  				"reset: Timed out waiting for last TM (%d) "  				"to complete! \n", ioc->name,  				hd->tmPending));  			return FAILED;  		} else if (type == MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS) { -			dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: TMHandler bus reset: " +			dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TMHandler bus reset: "  			   "Timed out waiting for last TM (%d) to complete! \n",  			  ioc->name, hd->tmPending));  			return FAILED;  		}  	} else { -		spin_lock_irqsave(&hd->ioc->FreeQlock, flags); +		spin_lock_irqsave(&ioc->FreeQlock, flags);  		hd->tmPending |=  (1 << type); -		spin_unlock_irqrestore(&hd->ioc->FreeQlock, flags); +		spin_unlock_irqrestore(&ioc->FreeQlock, flags);  	} -	ioc_raw_state = mpt_GetIocState(hd->ioc, 0); +	ioc_raw_state = mpt_GetIocState(ioc, 0);  	if ((ioc_raw_state & MPI_IOC_STATE_MASK) != MPI_IOC_STATE_OPERATIONAL) {  		printk(MYIOC_s_WARN_FMT  			"TM Handler for type=%x: IOC Not operational (0x%x)!\n",  			ioc->name, type, ioc_raw_state); -		printk(KERN_WARNING " Issuing HardReset!!\n"); +		printk(MYIOC_s_WARN_FMT " Issuing HardReset!!\n", ioc->name);  		if (mpt_HardResetHandler(ioc, CAN_SLEEP) < 0) -			printk((KERN_WARNING "TMHandler: HardReset " -				"FAILED!!\n")); +			printk(MYIOC_s_WARN_FMT "TMHandler: HardReset " +			    "FAILED!!\n", ioc->name);  		return FAILED;  	} @@ -1680,16 +1657,17 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, i  	SCSITaskMgmt_t	*pScsiTm;  	int		 ii;  	int		 retval; +	MPT_ADAPTER 	*ioc = hd->ioc;  	/* Return Fail to calling function if no message frames available.  	 */ -	if ((mf = mpt_get_msg_frame(hd->ioc->TaskCtx, hd->ioc)) == NULL) { -		dfailprintk(hd->ioc, printk(MYIOC_s_ERR_FMT "IssueTaskMgmt, no msg frames!!\n", -				hd->ioc->name)); +	if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) { +		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "IssueTaskMgmt, no msg frames!!\n", +				ioc->name));  		return FAILED;  	} -	dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt request @ %p\n", -			hd->ioc->name, mf)); +	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt request @ %p\n", +			ioc->name, mf));  	/* Format the Request  	 */ @@ -1712,28 +1690,34 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, i  	pScsiTm->TaskMsgContext = ctx2abort; -	dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt: ctx2abort (0x%08x) " -		"type=%d\n", hd->ioc->name, ctx2abort, type)); +	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt: ctx2abort (0x%08x) " +		"type=%d\n", ioc->name, ctx2abort, type));  	DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)pScsiTm); -	if ((retval = mpt_send_handshake_request(hd->ioc->TaskCtx, hd->ioc, -		sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP)) != 0) { -		dfailprintk(hd->ioc, printk(MYIOC_s_ERR_FMT "send_handshake FAILED!" -			" (hd %p, ioc %p, mf %p, rc=%d) \n", hd->ioc->name, hd, -			hd->ioc, mf, retval)); -		goto fail_out; +	if ((ioc->facts.IOCCapabilities & MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q) && +	    (ioc->facts.MsgVersion >= MPI_VERSION_01_05)) +		mpt_put_msg_frame_hi_pri(ioc->TaskCtx, ioc, mf); +	else { +		retval = mpt_send_handshake_request(ioc->TaskCtx, ioc, +			sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP); +		if (retval) { +			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "send_handshake FAILED!" +			" (hd %p, ioc %p, mf %p, rc=%d) \n", ioc->name, hd, +			ioc, mf, retval)); +			goto fail_out; +		}  	}  	if(mptscsih_tm_wait_for_completion(hd, timeout) == FAILED) { -		dfailprintk(hd->ioc, printk(MYIOC_s_ERR_FMT "task management request TIMED OUT!" -			" (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd, -			hd->ioc, mf)); -		dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Calling HardReset! \n", -			 hd->ioc->name)); -		retval = mpt_HardResetHandler(hd->ioc, CAN_SLEEP); -		dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "rc=%d \n", -			 hd->ioc->name, retval)); +		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "task management request TIMED OUT!" +			" (hd %p, ioc %p, mf %p) \n", ioc->name, hd, +			ioc, mf)); +		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Calling HardReset! \n", +			 ioc->name)); +		retval = mpt_HardResetHandler(ioc, CAN_SLEEP); +		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "rc=%d \n", +			 ioc->name, retval));  		goto fail_out;  	} @@ -1754,7 +1738,7 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, i  	/*  	 * Free task managment mf, and corresponding tm flags  	 */ -	mpt_free_msg_frame(hd->ioc, mf); +	mpt_free_msg_frame(ioc, mf);  	hd->tmPending = 0;  	hd->tmState = TM_STATE_NONE;  	return FAILED; @@ -1797,11 +1781,11 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)  	/* If we can't locate our host adapter structure, return FAILED status.  	 */ -	if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL) { +	if ((hd = shost_priv(SCpnt->device->host)) == NULL) {  		SCpnt->result = DID_RESET << 16;  		SCpnt->scsi_done(SCpnt); -		printk(KERN_DEBUG MYNAM ": mptscsih_abort: Can't locate " -		    "host! (sc=%p)\n", SCpnt); +		printk(KERN_ERR MYNAM ": task abort: " +		    "can't locate host! (sc=%p)\n", SCpnt);  		return FAILED;  	} @@ -1812,8 +1796,9 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)  	vdevice = SCpnt->device->hostdata;  	if (!vdevice || !vdevice->vtarget) { -		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "task abort: device has been " -		    "deleted (sc=%p)\n", ioc->name, SCpnt)); +		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +		    "task abort: device has been deleted (sc=%p)\n", +		    ioc->name, SCpnt));  		SCpnt->result = DID_NO_CONNECT << 16;  		SCpnt->scsi_done(SCpnt);  		retval = 0; @@ -1823,8 +1808,9 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)  	/* Task aborts are not supported for hidden raid components.  	 */  	if (vdevice->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) { -		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "task abort: hidden raid " -		    "component (sc=%p)\n", ioc->name, SCpnt)); +		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +		    "task abort: hidden raid component (sc=%p)\n", +		    ioc->name, SCpnt));  		SCpnt->result = DID_RESET << 16;  		retval = FAILED;  		goto out; @@ -1832,12 +1818,12 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)  	/* Find this command  	 */ -	if ((scpnt_idx = SCPNT_TO_LOOKUP_IDX(SCpnt)) < 0) { +	if ((scpnt_idx = SCPNT_TO_LOOKUP_IDX(ioc, SCpnt)) < 0) {  		/* Cmd not found in ScsiLookup.  		 * Do OS callback.  		 */  		SCpnt->result = DID_RESET << 16; -		dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: mptscsih_abort: " +		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "task abort: "  		   "Command not in the active list! (sc=%p)\n", ioc->name,  		   SCpnt));  		retval = 0; @@ -1859,7 +1845,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)  	 *	 swap it here either.  It is an opaque cookie to  	 *	 the controller, so it does not matter. -DaveM  	 */ -	mf = MPT_INDEX_2_MFPTR(hd->ioc, scpnt_idx); +	mf = MPT_INDEX_2_MFPTR(ioc, scpnt_idx);  	ctx2abort = mf->u.frame.hwhdr.msgctxu.MsgContext;  	hd->abortSCpnt = SCpnt; @@ -1868,7 +1854,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)  	    vdevice->vtarget->channel, vdevice->vtarget->id, vdevice->lun,  	    ctx2abort, mptscsih_get_tm_timeout(ioc)); -	if (SCPNT_TO_LOOKUP_IDX(SCpnt) == scpnt_idx && +	if (SCPNT_TO_LOOKUP_IDX(ioc, SCpnt) == scpnt_idx &&  	    SCpnt->serial_number == sn)  		retval = FAILED; @@ -1901,9 +1887,9 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)  	/* If we can't locate our host adapter structure, return FAILED status.  	 */ -	if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){ -		printk(KERN_DEBUG MYNAM ": mptscsih_dev_reset: Can't " -		    "locate host! (sc=%p)\n", SCpnt); +	if ((hd = shost_priv(SCpnt->device->host)) == NULL){ +		printk(KERN_ERR MYNAM ": target reset: " +		   "Can't locate host! (sc=%p)\n", SCpnt);  		return FAILED;  	} @@ -1959,14 +1945,14 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)  {  	MPT_SCSI_HOST	*hd;  	int		 retval; -	VirtDevice	 *vdev; +	VirtDevice	 *vdevice;  	MPT_ADAPTER	*ioc;  	/* If we can't locate our host adapter structure, return FAILED status.  	 */ -	if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){ -		printk(KERN_DEBUG MYNAM ": mptscsih_bus_reset: Can't " -		    "locate host! (sc=%p)\n", SCpnt ); +	if ((hd = shost_priv(SCpnt->device->host)) == NULL){ +		printk(KERN_ERR MYNAM ": bus reset: " +		   "Can't locate host! (sc=%p)\n", SCpnt);  		return FAILED;  	} @@ -1978,9 +1964,9 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)  	if (hd->timeouts < -1)  		hd->timeouts++; -	vdev = SCpnt->device->hostdata; +	vdevice = SCpnt->device->hostdata;  	retval = mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, -	    vdev->vtarget->channel, 0, 0, 0, mptscsih_get_tm_timeout(ioc)); +	    vdevice->vtarget->channel, 0, 0, 0, mptscsih_get_tm_timeout(ioc));  	printk(MYIOC_s_INFO_FMT "bus reset: %s (sc=%p)\n",  	    ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" ), SCpnt); @@ -2008,9 +1994,9 @@ mptscsih_host_reset(struct scsi_cmnd *SCpnt)  	MPT_ADAPTER	*ioc;  	/*  If we can't locate the host to reset, then we failed. */ -	if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){ -		printk( KERN_DEBUG MYNAM ": mptscsih_host_reset: Can't " -		    "locate host! (sc=%p)\n", SCpnt); +	if ((hd = shost_priv(SCpnt->device->host)) == NULL){ +		printk(KERN_ERR MYNAM ": host reset: " +		    "Can't locate host! (sc=%p)\n", SCpnt);  		return FAILED;  	} @@ -2021,7 +2007,7 @@ mptscsih_host_reset(struct scsi_cmnd *SCpnt)  	/*  If our attempts to reset the host failed, then return a failed  	 *  status.  The host will be taken off line by the SCSI mid-layer.  	 */ -	if (mpt_HardResetHandler(hd->ioc, CAN_SLEEP) < 0) { +	if (mpt_HardResetHandler(ioc, CAN_SLEEP) < 0) {  		retval = FAILED;  	} else {  		/*  Make sure TM pending is cleared and TM state is set to @@ -2051,17 +2037,18 @@ mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd)  	unsigned long  flags;  	int            loop_count = 4 * 10;  /* Wait 10 seconds */  	int            status = FAILED; +	MPT_ADAPTER	*ioc = hd->ioc;  	do { -		spin_lock_irqsave(&hd->ioc->FreeQlock, flags); +		spin_lock_irqsave(&ioc->FreeQlock, flags);  		if (hd->tmState == TM_STATE_NONE) {  			hd->tmState = TM_STATE_IN_PROGRESS;  			hd->tmPending = 1; -			spin_unlock_irqrestore(&hd->ioc->FreeQlock, flags); +			spin_unlock_irqrestore(&ioc->FreeQlock, flags);  			status = SUCCESS;  			break;  		} -		spin_unlock_irqrestore(&hd->ioc->FreeQlock, flags); +		spin_unlock_irqrestore(&ioc->FreeQlock, flags);  		msleep(250);  	} while (--loop_count); @@ -2082,15 +2069,16 @@ mptscsih_tm_wait_for_completion(MPT_SCSI_HOST * hd, ulong timeout )  	unsigned long  flags;  	int            loop_count = 4 * timeout;  	int            status = FAILED; +	MPT_ADAPTER	*ioc = hd->ioc;  	do { -		spin_lock_irqsave(&hd->ioc->FreeQlock, flags); +		spin_lock_irqsave(&ioc->FreeQlock, flags);  		if(hd->tmPending == 0) {  			status = SUCCESS; - 			spin_unlock_irqrestore(&hd->ioc->FreeQlock, flags); +			spin_unlock_irqrestore(&ioc->FreeQlock, flags);  			break;  		} -		spin_unlock_irqrestore(&hd->ioc->FreeQlock, flags); +		spin_unlock_irqrestore(&ioc->FreeQlock, flags);  		msleep(250);  	} while (--loop_count); @@ -2172,7 +2160,7 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *m  		return 1;  	} -	hd = (MPT_SCSI_HOST *)ioc->sh->hostdata; +	hd = shost_priv(ioc->sh);  	pScsiTmReply = (SCSITaskMgmtReply_t*)mr;  	pScsiTmReq = (SCSITaskMgmt_t*)mf;  	tmType = pScsiTmReq->TaskType; @@ -2223,7 +2211,7 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *m  		if (iocstatus == MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED ||  		    hd->cmdPtr)  			if (mpt_HardResetHandler(ioc, NO_SLEEP) < 0) -				printk((KERN_WARNING " Firmware Reload FAILED!!\n")); +				printk(MYIOC_s_WARN_FMT " Firmware Reload FAILED!!\n", ioc->name);  		break;  	case MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET: @@ -2366,7 +2354,7 @@ void  mptscsih_slave_destroy(struct scsi_device *sdev)  {  	struct Scsi_Host	*host = sdev->host; -	MPT_SCSI_HOST		*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST		*hd = shost_priv(host);  	VirtTarget		*vtarget;  	VirtDevice		*vdevice;  	struct scsi_target 	*starget; @@ -2393,16 +2381,17 @@ mptscsih_slave_destroy(struct scsi_device *sdev)  int  mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth)  { -	MPT_SCSI_HOST		*hd = (MPT_SCSI_HOST *)sdev->host->hostdata; +	MPT_SCSI_HOST		*hd = shost_priv(sdev->host);  	VirtTarget 		*vtarget;  	struct scsi_target 	*starget;  	int			max_depth;  	int			tagged; +	MPT_ADAPTER		*ioc = hd->ioc;  	starget = scsi_target(sdev);  	vtarget = starget->hostdata; -	if (hd->ioc->bus_type == SPI) { +	if (ioc->bus_type == SPI) {  		if (!(vtarget->tflags & MPT_TARGET_FLAGS_Q_YES))  			max_depth = 1;  		else if (sdev->type == TYPE_DISK && @@ -2437,19 +2426,20 @@ mptscsih_slave_configure(struct scsi_device *sdev)  	VirtTarget		*vtarget;  	VirtDevice		*vdevice;  	struct scsi_target 	*starget; -	MPT_SCSI_HOST		*hd = (MPT_SCSI_HOST *)sh->hostdata; +	MPT_SCSI_HOST		*hd = shost_priv(sh); +	MPT_ADAPTER		*ioc = hd->ioc;  	starget = scsi_target(sdev);  	vtarget = starget->hostdata;  	vdevice = sdev->hostdata; -	dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT +	dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT  		"device @ %p, channel=%d, id=%d, lun=%d\n", -		hd->ioc->name, sdev, sdev->channel, sdev->id, sdev->lun)); -	if (hd->ioc->bus_type == SPI) -		dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT +		ioc->name, sdev, sdev->channel, sdev->id, sdev->lun)); +	if (ioc->bus_type == SPI) +		dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT  		    "sdtr %d wdtr %d ppr %d inq length=%d\n", -		    hd->ioc->name, sdev->sdtr, sdev->wdtr, +		    ioc->name, sdev->sdtr, sdev->wdtr,  		    sdev->ppr, sdev->inquiry_len));  	if (sdev->id > sh->max_id) { @@ -2461,21 +2451,21 @@ mptscsih_slave_configure(struct scsi_device *sdev)  	vdevice->configured_lun = 1;  	mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH); -	dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT +	dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT  		"Queue depth=%d, tflags=%x\n", -		hd->ioc->name, sdev->queue_depth, vtarget->tflags)); +		ioc->name, sdev->queue_depth, vtarget->tflags)); -	if (hd->ioc->bus_type == SPI) -		dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT +	if (ioc->bus_type == SPI) +		dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT  		    "negoFlags=%x, maxOffset=%x, SyncFactor=%x\n", -		    hd->ioc->name, vtarget->negoFlags, vtarget->maxOffset, +		    ioc->name, vtarget->negoFlags, vtarget->maxOffset,  		    vtarget->minSyncFactor));  slave_configure_exit: -	dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT +	dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT  		"tagged %d, simple %d, ordered %d\n", -		hd->ioc->name,sdev->tagged_supported, sdev->simple_tags, +		ioc->name,sdev->tagged_supported, sdev->simple_tags,  		sdev->ordered_tags));  	return 0; @@ -2494,14 +2484,15 @@ slave_configure_exit:  static void  mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply)  { -	VirtDevice	*vdev; +	VirtDevice	*vdevice;  	SCSIIORequest_t	*pReq;  	u32		 sense_count = le32_to_cpu(pScsiReply->SenseCount); +	MPT_ADAPTER 	*ioc = hd->ioc;  	/* Get target structure  	 */  	pReq = (SCSIIORequest_t *) mf; -	vdev = sc->device->hostdata; +	vdevice = sc->device->hostdata;  	if (sense_count) {  		u8 *sense_data; @@ -2509,15 +2500,14 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR  		/* Copy the sense received into the scsi command block. */  		req_index = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); -		sense_data = ((u8 *)hd->ioc->sense_buf_pool + (req_index * MPT_SENSE_BUFFER_ALLOC)); +		sense_data = ((u8 *)ioc->sense_buf_pool + (req_index * MPT_SENSE_BUFFER_ALLOC));  		memcpy(sc->sense_buffer, sense_data, SNS_LEN(sc));  		/* Log SMART data (asc = 0x5D, non-IM case only) if required.  		 */ -		if ((hd->ioc->events) && (hd->ioc->eventTypes & (1 << MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE))) { -			if ((sense_data[12] == 0x5D) && (vdev->vtarget->raidVolume == 0)) { +		if ((ioc->events) && (ioc->eventTypes & (1 << MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE))) { +			if ((sense_data[12] == 0x5D) && (vdevice->vtarget->raidVolume == 0)) {  				int idx; -				MPT_ADAPTER *ioc = hd->ioc;  				idx = ioc->eventContext % MPTCTL_EVENT_LOG_SIZE;  				ioc->events[idx].event = MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE; @@ -2530,36 +2520,116 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR  				ioc->events[idx].data[1] = (sense_data[13] << 8) | sense_data[12];  				ioc->eventContext++; -				if (hd->ioc->pcidev->vendor == +				if (ioc->pcidev->vendor ==  				    PCI_VENDOR_ID_IBM) { -					mptscsih_issue_sep_command(hd->ioc, -					    vdev->vtarget, MPI_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT); -					vdev->vtarget->tflags |= +					mptscsih_issue_sep_command(ioc, +					    vdevice->vtarget, MPI_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT); +					vdevice->vtarget->tflags |=  					    MPT_TARGET_FLAGS_LED_ON;  				}  			}  		}  	} else { -		dprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Hmmm... SenseData len=0! (?)\n", -				hd->ioc->name)); +		dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Hmmm... SenseData len=0! (?)\n", +				ioc->name));  	}  } -static int -SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc) +/** + * mptscsih_get_scsi_lookup + * + * retrieves scmd entry from ScsiLookup[] array list + * + * @ioc: Pointer to MPT_ADAPTER structure + * @i: index into the array + * + * Returns the scsi_cmd pointer + * + **/ +static struct scsi_cmnd * +mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i)  { -	MPT_SCSI_HOST *hd; -	int i; +	unsigned long	flags; +	struct scsi_cmnd *scmd; -	hd = (MPT_SCSI_HOST *) sc->device->host->hostdata; +	spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); +	scmd = ioc->ScsiLookup[i]; +	spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); + +	return scmd; +} + +/** + * mptscsih_getclear_scsi_lookup + * + * retrieves and clears scmd entry from ScsiLookup[] array list + * + * @ioc: Pointer to MPT_ADAPTER structure + * @i: index into the array + * + * Returns the scsi_cmd pointer + * + **/ +static struct scsi_cmnd * +mptscsih_getclear_scsi_lookup(MPT_ADAPTER *ioc, int i) +{ +	unsigned long	flags; +	struct scsi_cmnd *scmd; + +	spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); +	scmd = ioc->ScsiLookup[i]; +	ioc->ScsiLookup[i] = NULL; +	spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); + +	return scmd; +} -	for (i = 0; i < hd->ioc->req_depth; i++) { -		if (hd->ScsiLookup[i] == sc) { -			return i; +/** + * mptscsih_set_scsi_lookup + * + * writes a scmd entry into the ScsiLookup[] array list + * + * @ioc: Pointer to MPT_ADAPTER structure + * @i: index into the array + * @scmd: scsi_cmnd pointer + * + **/ +static void +mptscsih_set_scsi_lookup(MPT_ADAPTER *ioc, int i, struct scsi_cmnd *scmd) +{ +	unsigned long	flags; + +	spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); +	ioc->ScsiLookup[i] = scmd; +	spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); +} + +/** + * SCPNT_TO_LOOKUP_IDX + * + * search's for a given scmd in the ScsiLookup[] array list + * + * @ioc: Pointer to MPT_ADAPTER structure + * @scmd: scsi_cmnd pointer + * + **/ +static int +SCPNT_TO_LOOKUP_IDX(MPT_ADAPTER *ioc, struct scsi_cmnd *sc) +{ +	unsigned long	flags; +	int i, index=-1; + +	spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); +	for (i = 0; i < ioc->req_depth; i++) { +		if (ioc->ScsiLookup[i] == sc) { +			index = i; +			goto out;  		}  	} -	return -1; + out: +	spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); +	return index;  }  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -2568,21 +2638,20 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)  {  	MPT_SCSI_HOST	*hd;  	unsigned long	 flags; -	int 		ii; -	dtmprintk(ioc, printk(KERN_DEBUG MYNAM -			": IOC %s_reset routed to SCSI host driver!\n", -			reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( -			reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); +	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT +	    ": IOC %s_reset routed to SCSI host driver!\n", +	    ioc->name, reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( +	    reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));  	/* If a FW reload request arrives after base installed but  	 * before all scsi hosts have been attached, then an alt_ioc  	 * may have a NULL sh pointer.  	 */ -	if ((ioc->sh == NULL) || (ioc->sh->hostdata == NULL)) +	if (ioc->sh == NULL || shost_priv(ioc->sh) == NULL)  		return 0;  	else -		hd = (MPT_SCSI_HOST *) ioc->sh->hostdata; +		hd = shost_priv(ioc->sh);  	if (reset_phase == MPT_IOC_SETUP_RESET) {  		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Setup-Diag Reset\n", ioc->name)); @@ -2624,11 +2693,6 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)  		 * Init all control structures.  		 */ -		/* ScsiLookup initialization -		 */ -		for (ii=0; ii < hd->ioc->req_depth; ii++) -			hd->ScsiLookup[ii] = NULL; -  		/* 2. Chain Buffer initialization  		 */ @@ -2675,7 +2739,7 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)  			ioc->name, event));  	if (ioc->sh == NULL || -		((hd = (MPT_SCSI_HOST *)ioc->sh->hostdata) == NULL)) +		((hd = shost_priv(ioc->sh)) == NULL))  		return 1;  	switch (event) { @@ -2713,7 +2777,8 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)  	case MPI_EVENT_STATE_CHANGE:			/* 02 */  	case MPI_EVENT_EVENT_CHANGE:			/* 0A */  	default: -		dprintk(ioc, printk(KERN_DEBUG MYNAM ": Ignoring event (=%02Xh)\n", event)); +		dprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": Ignoring event (=%02Xh)\n", +		    ioc->name, event));  		break;  	} @@ -2753,7 +2818,7 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)  	int		 completionCode;  	u16		 req_idx; -	hd = (MPT_SCSI_HOST *) ioc->sh->hostdata; +	hd = shost_priv(ioc->sh);  	if ((mf == NULL) ||  	    (mf >= MPT_INDEX_2_MFPTR(ioc, ioc->req_depth))) { @@ -2765,17 +2830,17 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)  	del_timer(&hd->timer);  	req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); -	hd->ScsiLookup[req_idx] = NULL; +	mptscsih_set_scsi_lookup(ioc, req_idx, NULL);  	pReq = (SCSIIORequest_t *) mf;  	if (mf != hd->cmdPtr) {  		printk(MYIOC_s_WARN_FMT "ScanDvComplete (mf=%p, cmdPtr=%p, idx=%d)\n", -				hd->ioc->name, (void *)mf, (void *) hd->cmdPtr, req_idx); +				ioc->name, (void *)mf, (void *) hd->cmdPtr, req_idx);  	}  	hd->cmdPtr = NULL;  	ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScanDvComplete (mf=%p,mr=%p,idx=%d)\n", -			hd->ioc->name, mf, mr, req_idx)); +			ioc->name, mf, mr, req_idx));  	hd->pLocal = &hd->localReply;  	hd->pLocal->scsiStatus = 0; @@ -2839,15 +2904,15 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)  				 */  				completionCode = MPT_SCANDV_SENSE;  				hd->pLocal->scsiStatus = scsi_status; -				sense_data = ((u8 *)hd->ioc->sense_buf_pool + +				sense_data = ((u8 *)ioc->sense_buf_pool +  					(req_idx * MPT_SENSE_BUFFER_ALLOC));  				sz = min_t(int, pReq->SenseBufferLength,  							SCSI_STD_SENSE_BYTES);  				memcpy(hd->pLocal->sense, sense_data, sz); -				ddvprintk(ioc, printk(KERN_DEBUG "  Check Condition, sense ptr %p\n", -						sense_data)); +				ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "  Check Condition, sense ptr %p\n", +				    ioc->name, sense_data));  			} else if (pReply->SCSIState & MPI_SCSI_STATE_AUTOSENSE_FAILED) {  				if (pReq->CDB[0] == INQUIRY)  					completionCode = MPT_SCANDV_ISSUE_SENSE; @@ -2906,8 +2971,9 @@ void  mptscsih_timer_expired(unsigned long data)  {  	MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) data; +	MPT_ADAPTER 	*ioc = hd->ioc; -	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired! Cmd %p\n", hd->ioc->name, hd->cmdPtr)); +	ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired! Cmd %p\n", ioc->name, hd->cmdPtr));  	if (hd->cmdPtr) {  		MPIHeader_t *cmd = (MPIHeader_t *)hd->cmdPtr; @@ -2921,13 +2987,13 @@ mptscsih_timer_expired(unsigned long data)  			 */  		} else {  			/* Perform a FW reload */ -			if (mpt_HardResetHandler(hd->ioc, NO_SLEEP) < 0) { -				printk(MYIOC_s_WARN_FMT "Firmware Reload FAILED!\n", hd->ioc->name); +			if (mpt_HardResetHandler(ioc, NO_SLEEP) < 0) { +				printk(MYIOC_s_WARN_FMT "Firmware Reload FAILED!\n", ioc->name);  			}  		}  	} else {  		/* This should NEVER happen */ -		printk(MYIOC_s_WARN_FMT "Null cmdPtr!!!!\n", hd->ioc->name); +		printk(MYIOC_s_WARN_FMT "Null cmdPtr!!!!\n", ioc->name);  	}  	/* No more processing. @@ -2935,7 +3001,7 @@ mptscsih_timer_expired(unsigned long data)  	 * The FW will reply to all outstanding commands, callback will finish cleanup.  	 * Hard reset clean-up will free all resources.  	 */ -	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired Complete!\n", hd->ioc->name)); +	ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired Complete!\n", ioc->name));  	return;  } @@ -2973,11 +3039,12 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)  	char		 cmdLen;  	char		 CDB[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  	char		 cmd = io->cmd; +	MPT_ADAPTER 	*ioc = hd->ioc;  	in_isr = in_interrupt();  	if (in_isr) { -		dprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Internal SCSI IO request not allowed in ISR context!\n", -       				hd->ioc->name)); +		dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Internal SCSI IO request not allowed in ISR context!\n", +					ioc->name));  		return -EPERM;  	} @@ -3078,9 +3145,9 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)  	/* Get and Populate a free Frame  	 */ -	if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) { -		ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "No msg frames!\n", -					hd->ioc->name)); +	if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) { +		dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "No msg frames!\n", +		    ioc->name));  		return -EBUSY;  	} @@ -3119,19 +3186,19 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)  	if (cmd == REQUEST_SENSE) {  		pScsiReq->Control = cpu_to_le32(dir | MPI_SCSIIO_CONTROL_UNTAGGED); -		ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Untagged! 0x%2x\n", -			hd->ioc->name, cmd)); +		ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Untagged! 0x%2x\n", +			ioc->name, cmd));  	}  	for (ii=0; ii < 16; ii++)  		pScsiReq->CDB[ii] = CDB[ii];  	pScsiReq->DataLength = cpu_to_le32(io->size); -	pScsiReq->SenseBufferLowAddr = cpu_to_le32(hd->ioc->sense_buf_low_dma +	pScsiReq->SenseBufferLowAddr = cpu_to_le32(ioc->sense_buf_low_dma  					   + (my_idx * MPT_SENSE_BUFFER_ALLOC)); -	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Sending Command 0x%x for (%d:%d:%d)\n", -			hd->ioc->name, cmd, io->channel, io->id, io->lun)); +	ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending Command 0x%x for (%d:%d:%d)\n", +			ioc->name, cmd, io->channel, io->id, io->lun));  	if (dir == MPI_SCSIIO_CONTROL_READ) {  		mpt_add_sge((char *) &pScsiReq->SGL, @@ -3166,7 +3233,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)  	hd->cmdPtr = mf;  	add_timer(&hd->timer); -	mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf); +	mpt_put_msg_frame(ioc->InternalCtx, ioc, mf);  	wait_event(hd->scandv_waitq, hd->scandv_wait_done);  	if (hd->pLocal) { @@ -3182,8 +3249,8 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)  	} else {  		rc = -EFAULT;  		/* This should never happen. */ -		ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "_do_cmd: Null pLocal!!!\n", -				hd->ioc->name)); +		ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "_do_cmd: Null pLocal!!!\n", +				ioc->name));  	}  	return rc; @@ -3235,7 +3302,7 @@ static ssize_t  mptscsih_version_fw_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%02d.%02d.%02d.%02d\n", @@ -3250,7 +3317,7 @@ static ssize_t  mptscsih_version_bios_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x.%02x\n", @@ -3265,7 +3332,7 @@ static ssize_t  mptscsih_version_mpi_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%03x\n", ioc->facts.MsgVersion); @@ -3276,7 +3343,7 @@ static ssize_t  mptscsih_version_product_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%s\n", ioc->prod_name); @@ -3288,7 +3355,7 @@ static ssize_t  mptscsih_version_nvdata_persistent_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%02xh\n", @@ -3301,7 +3368,7 @@ static ssize_t  mptscsih_version_nvdata_default_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%02xh\n",ioc->nvdata_version_default); @@ -3313,7 +3380,7 @@ static ssize_t  mptscsih_board_name_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%s\n", ioc->board_name); @@ -3324,7 +3391,7 @@ static ssize_t  mptscsih_board_assembly_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%s\n", ioc->board_assembly); @@ -3336,7 +3403,7 @@ static ssize_t  mptscsih_board_tracer_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%s\n", ioc->board_tracer); @@ -3348,7 +3415,7 @@ static ssize_t  mptscsih_io_delay_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->io_missing_delay); @@ -3360,7 +3427,7 @@ static ssize_t  mptscsih_device_delay_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->device_missing_delay); @@ -3372,7 +3439,7 @@ static ssize_t  mptscsih_debug_level_show(struct class_device *cdev, char *buf)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	return snprintf(buf, PAGE_SIZE, "%08xh\n", ioc->debug_level); @@ -3382,7 +3449,7 @@ mptscsih_debug_level_store(struct class_device *cdev, const char *buf,  								size_t count)  {  	struct Scsi_Host *host = class_to_shost(cdev); -	MPT_SCSI_HOST	*hd = (MPT_SCSI_HOST *)host->hostdata; +	MPT_SCSI_HOST	*hd = shost_priv(host);  	MPT_ADAPTER *ioc = hd->ioc;  	int val = 0; diff --git a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h index 67b088db2f1..d289e97cfe8 100644 --- a/drivers/message/fusion/mptscsih.h +++ b/drivers/message/fusion/mptscsih.h @@ -3,9 +3,9 @@   *      High performance SCSI / Fibre Channel SCSI Host device driver.   *      For use with PCI chip/adapter(s):   *          LSIFC9xx/LSI409xx Fibre Channel - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 1999-2007 LSI Logic Corporation + *  Copyright (c) 1999-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com)   *   */ diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index 8c98420640a..25bcfcf36f2 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c @@ -1,9 +1,9 @@  /*   *  linux/drivers/message/fusion/mptspi.c - *      For use with LSI Logic PCI chip/adapter(s) - *      running LSI Logic Fusion MPT (Message Passing Technology) firmware. + *      For use with LSI PCI chip/adapter(s) + *      running LSI Fusion MPT (Message Passing Technology) firmware.   * - *  Copyright (c) 1999-2007 LSI Logic Corporation + *  Copyright (c) 1999-2007 LSI Corporation   *  (mailto:DL-MPTFusionLinux@lsi.com)   *   */ @@ -90,9 +90,9 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *,  static struct scsi_transport_template *mptspi_transport_template = NULL; -static int	mptspiDoneCtx = -1; -static int	mptspiTaskCtx = -1; -static int	mptspiInternalCtx = -1; /* Used only for internal commands */ +static u8	mptspiDoneCtx = MPT_MAX_PROTOCOL_DRIVERS; +static u8	mptspiTaskCtx = MPT_MAX_PROTOCOL_DRIVERS; +static u8	mptspiInternalCtx = MPT_MAX_PROTOCOL_DRIVERS; /* Used only for internal commands */  /**   * 	mptspi_setTargetNegoParms  - Update the target negotiation parameters @@ -107,7 +107,8 @@ static void  mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,  			    struct scsi_device *sdev)  { -	SpiCfgData *pspi_data = &hd->ioc->spi_data; +	MPT_ADAPTER *ioc = hd->ioc; +	SpiCfgData *pspi_data = &ioc->spi_data;  	int  id = (int) target->id;  	int  nvram;  	u8 width = MPT_NARROW; @@ -138,9 +139,10 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,  				else {  					factor = MPT_ULTRA320;  					if (scsi_device_qas(sdev)) { -						ddvprintk(hd->ioc, -						printk(KERN_DEBUG "Enabling QAS due to " -						"byte56=%02x on id=%d!\n", scsi_device_qas(sdev), id)); +						ddvprintk(ioc, +						printk(MYIOC_s_DEBUG_FMT "Enabling QAS due to " +						"byte56=%02x on id=%d!\n", ioc->name, +						scsi_device_qas(sdev), id));  						noQas = 0;  					}  					if (sdev->type == TYPE_TAPE && @@ -227,8 +229,8 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,  		/* Disable QAS in a mixed configuration case  		 */ -		ddvprintk(hd->ioc, printk(KERN_DEBUG -			"Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id)); +		ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT +			"Disabling QAS due to noQas=%02x on id=%d!\n", ioc->name, noQas, id));  	}  } @@ -302,7 +304,7 @@ mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)  	ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT  		"writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n", -			ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel)); +		ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel));  	mpt_put_msg_frame(ioc->DoneCtx, ioc, mf); @@ -374,14 +376,15 @@ static int  mptspi_is_raid(struct _MPT_SCSI_HOST *hd, u32 id)  {  	int i, rc = 0; +	MPT_ADAPTER *ioc = hd->ioc; -	if (!hd->ioc->raid_data.pIocPg2) +	if (!ioc->raid_data.pIocPg2)  		goto out; -	if (!hd->ioc->raid_data.pIocPg2->NumActiveVolumes) +	if (!ioc->raid_data.pIocPg2->NumActiveVolumes)  		goto out; -	for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++) { -		if (hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id) { +	for (i=0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) { +		if (ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id) {  			rc = 1;  			goto out;  		} @@ -394,17 +397,19 @@ mptspi_is_raid(struct _MPT_SCSI_HOST *hd, u32 id)  static int mptspi_target_alloc(struct scsi_target *starget)  {  	struct Scsi_Host *shost = dev_to_shost(&starget->dev); -	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata; +	struct _MPT_SCSI_HOST *hd = shost_priv(shost);  	VirtTarget		*vtarget; +	MPT_ADAPTER *ioc;  	if (hd == NULL)  		return -ENODEV; +	ioc = hd->ioc;  	vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);  	if (!vtarget)  		return -ENOMEM; -	vtarget->ioc_id = hd->ioc->id; +	vtarget->ioc_id = ioc->id;  	vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;  	vtarget->id = (u8)starget->id;  	vtarget->channel = (u8)starget->channel; @@ -412,34 +417,34 @@ static int mptspi_target_alloc(struct scsi_target *starget)  	starget->hostdata = vtarget;  	if (starget->channel == 1) { -		if (mptscsih_is_phys_disk(hd->ioc, 0, starget->id) == 0) +		if (mptscsih_is_phys_disk(ioc, 0, starget->id) == 0)  			return 0;  		vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;  		/* The real channel for this device is zero */  		vtarget->channel = 0;  		/* The actual physdisknum (for RAID passthrough) */ -		vtarget->id = mptscsih_raid_id_to_num(hd->ioc, 0, +		vtarget->id = mptscsih_raid_id_to_num(ioc, 0,  		    starget->id);  	}  	if (starget->channel == 0 &&  	    mptspi_is_raid(hd, starget->id)) {  		vtarget->raidVolume = 1; -		ddvprintk(hd->ioc, printk(KERN_DEBUG -		    "RAID Volume @ channel=%d id=%d\n", starget->channel, +		ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT +		    "RAID Volume @ channel=%d id=%d\n", ioc->name, starget->channel,  		    starget->id));  	} -	if (hd->ioc->spi_data.nvram && -	    hd->ioc->spi_data.nvram[starget->id] != MPT_HOST_NVRAM_INVALID) { -		u32 nvram = hd->ioc->spi_data.nvram[starget->id]; +	if (ioc->spi_data.nvram && +	    ioc->spi_data.nvram[starget->id] != MPT_HOST_NVRAM_INVALID) { +		u32 nvram = ioc->spi_data.nvram[starget->id];  		spi_min_period(starget) = (nvram & MPT_NVRAM_SYNC_MASK) >> MPT_NVRAM_SYNC_SHIFT;  		spi_max_width(starget) = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;  	} else { -		spi_min_period(starget) = hd->ioc->spi_data.minSyncFactor; -		spi_max_width(starget) = hd->ioc->spi_data.maxBusWidth; +		spi_min_period(starget) = ioc->spi_data.minSyncFactor; +		spi_max_width(starget) = ioc->spi_data.maxBusWidth;  	} -	spi_max_offset(starget) = hd->ioc->spi_data.maxSyncOffset; +	spi_max_offset(starget) = ioc->spi_data.maxSyncOffset;  	spi_offset(starget) = 0;  	mptspi_write_width(starget, 0); @@ -509,10 +514,10 @@ static int mptspi_read_spi_device_pg0(struct scsi_target *starget,  			     struct _CONFIG_PAGE_SCSI_DEVICE_0 *pass_pg0)  {  	struct Scsi_Host *shost = dev_to_shost(&starget->dev); -	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata; +	struct _MPT_SCSI_HOST *hd = shost_priv(shost);  	struct _MPT_ADAPTER *ioc = hd->ioc; -	struct _CONFIG_PAGE_SCSI_DEVICE_0 *pg0; -	dma_addr_t pg0_dma; +	struct _CONFIG_PAGE_SCSI_DEVICE_0 *spi_dev_pg0; +	dma_addr_t spi_dev_pg0_dma;  	int size;  	struct _x_config_parms cfg;  	struct _CONFIG_PAGE_HEADER hdr; @@ -530,9 +535,10 @@ static int mptspi_read_spi_device_pg0(struct scsi_target *starget,  	size += 2048;  	*/ -	pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg0_dma, GFP_KERNEL); -	if (pg0 == NULL) { -		starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n"); +	spi_dev_pg0 = dma_alloc_coherent(&ioc->pcidev->dev, size, &spi_dev_pg0_dma, GFP_KERNEL); +	if (spi_dev_pg0 == NULL) { +		starget_printk(KERN_ERR, starget, MYIOC_s_FMT +		    "dma_alloc_coherent for parameters failed\n", ioc->name);  		return -EINVAL;  	} @@ -546,22 +552,22 @@ static int mptspi_read_spi_device_pg0(struct scsi_target *starget,  	memset(&cfg, 0, sizeof(cfg));  	cfg.cfghdr.hdr = &hdr; -	cfg.physAddr = pg0_dma; +	cfg.physAddr = spi_dev_pg0_dma;  	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;  	cfg.dir = 0;  	cfg.pageAddr = starget->id;  	if (mpt_config(ioc, &cfg)) { -		starget_printk(KERN_ERR, starget, "mpt_config failed\n"); +		starget_printk(KERN_ERR, starget, MYIOC_s_FMT "mpt_config failed\n", ioc->name);  		goto out_free;  	}  	err = 0; -	memcpy(pass_pg0, pg0, size); +	memcpy(pass_pg0, spi_dev_pg0, size); -	mptspi_print_read_nego(hd, starget, le32_to_cpu(pg0->NegotiatedParameters)); +	mptspi_print_read_nego(hd, starget, le32_to_cpu(spi_dev_pg0->NegotiatedParameters));   out_free: -	dma_free_coherent(&ioc->pcidev->dev, size, pg0, pg0_dma); +	dma_free_coherent(&ioc->pcidev->dev, size, spi_dev_pg0, spi_dev_pg0_dma);  	return err;  } @@ -588,11 +594,11 @@ static u32 mptspi_getRP(struct scsi_target *starget)  static void mptspi_read_parameters(struct scsi_target *starget)  {  	int nego; -	struct _CONFIG_PAGE_SCSI_DEVICE_0 pg0; +	struct _CONFIG_PAGE_SCSI_DEVICE_0 spi_dev_pg0; -	mptspi_read_spi_device_pg0(starget, &pg0); +	mptspi_read_spi_device_pg0(starget, &spi_dev_pg0); -	nego = le32_to_cpu(pg0.NegotiatedParameters); +	nego = le32_to_cpu(spi_dev_pg0.NegotiatedParameters);  	spi_iu(starget) = (nego & MPI_SCSIDEVPAGE0_NP_IU) ? 1 : 0;  	spi_dt(starget) = (nego & MPI_SCSIDEVPAGE0_NP_DT) ? 1 : 0; @@ -612,12 +618,13 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)  {  	MpiRaidActionRequest_t	*pReq;  	MPT_FRAME_HDR		*mf; +	MPT_ADAPTER *ioc = hd->ioc;  	/* Get and Populate a free Frame  	 */ -	if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) { -		ddvprintk(hd->ioc, printk(MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n", -					hd->ioc->name)); +	if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) { +		ddvprintk(ioc, printk(MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n", +					ioc->name));  		return -EAGAIN;  	}  	pReq = (MpiRaidActionRequest_t *)mf; @@ -638,8 +645,8 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)  	mpt_add_sge((char *)&pReq->ActionDataSGE,  		MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1); -	ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n", -			hd->ioc->name, pReq->Action, channel, id)); +	ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n", +			ioc->name, pReq->Action, channel, id));  	hd->pLocal = NULL;  	hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */ @@ -651,7 +658,7 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)  	hd->cmdPtr = mf;  	add_timer(&hd->timer); -	mpt_put_msg_frame(hd->ioc->InternalCtx, hd->ioc, mf); +	mpt_put_msg_frame(ioc->InternalCtx, ioc, mf);  	wait_event(hd->scandv_waitq, hd->scandv_wait_done);  	if ((hd->pLocal == NULL) || (hd->pLocal->completion != 0)) @@ -664,6 +671,7 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,  			     struct scsi_device *sdev)  {  	VirtTarget *vtarget = scsi_target(sdev)->hostdata; +	MPT_ADAPTER *ioc = hd->ioc;  	/* no DV on RAID devices */  	if (sdev->channel == 0 && @@ -673,8 +681,8 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,  	/* If this is a piece of a RAID, then quiesce first */  	if (sdev->channel == 1 &&  	    mptscsih_quiesce_raid(hd, 1, vtarget->channel, vtarget->id) < 0) { -		starget_printk(KERN_ERR, scsi_target(sdev), -			       "Integrated RAID quiesce failed\n"); +		starget_printk(KERN_ERR, scsi_target(sdev), MYIOC_s_FMT +		    "Integrated RAID quiesce failed\n", ioc->name);  		return;  	} @@ -684,8 +692,8 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,  	if (sdev->channel == 1 &&  	    mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0) -		starget_printk(KERN_ERR, scsi_target(sdev), -			       "Integrated RAID resume failed\n"); +		starget_printk(KERN_ERR, scsi_target(sdev), MYIOC_s_FMT +		    "Integrated RAID resume failed\n", ioc->name);  	mptspi_read_parameters(sdev->sdev_target);  	spi_display_xfer_agreement(sdev->sdev_target); @@ -694,28 +702,29 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,  static int mptspi_slave_alloc(struct scsi_device *sdev)  { -	MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)sdev->host->hostdata; +	MPT_SCSI_HOST *hd = shost_priv(sdev->host);  	VirtTarget		*vtarget; -	VirtDevice		*vdev; +	VirtDevice		*vdevice;  	struct scsi_target 	*starget; +	MPT_ADAPTER *ioc = hd->ioc;  	if (sdev->channel == 1 && -		mptscsih_is_phys_disk(hd->ioc, 0, sdev->id) == 0) +		mptscsih_is_phys_disk(ioc, 0, sdev->id) == 0)  			return -ENXIO; -	vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL); -	if (!vdev) { +	vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL); +	if (!vdevice) {  		printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n", -				hd->ioc->name, sizeof(VirtDevice)); +				ioc->name, sizeof(VirtDevice));  		return -ENOMEM;  	} -	vdev->lun = sdev->lun; -	sdev->hostdata = vdev; +	vdevice->lun = sdev->lun; +	sdev->hostdata = vdevice;  	starget = scsi_target(sdev);  	vtarget = starget->hostdata; -	vdev->vtarget = vtarget; +	vdevice->vtarget = vtarget;  	vtarget->num_luns++;  	if (sdev->channel == 1) @@ -726,8 +735,7 @@ static int mptspi_slave_alloc(struct scsi_device *sdev)  static int mptspi_slave_configure(struct scsi_device *sdev)  { -	struct _MPT_SCSI_HOST *hd = -		(struct _MPT_SCSI_HOST *)sdev->host->hostdata; +	struct _MPT_SCSI_HOST *hd = shost_priv(sdev->host);  	VirtTarget *vtarget = scsi_target(sdev)->hostdata;  	int ret; @@ -755,24 +763,25 @@ static int mptspi_slave_configure(struct scsi_device *sdev)  static int  mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  { -	struct _MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata; -	VirtDevice	*vdev = SCpnt->device->hostdata; +	struct _MPT_SCSI_HOST *hd = shost_priv(SCpnt->device->host); +	VirtDevice	*vdevice = SCpnt->device->hostdata; +	MPT_ADAPTER *ioc = hd->ioc; -	if (!vdev || !vdev->vtarget) { +	if (!vdevice || !vdevice->vtarget) {  		SCpnt->result = DID_NO_CONNECT << 16;  		done(SCpnt);  		return 0;  	}  	if (SCpnt->device->channel == 1 && -		mptscsih_is_phys_disk(hd->ioc, 0, SCpnt->device->id) == 0) { +		mptscsih_is_phys_disk(ioc, 0, SCpnt->device->id) == 0) {  		SCpnt->result = DID_NO_CONNECT << 16;  		done(SCpnt);  		return 0;  	}  	if (spi_dv_pending(scsi_target(SCpnt->device))) -		ddvprintk(hd->ioc, scsi_print_command(SCpnt)); +		ddvprintk(ioc, scsi_print_command(SCpnt));  	return mptscsih_qcmd(SCpnt,done);  } @@ -829,7 +838,7 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *starget,  			       struct _CONFIG_PAGE_SCSI_DEVICE_1 *pass_pg1)  {  	struct Scsi_Host *shost = dev_to_shost(&starget->dev); -	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata; +	struct _MPT_SCSI_HOST *hd = shost_priv(shost);  	struct _MPT_ADAPTER *ioc = hd->ioc;  	struct _CONFIG_PAGE_SCSI_DEVICE_1 *pg1;  	dma_addr_t pg1_dma; @@ -847,7 +856,8 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *starget,  	pg1 = dma_alloc_coherent(&ioc->pcidev->dev, size, &pg1_dma, GFP_KERNEL);  	if (pg1 == NULL) { -		starget_printk(KERN_ERR, starget, "dma_alloc_coherent for parameters failed\n"); +		starget_printk(KERN_ERR, starget, MYIOC_s_FMT +		    "dma_alloc_coherent for parameters failed\n", ioc->name);  		return -EINVAL;  	} @@ -876,7 +886,8 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *starget,  	mptspi_print_write_nego(hd, starget, le32_to_cpu(pg1->RequestedParameters));  	if (mpt_config(ioc, &cfg)) { -		starget_printk(KERN_ERR, starget, "mpt_config failed\n"); +		starget_printk(KERN_ERR, starget, MYIOC_s_FMT +		    "mpt_config failed\n", ioc->name);  		goto out_free;  	}  	err = 0; @@ -1015,7 +1026,7 @@ static void mptspi_write_qas(struct scsi_target *starget, int qas)  {  	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;  	struct Scsi_Host *shost = dev_to_shost(&starget->dev); -	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata; +	struct _MPT_SCSI_HOST *hd = shost_priv(shost);  	VirtTarget *vtarget = starget->hostdata;  	u32 nego; @@ -1067,15 +1078,16 @@ static void mpt_work_wrapper(struct work_struct *work)  	struct work_queue_wrapper *wqw =  		container_of(work, struct work_queue_wrapper, work);  	struct _MPT_SCSI_HOST *hd = wqw->hd; -	struct Scsi_Host *shost = hd->ioc->sh; +	MPT_ADAPTER *ioc = hd->ioc; +	struct Scsi_Host *shost = ioc->sh;  	struct scsi_device *sdev;  	int disk = wqw->disk;  	struct _CONFIG_PAGE_IOC_3 *pg3;  	kfree(wqw); -	mpt_findImVolumes(hd->ioc); -	pg3 = hd->ioc->raid_data.pIocPg3; +	mpt_findImVolumes(ioc); +	pg3 = ioc->raid_data.pIocPg3;  	if (!pg3)  		return; @@ -1092,24 +1104,25 @@ static void mpt_work_wrapper(struct work_struct *work)  		if(vtarget->id != disk)  			continue; -		starget_printk(KERN_INFO, vtarget->starget, -			       "Integrated RAID requests DV of new device\n"); +		starget_printk(KERN_INFO, vtarget->starget, MYIOC_s_FMT +		    "Integrated RAID requests DV of new device\n", ioc->name);  		mptspi_dv_device(hd, sdev);  	} -	shost_printk(KERN_INFO, shost, -		     "Integrated RAID detects new device %d\n", disk); -	scsi_scan_target(&hd->ioc->sh->shost_gendev, 1, disk, 0, 1); +	shost_printk(KERN_INFO, shost, MYIOC_s_FMT +	    "Integrated RAID detects new device %d\n", ioc->name, disk); +	scsi_scan_target(&ioc->sh->shost_gendev, 1, disk, 0, 1);  }  static void mpt_dv_raid(struct _MPT_SCSI_HOST *hd, int disk)  {  	struct work_queue_wrapper *wqw = kmalloc(sizeof(*wqw), GFP_ATOMIC); +	MPT_ADAPTER *ioc = hd->ioc;  	if (!wqw) { -		shost_printk(KERN_ERR, hd->ioc->sh, -			     "Failed to act on RAID event for physical disk %d\n", -			   disk); +		shost_printk(KERN_ERR, ioc->sh, MYIOC_s_FMT +		    "Failed to act on RAID event for physical disk %d\n", +		    ioc->name, disk);  		return;  	}  	INIT_WORK(&wqw->work, mpt_work_wrapper); @@ -1123,7 +1136,7 @@ static int  mptspi_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)  {  	u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; -	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata; +	struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);  	if (hd && event ==  MPI_EVENT_INTEGRATED_RAID) {  		int reason @@ -1190,6 +1203,8 @@ static struct spi_function_template mptspi_transport_functions = {  static struct pci_device_id mptspi_pci_table[] = {  	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1030,  		PCI_ANY_ID, PCI_ANY_ID }, +	{ PCI_VENDOR_ID_ATTO, MPI_MANUFACTPAGE_DEVID_53C1030, +		PCI_ANY_ID, PCI_ANY_ID },  	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1035,  		PCI_ANY_ID, PCI_ANY_ID },  	{0}	/* Terminating entry */ @@ -1210,11 +1225,12 @@ mptspi_dv_renegotiate_work(struct work_struct *work)  	struct scsi_target *starget;  	struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;  	u32 nego; +	MPT_ADAPTER *ioc = hd->ioc;  	kfree(wqw);  	if (hd->spi_pending) { -		shost_for_each_device(sdev, hd->ioc->sh) { +		shost_for_each_device(sdev, ioc->sh) {  			if  (hd->spi_pending & (1 << sdev->id))  				continue;  			starget = scsi_target(sdev); @@ -1225,7 +1241,7 @@ mptspi_dv_renegotiate_work(struct work_struct *work)  			mptspi_write_spi_device_pg1(starget, &pg1);  		}  	} else { -		shost_for_each_device(sdev, hd->ioc->sh) +		shost_for_each_device(sdev, ioc->sh)  			mptspi_dv_device(hd, sdev);  	}  } @@ -1250,7 +1266,7 @@ mptspi_dv_renegotiate(struct _MPT_SCSI_HOST *hd)  static int  mptspi_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)  { -	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata; +	struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);  	int rc;  	rc = mptscsih_ioc_reset(ioc, reset_phase); @@ -1269,7 +1285,7 @@ static int  mptspi_resume(struct pci_dev *pdev)  {  	MPT_ADAPTER 	*ioc = pci_get_drvdata(pdev); -	struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)ioc->sh->hostdata; +	struct _MPT_SCSI_HOST *hd = shost_priv(ioc->sh);  	int rc;  	rc = mptscsih_resume(pdev); @@ -1416,7 +1432,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	if (numSGE < sh->sg_tablesize) {  		/* Reset this value */ -		dprintk(ioc, printk(MYIOC_s_INFO_FMT +		dprintk(ioc, printk(MYIOC_s_DEBUG_FMT  		  "Resetting sg_tablesize to %d from %d\n",  		  ioc->name, numSGE, sh->sg_tablesize));  		sh->sg_tablesize = numSGE; @@ -1424,20 +1440,21 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	spin_unlock_irqrestore(&ioc->FreeQlock, flags); -	hd = (MPT_SCSI_HOST *) sh->hostdata; +	hd = shost_priv(sh);  	hd->ioc = ioc;  	/* SCSI needs scsi_cmnd lookup table!  	 * (with size equal to req_depth*PtrSz!)  	 */ -	hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC); -	if (!hd->ScsiLookup) { +	ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC); +	if (!ioc->ScsiLookup) {  		error = -ENOMEM;  		goto out_mptspi_probe;  	} +	spin_lock_init(&ioc->scsi_lookup_lock);  	dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", -		 ioc->name, hd->ScsiLookup)); +		 ioc->name, ioc->ScsiLookup));  	/* Clear the TM flags  	 */ @@ -1477,13 +1494,13 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	/* Some versions of the firmware don't support page 0; without  	 * that we can't get the parameters */ -	if (hd->ioc->spi_data.sdp0length != 0) +	if (ioc->spi_data.sdp0length != 0)  		sh->transportt = mptspi_transport_template;  	error = scsi_add_host (sh, &ioc->pcidev->dev);  	if(error) { -		dprintk(ioc, printk(KERN_ERR MYNAM -		  "scsi_add_host failed\n")); +		dprintk(ioc, printk(MYIOC_s_ERR_FMT +		  "scsi_add_host failed\n", ioc->name));  		goto out_mptspi_probe;  	}  |