xref: /onnv-gate/usr/src/uts/sun/sys/dada/targets/daddef.h (revision 7875:f00bec9af1c0)
13786Sarutz /*
23786Sarutz  * CDDL HEADER START
33786Sarutz  *
43786Sarutz  * The contents of this file are subject to the terms of the
53786Sarutz  * Common Development and Distribution License (the "License").
63786Sarutz  * You may not use this file except in compliance with the License.
73786Sarutz  *
83786Sarutz  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93786Sarutz  * or http://www.opensolaris.org/os/licensing.
103786Sarutz  * See the License for the specific language governing permissions
113786Sarutz  * and limitations under the License.
123786Sarutz  *
133786Sarutz  * When distributing Covered Code, include this CDDL HEADER in each
143786Sarutz  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153786Sarutz  * If applicable, add the following below this CDDL HEADER, with the
163786Sarutz  * fields enclosed by brackets "[]" replaced with your own identifying
173786Sarutz  * information: Portions Copyright [yyyy] [name of copyright owner]
183786Sarutz  *
193786Sarutz  * CDDL HEADER END
203786Sarutz  */
213786Sarutz /*
22*7875SChris.Horne@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
233786Sarutz  * Use is subject to license terms.
243786Sarutz  */
253786Sarutz #ifndef	_SYS_DADA_TARGETS_DADDF_H
263786Sarutz #define	_SYS_DADA_TARGETS_DADDF_H
273786Sarutz 
283786Sarutz #include <sys/note.h>
293786Sarutz #include <sys/cmlb.h>
303786Sarutz 
313786Sarutz #ifdef	__cplusplus
323786Sarutz extern "C" {
333786Sarutz #endif
343786Sarutz 
353786Sarutz /*
363786Sarutz  * Defines for SCSI direct access devices
373786Sarutz  */
383786Sarutz 
393786Sarutz #define	FIXEDFIRMWARE	/* fixed firmware for volume control */
403786Sarutz 
413786Sarutz #if	defined(_KERNEL) || defined(_KMEMUSER)
423786Sarutz 
433786Sarutz 
443786Sarutz /*
453786Sarutz  * Local definitions, for clarity of code
463786Sarutz  */
473786Sarutz #define	DCD_DCD_DEVP	(un->un_dcd)
483786Sarutz #define	DCD_DEVINFO	(DCD_DCD_DEVP->dcd_dev)
493786Sarutz #define	DCD_IDENTIFY	(DCD_DCD_DEVP->dcd_ident)
503786Sarutz #define	DCD_MUTEX	(&DCD_DCD_DEVP->dcd_mutex)
513786Sarutz #define	ROUTE		(DCD_DCD_DEVP->dcd_address)
523786Sarutz #define	SECDIV		(un->un_secdiv)
533786Sarutz #define	SECSIZE		(un->un_secsize)
543786Sarutz #define	SCBP(pkt)	((struct dcd_status *)(pkt)->pkt_scbp)
553786Sarutz #define	SCBP_C(pkt)	((*(pkt)->pkt_scbp) & STATUS_ATA_MASK)
563786Sarutz #define	CDBP(pkt)	((union scsi_cdb *)(pkt)->pkt_cdbp)
573786Sarutz #define	NO_PKT_ALLOCATED ((struct buf *)0)
583786Sarutz #define	ALLOCATING_PKT	((struct buf *)-1)
593786Sarutz #define	BP_PKT(bp)	((struct dcd_pkt *)bp->av_back)
603786Sarutz #define	BP_HAS_NO_PKT(bp) (bp->av_back == NO_PKT_ALLOCATED)
613786Sarutz #define	MAX_ATA_XFER_SIZE (256*DEV_BSIZE)
623786Sarutz 
633786Sarutz #define	STATUS_SCBP_C(statusp)	(*(uchar_t *)(statusp) & STATUS_ATA_MASK)
643786Sarutz 
65*7875SChris.Horne@Sun.COM #define	Tgt(devp)	(devp->dcd_address->da_target)
66*7875SChris.Horne@Sun.COM #define	Lun(devp)	(devp->dcd_address->da_lun)
673786Sarutz 
683786Sarutz #define	New_state(un, s)	\
693786Sarutz 	(un)->un_last_state = (un)->un_state,  (un)->un_state = (s)
703786Sarutz #define	Restore_state(un)	\
713786Sarutz 	{ uchar_t tmp = (un)->un_last_state; New_state((un), tmp); }
723786Sarutz 
733786Sarutz 
743786Sarutz #define	CTYPE_DISK	 2
753786Sarutz /*
763786Sarutz  * Structure for recording whether a device is fully open or closed.
773786Sarutz  * Assumptions:
783786Sarutz  *
793786Sarutz  *	+ There are only 8 partitions possible.
803786Sarutz  *	+ BLK, MNT, CHR, SWP don't change in some future release!
813786Sarutz  *
823786Sarutz  */
833786Sarutz 
843786Sarutz #define	DCDUNIT_SHIFT	3
853786Sarutz #define	DCDPART_MASK	7
863786Sarutz #define	DCDUNIT(dev)	(getminor((dev))>>DCDUNIT_SHIFT)
873786Sarutz #define	DCDPART(dev)	(getminor((dev)) & DCDPART_MASK)
883786Sarutz 
893786Sarutz struct ocinfo {
903786Sarutz 	/*
913786Sarutz 	 * Types BLK, MNT, CHR, SWP,
923786Sarutz 	 * assumed to be types 0-3.
933786Sarutz 	 */
943786Sarutz 	ulong_t  lyr_open[NDKMAP];
953786Sarutz 	uchar_t  reg_open[OTYPCNT - 1];
963786Sarutz };
973786Sarutz #define	OCSIZE  sizeof (struct ocinfo)
983786Sarutz union ocmap {
993786Sarutz 	uchar_t chkd[OCSIZE];
1003786Sarutz 	struct ocinfo rinfo;
1013786Sarutz };
1023786Sarutz #define	lyropen rinfo.lyr_open
1033786Sarutz #define	regopen rinfo.reg_open
1043786Sarutz 
1053786Sarutz /*
1063786Sarutz  * Private info for dcd disks.
1073786Sarutz  *
1083786Sarutz  * Pointed to by the un_private pointer
1093786Sarutz  * of one of the dcd_device structures.
1103786Sarutz  */
1113786Sarutz 
1123786Sarutz struct dcd_disk {
1133786Sarutz 	struct dcd_device *un_dcd;	/* back pointer to dcd_device */
1143786Sarutz 	struct dcd_drivetype *un_dp;	/* drive type table */
1153786Sarutz 	struct	buf *un_sbufp;		/* for use in special io */
1163786Sarutz 	char		*un_srqbufp;	/* sense buffer for special io */
1173786Sarutz 	kcondvar_t	un_sbuf_cv;	/* Conditional Variable on sbufp */
1183786Sarutz 	kcondvar_t	un_state_cv;	/* Conditional variable for state */
1193786Sarutz 	union	ocmap un_ocmap;		/* open partition map, block && char */
1203786Sarutz 	uchar_t	un_last_pkt_reason;	/* used for suppressing multiple msgs */
1213786Sarutz 	struct	diskhd un_utab;		/* for queuing */
1223786Sarutz 	struct	kstat *un_stats;	/* for statistics */
1233786Sarutz 	struct	kstat *un_pstats[NDKMAP]; /* for partition statistics */
1243786Sarutz 	ksema_t	un_semoclose;		/* lock for serializing opens/closes */
1253786Sarutz 	uint_t	un_err_blkno;		/* disk block where error occurred */
1263786Sarutz 	int	un_diskcapacity;	/* capacity as returned by drive */
1273786Sarutz 	int	un_lbasize;		/* logical (i.e. device) block size */
1283786Sarutz 	int	un_lbadiv;		/* log2 of lbasize */
1293786Sarutz 	int	un_blknoshift;		/* log2 of multiple of DEV_BSIZE */
1303786Sarutz 					/* blocks making up a logical block */
1313786Sarutz 	int	un_secsize;		/* sector size (allow request on */
1323786Sarutz 					/* this boundry) */
1333786Sarutz 	int	un_secdiv;		/* log2 of secsize */
1343786Sarutz 	uchar_t	un_exclopen;		/* exclusive open bits */
1353786Sarutz 	uchar_t	un_mediastate;		/* Is it really needed  XXX */
1363786Sarutz 	uchar_t	un_state;		/* current state */
1373786Sarutz 	uchar_t	un_last_state;		/* last state */
1383786Sarutz 	uchar_t	un_format_in_progress;	/* disk is formatting currently */
1393786Sarutz 	uchar_t un_flush_not_supported;	/* disk doesn't support flush cmd */
1403786Sarutz 	uchar_t	un_write_cache_enabled;	/* disk has write caching enabled */
1413786Sarutz 	clock_t un_timestamp;		/* Time of last device access */
1423786Sarutz 	short	un_ncmds;		/* number of cmds in transport */
1433786Sarutz 	short	un_throttle;		/* This is used for throttling if */
1443786Sarutz 					/* HBA has queuing		  */
1453786Sarutz 	short	un_sbuf_busy;		/* Busy wait flag for the sbuf */
1463786Sarutz 	int	un_cmd_flags;		/* cache some frequently used values */
1473786Sarutz 	int	un_cmd_stat_size;	/* in make_sd_cmd */
1483786Sarutz 	int	un_dcvb_timeid;		/* timeout id for dlyd cv broadcast */
1493786Sarutz 	void 	*un_devid;		/* device id */
1503786Sarutz 	uint_t	un_max_xfer_size;	/* max transfer size */
1513786Sarutz 	uchar_t	un_bus_master;		/* Indicates that the HBA  enables  */
1523786Sarutz 					/* Bus master capability */
1533786Sarutz 	timeout_id_t	un_reissued_timeid;
1543786Sarutz 					/* This is used in busy handler */
1553786Sarutz 	kstat_t	*un_errstats;		/* For Error statsistics */
1563786Sarutz 	kcondvar_t	un_suspend_cv;	/* Cond Var on power management */
1573786Sarutz 	kcondvar_t	un_disk_busy_cv; /* Cond var to wait for IO */
1583786Sarutz 	short	un_power_level;		/* Power Level */
1593786Sarutz 	short	un_save_state;		/* Save the state for suspend/resume */
1603786Sarutz 	cmlb_handle_t   un_dklbhandle;  /* Handle for disk label */
1613786Sarutz 	tg_attribute_t un_tgattribute;
1623786Sarutz };
1633786Sarutz 
1643786Sarutz /*
1653786Sarutz  * device error statistics
1663786Sarutz  */
1673786Sarutz struct dcd_errstats {
1683786Sarutz 	struct kstat_named	dcd_softerrs;	/* Collecting Softerrs */
1693786Sarutz 	struct kstat_named	dcd_harderrs;	/* Collecting harderrs */
1703786Sarutz 	struct kstat_named	dcd_transerrs;	/* Collecting Transfer errs */
1713786Sarutz 	struct kstat_named	dcd_model;	/* model # of the disk */
1723786Sarutz 	struct kstat_named	dcd_revision;	/* The disk revision */
1733786Sarutz 	struct kstat_named	dcd_serial;	/* The disk serial number */
1743786Sarutz 	struct kstat_named	dcd_capacity;	/* Capacity of the disk */
1753786Sarutz 	struct kstat_named	dcd_rq_media_err; /* Any media err seen */
1763786Sarutz 	struct kstat_named	dcd_rq_ntrdy_err; /* Not ready errs */
1773786Sarutz 	struct kstat_named	dcd_rq_nodev_err; /* No device errs */
1783786Sarutz 	struct kstat_named	dcd_rq_recov_err; /* Recovered errs */
1793786Sarutz 	struct kstat_named	dcd_rq_illrq_err; /* Illegal requests */
1803786Sarutz };
1813786Sarutz #define	DCD_MAX_XFER_SIZE	(1 * 512)
1823786Sarutz 
1833786Sarutz _NOTE(MUTEX_PROTECTS_DATA(dcd_device::dcd_mutex, dcd_disk))
1843786Sarutz _NOTE(READ_ONLY_DATA(dcd_disk::un_dcd))
1853786Sarutz _NOTE(READ_ONLY_DATA(dcd_disk::un_cmd_stat_size))
1863786Sarutz _NOTE(SCHEME_PROTECTS_DATA("Save Sharing",
1873786Sarutz 	dcd_disk::un_state
1883786Sarutz 	dcd_disk::un_dklbhandle
1893786Sarutz 	dcd_disk::un_format_in_progress))
1903786Sarutz 
1913786Sarutz _NOTE(SCHEME_PROTECTS_DATA("stable data",
1923786Sarutz 	dcd_disk::un_max_xfer_size
1933786Sarutz 	dcd_disk::un_secdiv
1943786Sarutz 	dcd_disk::un_secsize
1953786Sarutz 	dcd_disk::un_cmd_flags
1963786Sarutz 	dcd_disk::un_cmd_stat_size))
1973786Sarutz 
1983786Sarutz _NOTE(SCHEME_PROTECTS_DATA("cv",
1993786Sarutz 	dcd_disk::un_sbufp
2003786Sarutz 	dcd_disk::un_srqbufp
2013786Sarutz 	dcd_disk::un_sbuf_busy))
2023786Sarutz 
2033786Sarutz _NOTE(SCHEME_PROTECTS_DATA("Unshared data",
2043786Sarutz 	dk_cinfo
2053786Sarutz 	uio
2063786Sarutz 	buf
2073786Sarutz 	dcd_pkt
2083786Sarutz 	udcd_cmd
2093786Sarutz 	dcd_capacity
2103786Sarutz 	dcd_cmd
2113786Sarutz 	dk_label
2123786Sarutz 	dk_map32))
2133786Sarutz 
2143786Sarutz _NOTE(SCHEME_PROTECTS_DATA("stable data", dcd_device))
2153786Sarutz _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", dcd_cmd))
2163786Sarutz 
2173786Sarutz #endif	/* defined(_KERNEL) || defined(_KMEMUSER) */
2183786Sarutz 
2193786Sarutz 
2203786Sarutz /*
2213786Sarutz  * Disk driver states
2223786Sarutz  */
2233786Sarutz 
2243786Sarutz #define	DCD_STATE_NORMAL	0
2253786Sarutz #define	DCD_STATE_OFFLINE	1
2263786Sarutz #define	DCD_STATE_RWAIT		2
2273786Sarutz #define	DCD_STATE_DUMPING	3
2283786Sarutz #define	DCD_STATE_SUSPENDED	4
2293786Sarutz #define	DCD_STATE_FATAL		5
2303786Sarutz #define	DCD_STATE_PM_SUSPENDED	6
2313786Sarutz 
2323786Sarutz /*
2333786Sarutz  * Disk power levels.
2343786Sarutz  */
2353786Sarutz #define	DCD_DEVICE_ACTIVE	0x2
2363786Sarutz #define	DCD_DEVICE_IDLE		0x1
2373786Sarutz #define	DCD_DEVICE_STANDBY	0x0
2383786Sarutz 
2393786Sarutz /*
2403786Sarutz  * Macros used in obtaining the device ID for the disk.
2413786Sarutz  */
2423786Sarutz #define	DCD_SERIAL_NUMBER_LENGTH	20
2433786Sarutz #define	DCD_MODEL_NUMBER_LENGTH		40
2443786Sarutz 
2453786Sarutz /*
2463786Sarutz  * The table is to be interpreted as follows: The rows lists all the states
2473786Sarutz  * and each column is a state that a state in each row *can* reach. The entries
2483786Sarutz  * in the table list the event that cause that transition to take place.
2493786Sarutz  * For e.g.: To go from state RWAIT to SUSPENDED, event (d)-- which is the
2503786Sarutz  * invocation of DDI_SUSPEND-- has to take place. Note the same event could
2513786Sarutz  * cause the transition from one state to two different states. e.g., from
2523786Sarutz  * state SUSPENDED, when we get a DDI_RESUME, we just go back to the *last
2533786Sarutz  * state* whatever that might be. (NORMAL or OFFLINE).
2543786Sarutz  *
2553786Sarutz  *
2563786Sarutz  * State Transition Table:
2573786Sarutz  *
2583786Sarutz  *			NORMAL  OFFLINE  RWAIT  DUMPING  SUSPENDED
2593786Sarutz  *
2603786Sarutz  *	NORMAL		-	(a)	(b)	(c)	(d)
2613786Sarutz  *
2623786Sarutz  *	OFFLINE		(e)	-	(e)	(c)	(d)
2633786Sarutz  *
2643786Sarutz  *	RWAIT		(f)	NP	-	(c)	(d)
2653786Sarutz  *
2663786Sarutz  *	DUMPING		NP	NP	NP	-	NP
2673786Sarutz  *
2683786Sarutz  *	SUSPENDED	(g)	(g)	(b)	NP*	-
2693786Sarutz  *
2703786Sarutz  *
2713786Sarutz  *	NP:	Not Possible.
2723786Sarutz  *	(a):	Disk does not respond.
2733786Sarutz  *	(b):	Packet Allocation Fails
2743786Sarutz  *	(c):	Panic - Crash dump
2753786Sarutz  *	(d):	DDI_SUSPEND is called.
2763786Sarutz  *	(e):	Disk has a successful I/O completed.
2773786Sarutz  *	(f):	sdrunout() calls sdstart() which sets it NORMAL
2783786Sarutz  *	(g):	DDI_RESUME is called.
2793786Sarutz  *	* :	When suspended, we dont change state during panic dump
2803786Sarutz  */
2813786Sarutz 
2823786Sarutz 
2833786Sarutz /*
2843786Sarutz  * Error levels
2853786Sarutz  */
2863786Sarutz 
2873786Sarutz #define	DCDERR_ALL		0
2883786Sarutz #define	DCDERR_UNKNOWN		1
2893786Sarutz #define	DCDERR_INFORMATIONAL	2
2903786Sarutz #define	DCDERR_RECOVERED	3
2913786Sarutz #define	DCDERR_RETRYABLE	4
2923786Sarutz #define	DCDERR_FATAL		5
2933786Sarutz 
2943786Sarutz /*
2953786Sarutz  * Parameters
2963786Sarutz  */
2973786Sarutz 
2983786Sarutz /*
2993786Sarutz  * 60 seconds is a *very* reasonable amount of time for most slow CD
3003786Sarutz  * operations.
3013786Sarutz  */
3023786Sarutz 
3033786Sarutz #define	DCD_IO_TIME	60
3043786Sarutz 
3053786Sarutz /*
3063786Sarutz  * Timeout value for ATA_FLUSH_CACHE used in DKIOCFLUSHWRITECACHE
3073786Sarutz  */
3083786Sarutz #define	DCD_FLUSH_TIME	60
3093786Sarutz 
3103786Sarutz /*
3113786Sarutz  * 2 hours is an excessively reasonable amount of time for format operations.
3123786Sarutz  */
3133786Sarutz 
3143786Sarutz #define	DCD_FMT_TIME	120*60
3153786Sarutz 
3163786Sarutz /*
3173786Sarutz  * 5 seconds is what we'll wait if we get a Busy Status back
3183786Sarutz  */
3193786Sarutz 
3203786Sarutz #define	DCD_BSY_TIMEOUT		(drv_usectohz(5 * 1000000))
3213786Sarutz 
3223786Sarutz /*
3233786Sarutz  * Number of times we'll retry a normal operation.
3243786Sarutz  *
3253786Sarutz  * This includes retries due to transport failure
3263786Sarutz  * (need to distinguish between Target and Transport failure)
3273786Sarutz  */
3283786Sarutz 
3293786Sarutz #define	DCD_RETRY_COUNT		5
3303786Sarutz 
3313786Sarutz 
3323786Sarutz /*
3333786Sarutz  * Maximum number of units we can support
3343786Sarutz  * (controlled by room in minor device byte)
3353786Sarutz  * XXX: this is out of date!
3363786Sarutz  */
3373786Sarutz #define	DCD_MAXUNIT		32
3383786Sarutz 
3393786Sarutz /*
3403786Sarutz  * 30 seconds is what we will wait for the IO to finish
3413786Sarutz  * before we fail the DDI_SUSPEND
3423786Sarutz  */
3433786Sarutz #define	DCD_WAIT_CMDS_COMPLETE	30
3443786Sarutz 
3453786Sarutz /*
3463786Sarutz  * dcdintr action codes
3473786Sarutz  */
3483786Sarutz 
3493786Sarutz #define	COMMAND_DONE		0
3503786Sarutz #define	COMMAND_DONE_ERROR	1
3513786Sarutz #define	QUE_COMMAND		2
3523786Sarutz #define	QUE_SENSE		3
3533786Sarutz #define	JUST_RETURN		4
3543786Sarutz 
3553786Sarutz /*
3563786Sarutz  * Indicator for Soft and hard errors
3573786Sarutz  */
3583786Sarutz #define	COMMAND_SOFT_ERROR	1
3593786Sarutz #define	COMMAND_HARD_ERROR	2
3603786Sarutz 
3613786Sarutz /*
3623786Sarutz  * Drive Types (and characteristics)
3633786Sarutz  */
3643786Sarutz #define	VIDMAX 8
3653786Sarutz #define	PIDMAX 16
3663786Sarutz 
3673786Sarutz struct dcd_drivetype {
3683786Sarutz 	char 	*name;		/* for debug purposes */
3693786Sarutz 	char	ctype;		/* controller type */
3703786Sarutz 	char	options;	/* drive options */
3713786Sarutz 	ushort_t block_factor;	/* Block mode factor */
3723786Sarutz 	char	pio_mode;	/* This the Pio mode number */
3733786Sarutz 	char 	dma_mode;	/* Multi word dma mode */
3743786Sarutz };
3753786Sarutz 
3763786Sarutz /*
3773786Sarutz  * The options values
3783786Sarutz  */
3793786Sarutz #define	DMA_SUPPORTTED	0x01
3803786Sarutz #define	BLOCK_MODE	0x02
3813786Sarutz 
3823786Sarutz #ifndef	LOG_EMERG
3833786Sarutz #define	LOG_WARNING	CE_NOTE
3843786Sarutz #define	LOG_NOTICE	CE_NOTE
3853786Sarutz #define	LOG_CRIT	CE_WARN
3863786Sarutz #define	LOG_ERR		CE_WARN
3873786Sarutz #define	LOG_INFO	CE_NOTE
3883786Sarutz #define	log	cmn_err
3893786Sarutz #endif
3903786Sarutz 
3913786Sarutz /*
3923786Sarutz  * Some internal error codes for driver functions.
3933786Sarutz  */
3943786Sarutz #define	DCD_EACCES	1
3953786Sarutz 
3963786Sarutz /*
3973786Sarutz  * Error returns from sd_validate_geometry()
3983786Sarutz  */
3993786Sarutz #define	DCD_BAD_LABEL		-1
4003786Sarutz #define	DCD_NO_MEM_FOR_LABEL	-2
4013786Sarutz 
4023786Sarutz #ifdef	__cplusplus
4033786Sarutz }
4043786Sarutz #endif
4053786Sarutz 
4063786Sarutz #endif	/* _SYS_DADA_TARGETS_DADDF_H */
407