xref: /titanic_51/usr/src/uts/common/sys/sata/impl/sata.h (revision d32b5733da0f97c36cba57edb62c4955d7c209fb)
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 #ifndef _SATA_H
28 #define	_SATA_H
29 
30 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 /*
35  * Generic SATA Host Adapter Implementation
36  */
37 
38 #include <sys/types.h>
39 #include <sys/scsi/scsi.h>
40 #include <sys/scsi/impl/services.h>
41 #include <sys/sata/sata_defs.h>
42 #include <sys/sata/sata_hba.h>
43 
44 /* Common flags specifying current state of a port or an attached drive. */
45 #define	SATA_STATE_PROBING		0x000001
46 #define	SATA_STATE_PROBED		0x000002
47 
48 /* Statistics counters */
49 struct sata_port_stats {
50 	uint64_t	link_lost;		/* event counter */
51 	uint64_t	link_established;	/* event counter */
52 	uint64_t	device_attached;	/* event counter */
53 	uint64_t	device_detached;	/* event counter */
54 	uint64_t	port_reset;		/* event counter */
55 	uint64_t	port_pwr_changed;	/* event counter */
56 };
57 
58 typedef struct sata_port_stats sata_port_stats_t;
59 
60 struct sata_drive_stats {
61 	uint64_t	media_error;		/* available ??? */
62 	uint64_t	drive_reset;		/* event counter */
63 } sata_drv_stats_t;
64 
65 typedef struct sata_drive_stats sata_drive_stats_t;
66 
67 struct sata_ctrl_stats {
68 	uint64_t	ctrl_reset;		/* event counter */
69 	uint64_t	ctrl_pwr_change;	/* event counter */
70 };
71 
72 typedef struct sata_ctrl_stats sata_ctrl_stats_t;
73 
74 
75 /*
76  * SATA HBA instance info structure
77  */
78 struct sata_hba_inst {
79 	dev_info_t		*satahba_dip;	/* this HBA instance devinfo */
80 	struct sata_hba_inst	*satahba_next;	/* ptr to next sata_hba_inst */
81 	struct sata_hba_inst	*satahba_prev;	/* ptr to prev sata_hba_inst */
82 	struct scsi_hba_tran	*satahba_scsi_tran; /* scsi_hba_tran */
83 	struct sata_hba_tran	*satahba_tran;	/* sata_hba_tran */
84 	kmutex_t		satahba_mutex;	/* sata hba cntrl mutex */
85 	struct taskq		*satahba_taskq;	/* cmd completion task queue */
86 
87 						/*
88 						 * HBA event flags:
89 						 * SATA_EVNT_MAIN
90 						 * SATA_EVNT_PWR_LEVEL_CHANGED
91 						 * SATA_EVNT_SKIP
92 						 */
93 	uint_t			satahba_event_flags;
94 
95 	struct sata_cport_info	*satahba_dev_port[SATA_MAX_CPORTS];
96 
97 						/*
98 						 * DEVCTL open flag:
99 						 * SATA_DEVCTL_SOPENED
100 						 * SATA_DEVCTL_EXOPENED
101 						 */
102 	uint_t			satahba_open_flag; /* shared open flag */
103 	struct sata_ctrl_stats	satahba_stats;	/* HBA cntrl statistics */
104 
105 	uint_t			satahba_attached; /* HBA attaching: */
106 						/* 0 - not completed */
107 						/* 1 - completed */
108 };
109 
110 typedef struct sata_hba_inst	sata_hba_inst_t;
111 
112 /*
113  * SATA controller's device port info and state.
114  * This structure is pointed to by the sata_hba_inst.satahba_dev_port[x]
115  * where x is a device port number.
116  * cport_state holds port state flags, defined in sata_hba.h file.
117  * cport_event_flags holds SATA_EVNT_* flags defined in this file and in
118  * sata_hba.h file.
119  * cport_dev_type holds SATA_DTYPE_* types defined in sata_hba.h file.
120  */
121 struct sata_cport_info {
122 	sata_address_t		cport_addr;	/* this port SATA address */
123 	kmutex_t		cport_mutex;	/* port mutex */
124 
125 						/*
126 						 * Port state flags
127 						 * SATA_STATE_UNKNOWN
128 						 * SATA_STATE_PROBING
129 						 * SATA_STATE_PROBED
130 						 * SATA_STATE_READY
131 						 * SATA_PSTATE_PWRON
132 						 * SATA_PSTATE_PWROFF
133 						 * SATA_PSTATE_SHUTDOWN
134 						 * SATA_PSTATE_FAILED
135 						 */
136 	uint32_t		cport_state;
137 
138 						/*
139 						 * Port event flags:
140 						 * SATA_EVNT_DEVICE_ATTACHED
141 						 * SATA_EVNT_DEVICE_DETACHED
142 						 * SATA_EVNT_LINK_LOST
143 						 * SATA_EVNT_LINK_ESTABLISHED
144 						 * SATA_EVNT_PORT_FAILED
145 						 * SATA_EVNT_PWR_LEVEL_CHANGED
146 						 */
147 	uint32_t		cport_event_flags;
148 
149 	struct sata_port_scr	cport_scr;	/* Port status and ctrl regs */
150 
151 						/*
152 						 * Attached device type:
153 						 * SATA_DTYPE_NONE
154 						 * SATA_DTYPE_ATADISK
155 						 * SATA_DTYPE_ATAPICD
156 						 * SATA_DTYPE_ATAPITAPE
157 						 * SATA_DTYPE_ATAPIDISK
158 						 * SATA_DTYPE_PMULT
159 						 * SATA_DTYPE_UNKNOWN
160 						 */
161 	uint32_t		cport_dev_type;
162 	union {
163 	    struct sata_drive_info *cport_sata_drive; /* Attached drive info */
164 	    struct sata_pmult_info *cport_sata_pmult; /* Attached Port Mult */
165 	} 			cport_devp;
166 						/* lbolt value at link lost */
167 	clock_t			cport_link_lost_time;
168 						/* lbolt value @ dev attached */
169 	clock_t			cport_dev_attach_time;
170 
171 	struct sata_port_stats	cport_stats;	/* Port statistics */
172 
173 	boolean_t		cport_tgtnode_clean; /* Target node usable */
174 };
175 
176 typedef struct sata_cport_info sata_cport_info_t;
177 
178 /*
179  * Attached SATA drive info and state.
180  * This structure is pointed to by sata_cport_info's cport_sata_drive field
181  * when a drive is attached directly to a controller device port.
182  */
183 struct sata_drive_info {
184 	sata_address_t	satadrv_addr;		/* this drive SATA address */
185 
186 						/*
187 						 * Drive state flags
188 						 * SATA_STATE_UNKNOWN
189 						 * SATA_STATE_PROBING
190 						 * SATA_STATE_PROBED
191 						 * SATA_STATE_READY
192 						 * SATA_DSTATE_PWR_ACTIVE
193 						 * SATA_DSTATE_PWR_IDLE
194 						 * SATA_DSTATE_RESET
195 						 * SATA_DSTATE_FAILED
196 						 */
197 	uint32_t	satadrv_state;
198 
199 						/*
200 						 * drive event flags:
201 						 * SATA_EVNT_DRIVE_RESET
202 						 */
203 	uint32_t	satadrv_event_flags;
204 						/*
205 						 * lbolt value @ start of
206 						 * device reset processing
207 						 */
208 	clock_t		satadrv_reset_time;
209 						/*
210 						 * Attached device type:
211 						 * SATA_DTYPE_ATADISK
212 						 * SATA_DTYPE_ATAPICD
213 						 * SATA_DTYPE_ATAPITAPE
214 						 * SATA_DTYPE_ATAPIDISK
215 						 */
216 	uint32_t	satadrv_type;
217 
218 	uint32_t	satadrv_status_reg;	/* drive status reg */
219 	uint32_t	satadrv_error_reg;	/* drive error reg */
220 	uint16_t	satadrv_features_support; /* drive features support */
221 	uint16_t	satadrv_queue_depth;    /* drive queue depth */
222 	uint16_t	satadrv_atapi_cdb_len;	/* atapi supported cdb length */
223 	uint16_t	satadrv_atapi_trans_ver; /* atapi transport version */
224 	uint16_t	satadrv_settings;	/* drive settings flags */
225 	uint16_t	satadrv_features_enabled; /* drive features enabled */
226 	uint64_t	satadrv_capacity;	/* drive capacity */
227 	uint64_t	satadrv_max_queue_depth; /* maximum queue depth */
228 	sata_id_t	satadrv_id;		/* Device Identify Data */
229 	struct sata_drive_stats satadrv_stats;	/* drive statistics */
230 
231 	/*
232 	 * saved standby timer
233 	 * [0] - [3] = high - low
234 	 */
235 	uint8_t		satadrv_standby_timer[4];
236 	uint8_t		satadrv_power_level; /* saved power level */
237 };
238 
239 typedef struct sata_drive_info sata_drive_info_t;
240 
241 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_drive_info))
242 
243 
244 /* Port Multiplier & host port info and state */
245 struct sata_pmult_info {
246 	sata_address_t	pmult_addr;		/* this PMult SATA Address */
247 	kmutex_t	pmult_mutex;		/* pmult (host port) mutex */
248 
249 						/*
250 						 * PMult state flags
251 						 * SATA_STATE_UNKNOWN
252 						 * SATA_STATE_PROBING
253 						 * SATA_STATE_PROBED
254 						 * SATA_STATE_READY
255 						 * SATA_PSTATE_FAILED
256 						 */
257 	uint32_t	pmult_state;
258 	uint32_t	pmult_event_flags;	/* Undefined for now */
259 	struct sata_port_scr pmult_scr;		/* Host port SCR block */
260 	uint32_t	pmult_num_dev_ports; 	/* Number of data ports */
261 	struct sata_pmport_info	*pmult_dev_port[SATA_MAX_PMPORTS - 1];
262 };
263 
264 typedef	struct sata_pmult_info sata_pmult_info_t;
265 
266 /* Port Multiplier's device port info & state */
267 struct sata_pmport_info {
268 	sata_address_t	pmport_addr;		/* this SATA port address */
269 	kmutex_t	pmport_mutex;		/* pmult device port mutex */
270 
271 						/*
272 						 * Port state flags
273 						 * SATA_STATE_UNKNOWN
274 						 * SATA_STATE_PROBING
275 						 * SATA_STATE_PROBED
276 						 * SATA_STATE_READY
277 						 * SATA_PSTATE_PWRON
278 						 * SATA_PSTATE_PWROFF
279 						 * SATA_PSTATE_SHUTDOWN
280 						 * SATA_PSTATE_FAILED
281 						 */
282 	uint32_t	pmport_state;
283 
284 						/*
285 						 * Port event flags:
286 						 * SATA_EVNT_DEVICE_ATTACHED
287 						 * SATA_EVNT_DEVICE_DETACHED
288 						 * SATA_EVNT_LINK_LOST
289 						 * SATA_EVNT_LINK_ESTABLISHED
290 						 * SATA_EVNT_PORT_FAILED
291 						 * SATA_EVNT_PWR_LEVEL_CHANGED
292 						 */
293 	uint32_t	pmport_event_flags;
294 
295 	struct sata_port_scr pmport_scr;	/* PMult device port scr */
296 
297 						/*
298 						 * Attached device type:
299 						 * SATA_DTYPE_NONE
300 						 * SATA_DTYPE_ATADISK
301 						 * SATA_DTYPE_ATAPICD
302 						 * SATA_DTYPE_ATAPITAPE
303 						 * SATA_DTYPE_ATAPIDISK
304 						 * SATA_DTYPE_UNKNOWN
305 						 */
306 	uint32_t	pmport_dev_type;
307 
308 	struct sata_drive_info	*pmport_sata_drive; /* Attached drive info */
309 
310 						/* lbolt value at link lost */
311 	clock_t		pmport_link_lost_time;
312 						/* lbolt value @ dev attached */
313 	clock_t		pmport_dev_attach_time;
314 
315 	struct sata_port_stats	pmport_stats;	/* Port statistics */
316 
317 	boolean_t	pmport_tgtnode_clean;	/* Target node usable */
318 };
319 
320 typedef	struct sata_pmport_info sata_pmport_info_t;
321 
322 /*
323  * sata drive's power level
324  * default value is active
325  */
326 #define	SATA_POWER_ACTIVE	0x00
327 #define	SATA_POWER_IDLE		0x01
328 #define	SATA_POWER_STANDBY	0x02
329 #define	SATA_POWER_STOPPED	0x03
330 
331 /*
332  * pm-capable value definition according to PSARC 2009/310
333  */
334 #define	SATA_CAP_POWER_CONDITON	PM_CAPABLE_SPC4
335 #define	SATA_CAP_SMART_PAGE	PM_CAPABLE_SMART_LOG
336 #define	SATA_CAP_LOG_SENSE	PM_CAPABLE_LOG_SUPPORTED
337 
338 /*
339  * Port SSTATUS register (sata_port_scr sport_sstatus field).
340  * Link bits are valid only in port active state.
341  */
342 #define	SATA_PORT_DEVLINK_UP	0x00000103	/* Link with dev established */
343 #define	SATA_PORT_DEVLINK_UP_MASK 0x0000010F	/* Mask for link bits */
344 
345 /*
346  * Port state clear mask (cport_state and pmport_state fields).
347  * SATA_PSTATE_SHUTDOWN and power state are preserved.
348  */
349 #define	SATA_PORT_STATE_CLEAR_MASK	(~(SATA_PSTATE_SHUTDOWN))
350 
351 /*
352  * Valid i.e.supported device types mask (cport_dev_type, satadrv_type,
353  * pmult_dev_type fields).
354  * ATA disks and ATAPI CD/DVD now.
355  */
356 #define	SATA_VALID_DEV_TYPE	(SATA_DTYPE_ATADISK | \
357 				SATA_DTYPE_ATAPICD | \
358 				SATA_DTYPE_ATAPITAPE | \
359 				SATA_DTYPE_ATAPIDISK)
360 
361 /*
362  * Device feature_support (satadrv_features_support)
363  */
364 #define	SATA_DEV_F_DMA			0x01
365 #define	SATA_DEV_F_LBA28		0x02
366 #define	SATA_DEV_F_LBA48		0x04
367 #define	SATA_DEV_F_NCQ			0x08
368 #define	SATA_DEV_F_SATA1		0x10
369 #define	SATA_DEV_F_SATA2		0x20
370 #define	SATA_DEV_F_TCQ			0x40	/* Non NCQ tagged queuing */
371 
372 /*
373  * Device features enabled (satadrv_features_enabled)
374  */
375 #define	SATA_DEV_F_E_TAGGED_QING	0x01	/* Tagged queuing enabled */
376 #define	SATA_DEV_F_E_UNTAGGED_QING	0x02	/* Untagged queuing enabled */
377 
378 /*
379  * Drive settings flags (satdrv_settings)
380  */
381 #define	SATA_DEV_READ_AHEAD		0x0001	/* Read Ahead enabled */
382 #define	SATA_DEV_WRITE_CACHE		0x0002	/* Write cache ON */
383 #define	SATA_DEV_DMA			0x0004	/* DMA selected */
384 #define	SATA_DEV_SERIAL_FEATURES 	0x8000	/* Serial ATA feat. enabled */
385 #define	SATA_DEV_ASYNCH_NOTIFY		0x2000	/* Asynch-event enabled */
386 #define	SATA_DEV_RMSN			0x0100	/* Rem Media Stat Notfc enbl */
387 
388 /*
389  * Internal event and flags.
390  * These flags are set in the *_event_flags fields of various structures.
391  * Events and lock flags defined below are used internally by the
392  * SATA framework (they are not reported by SATA HBA drivers).
393  */
394 #define	SATA_EVNT_MAIN			0x80000000
395 #define	SATA_EVNT_SKIP			0x40000000
396 #define	SATA_EVNT_INPROC_DEVICE_RESET	0x08000000
397 #define	SATA_EVNT_CLEAR_DEVICE_RESET	0x04000000
398 #define	SATA_EVNT_TARGET_NODE_CLEANUP	0x00000100
399 #define	SATA_EVNT_AUTOONLINE_DEVICE	0x00000200
400 
401 /*
402  * Lock flags - used to serialize configuration operations
403  * on ports and devices.
404  * SATA_EVNT_LOCK_PORT_BUSY is set by event daemon to prevent
405  * simultaneous cfgadm operations.
406  * SATA_APCTL_LOCK_PORT_BUSY is set by cfgadm ioctls to prevent
407  * simultaneous event processing.
408  */
409 #define	SATA_EVNT_LOCK_PORT_BUSY	0x00800000
410 #define	SATA_APCTL_LOCK_PORT_BUSY	0x00400000
411 
412 /* Mask for port events */
413 #define	SATA_EVNT_PORT_EVENTS		(SATA_EVNT_DEVICE_ATTACHED | \
414 					SATA_EVNT_DEVICE_DETACHED | \
415 					SATA_EVNT_LINK_LOST | \
416 					SATA_EVNT_LINK_ESTABLISHED | \
417 					SATA_EVNT_PORT_FAILED | \
418 					SATA_EVNT_TARGET_NODE_CLEANUP | \
419 					SATA_EVNT_AUTOONLINE_DEVICE)
420 /* Mask for drive events */
421 #define	SATA_EVNT_DRIVE_EVENTS		(SATA_EVNT_DEVICE_RESET | \
422 					SATA_EVNT_INPROC_DEVICE_RESET)
423 #define	SATA_EVNT_CONTROLLER_EVENTS	SATA_EVNT_PWR_LEVEL_CHANGED
424 
425 /* Delays and timeout duration definitions */
426 #define	SATA_EVNT_DAEMON_SLEEP_TIME	50000	/* 50 ms */
427 #define	SATA_EVNT_DAEMON_TERM_TIMEOUT	100000	/* 100 ms */
428 #define	SATA_EVNT_DAEMON_TERM_WAIT	60000000 /* 60 s */
429 #define	SATA_EVNT_LINK_LOST_TIMEOUT	1000000	/* 1 s */
430 
431 #define	SATA_DEV_IDENTIFY_TIMEOUT	60000000 /* 60 s, device enumeration */
432 #define	SATA_DEV_REPROBE_TIMEOUT	30000000  /* 30 s, dev resp after rst */
433 #define	SATA_DEV_RETRY_DLY		10000	/* 10 ms */
434 
435 /* DEVICE IDENTIFY and device initialization retry delay */
436 #define	SATA_DEV_IDENTIFY_RETRY		1
437 #define	SATA_DEV_IDENTIFY_NORETRY	0
438 
439 /*
440  * sata_scsi's hba_open_flag: field indicating open devctl instance.
441  *	0 = closed, 1 = shared open, 2 = exclusive open.
442  */
443 #define	SATA_DEVCTL_CLOSED	0
444 #define	SATA_DEVCTL_SOPENED	1
445 #define	SATA_DEVCTL_EXOPENED	2
446 
447 /*
448  * sata_pkt_txlate structure contains info about resources allocated
449  * for the packet
450  * Address of this structure is stored in scsi_pkt.pkt_ha_private and
451  * in sata_pkt.sata_hba_private fields, so all three strucures are
452  * cross-linked, with sata_pkt_txlate as a centerpiece.
453  */
454 
455 typedef struct sata_pkt_txlate {
456 	struct sata_hba_inst	*txlt_sata_hba_inst;
457 	struct scsi_pkt		*txlt_scsi_pkt;
458 	struct sata_pkt		*txlt_sata_pkt;
459 	ddi_dma_handle_t	txlt_buf_dma_handle;
460 	uint_t			txlt_flags;	/* data-in / data-out */
461 	uint_t			txlt_num_dma_win; /* number of DMA windows */
462 	uint_t			txlt_cur_dma_win; /* current DMA window */
463 
464 				/* cookies in the current DMA window */
465 	uint_t			txlt_curwin_num_dma_cookies;
466 
467 				/* processed dma cookies in current DMA win */
468 	uint_t			txlt_curwin_processed_dma_cookies;
469 	size_t			txlt_total_residue;
470 	ddi_dma_cookie_t	txlt_dma_cookie; /* default dma cookie */
471 	int			txlt_dma_cookie_list_len; /* alloc list len */
472 	ddi_dma_cookie_t 	*txlt_dma_cookie_list; /* dma cookie list */
473 	int			txlt_num_dma_cookies; /* dma cookies in list */
474 
475 				/* temporary buffer access handle */
476 	ddi_acc_handle_t	txlt_tmp_buf_handle;
477 	caddr_t			txlt_tmp_buf;	/* temp buffer address */
478 } sata_pkt_txlate_t;
479 
480 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt_txlate))
481 _NOTE(SCHEME_PROTECTS_DATA("unshared data", scsi_pkt))
482 
483 
484 /*
485  * Additional scsi sense code definitions.
486  * These definition should eventually be moved to scsi header file
487  * usr/src/uts/common/sys/scsi/generic/sense.h
488  */
489 #define	SD_SCSI_ASC_NO_ADD_SENSE			0x00
490 #define	SD_SCSI_ASC_LU_NOT_READY			0x04
491 #define	SD_SCSI_ASC_WRITE_ERR				0x0c
492 #define	SD_SCSI_ASC_UNREC_READ_ERR			0x11
493 #define	SD_SCSI_ASC_INVALID_COMMAND_CODE		0x20
494 #define	SD_SCSI_ASC_LBA_OUT_OF_RANGE			0x21
495 #define	SD_SCSI_ASC_INVALID_FIELD_IN_CDB		0x24
496 #define	SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST	0x26
497 #define	SD_SCSI_ASC_RESET				0x29
498 #define	SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED		0x39
499 #define	SD_SCSI_ASC_CMD_SEQUENCE_ERR			0x2c
500 #define	SD_SCSI_ASC_LOW_POWER_CONDITION_ON		0x5e
501 #define	SD_SCSI_ASC_LU_NOT_RESPONSE			0x05
502 
503 
504 /* SCSI defs missing from scsi headers */
505 /* Missing from sys/scsi/generic/commands.h */
506 #define	SCMD_SYNCHRONIZE_CACHE_G1		0x91
507 /*
508  * Missing from sys/scsi/impl/mode.h, although defined
509  * in sys/scsi/targets/sddefs.h as MODEPAGE_ERR_RECOV
510  */
511 #define	MODEPAGE_RW_ERRRECOV			0x01 /* read/write recovery */
512 
513 /*
514  * medium access command
515  */
516 #define	SATA_IS_MEDIUM_ACCESS_CMD(cmd) \
517 	(((cmd) == SCMD_READ) || ((cmd) == SCMD_WRITE) || \
518 	((cmd) == SCMD_READ_G1) || ((cmd) == SCMD_WRITE_G1) || \
519 	((cmd) == SCMD_READ_G4) || ((cmd) == SCMD_WRITE_G4) || \
520 	((cmd) == SCMD_READ_G5) || ((cmd) == SCMD_WRITE_G5) || \
521 	((cmd) == SCMD_VERIFY) || ((cmd) == SCMD_VERIFY_G4) || \
522 	((cmd) == SCMD_VERIFY_G5) || ((cmd) == 0x7f) /* VERIFY(32) */|| \
523 	((cmd) == SCMD_SYNCHRONIZE_CACHE) || ((cmd) == SCMD_SPACE_G4) || \
524 	((cmd) == SCMD_READ_POSITION) || \
525 	((cmd) == 0x90) /* PRE-FETCH(16) */ || \
526 	((cmd) == SCMD_READ_DEFECT_LIST) || \
527 	((cmd) == 0xb7) /* READ DEFECT DATA */ || \
528 	((cmd) == SCMD_READ_LONG) || ((cmd) == SCMD_SVC_ACTION_IN_G4) || \
529 	((cmd) == SCMD_WRITE_LONG) || ((cmd) == SCMD_SVC_ACTION_OUT_G4) || \
530 	((cmd) == 0x41) || ((cmd) == 0x93) || /* WRITE SAME */ \
531 	((cmd) == 0x52) || ((cmd) == 0x50) || /* XDREAD & XDWRITE */ \
532 	((cmd) == 0x53) || ((cmd) == 0x51) || /* XDWRITEREAD & XPWRITE */ \
533 	((cmd) == 0x7f))
534 
535 /*
536  * Macros for accessing various structure fields
537  */
538 
539 #define	SATA_TRAN(sata_hba_inst) \
540 	sata_hba_inst->satahba_tran
541 
542 #define	SATA_DIP(sata_hba_inst) \
543 	sata_hba_inst->satahba_dip
544 
545 #define	SATA_NUM_CPORTS(sata_hba_inst) \
546 	sata_hba_inst->satahba_tran->sata_tran_hba_num_cports
547 
548 #define	SATA_QDEPTH(sata_hba_inst) \
549 	sata_hba_inst->satahba_tran->sata_tran_hba_qdepth
550 
551 #define	SATA_FEATURES(sata_hba_inst) \
552 	sata_hba_inst->satahba_tran->sata_tran_hba_features_support
553 
554 #define	SATA_DMA_ATTR(sata_hba_inst) \
555 	sata_hba_inst->satahba_tran->sata_tran_hba_dma_attr
556 
557 #define	SATA_START_FUNC(sata_hba_inst) \
558 	sata_hba_inst->satahba_tran->sata_tran_start
559 
560 #define	SATA_ABORT_FUNC(sata_hba_inst) \
561 	sata_hba_inst->satahba_tran->sata_tran_abort
562 
563 #define	SATA_RESET_DPORT_FUNC(sata_hba_inst) \
564 	sata_hba_inst->satahba_tran->sata_tran_reset_dport
565 
566 #define	SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) \
567 	(sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
568 	NULL : \
569 	sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
570 	sata_tran_port_deactivate)
571 
572 #define	SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) \
573 	(sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
574 	NULL : \
575 	sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
576 	sata_tran_port_activate)
577 
578 #define	SATA_PROBE_PORT_FUNC(sata_hba_inst) \
579 	sata_hba_inst->satahba_tran->sata_tran_probe_port
580 
581 #define	SATA_SELFTEST_FUNC(sata_hba_inst) \
582 	sata_hba_inst->satahba_tran->sata_tran_selftest
583 
584 #define	SATA_CPORT_MUTEX(sata_hba_inst, cport) \
585 	sata_hba_inst->satahba_dev_port[cport]->cport_mutex
586 
587 #define	SATA_CPORT_INFO(sata_hba_inst, cport) \
588 	sata_hba_inst->satahba_dev_port[cport]
589 
590 #define	SATA_CPORT_STATE(sata_hba_inst, cport) \
591 	sata_hba_inst->satahba_dev_port[cport]->cport_state
592 
593 #define	SATA_CPORT_EVENT_FLAGS(sata_hba_inst, cport) \
594 	sata_hba_inst->satahba_dev_port[cport]->cport_event_flags
595 
596 #define	SATA_CPORT_SCR(sata_hba_inst, cport) \
597 	sata_hba_inst->satahba_dev_port[cport]->cport_scr
598 
599 #define	SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) \
600 	sata_hba_inst->satahba_dev_port[cport]->cport_dev_type
601 
602 #define	SATA_CPORT_DRV_INFO(sata_hba_inst, cport) \
603 	sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_drive
604 
605 #define	SATA_CPORTINFO_DRV_TYPE(cportinfo) \
606 	cportinfo->cport_dev_type
607 
608 #define	SATA_CPORTINFO_DRV_INFO(cportinfo) \
609 	cportinfo->cport_devp.cport_sata_drive
610 
611 #define	SATA_CPORTINFO_PMULT_INFO(cportinfo) \
612 	cportinfo->cport_devp.cport_sata_pmult
613 
614 #define	SATA_PMULT_INFO(sata_hba_inst, cport) \
615 	sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_pmult
616 
617 #define	SATA_NUM_PMPORTS(sata_hba_inst, cport) \
618 	sata_hba_inst->satahba_dev_port[cport]->\
619 	cport_devp.cport_sata_pmult->pmult_num_dev_ports
620 
621 #define	SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) \
622 	sata_hba_inst->satahba_dev_port[cport]->\
623 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]
624 
625 #define	SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport) \
626 	sata_hba_inst->satahba_dev_port[cport]->\
627 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\
628 	pmport_sata_drive
629 
630 #define	SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) \
631 	sata_hba_inst->satahba_dev_port[cport]->\
632 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_state
633 
634 #define	SATA_PMPORT_SCR(sata_hba_inst, cport, pmport) \
635 	sata_hba_inst->satahba_dev_port[cport]->\
636 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_scr
637 
638 #define	SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport) \
639 	sata_hba_inst->satahba_dev_port[cport]->\
640 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_dev_type
641 
642 #define	SATA_PMPORTINFO_DRV_TYPE(pmportinfo) \
643 	pmportinfo->pmport_dev_type
644 
645 #define	SATA_PMPORTINFO_DRV_INFO(pmportinfo) \
646 	pmportinfo->pmport_sata_drive
647 
648 #define	SATA_TXLT_HBA_INST(spx) \
649 	spx->txlt_sata_hba_inst
650 
651 #define	SATA_TXLT_CPORT(spx) \
652 	spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport
653 
654 #define	SATA_TXLT_CPORT_MUTEX(spx) \
655 	spx->txlt_sata_hba_inst->\
656 	satahba_dev_port[spx->txlt_sata_pkt->\
657 	satapkt_device.satadev_addr.cport]->cport_mutex
658 
659 #define	SATA_TXLT_TASKQ(spx) \
660 	spx->txlt_sata_hba_inst->\
661 	satahba_taskq
662 
663 /*
664  * Minor number construction for devctl and attachment point nodes.
665  * All necessary information has to be encoded in NBITSMINOR32 bits.
666  *
667  * Devctl node minor number:
668  * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_DEVCTL_NODE)
669  *
670  * Attachment point node minor number has to include controller
671  * instance (7 bits), controller port number (5 bits) and port multiplier
672  * device port number (4 bits) and port multiplier device port
673  * indicator (1 bit).  Additionally, a single bit is used to
674  * differentiate between attachment point node and device control node.
675  *
676  * Attachment point minor number:
677  * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_AP_NODE |
678  * [(port_multiplier_device_port << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP] |
679  * (controller_port))
680  *
681  * 17 bits are used (if 64 instances of controllers are expected)
682  * bit 18 is reserved for future use.
683  *
684  *   --------------------------------------------------------
685  *   |17|16|15|14|13|12|11|10 |09|08|07|06|05|04|03|02|01|00|
686  *   --------------------------------------------------------
687  *   | R| c| c| c| c| c| c|a/d|pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
688  *   --------------------------------------------------------
689  * Where:
690  * cp  - device port number on the HBA SATA controller
691  * pp  - device port number on the port multiplier
692  * pm  - 0 - target attached to controller device port
693  *       1 - target attached to port multiplier's device port
694  * a/d - 0 - devctl node
695  *       1 - attachment point node
696  * c   - controller number
697  * R   - reserved bit
698  */
699 
700 #define	SATA_AP_NODE		0x400		/* Attachment Point node */
701 #define	SATA_DEVCTL_NODE	0x000		/* DEVCTL node */
702 #define	SATA_PMULT_AP		0x200		/* device on PMult port */
703 #define	SATA_PMULT_PORT_SHIFT	5
704 #define	SATA_CNTRL_INSTANCE_SHIFT 11
705 #define	SATA_CPORT_MASK		0x1f		/* 32 device ports */
706 #define	SATA_PMULT_PORT_MASK	0xf		/* 15 device ports */
707 #define	SATA_CNTRL_INSTANCE_MASK 0x03F		/* 64 controllers */
708 
709 /* Macro for creating devctl node minor number */
710 #define	SATA_MAKE_DEVCTL_MINOR(controller_instance) \
711 	((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | \
712 	SATA_DEVCTL_NODE)
713 
714 /* Macro for creating an attachment point node minor number */
715 #define	SATA_MAKE_AP_MINOR(cntrl_instance, cport, pmport, qual) \
716 	(qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT) ? \
717 	(((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \
718 	SATA_AP_NODE | SATA_PMULT_AP | \
719 	(pmport << SATA_PMULT_PORT_SHIFT) | cport) : \
720 	(((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \
721 	SATA_AP_NODE | cport))
722 
723 /* Macro retrieving controller number from a minor number */
724 #define	SATA_MINOR2INSTANCE(minor) \
725 	((minor >> SATA_CNTRL_INSTANCE_SHIFT) & SATA_CNTRL_INSTANCE_MASK)
726 
727 /*
728  * Macro for creating an attachment point number from sata address.
729  * Address qualifier has to be one of:
730  * SATA_ADDR_DCPORT, SATA_ADDR_DPMPORT, SATA_ADDR_CPORT or SATA_ADDR_PMPORT
731  */
732 #define	SATA_MAKE_AP_NUMBER(cport, pmport, qual) \
733 	((qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) ? \
734 	(SATA_PMULT_AP | (pmport << SATA_PMULT_PORT_SHIFT) | cport) : \
735 	(cport))
736 
737 /*
738  * SCSI target number format
739  *
740  *   -------------------------------
741  *   | 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|    Bit number
742  *   -------------------------------
743  *   |pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
744  *   -------------------------------
745  * Where:
746  * cp  - device port number on the HBA SATA controller
747  * pp  - device port number on the port multiplier
748  * pm  - 0 - target attached to controller device port
749  *       1 - target attached to port multiplier's device port
750  */
751 
752 /* SATA ports to SCSI target number translation */
753 
754 #define	SATA_TO_SCSI_TARGET(cport, pmport, qual) \
755 	(qual == SATA_ADDR_DCPORT ? cport : \
756 	(cport | (pmport << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP))
757 
758 /* SCSI target number to SATA cntrl/pmport/cport translations */
759 #define	SCSI_TO_SATA_CPORT(scsi_target) \
760 	(scsi_target & SATA_CPORT_MASK)
761 
762 #define	SCSI_TO_SATA_PMPORT(scsi_target) \
763 	((scsi_target >> SATA_PMULT_PORT_SHIFT) & SATA_PMULT_PORT_MASK)
764 
765 #define	SCSI_TO_SATA_ADDR_QUAL(scsi_target) \
766 	((scsi_target & SATA_PMULT_AP) ? SATA_ADDR_DPMPORT : \
767 	SATA_ADDR_DCPORT)
768 
769 
770 /* Debug flags */
771 #if	DEBUG
772 
773 #define	SATA_DEBUG
774 #define	SATA_DBG_SCSI_IF	1
775 #define	SATA_DBG_HBA_IF		2
776 #define	SATA_DBG_NODES		4
777 #define	SATA_DBG_IOCTL_IF	8
778 #define	SATA_DBG_EVENTS		0x10
779 #define	SATA_DBG_EVENTS_PROC	0x20
780 #define	SATA_DBG_EVENTS_PROCPST	0x40
781 #define	SATA_DBG_EVENTS_CNTRL	0x80
782 #define	SATA_DBG_EVENTS_DAEMON	0x100
783 #define	SATA_DBG_DMA_SETUP	0x400
784 #define	SATA_DBG_DEV_SETTINGS	0x800
785 #define	SATA_DBG_ATAPI		0x1000
786 #define	SATA_DBG_ATAPI_PACKET	0x8000
787 #define	SATA_DBG_INTR_CTX	0x10000
788 
789 typedef struct sata_atapi_cmd {
790 	uint8_t acdb[SATA_ATAPI_MAX_CDB_LEN];
791 	uint8_t arqs[SATA_ATAPI_RQSENSE_LEN];
792 	uint_t sata_pkt_reason;
793 	uint_t scsi_pkt_reason;
794 } sata_atapi_cmd_t;
795 
796 /* Debug macros */
797 #define	SATADBG1(flag, sata, format, arg1) \
798 	if (sata_debug_flags & (flag)) { \
799 		sata_log(sata, CE_CONT, format, arg1); \
800 	}
801 
802 #define	SATADBG2(flag, sata, format, arg1, arg2) \
803 	if (sata_debug_flags & (flag)) { \
804 		sata_log(sata, CE_CONT, format, arg1, arg2); \
805 	}
806 
807 #define	SATADBG3(flag, sata, format, arg1, arg2, arg3) \
808 	if (sata_debug_flags & (flag)) { \
809 		sata_log(sata, CE_CONT, format, arg1, arg2, arg3); \
810 	}
811 #else
812 
813 #define	SATADBG1(flag, dip, frmt, arg1)
814 #define	SATADBG2(flag, dip, frmt, arg1, arg2)
815 #define	SATADBG3(flag, dip, frmt, arg1, arg2, arg3)
816 
817 #endif
818 
819 /* sata_rev_tag 1.43 */
820 
821 #ifdef	__cplusplus
822 }
823 #endif
824 
825 #endif /* _SATA_H */
826