xref: /onnv-gate/usr/src/uts/common/sys/sata/impl/sata.h (revision 12017:2ff17b2a8ff9)
11258Smlf /*
21258Smlf  * CDDL HEADER START
31258Smlf  *
41258Smlf  * The contents of this file are subject to the terms of the
51258Smlf  * Common Development and Distribution License (the "License").
61258Smlf  * You may not use this file except in compliance with the License.
71258Smlf  *
81258Smlf  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
91258Smlf  * or http://www.opensolaris.org/os/licensing.
101258Smlf  * See the License for the specific language governing permissions
111258Smlf  * and limitations under the License.
121258Smlf  *
131258Smlf  * When distributing Covered Code, include this CDDL HEADER in each
141258Smlf  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
151258Smlf  * If applicable, add the following below this CDDL HEADER, with the
161258Smlf  * fields enclosed by brackets "[]" replaced with your own identifying
171258Smlf  * information: Portions Copyright [yyyy] [name of copyright owner]
181258Smlf  *
191258Smlf  * CDDL HEADER END
201258Smlf  */
211258Smlf 
221258Smlf /*
23*12017SAlan.Perry@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
241258Smlf  * Use is subject to license terms.
251258Smlf  */
261258Smlf 
271258Smlf #ifndef _SATA_H
281258Smlf #define	_SATA_H
291258Smlf 
301258Smlf #ifdef	__cplusplus
311258Smlf extern "C" {
321258Smlf #endif
331258Smlf 
341258Smlf /*
351258Smlf  * Generic SATA Host Adapter Implementation
361258Smlf  */
371258Smlf 
381258Smlf #include <sys/types.h>
391258Smlf #include <sys/scsi/scsi.h>
401258Smlf #include <sys/scsi/impl/services.h>
411258Smlf #include <sys/sata/sata_defs.h>
421258Smlf #include <sys/sata/sata_hba.h>
431258Smlf 
446539Spawelw /* Common flags specifying current state of a port or an attached drive. */
456539Spawelw #define	SATA_STATE_PROBING		0x000001
466539Spawelw #define	SATA_STATE_PROBED		0x000002
476539Spawelw 
481258Smlf /* Statistics counters */
491258Smlf struct sata_port_stats {
501258Smlf 	uint64_t	link_lost;		/* event counter */
511258Smlf 	uint64_t	link_established;	/* event counter */
521258Smlf 	uint64_t	device_attached;	/* event counter */
531258Smlf 	uint64_t	device_detached;	/* event counter */
541258Smlf 	uint64_t	port_reset;		/* event counter */
551258Smlf 	uint64_t	port_pwr_changed;	/* event counter */
561258Smlf };
571258Smlf 
581258Smlf typedef struct sata_port_stats sata_port_stats_t;
591258Smlf 
601258Smlf struct sata_drive_stats {
611258Smlf 	uint64_t	media_error;		/* available ??? */
621258Smlf 	uint64_t	drive_reset;		/* event counter */
631258Smlf } sata_drv_stats_t;
641258Smlf 
651258Smlf typedef struct sata_drive_stats sata_drive_stats_t;
661258Smlf 
671258Smlf struct sata_ctrl_stats {
681258Smlf 	uint64_t	ctrl_reset;		/* event counter */
691258Smlf 	uint64_t	ctrl_pwr_change;	/* event counter */
701258Smlf };
711258Smlf 
721258Smlf typedef struct sata_ctrl_stats sata_ctrl_stats_t;
731258Smlf 
741258Smlf 
751258Smlf /*
761258Smlf  * SATA HBA instance info structure
771258Smlf  */
781258Smlf struct sata_hba_inst {
791258Smlf 	dev_info_t		*satahba_dip;	/* this HBA instance devinfo */
801258Smlf 	struct sata_hba_inst	*satahba_next;	/* ptr to next sata_hba_inst */
811258Smlf 	struct sata_hba_inst	*satahba_prev;	/* ptr to prev sata_hba_inst */
821258Smlf 	struct scsi_hba_tran	*satahba_scsi_tran; /* scsi_hba_tran */
831258Smlf 	struct sata_hba_tran	*satahba_tran;	/* sata_hba_tran */
841258Smlf 	kmutex_t		satahba_mutex;	/* sata hba cntrl mutex */
851781Spawelw 	struct taskq		*satahba_taskq;	/* cmd completion task queue */
861258Smlf 
871258Smlf 						/*
881258Smlf 						 * HBA event flags:
891258Smlf 						 * SATA_EVNT_MAIN
901258Smlf 						 * SATA_EVNT_PWR_LEVEL_CHANGED
911258Smlf 						 * SATA_EVNT_SKIP
921258Smlf 						 */
931258Smlf 	uint_t			satahba_event_flags;
941258Smlf 
951258Smlf 	struct sata_cport_info	*satahba_dev_port[SATA_MAX_CPORTS];
961258Smlf 
971258Smlf 						/*
981258Smlf 						 * DEVCTL open flag:
991258Smlf 						 * SATA_DEVCTL_SOPENED
1001258Smlf 						 * SATA_DEVCTL_EXOPENED
1011258Smlf 						 */
1021258Smlf 	uint_t			satahba_open_flag; /* shared open flag */
1031258Smlf 	struct sata_ctrl_stats	satahba_stats;	/* HBA cntrl statistics */
1041258Smlf 
1051258Smlf 	uint_t			satahba_attached; /* HBA attaching: */
1061258Smlf 						/* 0 - not completed */
1071258Smlf 						/* 1 - completed */
1081258Smlf };
1091258Smlf 
1101258Smlf typedef struct sata_hba_inst	sata_hba_inst_t;
1111258Smlf 
1121258Smlf /*
1131258Smlf  * SATA controller's device port info and state.
1141258Smlf  * This structure is pointed to by the sata_hba_inst.satahba_dev_port[x]
1151258Smlf  * where x is a device port number.
1161258Smlf  * cport_state holds port state flags, defined in sata_hba.h file.
1171258Smlf  * cport_event_flags holds SATA_EVNT_* flags defined in this file and in
1181258Smlf  * sata_hba.h file.
1191258Smlf  * cport_dev_type holds SATA_DTYPE_* types defined in sata_hba.h file.
1201258Smlf  */
1211258Smlf struct sata_cport_info {
1221258Smlf 	sata_address_t		cport_addr;	/* this port SATA address */
1231258Smlf 	kmutex_t		cport_mutex;	/* port mutex */
1241258Smlf 
1251258Smlf 						/*
1261258Smlf 						 * Port state flags
1271258Smlf 						 * SATA_STATE_UNKNOWN
1281258Smlf 						 * SATA_STATE_PROBING
1291258Smlf 						 * SATA_STATE_PROBED
1301258Smlf 						 * SATA_STATE_READY
1311258Smlf 						 * SATA_PSTATE_PWRON
1321258Smlf 						 * SATA_PSTATE_PWROFF
1331258Smlf 						 * SATA_PSTATE_SHUTDOWN
1341258Smlf 						 * SATA_PSTATE_FAILED
1351258Smlf 						 */
1361258Smlf 	uint32_t		cport_state;
1371258Smlf 
1381258Smlf 						/*
1391258Smlf 						 * Port event flags:
1401258Smlf 						 * SATA_EVNT_DEVICE_ATTACHED
1411258Smlf 						 * SATA_EVNT_DEVICE_DETACHED
1421258Smlf 						 * SATA_EVNT_LINK_LOST
1431258Smlf 						 * SATA_EVNT_LINK_ESTABLISHED
1441258Smlf 						 * SATA_EVNT_PORT_FAILED
1451258Smlf 						 * SATA_EVNT_PWR_LEVEL_CHANGED
1461258Smlf 						 */
1471258Smlf 	uint32_t		cport_event_flags;
1481258Smlf 
1491258Smlf 	struct sata_port_scr	cport_scr;	/* Port status and ctrl regs */
1501258Smlf 
1511258Smlf 						/*
1521258Smlf 						 * Attached device type:
1531258Smlf 						 * SATA_DTYPE_NONE
1541258Smlf 						 * SATA_DTYPE_ATADISK
1551258Smlf 						 * SATA_DTYPE_ATAPICD
1568010SYing.Tian@Sun.COM 						 * SATA_DTYPE_ATAPITAPE
1578317SYing.Tian@Sun.COM 						 * SATA_DTYPE_ATAPIDISK
1581258Smlf 						 * SATA_DTYPE_PMULT
1591258Smlf 						 * SATA_DTYPE_UNKNOWN
1601258Smlf 						 */
1611258Smlf 	uint32_t		cport_dev_type;
1621258Smlf 	union {
1631258Smlf 	    struct sata_drive_info *cport_sata_drive; /* Attached drive info */
1641258Smlf 	    struct sata_pmult_info *cport_sata_pmult; /* Attached Port Mult */
1651258Smlf 	} 			cport_devp;
1661258Smlf 						/* lbolt value at link lost */
1671258Smlf 	clock_t			cport_link_lost_time;
1682960Spawelw 						/* lbolt value @ dev attached */
1692960Spawelw 	clock_t			cport_dev_attach_time;
1701258Smlf 
1711258Smlf 	struct sata_port_stats	cport_stats;	/* Port statistics */
1723935Spawelw 
1733935Spawelw 	boolean_t		cport_tgtnode_clean; /* Target node usable */
1741258Smlf };
1751258Smlf 
1761258Smlf typedef struct sata_cport_info sata_cport_info_t;
1771258Smlf 
1781258Smlf /*
1791258Smlf  * Attached SATA drive info and state.
1801258Smlf  * This structure is pointed to by sata_cport_info's cport_sata_drive field
1811258Smlf  * when a drive is attached directly to a controller device port.
1821258Smlf  */
1831258Smlf struct sata_drive_info {
1841258Smlf 	sata_address_t	satadrv_addr;		/* this drive SATA address */
1851258Smlf 
1861258Smlf 						/*
1871258Smlf 						 * Drive state flags
1881258Smlf 						 * SATA_STATE_UNKNOWN
1891258Smlf 						 * SATA_STATE_PROBING
1901258Smlf 						 * SATA_STATE_PROBED
1911258Smlf 						 * SATA_STATE_READY
1921258Smlf 						 * SATA_DSTATE_PWR_ACTIVE
1931258Smlf 						 * SATA_DSTATE_PWR_IDLE
1941258Smlf 						 * SATA_DSTATE_RESET
1951258Smlf 						 * SATA_DSTATE_FAILED
1961258Smlf 						 */
1971258Smlf 	uint32_t	satadrv_state;
1981258Smlf 
1991258Smlf 						/*
2001258Smlf 						 * drive event flags:
2011258Smlf 						 * SATA_EVNT_DRIVE_RESET
2021258Smlf 						 */
2031258Smlf 	uint32_t	satadrv_event_flags;
2046539Spawelw 						/*
2056539Spawelw 						 * lbolt value @ start of
2066539Spawelw 						 * device reset processing
2076539Spawelw 						 */
2086539Spawelw 	clock_t		satadrv_reset_time;
2091258Smlf 						/*
2101258Smlf 						 * Attached device type:
2111258Smlf 						 * SATA_DTYPE_ATADISK
2121258Smlf 						 * SATA_DTYPE_ATAPICD
2138010SYing.Tian@Sun.COM 						 * SATA_DTYPE_ATAPITAPE
2148317SYing.Tian@Sun.COM 						 * SATA_DTYPE_ATAPIDISK
2151258Smlf 						 */
2161258Smlf 	uint32_t	satadrv_type;
2171258Smlf 
2181258Smlf 	uint32_t	satadrv_status_reg;	/* drive status reg */
2191258Smlf 	uint32_t	satadrv_error_reg;	/* drive error reg */
2201258Smlf 	uint16_t	satadrv_features_support; /* drive features support */
2211258Smlf 	uint16_t	satadrv_queue_depth;    /* drive queue depth */
2224862SUnknown 	uint16_t	satadrv_atapi_cdb_len;	/* atapi supported cdb length */
2234862SUnknown 	uint16_t	satadrv_atapi_trans_ver; /* atapi transport version */
2241258Smlf 	uint16_t	satadrv_settings;	/* drive settings flags */
2253821Sls24207 	uint16_t	satadrv_features_enabled; /* drive features enabled */
2261258Smlf 	uint64_t	satadrv_capacity;	/* drive capacity */
2274862SUnknown 	uint64_t	satadrv_max_queue_depth; /* maximum queue depth */
2281258Smlf 	sata_id_t	satadrv_id;		/* Device Identify Data */
2291258Smlf 	struct sata_drive_stats satadrv_stats;	/* drive statistics */
23010131SJane.Chu@Sun.COM 
23110131SJane.Chu@Sun.COM 	/*
23210131SJane.Chu@Sun.COM 	 * saved standby timer
23310131SJane.Chu@Sun.COM 	 * [0] - [3] = high - low
23410131SJane.Chu@Sun.COM 	 */
23510131SJane.Chu@Sun.COM 	uint8_t		satadrv_standby_timer[4];
23610131SJane.Chu@Sun.COM 	uint8_t		satadrv_power_level; /* saved power level */
2371258Smlf };
2381258Smlf 
2391258Smlf typedef struct sata_drive_info sata_drive_info_t;
2401258Smlf 
2411258Smlf _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_drive_info))
2421258Smlf 
2431258Smlf 
2441258Smlf /* Port Multiplier & host port info and state */
2451258Smlf struct sata_pmult_info {
2461258Smlf 	sata_address_t	pmult_addr;		/* this PMult SATA Address */
2471258Smlf 						/*
2481258Smlf 						 * PMult state flags
2491258Smlf 						 * SATA_STATE_UNKNOWN
2501258Smlf 						 * SATA_STATE_PROBING
2511258Smlf 						 * SATA_STATE_PROBED
2521258Smlf 						 * SATA_STATE_READY
2531258Smlf 						 * SATA_PSTATE_FAILED
2541258Smlf 						 */
2551258Smlf 	uint32_t	pmult_state;
2561258Smlf 	uint32_t	pmult_event_flags;	/* Undefined for now */
25710318SXiao-Yu.Zhang@Sun.COM 	struct sata_pmult_gscr pmult_gscr;	/* PMult GSCR block */
2581258Smlf 	uint32_t	pmult_num_dev_ports; 	/* Number of data ports */
2591258Smlf 	struct sata_pmport_info	*pmult_dev_port[SATA_MAX_PMPORTS - 1];
2601258Smlf };
2611258Smlf 
2621258Smlf typedef	struct sata_pmult_info sata_pmult_info_t;
2631258Smlf 
26410318SXiao-Yu.Zhang@Sun.COM _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pmult_info))
26510318SXiao-Yu.Zhang@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
26610318SXiao-Yu.Zhang@Sun.COM     sata_pmult_info::pmult_dev_port))
26710318SXiao-Yu.Zhang@Sun.COM 
2681258Smlf /* Port Multiplier's device port info & state */
2691258Smlf struct sata_pmport_info {
2701258Smlf 	sata_address_t	pmport_addr;		/* this SATA port address */
2711258Smlf 	kmutex_t	pmport_mutex;		/* pmult device port mutex */
2721258Smlf 
2731258Smlf 						/*
2741258Smlf 						 * Port state flags
2751258Smlf 						 * SATA_STATE_UNKNOWN
2761258Smlf 						 * SATA_STATE_PROBING
2771258Smlf 						 * SATA_STATE_PROBED
2781258Smlf 						 * SATA_STATE_READY
2791258Smlf 						 * SATA_PSTATE_PWRON
2801258Smlf 						 * SATA_PSTATE_PWROFF
2811258Smlf 						 * SATA_PSTATE_SHUTDOWN
2821258Smlf 						 * SATA_PSTATE_FAILED
2831258Smlf 						 */
2841258Smlf 	uint32_t	pmport_state;
2851258Smlf 
2861258Smlf 						/*
2871258Smlf 						 * Port event flags:
2881258Smlf 						 * SATA_EVNT_DEVICE_ATTACHED
2891258Smlf 						 * SATA_EVNT_DEVICE_DETACHED
2901258Smlf 						 * SATA_EVNT_LINK_LOST
2911258Smlf 						 * SATA_EVNT_LINK_ESTABLISHED
2921258Smlf 						 * SATA_EVNT_PORT_FAILED
2931258Smlf 						 * SATA_EVNT_PWR_LEVEL_CHANGED
2941258Smlf 						 */
2951258Smlf 	uint32_t	pmport_event_flags;
2961258Smlf 
2971258Smlf 	struct sata_port_scr pmport_scr;	/* PMult device port scr */
2981258Smlf 
2991258Smlf 						/*
3001258Smlf 						 * Attached device type:
3011258Smlf 						 * SATA_DTYPE_NONE
3021258Smlf 						 * SATA_DTYPE_ATADISK
3031258Smlf 						 * SATA_DTYPE_ATAPICD
3048010SYing.Tian@Sun.COM 						 * SATA_DTYPE_ATAPITAPE
3058317SYing.Tian@Sun.COM 						 * SATA_DTYPE_ATAPIDISK
3061258Smlf 						 * SATA_DTYPE_UNKNOWN
3071258Smlf 						 */
3081258Smlf 	uint32_t	pmport_dev_type;
3091258Smlf 
3101258Smlf 	struct sata_drive_info	*pmport_sata_drive; /* Attached drive info */
3111258Smlf 
3121258Smlf 						/* lbolt value at link lost */
3131258Smlf 	clock_t		pmport_link_lost_time;
3142960Spawelw 						/* lbolt value @ dev attached */
3152960Spawelw 	clock_t		pmport_dev_attach_time;
3161258Smlf 
3171258Smlf 	struct sata_port_stats	pmport_stats;	/* Port statistics */
3183935Spawelw 
3193935Spawelw 	boolean_t	pmport_tgtnode_clean;	/* Target node usable */
3201258Smlf };
3211258Smlf 
3221258Smlf typedef	struct sata_pmport_info sata_pmport_info_t;
3231258Smlf 
3241258Smlf /*
32510131SJane.Chu@Sun.COM  * sata drive's power level
32610131SJane.Chu@Sun.COM  * default value is active
32710131SJane.Chu@Sun.COM  */
32810131SJane.Chu@Sun.COM #define	SATA_POWER_ACTIVE	0x00
32910131SJane.Chu@Sun.COM #define	SATA_POWER_IDLE		0x01
33010131SJane.Chu@Sun.COM #define	SATA_POWER_STANDBY	0x02
33110131SJane.Chu@Sun.COM #define	SATA_POWER_STOPPED	0x03
33210131SJane.Chu@Sun.COM 
33310131SJane.Chu@Sun.COM /*
33410131SJane.Chu@Sun.COM  * pm-capable value definition according to PSARC 2009/310
33510131SJane.Chu@Sun.COM  */
33610131SJane.Chu@Sun.COM #define	SATA_CAP_POWER_CONDITON	PM_CAPABLE_SPC4
33710131SJane.Chu@Sun.COM #define	SATA_CAP_SMART_PAGE	PM_CAPABLE_SMART_LOG
33810131SJane.Chu@Sun.COM #define	SATA_CAP_LOG_SENSE	PM_CAPABLE_LOG_SUPPORTED
33910131SJane.Chu@Sun.COM 
34010131SJane.Chu@Sun.COM /*
3411258Smlf  * Port SSTATUS register (sata_port_scr sport_sstatus field).
3421258Smlf  * Link bits are valid only in port active state.
3431258Smlf  */
3441258Smlf #define	SATA_PORT_DEVLINK_UP	0x00000103	/* Link with dev established */
3451258Smlf #define	SATA_PORT_DEVLINK_UP_MASK 0x0000010F	/* Mask for link bits */
3461258Smlf 
3471258Smlf /*
3481258Smlf  * Port state clear mask (cport_state and pmport_state fields).
3491258Smlf  * SATA_PSTATE_SHUTDOWN and power state are preserved.
3501258Smlf  */
3511258Smlf #define	SATA_PORT_STATE_CLEAR_MASK	(~(SATA_PSTATE_SHUTDOWN))
3521258Smlf 
3531258Smlf /*
3541258Smlf  * Valid i.e.supported device types mask (cport_dev_type, satadrv_type,
3551258Smlf  * pmult_dev_type fields).
3564862SUnknown  * ATA disks and ATAPI CD/DVD now.
3571258Smlf  */
3584862SUnknown #define	SATA_VALID_DEV_TYPE	(SATA_DTYPE_ATADISK | \
3598010SYing.Tian@Sun.COM 				SATA_DTYPE_ATAPICD | \
3608317SYing.Tian@Sun.COM 				SATA_DTYPE_ATAPITAPE | \
3618317SYing.Tian@Sun.COM 				SATA_DTYPE_ATAPIDISK)
3621258Smlf 
3631258Smlf /*
3641258Smlf  * Device feature_support (satadrv_features_support)
3651258Smlf  */
3661258Smlf #define	SATA_DEV_F_DMA			0x01
3671258Smlf #define	SATA_DEV_F_LBA28		0x02
3681258Smlf #define	SATA_DEV_F_LBA48		0x04
3691258Smlf #define	SATA_DEV_F_NCQ			0x08
3701258Smlf #define	SATA_DEV_F_SATA1		0x10
3711258Smlf #define	SATA_DEV_F_SATA2		0x20
3721940Sls24207 #define	SATA_DEV_F_TCQ			0x40	/* Non NCQ tagged queuing */
3731258Smlf 
3741258Smlf /*
3753821Sls24207  * Device features enabled (satadrv_features_enabled)
3763821Sls24207  */
3773821Sls24207 #define	SATA_DEV_F_E_TAGGED_QING	0x01	/* Tagged queuing enabled */
3783821Sls24207 #define	SATA_DEV_F_E_UNTAGGED_QING	0x02	/* Untagged queuing enabled */
3793821Sls24207 
3803821Sls24207 /*
3811258Smlf  * Drive settings flags (satdrv_settings)
3821258Smlf  */
3831258Smlf #define	SATA_DEV_READ_AHEAD		0x0001	/* Read Ahead enabled */
3841258Smlf #define	SATA_DEV_WRITE_CACHE		0x0002	/* Write cache ON */
3854862SUnknown #define	SATA_DEV_DMA			0x0004	/* DMA selected */
3861258Smlf #define	SATA_DEV_SERIAL_FEATURES 	0x8000	/* Serial ATA feat. enabled */
3871258Smlf #define	SATA_DEV_ASYNCH_NOTIFY		0x2000	/* Asynch-event enabled */
3884862SUnknown #define	SATA_DEV_RMSN			0x0100	/* Rem Media Stat Notfc enbl */
3891258Smlf 
3901258Smlf /*
3911258Smlf  * Internal event and flags.
3921258Smlf  * These flags are set in the *_event_flags fields of various structures.
3931258Smlf  * Events and lock flags defined below are used internally by the
3941258Smlf  * SATA framework (they are not reported by SATA HBA drivers).
3951258Smlf  */
3961258Smlf #define	SATA_EVNT_MAIN			0x80000000
3971258Smlf #define	SATA_EVNT_SKIP			0x40000000
3981258Smlf #define	SATA_EVNT_INPROC_DEVICE_RESET	0x08000000
3991258Smlf #define	SATA_EVNT_CLEAR_DEVICE_RESET	0x04000000
4003935Spawelw #define	SATA_EVNT_TARGET_NODE_CLEANUP	0x00000100
4015832Spawelw #define	SATA_EVNT_AUTOONLINE_DEVICE	0x00000200
4021258Smlf 
4031258Smlf /*
4041258Smlf  * Lock flags - used to serialize configuration operations
4051258Smlf  * on ports and devices.
4061258Smlf  * SATA_EVNT_LOCK_PORT_BUSY is set by event daemon to prevent
4071258Smlf  * simultaneous cfgadm operations.
4081258Smlf  * SATA_APCTL_LOCK_PORT_BUSY is set by cfgadm ioctls to prevent
4091258Smlf  * simultaneous event processing.
4101258Smlf  */
4111258Smlf #define	SATA_EVNT_LOCK_PORT_BUSY	0x00800000
4121258Smlf #define	SATA_APCTL_LOCK_PORT_BUSY	0x00400000
4131258Smlf 
4141258Smlf /* Mask for port events */
4151258Smlf #define	SATA_EVNT_PORT_EVENTS		(SATA_EVNT_DEVICE_ATTACHED | \
4161258Smlf 					SATA_EVNT_DEVICE_DETACHED | \
4171258Smlf 					SATA_EVNT_LINK_LOST | \
4181258Smlf 					SATA_EVNT_LINK_ESTABLISHED | \
41910318SXiao-Yu.Zhang@Sun.COM 					SATA_EVNT_PMULT_LINK_CHANGED | \
4203935Spawelw 					SATA_EVNT_PORT_FAILED | \
4215832Spawelw 					SATA_EVNT_TARGET_NODE_CLEANUP | \
4225832Spawelw 					SATA_EVNT_AUTOONLINE_DEVICE)
4231258Smlf /* Mask for drive events */
4243935Spawelw #define	SATA_EVNT_DRIVE_EVENTS		(SATA_EVNT_DEVICE_RESET | \
4253935Spawelw 					SATA_EVNT_INPROC_DEVICE_RESET)
4261258Smlf #define	SATA_EVNT_CONTROLLER_EVENTS	SATA_EVNT_PWR_LEVEL_CHANGED
4271258Smlf 
4285832Spawelw /* Delays and timeout duration definitions */
4291258Smlf #define	SATA_EVNT_DAEMON_SLEEP_TIME	50000	/* 50 ms */
4301258Smlf #define	SATA_EVNT_DAEMON_TERM_TIMEOUT	100000	/* 100 ms */
4311258Smlf #define	SATA_EVNT_DAEMON_TERM_WAIT	60000000 /* 60 s */
4321258Smlf #define	SATA_EVNT_LINK_LOST_TIMEOUT	1000000	/* 1 s */
4336539Spawelw 
4346539Spawelw #define	SATA_DEV_IDENTIFY_TIMEOUT	60000000 /* 60 s, device enumeration */
4356539Spawelw #define	SATA_DEV_REPROBE_TIMEOUT	30000000  /* 30 s, dev resp after rst */
4366539Spawelw #define	SATA_DEV_RETRY_DLY		10000	/* 10 ms */
4371258Smlf 
4382960Spawelw /* DEVICE IDENTIFY and device initialization retry delay */
4392960Spawelw #define	SATA_DEV_IDENTIFY_RETRY		1
4402960Spawelw #define	SATA_DEV_IDENTIFY_NORETRY	0
4411258Smlf 
4421258Smlf /*
4431258Smlf  * sata_scsi's hba_open_flag: field indicating open devctl instance.
4441258Smlf  *	0 = closed, 1 = shared open, 2 = exclusive open.
4451258Smlf  */
4461258Smlf #define	SATA_DEVCTL_CLOSED	0
4471258Smlf #define	SATA_DEVCTL_SOPENED	1
4481258Smlf #define	SATA_DEVCTL_EXOPENED	2
4491258Smlf 
4501258Smlf /*
4511258Smlf  * sata_pkt_txlate structure contains info about resources allocated
4521258Smlf  * for the packet
4531258Smlf  * Address of this structure is stored in scsi_pkt.pkt_ha_private and
4541258Smlf  * in sata_pkt.sata_hba_private fields, so all three strucures are
4551258Smlf  * cross-linked, with sata_pkt_txlate as a centerpiece.
4561258Smlf  */
4571258Smlf 
4581258Smlf typedef struct sata_pkt_txlate {
4591258Smlf 	struct sata_hba_inst	*txlt_sata_hba_inst;
4601258Smlf 	struct scsi_pkt		*txlt_scsi_pkt;
4611258Smlf 	struct sata_pkt		*txlt_sata_pkt;
4621258Smlf 	ddi_dma_handle_t	txlt_buf_dma_handle;
4631258Smlf 	uint_t			txlt_flags;	/* data-in / data-out */
4641258Smlf 	uint_t			txlt_num_dma_win; /* number of DMA windows */
4651258Smlf 	uint_t			txlt_cur_dma_win; /* current DMA window */
4661258Smlf 
4671258Smlf 				/* cookies in the current DMA window */
4681258Smlf 	uint_t			txlt_curwin_num_dma_cookies;
4691258Smlf 
4703935Spawelw 				/* processed dma cookies in current DMA win */
4711258Smlf 	uint_t			txlt_curwin_processed_dma_cookies;
4721258Smlf 	size_t			txlt_total_residue;
4733935Spawelw 	ddi_dma_cookie_t	txlt_dma_cookie; /* default dma cookie */
4741258Smlf 	int			txlt_dma_cookie_list_len; /* alloc list len */
4751258Smlf 	ddi_dma_cookie_t 	*txlt_dma_cookie_list; /* dma cookie list */
4761258Smlf 	int			txlt_num_dma_cookies; /* dma cookies in list */
4772539Spawelw 
4782539Spawelw 				/* temporary buffer access handle */
4792539Spawelw 	ddi_acc_handle_t	txlt_tmp_buf_handle;
4802539Spawelw 	caddr_t			txlt_tmp_buf;	/* temp buffer address */
4811258Smlf } sata_pkt_txlate_t;
4821258Smlf 
4831258Smlf _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt_txlate))
4841258Smlf _NOTE(SCHEME_PROTECTS_DATA("unshared data", scsi_pkt))
4851258Smlf 
48611222SAlan.Perry@Sun.COM /* Length of largest sense buffer used by sata */
48711222SAlan.Perry@Sun.COM #define	SATA_MAX_SENSE_LEN	MAX(sizeof (struct scsi_arq_status), \
48811222SAlan.Perry@Sun.COM     sizeof (struct scsi_arq_status) - sizeof (struct scsi_extended_sense) + \
48911222SAlan.Perry@Sun.COM     sizeof (struct scsi_descr_sense_hdr) + \
49011222SAlan.Perry@Sun.COM     MAX(sizeof (struct scsi_cmd_specific_sense_descr), \
49111222SAlan.Perry@Sun.COM     sizeof (struct scsi_ata_status_ret_sense_descr)))
49211222SAlan.Perry@Sun.COM 
49311222SAlan.Perry@Sun.COM /*
49411222SAlan.Perry@Sun.COM  * Sense Data structure for ATA Pass Through
49511222SAlan.Perry@Sun.COM  * This is the entire sense data block passed back up to scsi.  It is
49611222SAlan.Perry@Sun.COM  * effectively the scsi_arq_status structure for ATA Sense Return descriptor
49711222SAlan.Perry@Sun.COM  * format sense data.
49811222SAlan.Perry@Sun.COM  */
49911222SAlan.Perry@Sun.COM struct sata_apt_sense_data {
50011222SAlan.Perry@Sun.COM 	struct scsi_status				apt_status;
50111222SAlan.Perry@Sun.COM 	struct scsi_status				apt_rqpkt_status;
50211222SAlan.Perry@Sun.COM 	uchar_t						apt_rqpkt_reason;
50311222SAlan.Perry@Sun.COM 	uchar_t						apt_rqpkt_resid;
50411222SAlan.Perry@Sun.COM 	uint_t						apt_rqpkt_state;
50511222SAlan.Perry@Sun.COM 	uint_t						apt_rqpkt_statistics;
50611222SAlan.Perry@Sun.COM 	struct scsi_descr_sense_hdr			apt_sd_hdr;
50711222SAlan.Perry@Sun.COM 	struct scsi_ata_status_ret_sense_descr		apt_sd_sense;
50811222SAlan.Perry@Sun.COM };
50911222SAlan.Perry@Sun.COM 
5101258Smlf 
5111258Smlf /*
5121258Smlf  * Additional scsi sense code definitions.
5134862SUnknown  * These definition should eventually be moved to scsi header file
5144862SUnknown  * usr/src/uts/common/sys/scsi/generic/sense.h
5151258Smlf  */
5164862SUnknown #define	SD_SCSI_ASC_NO_ADD_SENSE			0x00
51711222SAlan.Perry@Sun.COM #define	SD_SCSI_ASC_ATP_INFO_AVAIL			0x00
5184862SUnknown #define	SD_SCSI_ASC_LU_NOT_READY			0x04
51911222SAlan.Perry@Sun.COM #define	SD_SCSI_ASC_LU_NOT_RESPONSE			0x05
5205832Spawelw #define	SD_SCSI_ASC_WRITE_ERR				0x0c
5215832Spawelw #define	SD_SCSI_ASC_UNREC_READ_ERR			0x11
5224862SUnknown #define	SD_SCSI_ASC_INVALID_COMMAND_CODE		0x20
5234862SUnknown #define	SD_SCSI_ASC_LBA_OUT_OF_RANGE			0x21
5244862SUnknown #define	SD_SCSI_ASC_INVALID_FIELD_IN_CDB		0x24
52510131SJane.Chu@Sun.COM #define	SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST	0x26
52611222SAlan.Perry@Sun.COM #define	SD_SCSI_ASC_WRITE_PROTECTED			0x27
52711222SAlan.Perry@Sun.COM #define	SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED		0x28
5284862SUnknown #define	SD_SCSI_ASC_RESET				0x29
52910131SJane.Chu@Sun.COM #define	SD_SCSI_ASC_CMD_SEQUENCE_ERR			0x2c
53011222SAlan.Perry@Sun.COM #define	SD_SCSI_ASC_MEDIUM_NOT_PRESENT			0x3a
53111222SAlan.Perry@Sun.COM #define	SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED		0x39
53211222SAlan.Perry@Sun.COM #define	SD_SCSI_ASC_INTERNAL_TARGET_FAILURE		0x44
53311222SAlan.Perry@Sun.COM #define	SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR			0x47
53411222SAlan.Perry@Sun.COM #define	SD_SCSI_ASC_OP_MEDIUM_REM_REQ			0x5a
53510131SJane.Chu@Sun.COM #define	SD_SCSI_ASC_LOW_POWER_CONDITION_ON		0x5e
5361258Smlf 
5371258Smlf 
5381258Smlf /* SCSI defs missing from scsi headers */
5391258Smlf /* Missing from sys/scsi/generic/commands.h */
5401258Smlf #define	SCMD_SYNCHRONIZE_CACHE_G1		0x91
5411258Smlf /*
5421258Smlf  * Missing from sys/scsi/impl/mode.h, although defined
5431258Smlf  * in sys/scsi/targets/sddefs.h as MODEPAGE_ERR_RECOV
5441258Smlf  */
5451258Smlf #define	MODEPAGE_RW_ERRRECOV			0x01 /* read/write recovery */
546*12017SAlan.Perry@Sun.COM /* Missing from sys/scsi/impl/commands.h */
547*12017SAlan.Perry@Sun.COM #define	SCSI_READ_CAPACITY16_MAX_LBA		0xfffffffffffffffe
5481258Smlf 
5491258Smlf /*
55010131SJane.Chu@Sun.COM  * medium access command
55110131SJane.Chu@Sun.COM  */
55210131SJane.Chu@Sun.COM #define	SATA_IS_MEDIUM_ACCESS_CMD(cmd) \
55310131SJane.Chu@Sun.COM 	(((cmd) == SCMD_READ) || ((cmd) == SCMD_WRITE) || \
55410131SJane.Chu@Sun.COM 	((cmd) == SCMD_READ_G1) || ((cmd) == SCMD_WRITE_G1) || \
55510131SJane.Chu@Sun.COM 	((cmd) == SCMD_READ_G4) || ((cmd) == SCMD_WRITE_G4) || \
55610131SJane.Chu@Sun.COM 	((cmd) == SCMD_READ_G5) || ((cmd) == SCMD_WRITE_G5) || \
55710131SJane.Chu@Sun.COM 	((cmd) == SCMD_VERIFY) || ((cmd) == SCMD_VERIFY_G4) || \
55810131SJane.Chu@Sun.COM 	((cmd) == SCMD_VERIFY_G5) || ((cmd) == 0x7f) /* VERIFY(32) */|| \
55910131SJane.Chu@Sun.COM 	((cmd) == SCMD_SYNCHRONIZE_CACHE) || ((cmd) == SCMD_SPACE_G4) || \
56010131SJane.Chu@Sun.COM 	((cmd) == SCMD_READ_POSITION) || \
56110131SJane.Chu@Sun.COM 	((cmd) == 0x90) /* PRE-FETCH(16) */ || \
56210131SJane.Chu@Sun.COM 	((cmd) == SCMD_READ_DEFECT_LIST) || \
56310131SJane.Chu@Sun.COM 	((cmd) == 0xb7) /* READ DEFECT DATA */ || \
56410131SJane.Chu@Sun.COM 	((cmd) == SCMD_READ_LONG) || ((cmd) == SCMD_SVC_ACTION_IN_G4) || \
56510131SJane.Chu@Sun.COM 	((cmd) == SCMD_WRITE_LONG) || ((cmd) == SCMD_SVC_ACTION_OUT_G4) || \
56610131SJane.Chu@Sun.COM 	((cmd) == 0x41) || ((cmd) == 0x93) || /* WRITE SAME */ \
56710131SJane.Chu@Sun.COM 	((cmd) == 0x52) || ((cmd) == 0x50) || /* XDREAD & XDWRITE */ \
56810131SJane.Chu@Sun.COM 	((cmd) == 0x53) || ((cmd) == 0x51) || /* XDWRITEREAD & XPWRITE */ \
56910131SJane.Chu@Sun.COM 	((cmd) == 0x7f))
57010131SJane.Chu@Sun.COM 
57110131SJane.Chu@Sun.COM /*
5721258Smlf  * Macros for accessing various structure fields
5731258Smlf  */
5741258Smlf 
5751258Smlf #define	SATA_TRAN(sata_hba_inst) \
5761258Smlf 	sata_hba_inst->satahba_tran
5771258Smlf 
5781258Smlf #define	SATA_DIP(sata_hba_inst) \
5791258Smlf 	sata_hba_inst->satahba_dip
5801258Smlf 
5811258Smlf #define	SATA_NUM_CPORTS(sata_hba_inst) \
5821258Smlf 	sata_hba_inst->satahba_tran->sata_tran_hba_num_cports
5831258Smlf 
5841258Smlf #define	SATA_QDEPTH(sata_hba_inst) \
5851258Smlf 	sata_hba_inst->satahba_tran->sata_tran_hba_qdepth
5861258Smlf 
5871258Smlf #define	SATA_FEATURES(sata_hba_inst) \
5881258Smlf 	sata_hba_inst->satahba_tran->sata_tran_hba_features_support
5891258Smlf 
5901258Smlf #define	SATA_DMA_ATTR(sata_hba_inst) \
5911258Smlf 	sata_hba_inst->satahba_tran->sata_tran_hba_dma_attr
5921258Smlf 
5931258Smlf #define	SATA_START_FUNC(sata_hba_inst) \
5941258Smlf 	sata_hba_inst->satahba_tran->sata_tran_start
5951258Smlf 
5961258Smlf #define	SATA_ABORT_FUNC(sata_hba_inst) \
5971258Smlf 	sata_hba_inst->satahba_tran->sata_tran_abort
5981258Smlf 
5991258Smlf #define	SATA_RESET_DPORT_FUNC(sata_hba_inst) \
6001258Smlf 	sata_hba_inst->satahba_tran->sata_tran_reset_dport
6011258Smlf 
6021258Smlf #define	SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) \
6031258Smlf 	(sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
6041258Smlf 	NULL : \
6051258Smlf 	sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
6061258Smlf 	sata_tran_port_deactivate)
6071258Smlf 
6081258Smlf #define	SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) \
6091258Smlf 	(sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
6101258Smlf 	NULL : \
6111258Smlf 	sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
6121258Smlf 	sata_tran_port_activate)
6131258Smlf 
6141258Smlf #define	SATA_PROBE_PORT_FUNC(sata_hba_inst) \
6151258Smlf 	sata_hba_inst->satahba_tran->sata_tran_probe_port
6161258Smlf 
6171258Smlf #define	SATA_SELFTEST_FUNC(sata_hba_inst) \
6181258Smlf 	sata_hba_inst->satahba_tran->sata_tran_selftest
6191258Smlf 
6201258Smlf #define	SATA_CPORT_MUTEX(sata_hba_inst, cport) \
6211258Smlf 	sata_hba_inst->satahba_dev_port[cport]->cport_mutex
6221258Smlf 
6231258Smlf #define	SATA_CPORT_INFO(sata_hba_inst, cport) \
6241258Smlf 	sata_hba_inst->satahba_dev_port[cport]
6251258Smlf 
6261258Smlf #define	SATA_CPORT_STATE(sata_hba_inst, cport) \
6271258Smlf 	sata_hba_inst->satahba_dev_port[cport]->cport_state
6281258Smlf 
6293935Spawelw #define	SATA_CPORT_EVENT_FLAGS(sata_hba_inst, cport) \
6303935Spawelw 	sata_hba_inst->satahba_dev_port[cport]->cport_event_flags
6313935Spawelw 
6321258Smlf #define	SATA_CPORT_SCR(sata_hba_inst, cport) \
6331258Smlf 	sata_hba_inst->satahba_dev_port[cport]->cport_scr
6341258Smlf 
6351258Smlf #define	SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) \
6361258Smlf 	sata_hba_inst->satahba_dev_port[cport]->cport_dev_type
6371258Smlf 
6381258Smlf #define	SATA_CPORT_DRV_INFO(sata_hba_inst, cport) \
6391258Smlf 	sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_drive
6401258Smlf 
6411258Smlf #define	SATA_CPORTINFO_DRV_TYPE(cportinfo) \
6421258Smlf 	cportinfo->cport_dev_type
6431258Smlf 
6441258Smlf #define	SATA_CPORTINFO_DRV_INFO(cportinfo) \
6451258Smlf 	cportinfo->cport_devp.cport_sata_drive
6461258Smlf 
6471258Smlf #define	SATA_CPORTINFO_PMULT_INFO(cportinfo) \
6481258Smlf 	cportinfo->cport_devp.cport_sata_pmult
6491258Smlf 
6501258Smlf #define	SATA_PMULT_INFO(sata_hba_inst, cport) \
6511258Smlf 	sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_pmult
6521258Smlf 
6531258Smlf #define	SATA_NUM_PMPORTS(sata_hba_inst, cport) \
6541258Smlf 	sata_hba_inst->satahba_dev_port[cport]->\
6551258Smlf 	cport_devp.cport_sata_pmult->pmult_num_dev_ports
6561258Smlf 
65710318SXiao-Yu.Zhang@Sun.COM #define	SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport) \
65810318SXiao-Yu.Zhang@Sun.COM 	sata_hba_inst->satahba_dev_port[cport]->\
65910318SXiao-Yu.Zhang@Sun.COM 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_mutex
66010318SXiao-Yu.Zhang@Sun.COM 
6611258Smlf #define	SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) \
6621258Smlf 	sata_hba_inst->satahba_dev_port[cport]->\
6631258Smlf 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]
6641258Smlf 
6651258Smlf #define	SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport) \
6661258Smlf 	sata_hba_inst->satahba_dev_port[cport]->\
6671258Smlf 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\
6681258Smlf 	pmport_sata_drive
6691258Smlf 
6701258Smlf #define	SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) \
6711258Smlf 	sata_hba_inst->satahba_dev_port[cport]->\
6721258Smlf 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_state
6731258Smlf 
6741258Smlf #define	SATA_PMPORT_SCR(sata_hba_inst, cport, pmport) \
6751258Smlf 	sata_hba_inst->satahba_dev_port[cport]->\
6761258Smlf 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_scr
6771258Smlf 
6781258Smlf #define	SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport) \
6791258Smlf 	sata_hba_inst->satahba_dev_port[cport]->\
6801258Smlf 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_dev_type
6811258Smlf 
68210318SXiao-Yu.Zhang@Sun.COM #define	SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, cport, pmport) \
68310318SXiao-Yu.Zhang@Sun.COM 	sata_hba_inst->satahba_dev_port[cport]->\
68410318SXiao-Yu.Zhang@Sun.COM 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\
68510318SXiao-Yu.Zhang@Sun.COM 	pmport_event_flags
68610318SXiao-Yu.Zhang@Sun.COM 
6875832Spawelw #define	SATA_PMPORTINFO_DRV_TYPE(pmportinfo) \
6885832Spawelw 	pmportinfo->pmport_dev_type
6895832Spawelw 
6905832Spawelw #define	SATA_PMPORTINFO_DRV_INFO(pmportinfo) \
6915832Spawelw 	pmportinfo->pmport_sata_drive
6925832Spawelw 
6931258Smlf #define	SATA_TXLT_HBA_INST(spx) \
6941258Smlf 	spx->txlt_sata_hba_inst
6951258Smlf 
6961258Smlf #define	SATA_TXLT_CPORT(spx) \
6971258Smlf 	spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport
6981258Smlf 
69910318SXiao-Yu.Zhang@Sun.COM #define	SATA_TXLT_PMPORT(spx) \
70010318SXiao-Yu.Zhang@Sun.COM 	spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport
70110318SXiao-Yu.Zhang@Sun.COM 
70210318SXiao-Yu.Zhang@Sun.COM #define	SATA_TXLT_QUAL(spx) \
70310318SXiao-Yu.Zhang@Sun.COM 	spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual
70410318SXiao-Yu.Zhang@Sun.COM 
7051258Smlf #define	SATA_TXLT_CPORT_MUTEX(spx) \
7061258Smlf 	spx->txlt_sata_hba_inst->\
7071258Smlf 	satahba_dev_port[spx->txlt_sata_pkt->\
7081258Smlf 	satapkt_device.satadev_addr.cport]->cport_mutex
7091258Smlf 
7101781Spawelw #define	SATA_TXLT_TASKQ(spx) \
7111781Spawelw 	spx->txlt_sata_hba_inst->\
7121781Spawelw 	satahba_taskq
7131781Spawelw 
7141258Smlf /*
7151258Smlf  * Minor number construction for devctl and attachment point nodes.
7161258Smlf  * All necessary information has to be encoded in NBITSMINOR32 bits.
7171258Smlf  *
7181258Smlf  * Devctl node minor number:
7191258Smlf  * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_DEVCTL_NODE)
7201258Smlf  *
7211258Smlf  * Attachment point node minor number has to include controller
7221258Smlf  * instance (7 bits), controller port number (5 bits) and port multiplier
7231258Smlf  * device port number (4 bits) and port multiplier device port
7241258Smlf  * indicator (1 bit).  Additionally, a single bit is used to
7251258Smlf  * differentiate between attachment point node and device control node.
7261258Smlf  *
7271258Smlf  * Attachment point minor number:
7281258Smlf  * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_AP_NODE |
7291258Smlf  * [(port_multiplier_device_port << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP] |
7301258Smlf  * (controller_port))
7311258Smlf  *
7321258Smlf  * 17 bits are used (if 64 instances of controllers are expected)
7331258Smlf  * bit 18 is reserved for future use.
7341258Smlf  *
7351258Smlf  *   --------------------------------------------------------
7361258Smlf  *   |17|16|15|14|13|12|11|10 |09|08|07|06|05|04|03|02|01|00|
7371258Smlf  *   --------------------------------------------------------
7381258Smlf  *   | R| c| c| c| c| c| c|a/d|pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
7391258Smlf  *   --------------------------------------------------------
7401258Smlf  * Where:
7411258Smlf  * cp  - device port number on the HBA SATA controller
7421258Smlf  * pp  - device port number on the port multiplier
7431258Smlf  * pm  - 0 - target attached to controller device port
7441258Smlf  *       1 - target attached to port multiplier's device port
7451258Smlf  * a/d - 0 - devctl node
7461258Smlf  *       1 - attachment point node
7471258Smlf  * c   - controller number
7481258Smlf  * R   - reserved bit
7491258Smlf  */
7501258Smlf 
7511258Smlf #define	SATA_AP_NODE		0x400		/* Attachment Point node */
7521258Smlf #define	SATA_DEVCTL_NODE	0x000		/* DEVCTL node */
7531258Smlf #define	SATA_PMULT_AP		0x200		/* device on PMult port */
7541258Smlf #define	SATA_PMULT_PORT_SHIFT	5
7551258Smlf #define	SATA_CNTRL_INSTANCE_SHIFT 11
7561258Smlf #define	SATA_CPORT_MASK		0x1f		/* 32 device ports */
7571258Smlf #define	SATA_PMULT_PORT_MASK	0xf		/* 15 device ports */
7581258Smlf #define	SATA_CNTRL_INSTANCE_MASK 0x03F		/* 64 controllers */
7591258Smlf 
7601258Smlf /* Macro for creating devctl node minor number */
7611258Smlf #define	SATA_MAKE_DEVCTL_MINOR(controller_instance) \
7621258Smlf 	((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | \
7631258Smlf 	SATA_DEVCTL_NODE)
7641258Smlf 
7651258Smlf /* Macro for creating an attachment point node minor number */
7661258Smlf #define	SATA_MAKE_AP_MINOR(cntrl_instance, cport, pmport, qual) \
7671258Smlf 	(qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT) ? \
7681258Smlf 	(((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \
7691258Smlf 	SATA_AP_NODE | SATA_PMULT_AP | \
7701258Smlf 	(pmport << SATA_PMULT_PORT_SHIFT) | cport) : \
7711258Smlf 	(((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \
7721258Smlf 	SATA_AP_NODE | cport))
7731258Smlf 
7741258Smlf /* Macro retrieving controller number from a minor number */
7751258Smlf #define	SATA_MINOR2INSTANCE(minor) \
7761258Smlf 	((minor >> SATA_CNTRL_INSTANCE_SHIFT) & SATA_CNTRL_INSTANCE_MASK)
7771258Smlf 
7781529Spawelw /*
7791529Spawelw  * Macro for creating an attachment point number from sata address.
7801529Spawelw  * Address qualifier has to be one of:
7811529Spawelw  * SATA_ADDR_DCPORT, SATA_ADDR_DPMPORT, SATA_ADDR_CPORT or SATA_ADDR_PMPORT
7821529Spawelw  */
7831529Spawelw #define	SATA_MAKE_AP_NUMBER(cport, pmport, qual) \
7841529Spawelw 	((qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) ? \
7851529Spawelw 	(SATA_PMULT_AP | (pmport << SATA_PMULT_PORT_SHIFT) | cport) : \
7861529Spawelw 	(cport))
7871258Smlf 
7881258Smlf /*
7891258Smlf  * SCSI target number format
7901258Smlf  *
7911258Smlf  *   -------------------------------
7921258Smlf  *   | 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|    Bit number
7931258Smlf  *   -------------------------------
7941258Smlf  *   |pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
7951258Smlf  *   -------------------------------
7961258Smlf  * Where:
7971258Smlf  * cp  - device port number on the HBA SATA controller
7981258Smlf  * pp  - device port number on the port multiplier
7991258Smlf  * pm  - 0 - target attached to controller device port
8001258Smlf  *       1 - target attached to port multiplier's device port
8011258Smlf  */
8021258Smlf 
8031258Smlf /* SATA ports to SCSI target number translation */
8041258Smlf 
8051258Smlf #define	SATA_TO_SCSI_TARGET(cport, pmport, qual) \
8061258Smlf 	(qual == SATA_ADDR_DCPORT ? cport : \
8071258Smlf 	(cport | (pmport << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP))
8081258Smlf 
8091258Smlf /* SCSI target number to SATA cntrl/pmport/cport translations */
8101258Smlf #define	SCSI_TO_SATA_CPORT(scsi_target) \
8111258Smlf 	(scsi_target & SATA_CPORT_MASK)
8121258Smlf 
8131258Smlf #define	SCSI_TO_SATA_PMPORT(scsi_target) \
8141258Smlf 	((scsi_target >> SATA_PMULT_PORT_SHIFT) & SATA_PMULT_PORT_MASK)
8151258Smlf 
8161258Smlf #define	SCSI_TO_SATA_ADDR_QUAL(scsi_target) \
8171258Smlf 	((scsi_target & SATA_PMULT_AP) ? SATA_ADDR_DPMPORT : \
8181258Smlf 	SATA_ADDR_DCPORT)
8191258Smlf 
8201258Smlf 
8211258Smlf /* Debug flags */
8221258Smlf #if	DEBUG
8231258Smlf 
8241258Smlf #define	SATA_DEBUG
8251258Smlf #define	SATA_DBG_SCSI_IF	1
8261258Smlf #define	SATA_DBG_HBA_IF		2
8271258Smlf #define	SATA_DBG_NODES		4
8281258Smlf #define	SATA_DBG_IOCTL_IF	8
8291258Smlf #define	SATA_DBG_EVENTS		0x10
8301258Smlf #define	SATA_DBG_EVENTS_PROC	0x20
8311258Smlf #define	SATA_DBG_EVENTS_PROCPST	0x40
8321258Smlf #define	SATA_DBG_EVENTS_CNTRL	0x80
8331258Smlf #define	SATA_DBG_EVENTS_DAEMON	0x100
8341258Smlf #define	SATA_DBG_DMA_SETUP	0x400
8352734Spawelw #define	SATA_DBG_DEV_SETTINGS	0x800
8364862SUnknown #define	SATA_DBG_ATAPI		0x1000
8374862SUnknown #define	SATA_DBG_ATAPI_PACKET	0x8000
8387510SPawel.Wojcik@Sun.COM #define	SATA_DBG_INTR_CTX	0x10000
83910318SXiao-Yu.Zhang@Sun.COM #define	SATA_DBG_PMULT		0x20000
8404862SUnknown 
8414862SUnknown typedef struct sata_atapi_cmd {
8424862SUnknown 	uint8_t acdb[SATA_ATAPI_MAX_CDB_LEN];
8434862SUnknown 	uint8_t arqs[SATA_ATAPI_RQSENSE_LEN];
8444862SUnknown 	uint_t sata_pkt_reason;
8454862SUnknown 	uint_t scsi_pkt_reason;
8464862SUnknown } sata_atapi_cmd_t;
8471258Smlf 
8481258Smlf /* Debug macros */
8491258Smlf #define	SATADBG1(flag, sata, format, arg1) \
8501258Smlf 	if (sata_debug_flags & (flag)) { \
8511258Smlf 		sata_log(sata, CE_CONT, format, arg1); \
8521258Smlf 	}
8531258Smlf 
8541258Smlf #define	SATADBG2(flag, sata, format, arg1, arg2) \
8551258Smlf 	if (sata_debug_flags & (flag)) { \
8561258Smlf 		sata_log(sata, CE_CONT, format, arg1, arg2); \
8571258Smlf 	}
8581258Smlf 
8591258Smlf #define	SATADBG3(flag, sata, format, arg1, arg2, arg3) \
8601258Smlf 	if (sata_debug_flags & (flag)) { \
8611258Smlf 		sata_log(sata, CE_CONT, format, arg1, arg2, arg3); \
8621258Smlf 	}
8631258Smlf #else
8641258Smlf 
8651258Smlf #define	SATADBG1(flag, dip, frmt, arg1)
8661258Smlf #define	SATADBG2(flag, dip, frmt, arg1, arg2)
8671258Smlf #define	SATADBG3(flag, dip, frmt, arg1, arg2, arg3)
8681258Smlf 
8691258Smlf #endif
8701258Smlf 
87110663SXiao-Yu.Zhang@Sun.COM /* sata_rev_tag 1.46 */
8727510SPawel.Wojcik@Sun.COM 
8731258Smlf #ifdef	__cplusplus
8741258Smlf }
8751258Smlf #endif
8761258Smlf 
8771258Smlf #endif /* _SATA_H */
878