iris_scsi.c revision 1.1.6.2 1 1.1.6.2 christos /* $NetBSD: iris_scsi.c,v 1.1.6.2 2019/06/10 22:06:44 christos Exp $ */
2 1.1.6.2 christos
3 1.1.6.2 christos /*
4 1.1.6.2 christos * Copyright (c) 2018 Naruaki Etomi
5 1.1.6.2 christos * All rights reserved.
6 1.1.6.2 christos *
7 1.1.6.2 christos * Redistribution and use in source and binary forms, with or without
8 1.1.6.2 christos * modification, are permitted provided that the following conditions
9 1.1.6.2 christos * are met:
10 1.1.6.2 christos * 1. Redistributions of source code must retain the above copyright
11 1.1.6.2 christos * notice, this list of conditions and the following disclaimer.
12 1.1.6.2 christos * 2. Redistributions in binary form must reproduce the above copyright
13 1.1.6.2 christos * notice, this list of conditions and the following disclaimer in the
14 1.1.6.2 christos * documentation and/or other materials provided with the distribution.
15 1.1.6.2 christos *
16 1.1.6.2 christos * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 1.1.6.2 christos * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 1.1.6.2 christos * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 1.1.6.2 christos * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 1.1.6.2 christos * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 1.1.6.2 christos * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 1.1.6.2 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 1.1.6.2 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 1.1.6.2 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 1.1.6.2 christos * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 1.1.6.2 christos */
27 1.1.6.2 christos
28 1.1.6.2 christos /*
29 1.1.6.2 christos * Silicon Graphics "IRIS" series MIPS processors machine bootloader.
30 1.1.6.2 christos * WD33C93 SCSI bus driver for standalone programs.
31 1.1.6.2 christos */
32 1.1.6.2 christos
33 1.1.6.2 christos #include <sys/cdefs.h>
34 1.1.6.2 christos #include <lib/libsa/stand.h>
35 1.1.6.2 christos
36 1.1.6.2 christos #ifndef INDIGO_R3K_MODE
37 1.1.6.2 christos #include <dev/arcbios/arcbios.h>
38 1.1.6.2 christos #endif
39 1.1.6.2 christos
40 1.1.6.2 christos #include "iris_machdep.h"
41 1.1.6.2 christos #include "iris_scsivar.h"
42 1.1.6.2 christos #include "iris_scsireg.h"
43 1.1.6.2 christos #include "iris_scsicmd.h"
44 1.1.6.2 christos #include <dev/scsipi/scsi_message.h>
45 1.1.6.2 christos
46 1.1.6.2 christos #define SBIC_WAIT(regs, until, timeo) wd33c93_wait(regs, until, timeo)
47 1.1.6.2 christos
48 1.1.6.2 christos /*
49 1.1.6.2 christos * Timeouts
50 1.1.6.2 christos */
51 1.1.6.2 christos int wd33c93_cmd_wait = SBIC_CMD_WAIT;
52 1.1.6.2 christos int wd33c93_data_wait = SBIC_DATA_WAIT;
53 1.1.6.2 christos int wd33c93_init_wait = SBIC_INIT_WAIT;
54 1.1.6.2 christos
55 1.1.6.2 christos #define STATUS_UNKNOWN 0xff
56 1.1.6.2 christos
57 1.1.6.2 christos void wd33c93_reset(struct wd33c93_softc *);
58 1.1.6.2 christos int wd33c93_wait(struct wd33c93_softc *, uint8_t, int);
59 1.1.6.2 christos uint8_t wd33c93_selectbus(struct wd33c93_softc *, uint8_t *, size_t, uint8_t *,
60 1.1.6.2 christos size_t *);
61 1.1.6.2 christos void wd33c93_setsync(struct wd33c93_softc *);
62 1.1.6.2 christos int wd33c93_nextstate(struct wd33c93_softc *, uint8_t *, size_t, uint8_t *,
63 1.1.6.2 christos size_t *, uint8_t, uint8_t);
64 1.1.6.2 christos size_t wd33c93_xfout(struct wd33c93_softc *, void *, size_t *);
65 1.1.6.2 christos int wd33c93_intr(struct wd33c93_softc *, uint8_t *, size_t, uint8_t *,
66 1.1.6.2 christos size_t *);
67 1.1.6.2 christos size_t wd33c93_xfin(struct wd33c93_softc *, void *, size_t *);
68 1.1.6.2 christos void wd33c93_xferdone(struct wd33c93_softc *);
69 1.1.6.2 christos int wd33c93_abort(struct wd33c93_softc *, uint8_t *, size_t, uint8_t *,
70 1.1.6.2 christos size_t *);
71 1.1.6.2 christos int wd33c93_poll(struct wd33c93_softc *, uint8_t *, size_t, uint8_t *,
72 1.1.6.2 christos size_t *);
73 1.1.6.2 christos void wd33c93_timeout(struct wd33c93_softc *, uint8_t *, size_t, uint8_t *,
74 1.1.6.2 christos size_t *);
75 1.1.6.2 christos int wd33c93_msgin_phase(struct wd33c93_softc *);
76 1.1.6.2 christos void wd33c93_scsistart(struct wd33c93_softc *);
77 1.1.6.2 christos void wd33c93_scsidone(struct wd33c93_softc *);
78 1.1.6.2 christos void wd33c93_error(struct wd33c93_softc *);
79 1.1.6.2 christos
80 1.1.6.2 christos /*
81 1.1.6.2 christos * Initialize SPC & Data Structure
82 1.1.6.2 christos */
83 1.1.6.2 christos void
84 1.1.6.2 christos wd33c93_init(void *aaddr, void *daddr)
85 1.1.6.2 christos {
86 1.1.6.2 christos struct wd33c93_softc *sc;
87 1.1.6.2 christos
88 1.1.6.2 christos sc = &wd33c93_softc[scsi_ctlr];
89 1.1.6.2 christos
90 1.1.6.2 christos sc->sc_asr_regh = aaddr;
91 1.1.6.2 christos sc->sc_data_regh = daddr;
92 1.1.6.2 christos sc->sc_target = scsi_id;
93 1.1.6.2 christos
94 1.1.6.2 christos sc->sc_flags = 0;
95 1.1.6.2 christos sc->sc_state = SBIC_IDLE;
96 1.1.6.2 christos
97 1.1.6.2 christos wd33c93_reset(sc);
98 1.1.6.2 christos }
99 1.1.6.2 christos
100 1.1.6.2 christos void
101 1.1.6.2 christos wd33c93_reset(struct wd33c93_softc *sc)
102 1.1.6.2 christos {
103 1.1.6.2 christos u_int my_id;
104 1.1.6.2 christos uint8_t csr;
105 1.1.6.2 christos
106 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_ABORT);
107 1.1.6.2 christos WAIT_CIP(sc);
108 1.1.6.2 christos
109 1.1.6.2 christos my_id = sc->sc_target & SBIC_ID_MASK;
110 1.1.6.2 christos
111 1.1.6.2 christos /* Set Clock == 20.0 MHz */
112 1.1.6.2 christos my_id |= SBIC_ID_FS_8_10;
113 1.1.6.2 christos sc->sc_syncperiods = 2 * 2 * 1250 / SCSI_CLKFREQ;
114 1.1.6.2 christos
115 1.1.6.2 christos SET_SBIC_myid(sc, my_id);
116 1.1.6.2 christos
117 1.1.6.2 christos /* Reset the chip */
118 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_RESET);
119 1.1.6.2 christos DELAY(25);
120 1.1.6.2 christos SBIC_WAIT(sc, SBIC_ASR_INT, 0);
121 1.1.6.2 christos
122 1.1.6.2 christos /* PIO mode */
123 1.1.6.2 christos SBIC_TC_PUT(sc, 0);
124 1.1.6.2 christos SET_SBIC_control(sc, SBIC_CTL_EDI | SBIC_CTL_IDI);
125 1.1.6.2 christos
126 1.1.6.2 christos /* clears interrupt also */
127 1.1.6.2 christos GET_SBIC_csr(sc, csr);
128 1.1.6.2 christos __USE(csr);
129 1.1.6.2 christos
130 1.1.6.2 christos SET_SBIC_rselid(sc, SBIC_RID_ER);
131 1.1.6.2 christos SET_SBIC_syn(sc, 0);
132 1.1.6.2 christos
133 1.1.6.2 christos sc->sc_flags = 0;
134 1.1.6.2 christos sc->sc_state = SBIC_IDLE;
135 1.1.6.2 christos }
136 1.1.6.2 christos
137 1.1.6.2 christos int
138 1.1.6.2 christos wd33c93_wait(struct wd33c93_softc *sc, uint8_t until, int timeo)
139 1.1.6.2 christos {
140 1.1.6.2 christos uint8_t val;
141 1.1.6.2 christos
142 1.1.6.2 christos if (timeo == 0)
143 1.1.6.2 christos /* some large value.. */
144 1.1.6.2 christos timeo = 1000000;
145 1.1.6.2 christos
146 1.1.6.2 christos GET_SBIC_asr(sc, val);
147 1.1.6.2 christos
148 1.1.6.2 christos while ((val & until) == 0) {
149 1.1.6.2 christos if (timeo-- == 0) {
150 1.1.6.2 christos return val;
151 1.1.6.2 christos break;
152 1.1.6.2 christos }
153 1.1.6.2 christos DELAY(1);
154 1.1.6.2 christos GET_SBIC_asr(sc, val);
155 1.1.6.2 christos }
156 1.1.6.2 christos return val;
157 1.1.6.2 christos }
158 1.1.6.2 christos
159 1.1.6.2 christos /* SCSI command entry point */
160 1.1.6.2 christos int
161 1.1.6.2 christos wd33c93_go(struct wd33c93_softc *sc, uint8_t *cbuf, size_t clen, uint8_t *buf,
162 1.1.6.2 christos size_t *lenp)
163 1.1.6.2 christos {
164 1.1.6.2 christos int i;
165 1.1.6.2 christos uint8_t csr, asr;
166 1.1.6.2 christos
167 1.1.6.2 christos wd33c93_scsistart(sc);
168 1.1.6.2 christos
169 1.1.6.2 christos sc->sc_status = STATUS_UNKNOWN;
170 1.1.6.2 christos sc->sc_flags = 0;
171 1.1.6.2 christos /* select the SCSI bus (it's an error if bus isn't free) */
172 1.1.6.2 christos if ((csr = wd33c93_selectbus(sc, cbuf, clen, buf, lenp)) == 0)
173 1.1.6.2 christos /* Not done: needs to be rescheduled */
174 1.1.6.2 christos return 1;
175 1.1.6.2 christos
176 1.1.6.2 christos /*
177 1.1.6.2 christos * Lets cycle a while then let the interrupt handler take over.
178 1.1.6.2 christos */
179 1.1.6.2 christos GET_SBIC_asr(sc, asr);
180 1.1.6.2 christos do {
181 1.1.6.2 christos /* Handle the new phase */
182 1.1.6.2 christos i = wd33c93_nextstate(sc, cbuf, clen, buf, lenp, csr, asr);
183 1.1.6.2 christos WAIT_CIP(sc); /* XXX */
184 1.1.6.2 christos if (sc->sc_state == SBIC_CONNECTED) {
185 1.1.6.2 christos GET_SBIC_asr(sc, asr);
186 1.1.6.2 christos
187 1.1.6.2 christos if ((asr & SBIC_ASR_LCI) != 0)
188 1.1.6.2 christos DELAY(5000);
189 1.1.6.2 christos
190 1.1.6.2 christos if ((asr & SBIC_ASR_INT) != 0)
191 1.1.6.2 christos GET_SBIC_csr(sc, csr);
192 1.1.6.2 christos }
193 1.1.6.2 christos
194 1.1.6.2 christos } while (sc->sc_state == SBIC_CONNECTED &&
195 1.1.6.2 christos (asr & (SBIC_ASR_INT|SBIC_ASR_LCI)) != 0);
196 1.1.6.2 christos
197 1.1.6.2 christos if (i == SBIC_STATE_DONE) {
198 1.1.6.2 christos if (sc->sc_status == STATUS_UNKNOWN) {
199 1.1.6.2 christos printf("wd33c93_go: stat == UNKNOWN\n");
200 1.1.6.2 christos return 1;
201 1.1.6.2 christos }
202 1.1.6.2 christos }
203 1.1.6.2 christos
204 1.1.6.2 christos if (wd33c93_poll(sc, cbuf, clen, buf, lenp)) {
205 1.1.6.2 christos wd33c93_timeout(sc, cbuf, clen, buf, lenp);
206 1.1.6.2 christos if (wd33c93_poll(sc, cbuf, clen, buf, lenp)) {
207 1.1.6.2 christos wd33c93_timeout(sc, cbuf, clen, buf, lenp);
208 1.1.6.2 christos }
209 1.1.6.2 christos }
210 1.1.6.2 christos return 0;
211 1.1.6.2 christos }
212 1.1.6.2 christos
213 1.1.6.2 christos /*
214 1.1.6.2 christos * select the bus, return when selected or error.
215 1.1.6.2 christos *
216 1.1.6.2 christos * Returns the current CSR following selection and optionally MSG out phase.
217 1.1.6.2 christos * i.e. the returned CSR *should* indicate CMD phase...
218 1.1.6.2 christos * If the return value is 0, some error happened.
219 1.1.6.2 christos */
220 1.1.6.2 christos uint8_t
221 1.1.6.2 christos wd33c93_selectbus(struct wd33c93_softc *sc, uint8_t *cbuf, size_t clen,
222 1.1.6.2 christos uint8_t *buf, size_t *lenp)
223 1.1.6.2 christos {
224 1.1.6.2 christos uint8_t asr, csr, id, lun, target;
225 1.1.6.2 christos static int i = 0;
226 1.1.6.2 christos
227 1.1.6.2 christos sc->sc_state = SBIC_SELECTING;
228 1.1.6.2 christos
229 1.1.6.2 christos target = sc->sc_target;
230 1.1.6.2 christos lun = SCSI_LUN;
231 1.1.6.2 christos
232 1.1.6.2 christos /*
233 1.1.6.2 christos * issue select
234 1.1.6.2 christos */
235 1.1.6.2 christos SBIC_TC_PUT(sc, 0);
236 1.1.6.2 christos SET_SBIC_selid(sc, target);
237 1.1.6.2 christos SET_SBIC_timeo(sc, SBIC_TIMEOUT(250, SCSI_CLKFREQ));
238 1.1.6.2 christos
239 1.1.6.2 christos GET_SBIC_asr(sc, asr);
240 1.1.6.2 christos
241 1.1.6.2 christos if ((asr & (SBIC_ASR_INT|SBIC_ASR_BSY)) != 0) {
242 1.1.6.2 christos return 0;
243 1.1.6.2 christos }
244 1.1.6.2 christos
245 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_SEL_ATN);
246 1.1.6.2 christos WAIT_CIP(sc);
247 1.1.6.2 christos
248 1.1.6.2 christos /*
249 1.1.6.2 christos * wait for select (merged from separate function may need
250 1.1.6.2 christos * cleanup)
251 1.1.6.2 christos */
252 1.1.6.2 christos do {
253 1.1.6.2 christos asr = SBIC_WAIT(sc, SBIC_ASR_INT | SBIC_ASR_LCI, 0);
254 1.1.6.2 christos
255 1.1.6.2 christos if ((asr & SBIC_ASR_LCI) != 0) {
256 1.1.6.2 christos return 0;
257 1.1.6.2 christos }
258 1.1.6.2 christos
259 1.1.6.2 christos /* Clear interrupt */
260 1.1.6.2 christos GET_SBIC_csr(sc, csr);
261 1.1.6.2 christos
262 1.1.6.2 christos /* Reselected from under our feet? */
263 1.1.6.2 christos if (csr == SBIC_CSR_RSLT_NI || csr == SBIC_CSR_RSLT_IFY) {
264 1.1.6.2 christos /*
265 1.1.6.2 christos * We need to handle this now so we don't lock up later
266 1.1.6.2 christos */
267 1.1.6.2 christos wd33c93_nextstate(sc, cbuf, clen, buf, lenp, csr, asr);
268 1.1.6.2 christos return 0;
269 1.1.6.2 christos }
270 1.1.6.2 christos /* Whoops! */
271 1.1.6.2 christos if (csr == SBIC_CSR_SLT || csr == SBIC_CSR_SLT_ATN) {
272 1.1.6.2 christos return 0;
273 1.1.6.2 christos }
274 1.1.6.2 christos } while (csr != (SBIC_CSR_MIS_2 | MESG_OUT_PHASE) &&
275 1.1.6.2 christos csr != (SBIC_CSR_MIS_2 | CMD_PHASE) &&
276 1.1.6.2 christos csr != SBIC_CSR_SEL_TIMEO);
277 1.1.6.2 christos
278 1.1.6.2 christos /* Anyone at home? */
279 1.1.6.2 christos if (csr == SBIC_CSR_SEL_TIMEO) {
280 1.1.6.2 christos return 0;
281 1.1.6.2 christos }
282 1.1.6.2 christos
283 1.1.6.2 christos /* Assume we're now selected */
284 1.1.6.2 christos GET_SBIC_selid(sc, id);
285 1.1.6.2 christos
286 1.1.6.2 christos if (id != target) {
287 1.1.6.2 christos /* Something went wrong - wrong target was select */
288 1.1.6.2 christos printf("wd33c93_selectbus: wrong target selected WANTED %d GOT %d \n",
289 1.1.6.2 christos target, id);
290 1.1.6.2 christos printf("Boot failed! Halting...\n");
291 1.1.6.2 christos reboot();
292 1.1.6.2 christos }
293 1.1.6.2 christos
294 1.1.6.2 christos sc->sc_flags |= SBICF_SELECTED;
295 1.1.6.2 christos sc->sc_state = SBIC_CONNECTED;
296 1.1.6.2 christos
297 1.1.6.2 christos /* setup correct sync mode for this target */
298 1.1.6.2 christos wd33c93_setsync(sc);
299 1.1.6.2 christos SET_SBIC_rselid(sc, SBIC_RID_ER);
300 1.1.6.2 christos
301 1.1.6.2 christos /*
302 1.1.6.2 christos * We only really need to do anything when the target goes to MSG out
303 1.1.6.2 christos * If the device ignored ATN, it's probably old and brain-dead,
304 1.1.6.2 christos * but we'll try to support it anyhow.
305 1.1.6.2 christos * If it doesn't support message out, it definately doesn't
306 1.1.6.2 christos * support synchronous transfers, so no point in even asking...
307 1.1.6.2 christos */
308 1.1.6.2 christos
309 1.1.6.2 christos if (csr == (SBIC_CSR_MIS_2 | MESG_OUT_PHASE)) {
310 1.1.6.2 christos if (i < 6) {
311 1.1.6.2 christos SEND_BYTE(sc, MSG_IDENTIFY(lun, 0));
312 1.1.6.2 christos DELAY(200000);
313 1.1.6.2 christos i++;
314 1.1.6.2 christos } else {
315 1.1.6.2 christos /*
316 1.1.6.2 christos * setup scsi message sync message request
317 1.1.6.2 christos */
318 1.1.6.2 christos sc->sc_omsg[0] = MSG_IDENTIFY(lun, 0);
319 1.1.6.2 christos sc->sc_omsg[1] = MSG_EXTENDED;
320 1.1.6.2 christos sc->sc_omsg[2] = MSG_EXT_SDTR_LEN;
321 1.1.6.2 christos sc->sc_omsg[3] = MSG_EXT_SDTR;
322 1.1.6.2 christos sc->sc_omsg[4] = sc->sc_syncperiods;
323 1.1.6.2 christos sc->sc_omsg[5] = SBIC_SYN_93AB_MAX_OFFSET;
324 1.1.6.2 christos
325 1.1.6.2 christos size_t foo = 6;
326 1.1.6.2 christos size_t *bar;
327 1.1.6.2 christos bar = &foo;
328 1.1.6.2 christos
329 1.1.6.2 christos wd33c93_xfout(sc, sc->sc_omsg, bar);
330 1.1.6.2 christos sc->sc_flags |= SBICF_SYNCNEGO;
331 1.1.6.2 christos }
332 1.1.6.2 christos
333 1.1.6.2 christos SBIC_WAIT(sc, SBIC_ASR_INT , 0);
334 1.1.6.2 christos GET_SBIC_csr(sc, csr);
335 1.1.6.2 christos }
336 1.1.6.2 christos return csr;
337 1.1.6.2 christos }
338 1.1.6.2 christos
339 1.1.6.2 christos /*
340 1.1.6.2 christos * Setup sync mode for given target
341 1.1.6.2 christos */
342 1.1.6.2 christos void
343 1.1.6.2 christos wd33c93_setsync(struct wd33c93_softc *sc)
344 1.1.6.2 christos {
345 1.1.6.2 christos uint8_t syncreg;
346 1.1.6.2 christos
347 1.1.6.2 christos syncreg = SBIC_SYN(0, 0, 0);
348 1.1.6.2 christos
349 1.1.6.2 christos SET_SBIC_syn(sc, syncreg);
350 1.1.6.2 christos }
351 1.1.6.2 christos
352 1.1.6.2 christos /*
353 1.1.6.2 christos * wd33c93_nextstate()
354 1.1.6.2 christos * return:
355 1.1.6.2 christos * SBIC_STATE_DONE == done
356 1.1.6.2 christos * SBIC_STATE_RUNNING == working
357 1.1.6.2 christos * SBIC_STATE_DISCONNECT == disconnected
358 1.1.6.2 christos * SBIC_STATE_ERROR == error
359 1.1.6.2 christos */
360 1.1.6.2 christos int
361 1.1.6.2 christos wd33c93_nextstate(struct wd33c93_softc *sc, uint8_t *cbuf, size_t clen,
362 1.1.6.2 christos uint8_t *buf, size_t *lenp, uint8_t csr, uint8_t asr)
363 1.1.6.2 christos {
364 1.1.6.2 christos size_t *clenp;
365 1.1.6.2 christos size_t resid;
366 1.1.6.2 christos
367 1.1.6.2 christos switch (csr) {
368 1.1.6.2 christos case SBIC_CSR_XFERRED | CMD_PHASE:
369 1.1.6.2 christos case SBIC_CSR_MIS | CMD_PHASE:
370 1.1.6.2 christos case SBIC_CSR_MIS_1 | CMD_PHASE:
371 1.1.6.2 christos case SBIC_CSR_MIS_2 | CMD_PHASE:
372 1.1.6.2 christos clenp = &clen;
373 1.1.6.2 christos
374 1.1.6.2 christos if (wd33c93_xfout(sc, cbuf, clenp))
375 1.1.6.2 christos goto abort;
376 1.1.6.2 christos break;
377 1.1.6.2 christos
378 1.1.6.2 christos case SBIC_CSR_XFERRED | STATUS_PHASE:
379 1.1.6.2 christos case SBIC_CSR_MIS | STATUS_PHASE:
380 1.1.6.2 christos case SBIC_CSR_MIS_1 | STATUS_PHASE:
381 1.1.6.2 christos case SBIC_CSR_MIS_2 | STATUS_PHASE:
382 1.1.6.2 christos SET_SBIC_control(sc, SBIC_CTL_EDI | SBIC_CTL_IDI);
383 1.1.6.2 christos
384 1.1.6.2 christos /*
385 1.1.6.2 christos * this should be the normal i/o completion case.
386 1.1.6.2 christos * get the status & cmd complete msg then let the
387 1.1.6.2 christos * device driver look at what happened.
388 1.1.6.2 christos */
389 1.1.6.2 christos wd33c93_xferdone(sc);
390 1.1.6.2 christos wd33c93_scsidone(sc);
391 1.1.6.2 christos
392 1.1.6.2 christos return SBIC_STATE_DONE;
393 1.1.6.2 christos
394 1.1.6.2 christos case SBIC_CSR_XFERRED | DATA_IN_PHASE:
395 1.1.6.2 christos case SBIC_CSR_MIS | DATA_IN_PHASE:
396 1.1.6.2 christos case SBIC_CSR_MIS_1 | DATA_IN_PHASE:
397 1.1.6.2 christos case SBIC_CSR_MIS_2 | DATA_IN_PHASE:
398 1.1.6.2 christos case SBIC_CSR_XFERRED | DATA_OUT_PHASE:
399 1.1.6.2 christos case SBIC_CSR_MIS | DATA_OUT_PHASE:
400 1.1.6.2 christos case SBIC_CSR_MIS_1 | DATA_OUT_PHASE:
401 1.1.6.2 christos case SBIC_CSR_MIS_2 | DATA_OUT_PHASE:
402 1.1.6.2 christos /*
403 1.1.6.2 christos * Should we transfer using PIO or DMA ?
404 1.1.6.2 christos */
405 1.1.6.2 christos /* Perfrom transfer using PIO */
406 1.1.6.2 christos if (SBIC_PHASE(csr) == DATA_IN_PHASE){
407 1.1.6.2 christos /* data in */
408 1.1.6.2 christos resid = wd33c93_xfin(sc, buf, lenp);
409 1.1.6.2 christos *lenp = resid;
410 1.1.6.2 christos wd33c93_intr(sc, cbuf, clen, buf, lenp);
411 1.1.6.2 christos } else { /* data out */
412 1.1.6.2 christos resid = wd33c93_xfout(sc, buf, lenp);
413 1.1.6.2 christos *lenp = resid;
414 1.1.6.2 christos }
415 1.1.6.2 christos break;
416 1.1.6.2 christos
417 1.1.6.2 christos case SBIC_CSR_XFERRED | MESG_IN_PHASE:
418 1.1.6.2 christos case SBIC_CSR_MIS | MESG_IN_PHASE:
419 1.1.6.2 christos case SBIC_CSR_MIS_1 | MESG_IN_PHASE:
420 1.1.6.2 christos case SBIC_CSR_MIS_2 | MESG_IN_PHASE:
421 1.1.6.2 christos /* Handle a single message in... */
422 1.1.6.2 christos return wd33c93_msgin_phase(sc);
423 1.1.6.2 christos
424 1.1.6.2 christos case SBIC_CSR_MSGIN_W_ACK:
425 1.1.6.2 christos /*
426 1.1.6.2 christos * We should never see this since it's handled in
427 1.1.6.2 christos * 'wd33c93_msgin_phase()' but just for the sake of paranoia...
428 1.1.6.2 christos */
429 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_CLR_ACK);
430 1.1.6.2 christos break;
431 1.1.6.2 christos
432 1.1.6.2 christos case SBIC_CSR_XFERRED | MESG_OUT_PHASE:
433 1.1.6.2 christos case SBIC_CSR_MIS | MESG_OUT_PHASE:
434 1.1.6.2 christos case SBIC_CSR_MIS_1 | MESG_OUT_PHASE:
435 1.1.6.2 christos case SBIC_CSR_MIS_2 | MESG_OUT_PHASE:
436 1.1.6.2 christos /*
437 1.1.6.2 christos * Message out phase. ATN signal has been asserted
438 1.1.6.2 christos */
439 1.1.6.2 christos return SBIC_STATE_RUNNING;
440 1.1.6.2 christos
441 1.1.6.2 christos case SBIC_CSR_DISC:
442 1.1.6.2 christos case SBIC_CSR_DISC_1:
443 1.1.6.2 christos sc->sc_state = SBIC_IDLE;
444 1.1.6.2 christos sc->sc_flags = 0;
445 1.1.6.2 christos
446 1.1.6.2 christos return SBIC_STATE_DISCONNECT;
447 1.1.6.2 christos
448 1.1.6.2 christos case SBIC_CSR_RSLT_NI:
449 1.1.6.2 christos case SBIC_CSR_RSLT_IFY:
450 1.1.6.2 christos {
451 1.1.6.2 christos sc->sc_state = SBIC_RESELECTED;
452 1.1.6.2 christos
453 1.1.6.2 christos if (csr == SBIC_CSR_RSLT_IFY)
454 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_CLR_ACK);
455 1.1.6.2 christos break;
456 1.1.6.2 christos }
457 1.1.6.2 christos
458 1.1.6.2 christos default:
459 1.1.6.2 christos abort:
460 1.1.6.2 christos /* Something unexpected happend -- deal with it. */
461 1.1.6.2 christos printf("wd33c93_nextstate:abort\n");
462 1.1.6.2 christos printf("Boot failed! Halting...\n");
463 1.1.6.2 christos reboot();
464 1.1.6.2 christos }
465 1.1.6.2 christos return SBIC_STATE_RUNNING;
466 1.1.6.2 christos }
467 1.1.6.2 christos
468 1.1.6.2 christos /*
469 1.1.6.2 christos * Information Transfer *to* a SCSI Target.
470 1.1.6.2 christos *
471 1.1.6.2 christos * Note: Don't expect there to be an interrupt immediately after all
472 1.1.6.2 christos * the data is transferred out. The WD spec sheet says that the Transfer-
473 1.1.6.2 christos * Info command for non-MSG_IN phases only completes when the target
474 1.1.6.2 christos * next asserts 'REQ'. That is, when the SCSI bus changes to a new state.
475 1.1.6.2 christos *
476 1.1.6.2 christos * This can have a nasty effect on commands which take a relatively long
477 1.1.6.2 christos * time to complete, for example a START/STOP unit command may remain in
478 1.1.6.2 christos * CMD phase until the disk has spun up. Only then will the target change
479 1.1.6.2 christos * to STATUS phase. This is really only a problem for immediate commands
480 1.1.6.2 christos * since we don't allow disconnection for them (yet).
481 1.1.6.2 christos */
482 1.1.6.2 christos size_t
483 1.1.6.2 christos wd33c93_xfout(struct wd33c93_softc *sc, void *bp, size_t *lenp)
484 1.1.6.2 christos {
485 1.1.6.2 christos
486 1.1.6.2 christos int wait = wd33c93_data_wait;
487 1.1.6.2 christos uint8_t asr, *buf = bp;
488 1.1.6.2 christos size_t len = *lenp;
489 1.1.6.2 christos
490 1.1.6.2 christos /*
491 1.1.6.2 christos * sigh.. WD-PROTO strikes again.. sending the command in one go
492 1.1.6.2 christos * causes the chip to lock up if talking to certain (misbehaving?)
493 1.1.6.2 christos * targets. Anyway, this procedure should work for all targets, but
494 1.1.6.2 christos * it's slightly slower due to the overhead
495 1.1.6.2 christos */
496 1.1.6.2 christos
497 1.1.6.2 christos SET_SBIC_control(sc, SBIC_CTL_EDI | SBIC_CTL_IDI);
498 1.1.6.2 christos SBIC_TC_PUT(sc, (unsigned int)len);
499 1.1.6.2 christos
500 1.1.6.2 christos WAIT_CIP(sc);
501 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_XFER_INFO);
502 1.1.6.2 christos
503 1.1.6.2 christos /*
504 1.1.6.2 christos * Loop for each byte transferred
505 1.1.6.2 christos */
506 1.1.6.2 christos do {
507 1.1.6.2 christos GET_SBIC_asr(sc, asr);
508 1.1.6.2 christos
509 1.1.6.2 christos if ((asr & SBIC_ASR_DBR) != 0) {
510 1.1.6.2 christos if (len != 0) {
511 1.1.6.2 christos SET_SBIC_data(sc, *buf);
512 1.1.6.2 christos buf++;
513 1.1.6.2 christos len--;
514 1.1.6.2 christos } else {
515 1.1.6.2 christos SET_SBIC_data(sc, 0);
516 1.1.6.2 christos }
517 1.1.6.2 christos wait = wd33c93_data_wait;
518 1.1.6.2 christos }
519 1.1.6.2 christos } while (len != 0 && (asr & SBIC_ASR_INT) == 0 && wait-- > 0);
520 1.1.6.2 christos
521 1.1.6.2 christos /*
522 1.1.6.2 christos * Normally, an interrupt will be pending when this routing returns.
523 1.1.6.2 christos */
524 1.1.6.2 christos return len;
525 1.1.6.2 christos }
526 1.1.6.2 christos
527 1.1.6.2 christos int
528 1.1.6.2 christos wd33c93_intr(struct wd33c93_softc *sc, uint8_t *cbuf, size_t clen,
529 1.1.6.2 christos uint8_t *buf, size_t *lenp)
530 1.1.6.2 christos {
531 1.1.6.2 christos uint8_t asr, csr;
532 1.1.6.2 christos
533 1.1.6.2 christos /*
534 1.1.6.2 christos * pending interrupt?
535 1.1.6.2 christos */
536 1.1.6.2 christos GET_SBIC_asr(sc, asr);
537 1.1.6.2 christos if ((asr & SBIC_ASR_INT) == 0)
538 1.1.6.2 christos return 0;
539 1.1.6.2 christos
540 1.1.6.2 christos GET_SBIC_csr(sc, csr);
541 1.1.6.2 christos
542 1.1.6.2 christos do {
543 1.1.6.2 christos
544 1.1.6.2 christos (void)wd33c93_nextstate(sc, cbuf, clen, buf, lenp, csr, asr);
545 1.1.6.2 christos WAIT_CIP(sc);
546 1.1.6.2 christos if (sc->sc_state == SBIC_CONNECTED) {
547 1.1.6.2 christos GET_SBIC_asr(sc, asr);
548 1.1.6.2 christos
549 1.1.6.2 christos if ((asr & SBIC_ASR_INT) != 0)
550 1.1.6.2 christos GET_SBIC_csr(sc, csr);
551 1.1.6.2 christos }
552 1.1.6.2 christos } while (sc->sc_state == SBIC_CONNECTED &&
553 1.1.6.2 christos (asr & (SBIC_ASR_INT|SBIC_ASR_LCI)) != 0);
554 1.1.6.2 christos
555 1.1.6.2 christos return 1;
556 1.1.6.2 christos }
557 1.1.6.2 christos
558 1.1.6.2 christos /*
559 1.1.6.2 christos * Information Transfer *from* a Scsi Target
560 1.1.6.2 christos * returns # bytes left to read
561 1.1.6.2 christos */
562 1.1.6.2 christos size_t
563 1.1.6.2 christos wd33c93_xfin(struct wd33c93_softc *sc, void *bp, size_t *lenp)
564 1.1.6.2 christos {
565 1.1.6.2 christos size_t len = *lenp;
566 1.1.6.2 christos
567 1.1.6.2 christos int wait = wd33c93_data_wait;
568 1.1.6.2 christos uint8_t *buf = bp;
569 1.1.6.2 christos uint8_t asr;
570 1.1.6.2 christos
571 1.1.6.2 christos SET_SBIC_control(sc, SBIC_CTL_EDI | SBIC_CTL_IDI);
572 1.1.6.2 christos SBIC_TC_PUT(sc, (unsigned int)len);
573 1.1.6.2 christos
574 1.1.6.2 christos WAIT_CIP(sc);
575 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_XFER_INFO);
576 1.1.6.2 christos
577 1.1.6.2 christos /*
578 1.1.6.2 christos * Loop for each byte transferred
579 1.1.6.2 christos */
580 1.1.6.2 christos do {
581 1.1.6.2 christos GET_SBIC_asr(sc, asr);
582 1.1.6.2 christos
583 1.1.6.2 christos if ((asr & SBIC_ASR_DBR) != 0) {
584 1.1.6.2 christos if (len != 0) {
585 1.1.6.2 christos GET_SBIC_data(sc, *buf);
586 1.1.6.2 christos buf++;
587 1.1.6.2 christos len--;
588 1.1.6.2 christos } else {
589 1.1.6.2 christos uint8_t foo;
590 1.1.6.2 christos GET_SBIC_data(sc, foo);
591 1.1.6.2 christos __USE(foo);
592 1.1.6.2 christos }
593 1.1.6.2 christos wait = wd33c93_data_wait;
594 1.1.6.2 christos }
595 1.1.6.2 christos
596 1.1.6.2 christos } while ((asr & SBIC_ASR_INT) == 0 && wait-- > 0);
597 1.1.6.2 christos
598 1.1.6.2 christos SBIC_TC_PUT(sc, 0);
599 1.1.6.2 christos
600 1.1.6.2 christos /*
601 1.1.6.2 christos * this leaves with one csr to be read
602 1.1.6.2 christos */
603 1.1.6.2 christos return len;
604 1.1.6.2 christos }
605 1.1.6.2 christos
606 1.1.6.2 christos /*
607 1.1.6.2 christos * Finish SCSI xfer command: After the completion interrupt from
608 1.1.6.2 christos * a read/write operation, sequence through the final phases in
609 1.1.6.2 christos * programmed i/o.
610 1.1.6.2 christos */
611 1.1.6.2 christos void
612 1.1.6.2 christos wd33c93_xferdone(struct wd33c93_softc *sc)
613 1.1.6.2 christos {
614 1.1.6.2 christos uint8_t phase, csr;
615 1.1.6.2 christos
616 1.1.6.2 christos /*
617 1.1.6.2 christos * have the wd33c93 complete on its own
618 1.1.6.2 christos */
619 1.1.6.2 christos SBIC_TC_PUT(sc, 0);
620 1.1.6.2 christos SET_SBIC_cmd_phase(sc, 0x46);
621 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_SEL_ATN_XFER);
622 1.1.6.2 christos
623 1.1.6.2 christos do {
624 1.1.6.2 christos SBIC_WAIT(sc, SBIC_ASR_INT, 0);
625 1.1.6.2 christos GET_SBIC_csr(sc, csr);
626 1.1.6.2 christos } while ((csr != SBIC_CSR_DISC) &&
627 1.1.6.2 christos (csr != SBIC_CSR_DISC_1) &&
628 1.1.6.2 christos (csr != SBIC_CSR_S_XFERRED));
629 1.1.6.2 christos
630 1.1.6.2 christos sc->sc_flags &= ~SBICF_SELECTED;
631 1.1.6.2 christos sc->sc_state = SBIC_DISCONNECT;
632 1.1.6.2 christos
633 1.1.6.2 christos GET_SBIC_cmd_phase(sc, phase);
634 1.1.6.2 christos
635 1.1.6.2 christos if (phase == 0x60)
636 1.1.6.2 christos GET_SBIC_tlun(sc, sc->sc_status);
637 1.1.6.2 christos else
638 1.1.6.2 christos wd33c93_error(sc);
639 1.1.6.2 christos }
640 1.1.6.2 christos
641 1.1.6.2 christos int
642 1.1.6.2 christos wd33c93_abort(struct wd33c93_softc *sc, uint8_t *cbuf, size_t clen,
643 1.1.6.2 christos uint8_t *buf, size_t *lenp)
644 1.1.6.2 christos {
645 1.1.6.2 christos uint8_t csr, asr;
646 1.1.6.2 christos
647 1.1.6.2 christos GET_SBIC_asr(sc, asr);
648 1.1.6.2 christos GET_SBIC_csr(sc, csr);
649 1.1.6.2 christos
650 1.1.6.2 christos /*
651 1.1.6.2 christos * Clean up chip itself
652 1.1.6.2 christos */
653 1.1.6.2 christos wd33c93_timeout(sc, cbuf, clen, buf, lenp);
654 1.1.6.2 christos
655 1.1.6.2 christos while ((asr & SBIC_ASR_DBR) != 0) {
656 1.1.6.2 christos /*
657 1.1.6.2 christos * wd33c93 is jammed w/data. need to clear it
658 1.1.6.2 christos * But we don't know what direction it needs to go
659 1.1.6.2 christos */
660 1.1.6.2 christos GET_SBIC_data(sc, asr);
661 1.1.6.2 christos GET_SBIC_asr(sc, asr);
662 1.1.6.2 christos if ((asr & SBIC_ASR_DBR) != 0)
663 1.1.6.2 christos /* Not the read direction */
664 1.1.6.2 christos SET_SBIC_data(sc, asr);
665 1.1.6.2 christos GET_SBIC_asr(sc, asr);
666 1.1.6.2 christos }
667 1.1.6.2 christos
668 1.1.6.2 christos WAIT_CIP(sc);
669 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_ABORT);
670 1.1.6.2 christos WAIT_CIP(sc);
671 1.1.6.2 christos
672 1.1.6.2 christos GET_SBIC_asr(sc, asr);
673 1.1.6.2 christos
674 1.1.6.2 christos if ((asr & (SBIC_ASR_BSY|SBIC_ASR_LCI)) != 0) {
675 1.1.6.2 christos /*
676 1.1.6.2 christos * ok, get more drastic..
677 1.1.6.2 christos */
678 1.1.6.2 christos wd33c93_reset(sc);
679 1.1.6.2 christos } else {
680 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_DISC);
681 1.1.6.2 christos WAIT_CIP(sc);
682 1.1.6.2 christos
683 1.1.6.2 christos do {
684 1.1.6.2 christos SBIC_WAIT(sc, SBIC_ASR_INT, 0);
685 1.1.6.2 christos GET_SBIC_asr(sc, asr);
686 1.1.6.2 christos GET_SBIC_csr(sc, csr);
687 1.1.6.2 christos } while ((csr != SBIC_CSR_DISC) &&
688 1.1.6.2 christos (csr != SBIC_CSR_DISC_1) &&
689 1.1.6.2 christos (csr != SBIC_CSR_CMD_INVALID));
690 1.1.6.2 christos
691 1.1.6.2 christos sc->sc_state = SBIC_ERROR;
692 1.1.6.2 christos sc->sc_flags = 0;
693 1.1.6.2 christos }
694 1.1.6.2 christos return SBIC_STATE_ERROR;
695 1.1.6.2 christos }
696 1.1.6.2 christos
697 1.1.6.2 christos void
698 1.1.6.2 christos wd33c93_timeout(struct wd33c93_softc *sc, uint8_t *cbuf, size_t clen,
699 1.1.6.2 christos uint8_t *buf, size_t *lenp)
700 1.1.6.2 christos {
701 1.1.6.2 christos uint8_t asr;
702 1.1.6.2 christos
703 1.1.6.2 christos GET_SBIC_asr(sc, asr);
704 1.1.6.2 christos
705 1.1.6.2 christos if ((asr & SBIC_ASR_INT) != 0) {
706 1.1.6.2 christos /* We need to service a missed IRQ */
707 1.1.6.2 christos wd33c93_intr(sc, cbuf, clen, buf, lenp);
708 1.1.6.2 christos } else {
709 1.1.6.2 christos wd33c93_abort(sc, cbuf, clen, buf, lenp);
710 1.1.6.2 christos }
711 1.1.6.2 christos }
712 1.1.6.2 christos
713 1.1.6.2 christos /*
714 1.1.6.2 christos * Complete current command using polled I/O.Used when interrupt driven
715 1.1.6.2 christos * I/O is not allowed (ie. during boot and shutdown)
716 1.1.6.2 christos *
717 1.1.6.2 christos * Polled I/O is very processor intensive
718 1.1.6.2 christos */
719 1.1.6.2 christos int
720 1.1.6.2 christos wd33c93_poll(struct wd33c93_softc *sc, uint8_t *cbuf, size_t clen,
721 1.1.6.2 christos uint8_t *buf, size_t *lenp)
722 1.1.6.2 christos {
723 1.1.6.2 christos uint8_t asr, csr = 0;
724 1.1.6.2 christos int count;
725 1.1.6.2 christos
726 1.1.6.2 christos SBIC_WAIT(sc, SBIC_ASR_INT, wd33c93_cmd_wait);
727 1.1.6.2 christos for (count = SBIC_ABORT_TIMEOUT; count;) {
728 1.1.6.2 christos GET_SBIC_asr(sc, asr);
729 1.1.6.2 christos if ((asr & SBIC_ASR_LCI) != 0)
730 1.1.6.2 christos DELAY(5000);
731 1.1.6.2 christos
732 1.1.6.2 christos if ((asr & SBIC_ASR_INT) != 0) {
733 1.1.6.2 christos GET_SBIC_csr(sc, csr);
734 1.1.6.2 christos (void)wd33c93_nextstate(sc, cbuf, clen, buf, lenp, csr,
735 1.1.6.2 christos asr);
736 1.1.6.2 christos WAIT_CIP(sc);
737 1.1.6.2 christos } else {
738 1.1.6.2 christos DELAY(5000);
739 1.1.6.2 christos count--;
740 1.1.6.2 christos }
741 1.1.6.2 christos
742 1.1.6.2 christos if ((sc->xs_status & XS_STS_DONE) != 0)
743 1.1.6.2 christos return 0;
744 1.1.6.2 christos }
745 1.1.6.2 christos return 1;
746 1.1.6.2 christos }
747 1.1.6.2 christos
748 1.1.6.2 christos static inline int
749 1.1.6.2 christos __verify_msg_format(uint8_t *p, int len)
750 1.1.6.2 christos {
751 1.1.6.2 christos
752 1.1.6.2 christos if (len == 1 && MSG_IS1BYTE(p[0]))
753 1.1.6.2 christos return 1;
754 1.1.6.2 christos if (len == 2 && MSG_IS2BYTE(p[0]))
755 1.1.6.2 christos return 1;
756 1.1.6.2 christos if (len >= 3 && MSG_ISEXTENDED(p[0]) &&
757 1.1.6.2 christos len == p[1] + 2)
758 1.1.6.2 christos return 1;
759 1.1.6.2 christos return 0;
760 1.1.6.2 christos }
761 1.1.6.2 christos
762 1.1.6.2 christos /*
763 1.1.6.2 christos * Handle message_in phase
764 1.1.6.2 christos */
765 1.1.6.2 christos int
766 1.1.6.2 christos wd33c93_msgin_phase(struct wd33c93_softc *sc)
767 1.1.6.2 christos {
768 1.1.6.2 christos int len;
769 1.1.6.2 christos uint8_t asr, csr, *msg;
770 1.1.6.2 christos
771 1.1.6.2 christos GET_SBIC_asr(sc, asr);
772 1.1.6.2 christos __USE(asr);
773 1.1.6.2 christos
774 1.1.6.2 christos GET_SBIC_selid(sc, csr);
775 1.1.6.2 christos SET_SBIC_selid(sc, csr | SBIC_SID_FROM_SCSI);
776 1.1.6.2 christos
777 1.1.6.2 christos SBIC_TC_PUT(sc, 0);
778 1.1.6.2 christos
779 1.1.6.2 christos SET_SBIC_control(sc, SBIC_CTL_EDI | SBIC_CTL_IDI);
780 1.1.6.2 christos
781 1.1.6.2 christos msg = sc->sc_imsg;
782 1.1.6.2 christos len = 0;
783 1.1.6.2 christos
784 1.1.6.2 christos do {
785 1.1.6.2 christos /* Fetch the next byte of the message */
786 1.1.6.2 christos RECV_BYTE(sc, *msg++);
787 1.1.6.2 christos len++;
788 1.1.6.2 christos
789 1.1.6.2 christos /*
790 1.1.6.2 christos * get the command completion interrupt, or we
791 1.1.6.2 christos * can't send a new command (LCI)
792 1.1.6.2 christos */
793 1.1.6.2 christos SBIC_WAIT(sc, SBIC_ASR_INT, 0);
794 1.1.6.2 christos GET_SBIC_csr(sc, csr);
795 1.1.6.2 christos
796 1.1.6.2 christos if (__verify_msg_format(sc->sc_imsg, len))
797 1.1.6.2 christos /* Complete message received */
798 1.1.6.2 christos break;
799 1.1.6.2 christos
800 1.1.6.2 christos /*
801 1.1.6.2 christos * Clear ACK, and wait for the interrupt
802 1.1.6.2 christos * for the next byte or phase change
803 1.1.6.2 christos */
804 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_CLR_ACK);
805 1.1.6.2 christos SBIC_WAIT(sc, SBIC_ASR_INT, 0);
806 1.1.6.2 christos
807 1.1.6.2 christos GET_SBIC_csr(sc, csr);
808 1.1.6.2 christos } while (len < SBIC_MAX_MSGLEN);
809 1.1.6.2 christos
810 1.1.6.2 christos /*
811 1.1.6.2 christos * Clear ACK, and wait for the interrupt
812 1.1.6.2 christos * for the phase change
813 1.1.6.2 christos */
814 1.1.6.2 christos SET_SBIC_cmd(sc, SBIC_CMD_CLR_ACK);
815 1.1.6.2 christos SBIC_WAIT(sc, SBIC_ASR_INT, 0);
816 1.1.6.2 christos
817 1.1.6.2 christos /* Should still have one CSR to read */
818 1.1.6.2 christos return SBIC_STATE_RUNNING;
819 1.1.6.2 christos }
820 1.1.6.2 christos
821 1.1.6.2 christos void
822 1.1.6.2 christos wd33c93_scsistart(struct wd33c93_softc *sc)
823 1.1.6.2 christos {
824 1.1.6.2 christos
825 1.1.6.2 christos sc->xs_status = 0;
826 1.1.6.2 christos }
827 1.1.6.2 christos
828 1.1.6.2 christos void
829 1.1.6.2 christos wd33c93_scsidone(struct wd33c93_softc *sc)
830 1.1.6.2 christos {
831 1.1.6.2 christos
832 1.1.6.2 christos sc->xs_status = XS_STS_DONE;
833 1.1.6.2 christos }
834 1.1.6.2 christos
835 1.1.6.2 christos void
836 1.1.6.2 christos wd33c93_error(struct wd33c93_softc *sc)
837 1.1.6.2 christos {
838 1.1.6.2 christos }
839