/*
 * @(#)ipvar.h 1.1 94/10/31 Copyright (c) 1988 by Sun Microsystems, Inc.
 *
 */

#ifndef _IPIVAR_
#define _IPIVAR_


/* controller structure */
#define	NLPART		NDKMAP
#define LPART(dev)	(dev & 07)
#define MAXUNITS	16

/*
 * Packet control Block
 */
struct ippcb  {
	struct	ipictlr	    *pcb_c;		    /* pointer to controller struct */
	struct	ipiunit	    *pcb_un;		    /* ptr to unit struct	    */

	struct	buf	    *pcb_bp;		    /* know my buffer		    */
	struct	ippcb	    *pcb_prev;		    /* prev pcb			    */
	struct	ippcb	    *pcb_next;
	int		    pcb_retry;

	int		    pcb_mbcookie;

	u_char		    pcb_flags;
	u_char		    pcb_mode;
	u_char		    pcb_inuse;
	u_char		    pcb_busy;

	short		    pcb_timecount;
	short		    pcb_errcnt;

	struct	ipi3pkt	    *pcb_ppkt;		/* pointer to pkt		*/
};

/*
 * Controller structure One per controller
 */
struct ipictlr {
	struct	mb_ctlr		*c_mc;	/* Back pointer to mb_ctlr structure	*/
	struct	ipiunit 	*c_units[MAXUNITS];/* max units on controller	*/
	struct	ipidevice 	*c_io;		/* ptr to I/O space data	*/
	struct	ipi3pkt		*c_commandpkts;
	int			 c_busy;	/* controller is busy		*/
	int			 c_pend;	/* set - pending for DVMA alloc */
	int			 c_intpri;	/* interrupt priority		*/
	int			 c_intvec;	/* interrupt vector		*/
	u_long			 c_flags;	/* state information		*/
	struct	ippcb		 c_pcbhdr;	/* pcb header link list manip	*/
	struct	buf		 c_bufhdr;	/* buf hdr link list manip	*/
	struct	ippcb		*c_ppcbsent;	/* pcbs sent this far		*/
};


/*
 * Unit structure One per drive
 */
struct ipiunit {
	struct	ipictlr	    *c;		/* controller				*/
	struct	dk_map	    *un_map;	/* logical partitions			*/
	struct	dk_geom	    *un_g;	/* disk geometry			*/
	struct	buf	    *un_rtab;	/* for physio				*/
	int		     un_ltick;	/* last time active			*/
	struct	mb_device   *un_md;	/* generic unit				*/
	struct	mb_ctlr	    *un_mc;	/* generic controller			*/
	struct	dkbad	    *un_bad;	/* bad sector info			*/
	int		     un_errsect;/* sector in error			*/
	u_char		     un_errno;	/* error number				*/
	u_char		     un_errsevere; /* error severity			*/
	u_short		     un_errcmd;	/* command in error			*/
	u_char		     un_flags;	/* state information			*/
};


#define	IATTACHED	0x10
#define	ISLAVED 	0x20
#define IOPEN		0x40

/* OPCODES */
#define	IP_ATTRIBUTES	0x02	    /* Initialize, report, or load slave attribute  */
#define	IP_ALLOC_RESTOR	0x34	    /* Allocate restore				    */
#define	IP_SLAVE_DIAG	0x80	    /* Perform Slave Diagnostics		    */
#define	IP_FACIL_DIAG	0x81	    /* Perform Facility Diagnostics		    */
#define	IP_FORMAT	0x28	    /* Format					    */
#define	IP_NOP		0x00	    /* Nop					    */
#define	IP_OPER_MODE	0x07	    /* Set Operating mode of facility		    */
#define	IP_PORT_ADDR	0x04	    /* Port Address				    */
#define	IP_POS_CTL	0x41	    /* Position Control				    */
#define	IP_READ		0x10	    /* Read					    */
#define	IP_READ_BUF	0x52	    /* Read Buffer				    */
#define	IP_WRITE_BUF	0x62	    /* Write Buffer				    */
#define	IP_READ_DEFLIST	0x82	    /* Read Defect List				    */
#define	IP_WRITE_DEFLIST 0x83	    /* Read Defect List				    */
#define	IP_READ_ERRLOG	0x84	    /* Read Error Log				    */
#define	IP_REALLOC	0x33	    /* Reallocate Defect			    */
#define	IP_REPORT_STAT	0x03	    /* Report Addressee Status			    */
#define	IP_REPORT_POS	0x42	    /* Report Position				    */
#define	IP_WRITE	0x20	    /* Write					    */
#define	IP_STAT		0x91	    /* Read Statistics				    */

/* Bitdefs for Opcode Modifiers */

#define RWMOD 1         /* read: only read good data. write: */

#define	IP_SYNC         0x1
#define	IP_ASYNC        0x2
#define	IP_SLEEP        0x3

#define IP_IN		0x1
#define IP_OUT		0x2

/* opcodes for ioctl */
#define IP_DIAG_ENTER	0x77
#define IP_DIAG_EXIT	0x78
#define IP_MAPDVMA	0x79
#define	IP_MAPREGS	0x7a

#define PCB_GOT_DVMA	0x4
#define PCB_FAKEBP	0x8		/* pcb carries a fake bp */
#endif _IPIVAR_
