xref: /csrg-svn/sys/news3400/iodev/scsi.c (revision 53901)
1*53901Smckusick /*
2*53901Smckusick  * Copyright (c) 1992 The Regents of the University of California.
3*53901Smckusick  * All rights reserved.
4*53901Smckusick  *
5*53901Smckusick  * This code is derived from software contributed to Berkeley by
6*53901Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
7*53901Smckusick  *
8*53901Smckusick  * %sccs.include.redist.c%
9*53901Smckusick  *
10*53901Smckusick  * from: $Hdr: scsi.c,v 4.300 91/06/27 20:42:51 root Rel41 $ SONY
11*53901Smckusick  *
12*53901Smckusick  *	@(#)scsi.c	7.1 (Berkeley) 06/04/92
13*53901Smckusick  */
14*53901Smckusick 
15*53901Smckusick /*
16*53901Smckusick  *	scsi.c	ver 1.1
17*53901Smckusick  */
18*53901Smckusick 
19*53901Smckusick #include "../include/fix_machine_type.h"
20*53901Smckusick #include "../include/param.h"
21*53901Smckusick 
22*53901Smckusick #include "param.h"
23*53901Smckusick #include "buf.h"
24*53901Smckusick #include "proc.h"
25*53901Smckusick #include "user.h"
26*53901Smckusick 
27*53901Smckusick # include "../include/cpu.h"
28*53901Smckusick 
29*53901Smckusick #include "../hbdev/hbvar.h"
30*53901Smckusick #include "../hbdev/scsic.h"
31*53901Smckusick #include "../hbdev/screg_1185.h"
32*53901Smckusick 
33*53901Smckusick #include "../iodev/scsireg.h"
34*53901Smckusick #include "../iodev/ioptohb.h"
35*53901Smckusick 
36*53901Smckusick #define DEBUG_LOSSBSY_HUNG
37*53901Smckusick 
38*53901Smckusick #ifdef DEBUG_LOSSBSY_HUNG
39*53901Smckusick # define PROBE_MAXRETRY	100
40*53901Smckusick #endif
41*53901Smckusick 
42*53901Smckusick #ifndef NO_SCSI_DISCONNECT
43*53901Smckusick int Scsi_Disconnect = IDT_DISCON;
44*53901Smckusick #else
45*53901Smckusick int Scsi_Disconnect = 0;
46*53901Smckusick #endif
47*53901Smckusick 
48*53901Smckusick # define MAXCTLR	8
49*53901Smckusick struct sc_data sc_data[MAXCTLR];
50*53901Smckusick struct scintsw scintsw[MAXCTLR];
51*53901Smckusick 
52*53901Smckusick #ifdef RSENSE_MSG_DISP
53*53901Smckusick int	rsense_msg_disp = 1;	/* RSENSE-message display flag */
54*53901Smckusick #else
55*53901Smckusick int	rsense_msg_disp = 0;	/* RSENSE-message display flag */
56*53901Smckusick #endif
57*53901Smckusick 
58*53901Smckusick int	mo_disp_format = 0;	/* MO format mode display flag */
59*53901Smckusick 
60*53901Smckusick struct msg_list {
61*53901Smckusick 	int	ml_code;		/* message code */
62*53901Smckusick 	int	ml_msglvl;		/* message level */
63*53901Smckusick 	char	*ml_msgstr;		/* message string */
64*53901Smckusick };
65*53901Smckusick 
66*53901Smckusick #ifdef NO_SHRINK_RSENSE_MSG
67*53901Smckusick struct msg_list skeylist[] = {
68*53901Smckusick 	{ 0x00,	1, "No Sense" },
69*53901Smckusick 	{ 0x01,	0, "Recoverable Error" },
70*53901Smckusick 	{ 0x02,	0, "Not Ready" },
71*53901Smckusick 	{ 0x03,	0, "Medium Error" },
72*53901Smckusick 	{ 0x04,	0, "Hardware Error" },
73*53901Smckusick 	{ 0x05, 0, "Illegal Request" },
74*53901Smckusick 	{ 0x06, 1, "Unit Attention" },
75*53901Smckusick 	{ 0x07,	1, "Data protect" },
76*53901Smckusick 	{ 0x08, 0, "Blank Check" },
77*53901Smckusick 	{ 0x09,	0, "Vendor Unique" },
78*53901Smckusick 	{ 0x0a,	0, "Copy/Compare Aborted" },
79*53901Smckusick 	{ 0x0b, 0, "Aborted Command" },
80*53901Smckusick 	{ 0x0c, 0, "Equal" },
81*53901Smckusick 	{ 0x0d, 0, "Volume Overflow" },
82*53901Smckusick 	{ 0x0e,	0, "Miscompare" },
83*53901Smckusick 	{ -1,	0, (caddr_t)0 }
84*53901Smckusick };
85*53901Smckusick #else /* NO_SHRINK_RSENSE_MSG */
86*53901Smckusick struct msg_list skeylist[] = {
87*53901Smckusick 	{ 0x00,	1, NULL },
88*53901Smckusick 	{ 0x01,	0, NULL },
89*53901Smckusick 	{ 0x02,	0, NULL },
90*53901Smckusick 	{ 0x03,	0, NULL },
91*53901Smckusick 	{ 0x04,	0, NULL },
92*53901Smckusick 	{ 0x05, 0, NULL },
93*53901Smckusick 	{ 0x06, 1, NULL },
94*53901Smckusick 	{ 0x07,	1, NULL },
95*53901Smckusick 	{ 0x08, 0, NULL },
96*53901Smckusick 	{ 0x09,	0, NULL },
97*53901Smckusick 	{ 0x0a,	0, NULL },
98*53901Smckusick 	{ 0x0b, 0, NULL },
99*53901Smckusick 	{ 0x0c, 0, NULL },
100*53901Smckusick 	{ 0x0d, 0, NULL },
101*53901Smckusick 	{ 0x0e,	0, NULL },
102*53901Smckusick 	{ -1,	0, NULL }
103*53901Smckusick };
104*53901Smckusick #endif /* NO_SHRINK_RSENSE_MSG */
105*53901Smckusick 
106*53901Smckusick #ifdef NO_SHRINK_RSENSE_MSG
107*53901Smckusick struct msg_list ecodelist[] = {
108*53901Smckusick 	{ 0x00, 9, "No Additional Sense Information" },
109*53901Smckusick /*HD*/	{ 0x01, 1, "No Index/Address Mark Found signal" },
110*53901Smckusick 	{ 0x02, 0, "No Seek Complete" },
111*53901Smckusick 	{ 0x03, 0, "Write Fault" },
112*53901Smckusick 	{ 0x04, 9, "Drive Not Ready" },
113*53901Smckusick 	{ 0x05, 0, "Drive Not Selected" },
114*53901Smckusick /*HD*/	{ 0x06, 0, "No Track Zero" },
115*53901Smckusick 	{ 0x07, 0, "Multiple Drives Selected" },
116*53901Smckusick 	{ 0x08, 0, "Logical Unit Communication Failure" },
117*53901Smckusick 	{ 0x09, 2, "Track Following Error" },
118*53901Smckusick /*MO*/	{ 0x0a, 1, "No Disk" },
119*53901Smckusick /*MO*/	{ 0x0b, 1, "Load/Unload Failure" },
120*53901Smckusick /*MO*/	{ 0x0c, 1, "Spindle Failure" },
121*53901Smckusick /*MO*/	{ 0x0d, 1, "Focus Failure" },
122*53901Smckusick /*MO*/	{ 0x0e, 1, "Tracking Failure" },
123*53901Smckusick /*MO*/	{ 0x0f, 0, "Drive Initialization Failure" },
124*53901Smckusick 	{ 0x10, 1, "ID CRC or ECC error" },
125*53901Smckusick 	{ 0x11, 0, "Unrecoverd Read error" },
126*53901Smckusick /*HD*/	{ 0x12, 0, "No Address Mark (byte sync byte) found in ID field" },
127*53901Smckusick /*HD*/	{ 0x13, 0, "No Address Mark (byte sync byte) found in Data field" },
128*53901Smckusick /*HD*/	{ 0x14, 0, "No record found" },
129*53901Smckusick 	{ 0x15, 1, "Seek Positioning Error" },
130*53901Smckusick 
131*53901Smckusick /*HD*/	{ 0x17, 0, "Recovered Read data with Read retries" },
132*53901Smckusick 	{ 0x18, 0, "Recovered Read data with ECC procedure" },
133*53901Smckusick /*HD*/	{ 0x19, 0, "Defect List error" },
134*53901Smckusick /*HD*/	{ 0x1a, 0, "Parameter overrun" },
135*53901Smckusick /*HD*/	{ 0x1b, 0, "Synchronous transfer error" },
136*53901Smckusick /*HD*/	{ 0x1c, 0, "Primary Defect List not found" },
137*53901Smckusick /*HD*/	{ 0x1d, 0, "Compare error" },
138*53901Smckusick 
139*53901Smckusick 	{ 0x20, 0, "Invalid Command Operation Code" },
140*53901Smckusick 	{ 0x21, 0, "Illegal Logical Block Address" },
141*53901Smckusick /*HD*/	{ 0x22, 0, "Illegal function for device type" },
142*53901Smckusick /*MO*/	{ 0x23, 0, "Illegal function for Medium Type" },
143*53901Smckusick 	{ 0x24, 0, "Illegal Field in CDB" },
144*53901Smckusick 	{ 0x25, 0, "Invalid LUN" },
145*53901Smckusick 	{ 0x26, 0, "Invalid field in Parameter List" },
146*53901Smckusick 	{ 0x27, 0, "Write Protected" },
147*53901Smckusick 	{ 0x28, 1, "Medium Changed" },
148*53901Smckusick 	{ 0x29, 1, "Power On or Reset or Bus Device Reset Occured" },
149*53901Smckusick 	{ 0x2a, 1, "Mode Select Parameters Changed" },
150*53901Smckusick /*HD*/	{ 0x2b, 0, "Host cannot Disconnect" },
151*53901Smckusick 
152*53901Smckusick 	{ 0x31, 0, "Medium Format Corrupted" },
153*53901Smckusick 	{ 0x32, 0, "No Defect Spare Location Available" },
154*53901Smckusick 
155*53901Smckusick /*MO*/	{ 0x38, 1, "Recovered with Automatic Reallocation" },
156*53901Smckusick /*MO*/	{ 0x39, 0, "Automatic Reallocation Failure" },
157*53901Smckusick /*MO*/	{ 0x3a, 1, "Defect List Update Failure" },
158*53901Smckusick 
159*53901Smckusick /*MO*/	{ 0x3d, 0, "Defect List Not Available" },
160*53901Smckusick 
161*53901Smckusick /*HD*/	{ 0x40, 0, "RAM failure" },
162*53901Smckusick /*HD*/	{ 0x41, 0, "Data Path diagnostic failure" },
163*53901Smckusick 	{ 0x42, 0, "Power On Diagnostic Failure" },
164*53901Smckusick 	{ 0x43, 0, "Message Reject Error" },
165*53901Smckusick 	{ 0x44, 9, "Internal Controller Error" },
166*53901Smckusick /*HD*/	{ 0x45, 0, "Selection/Reselection failure" },
167*53901Smckusick 
168*53901Smckusick 	{ 0x47, 0, "SCSI Interface Parity Error" },
169*53901Smckusick 	{ 0x48, 0, "Initiator Detected Error" },
170*53901Smckusick 	{ 0x49, 0, "Inappropriate/Illegal Message" },
171*53901Smckusick 
172*53901Smckusick 	{ 0x64, 1, "Illegal mode for this track" },
173*53901Smckusick 
174*53901Smckusick 	{ -1,   0, (caddr_t)0 }
175*53901Smckusick };
176*53901Smckusick #else /* NO_SHRINK_RSENSE_MSG */
177*53901Smckusick struct msg_list ecodelist[] = {
178*53901Smckusick 	{ 0x00, 9, NULL },
179*53901Smckusick /*HD*/	{ 0x01, 1, NULL },
180*53901Smckusick 	{ 0x02, 0, NULL },
181*53901Smckusick 	{ 0x03, 0, NULL },
182*53901Smckusick 	{ 0x04, 9, NULL },
183*53901Smckusick 	{ 0x05, 0, NULL },
184*53901Smckusick /*HD*/	{ 0x06, 0, NULL },
185*53901Smckusick 	{ 0x07, 0, NULL },
186*53901Smckusick 	{ 0x08, 0, NULL },
187*53901Smckusick 	{ 0x09, 2, NULL },
188*53901Smckusick /*MO*/	{ 0x0a, 1, NULL },
189*53901Smckusick /*MO*/	{ 0x0b, 1, NULL },
190*53901Smckusick /*MO*/	{ 0x0c, 1, NULL },
191*53901Smckusick /*MO*/	{ 0x0d, 1, NULL },
192*53901Smckusick /*MO*/	{ 0x0e, 1, NULL },
193*53901Smckusick /*MO*/	{ 0x0f, 0, NULL },
194*53901Smckusick 	{ 0x10, 1, NULL },
195*53901Smckusick 	{ 0x11, 0, NULL },
196*53901Smckusick /*HD*/	{ 0x12, 0, NULL },
197*53901Smckusick /*HD*/	{ 0x13, 0, NULL },
198*53901Smckusick /*HD*/	{ 0x14, 0, NULL },
199*53901Smckusick 	{ 0x15, 1, NULL },
200*53901Smckusick 
201*53901Smckusick /*HD*/	{ 0x17, 0, NULL },
202*53901Smckusick 	{ 0x18, 0, NULL },
203*53901Smckusick /*HD*/	{ 0x19, 0, NULL },
204*53901Smckusick /*HD*/	{ 0x1a, 0, NULL },
205*53901Smckusick /*HD*/	{ 0x1b, 0, NULL },
206*53901Smckusick /*HD*/	{ 0x1c, 0, NULL },
207*53901Smckusick /*HD*/	{ 0x1d, 0, NULL },
208*53901Smckusick 
209*53901Smckusick 	{ 0x20, 0, NULL },
210*53901Smckusick 	{ 0x21, 0, NULL },
211*53901Smckusick /*HD*/	{ 0x22, 0, NULL },
212*53901Smckusick /*MO*/	{ 0x23, 0, NULL },
213*53901Smckusick 	{ 0x24, 0, NULL },
214*53901Smckusick 	{ 0x25, 0, NULL },
215*53901Smckusick 	{ 0x26, 0, NULL },
216*53901Smckusick 	{ 0x27, 0, NULL },
217*53901Smckusick 	{ 0x28, 1, NULL },
218*53901Smckusick 	{ 0x29, 1, NULL },
219*53901Smckusick 	{ 0x2a, 1, NULL },
220*53901Smckusick /*HD*/	{ 0x2b, 0, NULL },
221*53901Smckusick 
222*53901Smckusick 	{ 0x31, 0, NULL },
223*53901Smckusick 	{ 0x32, 0, NULL },
224*53901Smckusick 
225*53901Smckusick /*MO*/	{ 0x38, 1, NULL },
226*53901Smckusick /*MO*/	{ 0x39, 0, NULL },
227*53901Smckusick /*MO*/	{ 0x3a, 1, NULL },
228*53901Smckusick 
229*53901Smckusick /*MO*/	{ 0x3d, 0, NULL },
230*53901Smckusick 
231*53901Smckusick /*HD*/	{ 0x40, 0, NULL },
232*53901Smckusick /*HD*/	{ 0x41, 0, NULL },
233*53901Smckusick 	{ 0x42, 0, NULL },
234*53901Smckusick 	{ 0x43, 0, NULL },
235*53901Smckusick 	{ 0x44, 9, NULL },
236*53901Smckusick /*HD*/	{ 0x45, 0, NULL },
237*53901Smckusick 
238*53901Smckusick 	{ 0x47, 0, NULL },
239*53901Smckusick 	{ 0x48, 0, NULL },
240*53901Smckusick 	{ 0x49, 0, NULL },
241*53901Smckusick 
242*53901Smckusick 	{ 0x64, 1, NULL },
243*53901Smckusick 
244*53901Smckusick 	{ -1,   0, NULL }
245*53901Smckusick };
246*53901Smckusick #endif /* NO_SHRINK_RSENSE_MSG */
247*53901Smckusick 
248*53901Smckusick /*
249*53901Smckusick  * Init a scsi bus.
250*53901Smckusick  */
251*53901Smckusick scop_init(scn)
252*53901Smckusick 	int	scn;
253*53901Smckusick {
254*53901Smckusick 	static struct scsi sc;
255*53901Smckusick 	int chan;
256*53901Smckusick 
257*53901Smckusick 	for (chan = 0; chan < MAXCTLR; chan++) {
258*53901Smckusick 		bzero((caddr_t)&sc, sizeof(struct scsi));
259*53901Smckusick 		sc.sc_cdb.un_reserved[0] = SCOP_RESET;
260*53901Smckusick 		sc.sc_cdb.un_reserved[1] = SCOP_RESET;
261*53901Smckusick 
262*53901Smckusick 		if (!sc_busy(chan)) {
263*53901Smckusick 			sc_go(chan, (struct scsi *)&sc, SCSI_INTDIS);
264*53901Smckusick 
265*53901Smckusick 			chan = (chan / 8 + 1) * 8;
266*53901Smckusick 		}
267*53901Smckusick 	}
268*53901Smckusick }
269*53901Smckusick 
270*53901Smckusick /**************************************
271*53901Smckusick 	The multiple scsi bus is NOT suported by following routines.
272*53901Smckusick 	How about use inter like dev_t ( uper is scsi#, lower is inter )
273*53901Smckusick 	or hb_ctlr.
274*53901Smckusick 	probe() ga futatuarukara unit# ----- udauda.
275*53901Smckusick **************************************/
276*53901Smckusick 
277*53901Smckusick /*
278*53901Smckusick  * scprobe. probe routine for mass storage controller.
279*53901Smckusick  */
280*53901Smckusick scprobe(im, ctlrintr, sc)
281*53901Smckusick 	struct iop/**/_ctlr *im;
282*53901Smckusick 	int (*ctlrintr)();
283*53901Smckusick 	register struct scsi *sc;
284*53901Smckusick {
285*53901Smckusick 	register struct scintsw *sci;
286*53901Smckusick 	int s;
287*53901Smckusick #ifdef DEBUG_LOSSBSY_HUNG
288*53901Smckusick 	int retry = 0;
289*53901Smckusick #endif DEBUG_LOSSBSY_HUNG
290*53901Smckusick 
291*53901Smckusick 	sci = &scintsw[im->im_intr];
292*53901Smckusick 	if (sci->sci_inthandler)
293*53901Smckusick 		return (0);
294*53901Smckusick 
295*53901Smckusick #ifdef DEBUG_LOSSBSY_HUNG
296*53901Smckusick scprobe_loop:
297*53901Smckusick 	/* s = splsc(); */
298*53901Smckusick 	scop_inquiry(im->im_intr, sc, 0, SCSI_INTDIS, 4, (caddr_t)0);
299*53901Smckusick 	/* splx(s); */
300*53901Smckusick 
301*53901Smckusick 	if (sc->sc_istatus != INST_EP) {
302*53901Smckusick 		if ((sc->sc_tstatus == TGST_BUSY) && (retry++ < PROBE_MAXRETRY)) {
303*53901Smckusick 			goto scprobe_loop;
304*53901Smckusick 		}
305*53901Smckusick 		return (0);
306*53901Smckusick 	}
307*53901Smckusick 
308*53901Smckusick #else /* DEBUG_LOSSBSY_HUNG */
309*53901Smckusick 
310*53901Smckusick 	/* s = splsc(); */
311*53901Smckusick 	scop_inquiry(im->im_intr, sc, 0, SCSI_INTDIS, 4, (caddr_t)0);
312*53901Smckusick 	/* splx(s); */
313*53901Smckusick 
314*53901Smckusick 	if (sc->sc_istatus != INST_EP)
315*53901Smckusick 		return (0);
316*53901Smckusick 
317*53901Smckusick #endif /* DEBUG_LOSSBSY_HUNG */
318*53901Smckusick 
319*53901Smckusick 	sci->sci_inthandler = ctlrintr;
320*53901Smckusick 	sci->sci_ctlr = im->im_ctlr;
321*53901Smckusick 	return (1);
322*53901Smckusick }
323*53901Smckusick 
324*53901Smckusick /*
325*53901Smckusick  * ssprobe. probe routine for non-mass storage peripherals.
326*53901Smckusick  */
327*53901Smckusick ssprobe(ii, ctlrintr, sc)
328*53901Smckusick 	struct iop/**/_device *ii;
329*53901Smckusick 	int (*ctlrintr)();
330*53901Smckusick 	register struct scsi *sc;
331*53901Smckusick {
332*53901Smckusick 	register struct scintsw *sci;
333*53901Smckusick 	int s;
334*53901Smckusick 
335*53901Smckusick 	sci = &scintsw[ii->ii_intr];
336*53901Smckusick 	if (sci->sci_inthandler)
337*53901Smckusick 		return (0);
338*53901Smckusick 
339*53901Smckusick 	/* s = splsc(); */
340*53901Smckusick 	scop_inquiry(ii->ii_intr, sc, 0, SCSI_INTDIS, 4, (caddr_t)0);
341*53901Smckusick 	/* splx(s); */
342*53901Smckusick 
343*53901Smckusick 	if (sc->sc_istatus != INST_EP)
344*53901Smckusick 		return (0);
345*53901Smckusick 
346*53901Smckusick 	sci->sci_inthandler = ctlrintr;
347*53901Smckusick 	sci->sci_ctlr = ii->ii_unit;
348*53901Smckusick 	return (1);
349*53901Smckusick }
350*53901Smckusick 
351*53901Smckusick /*
352*53901Smckusick  * SCOP_TST request
353*53901Smckusick  */
354*53901Smckusick scop_tst(intr, sc, slave, ie)
355*53901Smckusick 	register int intr;
356*53901Smckusick 	register struct scsi *sc;
357*53901Smckusick 	register int slave;
358*53901Smckusick 	register int ie;
359*53901Smckusick {
360*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
361*53901Smckusick 
362*53901Smckusick 	/* sc_cdb */
363*53901Smckusick 	sc->sc_opcode = SCOP_TST;
364*53901Smckusick 
365*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
366*53901Smckusick }
367*53901Smckusick 
368*53901Smckusick /*
369*53901Smckusick  * SCOP_REZERO request
370*53901Smckusick  */
371*53901Smckusick scop_rezero(intr, sc, slave, ie)
372*53901Smckusick 	register int intr;
373*53901Smckusick 	register struct scsi *sc;
374*53901Smckusick 	register int slave;
375*53901Smckusick 	register int ie;
376*53901Smckusick {
377*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
378*53901Smckusick 
379*53901Smckusick 	/* sc_cdb */
380*53901Smckusick 	sc->sc_opcode = SCOP_REZERO;
381*53901Smckusick 
382*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
383*53901Smckusick }
384*53901Smckusick 
385*53901Smckusick /*
386*53901Smckusick  * SCOP_REWIND request
387*53901Smckusick  */
388*53901Smckusick scop_rewind(intr, sc, slave, ie, imme)
389*53901Smckusick 	register int intr;
390*53901Smckusick 	register struct scsi *sc;
391*53901Smckusick 	register int slave;
392*53901Smckusick 	register int ie, imme;
393*53901Smckusick {
394*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
395*53901Smckusick 
396*53901Smckusick 	/* sc_cdb */
397*53901Smckusick 	sc->sc_opcode = SCOP_REZERO;
398*53901Smckusick 	sc->sc_tucode = imme;
399*53901Smckusick 
400*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
401*53901Smckusick }
402*53901Smckusick 
403*53901Smckusick /*
404*53901Smckusick  * SCOP_RSENSE request
405*53901Smckusick  */
406*53901Smckusick scop_rsense(intr, sc, slave, ie, count, param)
407*53901Smckusick 	register int intr;
408*53901Smckusick 	register struct scsi *sc;
409*53901Smckusick 	register int slave;
410*53901Smckusick 	register int ie;
411*53901Smckusick 	register int count;
412*53901Smckusick 	register caddr_t param;
413*53901Smckusick {
414*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
415*53901Smckusick 
416*53901Smckusick 	sc->sc_cpoint = (u_char *)param;
417*53901Smckusick 	sc->sc_ctrnscnt = count;
418*53901Smckusick 
419*53901Smckusick 	/* sc_cdb */
420*53901Smckusick 	sc->sc_opcode = SCOP_RSENSE;
421*53901Smckusick 	sc->sc_count = count;
422*53901Smckusick 
423*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
424*53901Smckusick }
425*53901Smckusick 
426*53901Smckusick /*
427*53901Smckusick  * SCOP_RASBLK request
428*53901Smckusick  */
429*53901Smckusick scop_rasblk(intr, sc, slave, ie, lad)
430*53901Smckusick 	register int intr;
431*53901Smckusick 	register struct scsi *sc;
432*53901Smckusick 	register int slave;
433*53901Smckusick 	register int ie;
434*53901Smckusick 	register int lad;
435*53901Smckusick {
436*53901Smckusick 	struct sc_rab *sca = (struct sc_rab *)sc->sc_param;
437*53901Smckusick 
438*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
439*53901Smckusick 
440*53901Smckusick 	sca->sca_dllen = 4;
441*53901Smckusick 	sca->sca_dlad[0] = lad;
442*53901Smckusick 	sc->sc_cpoint = (u_char *)sca;
443*53901Smckusick 
444*53901Smckusick 	sc->sc_ctrnscnt = 8;
445*53901Smckusick 
446*53901Smckusick 	/* sc_cdb */
447*53901Smckusick 	sc->sc_opcode = SCOP_RASBLK;
448*53901Smckusick 
449*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
450*53901Smckusick }
451*53901Smckusick 
452*53901Smckusick /*
453*53901Smckusick  * SCOP_MERASE request
454*53901Smckusick  */
455*53901Smckusick scop_merase(intr, sc, slave, ie, count)
456*53901Smckusick 	register int intr;
457*53901Smckusick 	register struct scsi *sc;
458*53901Smckusick 	register int slave;
459*53901Smckusick 	register int ie;
460*53901Smckusick 	register int count;
461*53901Smckusick {
462*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
463*53901Smckusick 
464*53901Smckusick 	/* sc_cdb */
465*53901Smckusick 	sc->sc_opcode = SCOP_MERASE;
466*53901Smckusick 	sc->sc_mtcount3 = count;
467*53901Smckusick 
468*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
469*53901Smckusick }
470*53901Smckusick 
471*53901Smckusick /*
472*53901Smckusick  * SCOP_WFMARK request
473*53901Smckusick  */
474*53901Smckusick scop_wfmark(intr, sc, slave, ie, count)
475*53901Smckusick 	register int intr;
476*53901Smckusick 	register struct scsi *sc;
477*53901Smckusick 	register int slave;
478*53901Smckusick 	register int ie;
479*53901Smckusick 	register int count;
480*53901Smckusick {
481*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
482*53901Smckusick 
483*53901Smckusick 	/* sc_cdb */
484*53901Smckusick 	sc->sc_opcode = SCOP_WFMARK;
485*53901Smckusick 	count &= 0xffffff;
486*53901Smckusick 	sc->sc_tucount3 = count & 0xff;
487*53901Smckusick 	count >>= 8;
488*53901Smckusick 	sc->sc_tucount2 = count & 0xff;
489*53901Smckusick 	count >>= 8;
490*53901Smckusick 	sc->sc_tucount1 = count & 0xff;
491*53901Smckusick 
492*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
493*53901Smckusick }
494*53901Smckusick 
495*53901Smckusick /*
496*53901Smckusick  * SCOP_SPACE request
497*53901Smckusick  */
498*53901Smckusick scop_space(intr, sc, slave, ie, count, code)
499*53901Smckusick 	register int intr;
500*53901Smckusick 	register struct scsi *sc;
501*53901Smckusick 	register int slave;
502*53901Smckusick 	register int ie;
503*53901Smckusick 	register int count;
504*53901Smckusick 	register int code;
505*53901Smckusick {
506*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
507*53901Smckusick 
508*53901Smckusick 	/* sc_cdb */
509*53901Smckusick 	sc->sc_opcode = SCOP_SPACE;
510*53901Smckusick 	sc->sc_tucode = code;
511*53901Smckusick 	count &= 0xffffff;
512*53901Smckusick 	sc->sc_tucount3 = count & 0xff;
513*53901Smckusick 	count >>= 8;
514*53901Smckusick 	sc->sc_tucount2 = count & 0xff;
515*53901Smckusick 	count >>= 8;
516*53901Smckusick 	sc->sc_tucount1 = count & 0xff;
517*53901Smckusick 
518*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
519*53901Smckusick }
520*53901Smckusick 
521*53901Smckusick /*
522*53901Smckusick  * SCOP_INQUIRY request
523*53901Smckusick  */
524*53901Smckusick scop_inquiry(intr, sc, slave, ie, count, param)
525*53901Smckusick 	register int intr;
526*53901Smckusick 	register struct scsi *sc;
527*53901Smckusick 	register int slave;
528*53901Smckusick 	register int ie;
529*53901Smckusick 	register int count;
530*53901Smckusick 	register caddr_t param;
531*53901Smckusick {
532*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
533*53901Smckusick 
534*53901Smckusick 	sc->sc_cpoint = (u_char *)param;
535*53901Smckusick 	sc->sc_ctrnscnt = count;
536*53901Smckusick 
537*53901Smckusick 	/* sc_cdb */
538*53901Smckusick 	sc->sc_opcode = SCOP_INQUIRY;
539*53901Smckusick 	sc->sc_count = count;
540*53901Smckusick 
541*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
542*53901Smckusick }
543*53901Smckusick 
544*53901Smckusick /*
545*53901Smckusick  * SCOP_STST request
546*53901Smckusick  */
547*53901Smckusick scop_stst(intr, sc, slave, ie, sw)
548*53901Smckusick 	register int intr;
549*53901Smckusick 	register struct scsi *sc;
550*53901Smckusick 	register int slave;
551*53901Smckusick 	register int ie;
552*53901Smckusick 	register int sw;
553*53901Smckusick {
554*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
555*53901Smckusick 
556*53901Smckusick 	/* sc_cdb */
557*53901Smckusick 	sc->sc_opcode = SCOP_STST;
558*53901Smckusick 	sc->sc_switch = sw;
559*53901Smckusick 
560*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
561*53901Smckusick }
562*53901Smckusick 
563*53901Smckusick /*
564*53901Smckusick  * SCOP_RCAP request
565*53901Smckusick  */
566*53901Smckusick scop_rcap(intr, sc, slave, ie, count, param)
567*53901Smckusick 	register int intr;
568*53901Smckusick 	register struct scsi *sc;
569*53901Smckusick 	register int slave;
570*53901Smckusick 	register int ie;
571*53901Smckusick 	register int count;
572*53901Smckusick 	register caddr_t param;
573*53901Smckusick {
574*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
575*53901Smckusick 
576*53901Smckusick 	sc->sc_cpoint = (u_char *)param;
577*53901Smckusick 	sc->sc_ctrnscnt = count;
578*53901Smckusick 
579*53901Smckusick 	/* sc_cdb */
580*53901Smckusick 	sc->sc_opcode = SCOP_RCAP;
581*53901Smckusick 	sc->sc_pmi = OFF;
582*53901Smckusick 
583*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
584*53901Smckusick }
585*53901Smckusick 
586*53901Smckusick /*
587*53901Smckusick  * SCOP_BSSRCH request
588*53901Smckusick  */
589*53901Smckusick scop_bssrch(intr, sc, slave, ie, count, param)
590*53901Smckusick 	register int intr;
591*53901Smckusick 	register struct scsi *sc;
592*53901Smckusick 	register int slave;
593*53901Smckusick 	register int ie;
594*53901Smckusick 	register int count;
595*53901Smckusick 	register caddr_t param;
596*53901Smckusick {
597*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
598*53901Smckusick 
599*53901Smckusick 	sc->sc_cpoint = (u_char *)param;
600*53901Smckusick 	sc->sc_ctrnscnt = count;
601*53901Smckusick 
602*53901Smckusick 	/* sc_cdb */
603*53901Smckusick 	sc->sc_opcode = SCOP_BSSRCH;
604*53901Smckusick 	sc->sc_ladhi = *(short *)param;
605*53901Smckusick 	sc->sc_ladlo = *(short *)(param + 2);
606*53901Smckusick 
607*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
608*53901Smckusick }
609*53901Smckusick 
610*53901Smckusick /*
611*53901Smckusick  * SCOP_WSSRCH request
612*53901Smckusick  */
613*53901Smckusick scop_wssrch(intr, sc, slave, ie, count, param)
614*53901Smckusick 	register int intr;
615*53901Smckusick 	register struct scsi *sc;
616*53901Smckusick 	register int slave;
617*53901Smckusick 	register int ie;
618*53901Smckusick 	register int count;
619*53901Smckusick 	register caddr_t param;
620*53901Smckusick {
621*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
622*53901Smckusick 
623*53901Smckusick 	sc->sc_cpoint = (u_char *)param;
624*53901Smckusick 	sc->sc_ctrnscnt = count;
625*53901Smckusick 
626*53901Smckusick 	/* sc_cdb */
627*53901Smckusick 	sc->sc_opcode = SCOP_WSSRCH;
628*53901Smckusick 	sc->sc_ladhi = *(short *)param;
629*53901Smckusick 	sc->sc_ladlo = *(short *)(param + 2);
630*53901Smckusick 
631*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
632*53901Smckusick }
633*53901Smckusick 
634*53901Smckusick /*
635*53901Smckusick  *
636*53901Smckusick  * SCOP_EESENSE request
637*53901Smckusick  * Enable/Disable Eject Request Sense
638*53901Smckusick  * Write Once only supported.
639*53901Smckusick  *
640*53901Smckusick  */
641*53901Smckusick scop_eesense(intr, sc, slave, ie, sw)
642*53901Smckusick 	register int intr;
643*53901Smckusick 	register struct scsi *sc;
644*53901Smckusick 	register int slave;
645*53901Smckusick 	register int ie;
646*53901Smckusick 	register int sw;
647*53901Smckusick {
648*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
649*53901Smckusick 
650*53901Smckusick 	/* sc_cdb */
651*53901Smckusick 	sc->sc_opcode = SCOP_EESENSE;
652*53901Smckusick 	sc->sc_switch = sw;
653*53901Smckusick 
654*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
655*53901Smckusick }
656*53901Smckusick 
657*53901Smckusick /*
658*53901Smckusick  * SCOP_EJECT
659*53901Smckusick  */
660*53901Smckusick scop_eject(intr, sc, slave, ie)
661*53901Smckusick 	register int intr;
662*53901Smckusick 	register struct scsi *sc;
663*53901Smckusick 	register int slave;
664*53901Smckusick 	register int ie;
665*53901Smckusick {
666*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
667*53901Smckusick 
668*53901Smckusick 	/* sc_cdb */
669*53901Smckusick 	sc->sc_opcode = SCOP_EJECT;
670*53901Smckusick 
671*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
672*53901Smckusick }
673*53901Smckusick 
674*53901Smckusick /*
675*53901Smckusick  * SCOP_RBLIM request
676*53901Smckusick  */
677*53901Smckusick scop_rblim(intr, sc, slave, ie, count, param)
678*53901Smckusick 	register int intr;
679*53901Smckusick 	register struct scsi *sc;
680*53901Smckusick 	register int slave;
681*53901Smckusick 	register int ie;
682*53901Smckusick 	register int count;
683*53901Smckusick 	register caddr_t param;
684*53901Smckusick {
685*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
686*53901Smckusick 
687*53901Smckusick 	sc->sc_cpoint = (u_char *)param;
688*53901Smckusick 	sc->sc_ctrnscnt = count & 0xff;
689*53901Smckusick 
690*53901Smckusick 	/* sc_cdb */
691*53901Smckusick 	sc->sc_opcode = SCOP_RBLIM;
692*53901Smckusick 
693*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
694*53901Smckusick }
695*53901Smckusick 
696*53901Smckusick /*
697*53901Smckusick  * SCOP_MSENSE request
698*53901Smckusick  */
699*53901Smckusick scop_msense(intr, sc, slave, ie, count, param)
700*53901Smckusick 	register int intr;
701*53901Smckusick 	register struct scsi *sc;
702*53901Smckusick 	register int slave;
703*53901Smckusick 	register int ie;
704*53901Smckusick 	register int count;
705*53901Smckusick 	register caddr_t param;
706*53901Smckusick {
707*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
708*53901Smckusick 
709*53901Smckusick 	sc->sc_cpoint = (u_char *)param;
710*53901Smckusick 	sc->sc_ctrnscnt = count & 0xff;
711*53901Smckusick 
712*53901Smckusick 	/* sc_cdb */
713*53901Smckusick 	sc->sc_opcode = SCOP_MSENSE;
714*53901Smckusick 	sc->sc_lad = count >> 8;
715*53901Smckusick 	sc->sc_count = count & 0xff;
716*53901Smckusick 
717*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
718*53901Smckusick }
719*53901Smckusick 
720*53901Smckusick /*
721*53901Smckusick  * SCOP_MSELECT request
722*53901Smckusick  */
723*53901Smckusick scop_mselect(intr, sc, slave, ie, count, param)
724*53901Smckusick 	register int intr;
725*53901Smckusick 	register struct scsi *sc;
726*53901Smckusick 	register int slave;
727*53901Smckusick 	register int ie;
728*53901Smckusick 	register int count;
729*53901Smckusick 	register caddr_t param;
730*53901Smckusick {
731*53901Smckusick 	u_char psave[20];
732*53901Smckusick 
733*53901Smckusick 	bcopy((caddr_t)sc->sc_param, (caddr_t)psave, 20);
734*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
735*53901Smckusick 	bcopy((caddr_t)psave, (caddr_t)sc->sc_param, 20);
736*53901Smckusick 
737*53901Smckusick 	sc->sc_cpoint = (u_char *)param;
738*53901Smckusick 	sc->sc_ctrnscnt = count & 0xff;
739*53901Smckusick 
740*53901Smckusick 	/* sc_cdb */
741*53901Smckusick 	sc->sc_opcode = SCOP_MSELECT;
742*53901Smckusick 	sc->sc_lad = count >> 8;
743*53901Smckusick 	sc->sc_count = count & 0xff;
744*53901Smckusick 
745*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
746*53901Smckusick }
747*53901Smckusick 
748*53901Smckusick #ifdef SRD_MSELECT
749*53901Smckusick /*
750*53901Smckusick  * SCOP_MSELECT request
751*53901Smckusick  */
752*53901Smckusick scop_msense_OTHER_HD(intr, sc, slave, ie, count, param)
753*53901Smckusick 	register int intr;
754*53901Smckusick 	register struct scsi *sc;
755*53901Smckusick 	register int slave;
756*53901Smckusick 	register int ie;
757*53901Smckusick 	register int count;
758*53901Smckusick 	register caddr_t param;
759*53901Smckusick {
760*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
761*53901Smckusick 
762*53901Smckusick 	sc->sc_cpoint = (u_char *)param;
763*53901Smckusick 	sc->sc_ctrnscnt = count;
764*53901Smckusick 
765*53901Smckusick 	/* sc_cdb */
766*53901Smckusick 	sc->sc_opcode = SCOP_MSENSE;
767*53901Smckusick 	sc->sc_count = count;
768*53901Smckusick 	sc->sc_lad = 0x3f00;
769*53901Smckusick 
770*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
771*53901Smckusick }
772*53901Smckusick 
773*53901Smckusick /*
774*53901Smckusick  * SCOP_MSELECT request
775*53901Smckusick  */
776*53901Smckusick scop_mselect_OTHER_HD(intr, sc, slave, ie, count, param)
777*53901Smckusick 	register int intr;
778*53901Smckusick 	register struct scsi *sc;
779*53901Smckusick 	register int slave;
780*53901Smckusick 	register int ie;
781*53901Smckusick 	register int count;
782*53901Smckusick 	register caddr_t param;
783*53901Smckusick {
784*53901Smckusick 	u_char psave[20];
785*53901Smckusick 
786*53901Smckusick 	bcopy((caddr_t)sc->sc_param, (caddr_t)psave, 20);
787*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
788*53901Smckusick 	bcopy((caddr_t)psave, (caddr_t)sc->sc_param, 20);
789*53901Smckusick 
790*53901Smckusick 	sc->sc_cpoint = (u_char *)param;
791*53901Smckusick 	sc->sc_ctrnscnt = count;
792*53901Smckusick 
793*53901Smckusick 	/* sc_cdb */
794*53901Smckusick 	sc->sc_opcode = SCOP_MSELECT;
795*53901Smckusick 	sc->sc_count = count;
796*53901Smckusick 	sc->sc_lad = 0;
797*53901Smckusick 
798*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
799*53901Smckusick }
800*53901Smckusick #endif SRD_MSELECT
801*53901Smckusick 
802*53901Smckusick scop_erase(intr, sc, slave, ie)
803*53901Smckusick 	register int intr;
804*53901Smckusick 	register struct scsi *sc;
805*53901Smckusick 	register int slave;
806*53901Smckusick 	register int ie;
807*53901Smckusick {
808*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
809*53901Smckusick 
810*53901Smckusick 	/* sc_cdb */
811*53901Smckusick 	sc->sc_opcode = SCOP_ERASE;
812*53901Smckusick 	sc->sc_tucode = 1;
813*53901Smckusick 
814*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
815*53901Smckusick }
816*53901Smckusick 
817*53901Smckusick /*
818*53901Smckusick  * One sector programmed I/O
819*53901Smckusick  */
820*53901Smckusick scop_rdwr(intr, sc, slave, ie, flag, addr, lba, sectsize)
821*53901Smckusick 	int	intr;
822*53901Smckusick 	register struct scsi	*sc;
823*53901Smckusick 	int	slave;
824*53901Smckusick 	int	ie;
825*53901Smckusick 	int	flag;
826*53901Smckusick 	caddr_t	addr;
827*53901Smckusick 	int	lba;
828*53901Smckusick 	int	sectsize;
829*53901Smckusick {
830*53901Smckusick 	scinit(sc, slave, sectsize);
831*53901Smckusick 
832*53901Smckusick 	sc->sc_cpoint = (u_char *)addr;
833*53901Smckusick 	sc->sc_ctrnscnt = sectsize;
834*53901Smckusick 
835*53901Smckusick 	/* sc_cdb */
836*53901Smckusick 	sc->sc_opcode = (flag & B_READ) ? SCOP_READ : SCOP_WRITE;
837*53901Smckusick 	sc->sc_lad = lba;
838*53901Smckusick 	sc->sc_count = 1;
839*53901Smckusick 
840*53901Smckusick 	sc_go(intr, sc, ie);
841*53901Smckusick }
842*53901Smckusick 
843*53901Smckusick /*
844*53901Smckusick  * Medium allow/prevent removable
845*53901Smckusick  */
846*53901Smckusick scop_medrmv(intr, sc, slave, ie, sw)
847*53901Smckusick 	register int intr;
848*53901Smckusick 	register struct scsi *sc;
849*53901Smckusick 	register int slave;
850*53901Smckusick 	register int ie;
851*53901Smckusick 	register int sw;
852*53901Smckusick {
853*53901Smckusick 	scinit(sc, slave, DEV_BSIZE);
854*53901Smckusick 
855*53901Smckusick 	/* sc_cdb */
856*53901Smckusick 	sc->sc_opcode = SCOP_MEDRMV;
857*53901Smckusick 	sc->sc_count = sw;
858*53901Smckusick 
859*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
860*53901Smckusick }
861*53901Smckusick 
862*53901Smckusick /*
863*53901Smckusick  * initialize struct scsi
864*53901Smckusick  */
865*53901Smckusick scinit(sc, slave, sectsize)
866*53901Smckusick 	register struct scsi *sc;
867*53901Smckusick 	int	slave;
868*53901Smckusick 	int	sectsize;
869*53901Smckusick {
870*53901Smckusick 	bzero((caddr_t)sc, sizeof(struct scsi));
871*53901Smckusick 
872*53901Smckusick 	sc->sc_identify = MSG_IDENT|Scsi_Disconnect|(slave & IDT_DRMASK);
873*53901Smckusick 	sc->sc_bytesec = sectsize;
874*53901Smckusick 	sc->sc_lun = slave;
875*53901Smckusick }
876*53901Smckusick 
877*53901Smckusick 
878*53901Smckusick /*
879*53901Smckusick  * ABORT MESSAGE
880*53901Smckusick  */
881*53901Smckusick scms_abort(intr, sc, slave, ie)
882*53901Smckusick 	register int intr;
883*53901Smckusick 	register struct scsi *sc;
884*53901Smckusick 	register int slave;
885*53901Smckusick 	register int ie;
886*53901Smckusick {
887*53901Smckusick 	bzero((caddr_t)sc, sizeof(struct scsi));
888*53901Smckusick 
889*53901Smckusick 	sc->sc_identify = MSG_ABORT;
890*53901Smckusick 
891*53901Smckusick 	/* sc_cdb */
892*53901Smckusick 	sc->sc_opcode = SCOP_TST;
893*53901Smckusick 	sc->sc_lun = slave;
894*53901Smckusick 
895*53901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
896*53901Smckusick }
897*53901Smckusick 
898*53901Smckusick sc_go(intr, sc, ie)
899*53901Smckusick 	int intr;
900*53901Smckusick 	struct scsi *sc;
901*53901Smckusick 	int ie;
902*53901Smckusick {
903*53901Smckusick 	register struct sc_data *scdp;
904*53901Smckusick 
905*53901Smckusick 	scdp = &sc_data[intr];
906*53901Smckusick 
907*53901Smckusick 	if (sc->sc_cpoint)
908*53901Smckusick 		scdp->scd_vaddr = (char *)sc->sc_cpoint;
909*53901Smckusick 	else
910*53901Smckusick 		scdp->scd_vaddr = (char *)sc->sc_param;
911*53901Smckusick 	scdp->scd_procp = curproc;
912*53901Smckusick 	scdp->scd_scaddr = (char *)sc;
913*53901Smckusick 	scdp->scd_count = sc->sc_ctrnscnt;
914*53901Smckusick 	sc->sc_cpoint = (u_char *)ipc_phys(scdp->scd_vaddr);
915*53901Smckusick 
916*53901Smckusick 	_sc_go(intr, sc, ie);
917*53901Smckusick 
918*53901Smckusick 	if((ie & SCSI_INTEN) == 0) {
919*53901Smckusick #ifdef mips
920*53901Smckusick 	/* if (DATAIN_PHASE_FINISHED) */
921*53901Smckusick 	MachFlushDCache(scdp->scd_scaddr, sizeof (struct scsi));
922*53901Smckusick 	if (MACH_IS_USPACE(scdp->scd_vaddr))
923*53901Smckusick 		panic("sc_go: user address is not supported");
924*53901Smckusick 	else if (MACH_IS_CACHED(scdp->scd_vaddr))
925*53901Smckusick 		MachFlushDCache(scdp->scd_vaddr, scdp->scd_count);
926*53901Smckusick 	else if (MACH_IS_MAPPED(scdp->scd_vaddr))
927*53901Smckusick #ifdef notyet /* KU:XXX */
928*53901Smckusick 		clean_k2dcache(scdp->scd_vaddr, scdp->scd_count);
929*53901Smckusick #else
930*53901Smckusick 		MachFlushCache(); /* Flush all caches */
931*53901Smckusick #endif
932*53901Smckusick #endif /* mips */
933*53901Smckusick 	}
934*53901Smckusick }
935*53901Smckusick 
936*53901Smckusick #ifdef CPU_SINGLE
937*53901Smckusick _sc_go(intr, sc, ie)
938*53901Smckusick 	int intr;
939*53901Smckusick 	struct scsi *sc;
940*53901Smckusick 	int ie;
941*53901Smckusick {
942*53901Smckusick 	register int i, s;
943*53901Smckusick 
944*53901Smckusick 	if((ie & SCSI_INTEN) == 0) {
945*53901Smckusick 		scsend(intr, ie|SCSI_NOTWAIT, sc);
946*53901Smckusick 		while (sc_busy(intr)) {
947*53901Smckusick 			splx(splscon());	/* splsc -1 */
948*53901Smckusick #ifdef mc68030
949*53901Smckusick 			dcia();
950*53901Smckusick #endif
951*53901Smckusick 		}
952*53901Smckusick 	} else {
953*53901Smckusick 		scsend(intr, ie, (caddr_t)sc);
954*53901Smckusick 	}
955*53901Smckusick }
956*53901Smckusick #endif /* CPU_SINGLE */
957*53901Smckusick 
958*53901Smckusick screset(chan)
959*53901Smckusick 	int chan;
960*53901Smckusick {
961*53901Smckusick 	int i, s;
962*53901Smckusick 
963*53901Smckusick 	s = splsc();
964*53901Smckusick 	printf("SCSI: screset() called ");
965*53901Smckusick 	scop_init(chan / 8);
966*53901Smckusick 	splx(s);
967*53901Smckusick 
968*53901Smckusick 	for (s = 0; s < 10; s++) {
969*53901Smckusick 		DELAY(100000 * 10);
970*53901Smckusick 	}
971*53901Smckusick 	printf("\n");
972*53901Smckusick 	iop/**/reset();
973*53901Smckusick }
974*53901Smckusick 
975*53901Smckusick scsisetup(bp, map, nmap)
976*53901Smckusick 	struct buf *bp;
977*53901Smckusick 	struct sc_map *map;
978*53901Smckusick 	int nmap;
979*53901Smckusick {
980*53901Smckusick 	return (iop/**/setup(bp, map, nmap));
981*53901Smckusick }
982*53901Smckusick 
983*53901Smckusick 
984*53901Smckusick /*
985*53901Smckusick  * transrate skey / ecode into message display ON/OFF value
986*53901Smckusick  *	1 : display message
987*53901Smckusick  *	0 : silence
988*53901Smckusick  */
989*53901Smckusick isdispmsg(code, list, count)
990*53901Smckusick 	register int code;
991*53901Smckusick 	register struct msg_list *list;
992*53901Smckusick 	int count;
993*53901Smckusick {
994*53901Smckusick 	register int msglvl = 0;
995*53901Smckusick 
996*53901Smckusick 	while (list->ml_code >= 0) {
997*53901Smckusick 		if (code == list->ml_code) {
998*53901Smckusick 			msglvl = list->ml_msglvl;
999*53901Smckusick 			break;
1000*53901Smckusick 		}
1001*53901Smckusick 		list++;
1002*53901Smckusick 	}
1003*53901Smckusick 	return (count >= msglvl);
1004*53901Smckusick }
1005*53901Smckusick 
1006*53901Smckusick #ifdef NO_SHRINK_RSENSE_MSG
1007*53901Smckusick /*
1008*53901Smckusick  * transrate skey / ecode into message
1009*53901Smckusick  */
1010*53901Smckusick char *
1011*53901Smckusick getmsg(code, list, defmsg)
1012*53901Smckusick 	int code;
1013*53901Smckusick 	struct msg_list *list;
1014*53901Smckusick 	char *defmsg;
1015*53901Smckusick {
1016*53901Smckusick 	while (list->ml_code >= 0) {
1017*53901Smckusick 		if (code == list->ml_code)
1018*53901Smckusick 			return (list->ml_msgstr);
1019*53901Smckusick 		list++;
1020*53901Smckusick 	}
1021*53901Smckusick 	return (defmsg);
1022*53901Smckusick }
1023*53901Smckusick #endif /* NO_SHRINK_RSENSE_MSG */
1024*53901Smckusick 
1025*53901Smckusick check_chan_busy(intr, sc, slave)
1026*53901Smckusick 	register int intr;
1027*53901Smckusick 	register struct scsi *sc;
1028*53901Smckusick 	register int slave;
1029*53901Smckusick {
1030*53901Smckusick 	register struct sc_extnd *sce = (struct sc_extnd *)sc->sc_param;
1031*53901Smckusick 	int	i = 0;
1032*53901Smckusick 
1033*53901Smckusick 	if (sc->sc_istatus == INST_EP) {
1034*53901Smckusick 		switch (sc->sc_tstatus) {
1035*53901Smckusick 
1036*53901Smckusick 		case TGST_CC:
1037*53901Smckusick 			scop_rsense(intr, sc, slave, SCSI_INTDIS, 18, 0);
1038*53901Smckusick 			if (rsense_msg_disp ||
1039*53901Smckusick 			    isdispmsg(sce->sce_skey, skeylist, 0)) {
1040*53901Smckusick #ifdef NO_SHRINK_RSENSE_MSG
1041*53901Smckusick 				if (sce->sce_advalid) {
1042*53901Smckusick 					printf("SCSI%d(block %d): %s (sense key = 0x%x)\n",
1043*53901Smckusick 					intr,
1044*53901Smckusick 					(sce->sce_infob1 << 24) +
1045*53901Smckusick 					(sce->sce_infob2 << 16) +
1046*53901Smckusick 					(sce->sce_infob3 <<  8) +
1047*53901Smckusick 					(sce->sce_infob4),
1048*53901Smckusick 					getmsg(sce->sce_skey, skeylist, "(reserved)"),
1049*53901Smckusick 					sce->sce_skey);
1050*53901Smckusick 				} else {
1051*53901Smckusick 					printf("SCSI%d(unknown block): %s (sense key = 0x%x)\n",
1052*53901Smckusick 					intr,
1053*53901Smckusick 					getmsg(sce->sce_skey, skeylist, "(reserved)"),
1054*53901Smckusick 					sce->sce_skey);
1055*53901Smckusick 				}
1056*53901Smckusick #else /* NO_SHRINK_RSENSE_MSG */
1057*53901Smckusick 				if (sce->sce_advalid) {
1058*53901Smckusick 					printf("SCSI%d(sn %d): skey=0x%x)\n",
1059*53901Smckusick 					intr,
1060*53901Smckusick 					(sce->sce_infob1 << 24) +
1061*53901Smckusick 					(sce->sce_infob2 << 16) +
1062*53901Smckusick 					(sce->sce_infob3 <<  8) +
1063*53901Smckusick 					(sce->sce_infob4),
1064*53901Smckusick 					sce->sce_skey);
1065*53901Smckusick 				} else {
1066*53901Smckusick 					printf("SCSI%d: skey=0x%x)\n",
1067*53901Smckusick 					intr, sce->sce_skey);
1068*53901Smckusick 				}
1069*53901Smckusick #endif /* NO_SHRINK_RSENSE_MSG */
1070*53901Smckusick 				printf("sense data = ");
1071*53901Smckusick 				for (i = 0; i < 18; i++)
1072*53901Smckusick 					printf("%x ", sc->sc_param[i]);
1073*53901Smckusick 				printf("\n");
1074*53901Smckusick 			}
1075*53901Smckusick 			break;
1076*53901Smckusick 
1077*53901Smckusick 		case TGST_GOOD:
1078*53901Smckusick 			break;
1079*53901Smckusick 
1080*53901Smckusick 		default:
1081*53901Smckusick 			printf("SCSI%d: bad target status 0x%x\n", intr, sc->sc_tstatus);
1082*53901Smckusick 			break;
1083*53901Smckusick 		}
1084*53901Smckusick 	} else {
1085*53901Smckusick 		printf("SCSI%d: bad initiator status 0x%x\n", intr, sc->sc_istatus);
1086*53901Smckusick 	}
1087*53901Smckusick 
1088*53901Smckusick 	while (i++ < 100000) {
1089*53901Smckusick 		scop_tst(intr, sc, slave, SCSI_INTDIS);
1090*53901Smckusick 		if (sc->sc_tstatus != TGST_BUSY)
1091*53901Smckusick 			break;
1092*53901Smckusick 	}
1093*53901Smckusick 	if (i > 100000)
1094*53901Smckusick 		printf("SCSI%d: still busy after rasblk.\n", intr);
1095*53901Smckusick }
1096*53901Smckusick 
1097*53901Smckusick /***/
1098*53901Smckusick struct scsi_berr_bug_table {
1099*53901Smckusick 	int model;
1100*53901Smckusick 	int serial_l;
1101*53901Smckusick 	int serial_h;
1102*53901Smckusick 	int value;	/* 1:BUG, 0:NOBUG */
1103*53901Smckusick };
1104*53901Smckusick 
1105*53901Smckusick /***/
1106