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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright (c) 1991,1997-1998 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27#ifndef	_SYS_DKMPIO_H
28#define	_SYS_DKMPIO_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31/* from dualport: dkmpio.h 1.5 91/04/11 SMI	*/
32
33/*
34 * Structures and definitions for multi port disk io control commands
35 */
36
37#ifdef __cplusplus
38extern "C" {
39#endif
40
41/*
42 * Disk driver multi port state.
43 * dk_gmpstate.dkg_mpstate and dk_smpstate.dks_mpstate values.
44 */
45enum dk_mpstate { DKS_INITIAL, DKS_OFFLINE, DKS_ONLINE, DKS_FREEZE};
46
47/*
48 * Disk drive protocol types
49 * dk_mpinfo.dke_mptype values.
50 */
51enum dk_mptype { DKT_IPI, DKT_SCSI, DKT_UNKNOWN };
52
53/*
54 * Used for getting disk driver multi port state and status
55 */
56struct dk_gmpstate {
57	enum dk_mpstate	dkg_mpstate;		/* output: current state */
58	uint_t		dkg_fail_state;		/* output: fail state */
59	uint_t		dkg_current_status; /* output: current drive status */
60	int		dkg_pad[4];		/* Pads for future use */
61};
62
63/*
64 * Used for setting driver multi port state and status
65 */
66struct dk_smpstate {
67	enum dk_mpstate	dks_mpstate;		/* input: requested state */
68	int		dks_pad[2];		/* Pads for future use */
69};
70
71/*
72 * flags for current status, ro
73 * dk_gmpstate.dkg_current_status definitions.
74 */
75#define	DKF_DRV_RESERVED	0x00000001	/* drive reserved */
76#define	DKF_DRV_DUAL_ENABLED	0x00000002	/* both ports are enabled */
77#define	DKF_DRV_RESET		0x00000004	/* drive was reset */
78#define	DKF_DRV_WRTPROT		0x00000008	/* drive was write protect */
79#define	DKF_DRV_BUSY		0x00000010	/* drive seems busy */
80#define	DKF_DRV_TIMEOUT		0x00000020	/* drive timed out */
81#define	DKF_DRV_DUALPORTED	0x00000040	/* drive is used dual ported */
82#define	DKF_DRV_ALTRSVD		0x00000080	/* Alternate port reserved */
83#define	DKF_ADAPT_RESERVED	0x00000100	/* host adaptor reserved */
84#define	DKF_ADAPT_RESET		0x00000400	/* host adaptor was reset */
85#define	DKF_ADAPT_BUSY		0x00001000	/* host adaptor seems busy */
86#define	DKF_ADAPT_TIMEOUT	0x00002000	/* host adaptor timed out */
87#define	DKF_CTLR_RESERVED	0x00010000	/* ctlr reserved */
88#define	DKF_CTLR_RESET		0x00040000	/* ctlr was reset */
89#define	DKF_CTLR_BUSY		0x00100000	/* host adaptor seems busy */
90#define	DKF_CTLR_TIMEOUT	0x02000000	/* host adaptor timed out */
91
92/*
93 * Volatile disk drive fail state flags, ro
94 * dk_gmpstate.dkg_fail_state flags definitions.
95 */
96#define	DKF_DRV_RSV_LOST	0x00000001	/* drive lost reservation */
97#define	DKF_CTLR_RSV_LOST	0x00000002	/* ctlr lost reservation */
98#define	DKF_DRV_DIAGNOSED	0x00000004	/* drive self diag. */
99						/* reports error */
100#define	DKF_CTLR_DIAGNOSED	0x00000008	/* ctlr self diag. */
101						/* reports error */
102#define	DKF_ADAPT_DIAGNOSED	0x00000010	/* host adapt. self diag. */
103						/* reports error */
104#define	DKF_DRV_FAILED		0x00001000	/* drive failure */
105#define	DKF_CTLR_FAILED		0x00100000	/* controller failure */
106#define	DKF_ADAPT_FAILED	0x10000000	/* host adaptor failure */
107
108/*
109 * Used for getting disk drive error counts
110 */
111struct dk_mpdrv_status {
112	uint_t	dkd_cum_drv_soft_errors; /* cumulative drive soft errors */
113	uint_t	dkd_cum_drv_hard_errors; /* cumulative drive media errors */
114	uint_t	dkd_cum_drv_retries;	/* cumulative successful drive */
115					/* retries on media errors */
116	int	dkd_pad[4];		/* Pads for future use */
117};
118
119/*
120 * Used to set/get the configuration and control/status flags
121 */
122struct dk_mpflags {
123	uint_t	dkf_config_flags;		/* config flags, ro */
124	uint_t	dkf_control_flags;		/* control flags, rw */
125	int	dkf_pad[4];			/* Pads for future use */
126};
127
128/*
129 * Volatile disk drive configuration status flags, ro
130 * dk_mpflags.dkf_config_flags definitions.
131 */
132#define	DKF_DRV_NOEXIST		0x00000001	/* non-existent drive */
133#define	DKF_CTLR_NOEXIST	0x00000002	/* non-existent controller */
134#define	DKF_ADAPT_NOEXIST	0x00000004	/* non-existent host adaptor */
135
136/*
137 * Non-destructive configuration control flags, r/w
138 * dk_mpflags.dkf_control_flags definitions.
139 */
140#define	DKF_ORDERED		0x00000001	/* write ordering of sectors */
141#define	DKF_PANIC_ABORT		0x00000002	/* commands aborted at panic */
142#define	DKF_RERUN_UNR_CMDS	0x00000004	/* rerun commands after reset */
143						/* on unreserved unit occurs */
144#define	DKF_RERUN_RSV_CMDS	0x00000008	/* rerun commands after reset */
145						/* on reserved unit occurs */
146#define	DKF_AUTOFAIL		0x00000010	/* make drive/ctlr/adapter */
147						/* unavailable after a */
148						/* failure */
149
150
151
152/*
153 * Extended info: used for getting all the multi port info
154 */
155struct dk_mpinfo {
156	struct dk_gmpstate	dke_mpstate; /* current state & drive status */
157	struct dk_mpflags	dke_mpflags;	/* config/control flags */
158	struct dk_mpdrv_status	dke_mpdrv_status; /* cumulative for errors */
159	enum dk_mptype		dke_mptype;	/* drive type */
160	int			dke_qcapacity;	/* min freeze queue capacity */
161	uint_t			dke_max_quiesce; /* maxtime to quiesce drive */
162	int			dke_pad[4];	/* Pads for future use */
163};
164
165/*
166 * Used for reserve, release, reset, abort, probe and reinitialization.
167 * May use with the "common command list" flags.
168 */
169struct dk_mpcmd {
170	uint_t		dkc_mpcmd;		/* command */
171	uint_t		dkc_mpflags;		/* execution flags */
172	caddr_t		dkc_bufaddr;		/* user's buffer address */
173	uint_t 		dkc_buflen;		/* size of user's buffer */
174	int		dkc_pad[4];		/* Pads for future use */
175};
176
177/*
178 * Common command list, for all protocols.
179 * dk_mpcmd.dkc_mpcmd definitions.
180 */
181#define	DKF_RESERVE	0x00000001		/* reserve drive */
182#define	DKF_RELEASE	0x00000002		/* release drive */
183#define	DKF_RESET	0x00000004		/* reset drive */
184#define	DKF_ABORT	0x00000008		/* abort all cmds */
185#define	DKF_PROBE	0x00000010		/* ping drive */
186#define	DKF_REINIT	0x00000020		/* reinitialize drive */
187
188/*
189 * Execution flags.
190 * dk_mpcmd.dkc_mpflags definitions.
191 */
192#define	DKF_DIAGNOSE	0x00000001	/* fail if any error occurs */
193#define	DKF_ISOLATE	0x00000002	/* isolate from normal commands */
194#define	DKF_READ	0x00000004	/* get data from device */
195#define	DKF_WRITE	0x00000008	/* send data to device */
196#define	DKF_DESTRUCTIVE	0x00000010	/* destructive action ok */
197
198/*
199 * Disk io control commands
200 */
201#define	DKIOCGMPINFO	(DIOC | 90) /* struct dk_mpinfo Get mp info */
202#define	DKIOCGMPSTATE	(DIOC | 91) /* struct dk_gmpstate Get mp state */
203#define	DKIOCSMPSTATE	(DIOC | 92) /* struct dk_smpstate Set mp state */
204#define	DKIOCGSTATUS	(DIOC | 93) /* struct dk_mpdrv_status Get drv status */
205#define	DKIOCGMPFLAGS	(DIOC | 94) /* struct dk_mpflags Get mp flags */
206#define	DKIOCSMPFLAGS	(DIOC | 95) /* struct dk_mpflags Set mp flags */
207#define	DKIOCSMPCMD	(DIOC | 96) /* struct dk_mpcmd Set generic mp cmd */
208
209#ifdef __cplusplus
210}
211#endif
212
213#endif	/* !_SYS_DKMPIO_H */
214