sunscpal.c revision 1.23 1 /* $NetBSD: sunscpal.c,v 1.23 2008/07/06 13:29:50 tsutsui Exp $ */
2
3 /*
4 * Copyright (c) 2001 Matthew Fredette
5 * Copyright (c) 1995 David Jones, Gordon W. Ross
6 * Copyright (c) 1994 Jarle Greipsland
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. The name of the authors may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
19 * 4. All advertising materials mentioning features or use of this software
20 * must display the following acknowledgement:
21 * This product includes software developed by
22 * David Jones and Gordon Ross
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 */
35
36 /*
37 * This is a machine-independent driver for the Sun "sc"
38 * SCSI Bus Controller (SBC).
39 *
40 * This code should work with any memory-mapped card,
41 * and can be shared by multiple adapters that address
42 * the card with different register offset spacings.
43 * (This can happen on the atari, for example.)
44 *
45 * Credits, history:
46 *
47 * Matthew Fredette completely copied revision 1.38 of
48 * ncr5380sbc.c, and then heavily modified it to match
49 * the Sun sc PAL. The remaining credits are for
50 * ncr5380sbc.c:
51 *
52 * David Jones is the author of most of the code that now
53 * appears in this file, and was the architect of the
54 * current overall structure (MI/MD code separation, etc.)
55 *
56 * Gordon Ross integrated the message phase code, added lots of
57 * comments about what happens when and why (re. SCSI spec.),
58 * debugged some reentrance problems, and added several new
59 * "hooks" needed for the Sun3 "si" adapters.
60 *
61 * The message in/out code was taken nearly verbatim from
62 * the aic6360 driver by Jarle Greipsland.
63 *
64 * Several other NCR5380 drivers were used for reference
65 * while developing this driver, including work by:
66 * The Alice Group (mac68k port) namely:
67 * Allen K. Briggs, Chris P. Caputo, Michael L. Finch,
68 * Bradley A. Grantham, and Lawrence A. Kesteloot
69 * Michael L. Hitch (amiga drivers: sci.c)
70 * Leo Weppelman (atari driver: ncr5380.c)
71 * There are others too. Thanks, everyone.
72 *
73 * Transliteration to bus_space() performed 9/17/98 by
74 * John Ruschmeyer (jruschme (at) exit109.com) for i386 'nca' driver.
75 * Thank you all.
76 */
77
78 #include <sys/cdefs.h>
79 __KERNEL_RCSID(0, "$NetBSD: sunscpal.c,v 1.23 2008/07/06 13:29:50 tsutsui Exp $");
80
81 #include "opt_ddb.h"
82
83 #include <sys/param.h>
84 #include <sys/systm.h>
85 #include <sys/kernel.h>
86 #include <sys/errno.h>
87 #include <sys/malloc.h>
88 #include <sys/device.h>
89 #include <sys/buf.h>
90 #include <sys/proc.h>
91 #include <sys/user.h>
92
93 #include <dev/scsipi/scsi_all.h>
94 #include <dev/scsipi/scsipi_all.h>
95 #include <dev/scsipi/scsipi_debug.h>
96 #include <dev/scsipi/scsi_message.h>
97 #include <dev/scsipi/scsiconf.h>
98
99 #ifdef DDB
100 #include <ddb/db_output.h>
101 #endif
102
103 #include <dev/ic/sunscpalreg.h>
104 #include <dev/ic/sunscpalvar.h>
105
106 static void sunscpal_reset_scsibus(struct sunscpal_softc *);
107 static void sunscpal_sched(struct sunscpal_softc *);
108 static void sunscpal_done(struct sunscpal_softc *);
109
110 static int sunscpal_select(struct sunscpal_softc *, struct sunscpal_req *);
111 static void sunscpal_reselect(struct sunscpal_softc *);
112
113 static int sunscpal_msg_in(struct sunscpal_softc *);
114 static int sunscpal_msg_out(struct sunscpal_softc *);
115 static int sunscpal_data_xfer(struct sunscpal_softc *, int);
116 static int sunscpal_command(struct sunscpal_softc *);
117 static int sunscpal_status(struct sunscpal_softc *);
118 static void sunscpal_machine(struct sunscpal_softc *);
119
120 void sunscpal_abort(struct sunscpal_softc *);
121 void sunscpal_cmd_timeout(void *);
122 /*
123 * Action flags returned by the info_transfer functions:
124 * (These determine what happens next.)
125 */
126 #define ACT_CONTINUE 0x00 /* No flags: expect another phase */
127 #define ACT_DISCONNECT 0x01 /* Target is disconnecting */
128 #define ACT_CMD_DONE 0x02 /* Need to call scsipi_done() */
129 #define ACT_RESET_BUS 0x04 /* Need bus reset (cmd timeout) */
130 #define ACT_WAIT_DMA 0x10 /* Wait for DMA to complete */
131
132 /*****************************************************************
133 * Debugging stuff
134 *****************************************************************/
135
136 #ifndef DDB
137 /* This is used only in recoverable places. */
138 #ifndef Debugger
139 #define Debugger() printf("Debug: sunscpal.c:%d\n", __LINE__)
140 #endif
141 #endif
142
143 #ifdef SUNSCPAL_DEBUG
144
145 #define SUNSCPAL_DBG_BREAK 1
146 #define SUNSCPAL_DBG_CMDS 2
147 #define SUNSCPAL_DBG_DMA 4
148 int sunscpal_debug = 0;
149 #define SUNSCPAL_BREAK() \
150 do { if (sunscpal_debug & SUNSCPAL_DBG_BREAK) Debugger(); } while (0)
151 static void sunscpal_show_scsi_cmd(struct scsipi_xfer *);
152 #ifdef DDB
153 void sunscpal_clear_trace(void);
154 void sunscpal_show_trace(void);
155 void sunscpal_show_req(struct sunscpal_req *);
156 void sunscpal_show_state(void);
157 #endif /* DDB */
158 #else /* SUNSCPAL_DEBUG */
159
160 #define SUNSCPAL_BREAK() /* nada */
161 #define sunscpal_show_scsi_cmd(xs) /* nada */
162
163 #endif /* SUNSCPAL_DEBUG */
164
165 static const char *
166 phase_names[8] = {
167 "DATA_OUT",
168 "DATA_IN",
169 "COMMAND",
170 "STATUS",
171 "UNSPEC1",
172 "UNSPEC2",
173 "MSG_OUT",
174 "MSG_IN",
175 };
176
177 #ifdef SUNSCPAL_USE_BUS_DMA
178 static void sunscpal_dma_alloc(struct sunscpal_softc *);
179 static void sunscpal_dma_free(struct sunscpal_softc *);
180 static void sunscpal_dma_setup(struct sunscpal_softc *);
181 #else
182 #define sunscpal_dma_alloc(sc) (*sc->sc_dma_alloc)(sc)
183 #define sunscpal_dma_free(sc) (*sc->sc_dma_free)(sc)
184 #define sunscpal_dma_setup(sc) (*sc->sc_dma_setup)(sc)
185 #endif
186 static void sunscpal_minphys(struct buf *);
187
188 /*****************************************************************
189 * Actual chip control
190 *****************************************************************/
191
192 /*
193 * XXX: These timeouts might need to be tuned...
194 */
195
196 /* This one is used when waiting for a phase change. (X100uS.) */
197 int sunscpal_wait_phase_timo = 1000 * 10 * 300; /* 5 min. */
198
199 /* These are used in the following inline functions. */
200 int sunscpal_wait_req_timo = 1000 * 50; /* X2 = 100 mS. */
201 int sunscpal_wait_nrq_timo = 1000 * 25; /* X2 = 50 mS. */
202
203 static inline int sunscpal_wait_req(struct sunscpal_softc *);
204 static inline int sunscpal_wait_not_req(struct sunscpal_softc *);
205 static inline void sunscpal_sched_msgout(struct sunscpal_softc *, int);
206
207 /* Return zero on success. */
208 static inline int sunscpal_wait_req(struct sunscpal_softc *sc)
209 {
210 int timo = sunscpal_wait_req_timo;
211
212 for (;;) {
213 if (SUNSCPAL_READ_2(sc, sunscpal_icr) & SUNSCPAL_ICR_REQUEST) {
214 timo = 0; /* return 0 */
215 break;
216 }
217 if (--timo < 0)
218 break; /* return -1 */
219 delay(2);
220 }
221 return timo;
222 }
223
224 /* Return zero on success. */
225 static inline int sunscpal_wait_not_req(struct sunscpal_softc *sc)
226 {
227 int timo = sunscpal_wait_nrq_timo;
228
229 for (;;) {
230 if ((SUNSCPAL_READ_2(sc, sunscpal_icr) &
231 SUNSCPAL_ICR_REQUEST) == 0) {
232 timo = 0; /* return 0 */
233 break;
234 }
235 if (--timo < 0)
236 break; /* return -1 */
237 delay(2);
238 }
239 return timo;
240 }
241
242 /*
243 * These functions control DMA functions in the chipset independent of
244 * the host DMA implementation.
245 */
246 static void sunscpal_dma_start(struct sunscpal_softc *);
247 static void sunscpal_dma_poll(struct sunscpal_softc *);
248 static void sunscpal_dma_stop(struct sunscpal_softc *);
249
250 static void
251 sunscpal_dma_start(struct sunscpal_softc *sc)
252 {
253 struct sunscpal_req *sr = sc->sc_current;
254 int xlen;
255 uint16_t icr;
256
257 xlen = sc->sc_reqlen;
258
259 /* Let'er rip! */
260 icr = SUNSCPAL_READ_2(sc, sunscpal_icr);
261 icr |= SUNSCPAL_ICR_DMA_ENABLE |
262 ((xlen & 1) ? 0 : SUNSCPAL_ICR_WORD_MODE) |
263 ((sr->sr_flags & SR_IMMED) ? 0 : SUNSCPAL_ICR_INTERRUPT_ENABLE);
264 SUNSCPAL_WRITE_2(sc, sunscpal_icr, icr);
265
266 sc->sc_state |= SUNSCPAL_DOINGDMA;
267
268 #ifdef SUNSCPAL_DEBUG
269 if (sunscpal_debug & SUNSCPAL_DBG_DMA) {
270 printf("%s: started, flags=0x%x\n",
271 __func__, sc->sc_state);
272 }
273 #endif
274 }
275
276 #define ICR_MASK (SUNSCPAL_ICR_PARITY_ERROR | SUNSCPAL_ICR_BUS_ERROR | SUNSCPAL_ICR_INTERRUPT_REQUEST)
277 #define POLL_TIMO 50000 /* X100 = 5 sec. */
278
279 /*
280 * Poll (spin-wait) for DMA completion.
281 * Called right after xx_dma_start(), and
282 * xx_dma_stop() will be called next.
283 */
284 static void
285 sunscpal_dma_poll(struct sunscpal_softc *sc)
286 {
287 struct sunscpal_req *sr = sc->sc_current;
288 int tmo;
289
290 /* Make sure DMA started successfully. */
291 if (sc->sc_state & SUNSCPAL_ABORTING)
292 return;
293
294 /* Wait for any "DMA complete" or error bits. */
295 tmo = POLL_TIMO;
296 for (;;) {
297 if (SUNSCPAL_READ_2(sc, sunscpal_icr) & ICR_MASK)
298 break;
299 if (--tmo <= 0) {
300 printf("sc: DMA timeout (while polling)\n");
301 /* Indicate timeout as MI code would. */
302 sr->sr_flags |= SR_OVERDUE;
303 break;
304 }
305 delay(100);
306 }
307 SUNSCPAL_TRACE("sunscpal_dma_poll: waited %d\n", POLL_TIMO - tmo);
308
309 #ifdef SUNSCPAL_DEBUG
310 if (sunscpal_debug & SUNSCPAL_DBG_DMA) {
311 char buffer[64];
312 bitmask_snprintf(SUNSCPAL_READ_2(sc, sunscpal_icr),
313 SUNSCPAL_ICR_BITS, buffer, sizeof(buffer));
314 printf("%s: done, icr=%s\n", __func__, buffer);
315 }
316 #endif
317 }
318
319 static void
320 sunscpal_dma_stop(struct sunscpal_softc *sc)
321 {
322 struct sunscpal_req *sr = sc->sc_current;
323 struct scsipi_xfer *xs = sr->sr_xs;
324 int resid, ntrans;
325 uint16_t icr;
326
327 if ((sc->sc_state & SUNSCPAL_DOINGDMA) == 0) {
328 #ifdef DEBUG
329 printf("%s: DMA not running\n", __func__);
330 #endif
331 return;
332 }
333 sc->sc_state &= ~SUNSCPAL_DOINGDMA;
334
335 /* First, halt the DMA engine. */
336 icr = SUNSCPAL_READ_2(sc, sunscpal_icr);
337 icr &= ~(SUNSCPAL_ICR_DMA_ENABLE | SUNSCPAL_ICR_WORD_MODE |
338 SUNSCPAL_ICR_INTERRUPT_ENABLE);
339 SUNSCPAL_WRITE_2(sc, sunscpal_icr, icr);
340
341 #ifdef SUNSCPAL_USE_BUS_DMA
342 /*
343 * XXX - this function is supposed to be independent of
344 * the host's DMA implementation.
345 */
346 {
347 sunscpal_dma_handle_t dh = sr->sr_dma_hand;
348
349 /* sync the DMA map: */
350 bus_dmamap_sync(sc->sunscpal_dmat, dh->dh_dmamap, 0, dh->dh_maplen,
351 ((xs->xs_control & XS_CTL_DATA_OUT) == 0 ?
352 BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE));
353 }
354 #endif /* SUNSCPAL_USE_BUS_DMA */
355
356
357 if (icr & (SUNSCPAL_ICR_BUS_ERROR)) {
358 char buffer[64];
359 bitmask_snprintf(icr, SUNSCPAL_ICR_BITS, buffer,
360 sizeof(buffer));
361 printf("sc: DMA error, icr=%s, reset\n", buffer);
362 sr->sr_xs->error = XS_DRIVER_STUFFUP;
363 sc->sc_state |= SUNSCPAL_ABORTING;
364 goto out;
365 }
366
367 /* Note that timeout may have set the error flag. */
368 if (sc->sc_state & SUNSCPAL_ABORTING)
369 goto out;
370
371 /* XXX: Wait for DMA to actually finish? */
372
373 /*
374 * Now try to figure out how much actually transferred
375 */
376
377 resid = SUNSCPAL_DMA_COUNT_FLIP(SUNSCPAL_READ_2(sc,
378 sunscpal_dma_count));
379 ntrans = sc->sc_reqlen - resid;
380
381 #ifdef SUNSCPAL_DEBUG
382 if (sunscpal_debug & SUNSCPAL_DBG_DMA) {
383 printf("%s: resid=0x%x ntrans=0x%x\n",
384 __func__, resid, ntrans);
385 }
386 #endif
387
388 if (ntrans < sc->sc_min_dma_len) {
389 printf("sc: DMA count: 0x%x\n", resid);
390 sc->sc_state |= SUNSCPAL_ABORTING;
391 goto out;
392 }
393 if (ntrans > sc->sc_datalen)
394 panic("%s: excess transfer", __func__);
395
396 /* Adjust data pointer */
397 sc->sc_dataptr += ntrans;
398 sc->sc_datalen -= ntrans;
399
400 /*
401 * After a read, we may need to clean-up
402 * "Left-over bytes" (yuck!)
403 */
404 if (((xs->xs_control & XS_CTL_DATA_OUT) == 0) &&
405 ((icr & SUNSCPAL_ICR_ODD_LENGTH) != 0)) {
406 #ifdef DEBUG
407 printf("sc: Got Left-over bytes!\n");
408 #endif
409 *(sc->sc_dataptr++) = SUNSCPAL_READ_1(sc, sunscpal_data);
410 sc->sc_datalen--;
411 }
412
413 out:
414 SUNSCPAL_WRITE_2(sc, sunscpal_dma_count, SUNSCPAL_DMA_COUNT_FLIP(0));
415
416 }
417
418 /* Ask the target for a MSG_OUT phase. */
419 static inline void
420 sunscpal_sched_msgout(struct sunscpal_softc *sc, int msg_code)
421 {
422 /*
423 * This controller does not allow you to assert ATN, which
424 * will eventually leave us with no option other than to reset
425 * the bus. We keep this function as a placeholder, though,
426 * and this printf will eventually go away or get #ifdef'ed:
427 */
428 printf("%s: trying to schedule 0x%0x\n", __func__, msg_code);
429 sc->sc_msgpriq |= msg_code;
430 }
431
432 int
433 sunscpal_pio_out(struct sunscpal_softc *sc, int phase, int count, uint8_t *data)
434 {
435 int resid;
436
437 resid = count;
438 while (resid > 0) {
439 if (!SUNSCPAL_BUSY(sc)) {
440 SUNSCPAL_TRACE("pio_out: lost BSY, resid=%d\n", resid);
441 break;
442 }
443 if (sunscpal_wait_req(sc)) {
444 SUNSCPAL_TRACE("pio_out: no REQ, resid=%d\n", resid);
445 break;
446 }
447 if (SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc, sunscpal_icr)) !=
448 phase)
449 break;
450
451 /* Put the data on the bus. */
452 if (data) {
453 SUNSCPAL_BYTE_WRITE(sc, phase, *data++);
454 } else {
455 SUNSCPAL_BYTE_WRITE(sc, phase, 0);
456 }
457
458 --resid;
459 }
460
461 return count - resid;
462 }
463
464
465 int
466 sunscpal_pio_in(struct sunscpal_softc *sc, int phase, int count, uint8_t *data)
467 {
468 int resid;
469
470 resid = count;
471 while (resid > 0) {
472 if (!SUNSCPAL_BUSY(sc)) {
473 SUNSCPAL_TRACE("pio_in: lost BSY, resid=%d\n", resid);
474 break;
475 }
476 if (sunscpal_wait_req(sc)) {
477 SUNSCPAL_TRACE("pio_in: no REQ, resid=%d\n", resid);
478 break;
479 }
480 /* A phase change is not valid until AFTER REQ rises! */
481 if (SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc, sunscpal_icr)) !=
482 phase)
483 break;
484
485 /* Read the data bus. */
486 if (data)
487 *data++ = SUNSCPAL_BYTE_READ(sc, phase);
488 else
489 (void)SUNSCPAL_BYTE_READ(sc, phase);
490
491 --resid;
492 }
493
494 return count - resid;
495 }
496
497
498 void
499 sunscpal_init(struct sunscpal_softc *sc)
500 {
501 int i, j;
502
503 #ifdef SUNSCPAL_DEBUG
504 sunscpal_debug_sc = sc;
505 #endif
506
507 for (i = 0; i < SUNSCPAL_OPENINGS; i++)
508 sc->sc_ring[i].sr_xs = NULL;
509 for (i = 0; i < 8; i++)
510 for (j = 0; j < 8; j++)
511 sc->sc_matrix[i][j] = NULL;
512
513 sc->sc_prevphase = SUNSCPAL_PHASE_INVALID;
514 sc->sc_state = SUNSCPAL_IDLE;
515
516 SUNSCPAL_WRITE_2(sc, sunscpal_icr, 0);
517 SUNSCPAL_WRITE_2(sc, sunscpal_dma_addr_h, 0);
518 SUNSCPAL_WRITE_2(sc, sunscpal_dma_addr_l, 0);
519 SUNSCPAL_WRITE_2(sc, sunscpal_dma_count, SUNSCPAL_DMA_COUNT_FLIP(0));
520
521 SUNSCPAL_CLR_INTR(sc);
522
523 /* Another hack (Er.. hook!) for anything that needs it: */
524 if (sc->sc_intr_on) {
525 SUNSCPAL_TRACE("init: intr ON\n", 0);
526 sc->sc_intr_on(sc);
527 }
528 }
529
530
531 static void
532 sunscpal_reset_scsibus(struct sunscpal_softc *sc)
533 {
534
535 SUNSCPAL_TRACE("reset_scsibus, cur=0x%x\n", (long)sc->sc_current);
536
537 SUNSCPAL_WRITE_2(sc, sunscpal_icr, SUNSCPAL_ICR_RESET);
538 delay(500);
539 SUNSCPAL_WRITE_2(sc, sunscpal_icr, 0);
540
541 SUNSCPAL_CLR_INTR(sc);
542 /* XXX - Need long delay here! */
543 delay(100000);
544
545 /* XXX - Need to cancel disconnected requests. */
546 }
547
548
549 /*
550 * Interrupt handler for the SCSI Bus Controller (SBC)
551 * This may also called for a DMA timeout (at splbio).
552 */
553 int
554 sunscpal_intr(void *arg)
555 {
556 struct sunscpal_softc *sc = arg;
557 int claimed = 0;
558
559 /*
560 * Do not touch SBC regs here unless sc_current == NULL
561 * or it will complain about "register conflict" errors.
562 * Instead, just let sunscpal_machine() deal with it.
563 */
564 SUNSCPAL_TRACE("intr: top, state=%d\n", sc->sc_state);
565
566 if (sc->sc_state == SUNSCPAL_IDLE) {
567 /*
568 * Might be reselect. sunscpal_reselect() will check,
569 * and set up the connection if so. This will verify
570 * that sc_current == NULL at the beginning...
571 */
572
573 /* Another hack (Er.. hook!) for anything that needs it: */
574 if (sc->sc_intr_off) {
575 SUNSCPAL_TRACE("intr: for reselect, intr off\n", 0);
576 sc->sc_intr_off(sc);
577 }
578
579 sunscpal_reselect(sc);
580 }
581
582 /*
583 * The remaining documented interrupt causes are a DMA complete
584 * condition.
585 *
586 * The procedure is to let sunscpal_machine() figure out what
587 * to do next.
588 */
589 if (sc->sc_state & SUNSCPAL_WORKING) {
590 SUNSCPAL_TRACE("intr: call machine, cur=0x%x\n",
591 (long)sc->sc_current);
592 /* This will usually free-up the nexus. */
593 sunscpal_machine(sc);
594 SUNSCPAL_TRACE("intr: machine done, cur=0x%x\n",
595 (long)sc->sc_current);
596 claimed = 1;
597 }
598
599 /* Maybe we can run some commands now... */
600 if (sc->sc_state == SUNSCPAL_IDLE) {
601 SUNSCPAL_TRACE("intr: call sched, cur=0x%x\n",
602 (long)sc->sc_current);
603 sunscpal_sched(sc);
604 SUNSCPAL_TRACE("intr: sched done, cur=0x%x\n",
605 (long)sc->sc_current);
606 }
607
608 return claimed;
609 }
610
611
612 /*
613 * Abort the current command (i.e. due to timeout)
614 */
615 void
616 sunscpal_abort(struct sunscpal_softc *sc)
617 {
618
619 /*
620 * Finish it now. If DMA is in progress, we
621 * can not call sunscpal_sched_msgout() because
622 * that hits the SBC (avoid DMA conflict).
623 */
624
625 /* Another hack (Er.. hook!) for anything that needs it: */
626 if (sc->sc_intr_off) {
627 SUNSCPAL_TRACE("abort: intr off\n", 0);
628 sc->sc_intr_off(sc);
629 }
630
631 sc->sc_state |= SUNSCPAL_ABORTING;
632 if ((sc->sc_state & SUNSCPAL_DOINGDMA) == 0) {
633 sunscpal_sched_msgout(sc, SEND_ABORT);
634 }
635 SUNSCPAL_TRACE("abort: call machine, cur=0x%x\n",
636 (long)sc->sc_current);
637 sunscpal_machine(sc);
638 SUNSCPAL_TRACE("abort: machine done, cur=0x%x\n",
639 (long)sc->sc_current);
640
641 /* Another hack (Er.. hook!) for anything that needs it: */
642 if (sc->sc_intr_on) {
643 SUNSCPAL_TRACE("abort: intr ON\n", 0);
644 sc->sc_intr_on(sc);
645 }
646 }
647
648 /*
649 * Timeout handler, scheduled for each SCSI command.
650 */
651 void
652 sunscpal_cmd_timeout(void *arg)
653 {
654 struct sunscpal_req *sr = arg;
655 struct scsipi_xfer *xs;
656 struct scsipi_periph *periph;
657 struct sunscpal_softc *sc;
658 int s;
659
660 s = splbio();
661
662 /* Get all our variables... */
663 xs = sr->sr_xs;
664 if (xs == NULL) {
665 printf("%s: no scsipi_xfer\n", __func__);
666 goto out;
667 }
668 periph = xs->xs_periph;
669 sc = device_private(periph->periph_channel->chan_adapter->adapt_dev);
670
671 printf("%s: cmd timeout, targ=%d, lun=%d\n",
672 device_xname(sc->sc_dev),
673 sr->sr_target, sr->sr_lun);
674
675 /*
676 * Mark the overdue job as failed, and arrange for
677 * sunscpal_machine to terminate it. If the victim
678 * is the current job, call sunscpal_machine() now.
679 * Otherwise arrange for sunscpal_sched() to do it.
680 */
681 sr->sr_flags |= SR_OVERDUE;
682 if (sc->sc_current == sr) {
683 SUNSCPAL_TRACE("cmd_tmo: call abort, sr=0x%x\n", (long)sr);
684 sunscpal_abort(sc);
685 } else {
686 /*
687 * The driver may be idle, or busy with another job.
688 * Arrange for sunscpal_sched() to do the deed.
689 */
690 SUNSCPAL_TRACE("cmd_tmo: clear matrix, t/l=0x%02x\n",
691 (sr->sr_target << 4) | sr->sr_lun);
692 sc->sc_matrix[sr->sr_target][sr->sr_lun] = NULL;
693 }
694
695 /*
696 * We may have aborted the current job, or may have
697 * already been idle. In either case, we should now
698 * be idle, so try to start another job.
699 */
700 if (sc->sc_state == SUNSCPAL_IDLE) {
701 SUNSCPAL_TRACE("cmd_tmo: call sched, cur=0x%x\n",
702 (long)sc->sc_current);
703 sunscpal_sched(sc);
704 SUNSCPAL_TRACE("cmd_tmo: sched done, cur=0x%x\n",
705 (long)sc->sc_current);
706 }
707
708 out:
709 splx(s);
710 }
711
712
713 /*****************************************************************
714 * Interface to higher level
715 *****************************************************************/
716
717
718 /*
719 * Enter a new SCSI command into the "issue" queue, and
720 * if there is work to do, start it going.
721 *
722 * WARNING: This can be called recursively!
723 * (see comment in sunscpal_done)
724 */
725 void
726 sunscpal_scsipi_request(struct scsipi_channel *chan, scsipi_adapter_req_t req,
727 void *arg)
728 {
729 struct scsipi_xfer *xs;
730 struct scsipi_periph *periph;
731 struct sunscpal_softc *sc;
732 struct sunscpal_req *sr;
733 int s, i, flags;
734
735 sc = device_private(chan->chan_adapter->adapt_dev);
736
737 switch (req) {
738 case ADAPTER_REQ_RUN_XFER:
739 xs = arg;
740 periph = xs->xs_periph;
741 flags = xs->xs_control;
742
743 if (flags & XS_CTL_DATA_UIO)
744 panic("sunscpal: scsi data uio requested");
745
746 s = splbio();
747
748 if (flags & XS_CTL_POLL) {
749 /* Terminate any current command. */
750 sr = sc->sc_current;
751 if (sr != NULL) {
752 printf("%s: polled request aborting %d/%d\n",
753 device_xname(sc->sc_dev), sr->sr_target,
754 sr->sr_lun);
755 sunscpal_abort(sc);
756 }
757 if (sc->sc_state != SUNSCPAL_IDLE) {
758 panic("%s: polled request, abort failed",
759 __func__);
760 }
761 }
762
763 /*
764 * Find lowest empty slot in ring buffer.
765 * XXX: What about "fairness" and cmd order?
766 */
767 for (i = 0; i < SUNSCPAL_OPENINGS; i++)
768 if (sc->sc_ring[i].sr_xs == NULL)
769 goto new;
770
771 xs->error = XS_RESOURCE_SHORTAGE;
772 SUNSCPAL_TRACE("scsipi_cmd: no openings, rv=%d\n", rv);
773 goto out;
774
775 new:
776 /* Create queue entry */
777 sr = &sc->sc_ring[i];
778 sr->sr_xs = xs;
779 sr->sr_target = xs->xs_periph->periph_target;
780 sr->sr_lun = xs->xs_periph->periph_lun;
781 sr->sr_dma_hand = NULL;
782 sr->sr_dataptr = xs->data;
783 sr->sr_datalen = xs->datalen;
784 sr->sr_flags = (flags & XS_CTL_POLL) ? SR_IMMED : 0;
785 sr->sr_status = -1; /* no value */
786 sc->sc_ncmds++;
787
788 SUNSCPAL_TRACE("scsipi_cmd: new sr=0x%x\n", (long)sr);
789
790 if (flags & XS_CTL_POLL) {
791 /* Force this new command to be next. */
792 sc->sc_rr = i;
793 }
794
795 /*
796 * If we were idle, run some commands...
797 */
798 if (sc->sc_state == SUNSCPAL_IDLE) {
799 SUNSCPAL_TRACE("scsipi_cmd: call sched, cur=0x%x\n",
800 (long)sc->sc_current);
801 sunscpal_sched(sc);
802 SUNSCPAL_TRACE("scsipi_cmd: sched done, cur=0x%x\n",
803 (long)sc->sc_current);
804 }
805
806 if (flags & XS_CTL_POLL) {
807 /* Make sure sunscpal_sched() finished it. */
808 if ((xs->xs_status & XS_STS_DONE) == 0)
809 panic("%s: poll didn't finish", __func__);
810 }
811
812 out:
813 splx(s);
814 return;
815
816 case ADAPTER_REQ_GROW_RESOURCES:
817 /* XXX Not supported. */
818 return;
819
820 case ADAPTER_REQ_SET_XFER_MODE:
821 {
822 /*
823 * We don't support Sync, Wide, or Tagged Queueing.
824 * Just callback now, to report this.
825 */
826 struct scsipi_xfer_mode *xm = arg;
827
828 xm->xm_mode = 0;
829 xm->xm_period = 0;
830 xm->xm_offset = 0;
831 scsipi_async_event(chan, ASYNC_EVENT_XFER_MODE, xm);
832 return;
833 }
834 }
835 }
836
837
838 /*
839 * POST PROCESSING OF SCSI_CMD (usually current)
840 * Called by sunscpal_sched(), sunscpal_machine()
841 */
842 static void
843 sunscpal_done(struct sunscpal_softc *sc)
844 {
845 struct sunscpal_req *sr;
846 struct scsipi_xfer *xs;
847
848 #ifdef DIAGNOSTIC
849 if (sc->sc_state == SUNSCPAL_IDLE)
850 panic("%s: state=idle", __func__);
851 if (sc->sc_current == NULL)
852 panic("%s: current=0", __func__);
853 #endif
854
855 sr = sc->sc_current;
856 xs = sr->sr_xs;
857
858 SUNSCPAL_TRACE("done: top, cur=0x%x\n", (long)sc->sc_current);
859
860 /*
861 * Clean up DMA resources for this command.
862 */
863 if (sr->sr_dma_hand) {
864 SUNSCPAL_TRACE("done: dma_free, dh=0x%x\n",
865 (long)sr->sr_dma_hand);
866 sunscpal_dma_free(sc);
867 }
868 #ifdef DIAGNOSTIC
869 if (sr->sr_dma_hand)
870 panic("%s: DMA free did not", __func__);
871 #endif
872
873 if (sc->sc_state & SUNSCPAL_ABORTING) {
874 SUNSCPAL_TRACE("done: aborting, error=%d\n", xs->error);
875 if (xs->error == XS_NOERROR)
876 xs->error = XS_TIMEOUT;
877 }
878
879 SUNSCPAL_TRACE("done: check error=%d\n", (long)xs->error);
880
881 /* If error is already set, ignore sr_status value. */
882 if (xs->error != XS_NOERROR)
883 goto finish;
884
885 SUNSCPAL_TRACE("done: check status=%d\n", sr->sr_status);
886
887 xs->status = sr->sr_status;
888 switch (sr->sr_status) {
889 case SCSI_OK: /* 0 */
890 break;
891
892 case SCSI_CHECK:
893 case SCSI_BUSY:
894 xs->error = XS_BUSY;
895 break;
896
897 case -1:
898 /* This is our "impossible" initial value. */
899 /* fallthrough */
900 default:
901 printf("%s: target %d, bad status=%d\n",
902 device_xname(sc->sc_dev), sr->sr_target, sr->sr_status);
903 xs->error = XS_DRIVER_STUFFUP;
904 break;
905 }
906
907 finish:
908
909 SUNSCPAL_TRACE("done: finish, error=%d\n", xs->error);
910
911 /*
912 * Dequeue the finished command, but don't clear sc_state until
913 * after the call to scsipi_done(), because that may call back to
914 * sunscpal_scsi_cmd() - unwanted recursion!
915 *
916 * Keeping sc->sc_state != idle terminates the recursion.
917 */
918 #ifdef DIAGNOSTIC
919 if ((sc->sc_state & SUNSCPAL_WORKING) == 0)
920 panic("%s: bad state", __func__);
921 #endif
922
923 /* Clear our pointers to the request. */
924 sc->sc_current = NULL;
925 sc->sc_matrix[sr->sr_target][sr->sr_lun] = NULL;
926 callout_stop(&sr->sr_xs->xs_callout);
927
928 /* Make the request free. */
929 sr->sr_xs = NULL;
930 sc->sc_ncmds--;
931
932 /* Tell common SCSI code it is done. */
933 scsipi_done(xs);
934
935 sc->sc_state = SUNSCPAL_IDLE;
936 /* Now sunscpal_sched() may be called again. */
937 }
938
939
940 /*
941 * Schedule a SCSI operation. This routine should return
942 * only after it achieves one of the following conditions:
943 * Busy (sc->sc_state != SUNSCPAL_IDLE)
944 * No more work can be started.
945 */
946 static void
947 sunscpal_sched(struct sunscpal_softc *sc)
948 {
949 struct sunscpal_req *sr;
950 struct scsipi_xfer *xs;
951 int target = 0, lun = 0;
952 int error, i;
953
954 /* Another hack (Er.. hook!) for anything that needs it: */
955 if (sc->sc_intr_off) {
956 SUNSCPAL_TRACE("sched: top, intr off\n", 0);
957 sc->sc_intr_off(sc);
958 }
959
960 next_job:
961 /*
962 * Grab the next job from queue. Must be idle.
963 */
964 #ifdef DIAGNOSTIC
965 if (sc->sc_state != SUNSCPAL_IDLE)
966 panic("%s: not idle", __func__);
967 if (sc->sc_current)
968 panic("%s: current set", __func__);
969 #endif
970
971 /*
972 * Always start the search where we last looked.
973 */
974 i = sc->sc_rr;
975 sr = NULL;
976 do {
977 if (sc->sc_ring[i].sr_xs) {
978 target = sc->sc_ring[i].sr_target;
979 lun = sc->sc_ring[i].sr_lun;
980 if (sc->sc_matrix[target][lun] == NULL) {
981 /*
982 * Do not mark the target/LUN busy yet,
983 * because reselect may cause some other
984 * job to become the current one, so we
985 * might not actually start this job.
986 * Instead, set sc_matrix later on.
987 */
988 sc->sc_rr = i;
989 sr = &sc->sc_ring[i];
990 break;
991 }
992 }
993 i++;
994 if (i == SUNSCPAL_OPENINGS)
995 i = 0;
996 } while (i != sc->sc_rr);
997
998 if (sr == NULL) {
999 SUNSCPAL_TRACE("sched: no work, cur=0x%x\n",
1000 (long)sc->sc_current);
1001
1002 /* Another hack (Er.. hook!) for anything that needs it: */
1003 if (sc->sc_intr_on) {
1004 SUNSCPAL_TRACE("sched: ret, intr ON\n", 0);
1005 sc->sc_intr_on(sc);
1006 }
1007
1008 return; /* No more work to do. */
1009 }
1010
1011 SUNSCPAL_TRACE("sched: select for t/l=0x%02x\n",
1012 (sr->sr_target << 4) | sr->sr_lun);
1013
1014 sc->sc_state = SUNSCPAL_WORKING;
1015 error = sunscpal_select(sc, sr);
1016 if (sc->sc_current) {
1017 /* Lost the race! reselected out from under us! */
1018 /* Work with the reselected job. */
1019 if (sr->sr_flags & SR_IMMED) {
1020 printf("%s: reselected while polling (abort)\n",
1021 device_xname(sc->sc_dev));
1022 /* Abort the reselected job. */
1023 sc->sc_state |= SUNSCPAL_ABORTING;
1024 sc->sc_msgpriq |= SEND_ABORT;
1025 }
1026 sr = sc->sc_current;
1027 xs = sr->sr_xs;
1028 SUNSCPAL_TRACE("sched: reselect, new sr=0x%x\n", (long)sr);
1029 goto have_nexus;
1030 }
1031
1032 /* Normal selection result. Target/LUN is now busy. */
1033 sc->sc_matrix[target][lun] = sr;
1034 sc->sc_current = sr; /* connected */
1035 xs = sr->sr_xs;
1036
1037 /*
1038 * Initialize pointers, etc. for this job
1039 */
1040 sc->sc_dataptr = sr->sr_dataptr;
1041 sc->sc_datalen = sr->sr_datalen;
1042 sc->sc_prevphase = SUNSCPAL_PHASE_INVALID;
1043 sc->sc_msgpriq = SEND_IDENTIFY;
1044 sc->sc_msgoutq = 0;
1045 sc->sc_msgout = 0;
1046
1047 SUNSCPAL_TRACE("sched: select rv=%d\n", error);
1048
1049 switch (error) {
1050 case XS_NOERROR:
1051 break;
1052
1053 case XS_BUSY:
1054 /* XXX - Reset and try again. */
1055 printf("%s: select found SCSI bus busy, resetting...\n",
1056 device_xname(sc->sc_dev));
1057 sunscpal_reset_scsibus(sc);
1058 /* fallthrough */
1059 case XS_SELTIMEOUT:
1060 default:
1061 xs->error = error; /* from select */
1062 SUNSCPAL_TRACE("sched: call done, sr=0x%x\n", (long)sr);
1063 sunscpal_done(sc);
1064
1065 /* Paranoia: clear everything. */
1066 sc->sc_dataptr = NULL;
1067 sc->sc_datalen = 0;
1068 sc->sc_prevphase = SUNSCPAL_PHASE_INVALID;
1069 sc->sc_msgpriq = 0;
1070 sc->sc_msgoutq = 0;
1071 sc->sc_msgout = 0;
1072
1073 goto next_job;
1074 }
1075
1076 /*
1077 * Selection was successful. Normally, this means
1078 * we are starting a new command. However, this
1079 * might be the termination of an overdue job.
1080 */
1081 if (sr->sr_flags & SR_OVERDUE) {
1082 SUNSCPAL_TRACE("sched: overdue, sr=0x%x\n", (long)sr);
1083 sc->sc_state |= SUNSCPAL_ABORTING;
1084 sc->sc_msgpriq |= SEND_ABORT;
1085 goto have_nexus;
1086 }
1087
1088 /*
1089 * OK, we are starting a new command.
1090 * Initialize and allocate resources for the new command.
1091 * Device reset is special (only uses MSG_OUT phase).
1092 * Normal commands start in MSG_OUT phase where we will
1093 * send and IDENDIFY message, and then expect CMD phase.
1094 */
1095 #ifdef SUNSCPAL_DEBUG
1096 if (sunscpal_debug & SUNSCPAL_DBG_CMDS) {
1097 printf("%s: begin, target=%d, LUN=%d\n", __func__,
1098 xs->xs_periph->periph_target, xs->xs_periph->periph_lun);
1099 sunscpal_show_scsi_cmd(xs);
1100 }
1101 #endif
1102 if (xs->xs_control & XS_CTL_RESET) {
1103 SUNSCPAL_TRACE("sched: cmd=reset, sr=0x%x\n", (long)sr);
1104 /* Not an error, so do not set SUNSCPAL_ABORTING */
1105 sc->sc_msgpriq |= SEND_DEV_RESET;
1106 goto have_nexus;
1107 }
1108
1109 #ifdef DIAGNOSTIC
1110 if ((xs->xs_control & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT)) == 0) {
1111 if (sc->sc_dataptr) {
1112 printf("%s: ptr but no data in/out flags?\n",
1113 device_xname(sc->sc_dev));
1114 SUNSCPAL_BREAK();
1115 sc->sc_dataptr = NULL;
1116 }
1117 }
1118 #endif
1119
1120 /* Allocate DMA space (maybe) */
1121 if (sc->sc_dataptr && (sc->sc_flags & SUNSCPAL_DISABLE_DMA) == 0 &&
1122 (sc->sc_datalen >= sc->sc_min_dma_len))
1123 {
1124 SUNSCPAL_TRACE("sched: dma_alloc, len=%d\n", sc->sc_datalen);
1125 sunscpal_dma_alloc(sc);
1126 }
1127
1128 /*
1129 * Initialization hook called just after select,
1130 * at the beginning of COMMAND phase.
1131 * (but AFTER the DMA allocation is done)
1132 *
1133 * We need to set up the DMA engine BEFORE the target puts
1134 * the SCSI bus into any DATA phase.
1135 */
1136 if (sr->sr_dma_hand) {
1137 SUNSCPAL_TRACE("sched: dma_setup, dh=0x%x\n",
1138 (long) sr->sr_dma_hand);
1139 sunscpal_dma_setup(sc);
1140 }
1141
1142 /*
1143 * Schedule a timeout for the job we are starting.
1144 */
1145 if ((sr->sr_flags & SR_IMMED) == 0) {
1146 i = mstohz(xs->timeout);
1147 SUNSCPAL_TRACE("sched: set timeout=%d\n", i);
1148 callout_reset(&sr->sr_xs->xs_callout, i,
1149 sunscpal_cmd_timeout, sr);
1150 }
1151
1152 have_nexus:
1153
1154 SUNSCPAL_TRACE("sched: call machine, cur=0x%x\n",
1155 (long)sc->sc_current);
1156 sunscpal_machine(sc);
1157 SUNSCPAL_TRACE("sched: machine done, cur=0x%x\n",
1158 (long)sc->sc_current);
1159
1160 /*
1161 * What state did sunscpal_machine() leave us in?
1162 * Hopefully it sometimes completes a job...
1163 */
1164 if (sc->sc_state == SUNSCPAL_IDLE)
1165 goto next_job;
1166
1167 return; /* Have work in progress. */
1168 }
1169
1170
1171 /*
1172 * Reselect handler: checks for reselection, and if we are being
1173 * reselected, it sets up sc->sc_current.
1174 *
1175 * We are reselected when:
1176 * SEL is TRUE
1177 * IO is TRUE
1178 * BSY is FALSE
1179 */
1180 void
1181 sunscpal_reselect(struct sunscpal_softc *sc)
1182 {
1183
1184 /*
1185 * This controller does not implement disconnect/reselect, so
1186 * we really don't have anything to do here. We keep this
1187 * function as a placeholder, though.
1188 */
1189 }
1190
1191 /*
1192 * Select target: xs is the transfer that we are selecting for.
1193 * sc->sc_current should be NULL.
1194 *
1195 * Returns:
1196 * sc->sc_current != NULL ==> we were reselected (race!)
1197 * XS_NOERROR ==> selection worked
1198 * XS_BUSY ==> lost arbitration
1199 * XS_SELTIMEOUT ==> no response to selection
1200 */
1201 static int
1202 sunscpal_select(struct sunscpal_softc *sc, struct sunscpal_req *sr)
1203 {
1204 int timo, target_mask;
1205 u_short mode;
1206
1207 /* Check for reselect */
1208 sunscpal_reselect(sc);
1209 if (sc->sc_current) {
1210 SUNSCPAL_TRACE("select: reselect, cur=0x%x\n",
1211 (long)sc->sc_current);
1212 return XS_BUSY; /* reselected */
1213 }
1214
1215 /*
1216 * Select the target.
1217 */
1218 target_mask = (1 << sr->sr_target);
1219 SUNSCPAL_WRITE_1(sc, sunscpal_data, target_mask);
1220 SUNSCPAL_WRITE_2(sc, sunscpal_icr, SUNSCPAL_ICR_SELECT);
1221
1222 /*
1223 * Wait for the target to assert BSY.
1224 * SCSI spec. says wait for 250 mS.
1225 */
1226 for (timo = 25000;;) {
1227 if (SUNSCPAL_READ_2(sc, sunscpal_icr) & SUNSCPAL_ICR_BUSY)
1228 goto success;
1229 if (--timo <= 0)
1230 break;
1231 delay(10);
1232 }
1233
1234 SUNSCPAL_WRITE_1(sc, sunscpal_data, 0);
1235 SUNSCPAL_WRITE_2(sc, sunscpal_icr, 0);
1236
1237 SUNSCPAL_TRACE("select: device down, rc=%d\n", XS_SELTIMEOUT);
1238 return XS_SELTIMEOUT;
1239
1240 success:
1241
1242 /*
1243 * The target is now driving BSY, so we can stop
1244 * driving SEL and the data bus. We do set up
1245 * whether or not this target needs parity.
1246 */
1247 mode = 0;
1248 if ((sc->sc_parity_disable & target_mask) == 0)
1249 mode |= SUNSCPAL_ICR_PARITY_ENABLE;
1250 SUNSCPAL_WRITE_2(sc, sunscpal_icr, mode);
1251
1252 return XS_NOERROR;
1253 }
1254
1255 /*****************************************************************
1256 * Functions to handle each info. transfer phase:
1257 *****************************************************************/
1258
1259 /*
1260 * The message system:
1261 *
1262 * This is a revamped message system that now should easier accommodate
1263 * new messages, if necessary.
1264 *
1265 * Currently we accept these messages:
1266 * IDENTIFY (when reselecting)
1267 * COMMAND COMPLETE # (expect bus free after messages marked #)
1268 * NOOP
1269 * MESSAGE REJECT
1270 * SYNCHRONOUS DATA TRANSFER REQUEST
1271 * SAVE DATA POINTER
1272 * RESTORE POINTERS
1273 * DISCONNECT #
1274 *
1275 * We may send these messages in prioritized order:
1276 * BUS DEVICE RESET # if XS_CTL_RESET & xs->xs_control (or in
1277 * weird sits.)
1278 * MESSAGE PARITY ERROR par. err. during MSGI
1279 * MESSAGE REJECT If we get a message we don't know how to handle
1280 * ABORT # send on errors
1281 * INITIATOR DETECTED ERROR also on errors (SCSI2) (during info xfer)
1282 * IDENTIFY At the start of each transfer
1283 * SYNCHRONOUS DATA TRANSFER REQUEST if appropriate
1284 * NOOP if nothing else fits the bill ...
1285 */
1286
1287 /*
1288 * Precondition:
1289 * The SCSI bus is already in the MSGI phase and there is a message byte
1290 * on the bus, along with an asserted REQ signal.
1291 *
1292 * Our return value determines whether our caller, sunscpal_machine()
1293 * will expect to see another REQ (and possibly phase change).
1294 */
1295 static int
1296 sunscpal_msg_in(struct sunscpal_softc *sc)
1297 {
1298 struct sunscpal_req *sr = sc->sc_current;
1299 struct scsipi_xfer *xs = sr->sr_xs;
1300 int n, phase;
1301 int act_flags;
1302
1303 act_flags = ACT_CONTINUE;
1304
1305 if (sc->sc_prevphase == SUNSCPAL_PHASE_MSG_IN) {
1306 /* This is a continuation of the previous message. */
1307 n = sc->sc_imp - sc->sc_imess;
1308 SUNSCPAL_TRACE("msg_in: continuation, n=%d\n", n);
1309 goto nextbyte;
1310 }
1311
1312 /* This is a new MESSAGE IN phase. Clean up our state. */
1313 sc->sc_state &= ~SUNSCPAL_DROP_MSGIN;
1314
1315 nextmsg:
1316 n = 0;
1317 sc->sc_imp = &sc->sc_imess[n];
1318
1319 nextbyte:
1320 /*
1321 * Read a whole message, but don't ack the last byte. If we reject the
1322 * message, we have to assert ATN during the message transfer phase
1323 * itself.
1324 */
1325 for (;;) {
1326 /*
1327 * Read a message byte.
1328 * First, check BSY, REQ, phase...
1329 */
1330 if (!SUNSCPAL_BUSY(sc)) {
1331 SUNSCPAL_TRACE("msg_in: lost BSY, n=%d\n", n);
1332 /* XXX - Assume the command completed? */
1333 act_flags |= (ACT_DISCONNECT | ACT_CMD_DONE);
1334 return act_flags;
1335 }
1336 if (sunscpal_wait_req(sc)) {
1337 SUNSCPAL_TRACE("msg_in: BSY but no REQ, n=%d\n", n);
1338 /* Just let sunscpal_machine() handle it... */
1339 return act_flags;
1340 }
1341 phase = SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc, sunscpal_icr));
1342 if (phase != SUNSCPAL_PHASE_MSG_IN) {
1343 /*
1344 * Target left MESSAGE IN, probably because it
1345 * a) noticed our ATN signal, or
1346 * b) ran out of messages.
1347 */
1348 return act_flags;
1349 }
1350 /* Still in MESSAGE IN phase, and REQ is asserted. */
1351 if ((SUNSCPAL_READ_2(sc, sunscpal_icr) &
1352 SUNSCPAL_ICR_PARITY_ERROR) != 0) {
1353 sunscpal_sched_msgout(sc, SEND_PARITY_ERROR);
1354 sc->sc_state |= SUNSCPAL_DROP_MSGIN;
1355 }
1356
1357 /* Gather incoming message bytes if needed. */
1358 if ((sc->sc_state & SUNSCPAL_DROP_MSGIN) == 0) {
1359 if (n >= SUNSCPAL_MAX_MSG_LEN) {
1360 sunscpal_sched_msgout(sc, SEND_REJECT);
1361 sc->sc_state |= SUNSCPAL_DROP_MSGIN;
1362 } else {
1363 *sc->sc_imp++ =
1364 SUNSCPAL_READ_1(sc, sunscpal_cmd_stat);
1365 n++;
1366 /*
1367 * This testing is suboptimal, but most
1368 * messages will be of the one byte variety, so
1369 * it should not affect performance
1370 * significantly.
1371 */
1372 if (n == 1 && MSG_IS1BYTE(sc->sc_imess[0]))
1373 goto have_msg;
1374 if (n == 2 && MSG_IS2BYTE(sc->sc_imess[0]))
1375 goto have_msg;
1376 if (n >= 3 && MSG_ISEXTENDED(sc->sc_imess[0]) &&
1377 n == sc->sc_imess[1] + 2)
1378 goto have_msg;
1379 }
1380 }
1381
1382 /*
1383 * If we reach this spot we're either:
1384 * a) in the middle of a multi-byte message, or
1385 * b) dropping bytes.
1386 */
1387
1388 if (act_flags != ACT_CONTINUE)
1389 return act_flags;
1390
1391 /* back to nextbyte */
1392 }
1393
1394 have_msg:
1395 /* We now have a complete message. Parse it. */
1396
1397 switch (sc->sc_imess[0]) {
1398 case MSG_CMDCOMPLETE:
1399 SUNSCPAL_TRACE("msg_in: CMDCOMPLETE\n", 0);
1400 /* Target is about to disconnect. */
1401 act_flags |= (ACT_DISCONNECT | ACT_CMD_DONE);
1402 break;
1403
1404 case MSG_PARITY_ERROR:
1405 SUNSCPAL_TRACE("msg_in: PARITY_ERROR\n", 0);
1406 /* Resend the last message. */
1407 sunscpal_sched_msgout(sc, sc->sc_msgout);
1408 break;
1409
1410 case MSG_MESSAGE_REJECT:
1411 /* The target rejects the last message we sent. */
1412 SUNSCPAL_TRACE("msg_in: got reject for 0x%x\n", sc->sc_msgout);
1413 switch (sc->sc_msgout) {
1414 case SEND_IDENTIFY:
1415 /* Really old target controller? */
1416 /* XXX ... */
1417 break;
1418 case SEND_INIT_DET_ERR:
1419 goto abort;
1420 }
1421 break;
1422
1423 case MSG_NOOP:
1424 SUNSCPAL_TRACE("msg_in: NOOP\n", 0);
1425 break;
1426
1427 case MSG_DISCONNECT:
1428 SUNSCPAL_TRACE("msg_in: DISCONNECT\n", 0);
1429 /* Target is about to disconnect. */
1430 act_flags |= ACT_DISCONNECT;
1431 if ((xs->xs_periph->periph_quirks & PQUIRK_AUTOSAVE) == 0)
1432 break;
1433 /*FALLTHROUGH*/
1434
1435 case MSG_SAVEDATAPOINTER:
1436 SUNSCPAL_TRACE("msg_in: SAVE_PTRS\n", 0);
1437 sr->sr_dataptr = sc->sc_dataptr;
1438 sr->sr_datalen = sc->sc_datalen;
1439 break;
1440
1441 case MSG_RESTOREPOINTERS:
1442 SUNSCPAL_TRACE("msg_in: RESTORE_PTRS\n", 0);
1443 sc->sc_dataptr = sr->sr_dataptr;
1444 sc->sc_datalen = sr->sr_datalen;
1445 break;
1446
1447 case MSG_EXTENDED:
1448 switch (sc->sc_imess[2]) {
1449 case MSG_EXT_SDTR:
1450 case MSG_EXT_WDTR:
1451 /* This controller can not do synchronous mode. */
1452 goto reject;
1453 default:
1454 printf("%s: unrecognized MESSAGE EXTENDED; "
1455 "sending REJECT\n",
1456 device_xname(sc->sc_dev));
1457 SUNSCPAL_BREAK();
1458 goto reject;
1459 }
1460 break;
1461
1462 default:
1463 SUNSCPAL_TRACE("msg_in: eh? imsg=0x%x\n", sc->sc_imess[0]);
1464 printf("%s: unrecognized MESSAGE; sending REJECT\n",
1465 device_xname(sc->sc_dev));
1466 SUNSCPAL_BREAK();
1467 /* FALLTHROUGH */
1468 reject:
1469 sunscpal_sched_msgout(sc, SEND_REJECT);
1470 break;
1471
1472 abort:
1473 sc->sc_state |= SUNSCPAL_ABORTING;
1474 sunscpal_sched_msgout(sc, SEND_ABORT);
1475 break;
1476 }
1477
1478 /* Go get the next message, if any. */
1479 if (act_flags == ACT_CONTINUE)
1480 goto nextmsg;
1481
1482 return act_flags;
1483 }
1484
1485
1486 /*
1487 * The message out (and in) stuff is a bit complicated:
1488 * If the target requests another message (sequence) without
1489 * having changed phase in between it really asks for a
1490 * retransmit, probably due to parity error(s).
1491 * The following messages can be sent:
1492 * IDENTIFY @ These 4 stem from SCSI command activity
1493 * SDTR @
1494 * WDTR @
1495 * DEV_RESET @
1496 * REJECT if MSGI doesn't make sense
1497 * PARITY_ERROR if parity error while in MSGI
1498 * INIT_DET_ERR if parity error while not in MSGI
1499 * ABORT if INIT_DET_ERR rejected
1500 * NOOP if asked for a message and there's nothing to send
1501 *
1502 * Note that we call this one with (sc_current == NULL)
1503 * when sending ABORT for unwanted reselections.
1504 */
1505 static int
1506 sunscpal_msg_out(struct sunscpal_softc *sc)
1507 {
1508 /*
1509 * This controller does not allow you to assert ATN, which
1510 * means we will never get the opportunity to send messages to
1511 * the target (the bus will never enter this MSG_OUT phase).
1512 * This will eventually leave us with no option other than to
1513 * reset the bus. We keep this function as a placeholder,
1514 * though, and this printf will eventually go away or get
1515 * #ifdef'ed:
1516 */
1517 printf("%s: bus is in MSG_OUT phase?\n", __func__);
1518 return ACT_CONTINUE | ACT_RESET_BUS;
1519 }
1520
1521 /*
1522 * Handle command phase.
1523 */
1524 static int
1525 sunscpal_command(struct sunscpal_softc *sc)
1526 {
1527 struct sunscpal_req *sr = sc->sc_current;
1528 struct scsipi_xfer *xs = sr->sr_xs;
1529 int len;
1530
1531 /* Assume command can be sent in one go. */
1532 /* XXX: Do this using DMA, and get a phase change intr? */
1533 len = sunscpal_pio_out(sc, SUNSCPAL_PHASE_COMMAND, xs->cmdlen,
1534 (uint8_t *)xs->cmd);
1535
1536 if (len != xs->cmdlen) {
1537 #ifdef SUNSCPAL_DEBUG
1538 printf("%s: short transfer: wanted %d got %d.\n",
1539 __func__, xs->cmdlen, len);
1540 sunscpal_show_scsi_cmd(xs);
1541 SUNSCPAL_BREAK();
1542 #endif
1543 if (len < 6) {
1544 xs->error = XS_DRIVER_STUFFUP;
1545 sc->sc_state |= SUNSCPAL_ABORTING;
1546 sunscpal_sched_msgout(sc, SEND_ABORT);
1547 }
1548
1549 }
1550
1551 return ACT_CONTINUE;
1552 }
1553
1554
1555 /*
1556 * Handle either data_in or data_out
1557 */
1558 static int
1559 sunscpal_data_xfer(struct sunscpal_softc *sc, int phase)
1560 {
1561 struct sunscpal_req *sr = sc->sc_current;
1562 struct scsipi_xfer *xs = sr->sr_xs;
1563 int expected_phase;
1564 int len;
1565
1566 /*
1567 * When aborting a command, disallow any data phase.
1568 */
1569 if (sc->sc_state & SUNSCPAL_ABORTING) {
1570 printf("%s: aborting, bus phase=%s (reset)\n",
1571 device_xname(sc->sc_dev), phase_names[(phase >> 8) & 7]);
1572 return ACT_RESET_BUS; /* XXX */
1573 }
1574
1575 /* Validate expected phase (data_in or data_out) */
1576 expected_phase = (xs->xs_control & XS_CTL_DATA_OUT) ?
1577 SUNSCPAL_PHASE_DATA_OUT : SUNSCPAL_PHASE_DATA_IN;
1578 if (phase != expected_phase) {
1579 printf("%s: data phase error\n", device_xname(sc->sc_dev));
1580 goto abort;
1581 }
1582
1583 /* Make sure we have some data to move. */
1584 if (sc->sc_datalen <= 0) {
1585 /* Device needs padding. */
1586 if (phase == SUNSCPAL_PHASE_DATA_IN)
1587 sunscpal_pio_in(sc, phase, 4096, NULL);
1588 else
1589 sunscpal_pio_out(sc, phase, 4096, NULL);
1590 /* Make sure that caused a phase change. */
1591 if (SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc, sunscpal_icr)) ==
1592 phase) {
1593 /* More than 4k is just too much! */
1594 printf("%s: too much data padding\n",
1595 device_xname(sc->sc_dev));
1596 goto abort;
1597 }
1598 return ACT_CONTINUE;
1599 }
1600
1601 /*
1602 * Attempt DMA only if dma_alloc gave us a DMA handle AND
1603 * there is enough left to transfer so DMA is worth while.
1604 */
1605 if (sr->sr_dma_hand && (sc->sc_datalen >= sc->sc_min_dma_len)) {
1606 /*
1607 * OK, really start DMA. Note, the MD start function
1608 * is responsible for setting the TCMD register, etc.
1609 * (Acknowledge the phase change there, not here.)
1610 */
1611 SUNSCPAL_TRACE("data_xfer: dma_start, dh=0x%x\n",
1612 (long)sr->sr_dma_hand);
1613 sunscpal_dma_start(sc);
1614 return ACT_WAIT_DMA;
1615 }
1616
1617 /*
1618 * Doing PIO for data transfer. (Possibly "Pseudo DMA")
1619 * XXX: Do PDMA functions need to set tcmd later?
1620 */
1621 SUNSCPAL_TRACE("data_xfer: doing PIO, len=%d\n", sc->sc_datalen);
1622 if (phase == SUNSCPAL_PHASE_DATA_OUT) {
1623 len = sunscpal_pio_out(sc, phase,
1624 sc->sc_datalen, sc->sc_dataptr);
1625 } else {
1626 len = sunscpal_pio_in(sc, phase,
1627 sc->sc_datalen, sc->sc_dataptr);
1628 }
1629 sc->sc_dataptr += len;
1630 sc->sc_datalen -= len;
1631
1632 SUNSCPAL_TRACE("data_xfer: did PIO, resid=%d\n", sc->sc_datalen);
1633 return ACT_CONTINUE;
1634
1635 abort:
1636 sc->sc_state |= SUNSCPAL_ABORTING;
1637 sunscpal_sched_msgout(sc, SEND_ABORT);
1638 return ACT_CONTINUE;
1639 }
1640
1641
1642 static int
1643 sunscpal_status(struct sunscpal_softc *sc)
1644 {
1645 int len;
1646 uint8_t status;
1647 struct sunscpal_req *sr = sc->sc_current;
1648
1649 len = sunscpal_pio_in(sc, SUNSCPAL_PHASE_STATUS, 1, &status);
1650 if (len) {
1651 sr->sr_status = status;
1652 } else {
1653 printf("%s: none?\n", __func__);
1654 }
1655
1656 return ACT_CONTINUE;
1657 }
1658
1659
1660 /*
1661 * This is the big state machine that follows SCSI phase changes.
1662 * This is somewhat like a co-routine. It will do a SCSI command,
1663 * and exit if the command is complete, or if it must wait, i.e.
1664 * for DMA to complete or for reselect to resume the job.
1665 *
1666 * The bus must be selected, and we need to know which command is
1667 * being undertaken.
1668 */
1669 static void
1670 sunscpal_machine(struct sunscpal_softc *sc)
1671 {
1672 struct sunscpal_req *sr;
1673 struct scsipi_xfer *xs;
1674 int act_flags, phase, timo;
1675
1676 #ifdef DIAGNOSTIC
1677 if (sc->sc_state == SUNSCPAL_IDLE)
1678 panic("%s: state=idle", __func__);
1679 if (sc->sc_current == NULL)
1680 panic("%s: no current cmd", __func__);
1681 #endif
1682
1683 sr = sc->sc_current;
1684 xs = sr->sr_xs;
1685 act_flags = ACT_CONTINUE;
1686
1687 /*
1688 * This will be called by sunscpal_intr() when DMA is
1689 * complete. Must stop DMA before touching the PAL or
1690 * there will be "register conflict" errors.
1691 */
1692 if ((sc->sc_state & SUNSCPAL_DOINGDMA) != 0) {
1693 /* Pick-up where where we left off... */
1694 goto dma_done;
1695 }
1696
1697 next_phase:
1698
1699 if (!SUNSCPAL_BUSY(sc)) {
1700 /* Unexpected disconnect */
1701 printf("%s: unexpected disconnect.\n", __func__);
1702 xs->error = XS_DRIVER_STUFFUP;
1703 act_flags |= (ACT_DISCONNECT | ACT_CMD_DONE);
1704 goto do_actions;
1705 }
1706
1707 /*
1708 * Wait for REQ before reading the phase.
1709 * Need to wait longer than usual here, because
1710 * some devices are just plain slow...
1711 */
1712 timo = sunscpal_wait_phase_timo;
1713 for (;;) {
1714 if (SUNSCPAL_READ_2(sc, sunscpal_icr) & SUNSCPAL_ICR_REQUEST)
1715 break;
1716 if (--timo <= 0) {
1717 if (sc->sc_state & SUNSCPAL_ABORTING) {
1718 printf("%s: no REQ while aborting, reset\n",
1719 device_xname(sc->sc_dev));
1720 act_flags |= ACT_RESET_BUS;
1721 goto do_actions;
1722 }
1723 printf("%s: no REQ for next phase, abort\n",
1724 device_xname(sc->sc_dev));
1725 sc->sc_state |= SUNSCPAL_ABORTING;
1726 sunscpal_sched_msgout(sc, SEND_ABORT);
1727 goto next_phase;
1728 }
1729 delay(100);
1730 }
1731
1732 phase = SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc, sunscpal_icr));
1733 SUNSCPAL_TRACE("machine: phase=%s\n",
1734 (long)phase_names[(phase >> 8) & 7]);
1735
1736 /*
1737 * We assume that the device knows what it's doing,
1738 * so any phase is good.
1739 */
1740
1741 switch (phase) {
1742
1743 case SUNSCPAL_PHASE_DATA_OUT:
1744 case SUNSCPAL_PHASE_DATA_IN:
1745 act_flags = sunscpal_data_xfer(sc, phase);
1746 break;
1747
1748 case SUNSCPAL_PHASE_COMMAND:
1749 act_flags = sunscpal_command(sc);
1750 break;
1751
1752 case SUNSCPAL_PHASE_STATUS:
1753 act_flags = sunscpal_status(sc);
1754 break;
1755
1756 case SUNSCPAL_PHASE_MSG_OUT:
1757 act_flags = sunscpal_msg_out(sc);
1758 break;
1759
1760 case SUNSCPAL_PHASE_MSG_IN:
1761 act_flags = sunscpal_msg_in(sc);
1762 break;
1763
1764 default:
1765 printf("%s: Unexpected phase 0x%x\n", __func__, phase);
1766 sc->sc_state |= SUNSCPAL_ABORTING;
1767 sunscpal_sched_msgout(sc, SEND_ABORT);
1768 goto next_phase;
1769
1770 } /* switch */
1771 sc->sc_prevphase = phase;
1772
1773 do_actions:
1774
1775 if (act_flags & ACT_WAIT_DMA) {
1776 act_flags &= ~ACT_WAIT_DMA;
1777 /* Wait for DMA to complete (polling, or interrupt). */
1778 if ((sr->sr_flags & SR_IMMED) == 0) {
1779 SUNSCPAL_TRACE("machine: wait for DMA intr.\n", 0);
1780 return; /* will resume at dma_done */
1781 }
1782 /* Busy-wait for it to finish. */
1783 SUNSCPAL_TRACE("machine: dma_poll, dh=0x%x\n",
1784 (long)sr->sr_dma_hand);
1785 sunscpal_dma_poll(sc);
1786 dma_done:
1787 /* Return here after interrupt. */
1788 if (sr->sr_flags & SR_OVERDUE)
1789 sc->sc_state |= SUNSCPAL_ABORTING;
1790 SUNSCPAL_TRACE("machine: dma_stop, dh=0x%x\n",
1791 (long)sr->sr_dma_hand);
1792 sunscpal_dma_stop(sc);
1793 SUNSCPAL_CLR_INTR(sc); /* XXX */
1794 /*
1795 * While DMA is running we can not touch the SBC,
1796 * so various places just set SUNSCPAL_ABORTING and
1797 * expect us the "kick it" when DMA is done.
1798 */
1799 if (sc->sc_state & SUNSCPAL_ABORTING) {
1800 sunscpal_sched_msgout(sc, SEND_ABORT);
1801 }
1802 }
1803
1804 /*
1805 * Check for parity error.
1806 * XXX - better place to check?
1807 */
1808 if (SUNSCPAL_READ_2(sc, sunscpal_icr) & SUNSCPAL_ICR_PARITY_ERROR) {
1809 printf("%s: parity error!\n", device_xname(sc->sc_dev));
1810 /* XXX: sc->sc_state |= SUNSCPAL_ABORTING; */
1811 sunscpal_sched_msgout(sc, SEND_PARITY_ERROR);
1812 }
1813
1814 if (act_flags == ACT_CONTINUE)
1815 goto next_phase;
1816 /* All other actions "break" from the loop. */
1817
1818 SUNSCPAL_TRACE("machine: act_flags=0x%x\n", act_flags);
1819
1820 if (act_flags & ACT_RESET_BUS) {
1821 act_flags |= ACT_CMD_DONE;
1822 /*
1823 * Reset the SCSI bus, usually due to a timeout.
1824 * The error code XS_TIMEOUT allows retries.
1825 */
1826 sc->sc_state |= SUNSCPAL_ABORTING;
1827 printf("%s: reset SCSI bus for TID=%d LUN=%d\n",
1828 device_xname(sc->sc_dev), sr->sr_target, sr->sr_lun);
1829 sunscpal_reset_scsibus(sc);
1830 }
1831
1832 if (act_flags & ACT_CMD_DONE) {
1833 act_flags |= ACT_DISCONNECT;
1834 /* Need to call scsipi_done() */
1835 /* XXX: from the aic6360 driver, but why? */
1836 if (sc->sc_datalen < 0) {
1837 printf("%s: %d extra bytes from %d:%d\n",
1838 device_xname(sc->sc_dev), -sc->sc_datalen,
1839 sr->sr_target, sr->sr_lun);
1840 sc->sc_datalen = 0;
1841 }
1842 xs->resid = sc->sc_datalen;
1843 /* Note: this will clear sc_current */
1844 SUNSCPAL_TRACE("machine: call done, cur=0x%x\n", (long)sr);
1845 sunscpal_done(sc);
1846 }
1847
1848 if (act_flags & ACT_DISCONNECT) {
1849 /*
1850 * The device has dropped BSY (or will soon).
1851 * We have to wait here for BSY to drop, otherwise
1852 * the next command may decide we need a bus reset.
1853 */
1854 timo = sunscpal_wait_req_timo; /* XXX */
1855 for (;;) {
1856 if (!SUNSCPAL_BUSY(sc))
1857 goto busfree;
1858 if (--timo <= 0)
1859 break;
1860 delay(2);
1861 }
1862 /* Device is sitting on the bus! */
1863 printf("%s: Target %d LUN %d stuck busy, resetting...\n",
1864 device_xname(sc->sc_dev), sr->sr_target, sr->sr_lun);
1865 sunscpal_reset_scsibus(sc);
1866 busfree:
1867 SUNSCPAL_TRACE("machine: discon, waited %d\n",
1868 sunscpal_wait_req_timo - timo);
1869
1870 SUNSCPAL_WRITE_2(sc, sunscpal_icr, 0);
1871
1872 if ((act_flags & ACT_CMD_DONE) == 0) {
1873 SUNSCPAL_TRACE("machine: discon, cur=0x%x\n", (long)sr);
1874 }
1875
1876 /*
1877 * We may be here due to a disconnect message,
1878 * in which case we did NOT call sunscpal_done,
1879 * and we need to clear sc_current.
1880 */
1881 sc->sc_state = SUNSCPAL_IDLE;
1882 sc->sc_current = NULL;
1883
1884 /* Paranoia: clear everything. */
1885 sc->sc_dataptr = NULL;
1886 sc->sc_datalen = 0;
1887 sc->sc_prevphase = SUNSCPAL_PHASE_INVALID;
1888 sc->sc_msgpriq = 0;
1889 sc->sc_msgoutq = 0;
1890 sc->sc_msgout = 0;
1891
1892 /* Our caller will re-enable interrupts. */
1893 }
1894 }
1895
1896
1897 #ifdef SUNSCPAL_DEBUG
1898
1899 static void
1900 sunscpal_show_scsi_cmd(struct scsipi_xfer *xs)
1901 {
1902 uint8_t *b = (uint8_t *)xs->cmd;
1903 int i = 0;
1904
1905 scsipi_printaddr(xs->xs_periph);
1906 if ((xs->xs_control & XS_CTL_RESET) == 0) {
1907 printf("-");
1908 while (i < xs->cmdlen) {
1909 if (i != 0)
1910 printf(",");
1911 printf("%x", b[i++]);
1912 }
1913 printf("-\n");
1914 } else {
1915 printf("-RESET-\n");
1916 }
1917 }
1918
1919
1920 int sunscpal_traceidx = 0;
1921
1922 #define TRACE_MAX 1024
1923 struct trace_ent {
1924 char *msg;
1925 long val;
1926 } sunscpal_tracebuf[TRACE_MAX];
1927
1928 void
1929 sunscpal_trace(char *msg, long val)
1930 {
1931 struct trace_ent *tr;
1932 int s;
1933
1934 s = splbio();
1935
1936 tr = &sunscpal_tracebuf[sunscpal_traceidx];
1937
1938 sunscpal_traceidx++;
1939 if (sunscpal_traceidx >= TRACE_MAX)
1940 sunscpal_traceidx = 0;
1941
1942 tr->msg = msg;
1943 tr->val = val;
1944
1945 splx(s);
1946 }
1947
1948 #ifdef DDB
1949 void
1950 sunscpal_clear_trace(void)
1951 {
1952
1953 sunscpal_traceidx = 0;
1954 memset((void *)sunscpal_tracebuf, 0, sizeof(sunscpal_tracebuf));
1955 }
1956
1957 void
1958 sunscpal_show_trace(void)
1959 {
1960 struct trace_ent *tr;
1961 int idx;
1962
1963 idx = sunscpal_traceidx;
1964 do {
1965 tr = &sunscpal_tracebuf[idx];
1966 idx++;
1967 if (idx >= TRACE_MAX)
1968 idx = 0;
1969 if (tr->msg)
1970 db_printf(tr->msg, tr->val);
1971 } while (idx != sunscpal_traceidx);
1972 }
1973
1974 void
1975 sunscpal_show_req(struct sunscpal_req *sr)
1976 {
1977 struct scsipi_xfer *xs = sr->sr_xs;
1978
1979 db_printf("TID=%d ", sr->sr_target);
1980 db_printf("LUN=%d ", sr->sr_lun);
1981 db_printf("dh=%p ", sr->sr_dma_hand);
1982 db_printf("dptr=%p ", sr->sr_dataptr);
1983 db_printf("dlen=0x%x ", sr->sr_datalen);
1984 db_printf("flags=%d ", sr->sr_flags);
1985 db_printf("stat=%d ", sr->sr_status);
1986
1987 if (xs == NULL) {
1988 db_printf("(xs=NULL)\n");
1989 return;
1990 }
1991 db_printf("\n");
1992 #ifdef SCSIDEBUG
1993 show_scsipi_xs(xs);
1994 #else
1995 db_printf("xs=%p\n", xs);
1996 #endif
1997 }
1998
1999 void
2000 sunscpal_show_state(void)
2001 {
2002 struct sunscpal_softc *sc;
2003 struct sunscpal_req *sr;
2004 int i, j, k;
2005
2006 sc = sunscpal_debug_sc;
2007
2008 if (sc == NULL) {
2009 db_printf("sunscpal_debug_sc == NULL\n");
2010 return;
2011 }
2012
2013 db_printf("sc_ncmds=%d\n", sc->sc_ncmds);
2014 k = -1; /* which is current? */
2015 for (i = 0; i < SUNSCPAL_OPENINGS; i++) {
2016 sr = &sc->sc_ring[i];
2017 if (sr->sr_xs) {
2018 if (sr == sc->sc_current)
2019 k = i;
2020 db_printf("req %d: (sr=%p)", i, sr);
2021 sunscpal_show_req(sr);
2022 }
2023 }
2024 db_printf("sc_rr=%d, current=%d\n", sc->sc_rr, k);
2025
2026 db_printf("Active request matrix:\n");
2027 for(i = 0; i < 8; i++) { /* targets */
2028 for (j = 0; j < 8; j++) { /* LUN */
2029 sr = sc->sc_matrix[i][j];
2030 if (sr) {
2031 db_printf("TID=%d LUN=%d sr=%p\n", i, j, sr);
2032 }
2033 }
2034 }
2035
2036 db_printf("sc_state=0x%x\n", sc->sc_state);
2037 db_printf("sc_current=%p\n", sc->sc_current);
2038 db_printf("sc_dataptr=%p\n", sc->sc_dataptr);
2039 db_printf("sc_datalen=0x%x\n", sc->sc_datalen);
2040
2041 db_printf("sc_prevphase=%d\n", sc->sc_prevphase);
2042 db_printf("sc_msgpriq=0x%x\n", sc->sc_msgpriq);
2043 }
2044 #endif /* DDB */
2045 #endif /* SUNSCPAL_DEBUG */
2046
2047 void
2048 sunscpal_attach(struct sunscpal_softc *sc, int options)
2049 {
2050
2051 /*
2052 * Handle our options.
2053 */
2054 aprint_normal(": options=0x%x\n", options);
2055 sc->sc_parity_disable = (options & SUNSCPAL_OPT_NO_PARITY_CHK);
2056 if (options & SUNSCPAL_OPT_DISABLE_DMA)
2057 sc->sc_flags |= SUNSCPAL_DISABLE_DMA;
2058
2059 /*
2060 * Fill in the adapter.
2061 */
2062 memset(&sc->sc_adapter, 0, sizeof(sc->sc_adapter));
2063 sc->sc_adapter.adapt_dev = sc->sc_dev;
2064 sc->sc_adapter.adapt_nchannels = 1;
2065 sc->sc_adapter.adapt_openings = SUNSCPAL_OPENINGS;
2066 sc->sc_adapter.adapt_max_periph = 1;
2067 sc->sc_adapter.adapt_request = sunscpal_scsipi_request;
2068 sc->sc_adapter.adapt_minphys = sunscpal_minphys;
2069 if (options & SUNSCPAL_OPT_FORCE_POLLING)
2070 sc->sc_adapter.adapt_flags |= SCSIPI_ADAPT_POLL_ONLY;
2071
2072 sc->sc_channel.chan_adapter = &sc->sc_adapter;
2073 sc->sc_channel.chan_bustype = &scsi_bustype;
2074 sc->sc_channel.chan_channel = 0;
2075 sc->sc_channel.chan_ntargets = 8;
2076 sc->sc_channel.chan_nluns = 8;
2077 sc->sc_channel.chan_id = 7;
2078
2079 /*
2080 * Add reference to adapter so that we drop the reference after
2081 * config_found() to make sure the adatper is disabled.
2082 */
2083 if (scsipi_adapter_addref(&sc->sc_adapter) != 0) {
2084 aprint_error_dev(sc->sc_dev, "unable to enable controller\n");
2085 return;
2086 }
2087
2088 sunscpal_init(sc); /* Init chip and driver */
2089 sunscpal_reset_scsibus(sc);
2090
2091 /*
2092 * Ask the adapter what subunits are present
2093 */
2094 (void)config_found(sc->sc_dev, &sc->sc_channel, scsiprint);
2095 scsipi_adapter_delref(&sc->sc_adapter);
2096 }
2097
2098 int
2099 sunscpal_detach(struct sunscpal_softc *sc, int flags)
2100 {
2101
2102 return EOPNOTSUPP;
2103 }
2104
2105 static void
2106 sunscpal_minphys(struct buf *bp)
2107 {
2108
2109 if (bp->b_bcount > SUNSCPAL_MAX_DMA_LEN) {
2110 #ifdef SUNSCPAL_DEBUG
2111 if (sunscpal_debug & SUNSCPAL_DBG_DMA) {
2112 printf("%s: len = 0x%lx.\n", __func__, bp->b_bcount);
2113 Debugger();
2114 }
2115 #endif
2116 bp->b_bcount = SUNSCPAL_MAX_DMA_LEN;
2117 }
2118 return minphys(bp);
2119 }
2120
2121 #ifdef SUNSCPAL_USE_BUS_DMA
2122
2123 /*
2124 * Allocate a DMA handle and put it in sr->sr_dma_hand. Prepare
2125 * for DMA transfer.
2126 */
2127 static void
2128 sunscpal_dma_alloc(struct sunscpal_softc *sc)
2129 {
2130 struct sunscpal_req *sr = sc->sc_current;
2131 sunscpal_dma_handle_t dh;
2132 int i, xlen;
2133 u_long addr;
2134
2135 #ifdef DIAGNOSTIC
2136 if (sr->sr_dma_hand != NULL)
2137 panic("%s: already have DMA handle", __func__);
2138 #endif
2139
2140 addr = (u_long)sc->sc_dataptr;
2141 xlen = sc->sc_datalen;
2142
2143 /* If the DMA start addr is misaligned then do PIO */
2144 if ((addr & 1) || (xlen & 1)) {
2145 printf("%s: misaligned.\n", __func__);
2146 return;
2147 }
2148
2149 /* Make sure our caller checked sc_min_dma_len. */
2150 if (xlen < sc->sc_min_dma_len)
2151 panic("%s: xlen=0x%x", __func__, xlen);
2152
2153 /*
2154 * Never attempt single transfers of more than 63k, because
2155 * our count register is only 16 bits.
2156 * This should never happen since already bounded by minphys().
2157 * XXX - Should just segment these...
2158 */
2159 if (xlen > SUNSCPAL_MAX_DMA_LEN) {
2160 printf("%s: excessive xlen=0x%x\n", __func__, xlen);
2161 Debugger();
2162 sc->sc_datalen = xlen = SUNSCPAL_MAX_DMA_LEN;
2163 }
2164
2165 /* Find free DMA handle. Guaranteed to find one since we have
2166 as many DMA handles as the driver has processes. */
2167 for (i = 0; i < SUNSCPAL_OPENINGS; i++) {
2168 if ((sc->sc_dma_handles[i].dh_flags & SUNSCDH_BUSY) == 0)
2169 goto found;
2170 }
2171 panic("%s: no free DMA handles.", device_xname(sc->sc_dev));
2172 found:
2173
2174 dh = &sc->sc_dma_handles[i];
2175 dh->dh_flags = SUNSCDH_BUSY;
2176 dh->dh_mapaddr = (uint8_t *)addr;
2177 dh->dh_maplen = xlen;
2178 dh->dh_dvma = 0;
2179
2180 /* Load the DMA map. */
2181 if (bus_dmamap_load(sc->sunscpal_dmat, dh->dh_dmamap,
2182 dh->dh_mapaddr, dh->dh_maplen, NULL, BUS_DMA_NOWAIT) != 0) {
2183 /* Can't load map */
2184 printf("%s: can't DMA %p/0x%x\n", __func__,
2185 dh->dh_mapaddr, dh->dh_maplen);
2186 dh->dh_flags = 0;
2187 return;
2188 }
2189
2190 /* success */
2191 sr->sr_dma_hand = dh;
2192 }
2193
2194 static void
2195 sunscpal_dma_free(struct sunscpal_softc *sc)
2196 {
2197 struct sunscpal_req *sr = sc->sc_current;
2198 sunscpal_dma_handle_t dh = sr->sr_dma_hand;
2199
2200 #ifdef DIAGNOSTIC
2201 if (dh == NULL)
2202 panic("%s: no DMA handle", __func__);
2203 #endif
2204
2205 if (sc->sc_state & SUNSCPAL_DOINGDMA)
2206 panic("%s: free while in progress", __func__);
2207
2208 if (dh->dh_flags & SUNSCDH_BUSY) {
2209 /* XXX - Should separate allocation and mapping. */
2210 /* Give back the DVMA space. */
2211 bus_dmamap_unload(sc->sunscpal_dmat, dh->dh_dmamap);
2212 dh->dh_flags = 0;
2213 }
2214 sr->sr_dma_hand = NULL;
2215 }
2216
2217 /*
2218 * This function is called during the SELECT phase that
2219 * precedes a COMMAND phase, in case we need to setup the
2220 * DMA engine before the bus enters a DATA phase.
2221 *
2222 * On the sc version, setup the start address and the count.
2223 */
2224 static void
2225 sunscpal_dma_setup(struct sunscpal_softc *sc)
2226 {
2227 struct sunscpal_req *sr = sc->sc_current;
2228 struct scsipi_xfer *xs = sr->sr_xs;
2229 sunscpal_dma_handle_t dh = sr->sr_dma_hand;
2230 long data_pa;
2231 int xlen;
2232
2233 /*
2234 * Get the DVMA mapping for this segment.
2235 * XXX - Should separate allocation and mapin.
2236 */
2237 data_pa = dh->dh_dvma;
2238 data_pa += (sc->sc_dataptr - dh->dh_mapaddr);
2239 if (data_pa & 1)
2240 panic("%s: bad pa=0x%lx", __func__, data_pa);
2241 xlen = sc->sc_datalen;
2242 if (xlen & 1)
2243 panic("%s: bad xlen=0x%x", __func__, xlen);
2244 sc->sc_reqlen = xlen; /* XXX: or less? */
2245
2246 #ifdef SUNSCPAL_DEBUG
2247 if (sunscpal_debug & SUNSCPAL_DBG_DMA) {
2248 printf("%s: dh=%p, pa=0x%lx, xlen=0x%x\n",
2249 __func__, dh, data_pa, xlen);
2250 }
2251 #endif
2252
2253 /* sync the DMA map: */
2254 bus_dmamap_sync(sc->sunscpal_dmat, dh->dh_dmamap, 0, dh->dh_maplen,
2255 ((xs->xs_control & XS_CTL_DATA_OUT) == 0 ?
2256 BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE));
2257
2258 /* Load the start address and the count. */
2259 SUNSCPAL_WRITE_2(sc, sunscpal_dma_addr_h, (data_pa >> 16) & 0xFFFF);
2260 SUNSCPAL_WRITE_2(sc, sunscpal_dma_addr_l, (data_pa >> 0) & 0xFFFF);
2261 SUNSCPAL_WRITE_2(sc, sunscpal_dma_count, SUNSCPAL_DMA_COUNT_FLIP(xlen));
2262 }
2263
2264 #endif /* SUNSCPAL_USE_BUS_DMA */
2265