otgsc.c revision 1.1 1 /*
2 * Copyright (c) 1982, 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)csa12gdma.c
34 * $Id: otgsc.c,v 1.1 1994/05/08 05:53:30 chopps Exp $
35 */
36
37 /*
38 * dummy CSA 12 Gauge 5380 DMA driver
39 */
40
41 #include "csa12gscsi.h"
42
43 #if NCSA12GSCSI > 0
44
45 #include <sys/param.h>
46
47 #include <amiga/dev/device.h>
48 #include <amiga/dev/scivar.h>
49 #include <amiga/dev/scireg.h>
50
51 #define QPRINTF
52 #ifdef DEBUG
53 extern int sci_debug;
54 #endif
55 #define HIST(h,w)
56
57 extern int sci_data_wait;
58
59 static int dma_xfer_in __P((struct sci_softc *dev, int len,
60 register u_char *buf, int phase));
61 static int dma_xfer_out __P((struct sci_softc *dev, int len,
62 register u_char *buf, int phase));
63
64 void
65 csa12gdmainit (dev)
66 struct sci_softc *dev;
67 {
68 dev->dma_xfer_in = dma_xfer_in;
69 dev->dma_xfer_out = dma_xfer_out;
70 }
71
72 static int
73 dma_xfer_in (dev, len, buf, phase)
74 struct sci_softc *dev;
75 int len;
76 register u_char *buf;
77 int phase;
78 {
79 int wait = sci_data_wait;
80 u_char csr;
81 u_char *obp = buf;
82 volatile register u_char *sci_dma = dev->sci_data + 0x80;
83 volatile register u_char *sci_csr = dev->sci_csr;
84 volatile register u_char *sci_icmd = dev->sci_icmd;
85
86 QPRINTF(("csa12gdma_in %d, csr=%02x\n", len, *dev->sci_bus_csr));
87
88 *dev->sci_tcmd = phase;
89 *dev->sci_mode |= SCI_MODE_DMA;
90 *dev->sci_icmd = 0;
91 *dev->sci_irecv = 0;
92 while (len > 0) {
93 wait = sci_data_wait;
94 while ((*sci_csr & (SCI_CSR_DREQ|SCI_CSR_PHASE_MATCH)) !=
95 (SCI_CSR_DREQ|SCI_CSR_PHASE_MATCH)) {
96 if (!(*sci_csr & SCI_CSR_PHASE_MATCH)
97 || !(*dev->sci_bus_csr & SCI_BUS_BSY)
98 || --wait < 0) {
99 #ifdef DEBUG
100 if (sci_debug)
101 printf("csa12g_in fail: l%d i%x w%d\n",
102 len, csr, wait);
103 #endif
104 HIST(ixin_wait, wait)
105 *dev->sci_mode &= ~SCI_MODE_DMA;
106 return 0;
107 }
108 }
109
110 *buf++ = *sci_dma;
111 len--;
112 }
113
114 QPRINTF(("csa12gdma_in {%d} %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
115 len, obp[0], obp[1], obp[2], obp[3], obp[4], obp[5],
116 obp[6], obp[7], obp[8], obp[9]));
117
118 /* this leaves with one csr to be read */
119 HIST(ixin_wait, wait)
120 *dev->sci_mode &= ~SCI_MODE_DMA;
121 return 0;
122 }
123
124 static int
125 dma_xfer_out (dev, len, buf, phase)
126 struct sci_softc *dev;
127 int len;
128 register u_char *buf;
129 int phase;
130 {
131 int wait = sci_data_wait;
132 u_char csr;
133 u_char *obp = buf;
134 volatile register u_char *sci_dma = dev->sci_data + 0x80;
135 volatile register u_char *sci_csr = dev->sci_csr;
136 volatile register u_char *sci_icmd = dev->sci_icmd;
137
138 QPRINTF(("csa12gdma_out %d, csr=%02x\n", len, *dev->sci_bus_csr));
139
140 QPRINTF(("csa12gdma_out {%d} %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
141 len, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],
142 buf[6], buf[7], buf[8], buf[9]));
143
144 *dev->sci_tcmd = phase;
145 *dev->sci_mode |= SCI_MODE_DMA;
146 *dev->sci_icmd = SCI_ICMD_DATA;
147 *dev->sci_dma_send = 0;
148 while (len > 0) {
149 wait = sci_data_wait;
150 while ((*sci_csr & (SCI_CSR_DREQ|SCI_CSR_PHASE_MATCH)) !=
151 (SCI_CSR_DREQ|SCI_CSR_PHASE_MATCH)) {
152 if (!(*sci_csr & SCI_CSR_PHASE_MATCH)
153 || !(*dev->sci_bus_csr & SCI_BUS_BSY)
154 || --wait < 0) {
155 #ifdef DEBUG
156 if (sci_debug)
157 printf("csa12gdma_out fail: l%d i%x w%d\n",
158 len, csr, wait);
159 #endif
160 HIST(ixin_wait, wait)
161 *dev->sci_mode &= ~SCI_MODE_DMA;
162 return 0;
163 }
164 }
165
166 *sci_dma = *buf++;
167 len--;
168 }
169
170 wait = sci_data_wait;
171 while ((*sci_csr & (SCI_CSR_DREQ|SCI_CSR_PHASE_MATCH)) ==
172 SCI_CSR_PHASE_MATCH && --wait);
173
174
175 HIST(ixin_wait, wait)
176 *dev->sci_mode &= ~SCI_MODE_DMA;
177 return 0;
178 }
179 #endif
180