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