1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * Copyright (c) 2000 to 2009, LSI Corporation.
29  * All rights reserved.
30  *
31  * Redistribution and use in source and binary forms of all code within
32  * this file that is exclusively owned by LSI, with or without
33  * modification, is permitted provided that, in addition to the CDDL 1.0
34  * License requirements, the following conditions are met:
35  *
36  *    Neither the name of the author nor the names of its contributors may be
37  *    used to endorse or promote products derived from this software without
38  *    specific prior written permission.
39  *
40  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
43  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
44  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
45  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
46  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
47  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
48  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
49  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
50  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
51  * DAMAGE.
52  */
53 
54 #ifndef _SYS_SCSI_ADAPTERS_MPTVAR_H
55 #define	_SYS_SCSI_ADAPTERS_MPTVAR_H
56 
57 #include <sys/byteorder.h>
58 #include <sys/isa_defs.h>
59 #include <sys/sunmdi.h>
60 #include <sys/mdi_impldefs.h>
61 #include <sys/scsi/adapters/mpt_sas/mptsas_ioctl.h>
62 
63 #ifdef	__cplusplus
64 extern "C" {
65 #endif
66 
67 /*
68  * Compile options
69  */
70 #ifdef DEBUG
71 #define	MPTSAS_DEBUG		/* turn on debugging code */
72 #endif	/* DEBUG */
73 
74 #define	MPTSAS_INITIAL_SOFT_SPACE	4
75 
76 #define	MAX_MPI_PORTS		16
77 
78 #define	MPTSAS_MAX_PHYS		8
79 
80 #define	MPTSAS_INVALID_DEVHDL	0xffff
81 
82 /*
83  * MPT HW defines
84  */
85 #define	MPTSAS_MAX_DISKS_IN_CONFIG	14
86 #define	MPTSAS_MAX_DISKS_IN_VOL		10
87 #define	MPTSAS_MAX_HOTSPARES		2
88 #define	MPTSAS_MAX_RAIDVOLS		2
89 #define	MPTSAS_MAX_RAIDCONFIGS		5
90 
91 /*
92  * 64-bit SAS WWN is displayed as 16 characters as HEX characters,
93  * plus one means the end of the string '\0'.
94  */
95 #define	MPTSAS_WWN_STRLEN 16 + 1
96 #define	MPTSAS_MAX_GUID_LEN	64
97 
98 /*
99  * DMA routine flags
100  */
101 #define	MPTSAS_DMA_HANDLE_ALLOCD	0x2
102 #define	MPTSAS_DMA_MEMORY_ALLOCD	0x4
103 #define	MPTSAS_DMA_HANDLE_BOUND	0x8
104 
105 /*
106  * If the HBA supports DMA or bus-mastering, you may have your own
107  * scatter-gather list for physically non-contiguous memory in one
108  * I/O operation; if so, there's probably a size for that list.
109  * It must be placed in the ddi_dma_lim_t structure, so that the system
110  * DMA-support routines can use it to break up the I/O request, so we
111  * define it here.
112  */
113 #if defined(__sparc)
114 #define	MPTSAS_MAX_DMA_SEGS	1
115 #define	MPTSAS_MAX_CMD_SEGS	1
116 #else
117 #define	MPTSAS_MAX_DMA_SEGS	256
118 #define	MPTSAS_MAX_CMD_SEGS	257
119 #endif
120 #define	MPTSAS_MAX_FRAME_SGES(mpt) \
121 	(((mpt->m_req_frame_size - (sizeof (MPI2_SCSI_IO_REQUEST))) / 8) + 1)
122 
123 /*
124  * Caculating how many 64-bit DMA simple elements can be stored in the first
125  * frame. Note that msg_scsi_io_request contains 2 double-words (8 bytes) for
126  * element storage.  And 64-bit dma element is 3 double-words (12 bytes) in
127  * size.
128  */
129 #define	MPTSAS_MAX_FRAME_SGES64(mpt) \
130 	((mpt->m_req_frame_size - \
131 	(sizeof (MPI2_SCSI_IO_REQUEST)) + sizeof (MPI2_SGE_IO_UNION)) / 12)
132 
133 /*
134  * Scatter-gather list structure defined by HBA hardware
135  */
136 typedef	struct NcrTableIndirect {	/* Table Indirect entries */
137 	uint32_t count;		/* 24 bit count */
138 	union {
139 		uint32_t address32;	/* 32 bit address */
140 		struct {
141 			uint32_t Low;
142 			uint32_t High;
143 		} address64;		/* 64 bit address */
144 	} addr;
145 } mptti_t;
146 
147 /*
148  * preferred pkt_private length in 64-bit quantities
149  */
150 #ifdef	_LP64
151 #define	PKT_PRIV_SIZE	2
152 #define	PKT_PRIV_LEN	16	/* in bytes */
153 #else /* _ILP32 */
154 #define	PKT_PRIV_SIZE	1
155 #define	PKT_PRIV_LEN	8	/* in bytes */
156 #endif
157 
158 #define	PKT2CMD(pkt)	((struct mptsas_cmd *)((pkt)->pkt_ha_private))
159 #define	CMD2PKT(cmdp)	((struct scsi_pkt *)((cmdp)->cmd_pkt))
160 #define	EXTCMDS_STATUS_SIZE (sizeof (struct scsi_arq_status))
161 
162 /*
163  * get offset of item in structure
164  */
165 #define	MPTSAS_GET_ITEM_OFF(type, member) ((size_t)(&((type *)0)->member))
166 
167 /*
168  * WWID provided by LSI firmware is generated by firmware but the WWID is not
169  * IEEE NAA standard format, OBP has no chance to distinguish format of unit
170  * address. According LSI's confirmation, the top nibble of RAID WWID is
171  * meanless, so the consensus between Solaris and OBP is to replace top nibble
172  * of WWID provided by LSI to "3" always to hint OBP that this is a RAID WWID
173  * format unit address.
174  */
175 #define	MPTSAS_RAID_WWID(wwid) \
176 	((wwid & 0x0FFFFFFFFFFFFFFF) | 0x3000000000000000)
177 
178 typedef	struct mptsas_target {
179 		uint64_t		m_sas_wwn;	/* hash key1 */
180 		uint8_t			m_phymask;	/* hash key2 */
181 		/*
182 		 * m_dr_flag is a flag for DR, make sure the member
183 		 * take the place of dr_flag of mptsas_hash_data.
184 		 */
185 		uint8_t			m_dr_flag;	/* dr_flag */
186 		uint16_t		m_devhdl;
187 		uint32_t		m_deviceinfo;
188 		uint8_t			m_phynum;
189 		uint32_t		m_dups;
190 		int32_t			m_timeout;
191 		int32_t			m_timebase;
192 		int32_t			m_t_throttle;
193 		int32_t			m_t_ncmds;
194 		int32_t			m_reset_delay;
195 		int32_t			m_t_nwait;
196 
197 		uint16_t		m_qfull_retry_interval;
198 		uint8_t			m_qfull_retries;
199 
200 } mptsas_target_t;
201 
202 typedef struct mptsas_smp {
203 	uint64_t	m_sasaddr;	/* hash key1 */
204 	uint8_t		m_phymask;	/* hash key2 */
205 	uint8_t		reserved1;
206 	uint16_t	m_devhdl;
207 	uint32_t	m_deviceinfo;
208 } mptsas_smp_t;
209 
210 typedef struct mptsas_hash_data {
211 	uint64_t	key1;
212 	uint8_t		key2;
213 	uint8_t		dr_flag;
214 	uint16_t	devhdl;
215 	uint32_t	device_info;
216 } mptsas_hash_data_t;
217 
218 typedef struct mptsas_cache_frames {
219 	ddi_dma_handle_t m_dma_hdl;
220 	ddi_acc_handle_t m_acc_hdl;
221 	caddr_t m_frames_addr;
222 	uint32_t m_phys_addr;
223 } mptsas_cache_frames_t;
224 
225 typedef struct	mptsas_cmd {
226 	uint_t			cmd_flags;	/* flags from scsi_init_pkt */
227 	ddi_dma_handle_t	cmd_dmahandle;	/* dma handle */
228 	ddi_dma_cookie_t	cmd_cookie;
229 	uint_t			cmd_cookiec;
230 	uint_t			cmd_winindex;
231 	uint_t			cmd_nwin;
232 	uint_t			cmd_cur_cookie;
233 	off_t			cmd_dma_offset;
234 	size_t			cmd_dma_len;
235 	uint32_t		cmd_totaldmacount;
236 
237 	ddi_dma_handle_t	cmd_arqhandle;	/* dma arq handle */
238 	ddi_dma_cookie_t	cmd_arqcookie;
239 	struct buf		*cmd_arq_buf;
240 	ddi_dma_handle_t	cmd_ext_arqhandle; /* dma extern arq handle */
241 	ddi_dma_cookie_t	cmd_ext_arqcookie;
242 	struct buf		*cmd_ext_arq_buf;
243 
244 	int			cmd_pkt_flags;
245 
246 	/* timer for command in active slot */
247 	int			cmd_active_timeout;
248 
249 	struct scsi_pkt		*cmd_pkt;
250 	struct scsi_arq_status	cmd_scb;
251 	uchar_t			cmd_cdblen;	/* length of cdb */
252 	uchar_t			cmd_rqslen;	/* len of requested rqsense */
253 	uchar_t			cmd_privlen;
254 	uint_t			cmd_scblen;
255 	uint32_t		cmd_dmacount;
256 	uint64_t		cmd_dma_addr;
257 	uchar_t			cmd_age;
258 	ushort_t		cmd_qfull_retries;
259 	uchar_t			cmd_queued;	/* true if queued */
260 	struct mptsas_cmd	*cmd_linkp;
261 	mptti_t			*cmd_sg; /* Scatter/Gather structure */
262 	uchar_t			cmd_cdb[SCSI_CDB_SIZE];
263 	uint64_t		cmd_pkt_private[PKT_PRIV_LEN];
264 	uint32_t		cmd_slot;
265 	uint32_t		ioc_cmd_slot;
266 
267 	mptsas_cache_frames_t	*cmd_extra_frames;
268 
269 	uint32_t		cmd_rfm;
270 	mptsas_target_t		*cmd_tgt_addr;
271 } mptsas_cmd_t;
272 
273 /*
274  * These are the defined cmd_flags for this structure.
275  */
276 #define	CFLAG_CMDDISC		0x000001 /* cmd currently disconnected */
277 #define	CFLAG_WATCH		0x000002 /* watchdog time for this command */
278 #define	CFLAG_FINISHED		0x000004 /* command completed */
279 #define	CFLAG_CHKSEG		0x000008 /* check cmd_data within seg */
280 #define	CFLAG_COMPLETED		0x000010 /* completion routine called */
281 #define	CFLAG_PREPARED		0x000020 /* pkt has been init'ed */
282 #define	CFLAG_IN_TRANSPORT	0x000040 /* in use by host adapter driver */
283 #define	CFLAG_RESTORE_PTRS	0x000080 /* implicit restore ptr on reconnect */
284 #define	CFLAG_ARQ_IN_PROGRESS	0x000100 /* auto request sense in progress */
285 #define	CFLAG_TRANFLAG		0x0001ff /* covers transport part of flags */
286 #define	CFLAG_TM_CMD		0x000200 /* cmd is a task management command */
287 #define	CFLAG_CMDARQ		0x000400 /* cmd is a 'rqsense' command */
288 #define	CFLAG_DMAVALID		0x000800 /* dma mapping valid */
289 #define	CFLAG_DMASEND		0x001000 /* data is going 'out' */
290 #define	CFLAG_CMDIOPB		0x002000 /* this is an 'iopb' packet */
291 #define	CFLAG_CDBEXTERN		0x004000 /* cdb kmem_alloc'd */
292 #define	CFLAG_SCBEXTERN		0x008000 /* scb kmem_alloc'd */
293 #define	CFLAG_FREE		0x010000 /* packet is on free list */
294 #define	CFLAG_PRIVEXTERN	0x020000 /* target private kmem_alloc'd */
295 #define	CFLAG_DMA_PARTIAL	0x040000 /* partial xfer OK */
296 #define	CFLAG_QFULL_STATUS	0x080000 /* pkt got qfull status */
297 #define	CFLAG_TIMEOUT		0x100000 /* passthru/config command timeout */
298 #define	CFLAG_PMM_RECEIVED	0x200000 /* use cmd_pmm* for saving pointers */
299 #define	CFLAG_RETRY		0x400000 /* cmd has been retried */
300 #define	CFLAG_CMDIOC		0x800000 /* cmd is just for for ioc, no io */
301 #define	CFLAG_EXTARQBUFVALID	0x1000000 /* extern arq buf handle is valid */
302 #define	CFLAG_PASSTHRU		0x2000000 /* cmd is a passthrough command */
303 #define	CFLAG_XARQ		0x4000000 /* cmd requests for extra sense */
304 #define	CFLAG_CMDACK		0x8000000 /* cmd for event ack */
305 #define	CFLAG_TXQ		0x10000000 /* cmd queued in the tx_waitq */
306 #define	CFLAG_FW_CMD		0x20000000 /* cmd is a fw up/down command */
307 #define	CFLAG_CONFIG		0x40000000 /* cmd is for config header/page */
308 
309 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_SIZE			8
310 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_MASK			0xC0
311 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_PERIPHERAL			0x00
312 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_FLAT_SPACE			0x40
313 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT		0x80
314 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_EXTENDED_UNIT		0xC0
315 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_2B		0x00
316 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_4B		0x01
317 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_6B		0x10
318 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_8B		0x20
319 #define	MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_SIZE		0x30
320 
321 #define	MPTSAS_HASH_ARRAY_SIZE	16
322 /*
323  * hash table definition
324  */
325 
326 #define	MPTSAS_HASH_FIRST	0xffff
327 #define	MPTSAS_HASH_NEXT	0x0000
328 
329 /*
330  * passthrough request structure
331  */
332 typedef struct mptsas_pt_request {
333 	uint8_t *request;
334 	uint32_t request_size;
335 	uint32_t data_size;
336 	uint32_t dataout_size;
337 	uint32_t direction;
338 	ddi_dma_cookie_t data_cookie;
339 	ddi_dma_cookie_t dataout_cookie;
340 } mptsas_pt_request_t;
341 
342 /*
343  * config page request structure
344  */
345 typedef struct mptsas_config_request {
346 	uint32_t	page_address;
347 	uint8_t		action;
348 	uint8_t		page_type;
349 	uint8_t		page_number;
350 	uint8_t		page_length;
351 	uint8_t		page_version;
352 	uint8_t		ext_page_type;
353 	uint16_t	ext_page_length;
354 } mptsas_config_request_t;
355 
356 typedef struct mptsas_hash_node {
357 	void *data;
358 	struct mptsas_hash_node *next;
359 } mptsas_hash_node_t;
360 
361 typedef struct mptsas_hash_table {
362 	struct mptsas_hash_node *head[MPTSAS_HASH_ARRAY_SIZE];
363 	/*
364 	 * last position in traverse
365 	 */
366 	struct mptsas_hash_node *cur;
367 	uint16_t line;
368 
369 } mptsas_hash_table_t;
370 
371 /*
372  * RAID volume information
373  */
374 typedef struct mptsas_raidvol {
375 	ushort_t	m_israid;
376 	uint16_t	m_raidhandle;
377 	uint64_t	m_raidwwid;
378 	uint8_t		m_state;
379 	uint32_t	m_statusflags;
380 	uint32_t	m_settings;
381 	uint16_t	m_devhdl[MPTSAS_MAX_DISKS_IN_VOL];
382 	uint8_t		m_disknum[MPTSAS_MAX_DISKS_IN_VOL];
383 	ushort_t	m_diskstatus[MPTSAS_MAX_DISKS_IN_VOL];
384 	uint64_t	m_raidsize;
385 	int		m_raidlevel;
386 	int		m_ndisks;
387 	mptsas_target_t	*m_raidtgt;
388 } mptsas_raidvol_t;
389 
390 /*
391  * RAID configurations
392  */
393 typedef struct mptsas_raidconfig {
394 		mptsas_raidvol_t	m_raidvol[MPTSAS_MAX_RAIDVOLS];
395 		uint16_t		m_physdisk_devhdl[
396 					    MPTSAS_MAX_DISKS_IN_CONFIG];
397 		uint8_t			m_native;
398 } m_raidconfig_t;
399 
400 /*
401  * Structure to hold active outstanding cmds.  Also, keep
402  * timeout on a per target basis.
403  */
404 typedef struct mptsas_slots {
405 	mptsas_hash_table_t	m_tgttbl;
406 	mptsas_hash_table_t	m_smptbl;
407 	m_raidconfig_t		m_raidconfig[MPTSAS_MAX_RAIDCONFIGS];
408 	uint8_t			m_num_raid_configs;
409 	uint16_t		m_tags;
410 	size_t			m_size;
411 	uint16_t		m_n_slots;
412 	mptsas_cmd_t		*m_slot[1];
413 } mptsas_slots_t;
414 
415 /*
416  * Structure to hold command and packets for event ack
417  * and task management commands.
418  */
419 typedef struct  m_event_struct {
420 	struct mptsas_cmd		m_event_cmd;
421 	struct m_event_struct	*m_event_linkp;
422 	/*
423 	 * event member record the failure event and eventcntx
424 	 * event member would be used in send ack pending process
425 	 */
426 	uint32_t		m_event;
427 	uint32_t		m_eventcntx;
428 	uint_t			in_use;
429 	struct scsi_pkt		m_event_pkt;	/* must be last */
430 						/* ... scsi_pkt_size() */
431 } m_event_struct_t;
432 #define	M_EVENT_STRUCT_SIZE	(sizeof (m_event_struct_t) - \
433 				sizeof (struct scsi_pkt) + scsi_pkt_size())
434 
435 #define	MAX_IOC_COMMANDS	8
436 
437 /*
438  * A pool of MAX_IOC_COMMANDS is maintained for event ack commands.
439  * A new event ack command requests mptsas_cmd and scsi_pkt structures
440  * from this pool, and returns it back when done.
441  */
442 
443 typedef struct m_replyh_arg {
444 	void *mpt;
445 	uint32_t rfm;
446 } m_replyh_arg_t;
447 _NOTE(DATA_READABLE_WITHOUT_LOCK(m_replyh_arg_t::mpt))
448 _NOTE(DATA_READABLE_WITHOUT_LOCK(m_replyh_arg_t::rfm))
449 
450 /*
451  * Flags for DR handler topology change
452  */
453 #define	MPTSAS_TOPO_FLAG_DIRECT_ATTACHED_DEVICE		0x0
454 #define	MPTSAS_TOPO_FLAG_EXPANDER_ASSOCIATED		0x1
455 #define	MPTSAS_TOPO_FLAG_LUN_ASSOCIATED			0x2
456 #define	MPTSAS_TOPO_FLAG_RAID_ASSOCIATED		0x4
457 #define	MPTSAS_TOPO_FLAG_RAID_PHYSDRV_ASSOCIATED	0x8
458 #define	MPTSAS_TOPO_FLAG_EXPANDER_ATTACHED_DEVICE	0x10
459 
460 typedef struct mptsas_topo_change_list {
461 	void *mpt;
462 	uint_t  event;
463 	union {
464 		uint8_t physport;
465 		uint8_t phymask;
466 	} un;
467 	uint16_t devhdl;
468 	void *object;
469 	uint8_t flags;
470 	struct mptsas_topo_change_list *next;
471 } mptsas_topo_change_list_t;
472 
473 
474 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas_topo_change_list_t::mpt))
475 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas_topo_change_list_t::event))
476 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas_topo_change_list_t::physport))
477 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas_topo_change_list_t::devhdl))
478 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas_topo_change_list_t::object))
479 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas_topo_change_list_t::flags))
480 
481 /*
482  * Status types when calling mptsas_get_target_device_info
483  */
484 #define	DEV_INFO_SUCCESS		0x0
485 #define	DEV_INFO_FAIL_PAGE0		0x1
486 #define	DEV_INFO_WRONG_DEVICE_TYPE	0x2
487 #define	DEV_INFO_PHYS_DISK		0x3
488 #define	DEV_INFO_FAIL_ALLOC		0x4
489 
490 /*
491  * mpt hotplug event defines
492  */
493 #define	MPTSAS_DR_EVENT_RECONFIG_TARGET	0x01
494 #define	MPTSAS_DR_EVENT_OFFLINE_TARGET	0x02
495 #define	MPTSAS_TOPO_FLAG_REMOVE_HANDLE	0x04
496 
497 /*
498  * SMP target hotplug events
499  */
500 #define	MPTSAS_DR_EVENT_RECONFIG_SMP	0x10
501 #define	MPTSAS_DR_EVENT_OFFLINE_SMP	0x20
502 #define	MPTSAS_DR_EVENT_MASK		0x3F
503 
504 /*
505  * mpt hotplug status definition for m_dr_flag
506  */
507 
508 /*
509  * MPTSAS_DR_INACTIVE
510  *
511  * The target is in a normal operating state.
512  * No dynamic reconfiguration operation is in progress.
513  */
514 #define	MPTSAS_DR_INACTIVE				0x0
515 /*
516  * MPTSAS_DR_INTRANSITION
517  *
518  * The target is in a transition mode since
519  * hotplug event happens and offline procedure has not
520  * been finished
521  */
522 #define	MPTSAS_DR_INTRANSITION			0x1
523 
524 typedef struct mptsas_tgt_private {
525 	int t_lun;
526 	struct mptsas_target *t_private;
527 } mptsas_tgt_private_t;
528 
529 /*
530  * The following defines are used in mptsas_set_init_mode to track the current
531  * state as we progress through reprogramming the HBA from target mode into
532  * initiator mode.
533  */
534 
535 #define	IOUC_READ_PAGE0		0x00000100
536 #define	IOUC_READ_PAGE1		0x00000200
537 #define	IOUC_WRITE_PAGE1	0x00000400
538 #define	IOUC_DONE		0x00000800
539 #define	DISCOVERY_IN_PROGRESS	MPI2_SASIOUNIT0_PORTFLAGS_DISCOVERY_IN_PROGRESS
540 #define	AUTO_PORT_CONFIGURATION	MPI2_SASIOUNIT0_PORTFLAGS_AUTO_PORT_CONFIG
541 
542 /*
543  * Last allocated slot is used for TM requests.  Since only m_max_requests
544  * frames are allocated, the last SMID will be m_max_requests - 1.
545  */
546 #define	MPTSAS_SLOTS_SIZE(mpt) \
547 	(sizeof (struct mptsas_slots) + (sizeof (struct mptsas_cmd *) * \
548 		mpt->m_max_requests))
549 #define	MPTSAS_TM_SLOT(mpt)	(mpt->m_max_requests - 1)
550 
551 /*
552  * Macro for phy_flags
553  */
554 typedef struct mptsas_phy_info {
555 	uint8_t			port_num;
556 	uint8_t			port_flags;
557 	uint16_t		ctrl_devhdl;
558 	uint32_t		phy_device_type;
559 	uint16_t		attached_devhdl;
560 	uint8_t			phy_mask;
561 } mptsas_phy_info_t;
562 
563 typedef struct mptsas_doneq_thread_arg {
564 	void		*mpt;
565 	uint64_t	t;
566 } mptsas_doneq_thread_arg_t;
567 
568 #define	MPTSAS_DONEQ_THREAD_ACTIVE	0x1
569 typedef struct mptsas_doneq_thread_list {
570 	mptsas_cmd_t		*doneq;
571 	mptsas_cmd_t		**donetail;
572 	kthread_t		*threadp;
573 	kcondvar_t		cv;
574 	ushort_t		reserv1;
575 	uint32_t		reserv2;
576 	kmutex_t		mutex;
577 	uint32_t		flag;
578 	uint32_t		len;
579 	mptsas_doneq_thread_arg_t	arg;
580 } mptsas_doneq_thread_list_t;
581 
582 typedef struct mptsas {
583 	int		m_instance;
584 
585 	struct mptsas *m_next;
586 
587 	scsi_hba_tran_t		*m_tran;
588 	sas_hba_tran_t		*m_smptran;
589 	kmutex_t		m_mutex;
590 	kcondvar_t		m_cv;
591 	kcondvar_t		m_passthru_cv;
592 	kcondvar_t		m_fw_cv;
593 	kcondvar_t		m_config_cv;
594 	dev_info_t		*m_dip;
595 
596 	/*
597 	 * soft state flags
598 	 */
599 	uint_t		m_softstate;
600 
601 	struct mptsas_slots *m_active;	/* outstanding cmds */
602 
603 	mptsas_cmd_t	*m_waitq;	/* cmd queue for active request */
604 	mptsas_cmd_t	**m_waitqtail;	/* wait queue tail ptr */
605 
606 	kmutex_t	m_tx_waitq_mutex;
607 	mptsas_cmd_t	*m_tx_waitq;	/* TX cmd queue for active request */
608 	mptsas_cmd_t	**m_tx_waitqtail;	/* tx_wait queue tail ptr */
609 	int		m_tx_draining;	/* TX queue draining flag */
610 
611 	mptsas_cmd_t	*m_doneq;	/* queue of completed commands */
612 	mptsas_cmd_t	**m_donetail;	/* queue tail ptr */
613 
614 	/*
615 	 * variables for helper threads (fan-out interrupts)
616 	 */
617 	mptsas_doneq_thread_list_t	*m_doneq_thread_id;
618 	uint32_t		m_doneq_thread_n;
619 	uint32_t		m_doneq_thread_threshold;
620 	uint32_t		m_doneq_length_threshold;
621 	uint32_t		m_doneq_len;
622 	kcondvar_t		m_doneq_thread_cv;
623 	kmutex_t		m_doneq_mutex;
624 
625 	int		m_ncmds;	/* number of outstanding commands */
626 	m_event_struct_t *m_ioc_event_cmdq;	/* cmd queue for ioc event */
627 	m_event_struct_t **m_ioc_event_cmdtail;	/* ioc cmd queue tail */
628 
629 	ddi_acc_handle_t m_datap;	/* operating regs data access handle */
630 
631 	struct _MPI2_SYSTEM_INTERFACE_REGS	*m_reg;
632 
633 	ushort_t	m_devid;	/* device id of chip. */
634 	uchar_t		m_revid;	/* revision of chip. */
635 	uint16_t	m_svid;		/* subsystem Vendor ID of chip */
636 	uint16_t	m_ssid;		/* subsystem Device ID of chip */
637 
638 	uchar_t		m_sync_offset;	/* default offset for this chip. */
639 
640 	timeout_id_t	m_quiesce_timeid;
641 	timeout_id_t	m_pm_timeid;
642 
643 	ddi_dma_handle_t m_dma_req_frame_hdl;
644 	ddi_acc_handle_t m_acc_req_frame_hdl;
645 	ddi_dma_handle_t m_dma_reply_frame_hdl;
646 	ddi_acc_handle_t m_acc_reply_frame_hdl;
647 	ddi_dma_handle_t m_dma_free_queue_hdl;
648 	ddi_acc_handle_t m_acc_free_queue_hdl;
649 	ddi_dma_handle_t m_dma_post_queue_hdl;
650 	ddi_acc_handle_t m_acc_post_queue_hdl;
651 
652 	/*
653 	 * list of reset notification requests
654 	 */
655 	struct scsi_reset_notify_entry	*m_reset_notify_listf;
656 
657 	/*
658 	 * qfull handling
659 	 */
660 	timeout_id_t	m_restart_cmd_timeid;
661 
662 	/*
663 	 * scsi	reset delay per	bus
664 	 */
665 	uint_t		m_scsi_reset_delay;
666 
667 	int		m_pm_idle_delay;
668 
669 	uchar_t		m_polled_intr;	/* intr was polled. */
670 	uchar_t		m_suspended;	/* true	if driver is suspended */
671 
672 	struct kmem_cache *m_kmem_cache;
673 	struct kmem_cache *m_cache_frames;
674 
675 	/*
676 	 * hba options.
677 	 */
678 	uint_t		m_options;
679 
680 	int		m_in_callback;
681 
682 	int		m_power_level;	/* current power level */
683 
684 	int		m_busy;		/* power management busy state */
685 
686 	off_t		m_pmcsr_offset; /* PMCSR offset */
687 
688 	ddi_acc_handle_t m_config_handle;
689 
690 	ddi_dma_attr_t		m_io_dma_attr;	/* Used for data I/O */
691 	ddi_dma_attr_t		m_msg_dma_attr; /* Used for message frames */
692 	ddi_device_acc_attr_t	m_dev_acc_attr;
693 
694 	/*
695 	 * request/reply variables
696 	 */
697 	caddr_t		m_req_frame;
698 	uint64_t	m_req_frame_dma_addr;
699 	caddr_t		m_reply_frame;
700 	uint64_t	m_reply_frame_dma_addr;
701 	caddr_t		m_free_queue;
702 	uint64_t	m_free_queue_dma_addr;
703 	caddr_t		m_post_queue;
704 	uint64_t	m_post_queue_dma_addr;
705 
706 	m_replyh_arg_t *m_replyh_args;
707 
708 	uint16_t	m_max_requests;
709 	uint16_t	m_req_frame_size;
710 
711 	/*
712 	 * Max frames per request reprted in IOC Facts
713 	 */
714 	uint8_t		m_max_chain_depth;
715 	/*
716 	 * Max frames per request which is used in reality. It's adjusted
717 	 * according DMA SG length attribute, and shall not exceed the
718 	 * m_max_chain_depth.
719 	 */
720 	uint8_t		m_max_request_frames;
721 
722 	uint16_t	m_free_queue_depth;
723 	uint16_t	m_post_queue_depth;
724 	uint16_t	m_max_replies;
725 	uint32_t	m_free_index;
726 	uint32_t	m_post_index;
727 	uint8_t		m_reply_frame_size;
728 	uint32_t	m_ioc_capabilities;
729 
730 	/*
731 	 * indicates if the firmware was upload by the driver
732 	 * at boot time
733 	 */
734 	ushort_t	m_fwupload;
735 
736 	uint16_t	m_productid;
737 
738 	/*
739 	 * per instance data structures for dma memory resources for
740 	 * MPI handshake protocol. only one handshake cmd can run at a time.
741 	 */
742 	ddi_dma_handle_t	m_hshk_dma_hdl;
743 
744 	ddi_acc_handle_t	m_hshk_acc_hdl;
745 
746 	caddr_t			m_hshk_memp;
747 
748 	size_t			m_hshk_dma_size;
749 
750 	/* Firmware version on the card at boot time */
751 	uint32_t		m_fwversion;
752 
753 	/* MSI specific fields */
754 	ddi_intr_handle_t	*m_htable;	/* For array of interrupts */
755 	int			m_intr_type;	/* What type of interrupt */
756 	int			m_intr_cnt;	/* # of intrs count returned */
757 	size_t			m_intr_size;    /* Size of intr array */
758 	uint_t			m_intr_pri;	/* Interrupt priority   */
759 	int			m_intr_cap;	/* Interrupt capabilities */
760 	ddi_taskq_t		*m_event_taskq;
761 
762 	/* SAS specific information */
763 
764 	union {
765 		uint64_t	m_base_wwid;	/* Base WWID */
766 		struct {
767 #ifdef _BIG_ENDIAN
768 			uint32_t	m_base_wwid_hi;
769 			uint32_t	m_base_wwid_lo;
770 #else
771 			uint32_t	m_base_wwid_lo;
772 			uint32_t	m_base_wwid_hi;
773 #endif
774 		} sasaddr;
775 	} un;
776 
777 	uint8_t			m_num_phys;		/* # of PHYs */
778 	mptsas_phy_info_t	m_phy_info[MPTSAS_MAX_PHYS];
779 	uint8_t			m_port_chng;	/* initiator port changes */
780 
781 	/* FMA Capabilities */
782 	int			m_fm_capabilities;
783 	ddi_taskq_t		*m_dr_taskq;
784 	int			m_mpxio_enable;
785 	uint8_t			m_done_traverse_dev;
786 	uint8_t			m_done_traverse_smp;
787 	int			m_passthru_in_progress;
788 	uint16_t		m_dev_handle;
789 	uint16_t		m_smp_devhdl;
790 
791 	/*
792 	 * Event recording
793 	 */
794 	uint8_t			m_event_index;
795 	uint32_t		m_event_number;
796 	uint32_t		m_event_mask[4];
797 	mptsas_event_entry_t	m_events[MPTSAS_EVENT_QUEUE_SIZE];
798 
799 	/*
800 	 * per instance cmd data structures for task management cmds
801 	 */
802 	m_event_struct_t	m_event_task_mgmt;	/* must be last */
803 							/* ... scsi_pkt_size */
804 } mptsas_t;
805 #define	MPTSAS_SIZE	(sizeof (struct mptsas) - \
806 			sizeof (struct scsi_pkt) + scsi_pkt_size())
807 /*
808  * Only one of below two conditions is satisfied, we
809  * think the target is associated to the iport and
810  * allow call into mptsas_probe_lun().
811  * 1. physicalsport == physport
812  * 2. (phymask & (1 << physport)) == 0
813  * The condition #2 is because LSI uses lowest PHY
814  * number as the value of physical port when auto port
815  * configuration.
816  */
817 #define	IS_SAME_PORT(physicalport, physport, phymask, dynamicport) \
818 	((physicalport == physport) || (dynamicport && (phymask & \
819 	(1 << physport))))
820 
821 _NOTE(MUTEX_PROTECTS_DATA(mptsas::m_mutex, mptsas))
822 _NOTE(SCHEME_PROTECTS_DATA("safe sharing", mptsas::m_next))
823 _NOTE(SCHEME_PROTECTS_DATA("stable data", mptsas::m_dip mptsas::m_tran))
824 _NOTE(SCHEME_PROTECTS_DATA("stable data", mptsas::m_kmem_cache))
825 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_io_dma_attr.dma_attr_sgllen))
826 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_devid))
827 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_productid))
828 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_port_type))
829 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_mpxio_enable))
830 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_ntargets))
831 _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_instance))
832 
833 typedef struct mptsas_dma_alloc_state
834 {
835 	ddi_dma_handle_t	handle;
836 	caddr_t			memp;
837 	size_t			size;
838 	ddi_acc_handle_t	accessp;
839 	ddi_dma_cookie_t	cookie;
840 } mptsas_dma_alloc_state_t;
841 
842 /*
843  * These should eventually migrate into the mpt header files
844  * that may become the /kernel/misc/mpt module...
845  */
846 #define	mptsas_init_std_hdr(hdl, mp, DevHandle, Lun, ChainOffset, Function) \
847 	mptsas_put_msg_DevHandle(hdl, mp, DevHandle); \
848 	mptsas_put_msg_ChainOffset(hdl, mp, ChainOffset); \
849 	mptsas_put_msg_Function(hdl, mp, Function); \
850 	mptsas_put_msg_Lun(hdl, mp, Lun)
851 
852 #define	mptsas_put_msg_DevHandle(hdl, mp, val) \
853 	ddi_put16(hdl, &(mp)->DevHandle, (val))
854 #define	mptsas_put_msg_ChainOffset(hdl, mp, val) \
855 	ddi_put8(hdl, &(mp)->ChainOffset, (val))
856 #define	mptsas_put_msg_Function(hdl, mp, val) \
857 	ddi_put8(hdl, &(mp)->Function, (val))
858 #define	mptsas_put_msg_Lun(hdl, mp, val) \
859 	ddi_put8(hdl, &(mp)->LUN[1], (val))
860 
861 #define	mptsas_get_msg_Function(hdl, mp) \
862 	ddi_get8(hdl, &(mp)->Function)
863 
864 #define	mptsas_get_msg_MsgFlags(hdl, mp) \
865 	ddi_get8(hdl, &(mp)->MsgFlags)
866 
867 #define	MPTSAS_ENABLE_DRWE(hdl) \
868 	ddi_put32(hdl->m_datap, &hdl->m_reg->WriteSequence, \
869 		MPI2_WRSEQ_FLUSH_KEY_VALUE); \
870 	ddi_put32(hdl->m_datap, &hdl->m_reg->WriteSequence, \
871 		MPI2_WRSEQ_1ST_KEY_VALUE); \
872 	ddi_put32(hdl->m_datap, &hdl->m_reg->WriteSequence, \
873 		MPI2_WRSEQ_2ND_KEY_VALUE); \
874 	ddi_put32(hdl->m_datap, &hdl->m_reg->WriteSequence, \
875 		MPI2_WRSEQ_3RD_KEY_VALUE); \
876 	ddi_put32(hdl->m_datap, &hdl->m_reg->WriteSequence, \
877 		MPI2_WRSEQ_4TH_KEY_VALUE); \
878 	ddi_put32(hdl->m_datap, &hdl->m_reg->WriteSequence, \
879 		MPI2_WRSEQ_5TH_KEY_VALUE); \
880 	ddi_put32(hdl->m_datap, &hdl->m_reg->WriteSequence, \
881 		MPI2_WRSEQ_6TH_KEY_VALUE);
882 
883 /*
884  * m_options flags
885  */
886 #define	MPTSAS_OPT_PM		0x01	/* Power Management */
887 
888 /*
889  * m_softstate flags
890  */
891 #define	MPTSAS_SS_DRAINING		0x02
892 #define	MPTSAS_SS_QUIESCED		0x04
893 #define	MPTSAS_SS_MSG_UNIT_RESET	0x08
894 
895 /*
896  * regspec defines.
897  */
898 #define	CONFIG_SPACE	0	/* regset[0] - configuration space */
899 #define	IO_SPACE	1	/* regset[1] - used for i/o mapped device */
900 #define	MEM_SPACE	2	/* regset[2] - used for memory mapped device */
901 #define	BASE_REG2	3	/* regset[3] - used for 875 scripts ram */
902 
903 /*
904  * Handy constants
905  */
906 #define	FALSE		0
907 #define	TRUE		1
908 #define	UNDEFINED	-1
909 #define	FAILED		-2
910 
911 /*
912  * power management.
913  */
914 #define	MPTSAS_POWER_ON(mpt) { \
915 	pci_config_put16(mpt->m_config_handle, mpt->m_pmcsr_offset, \
916 	    PCI_PMCSR_D0); \
917 	delay(drv_usectohz(10000)); \
918 	(void) pci_restore_config_regs(mpt->m_dip); \
919 	mptsas_setup_cmd_reg(mpt); \
920 }
921 
922 #define	MPTSAS_POWER_OFF(mpt) { \
923 	(void) pci_save_config_regs(mpt->m_dip); \
924 	pci_config_put16(mpt->m_config_handle, mpt->m_pmcsr_offset, \
925 	    PCI_PMCSR_D3HOT); \
926 	mpt->m_power_level = PM_LEVEL_D3; \
927 }
928 
929 /*
930  * inq_dtype:
931  * Bits 5 through 7 are the Peripheral Device Qualifier
932  * 001b: device not connected to the LUN
933  * Bits 0 through 4 are the Peripheral Device Type
934  * 1fh: Unknown or no device type
935  *
936  * Although the inquiry may return success, the following value
937  * means no valid LUN connected.
938  */
939 #define	MPTSAS_VALID_LUN(sd_inq) \
940 	(((sd_inq->inq_dtype & 0xe0) != 0x20) && \
941 	((sd_inq->inq_dtype & 0x1f) != 0x1f))
942 
943 /*
944  * Default is to have 10 retries on receiving QFULL status and
945  * each retry to be after 100 ms.
946  */
947 #define	QFULL_RETRIES		10
948 #define	QFULL_RETRY_INTERVAL	100
949 
950 /*
951  * Handy macros
952  */
953 #define	Tgt(sp)	((sp)->cmd_pkt->pkt_address.a_target)
954 #define	Lun(sp)	((sp)->cmd_pkt->pkt_address.a_lun)
955 
956 #define	IS_HEX_DIGIT(n)	(((n) >= '0' && (n) <= '9') || \
957 	((n) >= 'a' && (n) <= 'f') || ((n) >= 'A' && (n) <= 'F'))
958 
959 /*
960  * poll time for mptsas_pollret() and mptsas_wait_intr()
961  */
962 #define	MPTSAS_POLL_TIME	30000	/* 30 seconds */
963 
964 /*
965  * default time for mptsas_do_passthru
966  */
967 #define	MPTSAS_PASS_THRU_TIME_DEFAULT	60	/* 60 seconds */
968 
969 /*
970  * macro for getting value in micro-seconds since last boot to be used as
971  * timeout in cv_timedwait call.
972  */
973 #define	MPTSAS_CV_TIMEOUT(timeout)  (ddi_get_lbolt() + \
974     drv_usectohz(timeout * MICROSEC))
975 
976 /*
977  * macro to return the effective address of a given per-target field
978  */
979 #define	EFF_ADDR(start, offset)		((start) + (offset))
980 
981 #define	SDEV2ADDR(devp)		(&((devp)->sd_address))
982 #define	SDEV2TRAN(devp)		((devp)->sd_address.a_hba_tran)
983 #define	PKT2TRAN(pkt)		((pkt)->pkt_address.a_hba_tran)
984 #define	ADDR2TRAN(ap)		((ap)->a_hba_tran)
985 #define	DIP2TRAN(dip)		(ddi_get_driver_private(dip))
986 
987 
988 #define	TRAN2MPT(hba)		((mptsas_t *)(hba)->tran_hba_private)
989 #define	DIP2MPT(dip)		(TRAN2MPT((scsi_hba_tran_t *)DIP2TRAN(dip)))
990 #define	SDEV2MPT(sd)		(TRAN2MPT(SDEV2TRAN(sd)))
991 #define	PKT2MPT(pkt)		(TRAN2MPT(PKT2TRAN(pkt)))
992 
993 #define	ADDR2MPT(ap)		(TRAN2MPT(ADDR2TRAN(ap)))
994 
995 #define	POLL_TIMEOUT		(2 * SCSI_POLL_TIMEOUT * 1000000)
996 #define	SHORT_POLL_TIMEOUT	(1000000)	/* in usec, about 1 secs */
997 #define	MPTSAS_QUIESCE_TIMEOUT	1		/* 1 sec */
998 #define	MPTSAS_PM_IDLE_TIMEOUT	60		/* 60 seconds */
999 
1000 #define	MPTSAS_GET_ISTAT(mpt)  (ddi_get32((mpt)->m_datap, \
1001 			&(mpt)->m_reg->HostInterruptStatus))
1002 
1003 #define	MPTSAS_SET_SIGP(P) \
1004 		ClrSetBits(mpt->m_devaddr + NREG_ISTAT, 0, NB_ISTAT_SIGP)
1005 
1006 #define	MPTSAS_RESET_SIGP(P) (void) ddi_get8(mpt->m_datap, \
1007 			(uint8_t *)(mpt->m_devaddr + NREG_CTEST2))
1008 
1009 #define	MPTSAS_GET_INTCODE(P) (ddi_get32(mpt->m_datap, \
1010 			(uint32_t *)(mpt->m_devaddr + NREG_DSPS)))
1011 
1012 
1013 #define	MPTSAS_START_CMD(mpt, req_desc_lo, req_desc_hi) \
1014 	ddi_put32(mpt->m_datap, &mpt->m_reg->RequestDescriptorPostLow,\
1015 	    req_desc_lo);\
1016 	ddi_put32(mpt->m_datap, &mpt->m_reg->RequestDescriptorPostHigh,\
1017 	    req_desc_hi);
1018 
1019 #define	INTPENDING(mpt) \
1020 	(MPTSAS_GET_ISTAT(mpt) & MPI2_HIS_REPLY_DESCRIPTOR_INTERRUPT)
1021 
1022 /*
1023  * Mask all interrupts to disable
1024  */
1025 #define	MPTSAS_DISABLE_INTR(mpt)	\
1026 	ddi_put32((mpt)->m_datap, &(mpt)->m_reg->HostInterruptMask, \
1027 	    (MPI2_HIM_RIM | MPI2_HIM_DIM | MPI2_HIM_RESET_IRQ_MASK))
1028 
1029 /*
1030  * Mask Doorbell and Reset interrupts to enable reply desc int.
1031  */
1032 #define	MPTSAS_ENABLE_INTR(mpt)	\
1033 	ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptMask, \
1034 	(MPI2_HIM_DIM | MPI2_HIM_RESET_IRQ_MASK))
1035 
1036 #define	MPTSAS_GET_NEXT_REPLY(mpt, index)  \
1037 	&((uint64_t *)(void *)mpt->m_post_queue)[index]
1038 
1039 #define	MPTSAS_GET_NEXT_FRAME(mpt, SMID) \
1040 	(mpt->m_req_frame + (mpt->m_req_frame_size * SMID))
1041 
1042 #define	ClrSetBits32(hdl, reg, clr, set) \
1043 	ddi_put32(hdl, (reg), \
1044 	    ((ddi_get32(mpt->m_datap, (reg)) & ~(clr)) | (set)))
1045 
1046 #define	ClrSetBits(reg, clr, set) \
1047 	ddi_put8(mpt->m_datap, (uint8_t *)(reg), \
1048 		((ddi_get8(mpt->m_datap, (uint8_t *)(reg)) & ~(clr)) | (set)))
1049 
1050 #define	MPTSAS_WAITQ_RM(mpt, cmdp)	\
1051 	if ((cmdp = mpt->m_waitq) != NULL) { \
1052 		/* If the queue is now empty fix the tail pointer */	\
1053 		if ((mpt->m_waitq = cmdp->cmd_linkp) == NULL) \
1054 			mpt->m_waitqtail = &mpt->m_waitq; \
1055 		cmdp->cmd_linkp = NULL; \
1056 		cmdp->cmd_queued = FALSE; \
1057 	}
1058 
1059 #define	MPTSAS_TX_WAITQ_RM(mpt, cmdp)	\
1060 	if ((cmdp = mpt->m_tx_waitq) != NULL) { \
1061 		/* If the queue is now empty fix the tail pointer */	\
1062 		if ((mpt->m_tx_waitq = cmdp->cmd_linkp) == NULL) \
1063 			mpt->m_tx_waitqtail = &mpt->m_tx_waitq; \
1064 		cmdp->cmd_linkp = NULL; \
1065 		cmdp->cmd_queued = FALSE; \
1066 	}
1067 
1068 /*
1069  * defaults for	the global properties
1070  */
1071 #define	DEFAULT_SCSI_OPTIONS	SCSI_OPTIONS_DR
1072 #define	DEFAULT_TAG_AGE_LIMIT	2
1073 #define	DEFAULT_WD_TICK		10
1074 
1075 /*
1076  * invalid hostid.
1077  */
1078 #define	MPTSAS_INVALID_HOSTID  -1
1079 
1080 /*
1081  * Get/Set hostid from SCSI port configuration page
1082  */
1083 #define	MPTSAS_GET_HOST_ID(configuration) (configuration & 0xFF)
1084 #define	MPTSAS_SET_HOST_ID(hostid) (hostid | ((1 << hostid) << 16))
1085 
1086 /*
1087  * Config space.
1088  */
1089 #define	MPTSAS_LATENCY_TIMER	0x40
1090 
1091 /*
1092  * Offset to firmware version
1093  */
1094 #define	MPTSAS_FW_VERSION_OFFSET	9
1095 
1096 /*
1097  * Offset and masks to get at the ProductId field
1098  */
1099 #define	MPTSAS_FW_PRODUCTID_OFFSET	8
1100 #define	MPTSAS_FW_PRODUCTID_MASK	0xFFFF0000
1101 #define	MPTSAS_FW_PRODUCTID_SHIFT	16
1102 
1103 /*
1104  * Subsystem ID for HBAs.
1105  */
1106 #define	MPTSAS_HBA_SUBSYSTEM_ID    0x10C0
1107 #define	MPTSAS_RHEA_SUBSYSTEM_ID	0x10B0
1108 
1109 /*
1110  * reset delay tick
1111  */
1112 #define	MPTSAS_WATCH_RESET_DELAY_TICK 50	/* specified in milli seconds */
1113 
1114 /*
1115  * Ioc reset return values
1116  */
1117 #define	MPTSAS_RESET_FAIL	-1
1118 #define	MPTSAS_NO_RESET		0
1119 #define	MPTSAS_SUCCESS_HARDRESET	1
1120 
1121 /*
1122  * throttle support.
1123  */
1124 #define	MAX_THROTTLE	32
1125 #define	HOLD_THROTTLE	0
1126 #define	DRAIN_THROTTLE	-1
1127 #define	QFULL_THROTTLE	-2
1128 
1129 /*
1130  * Passthrough/config request flags
1131  */
1132 #define	MPTSAS_DATA_ALLOCATED		0x0001
1133 #define	MPTSAS_DATAOUT_ALLOCATED	0x0002
1134 #define	MPTSAS_REQUEST_POOL_CMD		0x0004
1135 #define	MPTSAS_ADDRESS_REPLY		0x0008
1136 #define	MPTSAS_CMD_TIMEOUT		0x0010
1137 
1138 /*
1139  * response code tlr flag
1140  */
1141 #define	MPTSAS_SCSI_RESPONSE_CODE_TLR_OFF	0x02
1142 
1143 /*
1144  * System Events
1145  */
1146 #ifndef	DDI_VENDOR_LSI
1147 #define	DDI_VENDOR_LSI	"LSI"
1148 #endif	/* DDI_VENDOR_LSI */
1149 
1150 /*
1151  * Shared functions
1152  */
1153 int mptsas_save_cmd(struct mptsas *mpt, struct mptsas_cmd *cmd);
1154 void mptsas_remove_cmd(mptsas_t *mpt, mptsas_cmd_t *cmd);
1155 void mptsas_waitq_add(mptsas_t *mpt, mptsas_cmd_t *cmd);
1156 int mptsas_config_space_init(struct mptsas *mpt);
1157 int mptsas_init_chip(mptsas_t *mpt, int first_time);
1158 void mptsas_log(struct mptsas *mpt, int level, char *fmt, ...);
1159 int mptsas_poll(mptsas_t *mpt, mptsas_cmd_t *poll_cmd, int polltime);
1160 int mptsas_do_dma(mptsas_t *mpt, uint32_t size, int var, int (*callback)());
1161 int mptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action,
1162 	uint8_t pagetype, uint32_t pageaddress, uint8_t pagenumber,
1163 	uint8_t pageversion, uint8_t pagelength, uint32_t
1164 	SGEflagslength, uint32_t SGEaddress32);
1165 int mptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action,
1166 	uint8_t extpagetype, uint32_t pageaddress, uint8_t pagenumber,
1167 	uint8_t pageversion, uint16_t extpagelength,
1168 	uint32_t SGEflagslength, uint32_t SGEaddress32);
1169 int mptsas_update_flash(mptsas_t *mpt, caddr_t ptrbuffer, uint32_t size,
1170 	uint8_t type, int mode);
1171 int mptsas_check_flash(mptsas_t *mpt, caddr_t origfile, uint32_t size,
1172 	uint8_t type, int mode);
1173 int mptsas_download_firmware();
1174 int mptsas_can_download_firmware();
1175 int mptsas_passthru_dma_alloc(mptsas_t *mpt,
1176     mptsas_dma_alloc_state_t *dma_statep);
1177 void mptsas_passthru_dma_free(mptsas_dma_alloc_state_t *dma_statep);
1178 uint8_t mptsas_physport_to_phymask(mptsas_t *mpt, uint8_t physport);
1179 uint8_t mptsas_phymask_to_physport(mptsas_t *mpt, uint8_t phymask);
1180 void mptsas_fma_check(mptsas_t *mpt, mptsas_cmd_t *cmd);
1181 int mptsas_check_acc_handle(ddi_acc_handle_t handle);
1182 int mptsas_check_dma_handle(ddi_dma_handle_t handle);
1183 void mptsas_fm_ereport(mptsas_t *mpt, char *detail);
1184 
1185 /*
1186  * impl functions
1187  */
1188 int mptsas_ioc_wait_for_response(mptsas_t *mpt);
1189 int mptsas_ioc_wait_for_doorbell(mptsas_t *mpt);
1190 int mptsas_ioc_reset(mptsas_t *mpt);
1191 int mptsas_send_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes,
1192     ddi_acc_handle_t accessp);
1193 int mptsas_get_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes,
1194     ddi_acc_handle_t accessp);
1195 int mptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action,
1196     uint8_t pagetype, uint32_t pageaddress, uint8_t pagenumber,
1197     uint8_t pageversion, uint8_t pagelength, uint32_t SGEflagslength,
1198     uint32_t SGEaddress32);
1199 int mptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action,
1200     uint8_t extpagetype, uint32_t pageaddress, uint8_t pagenumber,
1201     uint8_t pageversion, uint16_t extpagelength,
1202     uint32_t SGEflagslength, uint32_t SGEaddress32);
1203 
1204 int mptsas_request_from_pool(mptsas_t *mpt, mptsas_cmd_t **cmd,
1205     struct scsi_pkt **pkt);
1206 void mptsas_return_to_pool(mptsas_t *mpt, mptsas_cmd_t *cmd);
1207 void mptsas_destroy_ioc_event_cmd(mptsas_t *mpt);
1208 void mptsas_start_config_page_access(mptsas_t *mpt, mptsas_cmd_t *cmd);
1209 int mptsas_access_config_page(mptsas_t *mpt, uint8_t action, uint8_t page_type,
1210     uint8_t page_number, uint32_t page_address, int (*callback) (mptsas_t *,
1211     caddr_t, ddi_acc_handle_t, uint16_t, uint32_t, va_list), ...);
1212 
1213 int mptsas_ioc_task_management(mptsas_t *mpt, int task_type,
1214     uint16_t dev_handle, int lun);
1215 int mptsas_send_event_ack(mptsas_t *mpt, uint32_t event, uint32_t eventcntx);
1216 void mptsas_send_pending_event_ack(mptsas_t *mpt);
1217 void mptsas_set_throttle(struct mptsas *mpt, mptsas_target_t *ptgt, int what);
1218 int mptsas_restart_ioc(mptsas_t *mpt);
1219 void mptsas_update_driver_data(struct mptsas *mpt);
1220 uint64_t mptsas_get_sata_guid(mptsas_t *mpt, mptsas_target_t *ptgt, int lun);
1221 
1222 /*
1223  * init functions
1224  */
1225 int mptsas_ioc_get_facts(mptsas_t *mpt);
1226 int mptsas_ioc_get_port_facts(mptsas_t *mpt, int port);
1227 int mptsas_ioc_enable_port(mptsas_t *mpt);
1228 int mptsas_ioc_enable_event_notification(mptsas_t *mpt);
1229 int mptsas_ioc_init(mptsas_t *mpt);
1230 
1231 /*
1232  * configuration pages operation
1233  */
1234 int mptsas_get_sas_device_page0(mptsas_t *mpt, uint32_t page_address,
1235     uint16_t *dev_handle, uint64_t *sas_wwn, uint32_t *dev_info,
1236     uint8_t *physport, uint8_t *phynum);
1237 int mptsas_get_sas_io_unit_page(mptsas_t *mpt);
1238 int mptsas_get_sas_io_unit_page_hndshk(mptsas_t *mpt);
1239 int mptsas_get_sas_expander_page0(mptsas_t *mpt, uint32_t page_address,
1240     mptsas_smp_t *info);
1241 int mptsas_set_initiator_mode(mptsas_t *mpt);
1242 int mptsas_set_ioc_params(mptsas_t *mpt);
1243 int mptsas_get_manufacture_page5(mptsas_t *mpt);
1244 int mptsas_get_sas_port_page0(mptsas_t *mpt, uint32_t page_address,
1245     uint64_t *sas_wwn, uint8_t *portwidth);
1246 int mptsas_get_bios_page3(mptsas_t *mpt,  uint32_t *bios_version);
1247 
1248 /*
1249  * RAID functions
1250  */
1251 int mptsas_get_raid_settings(mptsas_t *mpt, mptsas_raidvol_t *raidvol);
1252 int mptsas_get_raid_info(mptsas_t *mpt);
1253 int mptsas_get_physdisk_settings(mptsas_t *mpt, mptsas_raidvol_t *raidvol,
1254     uint8_t physdisknum);
1255 int mptsas_delete_volume(mptsas_t *mpt, uint16_t volid);
1256 
1257 #define	MPTSAS_IOCSTATUS(status) (status & MPI2_IOCSTATUS_MASK)
1258 /*
1259  * debugging.
1260  */
1261 #if defined(MPTSAS_DEBUG)
1262 
1263 void mptsas_printf(char *fmt, ...);
1264 
1265 #define	MPTSAS_DBGPR(m, args)	\
1266 	if (mptsas_debug_flags & (m)) \
1267 		mptsas_printf args
1268 #else	/* ! defined(MPTSAS_DEBUG) */
1269 #define	MPTSAS_DBGPR(m, args)
1270 #endif	/* defined(MPTSAS_DEBUG) */
1271 
1272 #define	NDBG0(args)	MPTSAS_DBGPR(0x01, args)	/* init	*/
1273 #define	NDBG1(args)	MPTSAS_DBGPR(0x02, args)	/* normal running */
1274 #define	NDBG2(args)	MPTSAS_DBGPR(0x04, args)	/* property handling */
1275 #define	NDBG3(args)	MPTSAS_DBGPR(0x08, args)	/* pkt handling */
1276 
1277 #define	NDBG4(args)	MPTSAS_DBGPR(0x10, args)	/* kmem alloc/free */
1278 #define	NDBG5(args)	MPTSAS_DBGPR(0x20, args)	/* polled cmds */
1279 #define	NDBG6(args)	MPTSAS_DBGPR(0x40, args)	/* interrupts */
1280 #define	NDBG7(args)	MPTSAS_DBGPR(0x80, args)	/* queue handling */
1281 
1282 #define	NDBG8(args)	MPTSAS_DBGPR(0x0100, args)	/* arq */
1283 #define	NDBG9(args)	MPTSAS_DBGPR(0x0200, args)	/* Tagged Q'ing */
1284 #define	NDBG10(args)	MPTSAS_DBGPR(0x0400, args)	/* halting chip */
1285 #define	NDBG11(args)	MPTSAS_DBGPR(0x0800, args)	/* power management */
1286 
1287 #define	NDBG12(args)	MPTSAS_DBGPR(0x1000, args)	/* enumeration */
1288 #define	NDBG13(args)	MPTSAS_DBGPR(0x2000, args)	/* configuration page */
1289 #define	NDBG14(args)	MPTSAS_DBGPR(0x4000, args)
1290 #define	NDBG15(args)	MPTSAS_DBGPR(0x8000, args)
1291 
1292 #define	NDBG16(args)	MPTSAS_DBGPR(0x010000, args)
1293 #define	NDBG17(args)	MPTSAS_DBGPR(0x020000, args)	/* scatter/gather */
1294 #define	NDBG18(args)	MPTSAS_DBGPR(0x040000, args)
1295 #define	NDBG19(args)	MPTSAS_DBGPR(0x080000, args)	/* handshaking */
1296 
1297 #define	NDBG20(args)	MPTSAS_DBGPR(0x100000, args)	/* events */
1298 #define	NDBG21(args)	MPTSAS_DBGPR(0x200000, args)	/* dma */
1299 #define	NDBG22(args)	MPTSAS_DBGPR(0x400000, args)	/* reset */
1300 #define	NDBG23(args)	MPTSAS_DBGPR(0x800000, args)	/* abort */
1301 
1302 #define	NDBG24(args)	MPTSAS_DBGPR(0x1000000, args)	/* capabilities */
1303 #define	NDBG25(args)	MPTSAS_DBGPR(0x2000000, args)	/* flushing */
1304 #define	NDBG26(args)	MPTSAS_DBGPR(0x4000000, args)
1305 #define	NDBG27(args)	MPTSAS_DBGPR(0x8000000, args)
1306 
1307 #define	NDBG28(args)	MPTSAS_DBGPR(0x10000000, args)	/* hotplug */
1308 #define	NDBG29(args)	MPTSAS_DBGPR(0x20000000, args)	/* timeouts */
1309 #define	NDBG30(args)	MPTSAS_DBGPR(0x40000000, args)	/* mptsas_watch */
1310 #define	NDBG31(args)	MPTSAS_DBGPR(0x80000000, args)	/* negotations */
1311 
1312 /*
1313  * auto request sense
1314  */
1315 #define	RQ_MAKECOM_COMMON(pkt, flag, cmd) \
1316 	(pkt)->pkt_flags = (flag), \
1317 	((union scsi_cdb *)(pkt)->pkt_cdbp)->scc_cmd = (cmd), \
1318 	((union scsi_cdb *)(pkt)->pkt_cdbp)->scc_lun = \
1319 	    (pkt)->pkt_address.a_lun
1320 
1321 #define	RQ_MAKECOM_G0(pkt, flag, cmd, addr, cnt) \
1322 	RQ_MAKECOM_COMMON((pkt), (flag), (cmd)), \
1323 	FORMG0ADDR(((union scsi_cdb *)(pkt)->pkt_cdbp), (addr)), \
1324 	FORMG0COUNT(((union scsi_cdb *)(pkt)->pkt_cdbp), (cnt))
1325 
1326 
1327 #ifdef	__cplusplus
1328 }
1329 #endif
1330 
1331 #endif	/* _SYS_SCSI_ADAPTERS_MPTVAR_H */
1332