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