xref: /csrg-svn/sys/news3400/iodev/scsi.c (revision 57182)
153901Smckusick /*
253901Smckusick  * Copyright (c) 1992 The Regents of the University of California.
353901Smckusick  * All rights reserved.
453901Smckusick  *
553901Smckusick  * This code is derived from software contributed to Berkeley by
653901Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
753901Smckusick  *
853901Smckusick  * %sccs.include.redist.c%
953901Smckusick  *
1053901Smckusick  * from: $Hdr: scsi.c,v 4.300 91/06/27 20:42:51 root Rel41 $ SONY
1153901Smckusick  *
12*57182Sutashiro  *	@(#)scsi.c	7.2 (Berkeley) 12/17/92
1353901Smckusick  */
1453901Smckusick 
1553901Smckusick /*
1653901Smckusick  *	scsi.c	ver 1.1
1753901Smckusick  */
1853901Smckusick 
19*57182Sutashiro #include <machine/fix_machine_type.h>
20*57182Sutashiro #include <machine/param.h>
2153901Smckusick 
22*57182Sutashiro #include <sys/param.h>
23*57182Sutashiro #include <sys/buf.h>
24*57182Sutashiro #include <sys/proc.h>
25*57182Sutashiro #include <sys/user.h>
2653901Smckusick 
27*57182Sutashiro # include <machine/cpu.h>
2853901Smckusick 
29*57182Sutashiro #include <news3400/hbdev/hbvar.h>
30*57182Sutashiro #include <news3400/hbdev/scsic.h>
31*57182Sutashiro #include <news3400/hbdev/screg_1185.h>
3253901Smckusick 
33*57182Sutashiro #include <news3400/iodev/scsireg.h>
34*57182Sutashiro #include <news3400/iodev/ioptohb.h>
3553901Smckusick 
3653901Smckusick #define DEBUG_LOSSBSY_HUNG
3753901Smckusick 
3853901Smckusick #ifdef DEBUG_LOSSBSY_HUNG
3953901Smckusick # define PROBE_MAXRETRY	100
4053901Smckusick #endif
4153901Smckusick 
4253901Smckusick #ifndef NO_SCSI_DISCONNECT
4353901Smckusick int Scsi_Disconnect = IDT_DISCON;
4453901Smckusick #else
4553901Smckusick int Scsi_Disconnect = 0;
4653901Smckusick #endif
4753901Smckusick 
4853901Smckusick # define MAXCTLR	8
4953901Smckusick struct sc_data sc_data[MAXCTLR];
5053901Smckusick struct scintsw scintsw[MAXCTLR];
5153901Smckusick 
5253901Smckusick #ifdef RSENSE_MSG_DISP
5353901Smckusick int	rsense_msg_disp = 1;	/* RSENSE-message display flag */
5453901Smckusick #else
5553901Smckusick int	rsense_msg_disp = 0;	/* RSENSE-message display flag */
5653901Smckusick #endif
5753901Smckusick 
5853901Smckusick int	mo_disp_format = 0;	/* MO format mode display flag */
5953901Smckusick 
6053901Smckusick struct msg_list {
6153901Smckusick 	int	ml_code;		/* message code */
6253901Smckusick 	int	ml_msglvl;		/* message level */
6353901Smckusick 	char	*ml_msgstr;		/* message string */
6453901Smckusick };
6553901Smckusick 
6653901Smckusick #ifdef NO_SHRINK_RSENSE_MSG
6753901Smckusick struct msg_list skeylist[] = {
6853901Smckusick 	{ 0x00,	1, "No Sense" },
6953901Smckusick 	{ 0x01,	0, "Recoverable Error" },
7053901Smckusick 	{ 0x02,	0, "Not Ready" },
7153901Smckusick 	{ 0x03,	0, "Medium Error" },
7253901Smckusick 	{ 0x04,	0, "Hardware Error" },
7353901Smckusick 	{ 0x05, 0, "Illegal Request" },
7453901Smckusick 	{ 0x06, 1, "Unit Attention" },
7553901Smckusick 	{ 0x07,	1, "Data protect" },
7653901Smckusick 	{ 0x08, 0, "Blank Check" },
7753901Smckusick 	{ 0x09,	0, "Vendor Unique" },
7853901Smckusick 	{ 0x0a,	0, "Copy/Compare Aborted" },
7953901Smckusick 	{ 0x0b, 0, "Aborted Command" },
8053901Smckusick 	{ 0x0c, 0, "Equal" },
8153901Smckusick 	{ 0x0d, 0, "Volume Overflow" },
8253901Smckusick 	{ 0x0e,	0, "Miscompare" },
8353901Smckusick 	{ -1,	0, (caddr_t)0 }
8453901Smckusick };
8553901Smckusick #else /* NO_SHRINK_RSENSE_MSG */
8653901Smckusick struct msg_list skeylist[] = {
8753901Smckusick 	{ 0x00,	1, NULL },
8853901Smckusick 	{ 0x01,	0, NULL },
8953901Smckusick 	{ 0x02,	0, NULL },
9053901Smckusick 	{ 0x03,	0, NULL },
9153901Smckusick 	{ 0x04,	0, NULL },
9253901Smckusick 	{ 0x05, 0, NULL },
9353901Smckusick 	{ 0x06, 1, NULL },
9453901Smckusick 	{ 0x07,	1, NULL },
9553901Smckusick 	{ 0x08, 0, NULL },
9653901Smckusick 	{ 0x09,	0, NULL },
9753901Smckusick 	{ 0x0a,	0, NULL },
9853901Smckusick 	{ 0x0b, 0, NULL },
9953901Smckusick 	{ 0x0c, 0, NULL },
10053901Smckusick 	{ 0x0d, 0, NULL },
10153901Smckusick 	{ 0x0e,	0, NULL },
10253901Smckusick 	{ -1,	0, NULL }
10353901Smckusick };
10453901Smckusick #endif /* NO_SHRINK_RSENSE_MSG */
10553901Smckusick 
10653901Smckusick #ifdef NO_SHRINK_RSENSE_MSG
10753901Smckusick struct msg_list ecodelist[] = {
10853901Smckusick 	{ 0x00, 9, "No Additional Sense Information" },
10953901Smckusick /*HD*/	{ 0x01, 1, "No Index/Address Mark Found signal" },
11053901Smckusick 	{ 0x02, 0, "No Seek Complete" },
11153901Smckusick 	{ 0x03, 0, "Write Fault" },
11253901Smckusick 	{ 0x04, 9, "Drive Not Ready" },
11353901Smckusick 	{ 0x05, 0, "Drive Not Selected" },
11453901Smckusick /*HD*/	{ 0x06, 0, "No Track Zero" },
11553901Smckusick 	{ 0x07, 0, "Multiple Drives Selected" },
11653901Smckusick 	{ 0x08, 0, "Logical Unit Communication Failure" },
11753901Smckusick 	{ 0x09, 2, "Track Following Error" },
11853901Smckusick /*MO*/	{ 0x0a, 1, "No Disk" },
11953901Smckusick /*MO*/	{ 0x0b, 1, "Load/Unload Failure" },
12053901Smckusick /*MO*/	{ 0x0c, 1, "Spindle Failure" },
12153901Smckusick /*MO*/	{ 0x0d, 1, "Focus Failure" },
12253901Smckusick /*MO*/	{ 0x0e, 1, "Tracking Failure" },
12353901Smckusick /*MO*/	{ 0x0f, 0, "Drive Initialization Failure" },
12453901Smckusick 	{ 0x10, 1, "ID CRC or ECC error" },
12553901Smckusick 	{ 0x11, 0, "Unrecoverd Read error" },
12653901Smckusick /*HD*/	{ 0x12, 0, "No Address Mark (byte sync byte) found in ID field" },
12753901Smckusick /*HD*/	{ 0x13, 0, "No Address Mark (byte sync byte) found in Data field" },
12853901Smckusick /*HD*/	{ 0x14, 0, "No record found" },
12953901Smckusick 	{ 0x15, 1, "Seek Positioning Error" },
13053901Smckusick 
13153901Smckusick /*HD*/	{ 0x17, 0, "Recovered Read data with Read retries" },
13253901Smckusick 	{ 0x18, 0, "Recovered Read data with ECC procedure" },
13353901Smckusick /*HD*/	{ 0x19, 0, "Defect List error" },
13453901Smckusick /*HD*/	{ 0x1a, 0, "Parameter overrun" },
13553901Smckusick /*HD*/	{ 0x1b, 0, "Synchronous transfer error" },
13653901Smckusick /*HD*/	{ 0x1c, 0, "Primary Defect List not found" },
13753901Smckusick /*HD*/	{ 0x1d, 0, "Compare error" },
13853901Smckusick 
13953901Smckusick 	{ 0x20, 0, "Invalid Command Operation Code" },
14053901Smckusick 	{ 0x21, 0, "Illegal Logical Block Address" },
14153901Smckusick /*HD*/	{ 0x22, 0, "Illegal function for device type" },
14253901Smckusick /*MO*/	{ 0x23, 0, "Illegal function for Medium Type" },
14353901Smckusick 	{ 0x24, 0, "Illegal Field in CDB" },
14453901Smckusick 	{ 0x25, 0, "Invalid LUN" },
14553901Smckusick 	{ 0x26, 0, "Invalid field in Parameter List" },
14653901Smckusick 	{ 0x27, 0, "Write Protected" },
14753901Smckusick 	{ 0x28, 1, "Medium Changed" },
14853901Smckusick 	{ 0x29, 1, "Power On or Reset or Bus Device Reset Occured" },
14953901Smckusick 	{ 0x2a, 1, "Mode Select Parameters Changed" },
15053901Smckusick /*HD*/	{ 0x2b, 0, "Host cannot Disconnect" },
15153901Smckusick 
15253901Smckusick 	{ 0x31, 0, "Medium Format Corrupted" },
15353901Smckusick 	{ 0x32, 0, "No Defect Spare Location Available" },
15453901Smckusick 
15553901Smckusick /*MO*/	{ 0x38, 1, "Recovered with Automatic Reallocation" },
15653901Smckusick /*MO*/	{ 0x39, 0, "Automatic Reallocation Failure" },
15753901Smckusick /*MO*/	{ 0x3a, 1, "Defect List Update Failure" },
15853901Smckusick 
15953901Smckusick /*MO*/	{ 0x3d, 0, "Defect List Not Available" },
16053901Smckusick 
16153901Smckusick /*HD*/	{ 0x40, 0, "RAM failure" },
16253901Smckusick /*HD*/	{ 0x41, 0, "Data Path diagnostic failure" },
16353901Smckusick 	{ 0x42, 0, "Power On Diagnostic Failure" },
16453901Smckusick 	{ 0x43, 0, "Message Reject Error" },
16553901Smckusick 	{ 0x44, 9, "Internal Controller Error" },
16653901Smckusick /*HD*/	{ 0x45, 0, "Selection/Reselection failure" },
16753901Smckusick 
16853901Smckusick 	{ 0x47, 0, "SCSI Interface Parity Error" },
16953901Smckusick 	{ 0x48, 0, "Initiator Detected Error" },
17053901Smckusick 	{ 0x49, 0, "Inappropriate/Illegal Message" },
17153901Smckusick 
17253901Smckusick 	{ 0x64, 1, "Illegal mode for this track" },
17353901Smckusick 
17453901Smckusick 	{ -1,   0, (caddr_t)0 }
17553901Smckusick };
17653901Smckusick #else /* NO_SHRINK_RSENSE_MSG */
17753901Smckusick struct msg_list ecodelist[] = {
17853901Smckusick 	{ 0x00, 9, NULL },
17953901Smckusick /*HD*/	{ 0x01, 1, NULL },
18053901Smckusick 	{ 0x02, 0, NULL },
18153901Smckusick 	{ 0x03, 0, NULL },
18253901Smckusick 	{ 0x04, 9, NULL },
18353901Smckusick 	{ 0x05, 0, NULL },
18453901Smckusick /*HD*/	{ 0x06, 0, NULL },
18553901Smckusick 	{ 0x07, 0, NULL },
18653901Smckusick 	{ 0x08, 0, NULL },
18753901Smckusick 	{ 0x09, 2, NULL },
18853901Smckusick /*MO*/	{ 0x0a, 1, NULL },
18953901Smckusick /*MO*/	{ 0x0b, 1, NULL },
19053901Smckusick /*MO*/	{ 0x0c, 1, NULL },
19153901Smckusick /*MO*/	{ 0x0d, 1, NULL },
19253901Smckusick /*MO*/	{ 0x0e, 1, NULL },
19353901Smckusick /*MO*/	{ 0x0f, 0, NULL },
19453901Smckusick 	{ 0x10, 1, NULL },
19553901Smckusick 	{ 0x11, 0, NULL },
19653901Smckusick /*HD*/	{ 0x12, 0, NULL },
19753901Smckusick /*HD*/	{ 0x13, 0, NULL },
19853901Smckusick /*HD*/	{ 0x14, 0, NULL },
19953901Smckusick 	{ 0x15, 1, NULL },
20053901Smckusick 
20153901Smckusick /*HD*/	{ 0x17, 0, NULL },
20253901Smckusick 	{ 0x18, 0, NULL },
20353901Smckusick /*HD*/	{ 0x19, 0, NULL },
20453901Smckusick /*HD*/	{ 0x1a, 0, NULL },
20553901Smckusick /*HD*/	{ 0x1b, 0, NULL },
20653901Smckusick /*HD*/	{ 0x1c, 0, NULL },
20753901Smckusick /*HD*/	{ 0x1d, 0, NULL },
20853901Smckusick 
20953901Smckusick 	{ 0x20, 0, NULL },
21053901Smckusick 	{ 0x21, 0, NULL },
21153901Smckusick /*HD*/	{ 0x22, 0, NULL },
21253901Smckusick /*MO*/	{ 0x23, 0, NULL },
21353901Smckusick 	{ 0x24, 0, NULL },
21453901Smckusick 	{ 0x25, 0, NULL },
21553901Smckusick 	{ 0x26, 0, NULL },
21653901Smckusick 	{ 0x27, 0, NULL },
21753901Smckusick 	{ 0x28, 1, NULL },
21853901Smckusick 	{ 0x29, 1, NULL },
21953901Smckusick 	{ 0x2a, 1, NULL },
22053901Smckusick /*HD*/	{ 0x2b, 0, NULL },
22153901Smckusick 
22253901Smckusick 	{ 0x31, 0, NULL },
22353901Smckusick 	{ 0x32, 0, NULL },
22453901Smckusick 
22553901Smckusick /*MO*/	{ 0x38, 1, NULL },
22653901Smckusick /*MO*/	{ 0x39, 0, NULL },
22753901Smckusick /*MO*/	{ 0x3a, 1, NULL },
22853901Smckusick 
22953901Smckusick /*MO*/	{ 0x3d, 0, NULL },
23053901Smckusick 
23153901Smckusick /*HD*/	{ 0x40, 0, NULL },
23253901Smckusick /*HD*/	{ 0x41, 0, NULL },
23353901Smckusick 	{ 0x42, 0, NULL },
23453901Smckusick 	{ 0x43, 0, NULL },
23553901Smckusick 	{ 0x44, 9, NULL },
23653901Smckusick /*HD*/	{ 0x45, 0, NULL },
23753901Smckusick 
23853901Smckusick 	{ 0x47, 0, NULL },
23953901Smckusick 	{ 0x48, 0, NULL },
24053901Smckusick 	{ 0x49, 0, NULL },
24153901Smckusick 
24253901Smckusick 	{ 0x64, 1, NULL },
24353901Smckusick 
24453901Smckusick 	{ -1,   0, NULL }
24553901Smckusick };
24653901Smckusick #endif /* NO_SHRINK_RSENSE_MSG */
24753901Smckusick 
24853901Smckusick /*
24953901Smckusick  * Init a scsi bus.
25053901Smckusick  */
25153901Smckusick scop_init(scn)
25253901Smckusick 	int	scn;
25353901Smckusick {
25453901Smckusick 	static struct scsi sc;
25553901Smckusick 	int chan;
25653901Smckusick 
25753901Smckusick 	for (chan = 0; chan < MAXCTLR; chan++) {
25853901Smckusick 		bzero((caddr_t)&sc, sizeof(struct scsi));
25953901Smckusick 		sc.sc_cdb.un_reserved[0] = SCOP_RESET;
26053901Smckusick 		sc.sc_cdb.un_reserved[1] = SCOP_RESET;
26153901Smckusick 
26253901Smckusick 		if (!sc_busy(chan)) {
26353901Smckusick 			sc_go(chan, (struct scsi *)&sc, SCSI_INTDIS);
26453901Smckusick 
26553901Smckusick 			chan = (chan / 8 + 1) * 8;
26653901Smckusick 		}
26753901Smckusick 	}
26853901Smckusick }
26953901Smckusick 
27053901Smckusick /**************************************
27153901Smckusick 	The multiple scsi bus is NOT suported by following routines.
27253901Smckusick 	How about use inter like dev_t ( uper is scsi#, lower is inter )
27353901Smckusick 	or hb_ctlr.
27453901Smckusick 	probe() ga futatuarukara unit# ----- udauda.
27553901Smckusick **************************************/
27653901Smckusick 
27753901Smckusick /*
27853901Smckusick  * scprobe. probe routine for mass storage controller.
27953901Smckusick  */
28053901Smckusick scprobe(im, ctlrintr, sc)
28153901Smckusick 	struct iop/**/_ctlr *im;
28253901Smckusick 	int (*ctlrintr)();
28353901Smckusick 	register struct scsi *sc;
28453901Smckusick {
28553901Smckusick 	register struct scintsw *sci;
28653901Smckusick 	int s;
28753901Smckusick #ifdef DEBUG_LOSSBSY_HUNG
28853901Smckusick 	int retry = 0;
28953901Smckusick #endif DEBUG_LOSSBSY_HUNG
29053901Smckusick 
29153901Smckusick 	sci = &scintsw[im->im_intr];
29253901Smckusick 	if (sci->sci_inthandler)
29353901Smckusick 		return (0);
29453901Smckusick 
29553901Smckusick #ifdef DEBUG_LOSSBSY_HUNG
29653901Smckusick scprobe_loop:
29753901Smckusick 	/* s = splsc(); */
29853901Smckusick 	scop_inquiry(im->im_intr, sc, 0, SCSI_INTDIS, 4, (caddr_t)0);
29953901Smckusick 	/* splx(s); */
30053901Smckusick 
30153901Smckusick 	if (sc->sc_istatus != INST_EP) {
30253901Smckusick 		if ((sc->sc_tstatus == TGST_BUSY) && (retry++ < PROBE_MAXRETRY)) {
30353901Smckusick 			goto scprobe_loop;
30453901Smckusick 		}
30553901Smckusick 		return (0);
30653901Smckusick 	}
30753901Smckusick 
30853901Smckusick #else /* DEBUG_LOSSBSY_HUNG */
30953901Smckusick 
31053901Smckusick 	/* s = splsc(); */
31153901Smckusick 	scop_inquiry(im->im_intr, sc, 0, SCSI_INTDIS, 4, (caddr_t)0);
31253901Smckusick 	/* splx(s); */
31353901Smckusick 
31453901Smckusick 	if (sc->sc_istatus != INST_EP)
31553901Smckusick 		return (0);
31653901Smckusick 
31753901Smckusick #endif /* DEBUG_LOSSBSY_HUNG */
31853901Smckusick 
31953901Smckusick 	sci->sci_inthandler = ctlrintr;
32053901Smckusick 	sci->sci_ctlr = im->im_ctlr;
32153901Smckusick 	return (1);
32253901Smckusick }
32353901Smckusick 
32453901Smckusick /*
32553901Smckusick  * ssprobe. probe routine for non-mass storage peripherals.
32653901Smckusick  */
32753901Smckusick ssprobe(ii, ctlrintr, sc)
32853901Smckusick 	struct iop/**/_device *ii;
32953901Smckusick 	int (*ctlrintr)();
33053901Smckusick 	register struct scsi *sc;
33153901Smckusick {
33253901Smckusick 	register struct scintsw *sci;
33353901Smckusick 	int s;
33453901Smckusick 
33553901Smckusick 	sci = &scintsw[ii->ii_intr];
33653901Smckusick 	if (sci->sci_inthandler)
33753901Smckusick 		return (0);
33853901Smckusick 
33953901Smckusick 	/* s = splsc(); */
34053901Smckusick 	scop_inquiry(ii->ii_intr, sc, 0, SCSI_INTDIS, 4, (caddr_t)0);
34153901Smckusick 	/* splx(s); */
34253901Smckusick 
34353901Smckusick 	if (sc->sc_istatus != INST_EP)
34453901Smckusick 		return (0);
34553901Smckusick 
34653901Smckusick 	sci->sci_inthandler = ctlrintr;
34753901Smckusick 	sci->sci_ctlr = ii->ii_unit;
34853901Smckusick 	return (1);
34953901Smckusick }
35053901Smckusick 
35153901Smckusick /*
35253901Smckusick  * SCOP_TST request
35353901Smckusick  */
35453901Smckusick scop_tst(intr, sc, slave, ie)
35553901Smckusick 	register int intr;
35653901Smckusick 	register struct scsi *sc;
35753901Smckusick 	register int slave;
35853901Smckusick 	register int ie;
35953901Smckusick {
36053901Smckusick 	scinit(sc, slave, DEV_BSIZE);
36153901Smckusick 
36253901Smckusick 	/* sc_cdb */
36353901Smckusick 	sc->sc_opcode = SCOP_TST;
36453901Smckusick 
36553901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
36653901Smckusick }
36753901Smckusick 
36853901Smckusick /*
36953901Smckusick  * SCOP_REZERO request
37053901Smckusick  */
37153901Smckusick scop_rezero(intr, sc, slave, ie)
37253901Smckusick 	register int intr;
37353901Smckusick 	register struct scsi *sc;
37453901Smckusick 	register int slave;
37553901Smckusick 	register int ie;
37653901Smckusick {
37753901Smckusick 	scinit(sc, slave, DEV_BSIZE);
37853901Smckusick 
37953901Smckusick 	/* sc_cdb */
38053901Smckusick 	sc->sc_opcode = SCOP_REZERO;
38153901Smckusick 
38253901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
38353901Smckusick }
38453901Smckusick 
38553901Smckusick /*
38653901Smckusick  * SCOP_REWIND request
38753901Smckusick  */
38853901Smckusick scop_rewind(intr, sc, slave, ie, imme)
38953901Smckusick 	register int intr;
39053901Smckusick 	register struct scsi *sc;
39153901Smckusick 	register int slave;
39253901Smckusick 	register int ie, imme;
39353901Smckusick {
39453901Smckusick 	scinit(sc, slave, DEV_BSIZE);
39553901Smckusick 
39653901Smckusick 	/* sc_cdb */
39753901Smckusick 	sc->sc_opcode = SCOP_REZERO;
39853901Smckusick 	sc->sc_tucode = imme;
39953901Smckusick 
40053901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
40153901Smckusick }
40253901Smckusick 
40353901Smckusick /*
40453901Smckusick  * SCOP_RSENSE request
40553901Smckusick  */
40653901Smckusick scop_rsense(intr, sc, slave, ie, count, param)
40753901Smckusick 	register int intr;
40853901Smckusick 	register struct scsi *sc;
40953901Smckusick 	register int slave;
41053901Smckusick 	register int ie;
41153901Smckusick 	register int count;
41253901Smckusick 	register caddr_t param;
41353901Smckusick {
41453901Smckusick 	scinit(sc, slave, DEV_BSIZE);
41553901Smckusick 
41653901Smckusick 	sc->sc_cpoint = (u_char *)param;
41753901Smckusick 	sc->sc_ctrnscnt = count;
41853901Smckusick 
41953901Smckusick 	/* sc_cdb */
42053901Smckusick 	sc->sc_opcode = SCOP_RSENSE;
42153901Smckusick 	sc->sc_count = count;
42253901Smckusick 
42353901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
42453901Smckusick }
42553901Smckusick 
42653901Smckusick /*
42753901Smckusick  * SCOP_RASBLK request
42853901Smckusick  */
42953901Smckusick scop_rasblk(intr, sc, slave, ie, lad)
43053901Smckusick 	register int intr;
43153901Smckusick 	register struct scsi *sc;
43253901Smckusick 	register int slave;
43353901Smckusick 	register int ie;
43453901Smckusick 	register int lad;
43553901Smckusick {
43653901Smckusick 	struct sc_rab *sca = (struct sc_rab *)sc->sc_param;
43753901Smckusick 
43853901Smckusick 	scinit(sc, slave, DEV_BSIZE);
43953901Smckusick 
44053901Smckusick 	sca->sca_dllen = 4;
44153901Smckusick 	sca->sca_dlad[0] = lad;
44253901Smckusick 	sc->sc_cpoint = (u_char *)sca;
44353901Smckusick 
44453901Smckusick 	sc->sc_ctrnscnt = 8;
44553901Smckusick 
44653901Smckusick 	/* sc_cdb */
44753901Smckusick 	sc->sc_opcode = SCOP_RASBLK;
44853901Smckusick 
44953901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
45053901Smckusick }
45153901Smckusick 
45253901Smckusick /*
45353901Smckusick  * SCOP_MERASE request
45453901Smckusick  */
45553901Smckusick scop_merase(intr, sc, slave, ie, count)
45653901Smckusick 	register int intr;
45753901Smckusick 	register struct scsi *sc;
45853901Smckusick 	register int slave;
45953901Smckusick 	register int ie;
46053901Smckusick 	register int count;
46153901Smckusick {
46253901Smckusick 	scinit(sc, slave, DEV_BSIZE);
46353901Smckusick 
46453901Smckusick 	/* sc_cdb */
46553901Smckusick 	sc->sc_opcode = SCOP_MERASE;
46653901Smckusick 	sc->sc_mtcount3 = count;
46753901Smckusick 
46853901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
46953901Smckusick }
47053901Smckusick 
47153901Smckusick /*
47253901Smckusick  * SCOP_WFMARK request
47353901Smckusick  */
47453901Smckusick scop_wfmark(intr, sc, slave, ie, count)
47553901Smckusick 	register int intr;
47653901Smckusick 	register struct scsi *sc;
47753901Smckusick 	register int slave;
47853901Smckusick 	register int ie;
47953901Smckusick 	register int count;
48053901Smckusick {
48153901Smckusick 	scinit(sc, slave, DEV_BSIZE);
48253901Smckusick 
48353901Smckusick 	/* sc_cdb */
48453901Smckusick 	sc->sc_opcode = SCOP_WFMARK;
48553901Smckusick 	count &= 0xffffff;
48653901Smckusick 	sc->sc_tucount3 = count & 0xff;
48753901Smckusick 	count >>= 8;
48853901Smckusick 	sc->sc_tucount2 = count & 0xff;
48953901Smckusick 	count >>= 8;
49053901Smckusick 	sc->sc_tucount1 = count & 0xff;
49153901Smckusick 
49253901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
49353901Smckusick }
49453901Smckusick 
49553901Smckusick /*
49653901Smckusick  * SCOP_SPACE request
49753901Smckusick  */
49853901Smckusick scop_space(intr, sc, slave, ie, count, code)
49953901Smckusick 	register int intr;
50053901Smckusick 	register struct scsi *sc;
50153901Smckusick 	register int slave;
50253901Smckusick 	register int ie;
50353901Smckusick 	register int count;
50453901Smckusick 	register int code;
50553901Smckusick {
50653901Smckusick 	scinit(sc, slave, DEV_BSIZE);
50753901Smckusick 
50853901Smckusick 	/* sc_cdb */
50953901Smckusick 	sc->sc_opcode = SCOP_SPACE;
51053901Smckusick 	sc->sc_tucode = code;
51153901Smckusick 	count &= 0xffffff;
51253901Smckusick 	sc->sc_tucount3 = count & 0xff;
51353901Smckusick 	count >>= 8;
51453901Smckusick 	sc->sc_tucount2 = count & 0xff;
51553901Smckusick 	count >>= 8;
51653901Smckusick 	sc->sc_tucount1 = count & 0xff;
51753901Smckusick 
51853901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
51953901Smckusick }
52053901Smckusick 
52153901Smckusick /*
52253901Smckusick  * SCOP_INQUIRY request
52353901Smckusick  */
52453901Smckusick scop_inquiry(intr, sc, slave, ie, count, param)
52553901Smckusick 	register int intr;
52653901Smckusick 	register struct scsi *sc;
52753901Smckusick 	register int slave;
52853901Smckusick 	register int ie;
52953901Smckusick 	register int count;
53053901Smckusick 	register caddr_t param;
53153901Smckusick {
53253901Smckusick 	scinit(sc, slave, DEV_BSIZE);
53353901Smckusick 
53453901Smckusick 	sc->sc_cpoint = (u_char *)param;
53553901Smckusick 	sc->sc_ctrnscnt = count;
53653901Smckusick 
53753901Smckusick 	/* sc_cdb */
53853901Smckusick 	sc->sc_opcode = SCOP_INQUIRY;
53953901Smckusick 	sc->sc_count = count;
54053901Smckusick 
54153901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
54253901Smckusick }
54353901Smckusick 
54453901Smckusick /*
54553901Smckusick  * SCOP_STST request
54653901Smckusick  */
54753901Smckusick scop_stst(intr, sc, slave, ie, sw)
54853901Smckusick 	register int intr;
54953901Smckusick 	register struct scsi *sc;
55053901Smckusick 	register int slave;
55153901Smckusick 	register int ie;
55253901Smckusick 	register int sw;
55353901Smckusick {
55453901Smckusick 	scinit(sc, slave, DEV_BSIZE);
55553901Smckusick 
55653901Smckusick 	/* sc_cdb */
55753901Smckusick 	sc->sc_opcode = SCOP_STST;
55853901Smckusick 	sc->sc_switch = sw;
55953901Smckusick 
56053901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
56153901Smckusick }
56253901Smckusick 
56353901Smckusick /*
56453901Smckusick  * SCOP_RCAP request
56553901Smckusick  */
56653901Smckusick scop_rcap(intr, sc, slave, ie, count, param)
56753901Smckusick 	register int intr;
56853901Smckusick 	register struct scsi *sc;
56953901Smckusick 	register int slave;
57053901Smckusick 	register int ie;
57153901Smckusick 	register int count;
57253901Smckusick 	register caddr_t param;
57353901Smckusick {
57453901Smckusick 	scinit(sc, slave, DEV_BSIZE);
57553901Smckusick 
57653901Smckusick 	sc->sc_cpoint = (u_char *)param;
57753901Smckusick 	sc->sc_ctrnscnt = count;
57853901Smckusick 
57953901Smckusick 	/* sc_cdb */
58053901Smckusick 	sc->sc_opcode = SCOP_RCAP;
58153901Smckusick 	sc->sc_pmi = OFF;
58253901Smckusick 
58353901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
58453901Smckusick }
58553901Smckusick 
58653901Smckusick /*
58753901Smckusick  * SCOP_BSSRCH request
58853901Smckusick  */
58953901Smckusick scop_bssrch(intr, sc, slave, ie, count, param)
59053901Smckusick 	register int intr;
59153901Smckusick 	register struct scsi *sc;
59253901Smckusick 	register int slave;
59353901Smckusick 	register int ie;
59453901Smckusick 	register int count;
59553901Smckusick 	register caddr_t param;
59653901Smckusick {
59753901Smckusick 	scinit(sc, slave, DEV_BSIZE);
59853901Smckusick 
59953901Smckusick 	sc->sc_cpoint = (u_char *)param;
60053901Smckusick 	sc->sc_ctrnscnt = count;
60153901Smckusick 
60253901Smckusick 	/* sc_cdb */
60353901Smckusick 	sc->sc_opcode = SCOP_BSSRCH;
60453901Smckusick 	sc->sc_ladhi = *(short *)param;
60553901Smckusick 	sc->sc_ladlo = *(short *)(param + 2);
60653901Smckusick 
60753901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
60853901Smckusick }
60953901Smckusick 
61053901Smckusick /*
61153901Smckusick  * SCOP_WSSRCH request
61253901Smckusick  */
61353901Smckusick scop_wssrch(intr, sc, slave, ie, count, param)
61453901Smckusick 	register int intr;
61553901Smckusick 	register struct scsi *sc;
61653901Smckusick 	register int slave;
61753901Smckusick 	register int ie;
61853901Smckusick 	register int count;
61953901Smckusick 	register caddr_t param;
62053901Smckusick {
62153901Smckusick 	scinit(sc, slave, DEV_BSIZE);
62253901Smckusick 
62353901Smckusick 	sc->sc_cpoint = (u_char *)param;
62453901Smckusick 	sc->sc_ctrnscnt = count;
62553901Smckusick 
62653901Smckusick 	/* sc_cdb */
62753901Smckusick 	sc->sc_opcode = SCOP_WSSRCH;
62853901Smckusick 	sc->sc_ladhi = *(short *)param;
62953901Smckusick 	sc->sc_ladlo = *(short *)(param + 2);
63053901Smckusick 
63153901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
63253901Smckusick }
63353901Smckusick 
63453901Smckusick /*
63553901Smckusick  *
63653901Smckusick  * SCOP_EESENSE request
63753901Smckusick  * Enable/Disable Eject Request Sense
63853901Smckusick  * Write Once only supported.
63953901Smckusick  *
64053901Smckusick  */
64153901Smckusick scop_eesense(intr, sc, slave, ie, sw)
64253901Smckusick 	register int intr;
64353901Smckusick 	register struct scsi *sc;
64453901Smckusick 	register int slave;
64553901Smckusick 	register int ie;
64653901Smckusick 	register int sw;
64753901Smckusick {
64853901Smckusick 	scinit(sc, slave, DEV_BSIZE);
64953901Smckusick 
65053901Smckusick 	/* sc_cdb */
65153901Smckusick 	sc->sc_opcode = SCOP_EESENSE;
65253901Smckusick 	sc->sc_switch = sw;
65353901Smckusick 
65453901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
65553901Smckusick }
65653901Smckusick 
65753901Smckusick /*
65853901Smckusick  * SCOP_EJECT
65953901Smckusick  */
66053901Smckusick scop_eject(intr, sc, slave, ie)
66153901Smckusick 	register int intr;
66253901Smckusick 	register struct scsi *sc;
66353901Smckusick 	register int slave;
66453901Smckusick 	register int ie;
66553901Smckusick {
66653901Smckusick 	scinit(sc, slave, DEV_BSIZE);
66753901Smckusick 
66853901Smckusick 	/* sc_cdb */
66953901Smckusick 	sc->sc_opcode = SCOP_EJECT;
67053901Smckusick 
67153901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
67253901Smckusick }
67353901Smckusick 
67453901Smckusick /*
67553901Smckusick  * SCOP_RBLIM request
67653901Smckusick  */
67753901Smckusick scop_rblim(intr, sc, slave, ie, count, param)
67853901Smckusick 	register int intr;
67953901Smckusick 	register struct scsi *sc;
68053901Smckusick 	register int slave;
68153901Smckusick 	register int ie;
68253901Smckusick 	register int count;
68353901Smckusick 	register caddr_t param;
68453901Smckusick {
68553901Smckusick 	scinit(sc, slave, DEV_BSIZE);
68653901Smckusick 
68753901Smckusick 	sc->sc_cpoint = (u_char *)param;
68853901Smckusick 	sc->sc_ctrnscnt = count & 0xff;
68953901Smckusick 
69053901Smckusick 	/* sc_cdb */
69153901Smckusick 	sc->sc_opcode = SCOP_RBLIM;
69253901Smckusick 
69353901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
69453901Smckusick }
69553901Smckusick 
69653901Smckusick /*
69753901Smckusick  * SCOP_MSENSE request
69853901Smckusick  */
69953901Smckusick scop_msense(intr, sc, slave, ie, count, param)
70053901Smckusick 	register int intr;
70153901Smckusick 	register struct scsi *sc;
70253901Smckusick 	register int slave;
70353901Smckusick 	register int ie;
70453901Smckusick 	register int count;
70553901Smckusick 	register caddr_t param;
70653901Smckusick {
70753901Smckusick 	scinit(sc, slave, DEV_BSIZE);
70853901Smckusick 
70953901Smckusick 	sc->sc_cpoint = (u_char *)param;
71053901Smckusick 	sc->sc_ctrnscnt = count & 0xff;
71153901Smckusick 
71253901Smckusick 	/* sc_cdb */
71353901Smckusick 	sc->sc_opcode = SCOP_MSENSE;
71453901Smckusick 	sc->sc_lad = count >> 8;
71553901Smckusick 	sc->sc_count = count & 0xff;
71653901Smckusick 
71753901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
71853901Smckusick }
71953901Smckusick 
72053901Smckusick /*
72153901Smckusick  * SCOP_MSELECT request
72253901Smckusick  */
72353901Smckusick scop_mselect(intr, sc, slave, ie, count, param)
72453901Smckusick 	register int intr;
72553901Smckusick 	register struct scsi *sc;
72653901Smckusick 	register int slave;
72753901Smckusick 	register int ie;
72853901Smckusick 	register int count;
72953901Smckusick 	register caddr_t param;
73053901Smckusick {
73153901Smckusick 	u_char psave[20];
73253901Smckusick 
73353901Smckusick 	bcopy((caddr_t)sc->sc_param, (caddr_t)psave, 20);
73453901Smckusick 	scinit(sc, slave, DEV_BSIZE);
73553901Smckusick 	bcopy((caddr_t)psave, (caddr_t)sc->sc_param, 20);
73653901Smckusick 
73753901Smckusick 	sc->sc_cpoint = (u_char *)param;
73853901Smckusick 	sc->sc_ctrnscnt = count & 0xff;
73953901Smckusick 
74053901Smckusick 	/* sc_cdb */
74153901Smckusick 	sc->sc_opcode = SCOP_MSELECT;
74253901Smckusick 	sc->sc_lad = count >> 8;
74353901Smckusick 	sc->sc_count = count & 0xff;
74453901Smckusick 
74553901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
74653901Smckusick }
74753901Smckusick 
74853901Smckusick #ifdef SRD_MSELECT
74953901Smckusick /*
75053901Smckusick  * SCOP_MSELECT request
75153901Smckusick  */
75253901Smckusick scop_msense_OTHER_HD(intr, sc, slave, ie, count, param)
75353901Smckusick 	register int intr;
75453901Smckusick 	register struct scsi *sc;
75553901Smckusick 	register int slave;
75653901Smckusick 	register int ie;
75753901Smckusick 	register int count;
75853901Smckusick 	register caddr_t param;
75953901Smckusick {
76053901Smckusick 	scinit(sc, slave, DEV_BSIZE);
76153901Smckusick 
76253901Smckusick 	sc->sc_cpoint = (u_char *)param;
76353901Smckusick 	sc->sc_ctrnscnt = count;
76453901Smckusick 
76553901Smckusick 	/* sc_cdb */
76653901Smckusick 	sc->sc_opcode = SCOP_MSENSE;
76753901Smckusick 	sc->sc_count = count;
76853901Smckusick 	sc->sc_lad = 0x3f00;
76953901Smckusick 
77053901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
77153901Smckusick }
77253901Smckusick 
77353901Smckusick /*
77453901Smckusick  * SCOP_MSELECT request
77553901Smckusick  */
77653901Smckusick scop_mselect_OTHER_HD(intr, sc, slave, ie, count, param)
77753901Smckusick 	register int intr;
77853901Smckusick 	register struct scsi *sc;
77953901Smckusick 	register int slave;
78053901Smckusick 	register int ie;
78153901Smckusick 	register int count;
78253901Smckusick 	register caddr_t param;
78353901Smckusick {
78453901Smckusick 	u_char psave[20];
78553901Smckusick 
78653901Smckusick 	bcopy((caddr_t)sc->sc_param, (caddr_t)psave, 20);
78753901Smckusick 	scinit(sc, slave, DEV_BSIZE);
78853901Smckusick 	bcopy((caddr_t)psave, (caddr_t)sc->sc_param, 20);
78953901Smckusick 
79053901Smckusick 	sc->sc_cpoint = (u_char *)param;
79153901Smckusick 	sc->sc_ctrnscnt = count;
79253901Smckusick 
79353901Smckusick 	/* sc_cdb */
79453901Smckusick 	sc->sc_opcode = SCOP_MSELECT;
79553901Smckusick 	sc->sc_count = count;
79653901Smckusick 	sc->sc_lad = 0;
79753901Smckusick 
79853901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
79953901Smckusick }
80053901Smckusick #endif SRD_MSELECT
80153901Smckusick 
80253901Smckusick scop_erase(intr, sc, slave, ie)
80353901Smckusick 	register int intr;
80453901Smckusick 	register struct scsi *sc;
80553901Smckusick 	register int slave;
80653901Smckusick 	register int ie;
80753901Smckusick {
80853901Smckusick 	scinit(sc, slave, DEV_BSIZE);
80953901Smckusick 
81053901Smckusick 	/* sc_cdb */
81153901Smckusick 	sc->sc_opcode = SCOP_ERASE;
81253901Smckusick 	sc->sc_tucode = 1;
81353901Smckusick 
81453901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
81553901Smckusick }
81653901Smckusick 
81753901Smckusick /*
81853901Smckusick  * One sector programmed I/O
81953901Smckusick  */
82053901Smckusick scop_rdwr(intr, sc, slave, ie, flag, addr, lba, sectsize)
82153901Smckusick 	int	intr;
82253901Smckusick 	register struct scsi	*sc;
82353901Smckusick 	int	slave;
82453901Smckusick 	int	ie;
82553901Smckusick 	int	flag;
82653901Smckusick 	caddr_t	addr;
82753901Smckusick 	int	lba;
82853901Smckusick 	int	sectsize;
82953901Smckusick {
83053901Smckusick 	scinit(sc, slave, sectsize);
83153901Smckusick 
83253901Smckusick 	sc->sc_cpoint = (u_char *)addr;
83353901Smckusick 	sc->sc_ctrnscnt = sectsize;
83453901Smckusick 
83553901Smckusick 	/* sc_cdb */
83653901Smckusick 	sc->sc_opcode = (flag & B_READ) ? SCOP_READ : SCOP_WRITE;
83753901Smckusick 	sc->sc_lad = lba;
83853901Smckusick 	sc->sc_count = 1;
83953901Smckusick 
84053901Smckusick 	sc_go(intr, sc, ie);
84153901Smckusick }
84253901Smckusick 
84353901Smckusick /*
84453901Smckusick  * Medium allow/prevent removable
84553901Smckusick  */
84653901Smckusick scop_medrmv(intr, sc, slave, ie, sw)
84753901Smckusick 	register int intr;
84853901Smckusick 	register struct scsi *sc;
84953901Smckusick 	register int slave;
85053901Smckusick 	register int ie;
85153901Smckusick 	register int sw;
85253901Smckusick {
85353901Smckusick 	scinit(sc, slave, DEV_BSIZE);
85453901Smckusick 
85553901Smckusick 	/* sc_cdb */
85653901Smckusick 	sc->sc_opcode = SCOP_MEDRMV;
85753901Smckusick 	sc->sc_count = sw;
85853901Smckusick 
85953901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
86053901Smckusick }
86153901Smckusick 
86253901Smckusick /*
86353901Smckusick  * initialize struct scsi
86453901Smckusick  */
86553901Smckusick scinit(sc, slave, sectsize)
86653901Smckusick 	register struct scsi *sc;
86753901Smckusick 	int	slave;
86853901Smckusick 	int	sectsize;
86953901Smckusick {
87053901Smckusick 	bzero((caddr_t)sc, sizeof(struct scsi));
87153901Smckusick 
87253901Smckusick 	sc->sc_identify = MSG_IDENT|Scsi_Disconnect|(slave & IDT_DRMASK);
87353901Smckusick 	sc->sc_bytesec = sectsize;
87453901Smckusick 	sc->sc_lun = slave;
87553901Smckusick }
87653901Smckusick 
87753901Smckusick 
87853901Smckusick /*
87953901Smckusick  * ABORT MESSAGE
88053901Smckusick  */
88153901Smckusick scms_abort(intr, sc, slave, ie)
88253901Smckusick 	register int intr;
88353901Smckusick 	register struct scsi *sc;
88453901Smckusick 	register int slave;
88553901Smckusick 	register int ie;
88653901Smckusick {
88753901Smckusick 	bzero((caddr_t)sc, sizeof(struct scsi));
88853901Smckusick 
88953901Smckusick 	sc->sc_identify = MSG_ABORT;
89053901Smckusick 
89153901Smckusick 	/* sc_cdb */
89253901Smckusick 	sc->sc_opcode = SCOP_TST;
89353901Smckusick 	sc->sc_lun = slave;
89453901Smckusick 
89553901Smckusick 	sc_go(intr, (struct scsi *)sc, ie);
89653901Smckusick }
89753901Smckusick 
89853901Smckusick sc_go(intr, sc, ie)
89953901Smckusick 	int intr;
90053901Smckusick 	struct scsi *sc;
90153901Smckusick 	int ie;
90253901Smckusick {
90353901Smckusick 	register struct sc_data *scdp;
90453901Smckusick 
90553901Smckusick 	scdp = &sc_data[intr];
90653901Smckusick 
90753901Smckusick 	if (sc->sc_cpoint)
90853901Smckusick 		scdp->scd_vaddr = (char *)sc->sc_cpoint;
90953901Smckusick 	else
91053901Smckusick 		scdp->scd_vaddr = (char *)sc->sc_param;
91153901Smckusick 	scdp->scd_procp = curproc;
91253901Smckusick 	scdp->scd_scaddr = (char *)sc;
91353901Smckusick 	scdp->scd_count = sc->sc_ctrnscnt;
91453901Smckusick 	sc->sc_cpoint = (u_char *)ipc_phys(scdp->scd_vaddr);
91553901Smckusick 
91653901Smckusick 	_sc_go(intr, sc, ie);
91753901Smckusick 
91853901Smckusick 	if((ie & SCSI_INTEN) == 0) {
91953901Smckusick #ifdef mips
92053901Smckusick 	/* if (DATAIN_PHASE_FINISHED) */
92153901Smckusick 	MachFlushDCache(scdp->scd_scaddr, sizeof (struct scsi));
92253901Smckusick 	if (MACH_IS_USPACE(scdp->scd_vaddr))
92353901Smckusick 		panic("sc_go: user address is not supported");
92453901Smckusick 	else if (MACH_IS_CACHED(scdp->scd_vaddr))
92553901Smckusick 		MachFlushDCache(scdp->scd_vaddr, scdp->scd_count);
92653901Smckusick 	else if (MACH_IS_MAPPED(scdp->scd_vaddr))
92753901Smckusick #ifdef notyet /* KU:XXX */
92853901Smckusick 		clean_k2dcache(scdp->scd_vaddr, scdp->scd_count);
92953901Smckusick #else
93053901Smckusick 		MachFlushCache(); /* Flush all caches */
93153901Smckusick #endif
93253901Smckusick #endif /* mips */
93353901Smckusick 	}
93453901Smckusick }
93553901Smckusick 
93653901Smckusick #ifdef CPU_SINGLE
93753901Smckusick _sc_go(intr, sc, ie)
93853901Smckusick 	int intr;
93953901Smckusick 	struct scsi *sc;
94053901Smckusick 	int ie;
94153901Smckusick {
94253901Smckusick 	register int i, s;
94353901Smckusick 
94453901Smckusick 	if((ie & SCSI_INTEN) == 0) {
94553901Smckusick 		scsend(intr, ie|SCSI_NOTWAIT, sc);
94653901Smckusick 		while (sc_busy(intr)) {
94753901Smckusick 			splx(splscon());	/* splsc -1 */
94853901Smckusick #ifdef mc68030
94953901Smckusick 			dcia();
95053901Smckusick #endif
95153901Smckusick 		}
95253901Smckusick 	} else {
95353901Smckusick 		scsend(intr, ie, (caddr_t)sc);
95453901Smckusick 	}
95553901Smckusick }
95653901Smckusick #endif /* CPU_SINGLE */
95753901Smckusick 
95853901Smckusick screset(chan)
95953901Smckusick 	int chan;
96053901Smckusick {
96153901Smckusick 	int i, s;
96253901Smckusick 
96353901Smckusick 	s = splsc();
96453901Smckusick 	printf("SCSI: screset() called ");
96553901Smckusick 	scop_init(chan / 8);
96653901Smckusick 	splx(s);
96753901Smckusick 
96853901Smckusick 	for (s = 0; s < 10; s++) {
96953901Smckusick 		DELAY(100000 * 10);
97053901Smckusick 	}
97153901Smckusick 	printf("\n");
97253901Smckusick 	iop/**/reset();
97353901Smckusick }
97453901Smckusick 
97553901Smckusick scsisetup(bp, map, nmap)
97653901Smckusick 	struct buf *bp;
97753901Smckusick 	struct sc_map *map;
97853901Smckusick 	int nmap;
97953901Smckusick {
98053901Smckusick 	return (iop/**/setup(bp, map, nmap));
98153901Smckusick }
98253901Smckusick 
98353901Smckusick 
98453901Smckusick /*
98553901Smckusick  * transrate skey / ecode into message display ON/OFF value
98653901Smckusick  *	1 : display message
98753901Smckusick  *	0 : silence
98853901Smckusick  */
98953901Smckusick isdispmsg(code, list, count)
99053901Smckusick 	register int code;
99153901Smckusick 	register struct msg_list *list;
99253901Smckusick 	int count;
99353901Smckusick {
99453901Smckusick 	register int msglvl = 0;
99553901Smckusick 
99653901Smckusick 	while (list->ml_code >= 0) {
99753901Smckusick 		if (code == list->ml_code) {
99853901Smckusick 			msglvl = list->ml_msglvl;
99953901Smckusick 			break;
100053901Smckusick 		}
100153901Smckusick 		list++;
100253901Smckusick 	}
100353901Smckusick 	return (count >= msglvl);
100453901Smckusick }
100553901Smckusick 
100653901Smckusick #ifdef NO_SHRINK_RSENSE_MSG
100753901Smckusick /*
100853901Smckusick  * transrate skey / ecode into message
100953901Smckusick  */
101053901Smckusick char *
101153901Smckusick getmsg(code, list, defmsg)
101253901Smckusick 	int code;
101353901Smckusick 	struct msg_list *list;
101453901Smckusick 	char *defmsg;
101553901Smckusick {
101653901Smckusick 	while (list->ml_code >= 0) {
101753901Smckusick 		if (code == list->ml_code)
101853901Smckusick 			return (list->ml_msgstr);
101953901Smckusick 		list++;
102053901Smckusick 	}
102153901Smckusick 	return (defmsg);
102253901Smckusick }
102353901Smckusick #endif /* NO_SHRINK_RSENSE_MSG */
102453901Smckusick 
102553901Smckusick check_chan_busy(intr, sc, slave)
102653901Smckusick 	register int intr;
102753901Smckusick 	register struct scsi *sc;
102853901Smckusick 	register int slave;
102953901Smckusick {
103053901Smckusick 	register struct sc_extnd *sce = (struct sc_extnd *)sc->sc_param;
103153901Smckusick 	int	i = 0;
103253901Smckusick 
103353901Smckusick 	if (sc->sc_istatus == INST_EP) {
103453901Smckusick 		switch (sc->sc_tstatus) {
103553901Smckusick 
103653901Smckusick 		case TGST_CC:
103753901Smckusick 			scop_rsense(intr, sc, slave, SCSI_INTDIS, 18, 0);
103853901Smckusick 			if (rsense_msg_disp ||
103953901Smckusick 			    isdispmsg(sce->sce_skey, skeylist, 0)) {
104053901Smckusick #ifdef NO_SHRINK_RSENSE_MSG
104153901Smckusick 				if (sce->sce_advalid) {
104253901Smckusick 					printf("SCSI%d(block %d): %s (sense key = 0x%x)\n",
104353901Smckusick 					intr,
104453901Smckusick 					(sce->sce_infob1 << 24) +
104553901Smckusick 					(sce->sce_infob2 << 16) +
104653901Smckusick 					(sce->sce_infob3 <<  8) +
104753901Smckusick 					(sce->sce_infob4),
104853901Smckusick 					getmsg(sce->sce_skey, skeylist, "(reserved)"),
104953901Smckusick 					sce->sce_skey);
105053901Smckusick 				} else {
105153901Smckusick 					printf("SCSI%d(unknown block): %s (sense key = 0x%x)\n",
105253901Smckusick 					intr,
105353901Smckusick 					getmsg(sce->sce_skey, skeylist, "(reserved)"),
105453901Smckusick 					sce->sce_skey);
105553901Smckusick 				}
105653901Smckusick #else /* NO_SHRINK_RSENSE_MSG */
105753901Smckusick 				if (sce->sce_advalid) {
105853901Smckusick 					printf("SCSI%d(sn %d): skey=0x%x)\n",
105953901Smckusick 					intr,
106053901Smckusick 					(sce->sce_infob1 << 24) +
106153901Smckusick 					(sce->sce_infob2 << 16) +
106253901Smckusick 					(sce->sce_infob3 <<  8) +
106353901Smckusick 					(sce->sce_infob4),
106453901Smckusick 					sce->sce_skey);
106553901Smckusick 				} else {
106653901Smckusick 					printf("SCSI%d: skey=0x%x)\n",
106753901Smckusick 					intr, sce->sce_skey);
106853901Smckusick 				}
106953901Smckusick #endif /* NO_SHRINK_RSENSE_MSG */
107053901Smckusick 				printf("sense data = ");
107153901Smckusick 				for (i = 0; i < 18; i++)
107253901Smckusick 					printf("%x ", sc->sc_param[i]);
107353901Smckusick 				printf("\n");
107453901Smckusick 			}
107553901Smckusick 			break;
107653901Smckusick 
107753901Smckusick 		case TGST_GOOD:
107853901Smckusick 			break;
107953901Smckusick 
108053901Smckusick 		default:
108153901Smckusick 			printf("SCSI%d: bad target status 0x%x\n", intr, sc->sc_tstatus);
108253901Smckusick 			break;
108353901Smckusick 		}
108453901Smckusick 	} else {
108553901Smckusick 		printf("SCSI%d: bad initiator status 0x%x\n", intr, sc->sc_istatus);
108653901Smckusick 	}
108753901Smckusick 
108853901Smckusick 	while (i++ < 100000) {
108953901Smckusick 		scop_tst(intr, sc, slave, SCSI_INTDIS);
109053901Smckusick 		if (sc->sc_tstatus != TGST_BUSY)
109153901Smckusick 			break;
109253901Smckusick 	}
109353901Smckusick 	if (i > 100000)
109453901Smckusick 		printf("SCSI%d: still busy after rasblk.\n", intr);
109553901Smckusick }
109653901Smckusick 
109753901Smckusick /***/
109853901Smckusick struct scsi_berr_bug_table {
109953901Smckusick 	int model;
110053901Smckusick 	int serial_l;
110153901Smckusick 	int serial_h;
110253901Smckusick 	int value;	/* 1:BUG, 0:NOBUG */
110353901Smckusick };
110453901Smckusick 
110553901Smckusick /***/
1106