xref: /titanic_52/usr/src/uts/common/sys/sata/impl/sata.h (revision 2acf01fd73874e9b92c066e8deb5270d92b083ba)
166f9d5cbSmlf /*
266f9d5cbSmlf  * CDDL HEADER START
366f9d5cbSmlf  *
466f9d5cbSmlf  * The contents of this file are subject to the terms of the
566f9d5cbSmlf  * Common Development and Distribution License (the "License").
666f9d5cbSmlf  * You may not use this file except in compliance with the License.
766f9d5cbSmlf  *
866f9d5cbSmlf  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
966f9d5cbSmlf  * or http://www.opensolaris.org/os/licensing.
1066f9d5cbSmlf  * See the License for the specific language governing permissions
1166f9d5cbSmlf  * and limitations under the License.
1266f9d5cbSmlf  *
1366f9d5cbSmlf  * When distributing Covered Code, include this CDDL HEADER in each
1466f9d5cbSmlf  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1566f9d5cbSmlf  * If applicable, add the following below this CDDL HEADER, with the
1666f9d5cbSmlf  * fields enclosed by brackets "[]" replaced with your own identifying
1766f9d5cbSmlf  * information: Portions Copyright [yyyy] [name of copyright owner]
1866f9d5cbSmlf  *
1966f9d5cbSmlf  * CDDL HEADER END
2066f9d5cbSmlf  */
2166f9d5cbSmlf 
2266f9d5cbSmlf /*
230bc523e5SAlan Perry  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
2466f9d5cbSmlf  * Use is subject to license terms.
2566f9d5cbSmlf  */
26257c04ecSMarcel Telka /*
27257c04ecSMarcel Telka  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
28257c04ecSMarcel Telka  */
2966f9d5cbSmlf 
3066f9d5cbSmlf #ifndef _SATA_H
3166f9d5cbSmlf #define	_SATA_H
3266f9d5cbSmlf 
3366f9d5cbSmlf #ifdef	__cplusplus
3466f9d5cbSmlf extern "C" {
3566f9d5cbSmlf #endif
3666f9d5cbSmlf 
3766f9d5cbSmlf /*
3866f9d5cbSmlf  * Generic SATA Host Adapter Implementation
3966f9d5cbSmlf  */
4066f9d5cbSmlf 
4166f9d5cbSmlf #include <sys/types.h>
4266f9d5cbSmlf #include <sys/scsi/scsi.h>
4366f9d5cbSmlf #include <sys/scsi/impl/services.h>
4466f9d5cbSmlf #include <sys/sata/sata_defs.h>
4566f9d5cbSmlf #include <sys/sata/sata_hba.h>
4666f9d5cbSmlf 
474372d277Spawelw /* Common flags specifying current state of a port or an attached drive. */
484372d277Spawelw #define	SATA_STATE_PROBING		0x000001
494372d277Spawelw #define	SATA_STATE_PROBED		0x000002
504372d277Spawelw 
5166f9d5cbSmlf /* Statistics counters */
5266f9d5cbSmlf struct sata_port_stats {
5366f9d5cbSmlf 	uint64_t	link_lost;		/* event counter */
5466f9d5cbSmlf 	uint64_t	link_established;	/* event counter */
5566f9d5cbSmlf 	uint64_t	device_attached;	/* event counter */
5666f9d5cbSmlf 	uint64_t	device_detached;	/* event counter */
5766f9d5cbSmlf 	uint64_t	port_reset;		/* event counter */
5866f9d5cbSmlf 	uint64_t	port_pwr_changed;	/* event counter */
5966f9d5cbSmlf };
6066f9d5cbSmlf 
6166f9d5cbSmlf typedef struct sata_port_stats sata_port_stats_t;
6266f9d5cbSmlf 
6366f9d5cbSmlf struct sata_drive_stats {
6466f9d5cbSmlf 	uint64_t	media_error;		/* available ??? */
6566f9d5cbSmlf 	uint64_t	drive_reset;		/* event counter */
6666f9d5cbSmlf } sata_drv_stats_t;
6766f9d5cbSmlf 
6866f9d5cbSmlf typedef struct sata_drive_stats sata_drive_stats_t;
6966f9d5cbSmlf 
7066f9d5cbSmlf struct sata_ctrl_stats {
7166f9d5cbSmlf 	uint64_t	ctrl_reset;		/* event counter */
7266f9d5cbSmlf 	uint64_t	ctrl_pwr_change;	/* event counter */
7366f9d5cbSmlf };
7466f9d5cbSmlf 
7566f9d5cbSmlf typedef struct sata_ctrl_stats sata_ctrl_stats_t;
7666f9d5cbSmlf 
7766f9d5cbSmlf 
7866f9d5cbSmlf /*
7966f9d5cbSmlf  * SATA HBA instance info structure
8066f9d5cbSmlf  */
8166f9d5cbSmlf struct sata_hba_inst {
8266f9d5cbSmlf 	dev_info_t		*satahba_dip;	/* this HBA instance devinfo */
8366f9d5cbSmlf 	struct sata_hba_inst	*satahba_next;	/* ptr to next sata_hba_inst */
8466f9d5cbSmlf 	struct sata_hba_inst	*satahba_prev;	/* ptr to prev sata_hba_inst */
8566f9d5cbSmlf 	struct scsi_hba_tran	*satahba_scsi_tran; /* scsi_hba_tran */
8666f9d5cbSmlf 	struct sata_hba_tran	*satahba_tran;	/* sata_hba_tran */
8766f9d5cbSmlf 	kmutex_t		satahba_mutex;	/* sata hba cntrl mutex */
887a1efdfeSpawelw 	struct taskq		*satahba_taskq;	/* cmd completion task queue */
8966f9d5cbSmlf 
9066f9d5cbSmlf 						/*
9166f9d5cbSmlf 						 * HBA event flags:
9266f9d5cbSmlf 						 * SATA_EVNT_MAIN
9366f9d5cbSmlf 						 * SATA_EVNT_PWR_LEVEL_CHANGED
9466f9d5cbSmlf 						 * SATA_EVNT_SKIP
9566f9d5cbSmlf 						 */
9666f9d5cbSmlf 	uint_t			satahba_event_flags;
9766f9d5cbSmlf 
9866f9d5cbSmlf 	struct sata_cport_info	*satahba_dev_port[SATA_MAX_CPORTS];
9966f9d5cbSmlf 
10066f9d5cbSmlf 						/*
10166f9d5cbSmlf 						 * DEVCTL open flag:
10266f9d5cbSmlf 						 * SATA_DEVCTL_SOPENED
10366f9d5cbSmlf 						 * SATA_DEVCTL_EXOPENED
10466f9d5cbSmlf 						 */
10566f9d5cbSmlf 	uint_t			satahba_open_flag; /* shared open flag */
10666f9d5cbSmlf 	struct sata_ctrl_stats	satahba_stats;	/* HBA cntrl statistics */
10766f9d5cbSmlf 
10866f9d5cbSmlf 	uint_t			satahba_attached; /* HBA attaching: */
10966f9d5cbSmlf 						/* 0 - not completed */
11066f9d5cbSmlf 						/* 1 - completed */
11166f9d5cbSmlf };
11266f9d5cbSmlf 
11366f9d5cbSmlf typedef struct sata_hba_inst	sata_hba_inst_t;
11466f9d5cbSmlf 
11566f9d5cbSmlf /*
11666f9d5cbSmlf  * SATA controller's device port info and state.
11766f9d5cbSmlf  * This structure is pointed to by the sata_hba_inst.satahba_dev_port[x]
11866f9d5cbSmlf  * where x is a device port number.
11966f9d5cbSmlf  * cport_state holds port state flags, defined in sata_hba.h file.
12066f9d5cbSmlf  * cport_event_flags holds SATA_EVNT_* flags defined in this file and in
12166f9d5cbSmlf  * sata_hba.h file.
12266f9d5cbSmlf  * cport_dev_type holds SATA_DTYPE_* types defined in sata_hba.h file.
12366f9d5cbSmlf  */
12466f9d5cbSmlf struct sata_cport_info {
12566f9d5cbSmlf 	sata_address_t		cport_addr;	/* this port SATA address */
12666f9d5cbSmlf 	kmutex_t		cport_mutex;	/* port mutex */
12766f9d5cbSmlf 
12866f9d5cbSmlf 						/*
12966f9d5cbSmlf 						 * Port state flags
13066f9d5cbSmlf 						 * SATA_STATE_UNKNOWN
13166f9d5cbSmlf 						 * SATA_STATE_PROBING
13266f9d5cbSmlf 						 * SATA_STATE_PROBED
13366f9d5cbSmlf 						 * SATA_STATE_READY
13466f9d5cbSmlf 						 * SATA_PSTATE_PWRON
13566f9d5cbSmlf 						 * SATA_PSTATE_PWROFF
13666f9d5cbSmlf 						 * SATA_PSTATE_SHUTDOWN
13766f9d5cbSmlf 						 * SATA_PSTATE_FAILED
13866f9d5cbSmlf 						 */
13966f9d5cbSmlf 	uint32_t		cport_state;
14066f9d5cbSmlf 
14166f9d5cbSmlf 						/*
14266f9d5cbSmlf 						 * Port event flags:
14366f9d5cbSmlf 						 * SATA_EVNT_DEVICE_ATTACHED
14466f9d5cbSmlf 						 * SATA_EVNT_DEVICE_DETACHED
14566f9d5cbSmlf 						 * SATA_EVNT_LINK_LOST
14666f9d5cbSmlf 						 * SATA_EVNT_LINK_ESTABLISHED
14766f9d5cbSmlf 						 * SATA_EVNT_PORT_FAILED
14866f9d5cbSmlf 						 * SATA_EVNT_PWR_LEVEL_CHANGED
14966f9d5cbSmlf 						 */
15066f9d5cbSmlf 	uint32_t		cport_event_flags;
15166f9d5cbSmlf 
15266f9d5cbSmlf 	struct sata_port_scr	cport_scr;	/* Port status and ctrl regs */
15366f9d5cbSmlf 
15466f9d5cbSmlf 						/*
15566f9d5cbSmlf 						 * Attached device type:
15666f9d5cbSmlf 						 * SATA_DTYPE_NONE
15766f9d5cbSmlf 						 * SATA_DTYPE_ATADISK
15866f9d5cbSmlf 						 * SATA_DTYPE_ATAPICD
15938547057Sying tian - Beijing China 						 * SATA_DTYPE_ATAPITAPE
160f8a673adSying tian - Beijing China 						 * SATA_DTYPE_ATAPIDISK
16166f9d5cbSmlf 						 * SATA_DTYPE_PMULT
16266f9d5cbSmlf 						 * SATA_DTYPE_UNKNOWN
163257c04ecSMarcel Telka 						 * SATA_DTYPE_ATAPIPROC
16466f9d5cbSmlf 						 */
16566f9d5cbSmlf 	uint32_t		cport_dev_type;
16666f9d5cbSmlf 	union {
16766f9d5cbSmlf 	    struct sata_drive_info *cport_sata_drive; /* Attached drive info */
16866f9d5cbSmlf 	    struct sata_pmult_info *cport_sata_pmult; /* Attached Port Mult */
16966f9d5cbSmlf 	} 			cport_devp;
17066f9d5cbSmlf 						/* lbolt value at link lost */
17166f9d5cbSmlf 	clock_t			cport_link_lost_time;
1726ed1276fSpawelw 						/* lbolt value @ dev attached */
1736ed1276fSpawelw 	clock_t			cport_dev_attach_time;
17466f9d5cbSmlf 
17566f9d5cbSmlf 	struct sata_port_stats	cport_stats;	/* Port statistics */
1764360436bSpawelw 
1774360436bSpawelw 	boolean_t		cport_tgtnode_clean; /* Target node usable */
17866f9d5cbSmlf };
17966f9d5cbSmlf 
18066f9d5cbSmlf typedef struct sata_cport_info sata_cport_info_t;
18166f9d5cbSmlf 
18266f9d5cbSmlf /*
18366f9d5cbSmlf  * Attached SATA drive info and state.
18466f9d5cbSmlf  * This structure is pointed to by sata_cport_info's cport_sata_drive field
18566f9d5cbSmlf  * when a drive is attached directly to a controller device port.
18666f9d5cbSmlf  */
18766f9d5cbSmlf struct sata_drive_info {
18866f9d5cbSmlf 	sata_address_t	satadrv_addr;		/* this drive SATA address */
18966f9d5cbSmlf 
19066f9d5cbSmlf 						/*
19166f9d5cbSmlf 						 * Drive state flags
19266f9d5cbSmlf 						 * SATA_STATE_UNKNOWN
19366f9d5cbSmlf 						 * SATA_STATE_PROBING
19466f9d5cbSmlf 						 * SATA_STATE_PROBED
19566f9d5cbSmlf 						 * SATA_STATE_READY
19666f9d5cbSmlf 						 * SATA_DSTATE_PWR_ACTIVE
19766f9d5cbSmlf 						 * SATA_DSTATE_PWR_IDLE
19866f9d5cbSmlf 						 * SATA_DSTATE_RESET
19966f9d5cbSmlf 						 * SATA_DSTATE_FAILED
20066f9d5cbSmlf 						 */
20166f9d5cbSmlf 	uint32_t	satadrv_state;
20266f9d5cbSmlf 
20366f9d5cbSmlf 						/*
20466f9d5cbSmlf 						 * drive event flags:
20566f9d5cbSmlf 						 * SATA_EVNT_DRIVE_RESET
20666f9d5cbSmlf 						 */
20766f9d5cbSmlf 	uint32_t	satadrv_event_flags;
2084372d277Spawelw 						/*
2094372d277Spawelw 						 * lbolt value @ start of
2104372d277Spawelw 						 * device reset processing
2114372d277Spawelw 						 */
2124372d277Spawelw 	clock_t		satadrv_reset_time;
21366f9d5cbSmlf 						/*
21466f9d5cbSmlf 						 * Attached device type:
21566f9d5cbSmlf 						 * SATA_DTYPE_ATADISK
21666f9d5cbSmlf 						 * SATA_DTYPE_ATAPICD
21738547057Sying tian - Beijing China 						 * SATA_DTYPE_ATAPITAPE
218f8a673adSying tian - Beijing China 						 * SATA_DTYPE_ATAPIDISK
219257c04ecSMarcel Telka 						 * SATA_DTYPE_ATAPIPROC
22066f9d5cbSmlf 						 */
22166f9d5cbSmlf 	uint32_t	satadrv_type;
22266f9d5cbSmlf 
22366f9d5cbSmlf 	uint32_t	satadrv_status_reg;	/* drive status reg */
22466f9d5cbSmlf 	uint32_t	satadrv_error_reg;	/* drive error reg */
22566f9d5cbSmlf 	uint16_t	satadrv_features_support; /* drive features support */
22666f9d5cbSmlf 	uint16_t	satadrv_queue_depth;    /* drive queue depth */
2272038334aSUnknown 	uint16_t	satadrv_atapi_cdb_len;	/* atapi supported cdb length */
2282038334aSUnknown 	uint16_t	satadrv_atapi_trans_ver; /* atapi transport version */
22966f9d5cbSmlf 	uint16_t	satadrv_settings;	/* drive settings flags */
2304e540238Sls24207 	uint16_t	satadrv_features_enabled; /* drive features enabled */
23166f9d5cbSmlf 	uint64_t	satadrv_capacity;	/* drive capacity */
2322038334aSUnknown 	uint64_t	satadrv_max_queue_depth; /* maximum queue depth */
23366f9d5cbSmlf 	sata_id_t	satadrv_id;		/* Device Identify Data */
23466f9d5cbSmlf 	struct sata_drive_stats satadrv_stats;	/* drive statistics */
2352ee4dfc7SJane Chu 
2362ee4dfc7SJane Chu 	/*
2372ee4dfc7SJane Chu 	 * saved standby timer
2382ee4dfc7SJane Chu 	 * [0] - [3] = high - low
2392ee4dfc7SJane Chu 	 */
2402ee4dfc7SJane Chu 	uint8_t		satadrv_standby_timer[4];
2412ee4dfc7SJane Chu 	uint8_t		satadrv_power_level; /* saved power level */
24266f9d5cbSmlf };
24366f9d5cbSmlf 
24466f9d5cbSmlf typedef struct sata_drive_info sata_drive_info_t;
24566f9d5cbSmlf 
24666f9d5cbSmlf _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_drive_info))
24766f9d5cbSmlf 
24866f9d5cbSmlf 
24966f9d5cbSmlf /* Port Multiplier & host port info and state */
25066f9d5cbSmlf struct sata_pmult_info {
25166f9d5cbSmlf 	sata_address_t	pmult_addr;		/* this PMult SATA Address */
25266f9d5cbSmlf 						/*
25366f9d5cbSmlf 						 * PMult state flags
25466f9d5cbSmlf 						 * SATA_STATE_UNKNOWN
25566f9d5cbSmlf 						 * SATA_STATE_PROBING
25666f9d5cbSmlf 						 * SATA_STATE_PROBED
25766f9d5cbSmlf 						 * SATA_STATE_READY
25866f9d5cbSmlf 						 * SATA_PSTATE_FAILED
25966f9d5cbSmlf 						 */
26066f9d5cbSmlf 	uint32_t	pmult_state;
26166f9d5cbSmlf 	uint32_t	pmult_event_flags;	/* Undefined for now */
2628aa6aadbSXiao-Yu Zhang 	struct sata_pmult_gscr pmult_gscr;	/* PMult GSCR block */
26366f9d5cbSmlf 	uint32_t	pmult_num_dev_ports; 	/* Number of data ports */
26466f9d5cbSmlf 	struct sata_pmport_info	*pmult_dev_port[SATA_MAX_PMPORTS - 1];
26566f9d5cbSmlf };
26666f9d5cbSmlf 
26766f9d5cbSmlf typedef	struct sata_pmult_info sata_pmult_info_t;
26866f9d5cbSmlf 
2698aa6aadbSXiao-Yu Zhang _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pmult_info))
2708aa6aadbSXiao-Yu Zhang _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
2718aa6aadbSXiao-Yu Zhang     sata_pmult_info::pmult_dev_port))
2728aa6aadbSXiao-Yu Zhang 
27366f9d5cbSmlf /* Port Multiplier's device port info & state */
27466f9d5cbSmlf struct sata_pmport_info {
27566f9d5cbSmlf 	sata_address_t	pmport_addr;		/* this SATA port address */
27666f9d5cbSmlf 	kmutex_t	pmport_mutex;		/* pmult device port mutex */
27766f9d5cbSmlf 
27866f9d5cbSmlf 						/*
27966f9d5cbSmlf 						 * Port state flags
28066f9d5cbSmlf 						 * SATA_STATE_UNKNOWN
28166f9d5cbSmlf 						 * SATA_STATE_PROBING
28266f9d5cbSmlf 						 * SATA_STATE_PROBED
28366f9d5cbSmlf 						 * SATA_STATE_READY
28466f9d5cbSmlf 						 * SATA_PSTATE_PWRON
28566f9d5cbSmlf 						 * SATA_PSTATE_PWROFF
28666f9d5cbSmlf 						 * SATA_PSTATE_SHUTDOWN
28766f9d5cbSmlf 						 * SATA_PSTATE_FAILED
28866f9d5cbSmlf 						 */
28966f9d5cbSmlf 	uint32_t	pmport_state;
29066f9d5cbSmlf 
29166f9d5cbSmlf 						/*
29266f9d5cbSmlf 						 * Port event flags:
29366f9d5cbSmlf 						 * SATA_EVNT_DEVICE_ATTACHED
29466f9d5cbSmlf 						 * SATA_EVNT_DEVICE_DETACHED
29566f9d5cbSmlf 						 * SATA_EVNT_LINK_LOST
29666f9d5cbSmlf 						 * SATA_EVNT_LINK_ESTABLISHED
29766f9d5cbSmlf 						 * SATA_EVNT_PORT_FAILED
29866f9d5cbSmlf 						 * SATA_EVNT_PWR_LEVEL_CHANGED
29966f9d5cbSmlf 						 */
30066f9d5cbSmlf 	uint32_t	pmport_event_flags;
30166f9d5cbSmlf 
30266f9d5cbSmlf 	struct sata_port_scr pmport_scr;	/* PMult device port scr */
30366f9d5cbSmlf 
30466f9d5cbSmlf 						/*
30566f9d5cbSmlf 						 * Attached device type:
30666f9d5cbSmlf 						 * SATA_DTYPE_NONE
30766f9d5cbSmlf 						 * SATA_DTYPE_ATADISK
30866f9d5cbSmlf 						 * SATA_DTYPE_ATAPICD
30938547057Sying tian - Beijing China 						 * SATA_DTYPE_ATAPITAPE
310f8a673adSying tian - Beijing China 						 * SATA_DTYPE_ATAPIDISK
31166f9d5cbSmlf 						 * SATA_DTYPE_UNKNOWN
312257c04ecSMarcel Telka 						 * SATA_DTYPE_ATAPIPROC
31366f9d5cbSmlf 						 */
31466f9d5cbSmlf 	uint32_t	pmport_dev_type;
31566f9d5cbSmlf 
31666f9d5cbSmlf 	struct sata_drive_info	*pmport_sata_drive; /* Attached drive info */
31766f9d5cbSmlf 
31866f9d5cbSmlf 						/* lbolt value at link lost */
31966f9d5cbSmlf 	clock_t		pmport_link_lost_time;
3206ed1276fSpawelw 						/* lbolt value @ dev attached */
3216ed1276fSpawelw 	clock_t		pmport_dev_attach_time;
32266f9d5cbSmlf 
32366f9d5cbSmlf 	struct sata_port_stats	pmport_stats;	/* Port statistics */
3244360436bSpawelw 
3254360436bSpawelw 	boolean_t	pmport_tgtnode_clean;	/* Target node usable */
32666f9d5cbSmlf };
32766f9d5cbSmlf 
32866f9d5cbSmlf typedef	struct sata_pmport_info sata_pmport_info_t;
32966f9d5cbSmlf 
33066f9d5cbSmlf /*
3312ee4dfc7SJane Chu  * sata drive's power level
3322ee4dfc7SJane Chu  * default value is active
3332ee4dfc7SJane Chu  */
3342ee4dfc7SJane Chu #define	SATA_POWER_ACTIVE	0x00
3352ee4dfc7SJane Chu #define	SATA_POWER_IDLE		0x01
3362ee4dfc7SJane Chu #define	SATA_POWER_STANDBY	0x02
3372ee4dfc7SJane Chu #define	SATA_POWER_STOPPED	0x03
3382ee4dfc7SJane Chu 
3392ee4dfc7SJane Chu /*
3402ee4dfc7SJane Chu  * pm-capable value definition according to PSARC 2009/310
3412ee4dfc7SJane Chu  */
3422ee4dfc7SJane Chu #define	SATA_CAP_POWER_CONDITON	PM_CAPABLE_SPC4
3432ee4dfc7SJane Chu #define	SATA_CAP_SMART_PAGE	PM_CAPABLE_SMART_LOG
3442ee4dfc7SJane Chu #define	SATA_CAP_LOG_SENSE	PM_CAPABLE_LOG_SUPPORTED
3452ee4dfc7SJane Chu 
3462ee4dfc7SJane Chu /*
34766f9d5cbSmlf  * Port SSTATUS register (sata_port_scr sport_sstatus field).
34866f9d5cbSmlf  * Link bits are valid only in port active state.
34966f9d5cbSmlf  */
35066f9d5cbSmlf #define	SATA_PORT_DEVLINK_UP	0x00000103	/* Link with dev established */
35166f9d5cbSmlf #define	SATA_PORT_DEVLINK_UP_MASK 0x0000010F	/* Mask for link bits */
35266f9d5cbSmlf 
35366f9d5cbSmlf /*
35466f9d5cbSmlf  * Port state clear mask (cport_state and pmport_state fields).
35566f9d5cbSmlf  * SATA_PSTATE_SHUTDOWN and power state are preserved.
35666f9d5cbSmlf  */
35766f9d5cbSmlf #define	SATA_PORT_STATE_CLEAR_MASK	(~(SATA_PSTATE_SHUTDOWN))
35866f9d5cbSmlf 
35966f9d5cbSmlf /*
36066f9d5cbSmlf  * Valid i.e.supported device types mask (cport_dev_type, satadrv_type,
36166f9d5cbSmlf  * pmult_dev_type fields).
3622038334aSUnknown  * ATA disks and ATAPI CD/DVD now.
36366f9d5cbSmlf  */
3642038334aSUnknown #define	SATA_VALID_DEV_TYPE	(SATA_DTYPE_ATADISK | \
36538547057Sying tian - Beijing China 				SATA_DTYPE_ATAPICD | \
366f8a673adSying tian - Beijing China 				SATA_DTYPE_ATAPITAPE | \
367f8a673adSying tian - Beijing China 				SATA_DTYPE_ATAPIDISK)
36866f9d5cbSmlf 
36966f9d5cbSmlf /*
37066f9d5cbSmlf  * Device feature_support (satadrv_features_support)
37166f9d5cbSmlf  */
37266f9d5cbSmlf #define	SATA_DEV_F_DMA			0x01
37366f9d5cbSmlf #define	SATA_DEV_F_LBA28		0x02
37466f9d5cbSmlf #define	SATA_DEV_F_LBA48		0x04
37566f9d5cbSmlf #define	SATA_DEV_F_NCQ			0x08
37666f9d5cbSmlf #define	SATA_DEV_F_SATA1		0x10
37766f9d5cbSmlf #define	SATA_DEV_F_SATA2		0x20
378489f952bSls24207 #define	SATA_DEV_F_TCQ			0x40	/* Non NCQ tagged queuing */
37913c8743eSMarcel Telka #define	SATA_DEV_F_SATA3		0x80
38066f9d5cbSmlf 
38166f9d5cbSmlf /*
3824e540238Sls24207  * Device features enabled (satadrv_features_enabled)
3834e540238Sls24207  */
3844e540238Sls24207 #define	SATA_DEV_F_E_TAGGED_QING	0x01	/* Tagged queuing enabled */
3854e540238Sls24207 #define	SATA_DEV_F_E_UNTAGGED_QING	0x02	/* Untagged queuing enabled */
3864e540238Sls24207 
3874e540238Sls24207 /*
38866f9d5cbSmlf  * Drive settings flags (satdrv_settings)
38966f9d5cbSmlf  */
39066f9d5cbSmlf #define	SATA_DEV_READ_AHEAD		0x0001	/* Read Ahead enabled */
39166f9d5cbSmlf #define	SATA_DEV_WRITE_CACHE		0x0002	/* Write cache ON */
3922038334aSUnknown #define	SATA_DEV_DMA			0x0004	/* DMA selected */
39366f9d5cbSmlf #define	SATA_DEV_SERIAL_FEATURES 	0x8000	/* Serial ATA feat. enabled */
39466f9d5cbSmlf #define	SATA_DEV_ASYNCH_NOTIFY		0x2000	/* Asynch-event enabled */
3952038334aSUnknown #define	SATA_DEV_RMSN			0x0100	/* Rem Media Stat Notfc enbl */
39666f9d5cbSmlf 
39766f9d5cbSmlf /*
39866f9d5cbSmlf  * Internal event and flags.
39966f9d5cbSmlf  * These flags are set in the *_event_flags fields of various structures.
40066f9d5cbSmlf  * Events and lock flags defined below are used internally by the
40166f9d5cbSmlf  * SATA framework (they are not reported by SATA HBA drivers).
40266f9d5cbSmlf  */
40366f9d5cbSmlf #define	SATA_EVNT_MAIN			0x80000000
40466f9d5cbSmlf #define	SATA_EVNT_SKIP			0x40000000
40566f9d5cbSmlf #define	SATA_EVNT_INPROC_DEVICE_RESET	0x08000000
40666f9d5cbSmlf #define	SATA_EVNT_CLEAR_DEVICE_RESET	0x04000000
4074360436bSpawelw #define	SATA_EVNT_TARGET_NODE_CLEANUP	0x00000100
408c75976d1Spawelw #define	SATA_EVNT_AUTOONLINE_DEVICE	0x00000200
40966f9d5cbSmlf 
41066f9d5cbSmlf /*
41166f9d5cbSmlf  * Lock flags - used to serialize configuration operations
41266f9d5cbSmlf  * on ports and devices.
41366f9d5cbSmlf  * SATA_EVNT_LOCK_PORT_BUSY is set by event daemon to prevent
41466f9d5cbSmlf  * simultaneous cfgadm operations.
41566f9d5cbSmlf  * SATA_APCTL_LOCK_PORT_BUSY is set by cfgadm ioctls to prevent
41666f9d5cbSmlf  * simultaneous event processing.
41766f9d5cbSmlf  */
41866f9d5cbSmlf #define	SATA_EVNT_LOCK_PORT_BUSY	0x00800000
41966f9d5cbSmlf #define	SATA_APCTL_LOCK_PORT_BUSY	0x00400000
42066f9d5cbSmlf 
42166f9d5cbSmlf /* Mask for port events */
42266f9d5cbSmlf #define	SATA_EVNT_PORT_EVENTS		(SATA_EVNT_DEVICE_ATTACHED | \
42366f9d5cbSmlf 					SATA_EVNT_DEVICE_DETACHED | \
42466f9d5cbSmlf 					SATA_EVNT_LINK_LOST | \
42566f9d5cbSmlf 					SATA_EVNT_LINK_ESTABLISHED | \
4268aa6aadbSXiao-Yu Zhang 					SATA_EVNT_PMULT_LINK_CHANGED | \
4274360436bSpawelw 					SATA_EVNT_PORT_FAILED | \
428c75976d1Spawelw 					SATA_EVNT_TARGET_NODE_CLEANUP | \
429c75976d1Spawelw 					SATA_EVNT_AUTOONLINE_DEVICE)
43066f9d5cbSmlf /* Mask for drive events */
4314360436bSpawelw #define	SATA_EVNT_DRIVE_EVENTS		(SATA_EVNT_DEVICE_RESET | \
4324360436bSpawelw 					SATA_EVNT_INPROC_DEVICE_RESET)
43366f9d5cbSmlf #define	SATA_EVNT_CONTROLLER_EVENTS	SATA_EVNT_PWR_LEVEL_CHANGED
43466f9d5cbSmlf 
435c75976d1Spawelw /* Delays and timeout duration definitions */
43666f9d5cbSmlf #define	SATA_EVNT_DAEMON_SLEEP_TIME	50000	/* 50 ms */
43766f9d5cbSmlf #define	SATA_EVNT_DAEMON_TERM_TIMEOUT	100000	/* 100 ms */
43866f9d5cbSmlf #define	SATA_EVNT_DAEMON_TERM_WAIT	60000000 /* 60 s */
43966f9d5cbSmlf #define	SATA_EVNT_LINK_LOST_TIMEOUT	1000000	/* 1 s */
4404372d277Spawelw 
4414372d277Spawelw #define	SATA_DEV_IDENTIFY_TIMEOUT	60000000 /* 60 s, device enumeration */
4424372d277Spawelw #define	SATA_DEV_REPROBE_TIMEOUT	30000000  /* 30 s, dev resp after rst */
4434372d277Spawelw #define	SATA_DEV_RETRY_DLY		10000	/* 10 ms */
44466f9d5cbSmlf 
4456ed1276fSpawelw /* DEVICE IDENTIFY and device initialization retry delay */
4466ed1276fSpawelw #define	SATA_DEV_IDENTIFY_RETRY		1
4476ed1276fSpawelw #define	SATA_DEV_IDENTIFY_NORETRY	0
44866f9d5cbSmlf 
44966f9d5cbSmlf /*
45066f9d5cbSmlf  * sata_scsi's hba_open_flag: field indicating open devctl instance.
45166f9d5cbSmlf  *	0 = closed, 1 = shared open, 2 = exclusive open.
45266f9d5cbSmlf  */
45366f9d5cbSmlf #define	SATA_DEVCTL_CLOSED	0
45466f9d5cbSmlf #define	SATA_DEVCTL_SOPENED	1
45566f9d5cbSmlf #define	SATA_DEVCTL_EXOPENED	2
45666f9d5cbSmlf 
45766f9d5cbSmlf /*
45866f9d5cbSmlf  * sata_pkt_txlate structure contains info about resources allocated
45966f9d5cbSmlf  * for the packet
46066f9d5cbSmlf  * Address of this structure is stored in scsi_pkt.pkt_ha_private and
46166f9d5cbSmlf  * in sata_pkt.sata_hba_private fields, so all three strucures are
46266f9d5cbSmlf  * cross-linked, with sata_pkt_txlate as a centerpiece.
46366f9d5cbSmlf  */
46466f9d5cbSmlf 
46566f9d5cbSmlf typedef struct sata_pkt_txlate {
46666f9d5cbSmlf 	struct sata_hba_inst	*txlt_sata_hba_inst;
46766f9d5cbSmlf 	struct scsi_pkt		*txlt_scsi_pkt;
46866f9d5cbSmlf 	struct sata_pkt		*txlt_sata_pkt;
46966f9d5cbSmlf 	ddi_dma_handle_t	txlt_buf_dma_handle;
47066f9d5cbSmlf 	uint_t			txlt_flags;	/* data-in / data-out */
47166f9d5cbSmlf 	uint_t			txlt_num_dma_win; /* number of DMA windows */
47266f9d5cbSmlf 	uint_t			txlt_cur_dma_win; /* current DMA window */
47366f9d5cbSmlf 
47466f9d5cbSmlf 				/* cookies in the current DMA window */
47566f9d5cbSmlf 	uint_t			txlt_curwin_num_dma_cookies;
47666f9d5cbSmlf 
4774360436bSpawelw 				/* processed dma cookies in current DMA win */
47866f9d5cbSmlf 	uint_t			txlt_curwin_processed_dma_cookies;
47966f9d5cbSmlf 	size_t			txlt_total_residue;
4804360436bSpawelw 	ddi_dma_cookie_t	txlt_dma_cookie; /* default dma cookie */
48166f9d5cbSmlf 	int			txlt_dma_cookie_list_len; /* alloc list len */
48266f9d5cbSmlf 	ddi_dma_cookie_t 	*txlt_dma_cookie_list; /* dma cookie list */
48366f9d5cbSmlf 	int			txlt_num_dma_cookies; /* dma cookies in list */
4847a70ede8Spawelw 
4857a70ede8Spawelw 				/* temporary buffer access handle */
4867a70ede8Spawelw 	ddi_acc_handle_t	txlt_tmp_buf_handle;
4877a70ede8Spawelw 	caddr_t			txlt_tmp_buf;	/* temp buffer address */
48866f9d5cbSmlf } sata_pkt_txlate_t;
48966f9d5cbSmlf 
49066f9d5cbSmlf _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt_txlate))
49166f9d5cbSmlf _NOTE(SCHEME_PROTECTS_DATA("unshared data", scsi_pkt))
49266f9d5cbSmlf 
49363aa5377SAlan Perry /* Length of largest sense buffer used by sata */
49463aa5377SAlan Perry #define	SATA_MAX_SENSE_LEN	MAX(sizeof (struct scsi_arq_status), \
49563aa5377SAlan Perry     sizeof (struct scsi_arq_status) - sizeof (struct scsi_extended_sense) + \
49663aa5377SAlan Perry     sizeof (struct scsi_descr_sense_hdr) + \
49763aa5377SAlan Perry     MAX(sizeof (struct scsi_cmd_specific_sense_descr), \
49863aa5377SAlan Perry     sizeof (struct scsi_ata_status_ret_sense_descr)))
49963aa5377SAlan Perry 
50063aa5377SAlan Perry /*
50163aa5377SAlan Perry  * Sense Data structure for ATA Pass Through
50263aa5377SAlan Perry  * This is the entire sense data block passed back up to scsi.  It is
50363aa5377SAlan Perry  * effectively the scsi_arq_status structure for ATA Sense Return descriptor
50463aa5377SAlan Perry  * format sense data.
50563aa5377SAlan Perry  */
50663aa5377SAlan Perry struct sata_apt_sense_data {
50763aa5377SAlan Perry 	struct scsi_status				apt_status;
50863aa5377SAlan Perry 	struct scsi_status				apt_rqpkt_status;
50963aa5377SAlan Perry 	uchar_t						apt_rqpkt_reason;
51063aa5377SAlan Perry 	uchar_t						apt_rqpkt_resid;
51163aa5377SAlan Perry 	uint_t						apt_rqpkt_state;
51263aa5377SAlan Perry 	uint_t						apt_rqpkt_statistics;
51363aa5377SAlan Perry 	struct scsi_descr_sense_hdr			apt_sd_hdr;
51463aa5377SAlan Perry 	struct scsi_ata_status_ret_sense_descr		apt_sd_sense;
51563aa5377SAlan Perry };
51663aa5377SAlan Perry 
51766f9d5cbSmlf 
51866f9d5cbSmlf /*
51966f9d5cbSmlf  * Additional scsi sense code definitions.
5202038334aSUnknown  * These definition should eventually be moved to scsi header file
5212038334aSUnknown  * usr/src/uts/common/sys/scsi/generic/sense.h
52266f9d5cbSmlf  */
5232038334aSUnknown #define	SD_SCSI_ASC_NO_ADD_SENSE			0x00
524*2acf01fdSYuri Pankov #define	SD_SCSI_ASC_APT_INFO_AVAIL			0x00
5252038334aSUnknown #define	SD_SCSI_ASC_LU_NOT_READY			0x04
52663aa5377SAlan Perry #define	SD_SCSI_ASC_LU_NOT_RESPONSE			0x05
527c75976d1Spawelw #define	SD_SCSI_ASC_WRITE_ERR				0x0c
528c75976d1Spawelw #define	SD_SCSI_ASC_UNREC_READ_ERR			0x11
5292038334aSUnknown #define	SD_SCSI_ASC_INVALID_COMMAND_CODE		0x20
5302038334aSUnknown #define	SD_SCSI_ASC_LBA_OUT_OF_RANGE			0x21
5312038334aSUnknown #define	SD_SCSI_ASC_INVALID_FIELD_IN_CDB		0x24
5322038334aSUnknown #define	SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST	0x26
53363aa5377SAlan Perry #define	SD_SCSI_ASC_WRITE_PROTECTED			0x27
53463aa5377SAlan Perry #define	SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED		0x28
5352038334aSUnknown #define	SD_SCSI_ASC_RESET				0x29
5362ee4dfc7SJane Chu #define	SD_SCSI_ASC_CMD_SEQUENCE_ERR			0x2c
53763aa5377SAlan Perry #define	SD_SCSI_ASC_MEDIUM_NOT_PRESENT			0x3a
53863aa5377SAlan Perry #define	SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED		0x39
53963aa5377SAlan Perry #define	SD_SCSI_ASC_INTERNAL_TARGET_FAILURE		0x44
54063aa5377SAlan Perry #define	SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR			0x47
54163aa5377SAlan Perry #define	SD_SCSI_ASC_OP_MEDIUM_REM_REQ			0x5a
5422ee4dfc7SJane Chu #define	SD_SCSI_ASC_LOW_POWER_CONDITION_ON		0x5e
54366f9d5cbSmlf 
54466f9d5cbSmlf 
54566f9d5cbSmlf /* SCSI defs missing from scsi headers */
54666f9d5cbSmlf /* Missing from sys/scsi/generic/commands.h */
54766f9d5cbSmlf #define	SCMD_SYNCHRONIZE_CACHE_G1		0x91
54866f9d5cbSmlf /*
54966f9d5cbSmlf  * Missing from sys/scsi/impl/mode.h, although defined
55066f9d5cbSmlf  * in sys/scsi/targets/sddefs.h as MODEPAGE_ERR_RECOV
55166f9d5cbSmlf  */
55266f9d5cbSmlf #define	MODEPAGE_RW_ERRRECOV			0x01 /* read/write recovery */
5530bc523e5SAlan Perry /* Missing from sys/scsi/impl/commands.h */
5540bc523e5SAlan Perry #define	SCSI_READ_CAPACITY16_MAX_LBA		0xfffffffffffffffe
55566f9d5cbSmlf 
55666f9d5cbSmlf /*
5572ee4dfc7SJane Chu  * medium access command
5582ee4dfc7SJane Chu  */
5592ee4dfc7SJane Chu #define	SATA_IS_MEDIUM_ACCESS_CMD(cmd) \
5602ee4dfc7SJane Chu 	(((cmd) == SCMD_READ) || ((cmd) == SCMD_WRITE) || \
5612ee4dfc7SJane Chu 	((cmd) == SCMD_READ_G1) || ((cmd) == SCMD_WRITE_G1) || \
5622ee4dfc7SJane Chu 	((cmd) == SCMD_READ_G4) || ((cmd) == SCMD_WRITE_G4) || \
5632ee4dfc7SJane Chu 	((cmd) == SCMD_READ_G5) || ((cmd) == SCMD_WRITE_G5) || \
5642ee4dfc7SJane Chu 	((cmd) == SCMD_VERIFY) || ((cmd) == SCMD_VERIFY_G4) || \
5652ee4dfc7SJane Chu 	((cmd) == SCMD_VERIFY_G5) || ((cmd) == 0x7f) /* VERIFY(32) */|| \
5662ee4dfc7SJane Chu 	((cmd) == SCMD_SYNCHRONIZE_CACHE) || ((cmd) == SCMD_SPACE_G4) || \
5672ee4dfc7SJane Chu 	((cmd) == SCMD_READ_POSITION) || \
5682ee4dfc7SJane Chu 	((cmd) == 0x90) /* PRE-FETCH(16) */ || \
5692ee4dfc7SJane Chu 	((cmd) == SCMD_READ_DEFECT_LIST) || \
5702ee4dfc7SJane Chu 	((cmd) == 0xb7) /* READ DEFECT DATA */ || \
5712ee4dfc7SJane Chu 	((cmd) == SCMD_READ_LONG) || ((cmd) == SCMD_SVC_ACTION_IN_G4) || \
5722ee4dfc7SJane Chu 	((cmd) == SCMD_WRITE_LONG) || ((cmd) == SCMD_SVC_ACTION_OUT_G4) || \
5732ee4dfc7SJane Chu 	((cmd) == 0x41) || ((cmd) == 0x93) || /* WRITE SAME */ \
5742ee4dfc7SJane Chu 	((cmd) == 0x52) || ((cmd) == 0x50) || /* XDREAD & XDWRITE */ \
5752ee4dfc7SJane Chu 	((cmd) == 0x53) || ((cmd) == 0x51) || /* XDWRITEREAD & XPWRITE */ \
5762ee4dfc7SJane Chu 	((cmd) == 0x7f))
5772ee4dfc7SJane Chu 
5782ee4dfc7SJane Chu /*
57966f9d5cbSmlf  * Macros for accessing various structure fields
58066f9d5cbSmlf  */
58166f9d5cbSmlf 
58266f9d5cbSmlf #define	SATA_TRAN(sata_hba_inst) \
58366f9d5cbSmlf 	sata_hba_inst->satahba_tran
58466f9d5cbSmlf 
58566f9d5cbSmlf #define	SATA_DIP(sata_hba_inst) \
58666f9d5cbSmlf 	sata_hba_inst->satahba_dip
58766f9d5cbSmlf 
58866f9d5cbSmlf #define	SATA_NUM_CPORTS(sata_hba_inst) \
58966f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_hba_num_cports
59066f9d5cbSmlf 
59166f9d5cbSmlf #define	SATA_QDEPTH(sata_hba_inst) \
59266f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_hba_qdepth
59366f9d5cbSmlf 
59466f9d5cbSmlf #define	SATA_FEATURES(sata_hba_inst) \
59566f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_hba_features_support
59666f9d5cbSmlf 
59766f9d5cbSmlf #define	SATA_DMA_ATTR(sata_hba_inst) \
59866f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_hba_dma_attr
59966f9d5cbSmlf 
60066f9d5cbSmlf #define	SATA_START_FUNC(sata_hba_inst) \
60166f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_start
60266f9d5cbSmlf 
60366f9d5cbSmlf #define	SATA_ABORT_FUNC(sata_hba_inst) \
60466f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_abort
60566f9d5cbSmlf 
60666f9d5cbSmlf #define	SATA_RESET_DPORT_FUNC(sata_hba_inst) \
60766f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_reset_dport
60866f9d5cbSmlf 
60966f9d5cbSmlf #define	SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) \
61066f9d5cbSmlf 	(sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
61166f9d5cbSmlf 	NULL : \
61266f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
61366f9d5cbSmlf 	sata_tran_port_deactivate)
61466f9d5cbSmlf 
61566f9d5cbSmlf #define	SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) \
61666f9d5cbSmlf 	(sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
61766f9d5cbSmlf 	NULL : \
61866f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
61966f9d5cbSmlf 	sata_tran_port_activate)
62066f9d5cbSmlf 
62166f9d5cbSmlf #define	SATA_PROBE_PORT_FUNC(sata_hba_inst) \
62266f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_probe_port
62366f9d5cbSmlf 
62466f9d5cbSmlf #define	SATA_SELFTEST_FUNC(sata_hba_inst) \
62566f9d5cbSmlf 	sata_hba_inst->satahba_tran->sata_tran_selftest
62666f9d5cbSmlf 
62766f9d5cbSmlf #define	SATA_CPORT_MUTEX(sata_hba_inst, cport) \
62866f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->cport_mutex
62966f9d5cbSmlf 
63066f9d5cbSmlf #define	SATA_CPORT_INFO(sata_hba_inst, cport) \
63166f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]
63266f9d5cbSmlf 
63366f9d5cbSmlf #define	SATA_CPORT_STATE(sata_hba_inst, cport) \
63466f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->cport_state
63566f9d5cbSmlf 
6364360436bSpawelw #define	SATA_CPORT_EVENT_FLAGS(sata_hba_inst, cport) \
6374360436bSpawelw 	sata_hba_inst->satahba_dev_port[cport]->cport_event_flags
6384360436bSpawelw 
63966f9d5cbSmlf #define	SATA_CPORT_SCR(sata_hba_inst, cport) \
64066f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->cport_scr
64166f9d5cbSmlf 
64266f9d5cbSmlf #define	SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) \
64366f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->cport_dev_type
64466f9d5cbSmlf 
64566f9d5cbSmlf #define	SATA_CPORT_DRV_INFO(sata_hba_inst, cport) \
64666f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_drive
64766f9d5cbSmlf 
64866f9d5cbSmlf #define	SATA_CPORTINFO_DRV_TYPE(cportinfo) \
64966f9d5cbSmlf 	cportinfo->cport_dev_type
65066f9d5cbSmlf 
65166f9d5cbSmlf #define	SATA_CPORTINFO_DRV_INFO(cportinfo) \
65266f9d5cbSmlf 	cportinfo->cport_devp.cport_sata_drive
65366f9d5cbSmlf 
65466f9d5cbSmlf #define	SATA_CPORTINFO_PMULT_INFO(cportinfo) \
65566f9d5cbSmlf 	cportinfo->cport_devp.cport_sata_pmult
65666f9d5cbSmlf 
65766f9d5cbSmlf #define	SATA_PMULT_INFO(sata_hba_inst, cport) \
65866f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_pmult
65966f9d5cbSmlf 
66066f9d5cbSmlf #define	SATA_NUM_PMPORTS(sata_hba_inst, cport) \
66166f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->\
66266f9d5cbSmlf 	cport_devp.cport_sata_pmult->pmult_num_dev_ports
66366f9d5cbSmlf 
6648aa6aadbSXiao-Yu Zhang #define	SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport) \
6658aa6aadbSXiao-Yu Zhang 	sata_hba_inst->satahba_dev_port[cport]->\
6668aa6aadbSXiao-Yu Zhang 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_mutex
6678aa6aadbSXiao-Yu Zhang 
66866f9d5cbSmlf #define	SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) \
66966f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->\
67066f9d5cbSmlf 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]
67166f9d5cbSmlf 
67266f9d5cbSmlf #define	SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport) \
67366f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->\
67466f9d5cbSmlf 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\
67566f9d5cbSmlf 	pmport_sata_drive
67666f9d5cbSmlf 
67766f9d5cbSmlf #define	SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) \
67866f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->\
67966f9d5cbSmlf 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_state
68066f9d5cbSmlf 
68166f9d5cbSmlf #define	SATA_PMPORT_SCR(sata_hba_inst, cport, pmport) \
68266f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->\
68366f9d5cbSmlf 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_scr
68466f9d5cbSmlf 
68566f9d5cbSmlf #define	SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport) \
68666f9d5cbSmlf 	sata_hba_inst->satahba_dev_port[cport]->\
68766f9d5cbSmlf 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_dev_type
68866f9d5cbSmlf 
6898aa6aadbSXiao-Yu Zhang #define	SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, cport, pmport) \
6908aa6aadbSXiao-Yu Zhang 	sata_hba_inst->satahba_dev_port[cport]->\
6918aa6aadbSXiao-Yu Zhang 	cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\
6928aa6aadbSXiao-Yu Zhang 	pmport_event_flags
6938aa6aadbSXiao-Yu Zhang 
694c75976d1Spawelw #define	SATA_PMPORTINFO_DRV_TYPE(pmportinfo) \
695c75976d1Spawelw 	pmportinfo->pmport_dev_type
696c75976d1Spawelw 
697c75976d1Spawelw #define	SATA_PMPORTINFO_DRV_INFO(pmportinfo) \
698c75976d1Spawelw 	pmportinfo->pmport_sata_drive
699c75976d1Spawelw 
70066f9d5cbSmlf #define	SATA_TXLT_HBA_INST(spx) \
70166f9d5cbSmlf 	spx->txlt_sata_hba_inst
70266f9d5cbSmlf 
70366f9d5cbSmlf #define	SATA_TXLT_CPORT(spx) \
70466f9d5cbSmlf 	spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport
70566f9d5cbSmlf 
7068aa6aadbSXiao-Yu Zhang #define	SATA_TXLT_PMPORT(spx) \
7078aa6aadbSXiao-Yu Zhang 	spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport
7088aa6aadbSXiao-Yu Zhang 
7098aa6aadbSXiao-Yu Zhang #define	SATA_TXLT_QUAL(spx) \
7108aa6aadbSXiao-Yu Zhang 	spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual
7118aa6aadbSXiao-Yu Zhang 
71266f9d5cbSmlf #define	SATA_TXLT_CPORT_MUTEX(spx) \
71366f9d5cbSmlf 	spx->txlt_sata_hba_inst->\
71466f9d5cbSmlf 	satahba_dev_port[spx->txlt_sata_pkt->\
71566f9d5cbSmlf 	satapkt_device.satadev_addr.cport]->cport_mutex
71666f9d5cbSmlf 
7177a1efdfeSpawelw #define	SATA_TXLT_TASKQ(spx) \
7187a1efdfeSpawelw 	spx->txlt_sata_hba_inst->\
7197a1efdfeSpawelw 	satahba_taskq
7207a1efdfeSpawelw 
72166f9d5cbSmlf /*
72266f9d5cbSmlf  * Minor number construction for devctl and attachment point nodes.
72366f9d5cbSmlf  * All necessary information has to be encoded in NBITSMINOR32 bits.
72466f9d5cbSmlf  *
72566f9d5cbSmlf  * Devctl node minor number:
72666f9d5cbSmlf  * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_DEVCTL_NODE)
72766f9d5cbSmlf  *
72866f9d5cbSmlf  * Attachment point node minor number has to include controller
72966f9d5cbSmlf  * instance (7 bits), controller port number (5 bits) and port multiplier
73066f9d5cbSmlf  * device port number (4 bits) and port multiplier device port
73166f9d5cbSmlf  * indicator (1 bit).  Additionally, a single bit is used to
73266f9d5cbSmlf  * differentiate between attachment point node and device control node.
73366f9d5cbSmlf  *
73466f9d5cbSmlf  * Attachment point minor number:
73566f9d5cbSmlf  * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_AP_NODE |
73666f9d5cbSmlf  * [(port_multiplier_device_port << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP] |
73766f9d5cbSmlf  * (controller_port))
73866f9d5cbSmlf  *
73966f9d5cbSmlf  * 17 bits are used (if 64 instances of controllers are expected)
74066f9d5cbSmlf  * bit 18 is reserved for future use.
74166f9d5cbSmlf  *
74266f9d5cbSmlf  *   --------------------------------------------------------
74366f9d5cbSmlf  *   |17|16|15|14|13|12|11|10 |09|08|07|06|05|04|03|02|01|00|
74466f9d5cbSmlf  *   --------------------------------------------------------
74566f9d5cbSmlf  *   | R| c| c| c| c| c| c|a/d|pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
74666f9d5cbSmlf  *   --------------------------------------------------------
74766f9d5cbSmlf  * Where:
74866f9d5cbSmlf  * cp  - device port number on the HBA SATA controller
74966f9d5cbSmlf  * pp  - device port number on the port multiplier
75066f9d5cbSmlf  * pm  - 0 - target attached to controller device port
75166f9d5cbSmlf  *       1 - target attached to port multiplier's device port
75266f9d5cbSmlf  * a/d - 0 - devctl node
75366f9d5cbSmlf  *       1 - attachment point node
75466f9d5cbSmlf  * c   - controller number
75566f9d5cbSmlf  * R   - reserved bit
75666f9d5cbSmlf  */
75766f9d5cbSmlf 
75866f9d5cbSmlf #define	SATA_AP_NODE		0x400		/* Attachment Point node */
75966f9d5cbSmlf #define	SATA_DEVCTL_NODE	0x000		/* DEVCTL node */
76066f9d5cbSmlf #define	SATA_PMULT_AP		0x200		/* device on PMult port */
76166f9d5cbSmlf #define	SATA_PMULT_PORT_SHIFT	5
76266f9d5cbSmlf #define	SATA_CNTRL_INSTANCE_SHIFT 11
76366f9d5cbSmlf #define	SATA_CPORT_MASK		0x1f		/* 32 device ports */
76466f9d5cbSmlf #define	SATA_PMULT_PORT_MASK	0xf		/* 15 device ports */
76566f9d5cbSmlf #define	SATA_CNTRL_INSTANCE_MASK 0x03F		/* 64 controllers */
76666f9d5cbSmlf 
76766f9d5cbSmlf /* Macro for creating devctl node minor number */
76866f9d5cbSmlf #define	SATA_MAKE_DEVCTL_MINOR(controller_instance) \
76966f9d5cbSmlf 	((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | \
77066f9d5cbSmlf 	SATA_DEVCTL_NODE)
77166f9d5cbSmlf 
77266f9d5cbSmlf /* Macro for creating an attachment point node minor number */
77366f9d5cbSmlf #define	SATA_MAKE_AP_MINOR(cntrl_instance, cport, pmport, qual) \
77466f9d5cbSmlf 	(qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT) ? \
77566f9d5cbSmlf 	(((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \
77666f9d5cbSmlf 	SATA_AP_NODE | SATA_PMULT_AP | \
77766f9d5cbSmlf 	(pmport << SATA_PMULT_PORT_SHIFT) | cport) : \
77866f9d5cbSmlf 	(((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \
77966f9d5cbSmlf 	SATA_AP_NODE | cport))
78066f9d5cbSmlf 
78166f9d5cbSmlf /* Macro retrieving controller number from a minor number */
78266f9d5cbSmlf #define	SATA_MINOR2INSTANCE(minor) \
78366f9d5cbSmlf 	((minor >> SATA_CNTRL_INSTANCE_SHIFT) & SATA_CNTRL_INSTANCE_MASK)
78466f9d5cbSmlf 
785f76ee27aSpawelw /*
786f76ee27aSpawelw  * Macro for creating an attachment point number from sata address.
787f76ee27aSpawelw  * Address qualifier has to be one of:
788f76ee27aSpawelw  * SATA_ADDR_DCPORT, SATA_ADDR_DPMPORT, SATA_ADDR_CPORT or SATA_ADDR_PMPORT
789f76ee27aSpawelw  */
790f76ee27aSpawelw #define	SATA_MAKE_AP_NUMBER(cport, pmport, qual) \
791f76ee27aSpawelw 	((qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) ? \
792f76ee27aSpawelw 	(SATA_PMULT_AP | (pmport << SATA_PMULT_PORT_SHIFT) | cport) : \
793f76ee27aSpawelw 	(cport))
79466f9d5cbSmlf 
79566f9d5cbSmlf /*
79666f9d5cbSmlf  * SCSI target number format
79766f9d5cbSmlf  *
79866f9d5cbSmlf  *   -------------------------------
79966f9d5cbSmlf  *   | 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|    Bit number
80066f9d5cbSmlf  *   -------------------------------
80166f9d5cbSmlf  *   |pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
80266f9d5cbSmlf  *   -------------------------------
80366f9d5cbSmlf  * Where:
80466f9d5cbSmlf  * cp  - device port number on the HBA SATA controller
80566f9d5cbSmlf  * pp  - device port number on the port multiplier
80666f9d5cbSmlf  * pm  - 0 - target attached to controller device port
80766f9d5cbSmlf  *       1 - target attached to port multiplier's device port
80866f9d5cbSmlf  */
80966f9d5cbSmlf 
81066f9d5cbSmlf /* SATA ports to SCSI target number translation */
81166f9d5cbSmlf 
81266f9d5cbSmlf #define	SATA_TO_SCSI_TARGET(cport, pmport, qual) \
81366f9d5cbSmlf 	(qual == SATA_ADDR_DCPORT ? cport : \
81466f9d5cbSmlf 	(cport | (pmport << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP))
81566f9d5cbSmlf 
81666f9d5cbSmlf /* SCSI target number to SATA cntrl/pmport/cport translations */
81766f9d5cbSmlf #define	SCSI_TO_SATA_CPORT(scsi_target) \
81866f9d5cbSmlf 	(scsi_target & SATA_CPORT_MASK)
81966f9d5cbSmlf 
82066f9d5cbSmlf #define	SCSI_TO_SATA_PMPORT(scsi_target) \
82166f9d5cbSmlf 	((scsi_target >> SATA_PMULT_PORT_SHIFT) & SATA_PMULT_PORT_MASK)
82266f9d5cbSmlf 
82366f9d5cbSmlf #define	SCSI_TO_SATA_ADDR_QUAL(scsi_target) \
82466f9d5cbSmlf 	((scsi_target & SATA_PMULT_AP) ? SATA_ADDR_DPMPORT : \
82566f9d5cbSmlf 	SATA_ADDR_DCPORT)
82666f9d5cbSmlf 
82766f9d5cbSmlf 
82866f9d5cbSmlf /* Debug flags */
82966f9d5cbSmlf #if	DEBUG
83066f9d5cbSmlf 
83166f9d5cbSmlf #define	SATA_DEBUG
83266f9d5cbSmlf #define	SATA_DBG_SCSI_IF	1
83366f9d5cbSmlf #define	SATA_DBG_HBA_IF		2
83466f9d5cbSmlf #define	SATA_DBG_NODES		4
83566f9d5cbSmlf #define	SATA_DBG_IOCTL_IF	8
83666f9d5cbSmlf #define	SATA_DBG_EVENTS		0x10
83766f9d5cbSmlf #define	SATA_DBG_EVENTS_PROC	0x20
83866f9d5cbSmlf #define	SATA_DBG_EVENTS_PROCPST	0x40
83966f9d5cbSmlf #define	SATA_DBG_EVENTS_CNTRL	0x80
84066f9d5cbSmlf #define	SATA_DBG_EVENTS_DAEMON	0x100
84166f9d5cbSmlf #define	SATA_DBG_DMA_SETUP	0x400
842b7343288Spawelw #define	SATA_DBG_DEV_SETTINGS	0x800
8432038334aSUnknown #define	SATA_DBG_ATAPI		0x1000
8442038334aSUnknown #define	SATA_DBG_ATAPI_PACKET	0x8000
8453852f673SPawel Wojcik #define	SATA_DBG_INTR_CTX	0x10000
8468aa6aadbSXiao-Yu Zhang #define	SATA_DBG_PMULT		0x20000
8472038334aSUnknown 
8482038334aSUnknown typedef struct sata_atapi_cmd {
8492038334aSUnknown 	uint8_t acdb[SATA_ATAPI_MAX_CDB_LEN];
8502038334aSUnknown 	uint8_t arqs[SATA_ATAPI_RQSENSE_LEN];
8512038334aSUnknown 	uint_t sata_pkt_reason;
8522038334aSUnknown 	uint_t scsi_pkt_reason;
8532038334aSUnknown } sata_atapi_cmd_t;
85466f9d5cbSmlf 
85566f9d5cbSmlf /* Debug macros */
85666f9d5cbSmlf #define	SATADBG1(flag, sata, format, arg1) \
85766f9d5cbSmlf 	if (sata_debug_flags & (flag)) { \
85866f9d5cbSmlf 		sata_log(sata, CE_CONT, format, arg1); \
85966f9d5cbSmlf 	}
86066f9d5cbSmlf 
86166f9d5cbSmlf #define	SATADBG2(flag, sata, format, arg1, arg2) \
86266f9d5cbSmlf 	if (sata_debug_flags & (flag)) { \
86366f9d5cbSmlf 		sata_log(sata, CE_CONT, format, arg1, arg2); \
86466f9d5cbSmlf 	}
86566f9d5cbSmlf 
86666f9d5cbSmlf #define	SATADBG3(flag, sata, format, arg1, arg2, arg3) \
86766f9d5cbSmlf 	if (sata_debug_flags & (flag)) { \
86866f9d5cbSmlf 		sata_log(sata, CE_CONT, format, arg1, arg2, arg3); \
86966f9d5cbSmlf 	}
87066f9d5cbSmlf #else
87166f9d5cbSmlf 
87266f9d5cbSmlf #define	SATADBG1(flag, dip, frmt, arg1)
87366f9d5cbSmlf #define	SATADBG2(flag, dip, frmt, arg1, arg2)
87466f9d5cbSmlf #define	SATADBG3(flag, dip, frmt, arg1, arg2, arg3)
87566f9d5cbSmlf 
87666f9d5cbSmlf #endif
87766f9d5cbSmlf 
878918304a3SXiao-Yu Zhang /* sata_rev_tag 1.46 */
8793852f673SPawel Wojcik 
88066f9d5cbSmlf #ifdef	__cplusplus
88166f9d5cbSmlf }
88266f9d5cbSmlf #endif
88366f9d5cbSmlf 
88466f9d5cbSmlf #endif /* _SATA_H */
885