1 /* $NetBSD: sunscpal.c,v 1.24 2008/12/16 22:35:31 christos Exp $ */
4 * Copyright (c) 2001 Matthew Fredette
5 * Copyright (c) 1995 David Jones, Gordon W. Ross
6 * Copyright (c) 1994 Jarle Greipsland
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
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
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.
37 * This is a machine-independent driver for the Sun "sc"
38 * SCSI Bus Controller (SBC).
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.)
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
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.)
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.
61 * The message in/out code was taken nearly verbatim from
62 * the aic6360 driver by Jarle Greipsland.
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.
73 * Transliteration to bus_space() performed 9/17/98 by
74 * John Ruschmeyer (jruschme@exit109.com) for i386 'nca' driver.
78 #include <sys/cdefs.h>
79 __KERNEL_RCSID(0, "$NetBSD: sunscpal.c,v 1.24 2008/12/16 22:35:31 christos Exp $");
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>
92 #include <dev/scsipi/scsi_all.h>
93 #include <dev/scsipi/scsipi_all.h>
94 #include <dev/scsipi/scsipi_debug.h>
95 #include <dev/scsipi/scsi_message.h>
96 #include <dev/scsipi/scsiconf.h>
99 #include <ddb/db_output.h>
102 #include <dev/ic/sunscpalreg.h>
103 #include <dev/ic/sunscpalvar.h>
105 static void sunscpal_reset_scsibus(struct sunscpal_softc
*);
106 static void sunscpal_sched(struct sunscpal_softc
*);
107 static void sunscpal_done(struct sunscpal_softc
*);
109 static int sunscpal_select(struct sunscpal_softc
*, struct sunscpal_req
*);
110 static void sunscpal_reselect(struct sunscpal_softc
*);
112 static int sunscpal_msg_in(struct sunscpal_softc
*);
113 static int sunscpal_msg_out(struct sunscpal_softc
*);
114 static int sunscpal_data_xfer(struct sunscpal_softc
*, int);
115 static int sunscpal_command(struct sunscpal_softc
*);
116 static int sunscpal_status(struct sunscpal_softc
*);
117 static void sunscpal_machine(struct sunscpal_softc
*);
119 void sunscpal_abort(struct sunscpal_softc
*);
120 void sunscpal_cmd_timeout(void *);
122 * Action flags returned by the info_transfer functions:
123 * (These determine what happens next.)
125 #define ACT_CONTINUE 0x00 /* No flags: expect another phase */
126 #define ACT_DISCONNECT 0x01 /* Target is disconnecting */
127 #define ACT_CMD_DONE 0x02 /* Need to call scsipi_done() */
128 #define ACT_RESET_BUS 0x04 /* Need bus reset (cmd timeout) */
129 #define ACT_WAIT_DMA 0x10 /* Wait for DMA to complete */
131 /*****************************************************************
133 *****************************************************************/
136 /* This is used only in recoverable places. */
138 #define Debugger() printf("Debug: sunscpal.c:%d\n", __LINE__)
142 #ifdef SUNSCPAL_DEBUG
144 #define SUNSCPAL_DBG_BREAK 1
145 #define SUNSCPAL_DBG_CMDS 2
146 #define SUNSCPAL_DBG_DMA 4
147 int sunscpal_debug
= 0;
148 #define SUNSCPAL_BREAK() \
149 do { if (sunscpal_debug & SUNSCPAL_DBG_BREAK) Debugger(); } while (0)
150 static void sunscpal_show_scsi_cmd(struct scsipi_xfer
*);
152 void sunscpal_clear_trace(void);
153 void sunscpal_show_trace(void);
154 void sunscpal_show_req(struct sunscpal_req
*);
155 void sunscpal_show_state(void);
157 #else /* SUNSCPAL_DEBUG */
159 #define SUNSCPAL_BREAK() /* nada */
160 #define sunscpal_show_scsi_cmd(xs) /* nada */
162 #endif /* SUNSCPAL_DEBUG */
176 #ifdef SUNSCPAL_USE_BUS_DMA
177 static void sunscpal_dma_alloc(struct sunscpal_softc
*);
178 static void sunscpal_dma_free(struct sunscpal_softc
*);
179 static void sunscpal_dma_setup(struct sunscpal_softc
*);
181 #define sunscpal_dma_alloc(sc) (*sc->sc_dma_alloc)(sc)
182 #define sunscpal_dma_free(sc) (*sc->sc_dma_free)(sc)
183 #define sunscpal_dma_setup(sc) (*sc->sc_dma_setup)(sc)
185 static void sunscpal_minphys(struct buf
*);
187 /*****************************************************************
188 * Actual chip control
189 *****************************************************************/
192 * XXX: These timeouts might need to be tuned...
195 /* This one is used when waiting for a phase change. (X100uS.) */
196 int sunscpal_wait_phase_timo
= 1000 * 10 * 300; /* 5 min. */
198 /* These are used in the following inline functions. */
199 int sunscpal_wait_req_timo
= 1000 * 50; /* X2 = 100 mS. */
200 int sunscpal_wait_nrq_timo
= 1000 * 25; /* X2 = 50 mS. */
202 static inline int sunscpal_wait_req(struct sunscpal_softc
*);
203 static inline int sunscpal_wait_not_req(struct sunscpal_softc
*);
204 static inline void sunscpal_sched_msgout(struct sunscpal_softc
*, int);
206 /* Return zero on success. */
207 static inline int sunscpal_wait_req(struct sunscpal_softc
*sc
)
209 int timo
= sunscpal_wait_req_timo
;
212 if (SUNSCPAL_READ_2(sc
, sunscpal_icr
) & SUNSCPAL_ICR_REQUEST
) {
213 timo
= 0; /* return 0 */
217 break; /* return -1 */
223 /* Return zero on success. */
224 static inline int sunscpal_wait_not_req(struct sunscpal_softc
*sc
)
226 int timo
= sunscpal_wait_nrq_timo
;
229 if ((SUNSCPAL_READ_2(sc
, sunscpal_icr
) &
230 SUNSCPAL_ICR_REQUEST
) == 0) {
231 timo
= 0; /* return 0 */
235 break; /* return -1 */
242 * These functions control DMA functions in the chipset independent of
243 * the host DMA implementation.
245 static void sunscpal_dma_start(struct sunscpal_softc
*);
246 static void sunscpal_dma_poll(struct sunscpal_softc
*);
247 static void sunscpal_dma_stop(struct sunscpal_softc
*);
250 sunscpal_dma_start(struct sunscpal_softc
*sc
)
252 struct sunscpal_req
*sr
= sc
->sc_current
;
256 xlen
= sc
->sc_reqlen
;
259 icr
= SUNSCPAL_READ_2(sc
, sunscpal_icr
);
260 icr
|= SUNSCPAL_ICR_DMA_ENABLE
|
261 ((xlen
& 1) ? 0 : SUNSCPAL_ICR_WORD_MODE
) |
262 ((sr
->sr_flags
& SR_IMMED
) ? 0 : SUNSCPAL_ICR_INTERRUPT_ENABLE
);
263 SUNSCPAL_WRITE_2(sc
, sunscpal_icr
, icr
);
265 sc
->sc_state
|= SUNSCPAL_DOINGDMA
;
267 #ifdef SUNSCPAL_DEBUG
268 if (sunscpal_debug
& SUNSCPAL_DBG_DMA
) {
269 printf("%s: started, flags=0x%x\n",
270 __func__
, sc
->sc_state
);
275 #define ICR_MASK (SUNSCPAL_ICR_PARITY_ERROR | SUNSCPAL_ICR_BUS_ERROR | SUNSCPAL_ICR_INTERRUPT_REQUEST)
276 #define POLL_TIMO 50000 /* X100 = 5 sec. */
279 * Poll (spin-wait) for DMA completion.
280 * Called right after xx_dma_start(), and
281 * xx_dma_stop() will be called next.
284 sunscpal_dma_poll(struct sunscpal_softc
*sc
)
286 struct sunscpal_req
*sr
= sc
->sc_current
;
289 /* Make sure DMA started successfully. */
290 if (sc
->sc_state
& SUNSCPAL_ABORTING
)
293 /* Wait for any "DMA complete" or error bits. */
296 if (SUNSCPAL_READ_2(sc
, sunscpal_icr
) & ICR_MASK
)
299 printf("sc: DMA timeout (while polling)\n");
300 /* Indicate timeout as MI code would. */
301 sr
->sr_flags
|= SR_OVERDUE
;
306 SUNSCPAL_TRACE("sunscpal_dma_poll: waited %d\n", POLL_TIMO
- tmo
);
308 #ifdef SUNSCPAL_DEBUG
309 if (sunscpal_debug
& SUNSCPAL_DBG_DMA
) {
311 snprintb(buffer
, sizeof(buffer
),
312 SUNSCPAL_READ_2(sc
, sunscpal_icr
), SUNSCPAL_ICR_BITS
);
313 printf("%s: done, icr=%s\n", __func__
, buffer
);
319 sunscpal_dma_stop(struct sunscpal_softc
*sc
)
321 struct sunscpal_req
*sr
= sc
->sc_current
;
322 struct scsipi_xfer
*xs
= sr
->sr_xs
;
326 if ((sc
->sc_state
& SUNSCPAL_DOINGDMA
) == 0) {
328 printf("%s: DMA not running\n", __func__
);
332 sc
->sc_state
&= ~SUNSCPAL_DOINGDMA
;
334 /* First, halt the DMA engine. */
335 icr
= SUNSCPAL_READ_2(sc
, sunscpal_icr
);
336 icr
&= ~(SUNSCPAL_ICR_DMA_ENABLE
| SUNSCPAL_ICR_WORD_MODE
|
337 SUNSCPAL_ICR_INTERRUPT_ENABLE
);
338 SUNSCPAL_WRITE_2(sc
, sunscpal_icr
, icr
);
340 #ifdef SUNSCPAL_USE_BUS_DMA
342 * XXX - this function is supposed to be independent of
343 * the host's DMA implementation.
346 sunscpal_dma_handle_t dh
= sr
->sr_dma_hand
;
348 /* sync the DMA map: */
349 bus_dmamap_sync(sc
->sunscpal_dmat
, dh
->dh_dmamap
, 0, dh
->dh_maplen
,
350 ((xs
->xs_control
& XS_CTL_DATA_OUT
) == 0 ?
351 BUS_DMASYNC_POSTREAD
: BUS_DMASYNC_POSTWRITE
));
353 #endif /* SUNSCPAL_USE_BUS_DMA */
356 if (icr
& (SUNSCPAL_ICR_BUS_ERROR
)) {
358 snprintb(buffer
, sizeof(buffer
), SUNSCPAL_ICR_BITS
, icr
);
359 printf("sc: DMA error, icr=%s, reset\n", buffer
);
360 sr
->sr_xs
->error
= XS_DRIVER_STUFFUP
;
361 sc
->sc_state
|= SUNSCPAL_ABORTING
;
365 /* Note that timeout may have set the error flag. */
366 if (sc
->sc_state
& SUNSCPAL_ABORTING
)
369 /* XXX: Wait for DMA to actually finish? */
372 * Now try to figure out how much actually transferred
375 resid
= SUNSCPAL_DMA_COUNT_FLIP(SUNSCPAL_READ_2(sc
,
376 sunscpal_dma_count
));
377 ntrans
= sc
->sc_reqlen
- resid
;
379 #ifdef SUNSCPAL_DEBUG
380 if (sunscpal_debug
& SUNSCPAL_DBG_DMA
) {
381 printf("%s: resid=0x%x ntrans=0x%x\n",
382 __func__
, resid
, ntrans
);
386 if (ntrans
< sc
->sc_min_dma_len
) {
387 printf("sc: DMA count: 0x%x\n", resid
);
388 sc
->sc_state
|= SUNSCPAL_ABORTING
;
391 if (ntrans
> sc
->sc_datalen
)
392 panic("%s: excess transfer", __func__
);
394 /* Adjust data pointer */
395 sc
->sc_dataptr
+= ntrans
;
396 sc
->sc_datalen
-= ntrans
;
399 * After a read, we may need to clean-up
400 * "Left-over bytes" (yuck!)
402 if (((xs
->xs_control
& XS_CTL_DATA_OUT
) == 0) &&
403 ((icr
& SUNSCPAL_ICR_ODD_LENGTH
) != 0)) {
405 printf("sc: Got Left-over bytes!\n");
407 *(sc
->sc_dataptr
++) = SUNSCPAL_READ_1(sc
, sunscpal_data
);
412 SUNSCPAL_WRITE_2(sc
, sunscpal_dma_count
, SUNSCPAL_DMA_COUNT_FLIP(0));
416 /* Ask the target for a MSG_OUT phase. */
418 sunscpal_sched_msgout(struct sunscpal_softc
*sc
, int msg_code
)
421 * This controller does not allow you to assert ATN, which
422 * will eventually leave us with no option other than to reset
423 * the bus. We keep this function as a placeholder, though,
424 * and this printf will eventually go away or get #ifdef'ed:
426 printf("%s: trying to schedule 0x%0x\n", __func__
, msg_code
);
427 sc
->sc_msgpriq
|= msg_code
;
431 sunscpal_pio_out(struct sunscpal_softc
*sc
, int phase
, int count
, uint8_t *data
)
437 if (!SUNSCPAL_BUSY(sc
)) {
438 SUNSCPAL_TRACE("pio_out: lost BSY, resid=%d\n", resid
);
441 if (sunscpal_wait_req(sc
)) {
442 SUNSCPAL_TRACE("pio_out: no REQ, resid=%d\n", resid
);
445 if (SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc
, sunscpal_icr
)) !=
449 /* Put the data on the bus. */
451 SUNSCPAL_BYTE_WRITE(sc
, phase
, *data
++);
453 SUNSCPAL_BYTE_WRITE(sc
, phase
, 0);
459 return count
- resid
;
464 sunscpal_pio_in(struct sunscpal_softc
*sc
, int phase
, int count
, uint8_t *data
)
470 if (!SUNSCPAL_BUSY(sc
)) {
471 SUNSCPAL_TRACE("pio_in: lost BSY, resid=%d\n", resid
);
474 if (sunscpal_wait_req(sc
)) {
475 SUNSCPAL_TRACE("pio_in: no REQ, resid=%d\n", resid
);
478 /* A phase change is not valid until AFTER REQ rises! */
479 if (SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc
, sunscpal_icr
)) !=
483 /* Read the data bus. */
485 *data
++ = SUNSCPAL_BYTE_READ(sc
, phase
);
487 (void)SUNSCPAL_BYTE_READ(sc
, phase
);
492 return count
- resid
;
497 sunscpal_init(struct sunscpal_softc
*sc
)
501 #ifdef SUNSCPAL_DEBUG
502 sunscpal_debug_sc
= sc
;
505 for (i
= 0; i
< SUNSCPAL_OPENINGS
; i
++)
506 sc
->sc_ring
[i
].sr_xs
= NULL
;
507 for (i
= 0; i
< 8; i
++)
508 for (j
= 0; j
< 8; j
++)
509 sc
->sc_matrix
[i
][j
] = NULL
;
511 sc
->sc_prevphase
= SUNSCPAL_PHASE_INVALID
;
512 sc
->sc_state
= SUNSCPAL_IDLE
;
514 SUNSCPAL_WRITE_2(sc
, sunscpal_icr
, 0);
515 SUNSCPAL_WRITE_2(sc
, sunscpal_dma_addr_h
, 0);
516 SUNSCPAL_WRITE_2(sc
, sunscpal_dma_addr_l
, 0);
517 SUNSCPAL_WRITE_2(sc
, sunscpal_dma_count
, SUNSCPAL_DMA_COUNT_FLIP(0));
519 SUNSCPAL_CLR_INTR(sc
);
521 /* Another hack (Er.. hook!) for anything that needs it: */
522 if (sc
->sc_intr_on
) {
523 SUNSCPAL_TRACE("init: intr ON\n", 0);
530 sunscpal_reset_scsibus(struct sunscpal_softc
*sc
)
533 SUNSCPAL_TRACE("reset_scsibus, cur=0x%x\n", (long)sc
->sc_current
);
535 SUNSCPAL_WRITE_2(sc
, sunscpal_icr
, SUNSCPAL_ICR_RESET
);
537 SUNSCPAL_WRITE_2(sc
, sunscpal_icr
, 0);
539 SUNSCPAL_CLR_INTR(sc
);
540 /* XXX - Need long delay here! */
543 /* XXX - Need to cancel disconnected requests. */
548 * Interrupt handler for the SCSI Bus Controller (SBC)
549 * This may also called for a DMA timeout (at splbio).
552 sunscpal_intr(void *arg
)
554 struct sunscpal_softc
*sc
= arg
;
558 * Do not touch SBC regs here unless sc_current == NULL
559 * or it will complain about "register conflict" errors.
560 * Instead, just let sunscpal_machine() deal with it.
562 SUNSCPAL_TRACE("intr: top, state=%d\n", sc
->sc_state
);
564 if (sc
->sc_state
== SUNSCPAL_IDLE
) {
566 * Might be reselect. sunscpal_reselect() will check,
567 * and set up the connection if so. This will verify
568 * that sc_current == NULL at the beginning...
571 /* Another hack (Er.. hook!) for anything that needs it: */
572 if (sc
->sc_intr_off
) {
573 SUNSCPAL_TRACE("intr: for reselect, intr off\n", 0);
577 sunscpal_reselect(sc
);
581 * The remaining documented interrupt causes are a DMA complete
584 * The procedure is to let sunscpal_machine() figure out what
587 if (sc
->sc_state
& SUNSCPAL_WORKING
) {
588 SUNSCPAL_TRACE("intr: call machine, cur=0x%x\n",
589 (long)sc
->sc_current
);
590 /* This will usually free-up the nexus. */
591 sunscpal_machine(sc
);
592 SUNSCPAL_TRACE("intr: machine done, cur=0x%x\n",
593 (long)sc
->sc_current
);
597 /* Maybe we can run some commands now... */
598 if (sc
->sc_state
== SUNSCPAL_IDLE
) {
599 SUNSCPAL_TRACE("intr: call sched, cur=0x%x\n",
600 (long)sc
->sc_current
);
602 SUNSCPAL_TRACE("intr: sched done, cur=0x%x\n",
603 (long)sc
->sc_current
);
611 * Abort the current command (i.e. due to timeout)
614 sunscpal_abort(struct sunscpal_softc
*sc
)
618 * Finish it now. If DMA is in progress, we
619 * can not call sunscpal_sched_msgout() because
620 * that hits the SBC (avoid DMA conflict).
623 /* Another hack (Er.. hook!) for anything that needs it: */
624 if (sc
->sc_intr_off
) {
625 SUNSCPAL_TRACE("abort: intr off\n", 0);
629 sc
->sc_state
|= SUNSCPAL_ABORTING
;
630 if ((sc
->sc_state
& SUNSCPAL_DOINGDMA
) == 0) {
631 sunscpal_sched_msgout(sc
, SEND_ABORT
);
633 SUNSCPAL_TRACE("abort: call machine, cur=0x%x\n",
634 (long)sc
->sc_current
);
635 sunscpal_machine(sc
);
636 SUNSCPAL_TRACE("abort: machine done, cur=0x%x\n",
637 (long)sc
->sc_current
);
639 /* Another hack (Er.. hook!) for anything that needs it: */
640 if (sc
->sc_intr_on
) {
641 SUNSCPAL_TRACE("abort: intr ON\n", 0);
647 * Timeout handler, scheduled for each SCSI command.
650 sunscpal_cmd_timeout(void *arg
)
652 struct sunscpal_req
*sr
= arg
;
653 struct scsipi_xfer
*xs
;
654 struct scsipi_periph
*periph
;
655 struct sunscpal_softc
*sc
;
660 /* Get all our variables... */
663 printf("%s: no scsipi_xfer\n", __func__
);
666 periph
= xs
->xs_periph
;
667 sc
= device_private(periph
->periph_channel
->chan_adapter
->adapt_dev
);
669 printf("%s: cmd timeout, targ=%d, lun=%d\n",
670 device_xname(sc
->sc_dev
),
671 sr
->sr_target
, sr
->sr_lun
);
674 * Mark the overdue job as failed, and arrange for
675 * sunscpal_machine to terminate it. If the victim
676 * is the current job, call sunscpal_machine() now.
677 * Otherwise arrange for sunscpal_sched() to do it.
679 sr
->sr_flags
|= SR_OVERDUE
;
680 if (sc
->sc_current
== sr
) {
681 SUNSCPAL_TRACE("cmd_tmo: call abort, sr=0x%x\n", (long)sr
);
685 * The driver may be idle, or busy with another job.
686 * Arrange for sunscpal_sched() to do the deed.
688 SUNSCPAL_TRACE("cmd_tmo: clear matrix, t/l=0x%02x\n",
689 (sr
->sr_target
<< 4) | sr
->sr_lun
);
690 sc
->sc_matrix
[sr
->sr_target
][sr
->sr_lun
] = NULL
;
694 * We may have aborted the current job, or may have
695 * already been idle. In either case, we should now
696 * be idle, so try to start another job.
698 if (sc
->sc_state
== SUNSCPAL_IDLE
) {
699 SUNSCPAL_TRACE("cmd_tmo: call sched, cur=0x%x\n",
700 (long)sc
->sc_current
);
702 SUNSCPAL_TRACE("cmd_tmo: sched done, cur=0x%x\n",
703 (long)sc
->sc_current
);
711 /*****************************************************************
712 * Interface to higher level
713 *****************************************************************/
717 * Enter a new SCSI command into the "issue" queue, and
718 * if there is work to do, start it going.
720 * WARNING: This can be called recursively!
721 * (see comment in sunscpal_done)
724 sunscpal_scsipi_request(struct scsipi_channel
*chan
, scsipi_adapter_req_t req
,
727 struct scsipi_xfer
*xs
;
728 struct scsipi_periph
*periph
;
729 struct sunscpal_softc
*sc
;
730 struct sunscpal_req
*sr
;
733 sc
= device_private(chan
->chan_adapter
->adapt_dev
);
736 case ADAPTER_REQ_RUN_XFER
:
738 periph
= xs
->xs_periph
;
739 flags
= xs
->xs_control
;
741 if (flags
& XS_CTL_DATA_UIO
)
742 panic("sunscpal: scsi data uio requested");
746 if (flags
& XS_CTL_POLL
) {
747 /* Terminate any current command. */
750 printf("%s: polled request aborting %d/%d\n",
751 device_xname(sc
->sc_dev
), sr
->sr_target
,
755 if (sc
->sc_state
!= SUNSCPAL_IDLE
) {
756 panic("%s: polled request, abort failed",
762 * Find lowest empty slot in ring buffer.
763 * XXX: What about "fairness" and cmd order?
765 for (i
= 0; i
< SUNSCPAL_OPENINGS
; i
++)
766 if (sc
->sc_ring
[i
].sr_xs
== NULL
)
769 xs
->error
= XS_RESOURCE_SHORTAGE
;
770 SUNSCPAL_TRACE("scsipi_cmd: no openings, rv=%d\n", rv
);
774 /* Create queue entry */
775 sr
= &sc
->sc_ring
[i
];
777 sr
->sr_target
= xs
->xs_periph
->periph_target
;
778 sr
->sr_lun
= xs
->xs_periph
->periph_lun
;
779 sr
->sr_dma_hand
= NULL
;
780 sr
->sr_dataptr
= xs
->data
;
781 sr
->sr_datalen
= xs
->datalen
;
782 sr
->sr_flags
= (flags
& XS_CTL_POLL
) ? SR_IMMED
: 0;
783 sr
->sr_status
= -1; /* no value */
786 SUNSCPAL_TRACE("scsipi_cmd: new sr=0x%x\n", (long)sr
);
788 if (flags
& XS_CTL_POLL
) {
789 /* Force this new command to be next. */
794 * If we were idle, run some commands...
796 if (sc
->sc_state
== SUNSCPAL_IDLE
) {
797 SUNSCPAL_TRACE("scsipi_cmd: call sched, cur=0x%x\n",
798 (long)sc
->sc_current
);
800 SUNSCPAL_TRACE("scsipi_cmd: sched done, cur=0x%x\n",
801 (long)sc
->sc_current
);
804 if (flags
& XS_CTL_POLL
) {
805 /* Make sure sunscpal_sched() finished it. */
806 if ((xs
->xs_status
& XS_STS_DONE
) == 0)
807 panic("%s: poll didn't finish", __func__
);
814 case ADAPTER_REQ_GROW_RESOURCES
:
815 /* XXX Not supported. */
818 case ADAPTER_REQ_SET_XFER_MODE
:
821 * We don't support Sync, Wide, or Tagged Queueing.
822 * Just callback now, to report this.
824 struct scsipi_xfer_mode
*xm
= arg
;
829 scsipi_async_event(chan
, ASYNC_EVENT_XFER_MODE
, xm
);
837 * POST PROCESSING OF SCSI_CMD (usually current)
838 * Called by sunscpal_sched(), sunscpal_machine()
841 sunscpal_done(struct sunscpal_softc
*sc
)
843 struct sunscpal_req
*sr
;
844 struct scsipi_xfer
*xs
;
847 if (sc
->sc_state
== SUNSCPAL_IDLE
)
848 panic("%s: state=idle", __func__
);
849 if (sc
->sc_current
== NULL
)
850 panic("%s: current=0", __func__
);
856 SUNSCPAL_TRACE("done: top, cur=0x%x\n", (long)sc
->sc_current
);
859 * Clean up DMA resources for this command.
861 if (sr
->sr_dma_hand
) {
862 SUNSCPAL_TRACE("done: dma_free, dh=0x%x\n",
863 (long)sr
->sr_dma_hand
);
864 sunscpal_dma_free(sc
);
868 panic("%s: DMA free did not", __func__
);
871 if (sc
->sc_state
& SUNSCPAL_ABORTING
) {
872 SUNSCPAL_TRACE("done: aborting, error=%d\n", xs
->error
);
873 if (xs
->error
== XS_NOERROR
)
874 xs
->error
= XS_TIMEOUT
;
877 SUNSCPAL_TRACE("done: check error=%d\n", (long)xs
->error
);
879 /* If error is already set, ignore sr_status value. */
880 if (xs
->error
!= XS_NOERROR
)
883 SUNSCPAL_TRACE("done: check status=%d\n", sr
->sr_status
);
885 xs
->status
= sr
->sr_status
;
886 switch (sr
->sr_status
) {
887 case SCSI_OK
: /* 0 */
896 /* This is our "impossible" initial value. */
899 printf("%s: target %d, bad status=%d\n",
900 device_xname(sc
->sc_dev
), sr
->sr_target
, sr
->sr_status
);
901 xs
->error
= XS_DRIVER_STUFFUP
;
907 SUNSCPAL_TRACE("done: finish, error=%d\n", xs
->error
);
910 * Dequeue the finished command, but don't clear sc_state until
911 * after the call to scsipi_done(), because that may call back to
912 * sunscpal_scsi_cmd() - unwanted recursion!
914 * Keeping sc->sc_state != idle terminates the recursion.
917 if ((sc
->sc_state
& SUNSCPAL_WORKING
) == 0)
918 panic("%s: bad state", __func__
);
921 /* Clear our pointers to the request. */
922 sc
->sc_current
= NULL
;
923 sc
->sc_matrix
[sr
->sr_target
][sr
->sr_lun
] = NULL
;
924 callout_stop(&sr
->sr_xs
->xs_callout
);
926 /* Make the request free. */
930 /* Tell common SCSI code it is done. */
933 sc
->sc_state
= SUNSCPAL_IDLE
;
934 /* Now sunscpal_sched() may be called again. */
939 * Schedule a SCSI operation. This routine should return
940 * only after it achieves one of the following conditions:
941 * Busy (sc->sc_state != SUNSCPAL_IDLE)
942 * No more work can be started.
945 sunscpal_sched(struct sunscpal_softc
*sc
)
947 struct sunscpal_req
*sr
;
948 struct scsipi_xfer
*xs
;
949 int target
= 0, lun
= 0;
952 /* Another hack (Er.. hook!) for anything that needs it: */
953 if (sc
->sc_intr_off
) {
954 SUNSCPAL_TRACE("sched: top, intr off\n", 0);
960 * Grab the next job from queue. Must be idle.
963 if (sc
->sc_state
!= SUNSCPAL_IDLE
)
964 panic("%s: not idle", __func__
);
966 panic("%s: current set", __func__
);
970 * Always start the search where we last looked.
975 if (sc
->sc_ring
[i
].sr_xs
) {
976 target
= sc
->sc_ring
[i
].sr_target
;
977 lun
= sc
->sc_ring
[i
].sr_lun
;
978 if (sc
->sc_matrix
[target
][lun
] == NULL
) {
980 * Do not mark the target/LUN busy yet,
981 * because reselect may cause some other
982 * job to become the current one, so we
983 * might not actually start this job.
984 * Instead, set sc_matrix later on.
987 sr
= &sc
->sc_ring
[i
];
992 if (i
== SUNSCPAL_OPENINGS
)
994 } while (i
!= sc
->sc_rr
);
997 SUNSCPAL_TRACE("sched: no work, cur=0x%x\n",
998 (long)sc
->sc_current
);
1000 /* Another hack (Er.. hook!) for anything that needs it: */
1001 if (sc
->sc_intr_on
) {
1002 SUNSCPAL_TRACE("sched: ret, intr ON\n", 0);
1006 return; /* No more work to do. */
1009 SUNSCPAL_TRACE("sched: select for t/l=0x%02x\n",
1010 (sr
->sr_target
<< 4) | sr
->sr_lun
);
1012 sc
->sc_state
= SUNSCPAL_WORKING
;
1013 error
= sunscpal_select(sc
, sr
);
1014 if (sc
->sc_current
) {
1015 /* Lost the race! reselected out from under us! */
1016 /* Work with the reselected job. */
1017 if (sr
->sr_flags
& SR_IMMED
) {
1018 printf("%s: reselected while polling (abort)\n",
1019 device_xname(sc
->sc_dev
));
1020 /* Abort the reselected job. */
1021 sc
->sc_state
|= SUNSCPAL_ABORTING
;
1022 sc
->sc_msgpriq
|= SEND_ABORT
;
1024 sr
= sc
->sc_current
;
1026 SUNSCPAL_TRACE("sched: reselect, new sr=0x%x\n", (long)sr
);
1030 /* Normal selection result. Target/LUN is now busy. */
1031 sc
->sc_matrix
[target
][lun
] = sr
;
1032 sc
->sc_current
= sr
; /* connected */
1036 * Initialize pointers, etc. for this job
1038 sc
->sc_dataptr
= sr
->sr_dataptr
;
1039 sc
->sc_datalen
= sr
->sr_datalen
;
1040 sc
->sc_prevphase
= SUNSCPAL_PHASE_INVALID
;
1041 sc
->sc_msgpriq
= SEND_IDENTIFY
;
1045 SUNSCPAL_TRACE("sched: select rv=%d\n", error
);
1052 /* XXX - Reset and try again. */
1053 printf("%s: select found SCSI bus busy, resetting...\n",
1054 device_xname(sc
->sc_dev
));
1055 sunscpal_reset_scsibus(sc
);
1059 xs
->error
= error
; /* from select */
1060 SUNSCPAL_TRACE("sched: call done, sr=0x%x\n", (long)sr
);
1063 /* Paranoia: clear everything. */
1064 sc
->sc_dataptr
= NULL
;
1066 sc
->sc_prevphase
= SUNSCPAL_PHASE_INVALID
;
1075 * Selection was successful. Normally, this means
1076 * we are starting a new command. However, this
1077 * might be the termination of an overdue job.
1079 if (sr
->sr_flags
& SR_OVERDUE
) {
1080 SUNSCPAL_TRACE("sched: overdue, sr=0x%x\n", (long)sr
);
1081 sc
->sc_state
|= SUNSCPAL_ABORTING
;
1082 sc
->sc_msgpriq
|= SEND_ABORT
;
1087 * OK, we are starting a new command.
1088 * Initialize and allocate resources for the new command.
1089 * Device reset is special (only uses MSG_OUT phase).
1090 * Normal commands start in MSG_OUT phase where we will
1091 * send and IDENDIFY message, and then expect CMD phase.
1093 #ifdef SUNSCPAL_DEBUG
1094 if (sunscpal_debug
& SUNSCPAL_DBG_CMDS
) {
1095 printf("%s: begin, target=%d, LUN=%d\n", __func__
,
1096 xs
->xs_periph
->periph_target
, xs
->xs_periph
->periph_lun
);
1097 sunscpal_show_scsi_cmd(xs
);
1100 if (xs
->xs_control
& XS_CTL_RESET
) {
1101 SUNSCPAL_TRACE("sched: cmd=reset, sr=0x%x\n", (long)sr
);
1102 /* Not an error, so do not set SUNSCPAL_ABORTING */
1103 sc
->sc_msgpriq
|= SEND_DEV_RESET
;
1108 if ((xs
->xs_control
& (XS_CTL_DATA_IN
| XS_CTL_DATA_OUT
)) == 0) {
1109 if (sc
->sc_dataptr
) {
1110 printf("%s: ptr but no data in/out flags?\n",
1111 device_xname(sc
->sc_dev
));
1113 sc
->sc_dataptr
= NULL
;
1118 /* Allocate DMA space (maybe) */
1119 if (sc
->sc_dataptr
&& (sc
->sc_flags
& SUNSCPAL_DISABLE_DMA
) == 0 &&
1120 (sc
->sc_datalen
>= sc
->sc_min_dma_len
))
1122 SUNSCPAL_TRACE("sched: dma_alloc, len=%d\n", sc
->sc_datalen
);
1123 sunscpal_dma_alloc(sc
);
1127 * Initialization hook called just after select,
1128 * at the beginning of COMMAND phase.
1129 * (but AFTER the DMA allocation is done)
1131 * We need to set up the DMA engine BEFORE the target puts
1132 * the SCSI bus into any DATA phase.
1134 if (sr
->sr_dma_hand
) {
1135 SUNSCPAL_TRACE("sched: dma_setup, dh=0x%x\n",
1136 (long) sr
->sr_dma_hand
);
1137 sunscpal_dma_setup(sc
);
1141 * Schedule a timeout for the job we are starting.
1143 if ((sr
->sr_flags
& SR_IMMED
) == 0) {
1144 i
= mstohz(xs
->timeout
);
1145 SUNSCPAL_TRACE("sched: set timeout=%d\n", i
);
1146 callout_reset(&sr
->sr_xs
->xs_callout
, i
,
1147 sunscpal_cmd_timeout
, sr
);
1152 SUNSCPAL_TRACE("sched: call machine, cur=0x%x\n",
1153 (long)sc
->sc_current
);
1154 sunscpal_machine(sc
);
1155 SUNSCPAL_TRACE("sched: machine done, cur=0x%x\n",
1156 (long)sc
->sc_current
);
1159 * What state did sunscpal_machine() leave us in?
1160 * Hopefully it sometimes completes a job...
1162 if (sc
->sc_state
== SUNSCPAL_IDLE
)
1165 return; /* Have work in progress. */
1170 * Reselect handler: checks for reselection, and if we are being
1171 * reselected, it sets up sc->sc_current.
1173 * We are reselected when:
1179 sunscpal_reselect(struct sunscpal_softc
*sc
)
1183 * This controller does not implement disconnect/reselect, so
1184 * we really don't have anything to do here. We keep this
1185 * function as a placeholder, though.
1190 * Select target: xs is the transfer that we are selecting for.
1191 * sc->sc_current should be NULL.
1194 * sc->sc_current != NULL ==> we were reselected (race!)
1195 * XS_NOERROR ==> selection worked
1196 * XS_BUSY ==> lost arbitration
1197 * XS_SELTIMEOUT ==> no response to selection
1200 sunscpal_select(struct sunscpal_softc
*sc
, struct sunscpal_req
*sr
)
1202 int timo
, target_mask
;
1205 /* Check for reselect */
1206 sunscpal_reselect(sc
);
1207 if (sc
->sc_current
) {
1208 SUNSCPAL_TRACE("select: reselect, cur=0x%x\n",
1209 (long)sc
->sc_current
);
1210 return XS_BUSY
; /* reselected */
1214 * Select the target.
1216 target_mask
= (1 << sr
->sr_target
);
1217 SUNSCPAL_WRITE_1(sc
, sunscpal_data
, target_mask
);
1218 SUNSCPAL_WRITE_2(sc
, sunscpal_icr
, SUNSCPAL_ICR_SELECT
);
1221 * Wait for the target to assert BSY.
1222 * SCSI spec. says wait for 250 mS.
1224 for (timo
= 25000;;) {
1225 if (SUNSCPAL_READ_2(sc
, sunscpal_icr
) & SUNSCPAL_ICR_BUSY
)
1232 SUNSCPAL_WRITE_1(sc
, sunscpal_data
, 0);
1233 SUNSCPAL_WRITE_2(sc
, sunscpal_icr
, 0);
1235 SUNSCPAL_TRACE("select: device down, rc=%d\n", XS_SELTIMEOUT
);
1236 return XS_SELTIMEOUT
;
1241 * The target is now driving BSY, so we can stop
1242 * driving SEL and the data bus. We do set up
1243 * whether or not this target needs parity.
1246 if ((sc
->sc_parity_disable
& target_mask
) == 0)
1247 mode
|= SUNSCPAL_ICR_PARITY_ENABLE
;
1248 SUNSCPAL_WRITE_2(sc
, sunscpal_icr
, mode
);
1253 /*****************************************************************
1254 * Functions to handle each info. transfer phase:
1255 *****************************************************************/
1258 * The message system:
1260 * This is a revamped message system that now should easier accommodate
1261 * new messages, if necessary.
1263 * Currently we accept these messages:
1264 * IDENTIFY (when reselecting)
1265 * COMMAND COMPLETE # (expect bus free after messages marked #)
1268 * SYNCHRONOUS DATA TRANSFER REQUEST
1273 * We may send these messages in prioritized order:
1274 * BUS DEVICE RESET # if XS_CTL_RESET & xs->xs_control (or in
1276 * MESSAGE PARITY ERROR par. err. during MSGI
1277 * MESSAGE REJECT If we get a message we don't know how to handle
1278 * ABORT # send on errors
1279 * INITIATOR DETECTED ERROR also on errors (SCSI2) (during info xfer)
1280 * IDENTIFY At the start of each transfer
1281 * SYNCHRONOUS DATA TRANSFER REQUEST if appropriate
1282 * NOOP if nothing else fits the bill ...
1287 * The SCSI bus is already in the MSGI phase and there is a message byte
1288 * on the bus, along with an asserted REQ signal.
1290 * Our return value determines whether our caller, sunscpal_machine()
1291 * will expect to see another REQ (and possibly phase change).
1294 sunscpal_msg_in(struct sunscpal_softc
*sc
)
1296 struct sunscpal_req
*sr
= sc
->sc_current
;
1297 struct scsipi_xfer
*xs
= sr
->sr_xs
;
1301 act_flags
= ACT_CONTINUE
;
1303 if (sc
->sc_prevphase
== SUNSCPAL_PHASE_MSG_IN
) {
1304 /* This is a continuation of the previous message. */
1305 n
= sc
->sc_imp
- sc
->sc_imess
;
1306 SUNSCPAL_TRACE("msg_in: continuation, n=%d\n", n
);
1310 /* This is a new MESSAGE IN phase. Clean up our state. */
1311 sc
->sc_state
&= ~SUNSCPAL_DROP_MSGIN
;
1315 sc
->sc_imp
= &sc
->sc_imess
[n
];
1319 * Read a whole message, but don't ack the last byte. If we reject the
1320 * message, we have to assert ATN during the message transfer phase
1325 * Read a message byte.
1326 * First, check BSY, REQ, phase...
1328 if (!SUNSCPAL_BUSY(sc
)) {
1329 SUNSCPAL_TRACE("msg_in: lost BSY, n=%d\n", n
);
1330 /* XXX - Assume the command completed? */
1331 act_flags
|= (ACT_DISCONNECT
| ACT_CMD_DONE
);
1334 if (sunscpal_wait_req(sc
)) {
1335 SUNSCPAL_TRACE("msg_in: BSY but no REQ, n=%d\n", n
);
1336 /* Just let sunscpal_machine() handle it... */
1339 phase
= SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc
, sunscpal_icr
));
1340 if (phase
!= SUNSCPAL_PHASE_MSG_IN
) {
1342 * Target left MESSAGE IN, probably because it
1343 * a) noticed our ATN signal, or
1344 * b) ran out of messages.
1348 /* Still in MESSAGE IN phase, and REQ is asserted. */
1349 if ((SUNSCPAL_READ_2(sc
, sunscpal_icr
) &
1350 SUNSCPAL_ICR_PARITY_ERROR
) != 0) {
1351 sunscpal_sched_msgout(sc
, SEND_PARITY_ERROR
);
1352 sc
->sc_state
|= SUNSCPAL_DROP_MSGIN
;
1355 /* Gather incoming message bytes if needed. */
1356 if ((sc
->sc_state
& SUNSCPAL_DROP_MSGIN
) == 0) {
1357 if (n
>= SUNSCPAL_MAX_MSG_LEN
) {
1358 sunscpal_sched_msgout(sc
, SEND_REJECT
);
1359 sc
->sc_state
|= SUNSCPAL_DROP_MSGIN
;
1362 SUNSCPAL_READ_1(sc
, sunscpal_cmd_stat
);
1365 * This testing is suboptimal, but most
1366 * messages will be of the one byte variety, so
1367 * it should not affect performance
1370 if (n
== 1 && MSG_IS1BYTE(sc
->sc_imess
[0]))
1372 if (n
== 2 && MSG_IS2BYTE(sc
->sc_imess
[0]))
1374 if (n
>= 3 && MSG_ISEXTENDED(sc
->sc_imess
[0]) &&
1375 n
== sc
->sc_imess
[1] + 2)
1381 * If we reach this spot we're either:
1382 * a) in the middle of a multi-byte message, or
1383 * b) dropping bytes.
1386 if (act_flags
!= ACT_CONTINUE
)
1389 /* back to nextbyte */
1393 /* We now have a complete message. Parse it. */
1395 switch (sc
->sc_imess
[0]) {
1396 case MSG_CMDCOMPLETE
:
1397 SUNSCPAL_TRACE("msg_in: CMDCOMPLETE\n", 0);
1398 /* Target is about to disconnect. */
1399 act_flags
|= (ACT_DISCONNECT
| ACT_CMD_DONE
);
1402 case MSG_PARITY_ERROR
:
1403 SUNSCPAL_TRACE("msg_in: PARITY_ERROR\n", 0);
1404 /* Resend the last message. */
1405 sunscpal_sched_msgout(sc
, sc
->sc_msgout
);
1408 case MSG_MESSAGE_REJECT
:
1409 /* The target rejects the last message we sent. */
1410 SUNSCPAL_TRACE("msg_in: got reject for 0x%x\n", sc
->sc_msgout
);
1411 switch (sc
->sc_msgout
) {
1413 /* Really old target controller? */
1416 case SEND_INIT_DET_ERR
:
1422 SUNSCPAL_TRACE("msg_in: NOOP\n", 0);
1425 case MSG_DISCONNECT
:
1426 SUNSCPAL_TRACE("msg_in: DISCONNECT\n", 0);
1427 /* Target is about to disconnect. */
1428 act_flags
|= ACT_DISCONNECT
;
1429 if ((xs
->xs_periph
->periph_quirks
& PQUIRK_AUTOSAVE
) == 0)
1433 case MSG_SAVEDATAPOINTER
:
1434 SUNSCPAL_TRACE("msg_in: SAVE_PTRS\n", 0);
1435 sr
->sr_dataptr
= sc
->sc_dataptr
;
1436 sr
->sr_datalen
= sc
->sc_datalen
;
1439 case MSG_RESTOREPOINTERS
:
1440 SUNSCPAL_TRACE("msg_in: RESTORE_PTRS\n", 0);
1441 sc
->sc_dataptr
= sr
->sr_dataptr
;
1442 sc
->sc_datalen
= sr
->sr_datalen
;
1446 switch (sc
->sc_imess
[2]) {
1449 /* This controller can not do synchronous mode. */
1452 printf("%s: unrecognized MESSAGE EXTENDED; "
1454 device_xname(sc
->sc_dev
));
1461 SUNSCPAL_TRACE("msg_in: eh? imsg=0x%x\n", sc
->sc_imess
[0]);
1462 printf("%s: unrecognized MESSAGE; sending REJECT\n",
1463 device_xname(sc
->sc_dev
));
1467 sunscpal_sched_msgout(sc
, SEND_REJECT
);
1471 sc
->sc_state
|= SUNSCPAL_ABORTING
;
1472 sunscpal_sched_msgout(sc
, SEND_ABORT
);
1476 /* Go get the next message, if any. */
1477 if (act_flags
== ACT_CONTINUE
)
1485 * The message out (and in) stuff is a bit complicated:
1486 * If the target requests another message (sequence) without
1487 * having changed phase in between it really asks for a
1488 * retransmit, probably due to parity error(s).
1489 * The following messages can be sent:
1490 * IDENTIFY @ These 4 stem from SCSI command activity
1494 * REJECT if MSGI doesn't make sense
1495 * PARITY_ERROR if parity error while in MSGI
1496 * INIT_DET_ERR if parity error while not in MSGI
1497 * ABORT if INIT_DET_ERR rejected
1498 * NOOP if asked for a message and there's nothing to send
1500 * Note that we call this one with (sc_current == NULL)
1501 * when sending ABORT for unwanted reselections.
1504 sunscpal_msg_out(struct sunscpal_softc
*sc
)
1507 * This controller does not allow you to assert ATN, which
1508 * means we will never get the opportunity to send messages to
1509 * the target (the bus will never enter this MSG_OUT phase).
1510 * This will eventually leave us with no option other than to
1511 * reset the bus. We keep this function as a placeholder,
1512 * though, and this printf will eventually go away or get
1515 printf("%s: bus is in MSG_OUT phase?\n", __func__
);
1516 return ACT_CONTINUE
| ACT_RESET_BUS
;
1520 * Handle command phase.
1523 sunscpal_command(struct sunscpal_softc
*sc
)
1525 struct sunscpal_req
*sr
= sc
->sc_current
;
1526 struct scsipi_xfer
*xs
= sr
->sr_xs
;
1529 /* Assume command can be sent in one go. */
1530 /* XXX: Do this using DMA, and get a phase change intr? */
1531 len
= sunscpal_pio_out(sc
, SUNSCPAL_PHASE_COMMAND
, xs
->cmdlen
,
1532 (uint8_t *)xs
->cmd
);
1534 if (len
!= xs
->cmdlen
) {
1535 #ifdef SUNSCPAL_DEBUG
1536 printf("%s: short transfer: wanted %d got %d.\n",
1537 __func__
, xs
->cmdlen
, len
);
1538 sunscpal_show_scsi_cmd(xs
);
1542 xs
->error
= XS_DRIVER_STUFFUP
;
1543 sc
->sc_state
|= SUNSCPAL_ABORTING
;
1544 sunscpal_sched_msgout(sc
, SEND_ABORT
);
1549 return ACT_CONTINUE
;
1554 * Handle either data_in or data_out
1557 sunscpal_data_xfer(struct sunscpal_softc
*sc
, int phase
)
1559 struct sunscpal_req
*sr
= sc
->sc_current
;
1560 struct scsipi_xfer
*xs
= sr
->sr_xs
;
1565 * When aborting a command, disallow any data phase.
1567 if (sc
->sc_state
& SUNSCPAL_ABORTING
) {
1568 printf("%s: aborting, bus phase=%s (reset)\n",
1569 device_xname(sc
->sc_dev
), phase_names
[(phase
>> 8) & 7]);
1570 return ACT_RESET_BUS
; /* XXX */
1573 /* Validate expected phase (data_in or data_out) */
1574 expected_phase
= (xs
->xs_control
& XS_CTL_DATA_OUT
) ?
1575 SUNSCPAL_PHASE_DATA_OUT
: SUNSCPAL_PHASE_DATA_IN
;
1576 if (phase
!= expected_phase
) {
1577 printf("%s: data phase error\n", device_xname(sc
->sc_dev
));
1581 /* Make sure we have some data to move. */
1582 if (sc
->sc_datalen
<= 0) {
1583 /* Device needs padding. */
1584 if (phase
== SUNSCPAL_PHASE_DATA_IN
)
1585 sunscpal_pio_in(sc
, phase
, 4096, NULL
);
1587 sunscpal_pio_out(sc
, phase
, 4096, NULL
);
1588 /* Make sure that caused a phase change. */
1589 if (SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc
, sunscpal_icr
)) ==
1591 /* More than 4k is just too much! */
1592 printf("%s: too much data padding\n",
1593 device_xname(sc
->sc_dev
));
1596 return ACT_CONTINUE
;
1600 * Attempt DMA only if dma_alloc gave us a DMA handle AND
1601 * there is enough left to transfer so DMA is worth while.
1603 if (sr
->sr_dma_hand
&& (sc
->sc_datalen
>= sc
->sc_min_dma_len
)) {
1605 * OK, really start DMA. Note, the MD start function
1606 * is responsible for setting the TCMD register, etc.
1607 * (Acknowledge the phase change there, not here.)
1609 SUNSCPAL_TRACE("data_xfer: dma_start, dh=0x%x\n",
1610 (long)sr
->sr_dma_hand
);
1611 sunscpal_dma_start(sc
);
1612 return ACT_WAIT_DMA
;
1616 * Doing PIO for data transfer. (Possibly "Pseudo DMA")
1617 * XXX: Do PDMA functions need to set tcmd later?
1619 SUNSCPAL_TRACE("data_xfer: doing PIO, len=%d\n", sc
->sc_datalen
);
1620 if (phase
== SUNSCPAL_PHASE_DATA_OUT
) {
1621 len
= sunscpal_pio_out(sc
, phase
,
1622 sc
->sc_datalen
, sc
->sc_dataptr
);
1624 len
= sunscpal_pio_in(sc
, phase
,
1625 sc
->sc_datalen
, sc
->sc_dataptr
);
1627 sc
->sc_dataptr
+= len
;
1628 sc
->sc_datalen
-= len
;
1630 SUNSCPAL_TRACE("data_xfer: did PIO, resid=%d\n", sc
->sc_datalen
);
1631 return ACT_CONTINUE
;
1634 sc
->sc_state
|= SUNSCPAL_ABORTING
;
1635 sunscpal_sched_msgout(sc
, SEND_ABORT
);
1636 return ACT_CONTINUE
;
1641 sunscpal_status(struct sunscpal_softc
*sc
)
1645 struct sunscpal_req
*sr
= sc
->sc_current
;
1647 len
= sunscpal_pio_in(sc
, SUNSCPAL_PHASE_STATUS
, 1, &status
);
1649 sr
->sr_status
= status
;
1651 printf("%s: none?\n", __func__
);
1654 return ACT_CONTINUE
;
1659 * This is the big state machine that follows SCSI phase changes.
1660 * This is somewhat like a co-routine. It will do a SCSI command,
1661 * and exit if the command is complete, or if it must wait, i.e.
1662 * for DMA to complete or for reselect to resume the job.
1664 * The bus must be selected, and we need to know which command is
1668 sunscpal_machine(struct sunscpal_softc
*sc
)
1670 struct sunscpal_req
*sr
;
1671 struct scsipi_xfer
*xs
;
1672 int act_flags
, phase
, timo
;
1675 if (sc
->sc_state
== SUNSCPAL_IDLE
)
1676 panic("%s: state=idle", __func__
);
1677 if (sc
->sc_current
== NULL
)
1678 panic("%s: no current cmd", __func__
);
1681 sr
= sc
->sc_current
;
1683 act_flags
= ACT_CONTINUE
;
1686 * This will be called by sunscpal_intr() when DMA is
1687 * complete. Must stop DMA before touching the PAL or
1688 * there will be "register conflict" errors.
1690 if ((sc
->sc_state
& SUNSCPAL_DOINGDMA
) != 0) {
1691 /* Pick-up where where we left off... */
1697 if (!SUNSCPAL_BUSY(sc
)) {
1698 /* Unexpected disconnect */
1699 printf("%s: unexpected disconnect.\n", __func__
);
1700 xs
->error
= XS_DRIVER_STUFFUP
;
1701 act_flags
|= (ACT_DISCONNECT
| ACT_CMD_DONE
);
1706 * Wait for REQ before reading the phase.
1707 * Need to wait longer than usual here, because
1708 * some devices are just plain slow...
1710 timo
= sunscpal_wait_phase_timo
;
1712 if (SUNSCPAL_READ_2(sc
, sunscpal_icr
) & SUNSCPAL_ICR_REQUEST
)
1715 if (sc
->sc_state
& SUNSCPAL_ABORTING
) {
1716 printf("%s: no REQ while aborting, reset\n",
1717 device_xname(sc
->sc_dev
));
1718 act_flags
|= ACT_RESET_BUS
;
1721 printf("%s: no REQ for next phase, abort\n",
1722 device_xname(sc
->sc_dev
));
1723 sc
->sc_state
|= SUNSCPAL_ABORTING
;
1724 sunscpal_sched_msgout(sc
, SEND_ABORT
);
1730 phase
= SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc
, sunscpal_icr
));
1731 SUNSCPAL_TRACE("machine: phase=%s\n",
1732 (long)phase_names
[(phase
>> 8) & 7]);
1735 * We assume that the device knows what it's doing,
1736 * so any phase is good.
1741 case SUNSCPAL_PHASE_DATA_OUT
:
1742 case SUNSCPAL_PHASE_DATA_IN
:
1743 act_flags
= sunscpal_data_xfer(sc
, phase
);
1746 case SUNSCPAL_PHASE_COMMAND
:
1747 act_flags
= sunscpal_command(sc
);
1750 case SUNSCPAL_PHASE_STATUS
:
1751 act_flags
= sunscpal_status(sc
);
1754 case SUNSCPAL_PHASE_MSG_OUT
:
1755 act_flags
= sunscpal_msg_out(sc
);
1758 case SUNSCPAL_PHASE_MSG_IN
:
1759 act_flags
= sunscpal_msg_in(sc
);
1763 printf("%s: Unexpected phase 0x%x\n", __func__
, phase
);
1764 sc
->sc_state
|= SUNSCPAL_ABORTING
;
1765 sunscpal_sched_msgout(sc
, SEND_ABORT
);
1769 sc
->sc_prevphase
= phase
;
1773 if (act_flags
& ACT_WAIT_DMA
) {
1774 act_flags
&= ~ACT_WAIT_DMA
;
1775 /* Wait for DMA to complete (polling, or interrupt). */
1776 if ((sr
->sr_flags
& SR_IMMED
) == 0) {
1777 SUNSCPAL_TRACE("machine: wait for DMA intr.\n", 0);
1778 return; /* will resume at dma_done */
1780 /* Busy-wait for it to finish. */
1781 SUNSCPAL_TRACE("machine: dma_poll, dh=0x%x\n",
1782 (long)sr
->sr_dma_hand
);
1783 sunscpal_dma_poll(sc
);
1785 /* Return here after interrupt. */
1786 if (sr
->sr_flags
& SR_OVERDUE
)
1787 sc
->sc_state
|= SUNSCPAL_ABORTING
;
1788 SUNSCPAL_TRACE("machine: dma_stop, dh=0x%x\n",
1789 (long)sr
->sr_dma_hand
);
1790 sunscpal_dma_stop(sc
);
1791 SUNSCPAL_CLR_INTR(sc
); /* XXX */
1793 * While DMA is running we can not touch the SBC,
1794 * so various places just set SUNSCPAL_ABORTING and
1795 * expect us the "kick it" when DMA is done.
1797 if (sc
->sc_state
& SUNSCPAL_ABORTING
) {
1798 sunscpal_sched_msgout(sc
, SEND_ABORT
);
1803 * Check for parity error.
1804 * XXX - better place to check?
1806 if (SUNSCPAL_READ_2(sc
, sunscpal_icr
) & SUNSCPAL_ICR_PARITY_ERROR
) {
1807 printf("%s: parity error!\n", device_xname(sc
->sc_dev
));
1808 /* XXX: sc->sc_state |= SUNSCPAL_ABORTING; */
1809 sunscpal_sched_msgout(sc
, SEND_PARITY_ERROR
);
1812 if (act_flags
== ACT_CONTINUE
)
1814 /* All other actions "break" from the loop. */
1816 SUNSCPAL_TRACE("machine: act_flags=0x%x\n", act_flags
);
1818 if (act_flags
& ACT_RESET_BUS
) {
1819 act_flags
|= ACT_CMD_DONE
;
1821 * Reset the SCSI bus, usually due to a timeout.
1822 * The error code XS_TIMEOUT allows retries.
1824 sc
->sc_state
|= SUNSCPAL_ABORTING
;
1825 printf("%s: reset SCSI bus for TID=%d LUN=%d\n",
1826 device_xname(sc
->sc_dev
), sr
->sr_target
, sr
->sr_lun
);
1827 sunscpal_reset_scsibus(sc
);
1830 if (act_flags
& ACT_CMD_DONE
) {
1831 act_flags
|= ACT_DISCONNECT
;
1832 /* Need to call scsipi_done() */
1833 /* XXX: from the aic6360 driver, but why? */
1834 if (sc
->sc_datalen
< 0) {
1835 printf("%s: %d extra bytes from %d:%d\n",
1836 device_xname(sc
->sc_dev
), -sc
->sc_datalen
,
1837 sr
->sr_target
, sr
->sr_lun
);
1840 xs
->resid
= sc
->sc_datalen
;
1841 /* Note: this will clear sc_current */
1842 SUNSCPAL_TRACE("machine: call done, cur=0x%x\n", (long)sr
);
1846 if (act_flags
& ACT_DISCONNECT
) {
1848 * The device has dropped BSY (or will soon).
1849 * We have to wait here for BSY to drop, otherwise
1850 * the next command may decide we need a bus reset.
1852 timo
= sunscpal_wait_req_timo
; /* XXX */
1854 if (!SUNSCPAL_BUSY(sc
))
1860 /* Device is sitting on the bus! */
1861 printf("%s: Target %d LUN %d stuck busy, resetting...\n",
1862 device_xname(sc
->sc_dev
), sr
->sr_target
, sr
->sr_lun
);
1863 sunscpal_reset_scsibus(sc
);
1865 SUNSCPAL_TRACE("machine: discon, waited %d\n",
1866 sunscpal_wait_req_timo
- timo
);
1868 SUNSCPAL_WRITE_2(sc
, sunscpal_icr
, 0);
1870 if ((act_flags
& ACT_CMD_DONE
) == 0) {
1871 SUNSCPAL_TRACE("machine: discon, cur=0x%x\n", (long)sr
);
1875 * We may be here due to a disconnect message,
1876 * in which case we did NOT call sunscpal_done,
1877 * and we need to clear sc_current.
1879 sc
->sc_state
= SUNSCPAL_IDLE
;
1880 sc
->sc_current
= NULL
;
1882 /* Paranoia: clear everything. */
1883 sc
->sc_dataptr
= NULL
;
1885 sc
->sc_prevphase
= SUNSCPAL_PHASE_INVALID
;
1890 /* Our caller will re-enable interrupts. */
1895 #ifdef SUNSCPAL_DEBUG
1898 sunscpal_show_scsi_cmd(struct scsipi_xfer
*xs
)
1900 uint8_t *b
= (uint8_t *)xs
->cmd
;
1903 scsipi_printaddr(xs
->xs_periph
);
1904 if ((xs
->xs_control
& XS_CTL_RESET
) == 0) {
1906 while (i
< xs
->cmdlen
) {
1909 printf("%x", b
[i
++]);
1913 printf("-RESET-\n");
1918 int sunscpal_traceidx
= 0;
1920 #define TRACE_MAX 1024
1924 } sunscpal_tracebuf
[TRACE_MAX
];
1927 sunscpal_trace(char *msg
, long val
)
1929 struct trace_ent
*tr
;
1934 tr
= &sunscpal_tracebuf
[sunscpal_traceidx
];
1936 sunscpal_traceidx
++;
1937 if (sunscpal_traceidx
>= TRACE_MAX
)
1938 sunscpal_traceidx
= 0;
1948 sunscpal_clear_trace(void)
1951 sunscpal_traceidx
= 0;
1952 memset((void *)sunscpal_tracebuf
, 0, sizeof(sunscpal_tracebuf
));
1956 sunscpal_show_trace(void)
1958 struct trace_ent
*tr
;
1961 idx
= sunscpal_traceidx
;
1963 tr
= &sunscpal_tracebuf
[idx
];
1965 if (idx
>= TRACE_MAX
)
1968 db_printf(tr
->msg
, tr
->val
);
1969 } while (idx
!= sunscpal_traceidx
);
1973 sunscpal_show_req(struct sunscpal_req
*sr
)
1975 struct scsipi_xfer
*xs
= sr
->sr_xs
;
1977 db_printf("TID=%d ", sr
->sr_target
);
1978 db_printf("LUN=%d ", sr
->sr_lun
);
1979 db_printf("dh=%p ", sr
->sr_dma_hand
);
1980 db_printf("dptr=%p ", sr
->sr_dataptr
);
1981 db_printf("dlen=0x%x ", sr
->sr_datalen
);
1982 db_printf("flags=%d ", sr
->sr_flags
);
1983 db_printf("stat=%d ", sr
->sr_status
);
1986 db_printf("(xs=NULL)\n");
1993 db_printf("xs=%p\n", xs
);
1998 sunscpal_show_state(void)
2000 struct sunscpal_softc
*sc
;
2001 struct sunscpal_req
*sr
;
2004 sc
= sunscpal_debug_sc
;
2007 db_printf("sunscpal_debug_sc == NULL\n");
2011 db_printf("sc_ncmds=%d\n", sc
->sc_ncmds
);
2012 k
= -1; /* which is current? */
2013 for (i
= 0; i
< SUNSCPAL_OPENINGS
; i
++) {
2014 sr
= &sc
->sc_ring
[i
];
2016 if (sr
== sc
->sc_current
)
2018 db_printf("req %d: (sr=%p)", i
, sr
);
2019 sunscpal_show_req(sr
);
2022 db_printf("sc_rr=%d, current=%d\n", sc
->sc_rr
, k
);
2024 db_printf("Active request matrix:\n");
2025 for(i
= 0; i
< 8; i
++) { /* targets */
2026 for (j
= 0; j
< 8; j
++) { /* LUN */
2027 sr
= sc
->sc_matrix
[i
][j
];
2029 db_printf("TID=%d LUN=%d sr=%p\n", i
, j
, sr
);
2034 db_printf("sc_state=0x%x\n", sc
->sc_state
);
2035 db_printf("sc_current=%p\n", sc
->sc_current
);
2036 db_printf("sc_dataptr=%p\n", sc
->sc_dataptr
);
2037 db_printf("sc_datalen=0x%x\n", sc
->sc_datalen
);
2039 db_printf("sc_prevphase=%d\n", sc
->sc_prevphase
);
2040 db_printf("sc_msgpriq=0x%x\n", sc
->sc_msgpriq
);
2043 #endif /* SUNSCPAL_DEBUG */
2046 sunscpal_attach(struct sunscpal_softc
*sc
, int options
)
2050 * Handle our options.
2052 aprint_normal(": options=0x%x\n", options
);
2053 sc
->sc_parity_disable
= (options
& SUNSCPAL_OPT_NO_PARITY_CHK
);
2054 if (options
& SUNSCPAL_OPT_DISABLE_DMA
)
2055 sc
->sc_flags
|= SUNSCPAL_DISABLE_DMA
;
2058 * Fill in the adapter.
2060 memset(&sc
->sc_adapter
, 0, sizeof(sc
->sc_adapter
));
2061 sc
->sc_adapter
.adapt_dev
= sc
->sc_dev
;
2062 sc
->sc_adapter
.adapt_nchannels
= 1;
2063 sc
->sc_adapter
.adapt_openings
= SUNSCPAL_OPENINGS
;
2064 sc
->sc_adapter
.adapt_max_periph
= 1;
2065 sc
->sc_adapter
.adapt_request
= sunscpal_scsipi_request
;
2066 sc
->sc_adapter
.adapt_minphys
= sunscpal_minphys
;
2067 if (options
& SUNSCPAL_OPT_FORCE_POLLING
)
2068 sc
->sc_adapter
.adapt_flags
|= SCSIPI_ADAPT_POLL_ONLY
;
2070 sc
->sc_channel
.chan_adapter
= &sc
->sc_adapter
;
2071 sc
->sc_channel
.chan_bustype
= &scsi_bustype
;
2072 sc
->sc_channel
.chan_channel
= 0;
2073 sc
->sc_channel
.chan_ntargets
= 8;
2074 sc
->sc_channel
.chan_nluns
= 8;
2075 sc
->sc_channel
.chan_id
= 7;
2078 * Add reference to adapter so that we drop the reference after
2079 * config_found() to make sure the adatper is disabled.
2081 if (scsipi_adapter_addref(&sc
->sc_adapter
) != 0) {
2082 aprint_error_dev(sc
->sc_dev
, "unable to enable controller\n");
2086 sunscpal_init(sc
); /* Init chip and driver */
2087 sunscpal_reset_scsibus(sc
);
2090 * Ask the adapter what subunits are present
2092 (void)config_found(sc
->sc_dev
, &sc
->sc_channel
, scsiprint
);
2093 scsipi_adapter_delref(&sc
->sc_adapter
);
2097 sunscpal_detach(struct sunscpal_softc
*sc
, int flags
)
2104 sunscpal_minphys(struct buf
*bp
)
2107 if (bp
->b_bcount
> SUNSCPAL_MAX_DMA_LEN
) {
2108 #ifdef SUNSCPAL_DEBUG
2109 if (sunscpal_debug
& SUNSCPAL_DBG_DMA
) {
2110 printf("%s: len = 0x%lx.\n", __func__
, bp
->b_bcount
);
2114 bp
->b_bcount
= SUNSCPAL_MAX_DMA_LEN
;
2119 #ifdef SUNSCPAL_USE_BUS_DMA
2122 * Allocate a DMA handle and put it in sr->sr_dma_hand. Prepare
2126 sunscpal_dma_alloc(struct sunscpal_softc
*sc
)
2128 struct sunscpal_req
*sr
= sc
->sc_current
;
2129 sunscpal_dma_handle_t dh
;
2134 if (sr
->sr_dma_hand
!= NULL
)
2135 panic("%s: already have DMA handle", __func__
);
2138 addr
= (u_long
)sc
->sc_dataptr
;
2139 xlen
= sc
->sc_datalen
;
2141 /* If the DMA start addr is misaligned then do PIO */
2142 if ((addr
& 1) || (xlen
& 1)) {
2143 printf("%s: misaligned.\n", __func__
);
2147 /* Make sure our caller checked sc_min_dma_len. */
2148 if (xlen
< sc
->sc_min_dma_len
)
2149 panic("%s: xlen=0x%x", __func__
, xlen
);
2152 * Never attempt single transfers of more than 63k, because
2153 * our count register is only 16 bits.
2154 * This should never happen since already bounded by minphys().
2155 * XXX - Should just segment these...
2157 if (xlen
> SUNSCPAL_MAX_DMA_LEN
) {
2158 printf("%s: excessive xlen=0x%x\n", __func__
, xlen
);
2160 sc
->sc_datalen
= xlen
= SUNSCPAL_MAX_DMA_LEN
;
2163 /* Find free DMA handle. Guaranteed to find one since we have
2164 as many DMA handles as the driver has processes. */
2165 for (i
= 0; i
< SUNSCPAL_OPENINGS
; i
++) {
2166 if ((sc
->sc_dma_handles
[i
].dh_flags
& SUNSCDH_BUSY
) == 0)
2169 panic("%s: no free DMA handles.", device_xname(sc
->sc_dev
));
2172 dh
= &sc
->sc_dma_handles
[i
];
2173 dh
->dh_flags
= SUNSCDH_BUSY
;
2174 dh
->dh_mapaddr
= (uint8_t *)addr
;
2175 dh
->dh_maplen
= xlen
;
2178 /* Load the DMA map. */
2179 if (bus_dmamap_load(sc
->sunscpal_dmat
, dh
->dh_dmamap
,
2180 dh
->dh_mapaddr
, dh
->dh_maplen
, NULL
, BUS_DMA_NOWAIT
) != 0) {
2181 /* Can't load map */
2182 printf("%s: can't DMA %p/0x%x\n", __func__
,
2183 dh
->dh_mapaddr
, dh
->dh_maplen
);
2189 sr
->sr_dma_hand
= dh
;
2193 sunscpal_dma_free(struct sunscpal_softc
*sc
)
2195 struct sunscpal_req
*sr
= sc
->sc_current
;
2196 sunscpal_dma_handle_t dh
= sr
->sr_dma_hand
;
2200 panic("%s: no DMA handle", __func__
);
2203 if (sc
->sc_state
& SUNSCPAL_DOINGDMA
)
2204 panic("%s: free while in progress", __func__
);
2206 if (dh
->dh_flags
& SUNSCDH_BUSY
) {
2207 /* XXX - Should separate allocation and mapping. */
2208 /* Give back the DVMA space. */
2209 bus_dmamap_unload(sc
->sunscpal_dmat
, dh
->dh_dmamap
);
2212 sr
->sr_dma_hand
= NULL
;
2216 * This function is called during the SELECT phase that
2217 * precedes a COMMAND phase, in case we need to setup the
2218 * DMA engine before the bus enters a DATA phase.
2220 * On the sc version, setup the start address and the count.
2223 sunscpal_dma_setup(struct sunscpal_softc
*sc
)
2225 struct sunscpal_req
*sr
= sc
->sc_current
;
2226 struct scsipi_xfer
*xs
= sr
->sr_xs
;
2227 sunscpal_dma_handle_t dh
= sr
->sr_dma_hand
;
2232 * Get the DVMA mapping for this segment.
2233 * XXX - Should separate allocation and mapin.
2235 data_pa
= dh
->dh_dvma
;
2236 data_pa
+= (sc
->sc_dataptr
- dh
->dh_mapaddr
);
2238 panic("%s: bad pa=0x%lx", __func__
, data_pa
);
2239 xlen
= sc
->sc_datalen
;
2241 panic("%s: bad xlen=0x%x", __func__
, xlen
);
2242 sc
->sc_reqlen
= xlen
; /* XXX: or less? */
2244 #ifdef SUNSCPAL_DEBUG
2245 if (sunscpal_debug
& SUNSCPAL_DBG_DMA
) {
2246 printf("%s: dh=%p, pa=0x%lx, xlen=0x%x\n",
2247 __func__
, dh
, data_pa
, xlen
);
2251 /* sync the DMA map: */
2252 bus_dmamap_sync(sc
->sunscpal_dmat
, dh
->dh_dmamap
, 0, dh
->dh_maplen
,
2253 ((xs
->xs_control
& XS_CTL_DATA_OUT
) == 0 ?
2254 BUS_DMASYNC_PREREAD
: BUS_DMASYNC_PREWRITE
));
2256 /* Load the start address and the count. */
2257 SUNSCPAL_WRITE_2(sc
, sunscpal_dma_addr_h
, (data_pa
>> 16) & 0xFFFF);
2258 SUNSCPAL_WRITE_2(sc
, sunscpal_dma_addr_l
, (data_pa
>> 0) & 0xFFFF);
2259 SUNSCPAL_WRITE_2(sc
, sunscpal_dma_count
, SUNSCPAL_DMA_COUNT_FLIP(xlen
));
2262 #endif /* SUNSCPAL_USE_BUS_DMA */