/*
 * Copyright (c) 1998-1999 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef _SYS_DKTP_SCDK_H
#define	_SYS_DKTP_SCDK_H

#pragma ident	"@(#)scdk.h	1.13	99/05/04 SMI"

#ifdef	__cplusplus
extern "C" {
#endif

struct	scdk {
	struct tgdk_ext	*scd_extp;	/* back pointer to ext data	*/
	struct scsi_device *scd_sd;	/* back pointer to SCSI_DEVICE 	*/

	short	scd_secshf;
	short	scd_blkshf;
	struct  tgdk_geom scd_logg;	/* logical disk geometry 	*/
	struct  tgdk_geom scd_phyg;	/* physical disk geometry 	*/

	unsigned scd_rmb : 1;		/* removable device		*/
	unsigned scd_rdonly : 1;	/* read only device		*/
	unsigned scd_arq : 1;		/* auto-request sense enable	*/
	unsigned scd_tagque : 1;	/* tagged queueing enable	*/
	unsigned scd_cdrom : 1;		/* cdrom device			*/
	unsigned scd_resv : 3;
	unsigned char scd_type;		/* device type			*/
	unsigned char scd_ctype;	/* controller type 		*/
	unsigned char scd_options;	/* drive options 		*/
	long	scd_pktflag;		/* scsi packet flag option 	*/

	opaque_t scd_flcobjp;		/* flow control object ptr	*/
	struct	tgcom_obj scd_com;	/* com object for flowctrl	*/
	opaque_t scd_cdobjp;		/* CDrom object pointer		*/
	char	scd_cdname[OBJNAMELEN];	/* CDrom object name		*/
	struct	tgpassthru_obj scd_passthru; /* passthru obj for CDrom	*/
	int	(*scd_cdioctl)();	/* indirect func for cdioctl	*/
	enum dkio_state scd_iostate;	/* ejected/inserted		*/
	kmutex_t	scd_mutex;	/* protect scd_state		*/
	kcondvar_t	scd_state_cv;	/* condition variable for state */

	int	scd_drvready;		/* drive has been started	*/
	ksema_t	scd_drvsema;		/* semaphore to protect status	*/
	void	(*scd_cbfunc)();	/* ptr to cmdk_devstatus()	*/
	void	*scd_cbarg;		/* ptr to (struct cmdk *)	*/
};

#define	SCD_SECSIZ	scd_phyg.g_secsiz

/*
 * Local definitions, for clarity of code
 */

/*
 * Parameters
 */
#define	SD_BSY_TIMEOUT	(drv_usectohz(5 * 1000000))
#define	SD_IO_TIME	60
#define	SD_RETRY_COUNT	5
#define	SD_OPEN_RETRY_COUNT	2

#define	SCDK_IOSTART	0
#define	SCDK_IOCONT	1
#define	SCDK_RTYCNT	3

#define	SCDK2ADDR(scdkp) ((struct scsi_address *)&((scdkp)->scd_sd->sd_address))
#define	PKT2SCDK(pktp)	((struct scdk *)SC_XPKTP((pktp))->x_sdevp)

#define	SCDK_GETGEOM_HEAD(X) (((X) >> 16) & 0xff)
#define	SCDK_GETGEOM_SEC(X)  ((X) & 0xff)

#define	SCDK_DRIVE_READY(scdkp)	((scdkp)->scd_drvready)

#define	SCDK_SET_DRIVE_READY(scdkp, state) { 			\
	sema_p(&(scdkp)->scd_drvsema);				\
	(scdkp)->scd_drvready = (state);			\
	sema_v(&(scdkp)->scd_drvsema);				\
	if ((scdkp)->scd_cbfunc != NULL)			\
		((scdkp)->scd_cbfunc)((scdkp)->scd_cbarg);	\
}

/* use 10 byte cdbs */
#define	SCDK_OPTION_CDB10_FLAG	1

#define	SCDK_OPTION_CDB10(scdkp)	\
		((scdkp)->scd_options & SCDK_OPTION_CDB10_FLAG)

#ifndef TRUE
#define	TRUE	1
#endif

#ifndef	FALSE
#define	FALSE	0
#endif

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_DKTP_SCDK_H */
