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