xref: /openbsd/sys/dev/isa/wdsreg.h (revision 7b36286a)
1 /*	$OpenBSD: wdsreg.h,v 1.4 1997/11/07 08:07:11 niklas Exp $	*/
2 
3 typedef u_int8_t physaddr[3];
4 typedef u_int8_t physlen[3];
5 #define	ltophys	_lto3b
6 #define	phystol	_3btol
7 
8 /* WD7000 registers */
9 #define WDS_STAT		0	/* read */
10 #define WDS_IRQSTAT		1	/* read */
11 
12 #define WDS_CMD			0	/* write */
13 #define WDS_IRQACK		1	/* write */
14 #define WDS_HCR			2	/* write */
15 
16 #define	WDS_IO_PORTS		8	/* size in I/O-space */
17 
18 /* WDS_STAT (read) defs */
19 #define WDSS_IRQ		0x80
20 #define WDSS_RDY		0x40
21 #define WDSS_REJ		0x20
22 #define WDSS_INIT		0x10
23 
24 /* WDS_IRQSTAT (read) defs */
25 #define WDSI_MASK		0xc0
26 #define WDSI_ERR		0x00
27 #define WDSI_MFREE		0x80
28 #define WDSI_MSVC		0xc0
29 
30 /* WDS_CMD (write) defs */
31 #define WDSC_NOOP		0x00
32 #define WDSC_INIT		0x01
33 #define WDSC_DISUNSOL		0x02
34 #define WDSC_ENAUNSOL		0x03
35 #define WDSC_IRQMFREE		0x04
36 #define WDSC_SCSIRESETSOFT	0x05
37 #define WDSC_SCSIRESETHARD	0x06
38 #define WDSC_MSTART(m)		(0x80 + (m))
39 #define WDSC_MMSTART(m)		(0xc0 + (m))
40 
41 /* WDS_HCR (write) defs */
42 #define WDSH_IRQEN		0x08
43 #define WDSH_DRQEN		0x04
44 #define WDSH_SCSIRESET		0x02
45 #define WDSH_ASCRESET		0x01
46 
47 #define WDS_NSEG	17
48 
49 struct wds_scat_gath {
50 	physlen seg_len;
51 	physaddr seg_addr;
52 };
53 
54 struct wds_cmd {
55 	u_int8_t opcode;
56 	u_int8_t targ;
57 	struct scsi_generic scb;
58 	u_int8_t stat;
59 	u_int8_t venderr;
60 	physlen len;
61 	physaddr data;
62 	physaddr link;
63 	u_int8_t write;
64 	u_int8_t xx[6];
65 };
66 
67 struct wds_scb {
68 	struct wds_cmd cmd;
69 	struct wds_cmd sense;
70 
71 	struct wds_scat_gath scat_gath[WDS_NSEG];
72 	struct scsi_sense_data sense_data;
73 	/*----------------------------------------------------------------*/
74 #define SCB_PHYS_SIZE ((int)&((struct wds_scb *)0)->chain)
75 
76 	TAILQ_ENTRY(wds_scb) chain;
77 	struct wds_scb *nexthash;
78 	long hashkey;
79 	struct scsi_xfer *xs;
80 	int flags;
81 #define	SCB_ALLOC	0x01
82 #define	SCB_ABORT	0x02
83 #ifdef WDSDIAG
84 #define	SCB_SENDING	0x04
85 #endif
86 #define	SCB_POLLED	0x08
87 #define	SCB_SENSE	0x10
88 #define	SCB_DONE	0x20	/* for internal commands only */
89 #define	SCB_BUFFER	0x40
90 	int timeout;
91 
92 #ifdef notyet
93 	struct isadma_seg scb_phys[1];	/* phys segment of this scb */
94 	struct isadma_seg data_phys[WDS_NSEG];	/* phys segments of data */
95 	int data_nseg;			/* number of phys segments of data */
96 #endif
97 	struct wds_buf *buf;
98 };
99 
100 #define WDSX_SCSICMD		0x00
101 #define WDSX_SCSISG		0x01
102 #define WDSX_OPEN_RCVBUF	0x80
103 #define WDSX_RCV_CMD		0x81
104 #define WDSX_RCV_DATA		0x82
105 #define WDSX_RCV_DATASTAT	0x83
106 #define WDSX_SND_DATA		0x84
107 #define WDSX_SND_DATASTAT	0x85
108 #define WDSX_SND_CMDSTAT	0x86
109 #define WDSX_READINIT		0x88
110 #define WDSX_READSCSIID		0x89
111 #define WDSX_SETUNSOLIRQMASK	0x8a
112 #define WDSX_GETUNSOLIRQMASK	0x8b
113 #define WDSX_GETFIRMREV		0x8c
114 #define WDSX_EXECDIAG		0x8d
115 #define WDSX_SETEXECPARM	0x8e
116 #define WDSX_GETEXECPARM	0x8f
117 
118 struct wds_mbx_out {
119 	u_int8_t cmd;
120 	physaddr scb_addr;
121 };
122 
123 struct wds_mbx_in {
124 	u_int8_t stat;
125 	physaddr scb_addr;
126 };
127 
128 /*
129  * mbo.cmd values
130  */
131 #define	WDS_MBO_FREE		0x0	/* MBO entry is free */
132 #define	WDS_MBO_START		0x1	/* MBO activate entry */
133 
134 /*
135  * mbi.stat values
136  */
137 #define	WDS_MBI_FREE		0x00	/* MBI entry is free */
138 #define WDS_MBI_OK		0x01	/* completed without error */
139 #define WDS_MBI_OKERR		0x02	/* completed with error */
140 #define WDS_MBI_ETIME		0x04
141 #define WDS_MBI_ERESET		0x05
142 #define WDS_MBI_ETARCMD		0x06
143 #define WDS_MBI_ERESEL		0x80
144 #define WDS_MBI_ESEL		0x81
145 #define WDS_MBI_EABORT		0x82
146 #define WDS_MBI_ESRESET		0x83
147 #define WDS_MBI_EHRESET		0x84
148 
149 struct wds_setup {
150 	u_int8_t opcode;
151 	u_int8_t scsi_id;
152 	u_int8_t buson_t;
153 	u_int8_t busoff_t;
154 	u_int8_t xx;
155 	physaddr mbaddr;
156 	u_int8_t nomb;
157 	u_int8_t nimb;
158 };
159