mscp_subr.c revision 1.11 1 1.10 ragge /* $NetBSD: mscp_subr.c,v 1.11 1999/05/29 19:11:52 ragge Exp $ */
2 1.1 ragge /*
3 1.1 ragge * Copyright (c) 1996 Ludd, University of Lule}, Sweden.
4 1.1 ragge * Copyright (c) 1988 Regents of the University of California.
5 1.1 ragge * All rights reserved.
6 1.1 ragge *
7 1.1 ragge * This code is derived from software contributed to Berkeley by
8 1.1 ragge * Chris Torek.
9 1.1 ragge *
10 1.1 ragge * Redistribution and use in source and binary forms, with or without
11 1.1 ragge * modification, are permitted provided that the following conditions
12 1.1 ragge * are met:
13 1.1 ragge * 1. Redistributions of source code must retain the above copyright
14 1.1 ragge * notice, this list of conditions and the following disclaimer.
15 1.1 ragge * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 ragge * notice, this list of conditions and the following disclaimer in the
17 1.1 ragge * documentation and/or other materials provided with the distribution.
18 1.1 ragge * 3. All advertising materials mentioning features or use of this software
19 1.1 ragge * must display the following acknowledgement:
20 1.1 ragge * This product includes software developed by the University of
21 1.1 ragge * California, Berkeley and its contributors.
22 1.1 ragge * 4. Neither the name of the University nor the names of its contributors
23 1.1 ragge * may be used to endorse or promote products derived from this software
24 1.1 ragge * without specific prior written permission.
25 1.1 ragge *
26 1.1 ragge * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 1.1 ragge * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 1.1 ragge * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 1.1 ragge * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 1.1 ragge * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 1.1 ragge * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 1.1 ragge * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 1.1 ragge * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 1.1 ragge * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 1.1 ragge * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 1.1 ragge * SUCH DAMAGE.
37 1.1 ragge *
38 1.1 ragge * @(#)mscp.c 7.5 (Berkeley) 12/16/90
39 1.1 ragge */
40 1.1 ragge
41 1.1 ragge /*
42 1.1 ragge * MSCP generic driver routines
43 1.1 ragge */
44 1.1 ragge
45 1.1 ragge #include <sys/param.h>
46 1.2 ragge #include <sys/device.h>
47 1.1 ragge #include <sys/buf.h>
48 1.6 ragge #include <sys/systm.h>
49 1.6 ragge #include <sys/proc.h>
50 1.1 ragge
51 1.1 ragge #include <machine/sid.h>
52 1.1 ragge
53 1.1 ragge #include <vax/mscp/mscp.h>
54 1.1 ragge #include <vax/mscp/mscpreg.h>
55 1.1 ragge #include <vax/mscp/mscpvar.h>
56 1.1 ragge
57 1.1 ragge #include "ra.h"
58 1.2 ragge #include "mt.h"
59 1.1 ragge
60 1.9 ragge #define b_forw b_hash.le_next
61 1.1 ragge
62 1.8 ragge int mscp_match __P((struct device *, struct cfdata *, void *));
63 1.1 ragge void mscp_attach __P((struct device *, struct device *, void *));
64 1.9 ragge void mscp_start __P((struct mscp_softc *));
65 1.1 ragge int mscp_init __P((struct mscp_softc *));
66 1.1 ragge void mscp_initds __P((struct mscp_softc *));
67 1.1 ragge int mscp_waitstep __P((struct mscp_softc *, int, int));
68 1.1 ragge
69 1.1 ragge struct cfattach mscpbus_ca = {
70 1.1 ragge sizeof(struct mscp_softc), mscp_match, mscp_attach
71 1.1 ragge };
72 1.1 ragge
73 1.1 ragge struct mscp slavereply;
74 1.1 ragge
75 1.1 ragge /*
76 1.1 ragge * This function is for delay during init. Some MSCP clone card (Dilog)
77 1.1 ragge * can't handle fast read from its registers, and therefore need
78 1.1 ragge * a delay between them.
79 1.1 ragge */
80 1.1 ragge
81 1.1 ragge #define DELAYTEN 1000
82 1.1 ragge int
83 1.1 ragge mscp_waitstep(mi, mask, result)
84 1.1 ragge struct mscp_softc *mi;
85 1.1 ragge int mask, result;
86 1.1 ragge {
87 1.1 ragge int status = 1;
88 1.1 ragge
89 1.1 ragge if ((*mi->mi_sa & mask) != result) {
90 1.1 ragge volatile int count = 0;
91 1.1 ragge while ((*mi->mi_sa & mask) != result) {
92 1.1 ragge DELAY(10000);
93 1.1 ragge count += 1;
94 1.1 ragge if (count > DELAYTEN)
95 1.1 ragge break;
96 1.1 ragge }
97 1.1 ragge if (count > DELAYTEN)
98 1.1 ragge status = 0;
99 1.1 ragge }
100 1.1 ragge return status;
101 1.1 ragge }
102 1.1 ragge
103 1.1 ragge int
104 1.1 ragge mscp_match(parent, match, aux)
105 1.1 ragge struct device *parent;
106 1.8 ragge struct cfdata *match;
107 1.8 ragge void *aux;
108 1.1 ragge {
109 1.1 ragge struct mscp_attach_args *ma = aux;
110 1.1 ragge
111 1.9 ragge #if NRA || NRX
112 1.1 ragge if (ma->ma_type & MSCPBUS_DISK)
113 1.1 ragge return 1;
114 1.1 ragge #endif
115 1.1 ragge #if NMT
116 1.1 ragge if (ma->ma_type & MSCPBUS_TAPE)
117 1.1 ragge return 1;
118 1.1 ragge #endif
119 1.1 ragge return 0;
120 1.1 ragge };
121 1.1 ragge
122 1.1 ragge void
123 1.1 ragge mscp_attach(parent, self, aux)
124 1.1 ragge struct device *parent, *self;
125 1.1 ragge void *aux;
126 1.1 ragge {
127 1.1 ragge struct mscp_attach_args *ma = aux;
128 1.1 ragge struct mscp_softc *mi = (void *)self;
129 1.9 ragge volatile struct mscp *mp;
130 1.1 ragge volatile int i;
131 1.1 ragge int timeout, next = 0;
132 1.1 ragge
133 1.1 ragge mi->mi_mc = ma->ma_mc;
134 1.1 ragge mi->mi_me = NULL;
135 1.1 ragge mi->mi_type = ma->ma_type;
136 1.1 ragge mi->mi_uuda = ma->ma_uuda;
137 1.1 ragge mi->mi_uda = ma->ma_uda;
138 1.1 ragge mi->mi_ip = ma->ma_ip;
139 1.1 ragge mi->mi_sa = ma->ma_sa;
140 1.1 ragge mi->mi_sw = ma->ma_sw;
141 1.1 ragge mi->mi_ivec = ma->ma_ivec;
142 1.3 ragge mi->mi_adapnr = ma->ma_adapnr;
143 1.3 ragge mi->mi_ctlrnr = ma->ma_ctlrnr;
144 1.1 ragge *ma->ma_softc = mi;
145 1.1 ragge /*
146 1.1 ragge * Go out to init the bus, so that we can give commands
147 1.1 ragge * to its devices.
148 1.1 ragge */
149 1.9 ragge mi->mi_cmd.mri_size = NCMD;
150 1.9 ragge mi->mi_cmd.mri_desc = mi->mi_uda->mp_ca.ca_cmddsc;
151 1.9 ragge mi->mi_cmd.mri_ring = mi->mi_uda->mp_cmd;
152 1.9 ragge mi->mi_rsp.mri_size = NRSP;
153 1.9 ragge mi->mi_rsp.mri_desc = mi->mi_uda->mp_ca.ca_rspdsc;
154 1.9 ragge mi->mi_rsp.mri_ring = mi->mi_uda->mp_rsp;
155 1.1 ragge mi->mi_actf = (void *)&mi->mi_actf; /* Circular wait queue */
156 1.1 ragge mi->mi_actb = (void *)&mi->mi_actf;
157 1.1 ragge
158 1.1 ragge if (mscp_init(mi)) {
159 1.5 christos printf("%s: can't init, controller hung\n",
160 1.1 ragge mi->mi_dev.dv_xname);
161 1.1 ragge return;
162 1.1 ragge }
163 1.1 ragge
164 1.1 ragge #if NRA
165 1.1 ragge if (ma->ma_type & MSCPBUS_DISK) {
166 1.1 ragge extern struct mscp_device ra_device;
167 1.1 ragge
168 1.1 ragge mi->mi_me = &ra_device;
169 1.1 ragge }
170 1.1 ragge #endif
171 1.1 ragge #if NMT
172 1.1 ragge if (ma->ma_type & MSCPBUS_TAPE) {
173 1.1 ragge extern struct mscp_device mt_device;
174 1.1 ragge
175 1.1 ragge mi->mi_me = &mt_device;
176 1.1 ragge }
177 1.1 ragge #endif
178 1.1 ragge /*
179 1.1 ragge * Go out and search for sub-units on this MSCP bus,
180 1.1 ragge * and call config_found for each found.
181 1.1 ragge */
182 1.1 ragge findunit:
183 1.1 ragge mp = mscp_getcp(mi, MSCP_DONTWAIT);
184 1.1 ragge if (mp == NULL)
185 1.1 ragge panic("mscpattach: no packets");
186 1.1 ragge mp->mscp_opcode = M_OP_GETUNITST;
187 1.1 ragge mp->mscp_unit = next;
188 1.1 ragge mp->mscp_modifier = M_GUM_NEXTUNIT;
189 1.1 ragge *mp->mscp_addr |= MSCP_OWN | MSCP_INT;
190 1.1 ragge slavereply.mscp_opcode = 0;
191 1.1 ragge
192 1.1 ragge i = *mi->mi_ip; /* Kick off polling */
193 1.1 ragge mp = &slavereply;
194 1.1 ragge timeout = 1000;
195 1.1 ragge while (timeout-- > 0) {
196 1.1 ragge DELAY(10000);
197 1.1 ragge if (mp->mscp_opcode)
198 1.1 ragge goto gotit;
199 1.1 ragge }
200 1.5 christos printf("%s: no response to Get Unit Status request\n",
201 1.1 ragge mi->mi_dev.dv_xname);
202 1.1 ragge return;
203 1.1 ragge
204 1.1 ragge gotit: /*
205 1.1 ragge * Got a slave response. If the unit is there, use it.
206 1.1 ragge */
207 1.1 ragge switch (mp->mscp_status & M_ST_MASK) {
208 1.1 ragge
209 1.9 ragge case M_ST_SUCCESS: /* worked */
210 1.9 ragge case M_ST_AVAILABLE: /* found another drive */
211 1.9 ragge break; /* use it */
212 1.1 ragge
213 1.1 ragge case M_ST_OFFLINE:
214 1.1 ragge /*
215 1.1 ragge * Figure out why it is off line. It may be because
216 1.9 ragge * it is nonexistent, or because it is spun down, or
217 1.9 ragge * for some other reason.
218 1.9 ragge */
219 1.9 ragge switch (mp->mscp_status & ~M_ST_MASK) {
220 1.9 ragge
221 1.9 ragge case M_OFFLINE_UNKNOWN:
222 1.9 ragge /*
223 1.9 ragge * No such drive, and there are none with
224 1.9 ragge * higher unit numbers either, if we are
225 1.9 ragge * using M_GUM_NEXTUNIT.
226 1.9 ragge */
227 1.2 ragge mi->mi_ierr = 3;
228 1.9 ragge return;
229 1.9 ragge
230 1.9 ragge case M_OFFLINE_UNMOUNTED:
231 1.9 ragge /*
232 1.9 ragge * The drive is not spun up. Use it anyway.
233 1.9 ragge *
234 1.9 ragge * N.B.: this seems to be a common occurrance
235 1.9 ragge * after a power failure. The first attempt
236 1.9 ragge * to bring it on line seems to spin it up
237 1.9 ragge * (and thus takes several minutes). Perhaps
238 1.9 ragge * we should note here that the on-line may
239 1.9 ragge * take longer than usual.
240 1.9 ragge */
241 1.9 ragge break;
242 1.1 ragge
243 1.9 ragge default:
244 1.9 ragge /*
245 1.9 ragge * In service, or something else equally unusable.
246 1.9 ragge */
247 1.9 ragge printf("%s: unit %d off line: ", mi->mi_dev.dv_xname,
248 1.9 ragge mp->mscp_unit);
249 1.9 ragge mscp_printevent((struct mscp *)mp);
250 1.1 ragge next++;
251 1.9 ragge goto findunit;
252 1.9 ragge }
253 1.9 ragge break;
254 1.1 ragge
255 1.9 ragge default:
256 1.9 ragge printf("%s: unable to get unit status: ", mi->mi_dev.dv_xname);
257 1.9 ragge mscp_printevent((struct mscp *)mp);
258 1.9 ragge return;
259 1.9 ragge }
260 1.9 ragge
261 1.9 ragge /*
262 1.9 ragge * If we get a lower number, we have circulated around all
263 1.1 ragge * devices and are finished, otherwise try to find next unit.
264 1.2 ragge * We shouldn't ever get this, it's a workaround.
265 1.9 ragge */
266 1.9 ragge if (mp->mscp_unit < next)
267 1.9 ragge return;
268 1.1 ragge
269 1.1 ragge next = mp->mscp_unit + 1;
270 1.1 ragge goto findunit;
271 1.1 ragge }
272 1.1 ragge
273 1.1 ragge
274 1.1 ragge /*
275 1.1 ragge * The ctlr gets initialised, normally after boot but may also be
276 1.1 ragge * done if the ctlr gets in an unknown state. Returns 1 if init
277 1.1 ragge * fails, 0 otherwise.
278 1.1 ragge */
279 1.1 ragge int
280 1.1 ragge mscp_init(mi)
281 1.1 ragge struct mscp_softc *mi;
282 1.1 ragge {
283 1.1 ragge struct mscp *mp;
284 1.1 ragge volatile int i;
285 1.1 ragge int status, count;
286 1.6 ragge unsigned int j = 0;
287 1.1 ragge
288 1.9 ragge /*
289 1.9 ragge * While we are thinking about it, reset the next command
290 1.9 ragge * and response indicies.
291 1.9 ragge */
292 1.1 ragge mi->mi_cmd.mri_next = 0;
293 1.1 ragge mi->mi_rsp.mri_next = 0;
294 1.1 ragge
295 1.1 ragge mi->mi_flags |= MSC_IGNOREINTR;
296 1.6 ragge
297 1.6 ragge if ((mi->mi_type & MSCPBUS_KDB) == 0)
298 1.9 ragge *mi->mi_ip = 0; /* Kick off */
299 1.6 ragge
300 1.1 ragge status = mscp_waitstep(mi, MP_STEP1, MP_STEP1);/* Wait to it wakes up */
301 1.1 ragge if (status == 0)
302 1.1 ragge return 1; /* Init failed */
303 1.1 ragge if (*mi->mi_sa & MP_ERR) {
304 1.1 ragge (*mi->mi_mc->mc_saerror)(mi->mi_dev.dv_parent, 0);
305 1.1 ragge return 1;
306 1.1 ragge }
307 1.1 ragge
308 1.1 ragge /* step1 */
309 1.1 ragge *mi->mi_sw = MP_ERR | (NCMDL2 << 11) | (NRSPL2 << 8) |
310 1.1 ragge MP_IE | (mi->mi_ivec >> 2);
311 1.1 ragge status = mscp_waitstep(mi, STEP1MASK, STEP1GOOD);
312 1.1 ragge if (status == 0) {
313 1.1 ragge (*mi->mi_mc->mc_saerror)(mi->mi_dev.dv_parent, 0);
314 1.1 ragge return 1;
315 1.1 ragge }
316 1.1 ragge
317 1.1 ragge /* step2 */
318 1.1 ragge *mi->mi_sw = (int)&mi->mi_uuda->mp_ca.ca_rspdsc[0] |
319 1.6 ragge (vax_cputype == VAX_780 || vax_cputype == VAX_8600 ? MP_PI : 0);
320 1.1 ragge status = mscp_waitstep(mi, STEP2MASK, STEP2GOOD(mi->mi_ivec >> 2));
321 1.9 ragge if (status == 0) {
322 1.9 ragge (*mi->mi_mc->mc_saerror)(mi->mi_dev.dv_parent, 0);
323 1.9 ragge return 1;
324 1.9 ragge }
325 1.1 ragge
326 1.1 ragge /* step3 */
327 1.1 ragge *mi->mi_sw = ((int)&mi->mi_uuda->mp_ca.ca_rspdsc[0]) >> 16;
328 1.1 ragge status = mscp_waitstep(mi, STEP3MASK, STEP3GOOD);
329 1.9 ragge if (status == 0) {
330 1.9 ragge (*mi->mi_mc->mc_saerror)(mi->mi_dev.dv_parent, 0);
331 1.9 ragge return 1;
332 1.9 ragge }
333 1.1 ragge i = *mi->mi_sa & 0377;
334 1.5 christos printf(": version %d model %d\n", i & 15, i >> 4);
335 1.1 ragge
336 1.9 ragge #define BURST 4 /* XXX */
337 1.1 ragge if (mi->mi_type & MSCPBUS_UDA) {
338 1.1 ragge *mi->mi_sw = MP_GO | (BURST - 1) << 2;
339 1.5 christos printf("%s: DMA burst size set to %d\n",
340 1.1 ragge mi->mi_dev.dv_xname, BURST);
341 1.1 ragge }
342 1.2 ragge *mi->mi_sw = MP_GO;
343 1.1 ragge
344 1.1 ragge mscp_initds(mi);
345 1.1 ragge mi->mi_flags &= ~MSC_IGNOREINTR;
346 1.1 ragge
347 1.1 ragge /*
348 1.1 ragge * Set up all necessary info in the bus softc struct, get a
349 1.1 ragge * mscp packet and set characteristics for this controller.
350 1.1 ragge */
351 1.1 ragge mi->mi_credits = MSCP_MINCREDITS + 1;
352 1.1 ragge mp = mscp_getcp(mi, MSCP_DONTWAIT);
353 1.2 ragge
354 1.1 ragge mi->mi_credits = 0;
355 1.1 ragge mp->mscp_opcode = M_OP_SETCTLRC;
356 1.2 ragge mp->mscp_unit = mp->mscp_modifier = mp->mscp_flags =
357 1.2 ragge mp->mscp_sccc.sccc_version = mp->mscp_sccc.sccc_hosttimo =
358 1.2 ragge mp->mscp_sccc.sccc_time = mp->mscp_sccc.sccc_time1 =
359 1.2 ragge mp->mscp_sccc.sccc_errlgfl = 0;
360 1.1 ragge mp->mscp_sccc.sccc_ctlrflags = M_CF_ATTN | M_CF_MISC | M_CF_THIS;
361 1.1 ragge *mp->mscp_addr |= MSCP_OWN | MSCP_INT;
362 1.1 ragge i = *mi->mi_ip;
363 1.1 ragge
364 1.9 ragge count = 0;
365 1.9 ragge while (count < DELAYTEN) {
366 1.10 ragge if (((volatile int)mi->mi_flags & MSC_READY) != 0)
367 1.9 ragge break;
368 1.2 ragge if ((j = *mi->mi_sa) & MP_ERR)
369 1.2 ragge goto out;
370 1.9 ragge DELAY(10000);
371 1.9 ragge count += 1;
372 1.9 ragge }
373 1.1 ragge if (count == DELAYTEN) {
374 1.2 ragge out:
375 1.5 christos printf("%s: couldn't set ctlr characteristics, sa=%x\n",
376 1.2 ragge mi->mi_dev.dv_xname, j);
377 1.1 ragge return 1;
378 1.1 ragge }
379 1.1 ragge return 0;
380 1.1 ragge }
381 1.1 ragge
382 1.1 ragge /*
383 1.1 ragge * Initialise the various data structures that control the mscp protocol.
384 1.1 ragge */
385 1.1 ragge void
386 1.1 ragge mscp_initds(mi)
387 1.1 ragge struct mscp_softc *mi;
388 1.1 ragge {
389 1.1 ragge struct mscp_pack *uud = mi->mi_uuda;
390 1.1 ragge struct mscp_pack *ud = mi->mi_uda;
391 1.1 ragge struct mscp *mp;
392 1.1 ragge int i;
393 1.1 ragge
394 1.1 ragge for (i = 0, mp = ud->mp_rsp; i < NRSP; i++, mp++) {
395 1.1 ragge ud->mp_ca.ca_rspdsc[i] = MSCP_OWN | MSCP_INT |
396 1.1 ragge (long)&uud->mp_rsp[i].mscp_cmdref;
397 1.1 ragge mp->mscp_addr = &ud->mp_ca.ca_rspdsc[i];
398 1.1 ragge mp->mscp_msglen = MSCP_MSGLEN;
399 1.1 ragge }
400 1.1 ragge for (i = 0, mp = ud->mp_cmd; i < NCMD; i++, mp++) {
401 1.1 ragge ud->mp_ca.ca_cmddsc[i] = MSCP_INT |
402 1.1 ragge (long)&uud->mp_cmd[i].mscp_cmdref;
403 1.1 ragge mp->mscp_addr = &ud->mp_ca.ca_cmddsc[i];
404 1.1 ragge mp->mscp_msglen = MSCP_MSGLEN;
405 1.2 ragge if (mi->mi_type & MSCPBUS_TAPE)
406 1.2 ragge mp->mscp_vcid = 1;
407 1.1 ragge }
408 1.1 ragge }
409 1.1 ragge
410 1.1 ragge void
411 1.1 ragge mscp_intr(mi)
412 1.1 ragge struct mscp_softc *mi;
413 1.1 ragge {
414 1.1 ragge struct mscp_pack *ud = mi->mi_uda;
415 1.1 ragge
416 1.1 ragge if (mi->mi_flags & MSC_IGNOREINTR)
417 1.1 ragge return;
418 1.9 ragge /*
419 1.9 ragge * Check for response and command ring transitions.
420 1.9 ragge */
421 1.9 ragge if (ud->mp_ca.ca_rspint) {
422 1.9 ragge ud->mp_ca.ca_rspint = 0;
423 1.9 ragge mscp_dorsp(mi);
424 1.9 ragge }
425 1.9 ragge if (ud->mp_ca.ca_cmdint) {
426 1.9 ragge ud->mp_ca.ca_cmdint = 0;
427 1.9 ragge MSCP_DOCMD(mi);
428 1.9 ragge }
429 1.6 ragge
430 1.6 ragge /*
431 1.6 ragge * If there are any not-yet-handled requeset, try them now.
432 1.6 ragge * XXX - We handles them (erroneous) in last-in first-handled order.
433 1.6 ragge * Must we fix this???
434 1.6 ragge */
435 1.6 ragge while (mi->mi_w) {
436 1.6 ragge struct buf *bp = mi->mi_w;
437 1.6 ragge
438 1.6 ragge mi->mi_w = (void *)bp->b_actb;
439 1.6 ragge mscp_strategy(bp, (struct device *)mi);
440 1.6 ragge if (mi->mi_w == bp)
441 1.6 ragge break;
442 1.6 ragge }
443 1.1 ragge }
444 1.1 ragge
445 1.1 ragge int
446 1.1 ragge mscp_print(aux, name)
447 1.1 ragge void *aux;
448 1.6 ragge const char *name;
449 1.1 ragge {
450 1.9 ragge struct drive_attach_args *da = aux;
451 1.9 ragge struct mscp *mp = da->da_mp;
452 1.9 ragge int type = mp->mscp_guse.guse_mediaid;
453 1.9 ragge
454 1.9 ragge if (name) {
455 1.9 ragge printf("%c%c", MSCP_MID_CHAR(2, type), MSCP_MID_CHAR(1, type));
456 1.9 ragge if (MSCP_MID_ECH(0, type))
457 1.9 ragge printf("%c", MSCP_MID_CHAR(0, type));
458 1.9 ragge printf("%d at %s drive %d", MSCP_MID_NUM(type), name,
459 1.9 ragge mp->mscp_unit);
460 1.9 ragge }
461 1.1 ragge return UNCONF;
462 1.1 ragge }
463 1.1 ragge
464 1.1 ragge /*
465 1.1 ragge * common strategy routine for all types of MSCP devices.
466 1.1 ragge * bp is the current buf, dp is the drive queue.
467 1.1 ragge */
468 1.1 ragge void
469 1.6 ragge mscp_strategy(bp, usc)
470 1.6 ragge struct buf *bp;
471 1.1 ragge struct device *usc;
472 1.1 ragge {
473 1.1 ragge struct mscp_softc *mi = (void *)usc;
474 1.1 ragge struct mscp *mp;
475 1.6 ragge int s = spl6();
476 1.1 ragge
477 1.1 ragge /*
478 1.1 ragge * Ok; we are ready to try to start a xfer. Get a MSCP packet
479 1.1 ragge * and try to start...
480 1.1 ragge */
481 1.1 ragge if ((mp = mscp_getcp(mi, MSCP_DONTWAIT)) == NULL) {
482 1.1 ragge if (mi->mi_credits > MSCP_MINCREDITS)
483 1.6 ragge printf("%s: command ring too small\n",
484 1.1 ragge mi->mi_dev.dv_parent->dv_xname);
485 1.6 ragge /*
486 1.6 ragge * By some (strange) reason we didn't get a MSCP packet.
487 1.6 ragge * Put it on queue and wait for free packets.
488 1.6 ragge */
489 1.6 ragge (void *)bp->b_actb = mi->mi_w;
490 1.6 ragge mi->mi_w = bp;
491 1.6 ragge splx(s);
492 1.6 ragge return;
493 1.1 ragge }
494 1.1 ragge
495 1.1 ragge /*
496 1.6 ragge * Set up the MSCP packet and ask the ctlr to start.
497 1.1 ragge */
498 1.1 ragge mp->mscp_opcode = (bp->b_flags & B_READ) ? M_OP_READ : M_OP_WRITE;
499 1.1 ragge (*mi->mi_me->me_fillin)(bp, mp);
500 1.6 ragge (void *)bp->b_actb = mp; /* b_actb is unused, save mscp packet here */
501 1.6 ragge (*mi->mi_mc->mc_go)(mi->mi_dev.dv_parent, bp);
502 1.1 ragge splx(s);
503 1.1 ragge }
504 1.1 ragge
505 1.1 ragge void
506 1.6 ragge mscp_dgo(mi, buffer, info, bp)
507 1.1 ragge struct mscp_softc *mi;
508 1.1 ragge long buffer, info;
509 1.6 ragge struct buf *bp;
510 1.1 ragge {
511 1.1 ragge volatile int i;
512 1.1 ragge struct mscp *mp;
513 1.1 ragge
514 1.9 ragge /*
515 1.9 ragge * Fill in the MSCP packet and move the buffer to the I/O wait queue.
516 1.9 ragge */
517 1.6 ragge mp = (void *)bp->b_actb;
518 1.6 ragge
519 1.1 ragge mp->mscp_seq.seq_buffer = buffer;
520 1.1 ragge
521 1.2 ragge _insque(&bp->b_actf, &mi->mi_actf);
522 1.1 ragge
523 1.1 ragge bp->b_resid = info;
524 1.1 ragge mp->mscp_cmdref = (long) bp;
525 1.6 ragge *mp->mscp_addr |= MSCP_OWN | MSCP_INT;
526 1.1 ragge
527 1.1 ragge i = *mi->mi_ip;
528 1.1 ragge }
529 1.1 ragge
530 1.6 ragge #ifdef DIAGNOSTIC
531 1.1 ragge /*
532 1.1 ragge * Dump the entire contents of an MSCP packet in hex. Mainly useful
533 1.1 ragge * for debugging....
534 1.1 ragge */
535 1.1 ragge void
536 1.1 ragge mscp_hexdump(mp)
537 1.1 ragge register struct mscp *mp;
538 1.1 ragge {
539 1.1 ragge register long *p = (long *) mp;
540 1.1 ragge register int i = mp->mscp_msglen;
541 1.1 ragge
542 1.1 ragge if (i > 256) /* sanity */
543 1.1 ragge i = 256;
544 1.1 ragge i /= sizeof (*p); /* ASSUMES MULTIPLE OF sizeof(long) */
545 1.1 ragge while (--i >= 0)
546 1.5 christos printf("0x%x ", (int)*p++);
547 1.5 christos printf("\n");
548 1.1 ragge }
549 1.6 ragge #endif
550 1.1 ragge
551 1.1 ragge /*
552 1.1 ragge * MSCP error reporting
553 1.1 ragge */
554 1.1 ragge
555 1.1 ragge /*
556 1.1 ragge * Messages for the various subcodes.
557 1.1 ragge */
558 1.1 ragge static char unknown_msg[] = "unknown subcode";
559 1.1 ragge
560 1.1 ragge /*
561 1.1 ragge * Subcodes for Success (0)
562 1.1 ragge */
563 1.1 ragge static char *succ_msgs[] = {
564 1.1 ragge "normal", /* 0 */
565 1.1 ragge "spin down ignored", /* 1 = Spin-Down Ignored */
566 1.1 ragge "still connected", /* 2 = Still Connected */
567 1.1 ragge unknown_msg,
568 1.1 ragge "dup. unit #", /* 4 = Duplicate Unit Number */
569 1.1 ragge unknown_msg,
570 1.1 ragge unknown_msg,
571 1.1 ragge unknown_msg,
572 1.1 ragge "already online", /* 8 = Already Online */
573 1.1 ragge unknown_msg,
574 1.1 ragge unknown_msg,
575 1.1 ragge unknown_msg,
576 1.1 ragge unknown_msg,
577 1.1 ragge unknown_msg,
578 1.1 ragge unknown_msg,
579 1.1 ragge unknown_msg,
580 1.1 ragge "still online", /* 16 = Still Online */
581 1.1 ragge };
582 1.1 ragge
583 1.1 ragge /*
584 1.1 ragge * Subcodes for Invalid Command (1)
585 1.1 ragge */
586 1.1 ragge static char *icmd_msgs[] = {
587 1.1 ragge "invalid msg length", /* 0 = Invalid Message Length */
588 1.1 ragge };
589 1.1 ragge
590 1.1 ragge /*
591 1.1 ragge * Subcodes for Command Aborted (2)
592 1.1 ragge */
593 1.1 ragge /* none known */
594 1.1 ragge
595 1.1 ragge /*
596 1.1 ragge * Subcodes for Unit Offline (3)
597 1.1 ragge */
598 1.1 ragge static char *offl_msgs[] = {
599 1.1 ragge "unknown drive", /* 0 = Unknown, or online to other ctlr */
600 1.1 ragge "not mounted", /* 1 = Unmounted, or RUN/STOP at STOP */
601 1.1 ragge "inoperative", /* 2 = Unit Inoperative */
602 1.1 ragge unknown_msg,
603 1.1 ragge "duplicate", /* 4 = Duplicate Unit Number */
604 1.1 ragge unknown_msg,
605 1.1 ragge unknown_msg,
606 1.1 ragge unknown_msg,
607 1.1 ragge "in diagnosis", /* 8 = Disabled by FS or diagnostic */
608 1.1 ragge };
609 1.1 ragge
610 1.1 ragge /*
611 1.1 ragge * Subcodes for Unit Available (4)
612 1.1 ragge */
613 1.1 ragge /* none known */
614 1.1 ragge
615 1.1 ragge /*
616 1.1 ragge * Subcodes for Media Format Error (5)
617 1.1 ragge */
618 1.1 ragge static char *media_fmt_msgs[] = {
619 1.1 ragge "fct unread - edc", /* 0 = FCT unreadable */
620 1.1 ragge "invalid sector header",/* 1 = Invalid Sector Header */
621 1.1 ragge "not 512 sectors", /* 2 = Not 512 Byte Sectors */
622 1.1 ragge "not formatted", /* 3 = Not Formatted */
623 1.1 ragge "fct ecc", /* 4 = FCT ECC */
624 1.1 ragge };
625 1.1 ragge
626 1.1 ragge /*
627 1.1 ragge * Subcodes for Write Protected (6)
628 1.1 ragge * N.B.: Code 6 subcodes are 7 bits higher than other subcodes
629 1.1 ragge * (i.e., bits 12-15).
630 1.1 ragge */
631 1.1 ragge static char *wrprot_msgs[] = {
632 1.1 ragge unknown_msg,
633 1.1 ragge "software", /* 1 = Software Write Protect */
634 1.1 ragge "hardware", /* 2 = Hardware Write Protect */
635 1.1 ragge };
636 1.1 ragge
637 1.1 ragge /*
638 1.1 ragge * Subcodes for Compare Error (7)
639 1.1 ragge */
640 1.1 ragge /* none known */
641 1.1 ragge
642 1.1 ragge /*
643 1.1 ragge * Subcodes for Data Error (8)
644 1.1 ragge */
645 1.1 ragge static char *data_msgs[] = {
646 1.1 ragge "forced error", /* 0 = Forced Error (software) */
647 1.1 ragge unknown_msg,
648 1.1 ragge "header compare", /* 2 = Header Compare Error */
649 1.1 ragge "sync timeout", /* 3 = Sync Timeout Error */
650 1.1 ragge unknown_msg,
651 1.1 ragge unknown_msg,
652 1.1 ragge unknown_msg,
653 1.1 ragge "uncorrectable ecc", /* 7 = Uncorrectable ECC */
654 1.1 ragge "1 symbol ecc", /* 8 = 1 bit ECC */
655 1.1 ragge "2 symbol ecc", /* 9 = 2 bit ECC */
656 1.1 ragge "3 symbol ecc", /* 10 = 3 bit ECC */
657 1.1 ragge "4 symbol ecc", /* 11 = 4 bit ECC */
658 1.1 ragge "5 symbol ecc", /* 12 = 5 bit ECC */
659 1.1 ragge "6 symbol ecc", /* 13 = 6 bit ECC */
660 1.1 ragge "7 symbol ecc", /* 14 = 7 bit ECC */
661 1.1 ragge "8 symbol ecc", /* 15 = 8 bit ECC */
662 1.1 ragge };
663 1.1 ragge
664 1.1 ragge /*
665 1.1 ragge * Subcodes for Host Buffer Access Error (9)
666 1.1 ragge */
667 1.1 ragge static char *host_buffer_msgs[] = {
668 1.1 ragge unknown_msg,
669 1.1 ragge "odd xfer addr", /* 1 = Odd Transfer Address */
670 1.1 ragge "odd xfer count", /* 2 = Odd Transfer Count */
671 1.1 ragge "non-exist. memory", /* 3 = Non-Existent Memory */
672 1.1 ragge "memory parity", /* 4 = Memory Parity Error */
673 1.1 ragge };
674 1.1 ragge
675 1.1 ragge /*
676 1.1 ragge * Subcodes for Controller Error (10)
677 1.1 ragge */
678 1.1 ragge static char *cntlr_msgs[] = {
679 1.1 ragge unknown_msg,
680 1.1 ragge "serdes overrun", /* 1 = Serialiser/Deserialiser Overrun */
681 1.1 ragge "edc", /* 2 = Error Detection Code? */
682 1.1 ragge "inconsistant internal data struct",/* 3 = Internal Error */
683 1.1 ragge };
684 1.1 ragge
685 1.1 ragge /*
686 1.1 ragge * Subcodes for Drive Error (11)
687 1.1 ragge */
688 1.1 ragge static char *drive_msgs[] = {
689 1.1 ragge unknown_msg,
690 1.1 ragge "sdi command timeout", /* 1 = SDI Command Timeout */
691 1.1 ragge "ctlr detected protocol",/* 2 = Controller Detected Protocol Error */
692 1.1 ragge "positioner", /* 3 = Positioner Error */
693 1.1 ragge "lost rd/wr ready", /* 4 = Lost R/W Ready Error */
694 1.1 ragge "drive clock dropout", /* 5 = Lost Drive Clock */
695 1.1 ragge "lost recvr ready", /* 6 = Lost Receiver Ready */
696 1.9 ragge "drive detected error", /* 7 = Drive Error */
697 1.1 ragge "ctlr detected pulse or parity",/* 8 = Pulse or Parity Error */
698 1.1 ragge };
699 1.1 ragge
700 1.1 ragge /*
701 1.1 ragge * The following table correlates message codes with the
702 1.1 ragge * decoding strings.
703 1.1 ragge */
704 1.1 ragge struct code_decode {
705 1.1 ragge char *cdc_msg;
706 1.1 ragge int cdc_nsubcodes;
707 1.1 ragge char **cdc_submsgs;
708 1.1 ragge } code_decode[] = {
709 1.9 ragge #define SC(m) sizeof (m) / sizeof (m[0]), m
710 1.1 ragge {"success", SC(succ_msgs)},
711 1.1 ragge {"invalid command", SC(icmd_msgs)},
712 1.1 ragge {"command aborted", 0, 0},
713 1.1 ragge {"unit offline", SC(offl_msgs)},
714 1.1 ragge {"unit available", 0, 0},
715 1.1 ragge {"media format error", SC(media_fmt_msgs)},
716 1.1 ragge {"write protected", SC(wrprot_msgs)},
717 1.1 ragge {"compare error", 0, 0},
718 1.1 ragge {"data error", SC(data_msgs)},
719 1.1 ragge {"host buffer access error", SC(host_buffer_msgs)},
720 1.1 ragge {"controller error", SC(cntlr_msgs)},
721 1.1 ragge {"drive error", SC(drive_msgs)},
722 1.1 ragge #undef SC
723 1.1 ragge };
724 1.1 ragge
725 1.1 ragge /*
726 1.1 ragge * Print the decoded error event from an MSCP error datagram.
727 1.1 ragge */
728 1.1 ragge void
729 1.1 ragge mscp_printevent(mp)
730 1.1 ragge struct mscp *mp;
731 1.1 ragge {
732 1.1 ragge register int event = mp->mscp_event;
733 1.1 ragge register struct code_decode *cdc;
734 1.1 ragge int c, sc;
735 1.1 ragge char *cm, *scm;
736 1.1 ragge
737 1.1 ragge /*
738 1.1 ragge * The code is the lower six bits of the event number (aka
739 1.1 ragge * status). If that is 6 (write protect), the subcode is in
740 1.1 ragge * bits 12-15; otherwise, it is in bits 5-11.
741 1.1 ragge * I WONDER WHAT THE OTHER BITS ARE FOR. IT SURE WOULD BE
742 1.1 ragge * NICE IF DEC SOLD DOCUMENTATION FOR THEIR OWN CONTROLLERS.
743 1.1 ragge */
744 1.1 ragge c = event & M_ST_MASK;
745 1.1 ragge sc = (c != 6 ? event >> 5 : event >> 12) & 0x7ff;
746 1.1 ragge if (c >= sizeof code_decode / sizeof code_decode[0])
747 1.1 ragge cm = "- unknown code", scm = "??";
748 1.1 ragge else {
749 1.1 ragge cdc = &code_decode[c];
750 1.1 ragge cm = cdc->cdc_msg;
751 1.1 ragge if (sc >= cdc->cdc_nsubcodes)
752 1.1 ragge scm = unknown_msg;
753 1.1 ragge else
754 1.1 ragge scm = cdc->cdc_submsgs[sc];
755 1.1 ragge }
756 1.5 christos printf(" %s (%s) (code %d, subcode %d)\n", cm, scm, c, sc);
757 1.1 ragge }
758 1.1 ragge
759 1.2 ragge static char *codemsg[16] = {
760 1.2 ragge "lbn", "code 1", "code 2", "code 3",
761 1.2 ragge "code 4", "code 5", "rbn", "code 7",
762 1.2 ragge "code 8", "code 9", "code 10", "code 11",
763 1.2 ragge "code 12", "code 13", "code 14", "code 15"
764 1.2 ragge };
765 1.1 ragge /*
766 1.1 ragge * Print the code and logical block number for an error packet.
767 1.1 ragge * THIS IS PROBABLY PECULIAR TO DISK DRIVES. IT SURE WOULD BE
768 1.1 ragge * NICE IF DEC SOLD DOCUMENTATION FOR THEIR OWN CONTROLLERS.
769 1.1 ragge */
770 1.2 ragge int
771 1.2 ragge mscp_decodeerror(name, mp, mi)
772 1.1 ragge char *name;
773 1.1 ragge register struct mscp *mp;
774 1.2 ragge struct mscp_softc *mi;
775 1.1 ragge {
776 1.2 ragge int issoft;
777 1.2 ragge /*
778 1.2 ragge * We will get three sdi errors of type 11 after autoconfig
779 1.2 ragge * is finished; depending of searching for non-existing units.
780 1.2 ragge * How can we avoid this???
781 1.2 ragge */
782 1.2 ragge if (((mp->mscp_event & M_ST_MASK) == 11) && (mi->mi_ierr++ < 3))
783 1.2 ragge return 1;
784 1.1 ragge /*
785 1.1 ragge * For bad blocks, mp->mscp_erd.erd_hdr identifies a code and
786 1.1 ragge * the logical block number. Code 0 is a regular block; code 6
787 1.1 ragge * is a replacement block. The remaining codes are currently
788 1.1 ragge * undefined. The code is in the upper four bits of the header
789 1.1 ragge * (bits 0-27 are the lbn).
790 1.1 ragge */
791 1.2 ragge issoft = mp->mscp_flags & (M_LF_SUCC | M_LF_CONT);
792 1.1 ragge #define BADCODE(h) (codemsg[(unsigned)(h) >> 28])
793 1.1 ragge #define BADLBN(h) ((h) & 0xfffffff)
794 1.1 ragge
795 1.5 christos printf("%s: drive %d %s error datagram%s:", name, mp->mscp_unit,
796 1.1 ragge issoft ? "soft" : "hard",
797 1.1 ragge mp->mscp_flags & M_LF_CONT ? " (continuing)" : "");
798 1.1 ragge switch (mp->mscp_format & 0377) {
799 1.1 ragge
800 1.1 ragge case M_FM_CTLRERR: /* controller error */
801 1.1 ragge break;
802 1.1 ragge
803 1.1 ragge case M_FM_BUSADDR: /* host memory access error */
804 1.5 christos printf(" memory addr 0x%x:", (int)mp->mscp_erd.erd_busaddr);
805 1.1 ragge break;
806 1.1 ragge
807 1.1 ragge case M_FM_DISKTRN:
808 1.5 christos printf(" unit %d: level %d retry %d, %s %d:",
809 1.1 ragge mp->mscp_unit,
810 1.1 ragge mp->mscp_erd.erd_level, mp->mscp_erd.erd_retry,
811 1.1 ragge BADCODE(mp->mscp_erd.erd_hdr),
812 1.1 ragge (int)BADLBN(mp->mscp_erd.erd_hdr));
813 1.1 ragge break;
814 1.1 ragge
815 1.1 ragge case M_FM_SDI:
816 1.5 christos printf(" unit %d: %s %d:", mp->mscp_unit,
817 1.1 ragge BADCODE(mp->mscp_erd.erd_hdr),
818 1.1 ragge (int)BADLBN(mp->mscp_erd.erd_hdr));
819 1.1 ragge break;
820 1.1 ragge
821 1.1 ragge case M_FM_SMLDSK:
822 1.5 christos printf(" unit %d: small disk error, cyl %d:",
823 1.1 ragge mp->mscp_unit, mp->mscp_erd.erd_sdecyl);
824 1.1 ragge break;
825 1.1 ragge
826 1.2 ragge case M_FM_TAPETRN:
827 1.5 christos printf(" unit %d: tape transfer error, grp 0x%x event 0%o:",
828 1.2 ragge mp->mscp_unit, mp->mscp_erd.erd_sdecyl, mp->mscp_event);
829 1.2 ragge break;
830 1.2 ragge
831 1.2 ragge case M_FM_STIERR:
832 1.5 christos printf(" unit %d: STI error, event 0%o:", mp->mscp_unit,
833 1.2 ragge mp->mscp_event);
834 1.2 ragge break;
835 1.2 ragge
836 1.1 ragge default:
837 1.5 christos printf(" unit %d: unknown error, format 0x%x:",
838 1.1 ragge mp->mscp_unit, mp->mscp_format);
839 1.1 ragge }
840 1.1 ragge mscp_printevent(mp);
841 1.2 ragge return 0;
842 1.1 ragge #undef BADCODE
843 1.1 ragge #undef BADLBN
844 1.1 ragge }
845