1*54881Storek /* 2*54881Storek * Copyright (c) 1990, 1992 The Regents of the University of California. 3*54881Storek * All rights reserved. 4*54881Storek * 5*54881Storek * This software was developed by the Computer Systems Engineering group 6*54881Storek * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 7*54881Storek * contributed to Berkeley. 8*54881Storek * 9*54881Storek * %sccs.include.redist.c% 10*54881Storek * 11*54881Storek * @(#)sd.c 5.1 (Berkeley) 07/10/92 12*54881Storek * 13*54881Storek * from: $Header: sd.c,v 1.18 92/06/11 17:55:56 torek Exp $ 14*54881Storek */ 15*54881Storek 16*54881Storek /* 17*54881Storek * SCSI CCS (Command Command Set) disk driver. 18*54881Storek * 19*54881Storek * MACHINE INDEPENDENT (do not put machine dependent goo in here!) 20*54881Storek * 21*54881Storek * (from sd.c,v 1.7 90/12/15 14:11:26 van Exp) 22*54881Storek */ 23*54881Storek 24*54881Storek #include "sys/param.h" 25*54881Storek #include "sys/proc.h" 26*54881Storek #include "sys/buf.h" 27*54881Storek #include "sys/errno.h" 28*54881Storek #include "sys/device.h" 29*54881Storek #include "sys/disklabel.h" 30*54881Storek #include "sys/dkstat.h" 31*54881Storek #include "sys/disk.h" 32*54881Storek #include "sys/ioctl.h" 33*54881Storek #include "sys/malloc.h" 34*54881Storek 35*54881Storek #include "scsi/scsi.h" 36*54881Storek #include "scsi/disk.h" 37*54881Storek #include "scsi/scsivar.h" 38*54881Storek #include "scsi/scsi_ioctl.h" 39*54881Storek 40*54881Storek #include "machine/cpu.h" 41*54881Storek 42*54881Storek #include "sdtrace.h" 43*54881Storek 44*54881Storek #define SUN_LABEL_HACK 45*54881Storek 46*54881Storek #ifdef SUN_LABEL_HACK 47*54881Storek #include "sparc/sunos/sun_disklabel.h" 48*54881Storek #endif 49*54881Storek 50*54881Storek /* 51*54881Storek * Per-disk variables. 52*54881Storek * 53*54881Storek * sd_dk contains all the `disk' specific stuff (label/partitions, 54*54881Storek * transfer rate, etc). We need only things that are special to 55*54881Storek * scsi disks. Note that our blocks are in terms of DEV_BSIZE blocks. 56*54881Storek */ 57*54881Storek struct sd_softc { 58*54881Storek struct dkdevice sc_dk; /* base disk device, must be first */ 59*54881Storek struct unit sc_unit; /* scsi unit */ 60*54881Storek pid_t sc_format_pid; /* process using "format" mode */ 61*54881Storek u_char sc_type; /* drive type */ 62*54881Storek u_char sc_bshift; /* convert device blocks to DEV_BSIZE blks */ 63*54881Storek short sc_flags; /* see below */ 64*54881Storek u_int sc_blks; /* number of blocks on device */ 65*54881Storek int sc_blksize; /* device block size in bytes */ 66*54881Storek 67*54881Storek /* should be in dkdevice?? */ 68*54881Storek struct buf sc_tab; /* transfer queue */ 69*54881Storek 70*54881Storek /* statistics */ 71*54881Storek long sc_resets; /* number of times reset */ 72*54881Storek long sc_transfers; /* count of total transfers */ 73*54881Storek long sc_partials; /* count of `partial' transfers */ 74*54881Storek 75*54881Storek /* for user formatting */ 76*54881Storek struct scsi_cdb sc_cmd; 77*54881Storek struct scsi_fmt_sense sc_sense; 78*54881Storek }; 79*54881Storek 80*54881Storek #define SDF_ALIVE 1 /* drive OK for regular kernel use */ 81*54881Storek 82*54881Storek /* definition of the autoconfig driver */ 83*54881Storek int sdmatch __P((struct device *, struct cfdata *, void *)); 84*54881Storek void sdattach __P((struct device *, struct device *, void *)); 85*54881Storek 86*54881Storek struct cfdriver sdcd = 87*54881Storek { NULL, "sd", sdmatch, sdattach, DV_DISK, sizeof(struct sd_softc) }; 88*54881Storek 89*54881Storek /* definition of the unit driver, for hba */ 90*54881Storek void sdigo __P((struct device *, struct scsi_cdb *)); 91*54881Storek void sdgo __P((struct device *, struct scsi_cdb *)); 92*54881Storek void sdintr __P((struct device *, int, int)); 93*54881Storek void sdreset __P((struct unit *)); 94*54881Storek 95*54881Storek static struct unitdriver sdunitdriver = { /*sdgo, sdintr*/ sdreset }; 96*54881Storek 97*54881Storek /* definition of the disk driver, for kernel */ 98*54881Storek void sdstrategy __P((struct buf *)); 99*54881Storek 100*54881Storek #ifdef notyet 101*54881Storek static struct sddkdriver = { sdstrategy }; 102*54881Storek #endif 103*54881Storek 104*54881Storek #ifdef DEBUG 105*54881Storek int sddebug = 1; 106*54881Storek #define SDB_ERROR 0x01 107*54881Storek #define SDB_PARTIAL 0x02 108*54881Storek #endif 109*54881Storek 110*54881Storek #define sdunit(x) (minor(x) >> 3) 111*54881Storek #define sdpart(x) (minor(x) & 0x7) 112*54881Storek 113*54881Storek #define b_cylin b_resid 114*54881Storek 115*54881Storek #define SDRETRY 2 116*54881Storek 117*54881Storek /* 118*54881Storek * Table of scsi commands users are allowed to access via `format' 119*54881Storek * mode. 0 means not legal. 1 means `immediate' (doesn't need dma). 120*54881Storek * -1 means needs dma and/or wait for intr (i.e., `slow'). 121*54881Storek */ 122*54881Storek static char legal_cmds[256] = { 123*54881Storek /***** 0 1 2 3 4 5 6 7 8 9 A B C D E F */ 124*54881Storek /*00*/ 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125*54881Storek /*10*/ 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 126*54881Storek /*20*/ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127*54881Storek /*30*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128*54881Storek /*40*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129*54881Storek /*50*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130*54881Storek /*60*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131*54881Storek /*70*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132*54881Storek /*80*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133*54881Storek /*90*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134*54881Storek /*a0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135*54881Storek /*b0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136*54881Storek /*c0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137*54881Storek /*d0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138*54881Storek /*e0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139*54881Storek /*f0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140*54881Storek }; 141*54881Storek 142*54881Storek int 143*54881Storek sdmatch(parent, cf, aux) 144*54881Storek struct device *parent; 145*54881Storek register struct cfdata *cf; 146*54881Storek void *aux; 147*54881Storek { 148*54881Storek register struct scsi_attach_args *sa = aux; 149*54881Storek #ifdef DEBUG 150*54881Storek char *whynot; 151*54881Storek #endif 152*54881Storek 153*54881Storek /* 154*54881Storek * unit number must match, or be given as `any' 155*54881Storek */ 156*54881Storek if (cf->cf_loc[0] != -1 && cf->cf_loc[0] != sa->sa_unit) 157*54881Storek return (0); 158*54881Storek /* 159*54881Storek * drive must be a disk, and of a kind we recognize 160*54881Storek */ 161*54881Storek if ((sa->sa_inq_status & STS_MASK) != STS_GOOD) { 162*54881Storek #ifdef DEBUG 163*54881Storek whynot = "INQUIRY failed"; 164*54881Storek #endif 165*54881Storek goto notdisk; 166*54881Storek } 167*54881Storek 168*54881Storek switch (sa->sa_si.si_type & TYPE_TYPE_MASK) { 169*54881Storek 170*54881Storek case TYPE_DAD: /* disk */ 171*54881Storek case TYPE_WORM: /* WORM */ 172*54881Storek case TYPE_ROM: /* CD-ROM */ 173*54881Storek case TYPE_MO: /* Magneto-optical */ 174*54881Storek case TYPE_JUKEBOX: /* medium changer */ 175*54881Storek break; 176*54881Storek 177*54881Storek default: 178*54881Storek notdisk: 179*54881Storek #ifdef DEBUG 180*54881Storek whynot = "not a disk"; 181*54881Storek printf("[not matching `sd' at unit %d: %s]\n", 182*54881Storek sa->sa_unit, whynot); 183*54881Storek #endif 184*54881Storek return (0); 185*54881Storek } 186*54881Storek 187*54881Storek /* 188*54881Storek * It is a disk of some kind; take it. We will figure out 189*54881Storek * the rest in the attach routine. 190*54881Storek */ 191*54881Storek return (1); 192*54881Storek } 193*54881Storek 194*54881Storek /* 195*54881Storek * Attach a disk (called after sdmatch returns true). 196*54881Storek * Note that this routine is never reentered (so we can use statics). 197*54881Storek */ 198*54881Storek void 199*54881Storek sdattach(parent, self, aux) 200*54881Storek struct device *parent, *self; 201*54881Storek void *aux; 202*54881Storek { 203*54881Storek register struct sd_softc *sc = (struct sd_softc *)self; 204*54881Storek register struct scsi_attach_args *sa = aux; 205*54881Storek register int i; 206*54881Storek char vendor[10], drive[17], rev[5]; 207*54881Storek static u_char capbuf[8]; 208*54881Storek static struct scsi_cdb cap = { CMD_READ_CAPACITY }; 209*54881Storek #ifdef SUN_LABEL_HACK 210*54881Storek static struct scsi_cdb rd0 = { CMD_READ10, 0, 0, 0, 0, 0, 0, 0, 1, 0 }; 211*54881Storek caddr_t sector; 212*54881Storek #endif 213*54881Storek 214*54881Storek /* 215*54881Storek * Declare our existence. 216*54881Storek */ 217*54881Storek sc->sc_unit.u_driver = &sdunitdriver; 218*54881Storek scsi_establish(&sc->sc_unit, &sc->sc_dk.dk_dev, sa->sa_unit); 219*54881Storek 220*54881Storek /* 221*54881Storek * Figure out what kind of disk this is. 222*54881Storek * We only accepted it if the inquiry succeeded, so 223*54881Storek * we can inspect those fields. 224*54881Storek */ 225*54881Storek i = (sa->sa_si.si_version >> VER_ANSI_SHIFT) & VER_ANSI_MASK; 226*54881Storek if (i == 1 || i == 2) { 227*54881Storek scsi_inq_ansi((struct scsi_inq_ansi *)&sa->sa_si, 228*54881Storek vendor, drive, rev); 229*54881Storek printf(": %s %s", vendor, drive); 230*54881Storek /* XXX should we even ever bother printing this? */ 231*54881Storek if (rev[0]) 232*54881Storek printf(" %s", rev); 233*54881Storek } else { 234*54881Storek /* bleah */ 235*54881Storek bcopy("<unknown>", vendor, 10); 236*54881Storek bcopy("<unknown>", drive, 10); 237*54881Storek printf(": type 0x%x, qual 0x%x, ver %d", 238*54881Storek sa->sa_si.si_type, sa->sa_si.si_qual, 239*54881Storek sa->sa_si.si_version); 240*54881Storek } 241*54881Storek 242*54881Storek #ifdef notyet 243*54881Storek sc->sc_dk.dk_driver = &sddkdriver; 244*54881Storek dk_establish(&sc->sc_dk); 245*54881Storek /* READ DISK LABEL HERE, UNLESS REMOVABLE MEDIUM... NEEDS THOUGHT */ 246*54881Storek #endif 247*54881Storek 248*54881Storek CDB10(&cap)->cdb_lun_rel = sc->sc_unit.u_unit << 5; 249*54881Storek i = (*sc->sc_unit.u_hbd->hd_icmd)(sc->sc_unit.u_hba, 250*54881Storek sc->sc_unit.u_targ, &cap, (char *)capbuf, sizeof capbuf, B_READ); 251*54881Storek i &= STS_MASK; 252*54881Storek if (i == STS_GOOD) { 253*54881Storek #define NUMBER(p) (((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | (p)[3]) 254*54881Storek sc->sc_blks = NUMBER(&capbuf[0]); 255*54881Storek sc->sc_blksize = NUMBER(&capbuf[4]); 256*54881Storek } else if (i == STS_CHECKCOND && 257*54881Storek (strcmp(vendor, "HP") == 0 && strcmp(drive, "S6300.650A") == 0)) { 258*54881Storek /* XXX unformatted or nonexistent MO medium: fake it */ 259*54881Storek sc->sc_blks = 318664; 260*54881Storek sc->sc_blksize = 1024; 261*54881Storek } else { 262*54881Storek printf(": unable to determine drive capacity [sts=%x]\n", i); 263*54881Storek return; 264*54881Storek } 265*54881Storek /* return value from read capacity is last valid block, not nblocks */ 266*54881Storek sc->sc_blks++; 267*54881Storek printf(", %u %d byte blocks\n", sc->sc_blks, sc->sc_blksize); 268*54881Storek if (sc->sc_blksize != DEV_BSIZE) { 269*54881Storek for (i = sc->sc_blksize; i > DEV_BSIZE; i >>= 1) 270*54881Storek ++sc->sc_bshift; 271*54881Storek if (i != DEV_BSIZE) { 272*54881Storek printf("%s: blksize not multiple of %d: cannot use\n", 273*54881Storek sc->sc_dk.dk_dev.dv_xname, DEV_BSIZE); 274*54881Storek return; 275*54881Storek } 276*54881Storek sc->sc_blks <<= sc->sc_bshift; 277*54881Storek } 278*54881Storek sc->sc_type = sa->sa_si.si_type; /* sufficient? */ 279*54881Storek sc->sc_dk.dk_wpms = 32 * (60 * DEV_BSIZE / 2); /* XXX */ 280*54881Storek 281*54881Storek sc->sc_dk.dk_label.d_secsize = 512; /* XXX */ 282*54881Storek 283*54881Storek #ifdef SUN_LABEL_HACK 284*54881Storek sector = (caddr_t)malloc(sc->sc_blksize, M_DEVBUF, M_NOWAIT); 285*54881Storek CDB10(&rd0)->cdb_lun_rel = sc->sc_unit.u_unit << 5; 286*54881Storek i = (*sc->sc_unit.u_hbd->hd_icmd)(sc->sc_unit.u_hba, 287*54881Storek sc->sc_unit.u_targ, &rd0, sector, sc->sc_blksize, B_READ); 288*54881Storek if (i == STS_GOOD) { 289*54881Storek printf("%s: <%s>\n", sc->sc_dk.dk_dev.dv_xname, 290*54881Storek ((struct sun_disklabel *)sector)->sl_text); 291*54881Storek if (sun_disklabel(sector, &sc->sc_dk.dk_label)) 292*54881Storek sc->sc_flags |= SDF_ALIVE; 293*54881Storek else 294*54881Storek printf("%s: sun_disklabel fails\n", 295*54881Storek sc->sc_dk.dk_dev.dv_xname); 296*54881Storek } else 297*54881Storek printf("%s: could not read sector 0 for disk label\n", 298*54881Storek sc->sc_dk.dk_dev.dv_xname); 299*54881Storek free(sector, M_DEVBUF); 300*54881Storek #endif 301*54881Storek } 302*54881Storek 303*54881Storek /* 304*54881Storek * Reset a disk, after a SCSI bus reset. 305*54881Storek * 306*54881Storek * XXX untested and probably incomplete/incorrect 307*54881Storek */ 308*54881Storek void 309*54881Storek sdreset(u) 310*54881Storek register struct unit *u; 311*54881Storek { 312*54881Storek register struct sd_softc *sc = (struct sd_softc *)u->u_dev; 313*54881Storek 314*54881Storek printf(" %s", sc->sc_dk.dk_dev.dv_xname); 315*54881Storek sc->sc_resets++; 316*54881Storek } 317*54881Storek 318*54881Storek /* dev_t is short, must use prototype syntax */ 319*54881Storek int 320*54881Storek sdopen(dev_t dev, int flags, int ifmt, struct proc *p) 321*54881Storek { 322*54881Storek register int unit = sdunit(dev); 323*54881Storek register struct sd_softc *sc; 324*54881Storek 325*54881Storek if (unit >= sdcd.cd_ndevs || (sc = sdcd.cd_devs[unit]) == NULL) 326*54881Storek return (ENXIO); 327*54881Storek if ((sc->sc_flags & SDF_ALIVE) == 0 && 328*54881Storek !suser(p->p_ucred, &p->p_acflag)) 329*54881Storek return (ENXIO); 330*54881Storek return (0); 331*54881Storek } 332*54881Storek 333*54881Storek int 334*54881Storek sdclose(dev_t dev, int flags, int ifmt, struct proc *p) 335*54881Storek { 336*54881Storek register struct sd_softc *sc = sdcd.cd_devs[sdunit(dev)]; 337*54881Storek 338*54881Storek sc->sc_format_pid = 0; 339*54881Storek return (0); 340*54881Storek } 341*54881Storek 342*54881Storek /* 343*54881Storek * This routine is called for partial block transfers and non-aligned 344*54881Storek * transfers (the latter only being possible on devices with a block size 345*54881Storek * larger than DEV_BSIZE). The operation is performed in three steps 346*54881Storek * using a locally allocated buffer: 347*54881Storek * 1. transfer any initial partial block 348*54881Storek * 2. transfer full blocks 349*54881Storek * 3. transfer any final partial block 350*54881Storek */ 351*54881Storek static void 352*54881Storek sdlblkstrat(bp, bsize) 353*54881Storek register struct buf *bp; 354*54881Storek register int bsize; 355*54881Storek { 356*54881Storek register int bn, resid, boff, count; 357*54881Storek register caddr_t addr, cbuf; 358*54881Storek struct buf tbp; 359*54881Storek 360*54881Storek cbuf = (caddr_t)malloc(bsize, M_DEVBUF, M_WAITOK); 361*54881Storek bzero((caddr_t)&tbp, sizeof tbp); 362*54881Storek tbp.b_proc = curproc; 363*54881Storek tbp.b_dev = bp->b_dev; 364*54881Storek bn = bp->b_blkno; 365*54881Storek resid = bp->b_bcount; 366*54881Storek addr = bp->b_un.b_addr; 367*54881Storek #ifdef DEBUG 368*54881Storek if (sddebug & SDB_PARTIAL) 369*54881Storek printf("sdlblkstrat: bp %x flags %x bn %x resid %x addr %x\n", 370*54881Storek bp, bp->b_flags, bn, resid, addr); 371*54881Storek #endif 372*54881Storek 373*54881Storek while (resid > 0) { 374*54881Storek boff = dbtob(bn) & (bsize - 1); 375*54881Storek if (boff || resid < bsize) { 376*54881Storek struct sd_softc *sc = sdcd.cd_devs[sdunit(bp->b_dev)]; 377*54881Storek sc->sc_partials++; 378*54881Storek count = MIN(resid, bsize - boff); 379*54881Storek tbp.b_flags = B_BUSY | B_READ; 380*54881Storek tbp.b_blkno = bn - btodb(boff); 381*54881Storek tbp.b_un.b_addr = cbuf; 382*54881Storek tbp.b_bcount = bsize; 383*54881Storek #ifdef DEBUG 384*54881Storek if (sddebug & SDB_PARTIAL) 385*54881Storek printf(" readahead: bn %x cnt %x off %x addr %x\n", 386*54881Storek tbp.b_blkno, count, boff, addr); 387*54881Storek #endif 388*54881Storek sdstrategy(&tbp); 389*54881Storek biowait(&tbp); 390*54881Storek if (tbp.b_flags & B_ERROR) { 391*54881Storek bp->b_flags |= B_ERROR; 392*54881Storek bp->b_error = tbp.b_error; 393*54881Storek break; 394*54881Storek } 395*54881Storek if (bp->b_flags & B_READ) { 396*54881Storek bcopy(&cbuf[boff], addr, count); 397*54881Storek goto done; 398*54881Storek } 399*54881Storek bcopy(addr, &cbuf[boff], count); 400*54881Storek #ifdef DEBUG 401*54881Storek if (sddebug & SDB_PARTIAL) 402*54881Storek printf(" writeback: bn %x cnt %x off %x addr %x\n", 403*54881Storek tbp.b_blkno, count, boff, addr); 404*54881Storek #endif 405*54881Storek } else { 406*54881Storek count = resid & ~(bsize - 1); 407*54881Storek tbp.b_blkno = bn; 408*54881Storek tbp.b_un.b_addr = addr; 409*54881Storek tbp.b_bcount = count; 410*54881Storek #ifdef DEBUG 411*54881Storek if (sddebug & SDB_PARTIAL) 412*54881Storek printf(" fulltrans: bn %x cnt %x addr %x\n", 413*54881Storek tbp.b_blkno, count, addr); 414*54881Storek #endif 415*54881Storek } 416*54881Storek tbp.b_flags = B_BUSY | (bp->b_flags & B_READ); 417*54881Storek sdstrategy(&tbp); 418*54881Storek biowait(&tbp); 419*54881Storek if (tbp.b_flags & B_ERROR) { 420*54881Storek bp->b_flags |= B_ERROR; 421*54881Storek bp->b_error = tbp.b_error; 422*54881Storek break; 423*54881Storek } 424*54881Storek done: 425*54881Storek bn += btodb(count); 426*54881Storek resid -= count; 427*54881Storek addr += count; 428*54881Storek #ifdef DEBUG 429*54881Storek if (sddebug & SDB_PARTIAL) 430*54881Storek printf(" done: bn %x resid %x addr %x\n", 431*54881Storek bn, resid, addr); 432*54881Storek #endif 433*54881Storek } 434*54881Storek free(cbuf, M_DEVBUF); 435*54881Storek biodone(bp); 436*54881Storek } 437*54881Storek 438*54881Storek /* 439*54881Storek * Start a transfer on sc as described by bp 440*54881Storek * (i.e., call hba or target start). 441*54881Storek * If in format mode, we may not need dma. 442*54881Storek */ 443*54881Storek #define sdstart(sc, bp) { \ 444*54881Storek SD_TRACE(T_START, sc, bp); \ 445*54881Storek if ((sc)->sc_format_pid && legal_cmds[(sc)->sc_cmd.cdb_bytes[0]] > 0) \ 446*54881Storek (*(sc)->sc_unit.u_start)((sc)->sc_unit.u_updev, \ 447*54881Storek &(sc)->sc_unit.u_forw, (struct buf *)NULL, \ 448*54881Storek sdigo, &(sc)->sc_dk.dk_dev); \ 449*54881Storek else \ 450*54881Storek (*(sc)->sc_unit.u_start)((sc)->sc_unit.u_updev, \ 451*54881Storek &(sc)->sc_unit.u_forw, bp, sdgo, &(sc)->sc_dk.dk_dev); \ 452*54881Storek } 453*54881Storek 454*54881Storek void 455*54881Storek sdstrategy(bp) 456*54881Storek register struct buf *bp; 457*54881Storek { 458*54881Storek register struct sd_softc *sc = sdcd.cd_devs[sdunit(bp->b_dev)]; 459*54881Storek register int s; 460*54881Storek 461*54881Storek if (sc->sc_format_pid) { 462*54881Storek /* XXXXXXXXX SHOULD NOT COMPARE curproc IN HERE!?! */ 463*54881Storek /* 464*54881Storek * In format mode, only allow the owner to mess 465*54881Storek * with the drive. Skip all the partition checks. 466*54881Storek */ 467*54881Storek if (sc->sc_format_pid != curproc->p_pid) { 468*54881Storek bp->b_error = EPERM; 469*54881Storek bp->b_flags |= B_ERROR; 470*54881Storek biodone(bp); 471*54881Storek return; 472*54881Storek } 473*54881Storek bp->b_cylin = 0; 474*54881Storek } else { 475*54881Storek register daddr_t bn = bp->b_blkno; 476*54881Storek register int sz = howmany(bp->b_bcount, DEV_BSIZE); 477*54881Storek register struct partition *p; 478*54881Storek 479*54881Storek /* 480*54881Storek * Make sure transfer is within partition. 481*54881Storek * If it starts at the end, return EOF; if 482*54881Storek * it extends past the end, truncate it. 483*54881Storek */ 484*54881Storek p = &sc->sc_dk.dk_label.d_partitions[sdpart(bp->b_dev)]; 485*54881Storek if ((unsigned)bn >= p->p_size) { 486*54881Storek if ((unsigned)bn > p->p_size) { 487*54881Storek bp->b_error = EINVAL; 488*54881Storek bp->b_flags |= B_ERROR; 489*54881Storek } else 490*54881Storek bp->b_resid = bp->b_bcount; 491*54881Storek biodone(bp); 492*54881Storek return; 493*54881Storek } 494*54881Storek if (bn + sz > p->p_size) { 495*54881Storek sz = p->p_size - bn; 496*54881Storek bp->b_bcount = dbtob(sz); 497*54881Storek } 498*54881Storek /* 499*54881Storek * Non-aligned or partial-block transfers handled specially. 500*54881Storek * SHOULD THIS BE AT A HIGHER LEVEL? 501*54881Storek */ 502*54881Storek s = sc->sc_blksize - 1; 503*54881Storek if ((dbtob(bn) & s) || (bp->b_bcount & s)) { 504*54881Storek sdlblkstrat(bp, sc->sc_blksize); 505*54881Storek return; 506*54881Storek } 507*54881Storek bp->b_cylin = (bn + p->p_offset) >> sc->sc_bshift; 508*54881Storek } 509*54881Storek 510*54881Storek /* 511*54881Storek * Transfer valid, or format mode. Queue the request 512*54881Storek * on the drive, and maybe try to start it. 513*54881Storek */ 514*54881Storek s = splbio(); 515*54881Storek disksort(&sc->sc_tab, bp); 516*54881Storek if (sc->sc_tab.b_active == 0) { 517*54881Storek sc->sc_tab.b_active = 1; 518*54881Storek sdstart(sc, bp); 519*54881Storek } 520*54881Storek splx(s); 521*54881Storek } 522*54881Storek 523*54881Storek int 524*54881Storek sderror(sc, stat) 525*54881Storek register struct sd_softc *sc; 526*54881Storek register int stat; 527*54881Storek { 528*54881Storek register struct scsi_sense *sn; 529*54881Storek int retry = 0; 530*54881Storek 531*54881Storek sc->sc_sense.status = stat; 532*54881Storek if ((stat & STS_MASK) == STS_CHECKCOND) { 533*54881Storek sn = (struct scsi_sense *)sc->sc_sense.sense; 534*54881Storek stat = scsi_request_sense(sc->sc_unit.u_hba, 535*54881Storek sc->sc_unit.u_targ, sc->sc_unit.u_unit, 536*54881Storek (caddr_t)sn, sizeof sc->sc_sense.sense); 537*54881Storek sc->sc_sense.status = stat; /* ??? */ 538*54881Storek if ((stat & STS_MASK) != STS_GOOD) { 539*54881Storek printf("%s: sense failed, status %x\n", 540*54881Storek sc->sc_dk.dk_dev.dv_xname, stat); 541*54881Storek return (0); 542*54881Storek } 543*54881Storek printf("%s: scsi sense class %d, code %d", 544*54881Storek sc->sc_dk.dk_dev.dv_xname, 545*54881Storek SENSE_ECLASS(sn), SENSE_ECODE(sn)); 546*54881Storek if (SENSE_ISXSENSE(sn) && XSENSE_ISSTD(sn)) { 547*54881Storek int key; 548*54881Storek 549*54881Storek /* 550*54881Storek * Standard extended sense: can examine sense key 551*54881Storek * and (if valid) info. 552*54881Storek */ 553*54881Storek key = XSENSE_KEY(sn); 554*54881Storek printf(", key %d", key); 555*54881Storek if (XSENSE_IVALID(sn)) 556*54881Storek printf(", blk %d", XSENSE_INFO(sn)); 557*54881Storek /* no sense or recovered error, try again */ 558*54881Storek if (key == 0 || key == 1) 559*54881Storek retry = 1; 560*54881Storek } 561*54881Storek printf("\n"); 562*54881Storek } 563*54881Storek return (retry); 564*54881Storek } 565*54881Storek 566*54881Storek /* 567*54881Storek * sdigo is called from the hba driver when it has got the scsi bus 568*54881Storek * for us, and we were doing a format op that did not need dma. 569*54881Storek */ 570*54881Storek void 571*54881Storek sdigo(sc0, cdb) 572*54881Storek struct device *sc0; 573*54881Storek struct scsi_cdb *cdb; 574*54881Storek { 575*54881Storek register struct sd_softc *sc = (struct sd_softc *)sc0; 576*54881Storek register struct buf *bp = sc->sc_tab.b_actf; 577*54881Storek register int stat; 578*54881Storek 579*54881Storek stat = (*sc->sc_unit.u_hbd->hd_icmd)(sc->sc_unit.u_hba, 580*54881Storek sc->sc_unit.u_targ, &sc->sc_cmd, bp->b_un.b_addr, bp->b_bcount, 581*54881Storek bp->b_flags & B_READ); 582*54881Storek sc->sc_sense.status = stat; 583*54881Storek if (stat & 0xfe) { /* XXX */ 584*54881Storek (void) sderror(sc, stat); 585*54881Storek bp->b_flags |= B_ERROR; 586*54881Storek bp->b_error = EIO; 587*54881Storek } 588*54881Storek /* 589*54881Storek * Done with SCSI bus, before we `ought' to be. Release it. 590*54881Storek */ 591*54881Storek (*sc->sc_unit.u_rel)(sc->sc_unit.u_updev); 592*54881Storek bp->b_resid = 0; 593*54881Storek sc->sc_tab.b_errcnt = 0; 594*54881Storek sc->sc_tab.b_actf = bp->b_actf; 595*54881Storek biodone(bp); 596*54881Storek if ((bp = sc->sc_tab.b_actf) == NULL) 597*54881Storek sc->sc_tab.b_active = 0; 598*54881Storek else 599*54881Storek sdstart(sc, bp); 600*54881Storek } 601*54881Storek 602*54881Storek /* 603*54881Storek * sdgo is called from the hba driver or target code when it has 604*54881Storek * allocated the scsi bus and DMA resources and target datapath for us. 605*54881Storek */ 606*54881Storek void 607*54881Storek sdgo(sc0, cdb) 608*54881Storek struct device *sc0; 609*54881Storek register struct scsi_cdb *cdb; 610*54881Storek { 611*54881Storek register struct sd_softc *sc = (struct sd_softc *)sc0; 612*54881Storek register struct buf *bp = sc->sc_tab.b_actf; 613*54881Storek register int n; 614*54881Storek register unsigned int u; 615*54881Storek 616*54881Storek SD_TRACE(T_MKCDB, sc, bp); 617*54881Storek if (sc->sc_format_pid) { 618*54881Storek *cdb = sc->sc_cmd; 619*54881Storek n = 0; 620*54881Storek } else { 621*54881Storek CDB10(cdb)->cdb_cmd = bp->b_flags & B_READ ? CMD_READ10 : 622*54881Storek CMD_WRITE10; 623*54881Storek CDB10(cdb)->cdb_lun_rel = sc->sc_unit.u_unit << 5; 624*54881Storek u = bp->b_cylin; 625*54881Storek CDB10(cdb)->cdb_lbah = u >> 24; 626*54881Storek CDB10(cdb)->cdb_lbahm = u >> 16; 627*54881Storek CDB10(cdb)->cdb_lbalm = u >> 8; 628*54881Storek CDB10(cdb)->cdb_lbal = u; 629*54881Storek CDB10(cdb)->cdb_xxx = 0; 630*54881Storek n = sc->sc_blksize - 1; 631*54881Storek u = (bp->b_bcount + n) >> (DEV_BSHIFT + sc->sc_bshift); 632*54881Storek CDB10(cdb)->cdb_lenh = u >> 8; 633*54881Storek CDB10(cdb)->cdb_lenl = u; 634*54881Storek CDB10(cdb)->cdb_ctrl = 0; 635*54881Storek n = (bp->b_bcount & n) != 0; 636*54881Storek #ifdef DEBUG 637*54881Storek if (n) 638*54881Storek printf("%s: partial block xfer -- %x bytes\n", 639*54881Storek sc->sc_dk.dk_dev.dv_xname, bp->b_bcount); 640*54881Storek #endif 641*54881Storek sc->sc_transfers++; 642*54881Storek } 643*54881Storek if ((*sc->sc_unit.u_go)(sc->sc_unit.u_updev, sc->sc_unit.u_targ, 644*54881Storek sdintr, (void *)sc, bp, n) == 0) { 645*54881Storek #ifdef notyet 646*54881Storek sc->sc_dk.dk_busy = 1; 647*54881Storek sc->sc_dk.dk_seek++; /* XXX */ 648*54881Storek sc->sc_dk.dk_xfer++; 649*54881Storek sc->sc_dk.dk_wds += bp->b_bcount >> 6; 650*54881Storek #endif 651*54881Storek return; 652*54881Storek } 653*54881Storek /* 654*54881Storek * Some sort of nasty unrecoverable error: clobber the 655*54881Storek * transfer. Call the bus release function first, though. 656*54881Storek */ 657*54881Storek (*sc->sc_unit.u_rel)(sc->sc_unit.u_updev); 658*54881Storek #ifdef DEBUG 659*54881Storek if (sddebug & SDB_ERROR) 660*54881Storek printf("%s: sdgo: %s adr %d blk %d len %d ecnt %d\n", 661*54881Storek sc->sc_dk.dk_dev.dv_xname, 662*54881Storek bp->b_flags & B_READ? "read" : "write", 663*54881Storek bp->b_un.b_addr, bp->b_cylin, bp->b_bcount, 664*54881Storek sc->sc_tab.b_errcnt); 665*54881Storek #endif 666*54881Storek bp->b_flags |= B_ERROR; 667*54881Storek bp->b_error = EIO; 668*54881Storek bp->b_resid = 0; 669*54881Storek sc->sc_tab.b_errcnt = 0; 670*54881Storek sc->sc_tab.b_actf = bp->b_actf; 671*54881Storek biodone(bp); 672*54881Storek if ((bp = sc->sc_tab.b_actf) == NULL) 673*54881Storek sc->sc_tab.b_active = 0; 674*54881Storek else 675*54881Storek sdstart(sc, bp); 676*54881Storek } 677*54881Storek 678*54881Storek /* 679*54881Storek * A transfer finished (or, someday, disconnected). 680*54881Storek * We are already off the target/hba queues. 681*54881Storek * Restart this one for error recovery, or start the next, as appropriate. 682*54881Storek */ 683*54881Storek void 684*54881Storek sdintr(sc0, stat, resid) 685*54881Storek struct device *sc0; 686*54881Storek int stat, resid; 687*54881Storek { 688*54881Storek register struct sd_softc *sc = (struct sd_softc *)sc0; 689*54881Storek register struct buf *bp = sc->sc_tab.b_actf; 690*54881Storek int retry; 691*54881Storek 692*54881Storek if (bp == NULL) 693*54881Storek panic("sdintr"); 694*54881Storek SD_TRACE(T_INTR, sc, bp); 695*54881Storek #ifdef notyet 696*54881Storek sc->sc_dk.dk_busy = 0; 697*54881Storek #endif 698*54881Storek if ((stat & STS_MASK) != STS_GOOD) { 699*54881Storek #ifdef DEBUG 700*54881Storek if (sddebug & SDB_ERROR) 701*54881Storek printf("%s: sdintr scsi status 0x%x resid %d\n", 702*54881Storek sc->sc_dk.dk_dev.dv_xname, stat, resid); 703*54881Storek #endif 704*54881Storek retry = sderror(sc, stat); 705*54881Storek if (retry && ++sc->sc_tab.b_errcnt <= SDRETRY) { 706*54881Storek printf("%s: retry %d\n", 707*54881Storek sc->sc_dk.dk_dev.dv_xname, sc->sc_tab.b_errcnt); 708*54881Storek goto restart; 709*54881Storek } 710*54881Storek bp->b_flags |= B_ERROR; 711*54881Storek bp->b_error = EIO; 712*54881Storek } 713*54881Storek bp->b_resid = resid; 714*54881Storek sc->sc_tab.b_errcnt = 0; 715*54881Storek sc->sc_tab.b_actf = bp->b_actf; 716*54881Storek biodone(bp); 717*54881Storek if ((bp = sc->sc_tab.b_actf) == NULL) 718*54881Storek sc->sc_tab.b_active = 0; 719*54881Storek else { 720*54881Storek restart: 721*54881Storek sdstart(sc, bp); 722*54881Storek } 723*54881Storek } 724*54881Storek 725*54881Storek int 726*54881Storek sdioctl(dev_t dev, int cmd, register caddr_t data, int flag, struct proc *p) 727*54881Storek { 728*54881Storek register struct sd_softc *sc = sdcd.cd_devs[sdunit(dev)]; 729*54881Storek #ifdef COMPAT_SUNOS 730*54881Storek int error; 731*54881Storek 732*54881Storek error = sun_dkioctl(&sc->sc_dk, cmd, data, sdpart(dev)); 733*54881Storek if (error >= 0) 734*54881Storek return (error); 735*54881Storek #endif 736*54881Storek switch (cmd) { 737*54881Storek 738*54881Storek case SDIOCSFORMAT: 739*54881Storek /* take this device into or out of "format" mode */ 740*54881Storek if (!suser(p->p_ucred, &p->p_acflag)) 741*54881Storek return (EPERM); 742*54881Storek if (*(int *)data) { 743*54881Storek if (sc->sc_format_pid) 744*54881Storek return (EPERM); 745*54881Storek sc->sc_format_pid = p->p_pid; 746*54881Storek } else 747*54881Storek sc->sc_format_pid = 0; 748*54881Storek break; 749*54881Storek 750*54881Storek case SDIOCGFORMAT: 751*54881Storek /* find out who has the device in format mode */ 752*54881Storek *(int *)data = sc->sc_format_pid; 753*54881Storek break; 754*54881Storek 755*54881Storek case SDIOCSCSICOMMAND: 756*54881Storek #define cdb ((struct scsi_cdb *)data) 757*54881Storek /* 758*54881Storek * Save what user gave us as SCSI cdb to use with next 759*54881Storek * read or write to the char device. 760*54881Storek */ 761*54881Storek if (sc->sc_format_pid != p->p_pid) 762*54881Storek return (EPERM); 763*54881Storek if (legal_cmds[cdb->cdb_bytes[0]] == 0) 764*54881Storek return (EINVAL); 765*54881Storek sc->sc_cmd = *cdb; 766*54881Storek #undef cdb 767*54881Storek break; 768*54881Storek 769*54881Storek case SDIOCSENSE: 770*54881Storek /* 771*54881Storek * return the SCSI sense data saved after the last 772*54881Storek * operation that completed with "check condition" status. 773*54881Storek */ 774*54881Storek sc->sc_sense = *(struct scsi_fmt_sense *)data; 775*54881Storek break; 776*54881Storek 777*54881Storek default: 778*54881Storek return (ENOTTY); 779*54881Storek } 780*54881Storek return (0); 781*54881Storek } 782*54881Storek 783*54881Storek int 784*54881Storek sdsize(dev_t dev) 785*54881Storek { 786*54881Storek register int unit = sdunit(dev); 787*54881Storek register struct sd_softc *sc; 788*54881Storek 789*54881Storek if (unit >= sdcd.cd_ndevs || (sc = sdcd.cd_devs[unit]) == NULL || 790*54881Storek (sc->sc_flags & SDF_ALIVE) == 0) 791*54881Storek return (-1); 792*54881Storek return (sc->sc_dk.dk_label.d_partitions[sdpart(dev)].p_size); 793*54881Storek } 794*54881Storek 795*54881Storek /* 796*54881Storek * Write `len' bytes from address `addr' to drive and partition in `dev', 797*54881Storek * at block blkoff from the beginning of the partition. The address is 798*54881Storek * either kernel virtual or physical (some machines may never use one or 799*54881Storek * the other, but we need it in the protocol to stay machine-independent). 800*54881Storek */ 801*54881Storek int 802*54881Storek sddump(dev_t dev, daddr_t blkoff, caddr_t addr, int len) 803*54881Storek { 804*54881Storek register struct sd_softc *sc; 805*54881Storek register struct partition *p; 806*54881Storek register daddr_t bn, n, nblks; 807*54881Storek register struct hba_softc *hba; 808*54881Storek register int stat, unit; 809*54881Storek struct scsi_cdb cdb; 810*54881Storek 811*54881Storek /* drive ok? */ 812*54881Storek unit = sdunit(dev); 813*54881Storek if (unit >= sdcd.cd_ndevs || (sc = sdcd.cd_devs[unit]) == NULL || 814*54881Storek (sc->sc_flags & SDF_ALIVE) == 0) 815*54881Storek return (ENXIO); 816*54881Storek 817*54881Storek /* blocks in range? */ 818*54881Storek p = &sc->sc_dk.dk_label.d_partitions[sdpart(dev)]; 819*54881Storek n = (len + sc->sc_blksize - 1) >> DEV_BSHIFT; 820*54881Storek if (blkoff < 0 || blkoff >= p->p_size || blkoff + n > p->p_size) 821*54881Storek return (EINVAL); 822*54881Storek bn = blkoff + p->p_offset; 823*54881Storek bn >>= sc->sc_bshift; 824*54881Storek 825*54881Storek /* scsi bus idle? */ 826*54881Storek hba = sc->sc_unit.u_hba; 827*54881Storek if (hba->hba_head) { 828*54881Storek (*hba->hba_driver->hd_reset)(hba, 0); 829*54881Storek printf("[reset %s] ", sc->sc_dk.dk_dev.dv_xname); 830*54881Storek } 831*54881Storek 832*54881Storek CDB10(&cdb)->cdb_cmd = CMD_WRITE10; 833*54881Storek CDB10(&cdb)->cdb_lun_rel = sc->sc_unit.u_unit << 5; 834*54881Storek CDB10(&cdb)->cdb_xxx = 0; 835*54881Storek CDB10(&cdb)->cdb_ctrl = 0; 836*54881Storek 837*54881Storek #define DUMP_MAX (32 * 1024) /* no more than 32k per write */ 838*54881Storek for (;;) { 839*54881Storek if ((n = len) > DUMP_MAX) 840*54881Storek n = DUMP_MAX; 841*54881Storek CDB10(&cdb)->cdb_lbah = bn >> 24; 842*54881Storek CDB10(&cdb)->cdb_lbahm = bn >> 16; 843*54881Storek CDB10(&cdb)->cdb_lbalm = bn >> 8; 844*54881Storek CDB10(&cdb)->cdb_lbal = bn; 845*54881Storek nblks = n >> (DEV_BSHIFT + sc->sc_bshift); 846*54881Storek CDB10(&cdb)->cdb_lenh = nblks >> 8; 847*54881Storek CDB10(&cdb)->cdb_lenl = nblks; 848*54881Storek stat = hba->hba_driver->hd_dump(hba, sc->sc_unit.u_targ, 849*54881Storek &cdb, addr, n); 850*54881Storek if ((stat & STS_MASK) != STS_GOOD) { 851*54881Storek printf("%s: scsi write error 0x%x\ndump ", 852*54881Storek sc->sc_dk.dk_dev.dv_xname, stat); 853*54881Storek return (EIO); 854*54881Storek } 855*54881Storek if ((len -= n) == 0) 856*54881Storek return (0); 857*54881Storek addr += n; 858*54881Storek bn += nblks; 859*54881Storek } 860*54881Storek } 861