xref: /csrg-svn/sys/dev/scsi/sd.c (revision 54881)
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