xref: /illumos-gate/usr/src/uts/sun/sys/dada/targets/daddef.h (revision a4aa671e336d5c717aff15808ab91a6bee5e6e41)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SYS_DADA_TARGETS_DADDF_H
27 #define	_SYS_DADA_TARGETS_DADDF_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 #include <sys/note.h>
31 #include <sys/cmlb.h>
32 
33 #ifdef	__cplusplus
34 extern "C" {
35 #endif
36 
37 /*
38  * Defines for SCSI direct access devices
39  */
40 
41 #define	FIXEDFIRMWARE	/* fixed firmware for volume control */
42 
43 #if	defined(_KERNEL) || defined(_KMEMUSER)
44 
45 
46 /*
47  * Local definitions, for clarity of code
48  */
49 #define	DCD_DCD_DEVP	(un->un_dcd)
50 #define	DCD_DEVINFO	(DCD_DCD_DEVP->dcd_dev)
51 #define	DCD_IDENTIFY	(DCD_DCD_DEVP->dcd_ident)
52 #define	DCD_MUTEX	(&DCD_DCD_DEVP->dcd_mutex)
53 #define	ROUTE		(DCD_DCD_DEVP->dcd_address)
54 #define	SECDIV		(un->un_secdiv)
55 #define	SECSIZE		(un->un_secsize)
56 #define	SCBP(pkt)	((struct dcd_status *)(pkt)->pkt_scbp)
57 #define	SCBP_C(pkt)	((*(pkt)->pkt_scbp) & STATUS_ATA_MASK)
58 #define	CDBP(pkt)	((union scsi_cdb *)(pkt)->pkt_cdbp)
59 #define	NO_PKT_ALLOCATED ((struct buf *)0)
60 #define	ALLOCATING_PKT	((struct buf *)-1)
61 #define	BP_PKT(bp)	((struct dcd_pkt *)bp->av_back)
62 #define	BP_HAS_NO_PKT(bp) (bp->av_back == NO_PKT_ALLOCATED)
63 #define	MAX_ATA_XFER_SIZE (256*DEV_BSIZE)
64 
65 #define	STATUS_SCBP_C(statusp)	(*(uchar_t *)(statusp) & STATUS_ATA_MASK)
66 
67 #define	Tgt(devp)	(devp->dcd_address->a_target)
68 #define	Lun(devp)	(devp->dcd_address->a_lun)
69 
70 #define	New_state(un, s)	\
71 	(un)->un_last_state = (un)->un_state,  (un)->un_state = (s)
72 #define	Restore_state(un)	\
73 	{ uchar_t tmp = (un)->un_last_state; New_state((un), tmp); }
74 
75 
76 #define	CTYPE_DISK	 2
77 /*
78  * Structure for recording whether a device is fully open or closed.
79  * Assumptions:
80  *
81  *	+ There are only 8 partitions possible.
82  *	+ BLK, MNT, CHR, SWP don't change in some future release!
83  *
84  */
85 
86 #define	DCDUNIT_SHIFT	3
87 #define	DCDPART_MASK	7
88 #define	DCDUNIT(dev)	(getminor((dev))>>DCDUNIT_SHIFT)
89 #define	DCDPART(dev)	(getminor((dev)) & DCDPART_MASK)
90 
91 struct ocinfo {
92 	/*
93 	 * Types BLK, MNT, CHR, SWP,
94 	 * assumed to be types 0-3.
95 	 */
96 	ulong_t  lyr_open[NDKMAP];
97 	uchar_t  reg_open[OTYPCNT - 1];
98 };
99 #define	OCSIZE  sizeof (struct ocinfo)
100 union ocmap {
101 	uchar_t chkd[OCSIZE];
102 	struct ocinfo rinfo;
103 };
104 #define	lyropen rinfo.lyr_open
105 #define	regopen rinfo.reg_open
106 
107 /*
108  * Private info for dcd disks.
109  *
110  * Pointed to by the un_private pointer
111  * of one of the dcd_device structures.
112  */
113 
114 struct dcd_disk {
115 	struct dcd_device *un_dcd;	/* back pointer to dcd_device */
116 	struct dcd_drivetype *un_dp;	/* drive type table */
117 	struct	buf *un_sbufp;		/* for use in special io */
118 	char		*un_srqbufp;	/* sense buffer for special io */
119 	kcondvar_t	un_sbuf_cv;	/* Conditional Variable on sbufp */
120 	kcondvar_t	un_state_cv;	/* Conditional variable for state */
121 	union	ocmap un_ocmap;		/* open partition map, block && char */
122 	uchar_t	un_last_pkt_reason;	/* used for suppressing multiple msgs */
123 	struct	diskhd un_utab;		/* for queuing */
124 	struct	kstat *un_stats;	/* for statistics */
125 	struct	kstat *un_pstats[NDKMAP]; /* for partition statistics */
126 	ksema_t	un_semoclose;		/* lock for serializing opens/closes */
127 	uint_t	un_err_blkno;		/* disk block where error occurred */
128 	int	un_diskcapacity;	/* capacity as returned by drive */
129 	int	un_lbasize;		/* logical (i.e. device) block size */
130 	int	un_lbadiv;		/* log2 of lbasize */
131 	int	un_blknoshift;		/* log2 of multiple of DEV_BSIZE */
132 					/* blocks making up a logical block */
133 	int	un_secsize;		/* sector size (allow request on */
134 					/* this boundry) */
135 	int	un_secdiv;		/* log2 of secsize */
136 	uchar_t	un_exclopen;		/* exclusive open bits */
137 	uchar_t	un_mediastate;		/* Is it really needed  XXX */
138 	uchar_t	un_state;		/* current state */
139 	uchar_t	un_last_state;		/* last state */
140 	uchar_t	un_format_in_progress;	/* disk is formatting currently */
141 	uchar_t un_flush_not_supported;	/* disk doesn't support flush cmd */
142 	uchar_t	un_write_cache_enabled;	/* disk has write caching enabled */
143 	clock_t un_timestamp;		/* Time of last device access */
144 	short	un_ncmds;		/* number of cmds in transport */
145 	short	un_throttle;		/* This is used for throttling if */
146 					/* HBA has queuing		  */
147 	short	un_sbuf_busy;		/* Busy wait flag for the sbuf */
148 	int	un_cmd_flags;		/* cache some frequently used values */
149 	int	un_cmd_stat_size;	/* in make_sd_cmd */
150 	int	un_dcvb_timeid;		/* timeout id for dlyd cv broadcast */
151 	void 	*un_devid;		/* device id */
152 	uint_t	un_max_xfer_size;	/* max transfer size */
153 	uchar_t	un_bus_master;		/* Indicates that the HBA  enables  */
154 					/* Bus master capability */
155 	timeout_id_t	un_reissued_timeid;
156 					/* This is used in busy handler */
157 	kstat_t	*un_errstats;		/* For Error statsistics */
158 	kcondvar_t	un_suspend_cv;	/* Cond Var on power management */
159 	kcondvar_t	un_disk_busy_cv; /* Cond var to wait for IO */
160 	short	un_power_level;		/* Power Level */
161 	short	un_save_state;		/* Save the state for suspend/resume */
162 	cmlb_handle_t   un_dklbhandle;  /* Handle for disk label */
163 	tg_attribute_t un_tgattribute;
164 };
165 
166 /*
167  * device error statistics
168  */
169 struct dcd_errstats {
170 	struct kstat_named	dcd_softerrs;	/* Collecting Softerrs */
171 	struct kstat_named	dcd_harderrs;	/* Collecting harderrs */
172 	struct kstat_named	dcd_transerrs;	/* Collecting Transfer errs */
173 	struct kstat_named	dcd_model;	/* model # of the disk */
174 	struct kstat_named	dcd_revision;	/* The disk revision */
175 	struct kstat_named	dcd_serial;	/* The disk serial number */
176 	struct kstat_named	dcd_capacity;	/* Capacity of the disk */
177 	struct kstat_named	dcd_rq_media_err; /* Any media err seen */
178 	struct kstat_named	dcd_rq_ntrdy_err; /* Not ready errs */
179 	struct kstat_named	dcd_rq_nodev_err; /* No device errs */
180 	struct kstat_named	dcd_rq_recov_err; /* Recovered errs */
181 	struct kstat_named	dcd_rq_illrq_err; /* Illegal requests */
182 };
183 #define	DCD_MAX_XFER_SIZE	(1 * 512)
184 
185 _NOTE(MUTEX_PROTECTS_DATA(dcd_device::dcd_mutex, dcd_disk))
186 _NOTE(READ_ONLY_DATA(dcd_disk::un_dcd))
187 _NOTE(READ_ONLY_DATA(dcd_disk::un_cmd_stat_size))
188 _NOTE(SCHEME_PROTECTS_DATA("Save Sharing",
189 	dcd_disk::un_state
190 	dcd_disk::un_dklbhandle
191 	dcd_disk::un_format_in_progress))
192 
193 _NOTE(SCHEME_PROTECTS_DATA("stable data",
194 	dcd_disk::un_max_xfer_size
195 	dcd_disk::un_secdiv
196 	dcd_disk::un_secsize
197 	dcd_disk::un_cmd_flags
198 	dcd_disk::un_cmd_stat_size))
199 
200 _NOTE(SCHEME_PROTECTS_DATA("cv",
201 	dcd_disk::un_sbufp
202 	dcd_disk::un_srqbufp
203 	dcd_disk::un_sbuf_busy))
204 
205 _NOTE(SCHEME_PROTECTS_DATA("Unshared data",
206 	dk_cinfo
207 	uio
208 	buf
209 	dcd_pkt
210 	udcd_cmd
211 	dcd_capacity
212 	dcd_cmd
213 	dk_label
214 	dk_map32))
215 
216 _NOTE(SCHEME_PROTECTS_DATA("stable data", dcd_device))
217 _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", dcd_cmd))
218 
219 #endif	/* defined(_KERNEL) || defined(_KMEMUSER) */
220 
221 
222 /*
223  * Disk driver states
224  */
225 
226 #define	DCD_STATE_NORMAL	0
227 #define	DCD_STATE_OFFLINE	1
228 #define	DCD_STATE_RWAIT		2
229 #define	DCD_STATE_DUMPING	3
230 #define	DCD_STATE_SUSPENDED	4
231 #define	DCD_STATE_FATAL		5
232 #define	DCD_STATE_PM_SUSPENDED	6
233 
234 /*
235  * Disk power levels.
236  */
237 #define	DCD_DEVICE_ACTIVE	0x2
238 #define	DCD_DEVICE_IDLE		0x1
239 #define	DCD_DEVICE_STANDBY	0x0
240 
241 /*
242  * Macros used in obtaining the device ID for the disk.
243  */
244 #define	DCD_SERIAL_NUMBER_LENGTH	20
245 #define	DCD_MODEL_NUMBER_LENGTH		40
246 
247 /*
248  * The table is to be interpreted as follows: The rows lists all the states
249  * and each column is a state that a state in each row *can* reach. The entries
250  * in the table list the event that cause that transition to take place.
251  * For e.g.: To go from state RWAIT to SUSPENDED, event (d)-- which is the
252  * invocation of DDI_SUSPEND-- has to take place. Note the same event could
253  * cause the transition from one state to two different states. e.g., from
254  * state SUSPENDED, when we get a DDI_RESUME, we just go back to the *last
255  * state* whatever that might be. (NORMAL or OFFLINE).
256  *
257  *
258  * State Transition Table:
259  *
260  *			NORMAL  OFFLINE  RWAIT  DUMPING  SUSPENDED
261  *
262  *	NORMAL		-	(a)	(b)	(c)	(d)
263  *
264  *	OFFLINE		(e)	-	(e)	(c)	(d)
265  *
266  *	RWAIT		(f)	NP	-	(c)	(d)
267  *
268  *	DUMPING		NP	NP	NP	-	NP
269  *
270  *	SUSPENDED	(g)	(g)	(b)	NP*	-
271  *
272  *
273  *	NP:	Not Possible.
274  *	(a):	Disk does not respond.
275  *	(b):	Packet Allocation Fails
276  *	(c):	Panic - Crash dump
277  *	(d):	DDI_SUSPEND is called.
278  *	(e):	Disk has a successful I/O completed.
279  *	(f):	sdrunout() calls sdstart() which sets it NORMAL
280  *	(g):	DDI_RESUME is called.
281  *	* :	When suspended, we dont change state during panic dump
282  */
283 
284 
285 /*
286  * Error levels
287  */
288 
289 #define	DCDERR_ALL		0
290 #define	DCDERR_UNKNOWN		1
291 #define	DCDERR_INFORMATIONAL	2
292 #define	DCDERR_RECOVERED	3
293 #define	DCDERR_RETRYABLE	4
294 #define	DCDERR_FATAL		5
295 
296 /*
297  * Parameters
298  */
299 
300 /*
301  * 60 seconds is a *very* reasonable amount of time for most slow CD
302  * operations.
303  */
304 
305 #define	DCD_IO_TIME	60
306 
307 /*
308  * Timeout value for ATA_FLUSH_CACHE used in DKIOCFLUSHWRITECACHE
309  */
310 #define	DCD_FLUSH_TIME	60
311 
312 /*
313  * 2 hours is an excessively reasonable amount of time for format operations.
314  */
315 
316 #define	DCD_FMT_TIME	120*60
317 
318 /*
319  * 5 seconds is what we'll wait if we get a Busy Status back
320  */
321 
322 #define	DCD_BSY_TIMEOUT		(drv_usectohz(5 * 1000000))
323 
324 /*
325  * Number of times we'll retry a normal operation.
326  *
327  * This includes retries due to transport failure
328  * (need to distinguish between Target and Transport failure)
329  */
330 
331 #define	DCD_RETRY_COUNT		5
332 
333 
334 /*
335  * Maximum number of units we can support
336  * (controlled by room in minor device byte)
337  * XXX: this is out of date!
338  */
339 #define	DCD_MAXUNIT		32
340 
341 /*
342  * 30 seconds is what we will wait for the IO to finish
343  * before we fail the DDI_SUSPEND
344  */
345 #define	DCD_WAIT_CMDS_COMPLETE	30
346 
347 /*
348  * dcdintr action codes
349  */
350 
351 #define	COMMAND_DONE		0
352 #define	COMMAND_DONE_ERROR	1
353 #define	QUE_COMMAND		2
354 #define	QUE_SENSE		3
355 #define	JUST_RETURN		4
356 
357 /*
358  * Indicator for Soft and hard errors
359  */
360 #define	COMMAND_SOFT_ERROR	1
361 #define	COMMAND_HARD_ERROR	2
362 
363 /*
364  * Drive Types (and characteristics)
365  */
366 #define	VIDMAX 8
367 #define	PIDMAX 16
368 
369 struct dcd_drivetype {
370 	char 	*name;		/* for debug purposes */
371 	char	ctype;		/* controller type */
372 	char	options;	/* drive options */
373 	ushort_t block_factor;	/* Block mode factor */
374 	char	pio_mode;	/* This the Pio mode number */
375 	char 	dma_mode;	/* Multi word dma mode */
376 };
377 
378 /*
379  * The options values
380  */
381 #define	DMA_SUPPORTTED	0x01
382 #define	BLOCK_MODE	0x02
383 
384 #ifndef	LOG_EMERG
385 #define	LOG_WARNING	CE_NOTE
386 #define	LOG_NOTICE	CE_NOTE
387 #define	LOG_CRIT	CE_WARN
388 #define	LOG_ERR		CE_WARN
389 #define	LOG_INFO	CE_NOTE
390 #define	log	cmn_err
391 #endif
392 
393 /*
394  * Some internal error codes for driver functions.
395  */
396 #define	DCD_EACCES	1
397 
398 /*
399  * Error returns from sd_validate_geometry()
400  */
401 #define	DCD_BAD_LABEL		-1
402 #define	DCD_NO_MEM_FOR_LABEL	-2
403 
404 #ifdef	__cplusplus
405 }
406 #endif
407 
408 #endif	/* _SYS_DADA_TARGETS_DADDF_H */
409