1 /*        $NetBSD: scsireg.h,v 1.4 2015/02/14 05:03:09 tsutsui Exp $  */
2 
3 /*
4  * Copyright (c) 1990, 1992, 1993
5  *        The Regents of the University of California.  All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * Van Jacobson of Lawrence Berkeley Laboratory.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *        @(#)scsireg.h       8.1 (Berkeley) 6/10/93
35  */
36 
37 /*
38  * MB89352 SCSI Protocol Controller Hardware Description.
39  */
40 
41 struct scsidevice {
42           volatile uint8_t    scsi_bdid, p0, p1, p2;                  /* 000 */
43           volatile uint8_t    scsi_sctl, p3, p4, p5;                  /* 004 */
44 #define                                 SCTL_DISABLE        0x80
45 #define                                 SCTL_CTRLRST        0x40
46 #define                                 SCTL_DIAG 0x20
47 #define                                 SCTL_ABRT_ENAB      0x10
48 #define                                 SCTL_PARITY_ENAB 0x08
49 #define                                 SCTL_SEL_ENAB       0x04
50 #define                                 SCTL_RESEL_ENAB     0x02
51 #define                                 SCTL_INTR_ENAB      0x01
52           volatile uint8_t    scsi_scmd, p6, p7, p8;                  /* 008 */
53 #define                                 SCMD_RST  0x10
54 #define                                 SCMD_ICPT_XFR       0x08
55 #define                                 SCMD_PROG_XFR       0x04
56 #define                                 SCMD_PAD  0x01      /* if initiator */
57 #define                                 SCMD_PERR_STOP      0x01      /* if target */
58                                         /* command codes */
59 #define                                 SCMD_BUS_REL        0x00
60 #define                                 SCMD_SELECT         0x20
61 #define                                 SCMD_RST_ATN        0x40
62 #define                                 SCMD_SET_ATN        0x60
63 #define                                 SCMD_XFR  0x80
64 #define                                 SCMD_XFR_PAUSE      0xa0
65 #define                                 SCMD_RST_ACK        0xc0
66 #define                                 SCMD_SET_ACK        0xe0
67           volatile uint8_t    scsi_tmod, p9, p10, p11;      /* 00C */
68 #define                                 TMOD_SYNC 0x80
69           volatile uint8_t    scsi_ints, p12, p13, p14;     /* 010 */
70 #define                                 INTS_SEL  0x80
71 #define                                 INTS_RESEL          0x40
72 #define                                 INTS_DISCON         0x20
73 #define                                 INTS_CMD_DONE       0x10
74 #define                                 INTS_SRV_REQ        0x08
75 #define                                 INTS_TIMEOUT        0x04
76 #define                                 INTS_HARD_ERR       0x02
77 #define                                 INTS_RST  0x01
78           volatile uint8_t    scsi_psns, p15, p16, p17;     /* 014 */
79 #define                                 PSNS_REQ  0x80
80 #define                                 PSNS_ACK  0x40
81 #define                                 PSNS_ATN  0x20
82 #define                                 PSNS_SEL  0x10
83 #define                                 PSNS_BSY  0x08
84 #define                                 scsi_sdgc scsi_psns
85 #define                                 SDGC_XFER_ENAB      0x20
86           volatile uint8_t    scsi_ssts, p18, p19, p20;     /* 018 */
87 #define                                 SSTS_INITIATOR      0x80
88 #define                                 SSTS_TARGET         0x40
89 #define                                 SSTS_BUSY 0x20
90 #define                                 SSTS_XFR  0x10
91 #define                                 SSTS_ACTIVE         (SSTS_INITIATOR|SSTS_XFR)
92 #define                                 SSTS_RST  0x08
93 #define                                 SSTS_TCZERO         0x04
94 #define                                 SSTS_DREG_FULL      0x02
95 #define                                 SSTS_DREG_EMPTY     0x01
96           volatile uint8_t    scsi_serr, p21, p22, p23;     /* 01C */
97 #define                                 SERR_SCSI_PAR       0x80
98 #define                                 SERR_SPC_PAR        0x40
99 #define                                 SERR_XFER_OUT       0x20
100 #define                                 SERR_TC_PAR         0x08
101 #define                                 SERR_PHASE_ERR      0x04
102 #define                                 SERR_SHORT_XFR      0x02
103 #define                                 SERR_OFFSET         0x01
104           volatile uint8_t    scsi_pctl, p24, p25, p26;     /* 020 */
105 #define                                 PCTL_BFINT_ENAB     0x80
106           volatile uint8_t    scsi_mbc,  p27, p28, p29;     /* 024 */
107           volatile uint8_t    scsi_dreg, p30, p31, p32;     /* 028 */
108           volatile uint8_t    scsi_temp, p33, p34, p35;     /* 02C */
109           volatile uint8_t    scsi_tch,  p36, p37, p38;     /* 030 */
110           volatile uint8_t    scsi_tcm,  p39, p40, p41;     /* 034 */
111           volatile uint8_t    scsi_tcl,  p42, p43, p44;     /* 038 */
112           volatile uint8_t    scsi_exbf, p45, p46, p47;     /* 03C */
113 };
114 
115 /* psns/pctl phase lines as bits */
116 #define   PHASE_MSG 0x04
117 #define   PHASE_CD  0x02                /* =1 if 'command' */
118 #define   PHASE_IO  0x01                /* =1 if data inbound */
119 /* Phase lines as values */
120 #define   PHASE               0x07                /* mask for psns/pctl phase */
121 #define   DATA_OUT_PHASE      0x00
122 #define   DATA_IN_PHASE       0x01
123 #define   CMD_PHASE 0x02
124 #define   STATUS_PHASE        0x03
125 #define   BUS_FREE_PHASE      0x04
126 #define   ARB_SEL_PHASE       0x05      /* Fuji chip combines arbitration with sel. */
127 #define   MESG_OUT_PHASE      0x06
128 #define   MESG_IN_PHASE       0x07
129 
130 /* SCSI Messages */
131 
132 #define   MSG_CMD_COMPLETE    0x00
133 #define MSG_EXT_MESSAGE                 0x01
134 #define   MSG_SAVE_DATA_PTR   0x02
135 #define   MSG_RESTORE_PTR               0x03
136 #define   MSG_DISCONNECT                0x04
137 #define   MSG_INIT_DETECT_ERROR         0x05
138 #define   MSG_ABORT           0x06
139 #define   MSG_REJECT                    0x07
140 #define   MSG_NOOP            0x08
141 #define   MSG_PARITY_ERROR    0x09
142 #define   MSG_BUS_DEVICE_RESET          0x0C
143 #define   MSG_IDENTIFY                  0x80
144 #define   MSG_IDENTIFY_DR               0xc0      /* (disconnect/reconnect allowed) */
145 #define   MSG_SYNC_REQ                  0x01
146 
147 /* SCSI Commands */
148 
149 #define CMD_TEST_UNIT_READY   0x00
150 #define CMD_REQUEST_SENSE     0x03
151 #define   CMD_INQUIRY                   0x12
152 #define CMD_SEND_DIAGNOSTIC   0x1D
153 
154 #define CMD_REWIND            0x01
155 #define CMD_FORMAT_UNIT                 0x04
156 #define CMD_READ_BLOCK_LIMITS 0x05
157 #define CMD_REASSIGN_BLOCKS   0x07
158 #define CMD_READ              0x08
159 #define CMD_WRITE             0x0A
160 #define CMD_WRITE_FILEMARK    0x10
161 #define CMD_SPACE             0x11
162 #define CMD_MODE_SELECT                 0x15
163 #define CMD_RELEASE_UNIT      0x17
164 #define CMD_ERASE             0x19
165 #define CMD_MODE_SENSE                  0x1A
166 #define CMD_LOADUNLOAD                  0x1B
167 #define CMD_RECEIVE_DIAG      0x1C
168 #define CMD_SEND_DIAG                   0x1D
169 #define CMD_P_A_MEDIA_REMOVAL 0x1E
170 #define CMD_READ_CAPACITY     0x25
171 #define CMD_READ_EXT                    0x28
172 #define CMD_WRITE_EXT                   0x2A
173 #define CMD_READ_DEFECT_DATA  0x37
174 #define             SD_MANUFAC_DEFECTS  0x14000000
175 #define             SD_GROWN_DEFECTS    0x0c000000
176 #define CMD_READ_BUFFER                 0x3B
177 #define CMD_WRITE_BUFFER      0x3C
178 #define CMD_READ_FULL                   0xF0
179 #define CMD_MEDIA_TEST                  0xF1
180 #define CMD_ACCESS_LOG                  0xF2
181 #define CMD_WRITE_FULL                  0xFC
182 #define CMD_MANAGE_PRIMARY    0xFD
183 #define CMD_EXECUTE_DATA      0xFE
184 
185 /* SCSI status bits */
186 
187 #define   STS_CHECKCOND       0x02      /* Check Condition (ie., read sense) */
188 #define   STS_CONDMET         0x04      /* Condition Met (ie., search worked) */
189 #define   STS_BUSY  0x08
190 #define   STS_INTERMED        0x10      /* Intermediate status sent */
191 #define   STS_EXT             0x80      /* Extended status valid */
192 
193 /* command descriptor blocks */
194 
195 struct scsi_cdb6 {
196           uint8_t   cmd;                /* command code */
197           uint8_t   lun:  3,  /* logical unit on ctlr */
198                     lbah: 5;  /* msb of read/write logical block addr */
199           uint8_t   lbam;               /* middle byte of l.b.a. */
200           uint8_t   lbal;               /* lsb of l.b.a. */
201           uint8_t   len;                /* transfer length */
202           uint8_t   xtra;
203 };
204 
205 struct scsi_cdb10 {
206           uint8_t   cmd;                /* command code */
207           uint8_t   lun: 3,             /* logical unit on ctlr */
208                        : 4,
209                     rel: 1;             /* l.b.a. is relative addr if =1 */
210           uint8_t   lbah;               /* msb of read/write logical block addr */
211           uint8_t   lbahm;              /* high middle byte of l.b.a. */
212           uint8_t   lbalm;              /* low middle byte of l.b.a. */
213           uint8_t   lbal;               /* lsb of l.b.a. */
214           uint8_t   reserved;
215           uint8_t   lenh;               /* msb transfer length */
216           uint8_t   lenl;               /* lsb transfer length */
217           uint8_t   xtra;
218 };
219 
220 /* basic sense data */
221 
222 struct scsi_sense {
223           uint8_t   valid: 1, /* l.b.a. is valid */
224                     class: 3,
225                     code:  4;
226           uint8_t   vu:    4, /* vendor unique */
227                     lbah:  4;
228           uint8_t   lbam;
229           uint8_t   lbal;
230 };
231 
232 struct scsi_xsense {
233           uint8_t   valid: 1, /* l.b.a. is valid */
234                     class: 3,
235                     code:  4;
236           uint8_t   segment;
237           uint8_t   filemark: 1,
238                     eom:      1,
239                     ili:      1,        /* illegal length indicator */
240                     rsvd:       1,
241                     key:        4;
242           uint8_t   info1;
243           uint8_t   info2;
244           uint8_t   info3;
245           uint8_t   info4;
246           uint8_t   len;                /* additional sense length */
247 };
248 
249 /* inquiry data */
250 struct scsi_inquiry {
251           uint8_t   type;
252           uint8_t   qual;
253           uint8_t   version;
254           uint8_t   rsvd;
255           uint8_t   len;
256           char      class[3];
257           char      vendor_id[8];
258           char      product_id[16];
259           char      rev[4];
260 };
261 
262 struct scsi_generic_cdb {
263           int len;            /* cdb length (in bytes) */
264           uint8_t cdb[28];    /* cdb to use on next read/write */
265 };
266