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