New generic disk framework. Highlights:
- New metrics handling. Metrics are now kept in the new `struct disk'. Busy time is now stored as a timeval, and transfer count in bytes. - Storage for disklabels is now dynamically allocated, so that the size of the disk structure is not machine-dependent. - Several new functions for attaching and detaching disks, and handling metrics calculation. Old-style instrumentation is still supported in drivers that did it before. However, old-style instrumentation is being deprecated, and will go away once the userland utilities are updated for the new framework. For usage and architectural details, see the forthcoming disk(9) manual page.
This commit is contained in:
parent
94bf233ae9
commit
5b39541e48
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: disksubr.c,v 1.3 1995/04/22 12:43:22 cgd Exp $ */
|
||||
/* $NetBSD: disksubr.c,v 1.4 1996/01/07 22:01:38 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
|
||||
@ -45,7 +45,7 @@ extern struct device *bootdv;
|
||||
/* was this the boot device ? */
|
||||
int
|
||||
dk_establish(dk, dev)
|
||||
struct dkdevice *dk;
|
||||
struct disk *dk;
|
||||
struct device *dev;
|
||||
{
|
||||
#ifdef NOTDEF
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: disksubr.c,v 1.20 1995/09/29 13:51:33 chopps Exp $ */
|
||||
/* $NetBSD: disksubr.c,v 1.21 1996/01/07 22:01:44 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994 Christian E. Hopps
|
||||
@ -80,7 +80,7 @@ struct rdbmap *getrdbmap __P((dev_t, void (*)(), struct disklabel *,
|
||||
/* XXX unknown function but needed for /sys/scsi to link */
|
||||
int
|
||||
dk_establish(dk, dev)
|
||||
struct dkdevice *dk;
|
||||
struct disk *dk;
|
||||
struct device *dev;
|
||||
{
|
||||
return(-1);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: swapgeneric.c,v 1.19 1995/04/19 13:02:57 chopps Exp $ */
|
||||
/* $NetBSD: swapgeneric.c,v 1.20 1996/01/07 22:01:46 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1982, 1986 Regents of the University of California.
|
||||
@ -133,7 +133,8 @@ getgenconf(bp)
|
||||
|
||||
setconf()
|
||||
{
|
||||
struct dkdevice *dkp;
|
||||
struct disk *dkp;
|
||||
struct device **devpp;
|
||||
struct partition *pp;
|
||||
struct genericconf *gc;
|
||||
struct bdevsw *bdp;
|
||||
@ -157,16 +158,20 @@ setconf()
|
||||
unit &= 0x7;
|
||||
goto found;
|
||||
}
|
||||
|
||||
for (gc = genericconf; gc->gc_driver; gc++) {
|
||||
for (unit = gc->gc_driver->cd_ndevs - 1; unit >= 0; unit--) {
|
||||
if (gc->gc_driver->cd_devs[unit] == NULL)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* this is a hack these drivers should use
|
||||
* dk_dev and not another instance directly above.
|
||||
* Find the disk corresponding to the current
|
||||
* device.
|
||||
*/
|
||||
dkp = (struct dkdevice *)
|
||||
((struct device *)gc->gc_driver->cd_devs[unit] + 1);
|
||||
devpp = (struct device **)gc->gc_driver->cd_devs;
|
||||
if ((dkp = disk_find(devpp[unit]->dv_xname)) == NULL)
|
||||
continue;
|
||||
|
||||
if (dkp->dk_driver == NULL ||
|
||||
dkp->dk_driver->d_strategy == NULL)
|
||||
continue;
|
||||
@ -179,7 +184,7 @@ setconf()
|
||||
continue;
|
||||
bdp->d_close(MAKEDISKDEV(major(gc->gc_root), unit,
|
||||
0), FREAD | FNONBLOCK, 0, curproc);
|
||||
pp = &dkp->dk_label.d_partitions[0];
|
||||
pp = &dkp->dk_label->d_partitions[0];
|
||||
if (pp->p_size == 0 || pp->p_fstype != FS_BSDFFS)
|
||||
continue;
|
||||
goto found;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: fd.c,v 1.21 1995/08/12 20:30:45 mycroft Exp $ */
|
||||
/* $NetBSD: fd.c,v 1.22 1996/01/07 22:01:50 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994 Christian E. Hopps
|
||||
@ -110,7 +110,8 @@ struct fdtype {
|
||||
* floppy disk device data
|
||||
*/
|
||||
struct fd_softc {
|
||||
struct dkdevice dkdev;
|
||||
struct device sc_dv; /* generic device info; must come first */
|
||||
struct disk dkdev; /* generic disk info */
|
||||
struct buf bufq; /* queue of buf's */
|
||||
struct fdtype *type;
|
||||
void *cachep; /* cached track data (write through) */
|
||||
@ -336,12 +337,18 @@ fdattach(pdp, dp, auxp)
|
||||
sc->hwunit = ap->unit;
|
||||
sc->unitmask = 1 << (3 + ap->unit);
|
||||
sc->retries = FDRETRIES;
|
||||
sc->dkdev.dk_driver = &fddkdriver;
|
||||
sc->stepdelay = FDSTEPDELAY;
|
||||
printf(": %s %d cyl, %d head, %d sec [%d sec], 512 bytes/sec\n",
|
||||
sc->type->desc, sc->type->ncylinders, FDNHEADS,
|
||||
sc->type->amiga_nsectors, sc->type->msdos_nsectors);
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
sc->dkdev.dk_name = sc->sc_dv.dv_xname;
|
||||
sc->dkdev.dk_driver = &fddkdriver;
|
||||
disk_attach(&sc->dkdev);
|
||||
|
||||
/*
|
||||
* calibrate the drive
|
||||
*/
|
||||
@ -491,15 +498,15 @@ fdioctl(dev, cmd, addr, flag, p)
|
||||
case DIOCSSTEP:
|
||||
if (*(int *)addr < FDSTEPDELAY)
|
||||
return(EINVAL);
|
||||
sc->dkdev.dk_label.d_trkseek = sc->stepdelay = *(int *)addr;
|
||||
sc->dkdev.dk_label->d_trkseek = sc->stepdelay = *(int *)addr;
|
||||
return(0);
|
||||
case DIOCGDINFO:
|
||||
*(struct disklabel *)addr = sc->dkdev.dk_label;
|
||||
*(struct disklabel *)addr = *(sc->dkdev.dk_label);
|
||||
return(0);
|
||||
case DIOCGPART:
|
||||
((struct partinfo *)addr)->disklab = &sc->dkdev.dk_label;
|
||||
((struct partinfo *)addr)->disklab = sc->dkdev.dk_label;
|
||||
((struct partinfo *)addr)->part =
|
||||
&sc->dkdev.dk_label.d_partitions[FDPART(dev)];
|
||||
&sc->dkdev.dk_label->d_partitions[FDPART(dev)];
|
||||
return(0);
|
||||
case DIOCSDINFO:
|
||||
if ((flag & FWRITE) == 0)
|
||||
@ -582,7 +589,7 @@ fdstrategy(bp)
|
||||
/*
|
||||
* check for valid partition and bounds
|
||||
*/
|
||||
lp = &sc->dkdev.dk_label;
|
||||
lp = sc->dkdev.dk_label;
|
||||
if ((sc->flags & FDF_HAVELABEL) == 0) {
|
||||
bp->b_error = EIO;
|
||||
goto bad;
|
||||
@ -667,8 +674,8 @@ fdgetdisklabel(sc, dev)
|
||||
printf("fdgetdisklabel()\n");
|
||||
#endif
|
||||
part = FDPART(dev);
|
||||
lp = &sc->dkdev.dk_label;
|
||||
clp = &sc->dkdev.dk_cpulabel;
|
||||
lp = sc->dkdev.dk_label;
|
||||
clp = sc->dkdev.dk_cpulabel;
|
||||
bzero(lp, sizeof(struct disklabel));
|
||||
bzero(clp, sizeof(struct cpu_disklabel));
|
||||
|
||||
@ -748,7 +755,7 @@ fdsetdisklabel(sc, lp)
|
||||
*/
|
||||
if ((sc->flags & FDF_HAVELABEL) == 0)
|
||||
return(EINVAL);
|
||||
clp = &sc->dkdev.dk_label;
|
||||
clp = sc->dkdev.dk_label;
|
||||
/*
|
||||
* make sure things check out and we only have one valid
|
||||
* partition
|
||||
@ -814,7 +821,7 @@ fdputdisklabel(sc, dev)
|
||||
/*
|
||||
* get buf and read in sector 0
|
||||
*/
|
||||
lp = &sc->dkdev.dk_label;
|
||||
lp = sc->dkdev.dk_label;
|
||||
bp = (void *)geteblk((int)lp->d_secsize);
|
||||
bp->b_dev = FDMAKEDEV(major(dev), FDUNIT(dev), RAW_PART);
|
||||
bp->b_blkno = 0;
|
||||
@ -1163,6 +1170,9 @@ fdstart(sc)
|
||||
*/
|
||||
trk = bp->b_blkno / sc->nsectors;
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&sc->dkdev);
|
||||
|
||||
/*
|
||||
* check to see if same as currently cached track
|
||||
* if so we need to do no dma read.
|
||||
@ -1377,7 +1387,7 @@ fddmadone(sc, timeo)
|
||||
sc->flags &= ~FDF_DIRTY;
|
||||
if (timeo)
|
||||
printf("%s: write of track cache timed out.\n",
|
||||
sc->dkdev.dk_dev.dv_xname);
|
||||
sc->dv.dv_xname);
|
||||
if (sc->flags & FDF_JUSTFLUSH) {
|
||||
sc->flags &= ~FDF_JUSTFLUSH;
|
||||
/*
|
||||
@ -1406,7 +1416,7 @@ fddmadone(sc, timeo)
|
||||
#ifdef FDDEBUG
|
||||
if (timeo)
|
||||
printf("%s: fddmadone: cache load timed out.\n",
|
||||
sc->dkdev.dk_dev.dv_xname);
|
||||
sc->sc_dv.dv_xname);
|
||||
#endif
|
||||
if (sc->retried >= sc->retries) {
|
||||
sc->retried = 0;
|
||||
@ -1484,9 +1494,12 @@ fddone(sc)
|
||||
* remove from queue.
|
||||
*/
|
||||
dp->b_actf = bp->b_actf;
|
||||
|
||||
disk_unbusy(&sc->dkdev, (bp->b_bcount - bp->b_resid));
|
||||
|
||||
biodone(bp);
|
||||
nobuf:
|
||||
fdfindwork(sc->dkdev.dk_dev.dv_unit);
|
||||
fdfindwork(sc->sc_dv.dv_unit);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1684,7 +1697,7 @@ again:
|
||||
if (doagain == 0 || (rp = srp = fdfindsync(srp, erp)) == NULL) {
|
||||
#ifdef DIAGNOSTIC
|
||||
printf("%s: corrupted track (%d) data.\n",
|
||||
sc->dkdev.dk_dev.dv_xname, sc->cachetrk);
|
||||
sc->sc_dv.dv_xname, sc->cachetrk);
|
||||
#endif
|
||||
return(-1);
|
||||
}
|
||||
@ -1707,7 +1720,7 @@ again:
|
||||
if (((info >> 16) & 0xff) != sc->cachetrk) {
|
||||
#ifdef DEBUG
|
||||
printf("%s: incorrect track found: 0x%0x %d\n",
|
||||
sc->dkdev.dk_dev.dv_xname, info, sc->cachetrk);
|
||||
sc->sc_dv.dv_xname, info, sc->cachetrk);
|
||||
#endif
|
||||
goto again;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: idesc.c,v 1.14 1995/10/05 12:41:22 chopps Exp $ */
|
||||
/* $NetBSD: idesc.c,v 1.15 1996/01/07 22:01:53 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994 Michael L. Hitch
|
||||
@ -528,6 +528,10 @@ ide_scsidone(dev, stat)
|
||||
panic("ide_scsidone");
|
||||
#endif
|
||||
#if 1
|
||||
/*
|
||||
* XXX Support old-style instrumentation for now.
|
||||
* IS THIS REALLY THE RIGHT PLACE FOR THIS? --thorpej
|
||||
*/
|
||||
if (xs->sc_link && xs->sc_link->device_softc &&
|
||||
((struct device *)(xs->sc_link->device_softc))->dv_unit < dk_ndrive)
|
||||
++dk_xfer[((struct device *)(xs->sc_link->device_softc))->dv_unit];
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sbic.c,v 1.20 1995/11/30 00:57:13 jtc Exp $ */
|
||||
/* $NetBSD: sbic.c,v 1.21 1996/01/07 22:01:54 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994 Christian E. Hopps
|
||||
@ -562,6 +562,10 @@ sbic_scsidone(acb, stat)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* XXX Support old-style instrumentation for now.
|
||||
* IS THIS REALLY THE RIGHT PLACE FOR THIS? --thorpej
|
||||
*/
|
||||
if (slp->device_softc &&
|
||||
((struct device *)(slp->device_softc))->dv_unit < dk_ndrive)
|
||||
++dk_xfer[((struct device *)(slp->device_softc))->dv_unit];
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sci.c,v 1.14 1995/09/29 13:52:02 chopps Exp $ */
|
||||
/* $NetBSD: sci.c,v 1.15 1996/01/07 22:01:56 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994 Michael L. Hitch
|
||||
@ -215,6 +215,10 @@ sci_scsidone(dev, stat)
|
||||
if (xs == NULL)
|
||||
panic("sci_scsidone");
|
||||
#endif
|
||||
/*
|
||||
* XXX Support old-style instrumentation for now.
|
||||
* IS THIS REALLY THE RIGHT PLACE FOR THIS? --thorpej
|
||||
*/
|
||||
if (xs->sc_link->device_softc &&
|
||||
((struct device *)(xs->sc_link->device_softc))->dv_unit < dk_ndrive)
|
||||
++dk_xfer[((struct device *)(xs->sc_link->device_softc))->dv_unit];
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: siop.c,v 1.26 1995/11/30 00:57:23 jtc Exp $ */
|
||||
/* $NetBSD: siop.c,v 1.27 1996/01/07 22:01:58 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994 Michael L. Hitch
|
||||
@ -365,7 +365,11 @@ siop_scsidone(acb, stat)
|
||||
if (acb == NULL || xs == NULL)
|
||||
panic("siop_scsidone");
|
||||
#endif
|
||||
if (slp->device_softc &&
|
||||
/*
|
||||
* XXX Support old-style instrumentation for now.
|
||||
* IS THIS REALLY THE RIGHT PLACE FOR THIS? --thorpej
|
||||
*/
|
||||
if (slp->device_softc &&
|
||||
((struct device *)(slp->device_softc))->dv_unit < dk_ndrive)
|
||||
++dk_xfer[((struct device *)(slp->device_softc))->dv_unit];
|
||||
/*
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: swapgeneric.c,v 1.2 1995/11/30 21:55:01 leo Exp $ */
|
||||
/* $NetBSD: swapgeneric.c,v 1.3 1996/01/07 22:02:02 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Leo Weppelman
|
||||
@ -259,7 +259,8 @@ int *rv_unit;
|
||||
{
|
||||
struct genericconf *gc;
|
||||
struct partition *pp;
|
||||
struct dkdevice *dkp;
|
||||
struct disk *dkp;
|
||||
struct device **devpp;
|
||||
struct bdevsw *bdp;
|
||||
int unit;
|
||||
|
||||
@ -267,13 +268,17 @@ int *rv_unit;
|
||||
for (unit = 0; unit < gc->gc_driver->cd_ndevs; unit++) {
|
||||
if (gc->gc_driver->cd_devs[unit] == NULL)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* this is a hack these drivers should use
|
||||
* dk_dev and not another instance directly above.
|
||||
* Find the disk corresponding to the current
|
||||
* device.
|
||||
*/
|
||||
dkp = (struct dkdevice *)
|
||||
((struct device *)gc->gc_driver->cd_devs[unit] + 1);
|
||||
if (dkp->dk_driver==NULL || dkp->dk_driver->d_strategy==NULL)
|
||||
devpp = (struct device **)gc->gc_driver->cd_devs;
|
||||
if ((dkp = disk_find(devpp[unit]->dv_xname)) == NULL)
|
||||
continue;
|
||||
|
||||
if ((dkp->dk_driver == NULL) ||
|
||||
(dkp->dk_driver->d_strategy == NULL))
|
||||
continue;
|
||||
for (bdp = bdevsw; bdp < (bdevsw + nblkdev); bdp++)
|
||||
if (bdp->d_strategy == dkp->dk_driver->d_strategy)
|
||||
@ -284,12 +289,12 @@ int *rv_unit;
|
||||
bdp->d_close(MAKEDISKDEV(major(gc->gc_root), unit, 3),
|
||||
FREAD | FNONBLOCK, 0, curproc);
|
||||
if (search_root) {
|
||||
pp = &dkp->dk_label.d_partitions[0];
|
||||
pp = &dkp->dk_label->d_partitions[0];
|
||||
if (pp->p_size == 0 || pp->p_fstype != FS_BSDFFS)
|
||||
continue;
|
||||
}
|
||||
else { /* must be swap */
|
||||
pp = &dkp->dk_label.d_partitions[1];
|
||||
pp = &dkp->dk_label->d_partitions[1];
|
||||
if (pp->p_size == 0 || pp->p_fstype != FS_SWAP)
|
||||
continue;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: fd.c,v 1.12 1995/12/10 14:25:12 leo Exp $ */
|
||||
/* $NetBSD: fd.c,v 1.13 1996/01/07 22:02:05 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Leo Weppelman.
|
||||
@ -125,7 +125,8 @@ static char *fd_error= NULL; /* error from fd_xfer_ok() */
|
||||
* Private per device data
|
||||
*/
|
||||
struct fd_softc {
|
||||
struct dkdevice dkdev;
|
||||
struct device sc_dv; /* generic device info */
|
||||
struct disk dkdev; /* generic disk info */
|
||||
struct buf bufq; /* queue of buf's */
|
||||
int unit; /* unit for atari controlling hw*/
|
||||
int nheads; /* number of heads in use */
|
||||
@ -315,7 +316,12 @@ void *auxp;
|
||||
|
||||
printf("\n");
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
sc->dkdev.dk_name = sc->sc_dv.dv_xname;
|
||||
sc->dkdev.dk_driver = &fddkdriver;
|
||||
disk_attach(&sc->dkdev);
|
||||
}
|
||||
|
||||
fdioctl(dev, cmd, addr, flag, p)
|
||||
@ -337,13 +343,13 @@ struct proc *p;
|
||||
case DIOCSBAD:
|
||||
return(EINVAL);
|
||||
case DIOCGDINFO:
|
||||
*(struct disklabel *)addr = sc->dkdev.dk_label;
|
||||
*(struct disklabel *)addr = *(sc->dkdev.dk_label);
|
||||
return(0);
|
||||
case DIOCGPART:
|
||||
((struct partinfo *)addr)->disklab =
|
||||
&sc->dkdev.dk_label;
|
||||
sc->dkdev.dk_label;
|
||||
((struct partinfo *)addr)->part =
|
||||
&sc->dkdev.dk_label.d_partitions[DISKPART(dev)];
|
||||
&sc->dkdev.dk_label->d_partitions[DISKPART(dev)];
|
||||
return(0);
|
||||
#ifdef notyet /* XXX LWP */
|
||||
case DIOCSRETRIES:
|
||||
@ -497,7 +503,7 @@ struct buf *bp;
|
||||
/*
|
||||
* check for valid partition and bounds
|
||||
*/
|
||||
lp = &sc->dkdev.dk_label;
|
||||
lp = sc->dkdev.dk_label;
|
||||
if ((sc->flags & FLPF_HAVELAB) == 0) {
|
||||
bp->b_error = EIO;
|
||||
goto bad;
|
||||
@ -599,6 +605,9 @@ struct fd_softc *sc;
|
||||
sc->errcnt = 0; /* No errors yet */
|
||||
fd_state = FLP_XFER; /* Yes, we're going to transfer */
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&sc->dkdev);
|
||||
|
||||
fd_xfer(sc);
|
||||
}
|
||||
|
||||
@ -638,6 +647,9 @@ register struct fd_softc *sc;
|
||||
sc->io_bytes);
|
||||
#endif
|
||||
bp->b_resid = sc->io_bytes;
|
||||
|
||||
disk_unbusy(&sc->dkdev, (bp->b_bcount - bp->b_resid));
|
||||
|
||||
biodone(bp);
|
||||
}
|
||||
fd_state = FLP_MON;
|
||||
@ -1219,7 +1231,7 @@ dev_t dev;
|
||||
#endif
|
||||
|
||||
part = DISKPART(dev);
|
||||
lp = &sc->dkdev.dk_label;
|
||||
lp = sc->dkdev.dk_label;
|
||||
bzero(lp, sizeof(struct disklabel));
|
||||
|
||||
lp->d_secsize = SECTOR_SIZE;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: ramd.c,v 1.5 1995/08/12 20:31:02 mycroft Exp $ */
|
||||
/* $NetBSD: ramd.c,v 1.6 1996/01/07 22:02:06 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Leo Weppelman.
|
||||
@ -101,6 +101,8 @@ struct read_info {
|
||||
void (*strat)(); /* strategy function for read */
|
||||
};
|
||||
|
||||
static struct disk ramd_disks[RAMD_NDEV]; /* XXX Ick. */
|
||||
|
||||
/*
|
||||
* Autoconfig stuff....
|
||||
*/
|
||||
@ -112,6 +114,10 @@ struct cfdriver ramdcd = {
|
||||
NULL, "rd", (cfmatch_t)ramdmatch, ramdattach, DV_DULL,
|
||||
sizeof(struct device), NULL, 0 };
|
||||
|
||||
void rdstrategy __P((struct buf *));
|
||||
|
||||
struct dkdriver ramddkdriver = { rdstrategy };
|
||||
|
||||
static int
|
||||
ramdmatch(pdp, cfp, auxp)
|
||||
struct device *pdp;
|
||||
@ -129,9 +135,28 @@ struct device *pdp, *dp;
|
||||
void *auxp;
|
||||
{
|
||||
int i;
|
||||
struct disk *diskp;
|
||||
|
||||
/*
|
||||
* XXX It's not really clear to me _exactly_ what's going
|
||||
* on here, so this might need to be adjusted. --thorpej
|
||||
*/
|
||||
|
||||
for(i = 0; i < RAMD_NDEV; i++) {
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
diskp = &ramd_disks[i];
|
||||
bzero(diskp, sizeof(struct disk));
|
||||
if ((diskp->dk_name = malloc(8, M_DEVBUF, M_NOWAIT)) == NULL)
|
||||
panic("ramdattach: can't allocate space for name");
|
||||
bzero(diskp->dk_name, 8);
|
||||
sprintf(diskp->dk_name, "rd%d", i);
|
||||
diskp->dk_driver = &ramddkdriver;
|
||||
disk_attach(diskp);
|
||||
|
||||
for(i = 0; i < RAMD_NDEV; i++)
|
||||
config_found(dp, (void*)i, ramdprint);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: rd.c,v 1.16 1995/12/09 07:31:07 thorpej Exp $ */
|
||||
/* $NetBSD: rd.c,v 1.17 1996/01/07 22:02:12 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988 University of Utah.
|
||||
@ -52,8 +52,9 @@
|
||||
#include <sys/systm.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/dkstat.h>
|
||||
#include <sys/dkstat.h> /* XXX */
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/disk.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
@ -231,6 +232,19 @@ rdmatch(hd)
|
||||
rs->sc_punit = rdpunit(hd->hp_flags);
|
||||
rs->sc_type = rdident(rs, hd, 0);
|
||||
if (rs->sc_type < 0)
|
||||
return(0);
|
||||
|
||||
/* XXX set up the external name */
|
||||
bzero(rs->sc_xname, sizeof(rs->sc_xname));
|
||||
sprintf(rs->sc_xname, "rd%d", hd->hp_unit);
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
bzero(&rs->sc_dkdev, sizeof(rs->sc_dkdev));
|
||||
rs->sc_dkdev.dk_name = rs->sc_xname;
|
||||
disk_attach(&rs->sc_dkdev);
|
||||
|
||||
return (0);
|
||||
|
||||
return (1);
|
||||
@ -420,7 +434,7 @@ rdgetinfo(dev)
|
||||
{
|
||||
int unit = rdunit(dev);
|
||||
register struct rd_softc *rs = &rd_softc[unit];
|
||||
register struct disklabel *lp = &rs->sc_info.ri_label;
|
||||
register struct disklabel *lp = rs->sc_dkdev.dk_label;
|
||||
register struct partition *pi;
|
||||
char *msg, *readdisklabel();
|
||||
|
||||
@ -485,7 +499,7 @@ rdopen(dev, flags, mode, p)
|
||||
* We may block reading the label, so be careful
|
||||
* to stop any other opens.
|
||||
*/
|
||||
if (rs->sc_info.ri_open == 0) {
|
||||
if (rs->sc_dkdev.dk_openmask == 0) {
|
||||
rs->sc_flags |= RDF_OPENING;
|
||||
error = rdgetinfo(dev);
|
||||
rs->sc_flags &= ~RDF_OPENING;
|
||||
@ -496,17 +510,19 @@ rdopen(dev, flags, mode, p)
|
||||
if (rs->sc_hd->hp_dk >= 0) {
|
||||
/* guess at xfer rate based on 3600 rpm (60 rps) */
|
||||
if (rs->sc_wpms == 0)
|
||||
rs->sc_wpms = 60 * rs->sc_info.ri_label.d_nsectors
|
||||
rs->sc_wpms = 60 * rs->sc_dkdev.dk_label->d_nsectors
|
||||
* DEV_BSIZE / 2;
|
||||
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
dk_wpms[rs->sc_hd->hp_dk] = rs->sc_wpms;
|
||||
}
|
||||
|
||||
mask = 1 << rdpart(dev);
|
||||
if (mode == S_IFCHR)
|
||||
rs->sc_info.ri_copen |= mask;
|
||||
rs->sc_dkdev.dk_copenmask |= mask;
|
||||
else
|
||||
rs->sc_info.ri_bopen |= mask;
|
||||
rs->sc_info.ri_open |= mask;
|
||||
rs->sc_dkdev.dk_bopenmask |= mask;
|
||||
rs->sc_dkdev.dk_openmask |= mask;
|
||||
return(0);
|
||||
}
|
||||
|
||||
@ -518,15 +534,15 @@ rdclose(dev, flag, mode, p)
|
||||
{
|
||||
int unit = rdunit(dev);
|
||||
register struct rd_softc *rs = &rd_softc[unit];
|
||||
register struct rdinfo *ri = &rs->sc_info;
|
||||
register struct disk *dk = &rs->sc_dkdev;
|
||||
int mask, s;
|
||||
|
||||
mask = 1 << rdpart(dev);
|
||||
if (mode == S_IFCHR)
|
||||
ri->ri_copen &= ~mask;
|
||||
dk->dk_copenmask &= ~mask;
|
||||
else
|
||||
ri->ri_bopen &= ~mask;
|
||||
ri->ri_open = ri->ri_bopen | ri->ri_copen;
|
||||
dk->dk_bopenmask &= ~mask;
|
||||
dk->dk_openmask = dk->dk_copenmask | dk->dk_bopenmask;
|
||||
/*
|
||||
* On last close, we wait for all activity to cease since
|
||||
* the label/parition info will become invalid. Since we
|
||||
@ -534,7 +550,7 @@ rdclose(dev, flag, mode, p)
|
||||
* Note we don't have to about other closes since we know
|
||||
* we are the last one.
|
||||
*/
|
||||
if (ri->ri_open == 0) {
|
||||
if (dk->dk_openmask == 0) {
|
||||
rs->sc_flags |= RDF_CLOSING;
|
||||
s = splbio();
|
||||
while (rdtab[unit].b_active) {
|
||||
@ -567,7 +583,7 @@ rdstrategy(bp)
|
||||
#endif
|
||||
bn = bp->b_blkno;
|
||||
sz = howmany(bp->b_bcount, DEV_BSIZE);
|
||||
pinfo = &rs->sc_info.ri_label.d_partitions[rdpart(bp->b_dev)];
|
||||
pinfo = &rs->sc_dkdev.dk_label->d_partitions[rdpart(bp->b_dev)];
|
||||
if (bn < 0 || bn + sz > pinfo->p_size) {
|
||||
sz = pinfo->p_size - bn;
|
||||
if (sz == 0) {
|
||||
@ -687,10 +703,17 @@ again:
|
||||
#endif
|
||||
if (hpibsend(hp->hp_ctlr, hp->hp_slave, C_CMD, &rs->sc_ioc.c_unit,
|
||||
sizeof(rs->sc_ioc)-2) == sizeof(rs->sc_ioc)-2) {
|
||||
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
if (hp->hp_dk >= 0) {
|
||||
dk_busy |= 1 << hp->hp_dk;
|
||||
dk_seek[hp->hp_dk]++;
|
||||
dk_busy |= 1 << hp->hp_dk;
|
||||
dk_seek[hp->hp_dk]++;
|
||||
}
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&rs->sc_dkdev);
|
||||
rs->sc_dkdev.dk_seek++;
|
||||
|
||||
#ifdef DEBUG
|
||||
if (rddebug & RDB_IO)
|
||||
printf("rdstart: hpibawait(%x)\n", hp->hp_ctlr);
|
||||
@ -739,11 +762,16 @@ rdgo(unit)
|
||||
|
||||
rw = bp->b_flags & B_READ;
|
||||
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
if (hp->hp_dk >= 0) {
|
||||
dk_busy |= 1 << hp->hp_dk;
|
||||
dk_xfer[hp->hp_dk]++;
|
||||
dk_wds[hp->hp_dk] += rs->sc_resid >> 6;
|
||||
}
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&rs->sc_dkdev);
|
||||
|
||||
#ifdef USELEDS
|
||||
if (inledcontrol == 0)
|
||||
ledcontrol(0, 0, LED_DISK);
|
||||
@ -770,8 +798,12 @@ rdintr(unit)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
if (hp->hp_dk >= 0)
|
||||
dk_busy &= ~(1 << hp->hp_dk);
|
||||
|
||||
disk_unbusy(&rs->sc_dkdev, (bp->b_bcount - bp->b_resid));
|
||||
|
||||
if (rs->sc_flags & RDF_SEEK) {
|
||||
rs->sc_flags &= ~RDF_SEEK;
|
||||
if (hpibustart(hp->hp_ctlr))
|
||||
@ -786,8 +818,13 @@ rdintr(unit)
|
||||
#ifdef DEBUG
|
||||
rdstats[unit].rdpollwaits++;
|
||||
#endif
|
||||
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
if (hp->hp_dk >= 0)
|
||||
dk_busy |= 1 << hp->hp_dk;
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&rs->sc_dkdev);
|
||||
rs->sc_flags |= RDF_SWAIT;
|
||||
hpibawait(hp->hp_ctlr);
|
||||
return;
|
||||
@ -920,7 +957,7 @@ rderror(unit)
|
||||
* we just use b_blkno.
|
||||
*/
|
||||
bp = rdtab[unit].b_actf;
|
||||
pbn = rs->sc_info.ri_label.d_partitions[rdpart(bp->b_dev)].p_offset;
|
||||
pbn = rs->sc_dkdev.dk_label->d_partitions[rdpart(bp->b_dev)].p_offset;
|
||||
if ((sp->c_fef & FEF_CU) || (sp->c_fef & FEF_DR) ||
|
||||
(sp->c_ief & IEF_RRMASK)) {
|
||||
hwbn = RDBTOS(pbn + bp->b_blkno);
|
||||
@ -1007,7 +1044,7 @@ rdioctl(dev, cmd, data, flag, p)
|
||||
{
|
||||
int unit = rdunit(dev);
|
||||
register struct rd_softc *sc = &rd_softc[unit];
|
||||
register struct disklabel *lp = &sc->sc_info.ri_label;
|
||||
register struct disklabel *lp = sc->sc_dkdev.dk_label;
|
||||
int error, flags;
|
||||
|
||||
switch (cmd) {
|
||||
@ -1035,7 +1072,7 @@ rdioctl(dev, cmd, data, flag, p)
|
||||
return (EBADF);
|
||||
return (setdisklabel(lp, (struct disklabel *)data,
|
||||
(sc->sc_flags & RDF_WLABEL) ? 0
|
||||
: sc->sc_info.ri_open,
|
||||
: sc->sc_dkdev.dk_openmask,
|
||||
(struct cpu_disklabel *)0));
|
||||
|
||||
case DIOCWDINFO:
|
||||
@ -1043,7 +1080,7 @@ rdioctl(dev, cmd, data, flag, p)
|
||||
return (EBADF);
|
||||
error = setdisklabel(lp, (struct disklabel *)data,
|
||||
(sc->sc_flags & RDF_WLABEL) ? 0
|
||||
: sc->sc_info.ri_open,
|
||||
: sc->sc_dkdev.dk_openmask,
|
||||
(struct cpu_disklabel *)0);
|
||||
if (error)
|
||||
return (error);
|
||||
@ -1073,12 +1110,12 @@ rdsize(dev)
|
||||
* without the device being open so we may need
|
||||
* to handle it here.
|
||||
*/
|
||||
if (rs->sc_info.ri_open == 0) {
|
||||
if (rs->sc_dkdev.dk_openmask == 0) {
|
||||
if (rdopen(dev, FREAD|FWRITE, S_IFBLK, NULL))
|
||||
return(-1);
|
||||
didopen = 1;
|
||||
}
|
||||
psize = rs->sc_info.ri_label.d_partitions[rdpart(dev)].p_size;
|
||||
psize = rs->sc_dkdev.dk_label->d_partitions[rdpart(dev)].p_size;
|
||||
if (didopen)
|
||||
(void) rdclose(dev, FREAD|FWRITE, S_IFBLK, NULL);
|
||||
return (psize);
|
||||
@ -1128,7 +1165,7 @@ rddump(dev)
|
||||
/* is drive ok? */
|
||||
if (unit >= NRD || (rs->sc_flags & RDF_ALIVE) == 0)
|
||||
return (ENXIO);
|
||||
pinfo = &rs->sc_info.ri_label.d_partitions[part];
|
||||
pinfo = &rs->sc_dkdev.dk_label->d_partitions[part];
|
||||
/* dump parameters in range? */
|
||||
if (dumplo < 0 || dumplo >= pinfo->p_size ||
|
||||
pinfo->p_fstype != FS_SWAP)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: rd_compat.c,v 1.4 1995/11/19 19:07:20 thorpej Exp $ */
|
||||
/* $NetBSD: rd_compat.c,v 1.5 1996/01/07 22:02:14 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988 University of Utah.
|
||||
@ -50,6 +50,7 @@
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/disk.h>
|
||||
#include <hp300/dev/device.h>
|
||||
#include <hp300/dev/rdreg.h>
|
||||
#include <hp300/dev/rdvar.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: rdvar.h,v 1.3 1995/11/19 19:07:21 thorpej Exp $ */
|
||||
/* $NetBSD: rdvar.h,v 1.4 1996/01/07 22:02:16 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988 University of Utah.
|
||||
@ -52,22 +52,16 @@ struct rdidentinfo {
|
||||
int ri_nblocks; /* DEV_BSIZE blocks on disk */
|
||||
};
|
||||
|
||||
struct rdinfo {
|
||||
struct disklabel ri_label; /* label */
|
||||
int ri_bopen; /* mask of open block devs */
|
||||
int ri_copen; /* mask of open char devs */
|
||||
int ri_open; /* composite mask of open devs */
|
||||
};
|
||||
|
||||
struct rd_softc {
|
||||
struct hp_device *sc_hd;
|
||||
struct disk sc_dkdev;
|
||||
char sc_xname[8];
|
||||
int sc_flags;
|
||||
short sc_type;
|
||||
short sc_punit;
|
||||
char *sc_addr;
|
||||
int sc_resid;
|
||||
u_int sc_wpms;
|
||||
struct rdinfo sc_info;
|
||||
struct rd_describe sc_rddesc;
|
||||
struct devqueue sc_dq;
|
||||
struct rd_iocmd sc_ioc;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sd.c,v 1.20 1995/12/09 07:31:03 thorpej Exp $ */
|
||||
/* $NetBSD: sd.c,v 1.21 1996/01/07 22:02:18 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1990, 1993
|
||||
@ -48,8 +48,9 @@
|
||||
#include <sys/systm.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/dkstat.h>
|
||||
#include <sys/dkstat.h> /* XXX */
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/disk.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/ioctl.h>
|
||||
@ -326,6 +327,14 @@ sdmatch(hd)
|
||||
{
|
||||
register struct sd_softc *sc = &sd_softc[hd->hp_unit];
|
||||
|
||||
/* XXX set up external name */
|
||||
bzero(sc->sc_xname, sizeof(sc->sc_xname));
|
||||
sprintf(sc->sc_xname, "sd%d", hd->hp_unit);
|
||||
|
||||
/* Initialize the disk structure. */
|
||||
bzero(&sc->sc_dkdev, sizeof(sc->sc_dkdev));
|
||||
sc->sc_dkdev.dk_name = sc->sc_xname;
|
||||
|
||||
sc->sc_hd = hd;
|
||||
sc->sc_flags = 0;
|
||||
/*
|
||||
@ -354,6 +363,9 @@ sdattach(hd)
|
||||
sc->sc_dq.dq_slave = hd->hp_slave;
|
||||
sc->sc_dq.dq_driver = &sddriver;
|
||||
|
||||
/* Attach the disk. */
|
||||
disk_attach(&sc->sc_dkdev);
|
||||
|
||||
sc->sc_flags |= SDF_ALIVE;
|
||||
}
|
||||
|
||||
@ -474,7 +486,7 @@ sdgetinfo(dev)
|
||||
{
|
||||
int unit = sdunit(dev);
|
||||
register struct sd_softc *sc = &sd_softc[unit];
|
||||
register struct disklabel *lp = &sc->sc_info.si_label;
|
||||
register struct disklabel *lp = sc->sc_dkdev.dk_label;
|
||||
register struct partition *pi;
|
||||
char *msg, *readdisklabel();
|
||||
#ifdef COMPAT_NOLABEL
|
||||
@ -584,7 +596,7 @@ sdopen(dev, flags, mode, p)
|
||||
* We may block reading the label, so be careful
|
||||
* to stop any other opens.
|
||||
*/
|
||||
if (sc->sc_info.si_open == 0) {
|
||||
if (sc->sc_dkdev.dk_openmask == 0) {
|
||||
sc->sc_flags |= SDF_OPENING;
|
||||
error = sdgetinfo(dev);
|
||||
sc->sc_flags &= ~SDF_OPENING;
|
||||
@ -592,15 +604,17 @@ sdopen(dev, flags, mode, p)
|
||||
if (error)
|
||||
return(error);
|
||||
}
|
||||
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
if (sc->sc_hd->hp_dk >= 0)
|
||||
dk_wpms[sc->sc_hd->hp_dk] = sc->sc_wpms;
|
||||
|
||||
mask = 1 << sdpart(dev);
|
||||
if (mode == S_IFCHR)
|
||||
sc->sc_info.si_copen |= mask;
|
||||
sc->sc_dkdev.dk_copenmask |= mask;
|
||||
else
|
||||
sc->sc_info.si_bopen |= mask;
|
||||
sc->sc_info.si_open |= mask;
|
||||
sc->sc_dkdev.dk_bopenmask |= mask;
|
||||
sc->sc_dkdev.dk_openmask |= mask;
|
||||
return(0);
|
||||
}
|
||||
|
||||
@ -612,15 +626,15 @@ sdclose(dev, flag, mode, p)
|
||||
{
|
||||
int unit = sdunit(dev);
|
||||
register struct sd_softc *sc = &sd_softc[unit];
|
||||
register struct sdinfo *si = &sc->sc_info;
|
||||
register struct disk *dk = &sc->sc_dkdev;
|
||||
int mask, s;
|
||||
|
||||
mask = 1 << sdpart(dev);
|
||||
if (mode == S_IFCHR)
|
||||
si->si_copen &= ~mask;
|
||||
dk->dk_copenmask &= ~mask;
|
||||
else
|
||||
si->si_bopen &= ~mask;
|
||||
si->si_open = si->si_bopen | si->si_copen;
|
||||
dk->dk_bopenmask &= ~mask;
|
||||
dk->dk_openmask = dk->dk_copenmask | dk->dk_bopenmask;
|
||||
/*
|
||||
* On last close, we wait for all activity to cease since
|
||||
* the label/parition info will become invalid. Since we
|
||||
@ -628,7 +642,7 @@ sdclose(dev, flag, mode, p)
|
||||
* Note we don't have to about other closes since we know
|
||||
* we are the last one.
|
||||
*/
|
||||
if (si->si_open == 0) {
|
||||
if (dk->dk_openmask == 0) {
|
||||
sc->sc_flags |= SDF_CLOSING;
|
||||
s = splbio();
|
||||
while (sdtab[unit].b_active) {
|
||||
@ -765,7 +779,7 @@ sdstrategy(bp)
|
||||
}
|
||||
bn = bp->b_blkno;
|
||||
sz = howmany(bp->b_bcount, DEV_BSIZE);
|
||||
pinfo = &sc->sc_info.si_label.d_partitions[sdpart(bp->b_dev)];
|
||||
pinfo = &sc->sc_dkdev.dk_label->d_partitions[sdpart(bp->b_dev)];
|
||||
if (bn < 0 || bn + sz > pinfo->p_size) {
|
||||
sz = pinfo->p_size - bn;
|
||||
if (sz == 0) {
|
||||
@ -982,13 +996,19 @@ sdgo(unit)
|
||||
if (inledcontrol == 0)
|
||||
ledcontrol(0, 0, LED_DISK);
|
||||
#endif
|
||||
if (scsigo(hp->hp_ctlr, hp->hp_slave, sc->sc_punit, bp, cmd, pad) == 0) {
|
||||
if (scsigo(hp->hp_ctlr, hp->hp_slave, sc->sc_punit,
|
||||
bp, cmd, pad) == 0) {
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
if (hp->hp_dk >= 0) {
|
||||
dk_busy |= 1 << hp->hp_dk;
|
||||
++dk_seek[hp->hp_dk];
|
||||
++dk_xfer[hp->hp_dk];
|
||||
dk_wds[hp->hp_dk] += bp->b_bcount >> 6;
|
||||
}
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&sc->sc_dkdev);
|
||||
sc->sc_dkdev.dk_seek++; /* XXX */
|
||||
return;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
@ -1018,8 +1038,13 @@ sdintr(unit, stat)
|
||||
printf("%s: bp == NULL\n", sc->sc_hd->hp_xname);
|
||||
return;
|
||||
}
|
||||
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
if (hp->hp_dk >= 0)
|
||||
dk_busy &=~ (1 << hp->hp_dk);
|
||||
|
||||
disk_unbusy(&sc->sc_dkdev, (bp->b_bcount - bp->b_resid));
|
||||
|
||||
if (stat) {
|
||||
#ifdef DEBUG
|
||||
if (sddebug & SDB_ERROR)
|
||||
@ -1087,7 +1112,7 @@ sdioctl(dev, cmd, data, flag, p)
|
||||
{
|
||||
int unit = sdunit(dev);
|
||||
register struct sd_softc *sc = &sd_softc[unit];
|
||||
register struct disklabel *lp = &sc->sc_info.si_label;
|
||||
register struct disklabel *lp = sc->sc_dkdev.dk_label;
|
||||
int error, flags;
|
||||
|
||||
switch (cmd) {
|
||||
@ -1118,7 +1143,7 @@ sdioctl(dev, cmd, data, flag, p)
|
||||
return (EBADF);
|
||||
error = setdisklabel(lp, (struct disklabel *)data,
|
||||
(sc->sc_flags & SDF_WLABEL) ? 0
|
||||
: sc->sc_info.si_open,
|
||||
: sc->sc_dkdev.dk_openmask,
|
||||
(struct cpu_disklabel *)0);
|
||||
return (error);
|
||||
|
||||
@ -1127,7 +1152,7 @@ sdioctl(dev, cmd, data, flag, p)
|
||||
return (EBADF);
|
||||
error = setdisklabel(lp, (struct disklabel *)data,
|
||||
(sc->sc_flags & SDF_WLABEL) ? 0
|
||||
: sc->sc_info.si_open,
|
||||
: sc->sc_dkdev.dk_openmask,
|
||||
(struct cpu_disklabel *)0);
|
||||
if (error)
|
||||
return (error);
|
||||
@ -1196,12 +1221,12 @@ sdsize(dev)
|
||||
* without the device being open so we may need
|
||||
* to handle it here.
|
||||
*/
|
||||
if (sc->sc_info.si_open == 0) {
|
||||
if (sc->sc_dkdev.dk_openmask == 0) {
|
||||
if (sdopen(dev, FREAD|FWRITE, S_IFBLK, NULL))
|
||||
return(-1);
|
||||
didopen = 1;
|
||||
}
|
||||
psize = sc->sc_info.si_label.d_partitions[sdpart(dev)].p_size;
|
||||
psize = sc->sc_dkdev.dk_label->d_partitions[sdpart(dev)].p_size;
|
||||
if (didopen)
|
||||
(void) sdclose(dev, FREAD|FWRITE, S_IFBLK, NULL);
|
||||
return (psize);
|
||||
@ -1228,7 +1253,7 @@ sddump(dev)
|
||||
/* is drive ok? */
|
||||
if (unit >= NSD || (sc->sc_flags & SDF_ALIVE) == 0)
|
||||
return (ENXIO);
|
||||
pinfo = &sc->sc_info.si_label.d_partitions[part];
|
||||
pinfo = &sc->sc_dkdev.dk_label->d_partitions[part];
|
||||
/* dump parameters in range? */
|
||||
if (dumplo < 0 || dumplo >= pinfo->p_size ||
|
||||
pinfo->p_fstype != FS_SWAP)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sd_compat.c,v 1.3 1994/10/26 07:25:08 cgd Exp $ */
|
||||
/* $NetBSD: sd_compat.c,v 1.4 1996/01/07 22:02:20 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1990, 1993
|
||||
@ -46,6 +46,7 @@
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/disk.h>
|
||||
#include <hp300/dev/device.h>
|
||||
#include <hp300/dev/sdvar.h>
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sdvar.h,v 1.3 1995/10/15 10:03:20 thorpej Exp $ */
|
||||
/* $NetBSD: sdvar.h,v 1.4 1996/01/07 22:02:21 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1990, 1993
|
||||
@ -38,15 +38,10 @@
|
||||
* @(#)sdvar.h 8.1 (Berkeley) 6/10/93
|
||||
*/
|
||||
|
||||
struct sdinfo {
|
||||
struct disklabel si_label; /* label */
|
||||
int si_bopen; /* mask of open block devs */
|
||||
int si_copen; /* mask of open char devs */
|
||||
int si_open; /* composite mask of open devs */
|
||||
};
|
||||
|
||||
struct sd_softc {
|
||||
struct hp_device *sc_hd;
|
||||
struct disk sc_dkdev;
|
||||
char sc_xname[8];
|
||||
struct devqueue sc_dq;
|
||||
int sc_format_pid; /* process using "format" mode */
|
||||
short sc_flags;
|
||||
@ -58,7 +53,6 @@ struct sd_softc {
|
||||
u_int sc_heads; /* number of heads (tracks) */
|
||||
u_int sc_cyls; /* number of cylinders */
|
||||
u_int sc_wpms; /* average xfer rate in 16 bit wds/sec. */
|
||||
struct sdinfo sc_info; /* disklabel and related info */
|
||||
};
|
||||
|
||||
/* sc_flags values */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: fd.c,v 1.81 1995/12/28 15:48:57 perry Exp $ */
|
||||
/* $NetBSD: fd.c,v 1.82 1996/01/07 22:02:28 thorpej Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994, 1995 Charles Hannum.
|
||||
@ -149,7 +149,7 @@ struct fd_type fd_types[] = {
|
||||
/* software state, per disk (with up to 4 disks per ctlr) */
|
||||
struct fd_softc {
|
||||
struct device sc_dev;
|
||||
struct dkdevice sc_dk;
|
||||
struct disk sc_dk;
|
||||
|
||||
struct fd_type *sc_deftype; /* default type descriptor */
|
||||
struct fd_type *sc_type; /* current type descriptor */
|
||||
@ -405,7 +405,14 @@ fdattach(parent, self, aux)
|
||||
fd->sc_drive = drive;
|
||||
fd->sc_deftype = type;
|
||||
fdc->sc_fd[drive] = fd;
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
fd->sc_dk.dk_name = fd->sc_dev.dv_xname;
|
||||
fd->sc_dk.dk_driver = &fddkdriver;
|
||||
disk_attach(&fd->sc_dk);
|
||||
|
||||
#ifdef NEWCONFIG
|
||||
/* XXX Need to do some more fiddling with sc_dk. */
|
||||
dk_establish(&fd->sc_dk, &fd->sc_dev);
|
||||
@ -542,6 +549,9 @@ fdstart(fd)
|
||||
fd->sc_q.b_active = 1;
|
||||
TAILQ_INSERT_TAIL(&fdc->sc_drives, fd, sc_drivechain);
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&fd->sc_dk);
|
||||
|
||||
/* If controller not already active, start it. */
|
||||
if (!active)
|
||||
fdcstart(fdc);
|
||||
@ -571,6 +581,9 @@ fdfinish(fd, bp)
|
||||
bp->b_resid = fd->sc_bcount;
|
||||
fd->sc_skip = 0;
|
||||
fd->sc_q.b_actf = bp->b_actf;
|
||||
|
||||
disk_unbusy(&fd->sc_dk, (bp->b_bcount - bp->b_resid));
|
||||
|
||||
biodone(bp);
|
||||
/* turn off motor 5s from now */
|
||||
timeout(fd_motor_off, fd, 5 * hz);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: autoconf.c,v 1.20 1995/11/01 04:59:31 briggs Exp $ */
|
||||
/* $NetBSD: autoconf.c,v 1.21 1996/01/07 22:02:39 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988 University of Utah.
|
||||
@ -239,7 +239,7 @@ extern struct cfdriver scsibuscd;
|
||||
|
||||
/* swiped from sparc/sparc/autoconf.c */
|
||||
static int
|
||||
findblkmajor(register struct dkdevice *dv)
|
||||
findblkmajor(register struct disk *dv)
|
||||
{
|
||||
register int i;
|
||||
|
||||
@ -258,6 +258,7 @@ void
|
||||
findbootdev()
|
||||
{
|
||||
register struct device *dv;
|
||||
register struct disk *diskp;
|
||||
register int unit;
|
||||
int major;
|
||||
|
||||
@ -271,12 +272,22 @@ findbootdev()
|
||||
unit = target_to_unit(-1, unit, 0);
|
||||
bootdev |= (unit << B_UNITSHIFT);
|
||||
|
||||
if (disk_count <= 0)
|
||||
return;
|
||||
|
||||
for (dv = alldevs ; dv ; dv = dv->dv_next) {
|
||||
if ( (dv->dv_class == DV_DISK)
|
||||
&& (unit == dv->dv_unit)
|
||||
&& (major == findblkmajor((struct dkdevice *) (dv+1)))) {
|
||||
bootdv = dv;
|
||||
return;
|
||||
if ((dv->dv_class == DV_DISK) && (unit == dv->dv_unit)) {
|
||||
/*
|
||||
* Find the disk corresponding to the current
|
||||
* device.
|
||||
*/
|
||||
if ((diskp = disk_find(dv->dv_xname)) == NULL)
|
||||
continue;
|
||||
|
||||
if (major == findblkmajor(diskp)) {
|
||||
bootdv = dv;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,7 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Id: rd.c,v 1.1 1995/09/26 20:16:14 phil Exp $
|
||||
* $Id: rd.c,v 1.2 1996/01/07 22:02:46 thorpej Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -36,21 +36,31 @@
|
||||
#include <sys/buf.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/disk.h>
|
||||
|
||||
static int rdmatch(struct device *parent, void *cf, void *aux);
|
||||
static void rdattach(struct device *parent, struct device *self, void *aux);
|
||||
|
||||
struct rdsoftc {
|
||||
struct device sc_dev; /* generic device glue */
|
||||
struct disk sc_dkdev; /* generic disk glue */
|
||||
};
|
||||
|
||||
struct cfdriver rdcd = {
|
||||
NULL,
|
||||
"rd",
|
||||
rdmatch,
|
||||
rdattach,
|
||||
DV_DISK,
|
||||
sizeof(struct device),
|
||||
sizeof(struct rdsoftc),
|
||||
NULL,
|
||||
0
|
||||
};
|
||||
|
||||
void rdstrategy __P((struct buf *));
|
||||
|
||||
struct dkdriver rddkdriver = { rdstrategy };
|
||||
|
||||
#if !defined(RD_SIZE)
|
||||
# define RD_SIZE 0x200000
|
||||
#endif
|
||||
@ -70,7 +80,17 @@ rdattach(parent, self, aux)
|
||||
struct device *parent, *self;
|
||||
void *aux;
|
||||
{
|
||||
struct rdsoftc *sc = (struct rdsoftc *)self;
|
||||
|
||||
printf(" addr 0x%x, size 0x%x\n", ram_disk, RD_SIZE);
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
bzero(&sc->sc_dkdev, sizeof(sc->sc_dkdev));
|
||||
sc->sc_dkdev.dk_driver = &rddkdriver;
|
||||
sc->sc_dkdev.dk_name = sc->sc_dev.dv_xname;
|
||||
disk_attach(&sc->sc_dkdev);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: rz.c,v 1.12 1995/09/13 19:35:56 jonathan Exp $ */
|
||||
/* $NetBSD: rz.c,v 1.13 1996/01/07 22:02:52 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -52,8 +52,9 @@
|
||||
#include <sys/errno.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/dkstat.h>
|
||||
#include <sys/dkstat.h> /* XXX */
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/disk.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/uio.h>
|
||||
@ -139,16 +140,18 @@ struct rzstats {
|
||||
struct rz_softc {
|
||||
struct pmax_scsi_device *sc_sd; /* physical unit info */
|
||||
pid_t sc_format_pid; /* process using "format" mode */
|
||||
u_long sc_openpart; /* partitions open */
|
||||
u_long sc_bopenpart; /* block partitions open */
|
||||
u_long sc_copenpart; /* character partitions open */
|
||||
short sc_flags; /* see below */
|
||||
short sc_type; /* drive type from INQUIRY cmd */
|
||||
u_int sc_blks; /* number of blocks on device */
|
||||
int sc_blksize; /* device block size in bytes */
|
||||
int sc_bshift; /* convert device blocks to DEV_BSIZE */
|
||||
struct disk sc_dkdev; /* generic disk device info */
|
||||
#define sc_label sc_dkdev.dk_label /* XXX compat */
|
||||
#define sc_openpart sc_dkdev.dk_openmask /* XXX compat */
|
||||
#define sc_bopenpart sc_dkdev.dk_bopenmask /* XXX compat */
|
||||
#define sc_copenpart sc_dkdev.dk_copenmask /* XXX compat */
|
||||
#define sc_bshift sc_dkdev.dk_blkshift /* XXX compat */
|
||||
char sc_xname[8]; /* XXX external name */
|
||||
u_int sc_wpms; /* average xfer rate in 16bit wds/sec */
|
||||
struct disklabel sc_label; /* disk label for this disk */
|
||||
struct rzstats sc_stats; /* statisic counts */
|
||||
struct buf sc_tab; /* queue of pending operations */
|
||||
struct buf sc_buf; /* buf for doing I/O */
|
||||
@ -242,6 +245,7 @@ rzready(sc)
|
||||
else
|
||||
sc->sc_cmd.flags = 0;
|
||||
|
||||
disk_busy(&sc->sc_dkdev); /* XXX */
|
||||
(*sc->sc_sd->sd_cdriver->d_start)(&sc->sc_cmd);
|
||||
if (!biowait(&sc->sc_buf))
|
||||
break;
|
||||
@ -335,6 +339,14 @@ rzprobe(sd)
|
||||
sc->sc_cmd.unit = sd->sd_unit;
|
||||
sc->sc_rwcmd.unitNumber = sd->sd_slave;
|
||||
|
||||
/* XXX set up the external name */
|
||||
bzero(sc->sc_xname, sizeof(sc->sc_xname)); /* XXX */
|
||||
sprintf(sc->sc_xname, "rz%d", sd->sd_unit); /* XXX */
|
||||
|
||||
/* Initialize the disk structure. */
|
||||
bzero(&sc->sc_dkdev, sizeof(sc->sc_dkdev));
|
||||
sc->sc_dkdev.dk_name = sc->sc_xname;
|
||||
|
||||
/* try to find out what type of device this is */
|
||||
sc->sc_format_pid = 1; /* force use of sc_cdb */
|
||||
sc->sc_flags = RZF_NOERR; /* don't print SCSI errors */
|
||||
@ -407,7 +419,13 @@ rzprobe(sd)
|
||||
goto bad;
|
||||
}
|
||||
}
|
||||
sc->sc_wpms = 32 * (60 * DEV_BSIZE / 2); /* XXX */
|
||||
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
sc->sc_wpms = 32 * (60 * DEV_BSIZE / 2);
|
||||
|
||||
/* Attach the disk. */
|
||||
disk_attach(&sc->sc_dkdev);
|
||||
|
||||
sc->sc_format_pid = 0;
|
||||
sc->sc_flags |= RZF_ALIVE;
|
||||
if (inqbuf.rmb)
|
||||
@ -528,7 +546,7 @@ rzstrategy(bp)
|
||||
register int unit = rzunit(bp->b_dev);
|
||||
register int part = rzpart(bp->b_dev);
|
||||
register struct rz_softc *sc = &rz_softc[unit];
|
||||
register struct partition *pp = &sc->sc_label.d_partitions[part];
|
||||
register struct partition *pp = &sc->sc_label->d_partitions[part];
|
||||
register daddr_t bn;
|
||||
register long sz, s;
|
||||
|
||||
@ -633,6 +651,8 @@ rzstart(unit)
|
||||
unit, bp->b_bcount);
|
||||
#endif
|
||||
sc->sc_stats.rztransfers++;
|
||||
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
if ((n = sc->sc_sd->sd_dk) >= 0) {
|
||||
dk_busy |= 1 << n;
|
||||
++dk_seek[n];
|
||||
@ -641,6 +661,11 @@ rzstart(unit)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&sc->sc_dkdev);
|
||||
sc->sc_dkdev.dk_seek++; /* XXX */
|
||||
|
||||
/* tell controller to start this command */
|
||||
(*sc->sc_sd->sd_cdriver->d_start)(&sc->sc_cmd);
|
||||
}
|
||||
@ -663,8 +688,13 @@ rzdone(unit, error, resid, status)
|
||||
printf("rz%d: bp == NULL\n", unit);
|
||||
return;
|
||||
}
|
||||
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
if (sd->sd_dk >= 0)
|
||||
dk_busy &= ~(1 << sd->sd_dk);
|
||||
|
||||
disk_unbusy(&sc->sc_dkdev, (bp->b_bcount - bp->b_resid));
|
||||
|
||||
if (sc->sc_flags & RZF_SENSEINPROGRESS) {
|
||||
sc->sc_flags &= ~RZF_SENSEINPROGRESS;
|
||||
sc->sc_tab.b_actf = bp = bp->b_actf; /* remove sc_errbuf */
|
||||
@ -745,7 +775,7 @@ rzgetinfo(dev)
|
||||
{
|
||||
register int unit = rzunit(dev);
|
||||
register struct rz_softc *sc = &rz_softc[unit];
|
||||
register struct disklabel *lp = &sc->sc_label;
|
||||
register struct disklabel *lp = sc->sc_label;
|
||||
register int i;
|
||||
char *msg;
|
||||
int part;
|
||||
@ -834,7 +864,7 @@ rzopen(dev, flags, mode, p)
|
||||
register struct disklabel *lp;
|
||||
register int i;
|
||||
int part;
|
||||
u_long mask;
|
||||
int mask;
|
||||
|
||||
if (unit >= NRZ || !(sc->sc_flags & RZF_ALIVE))
|
||||
return (ENXIO);
|
||||
@ -850,7 +880,7 @@ rzopen(dev, flags, mode, p)
|
||||
if (!(sc->sc_flags & RZF_HAVELABEL))
|
||||
rzgetinfo(dev);
|
||||
|
||||
lp = &sc->sc_label;
|
||||
lp = sc->sc_label;
|
||||
if (part >= lp->d_npartitions || lp->d_partitions[part].p_size == 0)
|
||||
{
|
||||
printf("rzopen: ENXIO on rz%d%c unit %d part %d\n",
|
||||
@ -894,8 +924,11 @@ rzopen(dev, flags, mode, p)
|
||||
break;
|
||||
}
|
||||
sc->sc_openpart |= mask;
|
||||
|
||||
/* XXX Support old-style instrumentation for now. */
|
||||
if (sc->sc_sd->sd_dk >= 0)
|
||||
dk_wpms[sc->sc_sd->sd_dk] = sc->sc_wpms;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -904,7 +937,7 @@ rzclose(dev, flags, mode)
|
||||
int flags, mode;
|
||||
{
|
||||
register struct rz_softc *sc = &rz_softc[rzunit(dev)];
|
||||
u_long mask = (1 << rzpart(dev));
|
||||
int mask = (1 << rzpart(dev));
|
||||
int s;
|
||||
|
||||
switch (mode) {
|
||||
@ -1019,14 +1052,14 @@ rzioctl(dev, cmd, data, flag, p)
|
||||
|
||||
case DIOCGDINFO:
|
||||
/* get the current disk label */
|
||||
*(struct disklabel *)data = sc->sc_label;
|
||||
*(struct disklabel *)data = *(sc->sc_label);
|
||||
return (0);
|
||||
|
||||
case DIOCSDINFO:
|
||||
/* set the current disk label */
|
||||
if (!(flag & FWRITE))
|
||||
return (EBADF);
|
||||
error = setdisklabel(&sc->sc_label,
|
||||
error = setdisklabel(sc->sc_label,
|
||||
(struct disklabel *)data,
|
||||
(sc->sc_flags & RZF_WLABEL) ? 0 :
|
||||
sc->sc_openpart, &cd);
|
||||
@ -1034,9 +1067,9 @@ rzioctl(dev, cmd, data, flag, p)
|
||||
|
||||
case DIOCGPART:
|
||||
/* return the disk partition data */
|
||||
((struct partinfo *)data)->disklab = &sc->sc_label;
|
||||
((struct partinfo *)data)->disklab = sc->sc_label;
|
||||
((struct partinfo *)data)->part =
|
||||
&sc->sc_label.d_partitions[rzpart(dev)];
|
||||
&sc->sc_label->d_partitions[rzpart(dev)];
|
||||
return (0);
|
||||
|
||||
case DIOCWLABEL:
|
||||
@ -1052,7 +1085,7 @@ rzioctl(dev, cmd, data, flag, p)
|
||||
/* write the disk label to disk */
|
||||
if (!(flag & FWRITE))
|
||||
return (EBADF);
|
||||
error = setdisklabel(&sc->sc_label,
|
||||
error = setdisklabel(sc->sc_label,
|
||||
(struct disklabel *)data,
|
||||
(sc->sc_flags & RZF_WLABEL) ? 0 :
|
||||
sc->sc_openpart,
|
||||
@ -1063,7 +1096,7 @@ rzioctl(dev, cmd, data, flag, p)
|
||||
/* simulate opening partition 0 so write succeeds */
|
||||
flags = sc->sc_flags;
|
||||
sc->sc_flags = RZF_ALIVE | RZF_WLABEL;
|
||||
error = writedisklabel(dev, rzstrategy, &sc->sc_label, &cd);
|
||||
error = writedisklabel(dev, rzstrategy, sc->sc_label, &cd);
|
||||
sc->sc_flags = flags;
|
||||
return (error);
|
||||
}
|
||||
@ -1089,9 +1122,9 @@ rzsize(dev)
|
||||
if (!(sc->sc_flags & RZF_HAVELABEL))
|
||||
rzgetinfo(dev);
|
||||
|
||||
if (part >= sc->sc_label.d_npartitions)
|
||||
if (part >= sc->sc_label->d_npartitions)
|
||||
return (-1);
|
||||
return (sc->sc_label.d_partitions[part].p_size);
|
||||
return (sc->sc_label->d_partitions[part].p_size);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1123,12 +1156,12 @@ rzdump(dev)
|
||||
if (unit >= NRZ || (sc->sc_flags & RZF_ALIVE) == 0)
|
||||
return (ENXIO);
|
||||
/* dump parameters in range? */
|
||||
if (dumplo < 0 || dumplo >= sc->sc_label.d_partitions[part].p_size)
|
||||
if (dumplo < 0 || dumplo >= sc->sc_label->d_partitions[part].p_size)
|
||||
return (EINVAL);
|
||||
if (dumplo + ctod(pages) > sc->sc_label.d_partitions[part].p_size)
|
||||
pages = dtoc(sc->sc_label.d_partitions[part].p_size - dumplo);
|
||||
if (dumplo + ctod(pages) > sc->sc_label->d_partitions[part].p_size)
|
||||
pages = dtoc(sc->sc_label->d_partitions[part].p_size - dumplo);
|
||||
maddr = lowram;
|
||||
baddr = dumplo + sc->sc_label.d_partitions[part].p_offset;
|
||||
baddr = dumplo + sc->sc_label->d_partitions[part].p_offset;
|
||||
|
||||
#ifdef notdef /*XXX -- bogus code, from Mach perhaps? */
|
||||
/* scsi bus idle? */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: disksubr.c,v 1.6 1995/08/04 02:34:24 jonathan Exp $ */
|
||||
/* $NetBSD: disksubr.c,v 1.7 1996/01/07 22:02:55 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1982, 1986, 1988 Regents of the University of California.
|
||||
@ -283,7 +283,7 @@ done:
|
||||
*/
|
||||
int
|
||||
dk_establish(dk, dev)
|
||||
struct dkdevice *dk;
|
||||
struct disk *dk;
|
||||
struct device *dev;
|
||||
{
|
||||
/* see also arch/alpha/alpha/disksubr.c */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: fd.c,v 1.15 1995/12/11 12:43:24 pk Exp $ */
|
||||
/* $NetBSD: fd.c,v 1.16 1996/01/07 22:02:59 thorpej Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994, 1995 Charles Hannum.
|
||||
@ -164,7 +164,8 @@ struct fd_type fd_types[] = {
|
||||
|
||||
/* software state, per disk (with up to 4 disks per ctlr) */
|
||||
struct fd_softc {
|
||||
struct dkdevice sc_dk;
|
||||
struct device sc_dv; /* generic device info */
|
||||
struct disk sc_dk; /* generic disk info */
|
||||
|
||||
struct fd_type *sc_deftype; /* default type descriptor */
|
||||
struct fd_type *sc_type; /* current type descriptor */
|
||||
@ -410,6 +411,8 @@ fdcattach(parent, self, aux)
|
||||
fa.fa_deftype = &fd_types[0]; /* XXX */
|
||||
(void)config_found(self, (void *)&fa, fdprint);
|
||||
}
|
||||
|
||||
bootpath_store(1, NULL);
|
||||
}
|
||||
|
||||
int
|
||||
@ -505,16 +508,22 @@ fdattach(parent, self, aux)
|
||||
fd->sc_drive = drive;
|
||||
fd->sc_deftype = type;
|
||||
fdc->sc_fd[drive] = fd;
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
fd->sc_dk.dk_name = fd->sc_dv.dv_xname;
|
||||
fd->sc_dk.dk_driver = &fddkdriver;
|
||||
disk_attach(&fd->sc_dk);
|
||||
|
||||
/*
|
||||
* We're told if we're the boot device in fdcattach().
|
||||
*/
|
||||
if (fa->fa_bootdev)
|
||||
bootdv = &fd->sc_dk.dk_dev;
|
||||
bootdv = &fd->sc_dv;
|
||||
|
||||
/* XXX Need to do some more fiddling with sc_dk. */
|
||||
dk_establish(&fd->sc_dk, &fd->sc_dk.dk_dev);
|
||||
dk_establish(&fd->sc_dk, &fd->sc_dv);
|
||||
}
|
||||
|
||||
inline struct fd_type *
|
||||
@ -585,7 +594,7 @@ fdstrategy(bp)
|
||||
fdstart(fd);
|
||||
#ifdef DIAGNOSTIC
|
||||
else {
|
||||
struct fdc_softc *fdc = (void *)fd->sc_dk.dk_dev.dv_parent;
|
||||
struct fdc_softc *fdc = (void *)fd->sc_dv.dv_parent;
|
||||
if (fdc->sc_state == DEVIDLE) {
|
||||
printf("fdstrategy: controller inactive\n");
|
||||
fdcstart(fdc);
|
||||
@ -606,13 +615,16 @@ void
|
||||
fdstart(fd)
|
||||
struct fd_softc *fd;
|
||||
{
|
||||
struct fdc_softc *fdc = (void *)fd->sc_dk.dk_dev.dv_parent;
|
||||
struct fdc_softc *fdc = (void *)fd->sc_dv.dv_parent;
|
||||
int active = fdc->sc_drives.tqh_first != 0;
|
||||
|
||||
/* Link into controller queue. */
|
||||
fd->sc_q.b_active = 1;
|
||||
TAILQ_INSERT_TAIL(&fdc->sc_drives, fd, sc_drivechain);
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&fd->sc_dk);
|
||||
|
||||
/* If controller not already active, start it. */
|
||||
if (!active)
|
||||
fdcstart(fdc);
|
||||
@ -623,7 +635,7 @@ fdfinish(fd, bp)
|
||||
struct fd_softc *fd;
|
||||
struct buf *bp;
|
||||
{
|
||||
struct fdc_softc *fdc = (void *)fd->sc_dk.dk_dev.dv_parent;
|
||||
struct fdc_softc *fdc = (void *)fd->sc_dv.dv_parent;
|
||||
|
||||
/*
|
||||
* Move this drive to the end of the queue to give others a `fair'
|
||||
@ -642,6 +654,9 @@ fdfinish(fd, bp)
|
||||
bp->b_resid = fd->sc_bcount;
|
||||
fd->sc_skip = 0;
|
||||
fd->sc_q.b_actf = bp->b_actf;
|
||||
|
||||
disk_unbusy(&fd->sc_dk, (bp->b_bcount - bp->b_resid));
|
||||
|
||||
biodone(bp);
|
||||
/* turn off motor 5s from now */
|
||||
timeout(fd_motor_off, fd, 5 * hz);
|
||||
@ -705,7 +720,7 @@ fd_motor_off(arg)
|
||||
|
||||
s = splbio();
|
||||
fd->sc_flags &= ~(FD_MOTOR | FD_MOTOR_WAIT);
|
||||
fd_set_motor((struct fdc_softc *)fd->sc_dk.dk_dev.dv_parent);
|
||||
fd_set_motor((struct fdc_softc *)fd->sc_dv.dv_parent);
|
||||
splx(s);
|
||||
}
|
||||
|
||||
@ -714,7 +729,7 @@ fd_motor_on(arg)
|
||||
void *arg;
|
||||
{
|
||||
struct fd_softc *fd = arg;
|
||||
struct fdc_softc *fdc = (void *)fd->sc_dk.dk_dev.dv_parent;
|
||||
struct fdc_softc *fdc = (void *)fd->sc_dv.dv_parent;
|
||||
int s;
|
||||
|
||||
s = splbio();
|
||||
@ -896,7 +911,7 @@ fdctimeout(arg)
|
||||
int s;
|
||||
|
||||
s = splbio();
|
||||
fdcstatus(&fd->sc_dk.dk_dev, 0, "timeout");
|
||||
fdcstatus(&fd->sc_dv, 0, "timeout");
|
||||
|
||||
if (fd->sc_q.b_actf)
|
||||
fdc->sc_state++;
|
||||
@ -1174,7 +1189,7 @@ loop:
|
||||
cyl != bp->b_cylin * fd->sc_type->step) {
|
||||
#ifdef FD_DEBUG
|
||||
if (fdc_debug)
|
||||
fdcstatus(&fd->sc_dk.dk_dev, 2, "seek failed");
|
||||
fdcstatus(&fd->sc_dv, 2, "seek failed");
|
||||
#endif
|
||||
fdcretry(fdc);
|
||||
goto loop;
|
||||
@ -1198,7 +1213,7 @@ loop:
|
||||
if (fdc->sc_nstat != 7 || (st0 & 0xf8) != 0 || st1 != 0) {
|
||||
#ifdef FD_DEBUG
|
||||
if (fdc_debug) {
|
||||
fdcstatus(&fd->sc_dk.dk_dev, 7,
|
||||
fdcstatus(&fd->sc_dv, 7,
|
||||
bp->b_flags & B_READ
|
||||
? "read failed" : "write failed");
|
||||
printf("blkno %d nblks %d tc %d\n",
|
||||
@ -1302,7 +1317,7 @@ loop:
|
||||
if (fdc->sc_nstat != 2 || (st0 & 0xf8) != 0x20 || cyl != 0) {
|
||||
#ifdef FD_DEBUG
|
||||
if (fdc_debug)
|
||||
fdcstatus(&fd->sc_dk.dk_dev, 2, "recalibrate failed");
|
||||
fdcstatus(&fd->sc_dv, 2, "recalibrate failed");
|
||||
#endif
|
||||
fdcretry(fdc);
|
||||
goto loop;
|
||||
@ -1316,7 +1331,7 @@ loop:
|
||||
goto doseek;
|
||||
|
||||
default:
|
||||
fdcstatus(&fd->sc_dk.dk_dev, 0, "stray interrupt");
|
||||
fdcstatus(&fd->sc_dv, 0, "stray interrupt");
|
||||
return 1;
|
||||
}
|
||||
#ifdef DIAGNOSTIC
|
||||
@ -1402,18 +1417,18 @@ fdioctl(dev, cmd, addr, flag)
|
||||
|
||||
switch (cmd) {
|
||||
case DIOCGDINFO:
|
||||
bzero(&fd->sc_dk.dk_label, sizeof(struct disklabel));
|
||||
bzero(fd->sc_dk.dk_label, sizeof(struct disklabel));
|
||||
|
||||
fd->sc_dk.dk_label.d_secpercyl = fd->sc_type->seccyl;
|
||||
fd->sc_dk.dk_label.d_type = DTYPE_FLOPPY;
|
||||
fd->sc_dk.dk_label.d_secsize = FDC_BSIZE;
|
||||
fd->sc_dk.dk_label->d_secpercyl = fd->sc_type->seccyl;
|
||||
fd->sc_dk.dk_label->d_type = DTYPE_FLOPPY;
|
||||
fd->sc_dk.dk_label->d_secsize = FDC_BSIZE;
|
||||
|
||||
if (readdisklabel(dev, fdstrategy,
|
||||
&fd->sc_dk.dk_label,
|
||||
&fd->sc_dk.dk_cpulabel) != NULL)
|
||||
fd->sc_dk.dk_label,
|
||||
fd->sc_dk.dk_cpulabel) != NULL)
|
||||
return EINVAL;
|
||||
|
||||
*(struct disklabel *)addr = fd->sc_dk.dk_label;
|
||||
*(struct disklabel *)addr = *(fd->sc_dk.dk_label);
|
||||
return 0;
|
||||
|
||||
case DIOCWLABEL:
|
||||
@ -1426,28 +1441,29 @@ fdioctl(dev, cmd, addr, flag)
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
|
||||
error = setdisklabel(&fd->sc_dk.dk_label,
|
||||
error = setdisklabel(fd->sc_dk.dk_label,
|
||||
(struct disklabel *)addr, 0,
|
||||
&fd->sc_dk.dk_cpulabel);
|
||||
fd->sc_dk.dk_cpulabel);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
error = writedisklabel(dev, fdstrategy,
|
||||
&fd->sc_dk.dk_label,
|
||||
&fd->sc_dk.dk_cpulabel);
|
||||
fd->sc_dk.dk_label,
|
||||
fd->sc_dk.dk_cpulabel);
|
||||
return error;
|
||||
|
||||
case DIOCEJECT:
|
||||
auxregbisc(AUXIO_FDS, AUXIO_FEJ);
|
||||
delay(10);
|
||||
auxregbisc(AUXIO_FEJ, AUXIO_FDS);
|
||||
return 0;
|
||||
/* FALLTHROUGH */
|
||||
|
||||
#ifdef DEBUG
|
||||
case _IO('f', 100):
|
||||
{
|
||||
int i;
|
||||
struct fdc_softc *fdc = (struct fdc_softc *)
|
||||
fd->sc_dk.dk_dev.dv_parent;
|
||||
fd->sc_dv.dv_parent;
|
||||
|
||||
out_fdc(fdc, NE7CMD_DUMPREG);
|
||||
fdcresult(fdc);
|
||||
@ -1459,17 +1475,17 @@ fdioctl(dev, cmd, addr, flag)
|
||||
|
||||
return 0;
|
||||
case _IOW('f', 101, int):
|
||||
((struct fdc_softc *)fd->sc_dk.dk_dev.dv_parent)->sc_cfg &=
|
||||
((struct fdc_softc *)fd->sc_dv.dv_parent)->sc_cfg &=
|
||||
~CFG_THRHLD_MASK;
|
||||
((struct fdc_softc *)fd->sc_dk.dk_dev.dv_parent)->sc_cfg |=
|
||||
((struct fdc_softc *)fd->sc_dv.dv_parent)->sc_cfg |=
|
||||
(*(int *)addr & CFG_THRHLD_MASK);
|
||||
fdconf(fd->sc_dk.dk_dev.dv_parent);
|
||||
fdconf(fd->sc_dv.dv_parent);
|
||||
return 0;
|
||||
case _IO('f', 102):
|
||||
{
|
||||
int i;
|
||||
struct fdc_softc *fdc = (struct fdc_softc *)
|
||||
fd->sc_dk.dk_dev.dv_parent;
|
||||
fd->sc_dv.dv_parent;
|
||||
out_fdc(fdc, NE7CMD_SENSEI);
|
||||
fdcresult(fdc);
|
||||
printf("sensei(%d regs): <", fdc->sc_nstat);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: xd.c,v 1.10 1995/12/11 12:40:20 pk Exp $ */
|
||||
/* $NetBSD: xd.c,v 1.11 1996/01/07 22:03:02 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
*
|
||||
@ -36,7 +36,7 @@
|
||||
* x d . c x y l o g i c s 7 5 3 / 7 0 5 3 v m e / s m d d r i v e r
|
||||
*
|
||||
* author: Chuck Cranor <chuck@ccrc.wustl.edu>
|
||||
* id: $Id: xd.c,v 1.10 1995/12/11 12:40:20 pk Exp $
|
||||
* id: $Id: xd.c,v 1.11 1996/01/07 22:03:02 thorpej Exp $
|
||||
* started: 27-Feb-95
|
||||
* references: [1] Xylogics Model 753 User's Manual
|
||||
* part number: 166-753-001, Revision B, May 21, 1988.
|
||||
@ -298,35 +298,35 @@ xdgetdisklabel(xd, b)
|
||||
xd_labeldata = b;
|
||||
|
||||
/* Required parameter for readdisklabel() */
|
||||
xd->sc_dk.dk_label.d_secsize = XDFM_BPS;
|
||||
xd->sc_dk.dk_label->d_secsize = XDFM_BPS;
|
||||
|
||||
err = readdisklabel(MAKEDISKDEV(0, xd->sc_dev.dv_unit, RAW_PART),
|
||||
xddummystrat,
|
||||
&xd->sc_dk.dk_label, &xd->sc_dk.dk_cpulabel);
|
||||
xd->sc_dk.dk_label, xd->sc_dk.dk_cpulabel);
|
||||
if (err) {
|
||||
printf("%s: %s\n", xd->sc_dev.dv_xname, err);
|
||||
return(XD_ERR_FAIL);
|
||||
}
|
||||
|
||||
/* Ok, we have the label; fill in `pcyl' if there's SunOS magic */
|
||||
sdl = (struct sun_disklabel *)xd->sc_dk.dk_cpulabel.cd_block;
|
||||
sdl = (struct sun_disklabel *)xd->sc_dk.dk_cpulabel->cd_block;
|
||||
if (sdl->sl_magic == SUN_DKMAGIC)
|
||||
xd->pcyl = sdl->sl_pcylinders;
|
||||
else {
|
||||
printf("%s: WARNING: no `pcyl' in disk label.\n",
|
||||
xd->sc_dev.dv_xname);
|
||||
xd->pcyl = xd->sc_dk.dk_label.d_ncylinders +
|
||||
xd->sc_dk.dk_label.d_acylinders;
|
||||
xd->pcyl = xd->sc_dk.dk_label->d_ncylinders +
|
||||
xd->sc_dk.dk_label->d_acylinders;
|
||||
printf("%s: WARNING: guessing pcyl=%d (ncyl+acyl)\n",
|
||||
xd->sc_dev.dv_xname, xd->pcyl);
|
||||
}
|
||||
|
||||
xd->ncyl = xd->sc_dk.dk_label.d_ncylinders;
|
||||
xd->acyl = xd->sc_dk.dk_label.d_acylinders;
|
||||
xd->nhead = xd->sc_dk.dk_label.d_ntracks;
|
||||
xd->nsect = xd->sc_dk.dk_label.d_nsectors;
|
||||
xd->ncyl = xd->sc_dk.dk_label->d_ncylinders;
|
||||
xd->acyl = xd->sc_dk.dk_label->d_acylinders;
|
||||
xd->nhead = xd->sc_dk.dk_label->d_ntracks;
|
||||
xd->nsect = xd->sc_dk.dk_label->d_nsectors;
|
||||
xd->sectpercyl = xd->nhead * xd->nsect;
|
||||
xd->sc_dk.dk_label.d_secsize = XDFM_BPS; /* not handled by
|
||||
xd->sc_dk.dk_label->d_secsize = XDFM_BPS; /* not handled by
|
||||
* sun->bsd */
|
||||
return(XD_ERR_AOK);
|
||||
}
|
||||
@ -555,6 +555,14 @@ xdattach(parent, self, aux)
|
||||
struct dkbad *dkb;
|
||||
struct bootpath *bp;
|
||||
|
||||
/*
|
||||
* Always re-initialize the disk structure. We want statistics
|
||||
* to start with a clean slate.
|
||||
*/
|
||||
bzero(&xd->sc_dk, sizeof(xd->sc_dk));
|
||||
xd->sc_dk.dk_driver = &xddkdriver;
|
||||
xd->sc_dk.dk_name = xd->sc_dev.dv_xname;
|
||||
|
||||
/* if booting, init the xd_softc */
|
||||
|
||||
if (xa->booting) {
|
||||
@ -711,8 +719,6 @@ xdattach(parent, self, aux)
|
||||
}
|
||||
|
||||
if (xa->booting) {
|
||||
xd->sc_dk.dk_driver = &xddkdriver; /* link in dkdriver */
|
||||
|
||||
/* restore bootpath! (do this via attach_args again?)*/
|
||||
bp = bootpath_store(0, NULL);
|
||||
if (bp && strcmp("xd", bp->name) == 0 &&
|
||||
@ -720,7 +726,10 @@ xdattach(parent, self, aux)
|
||||
bootdv = &xd->sc_dev;
|
||||
}
|
||||
|
||||
dk_establish(&xd->sc_dk, &xd->sc_dev);
|
||||
/* Attach the disk. */
|
||||
disk_attach(&xd->sc_dk);
|
||||
|
||||
dk_establish(&xd->sc_dk, &xd->sc_dev); /* XXX */
|
||||
|
||||
done:
|
||||
xd->state = newstate;
|
||||
@ -835,21 +844,21 @@ xdioctl(dev, command, addr, flag, p)
|
||||
return 0;
|
||||
|
||||
case DIOCGDINFO: /* get disk label */
|
||||
bcopy(&xd->sc_dk.dk_label, addr, sizeof(struct disklabel));
|
||||
bcopy(xd->sc_dk.dk_label, addr, sizeof(struct disklabel));
|
||||
return 0;
|
||||
|
||||
case DIOCGPART: /* get partition info */
|
||||
((struct partinfo *) addr)->disklab = &xd->sc_dk.dk_label;
|
||||
((struct partinfo *) addr)->disklab = xd->sc_dk.dk_label;
|
||||
((struct partinfo *) addr)->part =
|
||||
&xd->sc_dk.dk_label.d_partitions[DISKPART(dev)];
|
||||
&xd->sc_dk.dk_label->d_partitions[DISKPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCSDINFO: /* set disk label */
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
error = setdisklabel(&xd->sc_dk.dk_label,
|
||||
error = setdisklabel(xd->sc_dk.dk_label,
|
||||
(struct disklabel *) addr, /* xd->sc_dk.dk_openmask : */ 0,
|
||||
&xd->sc_dk.dk_cpulabel);
|
||||
xd->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (xd->state == XD_DRIVE_NOLABEL)
|
||||
xd->state = XD_DRIVE_ONLINE;
|
||||
@ -868,9 +877,9 @@ xdioctl(dev, command, addr, flag, p)
|
||||
case DIOCWDINFO: /* write disk label */
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
error = setdisklabel(&xd->sc_dk.dk_label,
|
||||
error = setdisklabel(xd->sc_dk.dk_label,
|
||||
(struct disklabel *) addr, /* xd->sc_dk.dk_openmask : */ 0,
|
||||
&xd->sc_dk.dk_cpulabel);
|
||||
xd->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (xd->state == XD_DRIVE_NOLABEL)
|
||||
xd->state = XD_DRIVE_ONLINE;
|
||||
@ -878,8 +887,8 @@ xdioctl(dev, command, addr, flag, p)
|
||||
/* Simulate opening partition 0 so write succeeds. */
|
||||
xd->sc_dk.dk_openmask |= (1 << 0);
|
||||
error = writedisklabel(MAKEDISKDEV(major(dev), DISKUNIT(dev), RAW_PART),
|
||||
xdstrategy, &xd->sc_dk.dk_label,
|
||||
&xd->sc_dk.dk_cpulabel);
|
||||
xdstrategy, xd->sc_dk.dk_label,
|
||||
xd->sc_dk.dk_cpulabel);
|
||||
xd->sc_dk.dk_openmask =
|
||||
xd->sc_dk.dk_copenmask | xd->sc_dk.dk_bopenmask;
|
||||
}
|
||||
@ -932,8 +941,8 @@ xdopen(dev, flag, fmt)
|
||||
/* check for partition */
|
||||
|
||||
if (part != RAW_PART &&
|
||||
(part >= xd->sc_dk.dk_label.d_npartitions ||
|
||||
xd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= xd->sc_dk.dk_label->d_npartitions ||
|
||||
xd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
return (ENXIO);
|
||||
}
|
||||
/* set open masks */
|
||||
@ -991,10 +1000,10 @@ xdsize(dev)
|
||||
|
||||
xdsc = xdcd.cd_devs[DISKUNIT(dev)];
|
||||
part = DISKPART(dev);
|
||||
if (xdsc->sc_dk.dk_label.d_partitions[part].p_fstype != FS_SWAP)
|
||||
if (xdsc->sc_dk.dk_label->d_partitions[part].p_fstype != FS_SWAP)
|
||||
size = -1; /* only give valid size for swap partitions */
|
||||
else
|
||||
size = xdsc->sc_dk.dk_label.d_partitions[part].p_size;
|
||||
size = xdsc->sc_dk.dk_label->d_partitions[part].p_size;
|
||||
if (xdclose(dev, 0, S_IFBLK) != 0)
|
||||
return -1;
|
||||
return size;
|
||||
@ -1020,7 +1029,7 @@ xdstrategy(bp)
|
||||
|
||||
if (unit >= xdcd.cd_ndevs || (xd = xdcd.cd_devs[unit]) == 0 ||
|
||||
bp->b_blkno < 0 ||
|
||||
(bp->b_bcount % xd->sc_dk.dk_label.d_secsize) != 0) {
|
||||
(bp->b_bcount % xd->sc_dk.dk_label->d_secsize) != 0) {
|
||||
bp->b_error = EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
@ -1053,7 +1062,7 @@ xdstrategy(bp)
|
||||
* partition. Adjust transfer if needed, and signal errors or early
|
||||
* completion. */
|
||||
|
||||
if (bounds_check_with_label(bp, &xd->sc_dk.dk_label,
|
||||
if (bounds_check_with_label(bp, xd->sc_dk.dk_label,
|
||||
(xd->flags & XD_WLABEL) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -1091,6 +1100,10 @@ xdstrategy(bp)
|
||||
if (xdc_startbuf(parent, xd, bp) != XD_ERR_AOK) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&xd->sc_dk);
|
||||
|
||||
/* done! */
|
||||
|
||||
splx(s);
|
||||
@ -1412,7 +1425,7 @@ xdc_startbuf(xdcsc, xdsc, bp)
|
||||
*/
|
||||
|
||||
block = bp->b_blkno + ((partno == RAW_PART) ? 0 :
|
||||
xdsc->sc_dk.dk_label.d_partitions[partno].p_offset);
|
||||
xdsc->sc_dk.dk_label->d_partitions[partno].p_offset);
|
||||
|
||||
dbuf = kdvma_mapin(bp->b_data, bp->b_bcount, 0);
|
||||
if (dbuf == NULL) { /* out of DVMA space */
|
||||
@ -1715,6 +1728,9 @@ xdc_reset(xdcsc, quiet, blastmode, error, xdsc)
|
||||
(vm_offset_t)iorq->dbufbase,
|
||||
(vm_offset_t)iorq->buf->b_un.b_addr,
|
||||
iorq->buf->b_bcount);
|
||||
disk_unbusy(&xdcsc->reqs[lcv].xd->sc_dk,
|
||||
(xdcsc->reqs[lcv].buf->b_bcount -
|
||||
xdcsc->reqs[lcv].buf->b_resid));
|
||||
biodone(iorq->buf);
|
||||
XDC_FREE(xdcsc, lcv); /* add to free list */
|
||||
break;
|
||||
@ -1920,6 +1936,8 @@ xdc_remove_iorq(xdcsc)
|
||||
(vm_offset_t) bp->b_un.b_addr,
|
||||
bp->b_bcount);
|
||||
XDC_FREE(xdcsc, rqno);
|
||||
disk_unbusy(&iorq->xd->sc_dk,
|
||||
(bp->b_bcount - bp->b_resid));
|
||||
biodone(bp);
|
||||
break;
|
||||
case XD_SUB_WAIT:
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: xdvar.h,v 1.1 1995/06/26 23:07:19 pk Exp $ */
|
||||
/* $NetBSD: xdvar.h,v 1.2 1996/01/07 22:03:04 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
*
|
||||
@ -101,7 +101,7 @@ struct xd_iorq {
|
||||
|
||||
struct xd_softc {
|
||||
struct device sc_dev; /* device struct, reqd by autoconf */
|
||||
struct dkdevice sc_dk; /* dkdevice: hook for iostat */
|
||||
struct disk sc_dk; /* generic disk info */
|
||||
struct xdc_softc *parent; /* parent */
|
||||
u_short flags; /* flags */
|
||||
u_short state; /* device state */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: xy.c,v 1.2 1995/12/11 12:40:25 pk Exp $ */
|
||||
/* $NetBSD: xy.c,v 1.3 1996/01/07 22:03:05 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
*
|
||||
@ -36,7 +36,7 @@
|
||||
* x y . c x y l o g i c s 4 5 0 / 4 5 1 s m d d r i v e r
|
||||
*
|
||||
* author: Chuck Cranor <chuck@ccrc.wustl.edu>
|
||||
* id: $Id: xy.c,v 1.2 1995/12/11 12:40:25 pk Exp $
|
||||
* id: $Id: xy.c,v 1.3 1996/01/07 22:03:05 thorpej Exp $
|
||||
* started: 14-Sep-95
|
||||
* references: [1] Xylogics Model 753 User's Manual
|
||||
* part number: 166-753-001, Revision B, May 21, 1988.
|
||||
@ -241,35 +241,35 @@ xygetdisklabel(xy, b)
|
||||
xy_labeldata = b;
|
||||
|
||||
/* Required parameter for readdisklabel() */
|
||||
xy->sc_dk.dk_label.d_secsize = XYFM_BPS;
|
||||
xy->sc_dk.dk_label->d_secsize = XYFM_BPS;
|
||||
|
||||
err = readdisklabel(MAKEDISKDEV(0, xy->sc_dev.dv_unit, RAW_PART),
|
||||
xydummystrat,
|
||||
&xy->sc_dk.dk_label, &xy->sc_dk.dk_cpulabel);
|
||||
xy->sc_dk.dk_label, xy->sc_dk.dk_cpulabel);
|
||||
if (err) {
|
||||
printf("%s: %s\n", xy->sc_dev.dv_xname, err);
|
||||
return(XY_ERR_FAIL);
|
||||
}
|
||||
|
||||
/* Ok, we have the label; fill in `pcyl' if there's SunOS magic */
|
||||
sdl = (struct sun_disklabel *)xy->sc_dk.dk_cpulabel.cd_block;
|
||||
sdl = (struct sun_disklabel *)xy->sc_dk.dk_cpulabel->cd_block;
|
||||
if (sdl->sl_magic == SUN_DKMAGIC)
|
||||
xy->pcyl = sdl->sl_pcylinders;
|
||||
else {
|
||||
printf("%s: WARNING: no `pcyl' in disk label.\n",
|
||||
xy->sc_dev.dv_xname);
|
||||
xy->pcyl = xy->sc_dk.dk_label.d_ncylinders +
|
||||
xy->sc_dk.dk_label.d_acylinders;
|
||||
xy->pcyl = xy->sc_dk.dk_label->d_ncylinders +
|
||||
xy->sc_dk.dk_label->d_acylinders;
|
||||
printf("%s: WARNING: guessing pcyl=%d (ncyl+acyl)\n",
|
||||
xy->sc_dev.dv_xname, xy->pcyl);
|
||||
}
|
||||
|
||||
xy->ncyl = xy->sc_dk.dk_label.d_ncylinders;
|
||||
xy->acyl = xy->sc_dk.dk_label.d_acylinders;
|
||||
xy->nhead = xy->sc_dk.dk_label.d_ntracks;
|
||||
xy->nsect = xy->sc_dk.dk_label.d_nsectors;
|
||||
xy->ncyl = xy->sc_dk.dk_label->d_ncylinders;
|
||||
xy->acyl = xy->sc_dk.dk_label->d_acylinders;
|
||||
xy->nhead = xy->sc_dk.dk_label->d_ntracks;
|
||||
xy->nsect = xy->sc_dk.dk_label->d_nsectors;
|
||||
xy->sectpercyl = xy->nhead * xy->nsect;
|
||||
xy->sc_dk.dk_label.d_secsize = XYFM_BPS; /* not handled by
|
||||
xy->sc_dk.dk_label->d_secsize = XYFM_BPS; /* not handled by
|
||||
* sun->bsd */
|
||||
return(XY_ERR_AOK);
|
||||
}
|
||||
@ -501,6 +501,14 @@ xyattach(parent, self, aux)
|
||||
struct dkbad *dkb;
|
||||
struct bootpath *bp;
|
||||
|
||||
/*
|
||||
* Always re-initialize the disk structure. We want statistics
|
||||
* to start with a clean slate.
|
||||
*/
|
||||
bzero(&xy->sc_dk, sizeof(xy->sc_dk));
|
||||
xy->sc_dk.dk_driver = &xydkdriver;
|
||||
xy->sc_dk.dk_name = xy->sc_dev.dv_xname;
|
||||
|
||||
/* if booting, init the xy_softc */
|
||||
|
||||
if (xa->booting) {
|
||||
@ -675,8 +683,6 @@ xyattach(parent, self, aux)
|
||||
}
|
||||
|
||||
if (xa->booting) {
|
||||
xy->sc_dk.dk_driver = &xydkdriver; /* link in dkdriver */
|
||||
|
||||
/* restore bootpath! (do this via attach_args again?)*/
|
||||
bp = bootpath_store(0, NULL);
|
||||
if (bp && strcmp("xy", bp->name) == 0 &&
|
||||
@ -684,7 +690,10 @@ xyattach(parent, self, aux)
|
||||
bootdv = &xy->sc_dev;
|
||||
}
|
||||
|
||||
dk_establish(&xy->sc_dk, &xy->sc_dev);
|
||||
/* Attach the disk. */
|
||||
disk_attach(&xy->sc_dk);
|
||||
|
||||
dk_establish(&xy->sc_dk, &xy->sc_dev); /* XXX */
|
||||
|
||||
done:
|
||||
xy->state = newstate;
|
||||
@ -799,21 +808,21 @@ xyioctl(dev, command, addr, flag, p)
|
||||
return 0;
|
||||
|
||||
case DIOCGDINFO: /* get disk label */
|
||||
bcopy(&xy->sc_dk.dk_label, addr, sizeof(struct disklabel));
|
||||
bcopy(xy->sc_dk.dk_label, addr, sizeof(struct disklabel));
|
||||
return 0;
|
||||
|
||||
case DIOCGPART: /* get partition info */
|
||||
((struct partinfo *) addr)->disklab = &xy->sc_dk.dk_label;
|
||||
((struct partinfo *) addr)->disklab = xy->sc_dk.dk_label;
|
||||
((struct partinfo *) addr)->part =
|
||||
&xy->sc_dk.dk_label.d_partitions[DISKPART(dev)];
|
||||
&xy->sc_dk.dk_label->d_partitions[DISKPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCSDINFO: /* set disk label */
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
error = setdisklabel(&xy->sc_dk.dk_label,
|
||||
error = setdisklabel(xy->sc_dk.dk_label,
|
||||
(struct disklabel *) addr, /* xy->sc_dk.dk_openmask : */ 0,
|
||||
&xy->sc_dk.dk_cpulabel);
|
||||
xy->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (xy->state == XY_DRIVE_NOLABEL)
|
||||
xy->state = XY_DRIVE_ONLINE;
|
||||
@ -832,9 +841,9 @@ xyioctl(dev, command, addr, flag, p)
|
||||
case DIOCWDINFO: /* write disk label */
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
error = setdisklabel(&xy->sc_dk.dk_label,
|
||||
error = setdisklabel(xy->sc_dk.dk_label,
|
||||
(struct disklabel *) addr, /* xy->sc_dk.dk_openmask : */ 0,
|
||||
&xy->sc_dk.dk_cpulabel);
|
||||
xy->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (xy->state == XY_DRIVE_NOLABEL)
|
||||
xy->state = XY_DRIVE_ONLINE;
|
||||
@ -842,8 +851,8 @@ xyioctl(dev, command, addr, flag, p)
|
||||
/* Simulate opening partition 0 so write succeeds. */
|
||||
xy->sc_dk.dk_openmask |= (1 << 0);
|
||||
error = writedisklabel(MAKEDISKDEV(major(dev), DISKUNIT(dev), RAW_PART),
|
||||
xystrategy, &xy->sc_dk.dk_label,
|
||||
&xy->sc_dk.dk_cpulabel);
|
||||
xystrategy, xy->sc_dk.dk_label,
|
||||
xy->sc_dk.dk_cpulabel);
|
||||
xy->sc_dk.dk_openmask =
|
||||
xy->sc_dk.dk_copenmask | xy->sc_dk.dk_bopenmask;
|
||||
}
|
||||
@ -898,8 +907,8 @@ xyopen(dev, flag, fmt)
|
||||
/* check for partition */
|
||||
|
||||
if (part != RAW_PART &&
|
||||
(part >= xy->sc_dk.dk_label.d_npartitions ||
|
||||
xy->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= xy->sc_dk.dk_label->d_npartitions ||
|
||||
xy->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
return (ENXIO);
|
||||
}
|
||||
/* set open masks */
|
||||
@ -957,10 +966,10 @@ xysize(dev)
|
||||
|
||||
xysc = xycd.cd_devs[DISKUNIT(dev)];
|
||||
part = DISKPART(dev);
|
||||
if (xysc->sc_dk.dk_label.d_partitions[part].p_fstype != FS_SWAP)
|
||||
if (xysc->sc_dk.dk_label->d_partitions[part].p_fstype != FS_SWAP)
|
||||
size = -1; /* only give valid size for swap partitions */
|
||||
else
|
||||
size = xysc->sc_dk.dk_label.d_partitions[part].p_size;
|
||||
size = xysc->sc_dk.dk_label->d_partitions[part].p_size;
|
||||
if (xyclose(dev, 0, S_IFBLK) != 0)
|
||||
return -1;
|
||||
return size;
|
||||
@ -987,7 +996,7 @@ xystrategy(bp)
|
||||
|
||||
if (unit >= xycd.cd_ndevs || (xy = xycd.cd_devs[unit]) == 0 ||
|
||||
bp->b_blkno < 0 ||
|
||||
(bp->b_bcount % xy->sc_dk.dk_label.d_secsize) != 0) {
|
||||
(bp->b_bcount % xy->sc_dk.dk_label->d_secsize) != 0) {
|
||||
bp->b_error = EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
@ -1020,7 +1029,7 @@ xystrategy(bp)
|
||||
* partition. Adjust transfer if needed, and signal errors or early
|
||||
* completion. */
|
||||
|
||||
if (bounds_check_with_label(bp, &xy->sc_dk.dk_label,
|
||||
if (bounds_check_with_label(bp, xy->sc_dk.dk_label,
|
||||
(xy->flags & XY_WLABEL) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -1036,6 +1045,9 @@ xystrategy(bp)
|
||||
|
||||
xyc_start(xy->parent, NULL);
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&xy->sc_dk);
|
||||
|
||||
/* done! */
|
||||
|
||||
splx(s);
|
||||
@ -1277,7 +1289,7 @@ xyc_startbuf(xycsc, xysc, bp)
|
||||
*/
|
||||
|
||||
block = bp->b_blkno + ((partno == RAW_PART) ? 0 :
|
||||
xysc->sc_dk.dk_label.d_partitions[partno].p_offset);
|
||||
xysc->sc_dk.dk_label->d_partitions[partno].p_offset);
|
||||
|
||||
dbuf = kdvma_mapin(bp->b_data, bp->b_bcount, 0);
|
||||
if (dbuf == NULL) { /* out of DVMA space */
|
||||
@ -1628,6 +1640,9 @@ xyc_reset(xycsc, quiet, blastmode, error, xysc)
|
||||
(vm_offset_t)iorq->buf->b_un.b_addr,
|
||||
iorq->buf->b_bcount);
|
||||
iorq->xy->xyq.b_actf = iorq->buf->b_actf;
|
||||
disk_unbusy(&xycsc->reqs[lcv].xy->sc_dk,
|
||||
(xycsc->reqs[lcv].buf->b_bcount -
|
||||
xycsc->reqs[lcv].buf->b_resid));
|
||||
biodone(iorq->buf);
|
||||
iorq->mode = XY_SUB_FREE;
|
||||
break;
|
||||
@ -1804,6 +1819,8 @@ xyc_remove_iorq(xycsc)
|
||||
bp->b_bcount);
|
||||
iorq->mode = XY_SUB_FREE;
|
||||
iorq->xy->xyq.b_actf = bp->b_actf;
|
||||
disk_unbusy(&iorq->xy->sc_dk,
|
||||
(bp->b_bcount - bp->b_resid));
|
||||
biodone(bp);
|
||||
break;
|
||||
case XY_SUB_WAIT:
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: xyvar.h,v 1.1 1995/09/25 20:35:17 chuck Exp $ */
|
||||
/* $NetBSD: xyvar.h,v 1.2 1996/01/07 22:03:06 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
*
|
||||
@ -101,7 +101,7 @@ struct xy_iorq {
|
||||
|
||||
struct xy_softc {
|
||||
struct device sc_dev; /* device struct, reqd by autoconf */
|
||||
struct dkdevice sc_dk; /* dkdevice: hook for iostat */
|
||||
struct disk sc_dk; /* generic disk info */
|
||||
struct xyc_softc *parent; /* parent */
|
||||
u_short flags; /* flags */
|
||||
u_short state; /* device state */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sun_disklabel.h,v 1.5 1995/06/26 22:09:47 pk Exp $ */
|
||||
/* $NetBSD: sun_disklabel.h,v 1.6 1996/01/07 22:03:09 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -111,5 +111,5 @@ struct sun_disklabel { /* total size = 512 bytes */
|
||||
int sun_disklabel __P((caddr_t, struct disklabel *)); /* true on success */
|
||||
|
||||
/* compatability dk ioctl's */
|
||||
int sun_dkioctl __P((struct dkdevice *, u_long, caddr_t, int));
|
||||
int sun_dkioctl __P((struct disk *, u_long, caddr_t, int));
|
||||
#endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: disksubr.c,v 1.10 1995/11/29 23:43:42 pk Exp $ */
|
||||
/* $NetBSD: disksubr.c,v 1.11 1996/01/07 22:03:12 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Gordon W. Ross
|
||||
@ -68,7 +68,7 @@ extern struct device *bootdv;
|
||||
|
||||
int
|
||||
dk_establish(dk, dev)
|
||||
struct dkdevice *dk;
|
||||
struct disk *dk;
|
||||
struct device *dev;
|
||||
{
|
||||
struct bootpath *bp = bootpath_store(0, NULL); /* restore bootpath! */
|
||||
@ -488,7 +488,7 @@ disklabel_bsd_to_sun(lp, cp)
|
||||
/* move this to compat/sunos */
|
||||
int
|
||||
sun_dkioctl(dk, cmd, data, partition)
|
||||
struct dkdevice *dk;
|
||||
struct disk *dk;
|
||||
u_long cmd;
|
||||
caddr_t data;
|
||||
int partition;
|
||||
@ -499,15 +499,15 @@ sun_dkioctl(dk, cmd, data, partition)
|
||||
case DKIOCGGEOM:
|
||||
#define geom ((struct sun_dkgeom *)data)
|
||||
bzero(data, sizeof(*geom));
|
||||
geom->sdkc_ncylinders = dk->dk_label.d_ncylinders;
|
||||
geom->sdkc_acylinders = dk->dk_label.d_acylinders;
|
||||
geom->sdkc_ntracks = dk->dk_label.d_ntracks;
|
||||
geom->sdkc_nsectors = dk->dk_label.d_nsectors;
|
||||
geom->sdkc_interleave = dk->dk_label.d_interleave;
|
||||
geom->sdkc_sparespercyl = dk->dk_label.d_sparespercyl;
|
||||
geom->sdkc_rpm = dk->dk_label.d_rpm;
|
||||
geom->sdkc_ncylinders = dk->dk_label->d_ncylinders;
|
||||
geom->sdkc_acylinders = dk->dk_label->d_acylinders;
|
||||
geom->sdkc_ntracks = dk->dk_label->d_ntracks;
|
||||
geom->sdkc_nsectors = dk->dk_label->d_nsectors;
|
||||
geom->sdkc_interleave = dk->dk_label->d_interleave;
|
||||
geom->sdkc_sparespercyl = dk->dk_label->d_sparespercyl;
|
||||
geom->sdkc_rpm = dk->dk_label->d_rpm;
|
||||
geom->sdkc_pcylinders =
|
||||
dk->dk_label.d_ncylinders + dk->dk_label.d_acylinders;
|
||||
dk->dk_label->d_ncylinders + dk->dk_label->d_acylinders;
|
||||
#undef geom
|
||||
break;
|
||||
case DKIOCINFO:
|
||||
@ -515,13 +515,13 @@ sun_dkioctl(dk, cmd, data, partition)
|
||||
bzero(data, sizeof(struct sun_dkctlr));
|
||||
break;
|
||||
case DKIOCGPART:
|
||||
if (dk->dk_label.d_secpercyl == 0)
|
||||
if (dk->dk_label->d_secpercyl == 0)
|
||||
return (ERANGE); /* XXX */
|
||||
p = &dk->dk_label.d_partitions[partition];
|
||||
if (p->p_offset % dk->dk_label.d_secpercyl != 0)
|
||||
p = &dk->dk_label->d_partitions[partition];
|
||||
if (p->p_offset % dk->dk_label->d_secpercyl != 0)
|
||||
return (ERANGE); /* XXX */
|
||||
#define part ((struct sun_dkpart *)data)
|
||||
part->sdkp_cyloffset = p->p_offset / dk->dk_label.d_secpercyl;
|
||||
part->sdkp_cyloffset = p->p_offset / dk->dk_label->d_secpercyl;
|
||||
part->sdkp_nsectors = p->p_size;
|
||||
#undef part
|
||||
break;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: xd.c,v 1.1 1995/10/30 20:58:17 gwr Exp $ */
|
||||
/* $NetBSD: xd.c,v 1.2 1996/01/07 22:03:17 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
*
|
||||
@ -36,7 +36,7 @@
|
||||
* x d . c x y l o g i c s 7 5 3 / 7 0 5 3 v m e / s m d d r i v e r
|
||||
*
|
||||
* author: Chuck Cranor <chuck@ccrc.wustl.edu>
|
||||
* id: $Id: xd.c,v 1.1 1995/10/30 20:58:17 gwr Exp $
|
||||
* id: $Id: xd.c,v 1.2 1996/01/07 22:03:17 thorpej Exp $
|
||||
* started: 27-Feb-95
|
||||
* references: [1] Xylogics Model 753 User's Manual
|
||||
* part number: 166-753-001, Revision B, May 21, 1988.
|
||||
@ -295,35 +295,35 @@ xdgetdisklabel(xd, b)
|
||||
xd_labeldata = b;
|
||||
|
||||
/* Required parameter for readdisklabel() */
|
||||
xd->sc_dk.dk_label.d_secsize = XDFM_BPS;
|
||||
xd->sc_dk.dk_label->d_secsize = XDFM_BPS;
|
||||
|
||||
err = readdisklabel(MAKEDISKDEV(0, xd->sc_dev.dv_unit, RAW_PART),
|
||||
xddummystrat,
|
||||
&xd->sc_dk.dk_label, &xd->sc_dk.dk_cpulabel);
|
||||
xd->sc_dk.dk_label, xd->sc_dk.dk_cpulabel);
|
||||
if (err) {
|
||||
printf("%s: %s\n", xd->sc_dev.dv_xname, err);
|
||||
return(XD_ERR_FAIL);
|
||||
}
|
||||
|
||||
/* Ok, we have the label; fill in `pcyl' if there's SunOS magic */
|
||||
sdl = (struct sun_disklabel *)xd->sc_dk.dk_cpulabel.cd_block;
|
||||
sdl = (struct sun_disklabel *)xd->sc_dk.dk_cpulabel->cd_block;
|
||||
if (sdl->sl_magic == SUN_DKMAGIC)
|
||||
xd->pcyl = sdl->sl_pcyl;
|
||||
else {
|
||||
printf("%s: WARNING: no `pcyl' in disk label.\n",
|
||||
xd->sc_dev.dv_xname);
|
||||
xd->pcyl = xd->sc_dk.dk_label.d_ncylinders +
|
||||
xd->sc_dk.dk_label.d_acylinders;
|
||||
xd->pcyl = xd->sc_dk.dk_label->d_ncylinders +
|
||||
xd->sc_dk.dk_label->d_acylinders;
|
||||
printf("%s: WARNING: guessing pcyl=%d (ncyl+acyl)\n",
|
||||
xd->sc_dev.dv_xname, xd->pcyl);
|
||||
}
|
||||
|
||||
xd->ncyl = xd->sc_dk.dk_label.d_ncylinders;
|
||||
xd->acyl = xd->sc_dk.dk_label.d_acylinders;
|
||||
xd->nhead = xd->sc_dk.dk_label.d_ntracks;
|
||||
xd->nsect = xd->sc_dk.dk_label.d_nsectors;
|
||||
xd->ncyl = xd->sc_dk.dk_label->d_ncylinders;
|
||||
xd->acyl = xd->sc_dk.dk_label->d_acylinders;
|
||||
xd->nhead = xd->sc_dk.dk_label->d_ntracks;
|
||||
xd->nsect = xd->sc_dk.dk_label->d_nsectors;
|
||||
xd->sectpercyl = xd->nhead * xd->nsect;
|
||||
xd->sc_dk.dk_label.d_secsize = XDFM_BPS; /* not handled by
|
||||
xd->sc_dk.dk_label->d_secsize = XDFM_BPS; /* not handled by
|
||||
* sun->bsd */
|
||||
return(XD_ERR_AOK);
|
||||
}
|
||||
@ -525,6 +525,14 @@ xdattach(parent, self, aux)
|
||||
struct dkbad *dkb;
|
||||
struct bootpath *bp;
|
||||
|
||||
/*
|
||||
* Always re-initialize the disk structure. We want statistics
|
||||
* to start with a clean slate.
|
||||
*/
|
||||
bzero(&xd->sc_dk, sizeof(xd->sc_dk));
|
||||
xd->sc_dk.dk_driver = &xddkdriver;
|
||||
xd->sc_dk.dk_name = xd->sc_dev.dv_xname;
|
||||
|
||||
/* if booting, init the xd_softc */
|
||||
|
||||
if (xa->booting) {
|
||||
@ -683,9 +691,8 @@ xdattach(parent, self, aux)
|
||||
bcopy(xa->dvmabuf, &xd->dkb, XDFM_BPS);
|
||||
}
|
||||
|
||||
if (xa->booting) {
|
||||
xd->sc_dk.dk_driver = &xddkdriver; /* link in dkdriver */
|
||||
}
|
||||
/* Attach the disk. */
|
||||
disk_attach(&xd->sc_dk);
|
||||
|
||||
/* XXX - Where is this and what does it do? -gwr */
|
||||
dk_establish(&xd->sc_dk, &xd->sc_dev);
|
||||
@ -803,21 +810,21 @@ xdioctl(dev, command, addr, flag, p)
|
||||
return 0;
|
||||
|
||||
case DIOCGDINFO: /* get disk label */
|
||||
bcopy(&xd->sc_dk.dk_label, addr, sizeof(struct disklabel));
|
||||
bcopy(xd->sc_dk.dk_label, addr, sizeof(struct disklabel));
|
||||
return 0;
|
||||
|
||||
case DIOCGPART: /* get partition info */
|
||||
((struct partinfo *) addr)->disklab = &xd->sc_dk.dk_label;
|
||||
((struct partinfo *) addr)->disklab = xd->sc_dk.dk_label;
|
||||
((struct partinfo *) addr)->part =
|
||||
&xd->sc_dk.dk_label.d_partitions[DISKPART(dev)];
|
||||
&xd->sc_dk.dk_label->d_partitions[DISKPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCSDINFO: /* set disk label */
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
error = setdisklabel(&xd->sc_dk.dk_label,
|
||||
error = setdisklabel(xd->sc_dk.dk_label,
|
||||
(struct disklabel *) addr, /* xd->sc_dk.dk_openmask : */ 0,
|
||||
&xd->sc_dk.dk_cpulabel);
|
||||
xd->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (xd->state == XD_DRIVE_NOLABEL)
|
||||
xd->state = XD_DRIVE_ONLINE;
|
||||
@ -836,9 +843,9 @@ xdioctl(dev, command, addr, flag, p)
|
||||
case DIOCWDINFO: /* write disk label */
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
error = setdisklabel(&xd->sc_dk.dk_label,
|
||||
error = setdisklabel(xd->sc_dk.dk_label,
|
||||
(struct disklabel *) addr, /* xd->sc_dk.dk_openmask : */ 0,
|
||||
&xd->sc_dk.dk_cpulabel);
|
||||
xd->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (xd->state == XD_DRIVE_NOLABEL)
|
||||
xd->state = XD_DRIVE_ONLINE;
|
||||
@ -846,8 +853,8 @@ xdioctl(dev, command, addr, flag, p)
|
||||
/* Simulate opening partition 0 so write succeeds. */
|
||||
xd->sc_dk.dk_openmask |= (1 << 0);
|
||||
error = writedisklabel(MAKEDISKDEV(major(dev), DISKUNIT(dev), RAW_PART),
|
||||
xdstrategy, &xd->sc_dk.dk_label,
|
||||
&xd->sc_dk.dk_cpulabel);
|
||||
xdstrategy, xd->sc_dk.dk_label,
|
||||
xd->sc_dk.dk_cpulabel);
|
||||
xd->sc_dk.dk_openmask =
|
||||
xd->sc_dk.dk_copenmask | xd->sc_dk.dk_bopenmask;
|
||||
}
|
||||
@ -900,8 +907,8 @@ xdopen(dev, flag, fmt)
|
||||
/* check for partition */
|
||||
|
||||
if (part != RAW_PART &&
|
||||
(part >= xd->sc_dk.dk_label.d_npartitions ||
|
||||
xd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= xd->sc_dk.dk_label->d_npartitions ||
|
||||
xd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
return (ENXIO);
|
||||
}
|
||||
/* set open masks */
|
||||
@ -959,10 +966,10 @@ xdsize(dev)
|
||||
|
||||
xdsc = xdcd.cd_devs[DISKUNIT(dev)];
|
||||
part = DISKPART(dev);
|
||||
if (xdsc->sc_dk.dk_label.d_partitions[part].p_fstype != FS_SWAP)
|
||||
if (xdsc->sc_dk.dk_label->d_partitions[part].p_fstype != FS_SWAP)
|
||||
size = -1; /* only give valid size for swap partitions */
|
||||
else
|
||||
size = xdsc->sc_dk.dk_label.d_partitions[part].p_size;
|
||||
size = xdsc->sc_dk.dk_label->d_partitions[part].p_size;
|
||||
if (xdclose(dev, 0, S_IFBLK) != 0)
|
||||
return -1;
|
||||
return size;
|
||||
@ -988,7 +995,7 @@ xdstrategy(bp)
|
||||
|
||||
if (unit >= xdcd.cd_ndevs || (xd = xdcd.cd_devs[unit]) == 0 ||
|
||||
bp->b_blkno < 0 ||
|
||||
(bp->b_bcount % xd->sc_dk.dk_label.d_secsize) != 0) {
|
||||
(bp->b_bcount % xd->sc_dk.dk_label->d_secsize) != 0) {
|
||||
bp->b_error = EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
@ -1021,7 +1028,7 @@ xdstrategy(bp)
|
||||
* partition. Adjust transfer if needed, and signal errors or early
|
||||
* completion. */
|
||||
|
||||
if (bounds_check_with_label(bp, &xd->sc_dk.dk_label,
|
||||
if (bounds_check_with_label(bp, xd->sc_dk.dk_label,
|
||||
(xd->flags & XD_WLABEL) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -1059,6 +1066,10 @@ xdstrategy(bp)
|
||||
if (xdc_startbuf(parent, xd, bp) != XD_ERR_AOK) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&xd->sc_dk);
|
||||
|
||||
/* done! */
|
||||
|
||||
splx(s);
|
||||
@ -1392,7 +1403,7 @@ xdc_startbuf(xdcsc, xdsc, bp)
|
||||
*/
|
||||
|
||||
block = bp->b_blkno + ((partno == RAW_PART) ? 0 :
|
||||
xdsc->sc_dk.dk_label.d_partitions[partno].p_offset);
|
||||
xdsc->sc_dk.dk_label->d_partitions[partno].p_offset);
|
||||
|
||||
dbuf = dvma_mapin(bp->b_data, bp->b_bcount);
|
||||
if (dbuf == NULL) { /* out of DVMA space */
|
||||
@ -1694,6 +1705,8 @@ xdc_reset(xdcsc, quiet, blastmode, error, xdsc)
|
||||
/* Sun3: map/unmap regardless of B_PHYS */
|
||||
dvma_mapout(iorq->dbufbase,
|
||||
iorq->buf->b_bcount);
|
||||
disk_unbusy(&iorq->xd->sc_dk,
|
||||
(iorq->buf->b_bcount - iorq->buf->b_resid));
|
||||
biodone(iorq->buf);
|
||||
XDC_FREE(xdcsc, lcv); /* add to free list */
|
||||
break;
|
||||
@ -1899,6 +1912,8 @@ xdc_remove_iorq(xdcsc)
|
||||
dvma_mapout(iorq->dbufbase,
|
||||
iorq->buf->b_bcount);
|
||||
XDC_FREE(xdcsc, rqno);
|
||||
disk_unbusy(&iorq->xd->sc_dk,
|
||||
(bp->b_bcount - bp->b_resid));
|
||||
biodone(bp);
|
||||
break;
|
||||
case XD_SUB_WAIT:
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: xdvar.h,v 1.1 1995/10/30 20:58:19 gwr Exp $ */
|
||||
/* $NetBSD: xdvar.h,v 1.2 1996/01/07 22:03:18 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
*
|
||||
@ -101,7 +101,7 @@ struct xd_iorq {
|
||||
|
||||
struct xd_softc {
|
||||
struct device sc_dev; /* device struct, reqd by autoconf */
|
||||
struct dkdevice sc_dk; /* dkdevice: hook for iostat */
|
||||
struct disk sc_dk; /* generic disk info */
|
||||
struct xdc_softc *parent; /* parent */
|
||||
u_short flags; /* flags */
|
||||
u_short state; /* device state */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: xy.c,v 1.1 1995/10/30 20:58:21 gwr Exp $ */
|
||||
/* $NetBSD: xy.c,v 1.2 1996/01/07 22:03:20 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
*
|
||||
@ -36,7 +36,7 @@
|
||||
* x y . c x y l o g i c s 4 5 0 / 4 5 1 s m d d r i v e r
|
||||
*
|
||||
* author: Chuck Cranor <chuck@ccrc.wustl.edu>
|
||||
* id: $Id: xy.c,v 1.1 1995/10/30 20:58:21 gwr Exp $
|
||||
* id: $Id: xy.c,v 1.2 1996/01/07 22:03:20 thorpej Exp $
|
||||
* started: 14-Sep-95
|
||||
* references: [1] Xylogics Model 753 User's Manual
|
||||
* part number: 166-753-001, Revision B, May 21, 1988.
|
||||
@ -238,35 +238,35 @@ xygetdisklabel(xy, b)
|
||||
xy_labeldata = b;
|
||||
|
||||
/* Required parameter for readdisklabel() */
|
||||
xy->sc_dk.dk_label.d_secsize = XYFM_BPS;
|
||||
xy->sc_dk.dk_label->d_secsize = XYFM_BPS;
|
||||
|
||||
err = readdisklabel(MAKEDISKDEV(0, xy->sc_dev.dv_unit, RAW_PART),
|
||||
xydummystrat,
|
||||
&xy->sc_dk.dk_label, &xy->sc_dk.dk_cpulabel);
|
||||
xy->sc_dk.dk_label, xy->sc_dk.dk_cpulabel);
|
||||
if (err) {
|
||||
printf("%s: %s\n", xy->sc_dev.dv_xname, err);
|
||||
return(XY_ERR_FAIL);
|
||||
}
|
||||
|
||||
/* Ok, we have the label; fill in `pcyl' if there's SunOS magic */
|
||||
sdl = (struct sun_disklabel *)xy->sc_dk.dk_cpulabel.cd_block;
|
||||
sdl = (struct sun_disklabel *)xy->sc_dk.dk_cpulabel->cd_block;
|
||||
if (sdl->sl_magic == SUN_DKMAGIC)
|
||||
xy->pcyl = sdl->sl_pcyl;
|
||||
else {
|
||||
printf("%s: WARNING: no `pcyl' in disk label.\n",
|
||||
xy->sc_dev.dv_xname);
|
||||
xy->pcyl = xy->sc_dk.dk_label.d_ncylinders +
|
||||
xy->sc_dk.dk_label.d_acylinders;
|
||||
xy->pcyl = xy->sc_dk.dk_label->d_ncylinders +
|
||||
xy->sc_dk.dk_label->d_acylinders;
|
||||
printf("%s: WARNING: guessing pcyl=%d (ncyl+acyl)\n",
|
||||
xy->sc_dev.dv_xname, xy->pcyl);
|
||||
}
|
||||
|
||||
xy->ncyl = xy->sc_dk.dk_label.d_ncylinders;
|
||||
xy->acyl = xy->sc_dk.dk_label.d_acylinders;
|
||||
xy->nhead = xy->sc_dk.dk_label.d_ntracks;
|
||||
xy->nsect = xy->sc_dk.dk_label.d_nsectors;
|
||||
xy->ncyl = xy->sc_dk.dk_label->d_ncylinders;
|
||||
xy->acyl = xy->sc_dk.dk_label->d_acylinders;
|
||||
xy->nhead = xy->sc_dk.dk_label->d_ntracks;
|
||||
xy->nsect = xy->sc_dk.dk_label->d_nsectors;
|
||||
xy->sectpercyl = xy->nhead * xy->nsect;
|
||||
xy->sc_dk.dk_label.d_secsize = XYFM_BPS; /* not handled by
|
||||
xy->sc_dk.dk_label->d_secsize = XYFM_BPS; /* not handled by
|
||||
* sun->bsd */
|
||||
return(XY_ERR_AOK);
|
||||
}
|
||||
@ -472,6 +472,14 @@ xyattach(parent, self, aux)
|
||||
struct dkbad *dkb;
|
||||
struct bootpath *bp;
|
||||
|
||||
/*
|
||||
* Always re-initialize the disk structure. We want statistics
|
||||
* to start with a clean slate.
|
||||
*/
|
||||
bzero(&xy->sc_dk, sizeof(xy->sc_dk));
|
||||
xy->sc_dk.dk_driver = &xydkdriver;
|
||||
xy->sc_dk.dk_name = xy->sc_dev.dv_xname;
|
||||
|
||||
/* if booting, init the xy_softc */
|
||||
|
||||
if (xa->booting) {
|
||||
@ -645,11 +653,10 @@ xyattach(parent, self, aux)
|
||||
bcopy(xa->dvmabuf, &xy->dkb, XYFM_BPS);
|
||||
}
|
||||
|
||||
if (xa->booting) {
|
||||
xy->sc_dk.dk_driver = &xydkdriver; /* link in dkdriver */
|
||||
}
|
||||
/* Attach the disk. */
|
||||
disk_attach(&xy->sc_dk);
|
||||
|
||||
dk_establish(&xy->sc_dk, &xy->sc_dev);
|
||||
dk_establish(&xy->sc_dk, &xy->sc_dev); /* XXX */
|
||||
|
||||
done:
|
||||
xy->state = newstate;
|
||||
@ -764,21 +771,21 @@ xyioctl(dev, command, addr, flag, p)
|
||||
return 0;
|
||||
|
||||
case DIOCGDINFO: /* get disk label */
|
||||
bcopy(&xy->sc_dk.dk_label, addr, sizeof(struct disklabel));
|
||||
bcopy(xy->sc_dk.dk_label, addr, sizeof(struct disklabel));
|
||||
return 0;
|
||||
|
||||
case DIOCGPART: /* get partition info */
|
||||
((struct partinfo *) addr)->disklab = &xy->sc_dk.dk_label;
|
||||
((struct partinfo *) addr)->disklab = xy->sc_dk.dk_label;
|
||||
((struct partinfo *) addr)->part =
|
||||
&xy->sc_dk.dk_label.d_partitions[DISKPART(dev)];
|
||||
&xy->sc_dk.dk_label->d_partitions[DISKPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCSDINFO: /* set disk label */
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
error = setdisklabel(&xy->sc_dk.dk_label,
|
||||
error = setdisklabel(xy->sc_dk.dk_label,
|
||||
(struct disklabel *) addr, /* xy->sc_dk.dk_openmask : */ 0,
|
||||
&xy->sc_dk.dk_cpulabel);
|
||||
xy->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (xy->state == XY_DRIVE_NOLABEL)
|
||||
xy->state = XY_DRIVE_ONLINE;
|
||||
@ -797,9 +804,9 @@ xyioctl(dev, command, addr, flag, p)
|
||||
case DIOCWDINFO: /* write disk label */
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
error = setdisklabel(&xy->sc_dk.dk_label,
|
||||
error = setdisklabel(xy->sc_dk.dk_label,
|
||||
(struct disklabel *) addr, /* xy->sc_dk.dk_openmask : */ 0,
|
||||
&xy->sc_dk.dk_cpulabel);
|
||||
xy->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (xy->state == XY_DRIVE_NOLABEL)
|
||||
xy->state = XY_DRIVE_ONLINE;
|
||||
@ -807,8 +814,8 @@ xyioctl(dev, command, addr, flag, p)
|
||||
/* Simulate opening partition 0 so write succeeds. */
|
||||
xy->sc_dk.dk_openmask |= (1 << 0);
|
||||
error = writedisklabel(MAKEDISKDEV(major(dev), DISKUNIT(dev), RAW_PART),
|
||||
xystrategy, &xy->sc_dk.dk_label,
|
||||
&xy->sc_dk.dk_cpulabel);
|
||||
xystrategy, xy->sc_dk.dk_label,
|
||||
xy->sc_dk.dk_cpulabel);
|
||||
xy->sc_dk.dk_openmask =
|
||||
xy->sc_dk.dk_copenmask | xy->sc_dk.dk_bopenmask;
|
||||
}
|
||||
@ -863,8 +870,8 @@ xyopen(dev, flag, fmt)
|
||||
/* check for partition */
|
||||
|
||||
if (part != RAW_PART &&
|
||||
(part >= xy->sc_dk.dk_label.d_npartitions ||
|
||||
xy->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= xy->sc_dk.dk_label->d_npartitions ||
|
||||
xy->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
return (ENXIO);
|
||||
}
|
||||
/* set open masks */
|
||||
@ -922,10 +929,10 @@ xysize(dev)
|
||||
|
||||
xysc = xycd.cd_devs[DISKUNIT(dev)];
|
||||
part = DISKPART(dev);
|
||||
if (xysc->sc_dk.dk_label.d_partitions[part].p_fstype != FS_SWAP)
|
||||
if (xysc->sc_dk.dk_label->d_partitions[part].p_fstype != FS_SWAP)
|
||||
size = -1; /* only give valid size for swap partitions */
|
||||
else
|
||||
size = xysc->sc_dk.dk_label.d_partitions[part].p_size;
|
||||
size = xysc->sc_dk.dk_label->d_partitions[part].p_size;
|
||||
if (xyclose(dev, 0, S_IFBLK) != 0)
|
||||
return -1;
|
||||
return size;
|
||||
@ -952,7 +959,7 @@ xystrategy(bp)
|
||||
|
||||
if (unit >= xycd.cd_ndevs || (xy = xycd.cd_devs[unit]) == 0 ||
|
||||
bp->b_blkno < 0 ||
|
||||
(bp->b_bcount % xy->sc_dk.dk_label.d_secsize) != 0) {
|
||||
(bp->b_bcount % xy->sc_dk.dk_label->d_secsize) != 0) {
|
||||
bp->b_error = EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
@ -985,7 +992,7 @@ xystrategy(bp)
|
||||
* partition. Adjust transfer if needed, and signal errors or early
|
||||
* completion. */
|
||||
|
||||
if (bounds_check_with_label(bp, &xy->sc_dk.dk_label,
|
||||
if (bounds_check_with_label(bp, xy->sc_dk.dk_label,
|
||||
(xy->flags & XY_WLABEL) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -1002,6 +1009,9 @@ xystrategy(bp)
|
||||
|
||||
xyc_start(xy->parent, NULL);
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&xy->sc_dk);
|
||||
|
||||
/* done! */
|
||||
|
||||
splx(s);
|
||||
@ -1257,7 +1267,7 @@ xyc_startbuf(xycsc, xysc, bp)
|
||||
*/
|
||||
|
||||
block = bp->b_blkno + ((partno == RAW_PART) ? 0 :
|
||||
xysc->sc_dk.dk_label.d_partitions[partno].p_offset);
|
||||
xysc->sc_dk.dk_label->d_partitions[partno].p_offset);
|
||||
|
||||
dbuf = dvma_mapin(bp->b_data, bp->b_bcount);
|
||||
if (dbuf == NULL) { /* out of DVMA space */
|
||||
@ -1612,6 +1622,8 @@ xyc_reset(xycsc, quiet, blastmode, error, xysc)
|
||||
iorq->buf->b_bcount);
|
||||
iorq->xy->xyq.b_actf =
|
||||
iorq->buf->b_actf;
|
||||
disk_unbusy(&iorq->xy->sc_dk,
|
||||
(iorq->buf->b_bcount - iorq->buf->b_resid));
|
||||
biodone(iorq->buf);
|
||||
iorq->mode = XY_SUB_FREE;
|
||||
break;
|
||||
@ -1788,6 +1800,8 @@ xyc_remove_iorq(xycsc)
|
||||
iorq->buf->b_bcount);
|
||||
iorq->mode = XY_SUB_FREE;
|
||||
iorq->xy->xyq.b_actf = bp->b_actf;
|
||||
disk_unbusy(&iorq->xy->sc_dk,
|
||||
(bp->b_bcount - bp->b_resid));
|
||||
biodone(bp);
|
||||
break;
|
||||
case XY_SUB_WAIT:
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: xyvar.h,v 1.1 1995/10/30 20:58:23 gwr Exp $ */
|
||||
/* $NetBSD: xyvar.h,v 1.2 1996/01/07 22:03:22 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
*
|
||||
@ -101,7 +101,7 @@ struct xy_iorq {
|
||||
|
||||
struct xy_softc {
|
||||
struct device sc_dev; /* device struct, reqd by autoconf */
|
||||
struct dkdevice sc_dk; /* dkdevice: hook for iostat */
|
||||
struct disk sc_dk; /* generic disk info */
|
||||
struct xyc_softc *parent; /* parent */
|
||||
u_short flags; /* flags */
|
||||
u_short state; /* device state */
|
||||
|
101
sys/dev/ata/wd.c
101
sys/dev/ata/wd.c
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: wd.c,v 1.143 1995/12/24 02:31:59 mycroft Exp $ */
|
||||
/* $NetBSD: wd.c,v 1.144 1996/01/07 22:03:41 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
|
||||
@ -32,8 +32,6 @@
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#define INSTRUMENT /* instrumentation stuff by Brad Parker */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
@ -77,7 +75,7 @@
|
||||
|
||||
struct wd_softc {
|
||||
struct device sc_dev;
|
||||
struct dkdevice sc_dk;
|
||||
struct disk sc_dk;
|
||||
|
||||
/* Information about the current transfer: */
|
||||
daddr_t sc_blkno; /* starting block number */
|
||||
@ -289,6 +287,13 @@ wdattach(parent, self, aux)
|
||||
|
||||
wd->sc_drive = wa->wa_drive;
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
wd->sc_dk.dk_driver = &wddkdriver;
|
||||
wd->sc_dk.dk_name = wd->sc_dev.dv_xname;
|
||||
disk_attach(&wd->sc_dk);
|
||||
|
||||
wd_get_parms(wd);
|
||||
for (blank = 0, p = wd->sc_params.wdp_model, q = buf, i = 0;
|
||||
i < sizeof(wd->sc_params.wdp_model); i++) {
|
||||
@ -337,8 +342,6 @@ wdattach(parent, self, aux)
|
||||
printf(" lba addressing\n");
|
||||
else
|
||||
printf(" chs addressing\n");
|
||||
|
||||
wd->sc_dk.dk_driver = &wddkdriver;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -354,8 +357,8 @@ wdstrategy(bp)
|
||||
|
||||
/* Valid request? */
|
||||
if (bp->b_blkno < 0 ||
|
||||
(bp->b_bcount % wd->sc_dk.dk_label.d_secsize) != 0 ||
|
||||
(bp->b_bcount / wd->sc_dk.dk_label.d_secsize) >= (1 << NBBY)) {
|
||||
(bp->b_bcount % wd->sc_dk.dk_label->d_secsize) != 0 ||
|
||||
(bp->b_bcount / wd->sc_dk.dk_label->d_secsize) >= (1 << NBBY)) {
|
||||
bp->b_error = EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
@ -375,7 +378,7 @@ wdstrategy(bp)
|
||||
* If end of partition, just return.
|
||||
*/
|
||||
if (WDPART(bp->b_dev) != RAW_PART &&
|
||||
bounds_check_with_label(bp, &wd->sc_dk.dk_label,
|
||||
bounds_check_with_label(bp, wd->sc_dk.dk_label,
|
||||
(wd->sc_flags & (WDF_WLABEL|WDF_LABELLING)) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -417,6 +420,9 @@ wdstart(wd)
|
||||
/* Link onto controller queue. */
|
||||
wd->sc_q.b_active = 1;
|
||||
TAILQ_INSERT_TAIL(&wdc->sc_drives, wd, sc_drivechain);
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&wd->sc_dk);
|
||||
|
||||
/* If controller not already active, start it. */
|
||||
if (!active)
|
||||
@ -450,6 +456,9 @@ wdfinish(wd, bp)
|
||||
bp->b_resid = wd->sc_bcount;
|
||||
wd->sc_skip = 0;
|
||||
wd->sc_q.b_actf = bp->b_actf;
|
||||
|
||||
disk_unbusy(&wd->sc_dk, (bp->b_bcount - bp->b_resid));
|
||||
|
||||
biodone(bp);
|
||||
}
|
||||
|
||||
@ -549,7 +558,7 @@ loop:
|
||||
}
|
||||
}
|
||||
|
||||
lp = &wd->sc_dk.dk_label;
|
||||
lp = wd->sc_dk.dk_label;
|
||||
|
||||
/* When starting a transfer... */
|
||||
if (wd->sc_skip == 0) {
|
||||
@ -914,8 +923,8 @@ wdopen(dev, flag, fmt)
|
||||
|
||||
/* Check that the partition exists. */
|
||||
if (part != RAW_PART &&
|
||||
(part >= wd->sc_dk.dk_label.d_npartitions ||
|
||||
wd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= wd->sc_dk.dk_label->d_npartitions ||
|
||||
wd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
error = ENXIO;
|
||||
goto bad;
|
||||
}
|
||||
@ -983,11 +992,11 @@ void
|
||||
wdgetdisklabel(wd)
|
||||
struct wd_softc *wd;
|
||||
{
|
||||
struct disklabel *lp = &wd->sc_dk.dk_label;
|
||||
struct disklabel *lp = wd->sc_dk.dk_label;
|
||||
char *errstring;
|
||||
|
||||
bzero(lp, sizeof(struct disklabel));
|
||||
bzero(&wd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
bzero(wd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
|
||||
lp->d_secsize = DEV_BSIZE;
|
||||
lp->d_ntracks = wd->sc_params.wdp_heads;
|
||||
@ -1020,7 +1029,7 @@ wdgetdisklabel(wd)
|
||||
if (wd->sc_state > RECAL)
|
||||
wd->sc_state = RECAL;
|
||||
errstring = readdisklabel(MAKEWDDEV(0, wd->sc_dev.dv_unit, RAW_PART),
|
||||
wdstrategy, lp, &wd->sc_dk.dk_cpulabel);
|
||||
wdstrategy, lp, wd->sc_dk.dk_cpulabel);
|
||||
if (errstring) {
|
||||
/*
|
||||
* This probably happened because the drive's default
|
||||
@ -1031,7 +1040,7 @@ wdgetdisklabel(wd)
|
||||
if (wd->sc_state > GEOMETRY)
|
||||
wd->sc_state = GEOMETRY;
|
||||
errstring = readdisklabel(MAKEWDDEV(0, wd->sc_dev.dv_unit, RAW_PART),
|
||||
wdstrategy, lp, &wd->sc_dk.dk_cpulabel);
|
||||
wdstrategy, lp, wd->sc_dk.dk_cpulabel);
|
||||
}
|
||||
if (errstring) {
|
||||
printf("%s: %s\n", wd->sc_dev.dv_xname, errstring);
|
||||
@ -1149,8 +1158,8 @@ wdcommand(wd, command, cylin, head, sector, count)
|
||||
return -1;
|
||||
|
||||
/* Load parameters. */
|
||||
if (wd->sc_dk.dk_label.d_type == DTYPE_ST506)
|
||||
outb(iobase+wd_precomp, wd->sc_dk.dk_label.d_precompcyl / 4);
|
||||
if (wd->sc_dk.dk_label->d_type == DTYPE_ST506)
|
||||
outb(iobase+wd_precomp, wd->sc_dk.dk_label->d_precompcyl / 4);
|
||||
else
|
||||
outb(iobase+wd_features, 0);
|
||||
outb(iobase+wd_cyl_lo, cylin);
|
||||
@ -1197,13 +1206,13 @@ wdsetctlr(wd)
|
||||
|
||||
#ifdef WDDEBUG
|
||||
printf("wd(%d,%d) C%dH%dS%d\n", wd->sc_dev.dv_unit, wd->sc_drive,
|
||||
wd->sc_dk.dk_label.d_ncylinders, wd->sc_dk.dk_label.d_ntracks,
|
||||
wd->sc_dk.dk_label.d_nsectors);
|
||||
wd->sc_dk.dk_label->d_ncylinders, wd->sc_dk.dk_label->d_ntracks,
|
||||
wd->sc_dk.dk_label->d_nsectors);
|
||||
#endif
|
||||
|
||||
if (wdcommand(wd, WDCC_IDP, wd->sc_dk.dk_label.d_ncylinders,
|
||||
wd->sc_dk.dk_label.d_ntracks - 1, 0, wd->sc_dk.dk_label.d_nsectors)
|
||||
!= 0) {
|
||||
if (wdcommand(wd, WDCC_IDP, wd->sc_dk.dk_label->d_ncylinders,
|
||||
wd->sc_dk.dk_label->d_ntracks - 1, 0,
|
||||
wd->sc_dk.dk_label->d_nsectors) != 0) {
|
||||
wderror(wd, NULL, "wdsetctlr: geometry upload failed");
|
||||
return -1;
|
||||
}
|
||||
@ -1248,9 +1257,9 @@ wd_get_parms(wd)
|
||||
* This geometry is only used to read the MBR and print a
|
||||
* (false) attach message.
|
||||
*/
|
||||
strncpy(wd->sc_dk.dk_label.d_typename, "ST506",
|
||||
sizeof wd->sc_dk.dk_label.d_typename);
|
||||
wd->sc_dk.dk_label.d_type = DTYPE_ST506;
|
||||
strncpy(wd->sc_dk.dk_label->d_typename, "ST506",
|
||||
sizeof wd->sc_dk.dk_label->d_typename);
|
||||
wd->sc_dk.dk_label->d_type = DTYPE_ST506;
|
||||
|
||||
strncpy(wd->sc_params.wdp_model, "unknown",
|
||||
sizeof wd->sc_params.wdp_model);
|
||||
@ -1262,9 +1271,9 @@ wd_get_parms(wd)
|
||||
wd->sc_params.wdp_usedmovsd = 0;
|
||||
wd->sc_params.wdp_capabilities = 0;
|
||||
} else {
|
||||
strncpy(wd->sc_dk.dk_label.d_typename, "ESDI/IDE",
|
||||
sizeof wd->sc_dk.dk_label.d_typename);
|
||||
wd->sc_dk.dk_label.d_type = DTYPE_ESDI;
|
||||
strncpy(wd->sc_dk.dk_label->d_typename, "ESDI/IDE",
|
||||
sizeof wd->sc_dk.dk_label->d_typename);
|
||||
wd->sc_dk.dk_label->d_type = DTYPE_ESDI;
|
||||
|
||||
/* Read in parameter block. */
|
||||
insw(wdc->sc_iobase+wd_data, tb, sizeof(tb) / sizeof(short));
|
||||
@ -1306,19 +1315,19 @@ wdioctl(dev, cmd, addr, flag, p)
|
||||
case DIOCSBAD:
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
wd->sc_dk.dk_cpulabel.bad = *(struct dkbad *)addr;
|
||||
wd->sc_dk.dk_label.d_flags |= D_BADSECT;
|
||||
wd->sc_dk.dk_cpulabel->bad = *(struct dkbad *)addr;
|
||||
wd->sc_dk.dk_label->d_flags |= D_BADSECT;
|
||||
bad144intern(wd);
|
||||
return 0;
|
||||
|
||||
case DIOCGDINFO:
|
||||
*(struct disklabel *)addr = wd->sc_dk.dk_label;
|
||||
*(struct disklabel *)addr = *(wd->sc_dk.dk_label);
|
||||
return 0;
|
||||
|
||||
case DIOCGPART:
|
||||
((struct partinfo *)addr)->disklab = &wd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->disklab = wd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->part =
|
||||
&wd->sc_dk.dk_label.d_partitions[WDPART(dev)];
|
||||
&wd->sc_dk.dk_label->d_partitions[WDPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCWDINFO:
|
||||
@ -1330,16 +1339,16 @@ wdioctl(dev, cmd, addr, flag, p)
|
||||
return error;
|
||||
wd->sc_flags |= WDF_LABELLING;
|
||||
|
||||
error = setdisklabel(&wd->sc_dk.dk_label,
|
||||
error = setdisklabel(wd->sc_dk.dk_label,
|
||||
(struct disklabel *)addr, /*wd->sc_dk.dk_openmask : */0,
|
||||
&wd->sc_dk.dk_cpulabel);
|
||||
wd->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (wd->sc_state > GEOMETRY)
|
||||
wd->sc_state = GEOMETRY;
|
||||
if (cmd == DIOCWDINFO)
|
||||
error = writedisklabel(WDLABELDEV(dev),
|
||||
wdstrategy, &wd->sc_dk.dk_label,
|
||||
&wd->sc_dk.dk_cpulabel);
|
||||
wdstrategy, wd->sc_dk.dk_label,
|
||||
wd->sc_dk.dk_cpulabel);
|
||||
}
|
||||
|
||||
wd->sc_flags &= ~WDF_LABELLING;
|
||||
@ -1372,7 +1381,7 @@ wdioctl(dev, cmd, addr, flag, p)
|
||||
auio.uio_resid = fop->df_count;
|
||||
auio.uio_segflg = 0;
|
||||
auio.uio_offset =
|
||||
fop->df_startblk * wd->sc_dk.dk_label.d_secsize;
|
||||
fop->df_startblk * wd->sc_dk.dk_label->d_secsize;
|
||||
auio.uio_procp = p;
|
||||
error = physio(wdformat, NULL, dev, B_WRITE, minphys,
|
||||
&auio);
|
||||
@ -1382,7 +1391,7 @@ wdioctl(dev, cmd, addr, flag, p)
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
default:
|
||||
return ENOTTY;
|
||||
}
|
||||
@ -1414,10 +1423,10 @@ wdsize(dev)
|
||||
return -1;
|
||||
wd = wdcd.cd_devs[WDUNIT(dev)];
|
||||
part = WDPART(dev);
|
||||
if (wd->sc_dk.dk_label.d_partitions[part].p_fstype != FS_SWAP)
|
||||
if (wd->sc_dk.dk_label->d_partitions[part].p_fstype != FS_SWAP)
|
||||
size = -1;
|
||||
else
|
||||
size = wd->sc_dk.dk_label.d_partitions[part].p_size;
|
||||
size = wd->sc_dk.dk_label->d_partitions[part].p_size;
|
||||
if (wdclose(dev, 0, S_IFBLK) != 0)
|
||||
return -1;
|
||||
return size;
|
||||
@ -1466,7 +1475,7 @@ wddump(dev, blkno, va, size)
|
||||
wdc = (void *)wd->sc_dev.dv_parent;
|
||||
|
||||
/* Convert to disk sectors. Request must be a multiple of size. */
|
||||
lp = &wd->sc_dk.dk_label;
|
||||
lp = wd->sc_dk.dk_label;
|
||||
if ((size % lp->d_secsize) != 0)
|
||||
return EFAULT;
|
||||
nblks = size / lp->d_secsize;
|
||||
@ -1578,8 +1587,8 @@ void
|
||||
bad144intern(wd)
|
||||
struct wd_softc *wd;
|
||||
{
|
||||
struct dkbad *bt = &wd->sc_dk.dk_cpulabel.bad;
|
||||
struct disklabel *lp = &wd->sc_dk.dk_label;
|
||||
struct dkbad *bt = &wd->sc_dk.dk_cpulabel->bad;
|
||||
struct disklabel *lp = wd->sc_dk.dk_label;
|
||||
int i = 0;
|
||||
|
||||
for (; i < 126; i++) {
|
||||
@ -1719,7 +1728,7 @@ wderror(dev, bp, msg)
|
||||
|
||||
if (bp) {
|
||||
diskerr(bp, "wd", msg, LOG_PRINTF, wd->sc_skip / DEV_BSIZE,
|
||||
&wd->sc_dk.dk_label);
|
||||
wd->sc_dk.dk_label);
|
||||
printf("\n");
|
||||
} else
|
||||
printf("%s: %s: status %b error %b\n", wdc->sc_dev.dv_xname,
|
||||
|
141
sys/dev/ccd.c
141
sys/dev/ccd.c
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: ccd.c,v 1.22 1995/12/08 19:13:26 thorpej Exp $ */
|
||||
/* $NetBSD: ccd.c,v 1.23 1996/01/07 22:03:28 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Jason R. Thorpe.
|
||||
@ -89,7 +89,6 @@
|
||||
#include <sys/systm.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/dkstat.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/namei.h>
|
||||
@ -202,10 +201,6 @@ ccdattach(num)
|
||||
numccd = num;
|
||||
bzero(ccd_softc, num * sizeof(struct ccd_softc));
|
||||
bzero(ccddevs, num * sizeof(struct ccddevice));
|
||||
|
||||
/* XXX: is this necessary? */
|
||||
for (i = 0; i < numccd; ++i)
|
||||
ccddevs[i].ccd_dk = -1;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -232,12 +227,10 @@ ccdinit(ccd, cpaths, p)
|
||||
printf("ccdinit: unit %d\n", ccd->ccd_unit);
|
||||
#endif
|
||||
|
||||
#ifdef WORKING_DISK_STATISTICS /* XXX !! */
|
||||
cs->sc_dk = ccd->ccd_dk;
|
||||
#endif
|
||||
cs->sc_size = 0;
|
||||
cs->sc_ileave = ccd->ccd_interleave;
|
||||
cs->sc_nccdisks = ccd->ccd_ndev;
|
||||
sprintf(cs->sc_xname, "ccd%d", ccd->ccd_unit); /* XXX */
|
||||
|
||||
/* Allocate space for the component info. */
|
||||
cs->sc_cinfo = malloc(cs->sc_nccdisks * sizeof(struct ccdcinfo),
|
||||
@ -262,8 +255,8 @@ ccdinit(ccd, cpaths, p)
|
||||
MAXPATHLEN, &ci->ci_pathlen)) {
|
||||
#ifdef DEBUG
|
||||
if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
|
||||
printf("ccd%d: can't copy path, error = %d\n",
|
||||
ccd->ccd_unit, error);
|
||||
printf("%s: can't copy path, error = %d\n",
|
||||
cs->sc_xname, error);
|
||||
#endif
|
||||
free(cs->sc_cinfo, M_DEVBUF);
|
||||
return (error);
|
||||
@ -277,8 +270,8 @@ ccdinit(ccd, cpaths, p)
|
||||
if (error = VOP_GETATTR(vp, &va, p->p_ucred, p)) {
|
||||
#ifdef DEBUG
|
||||
if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
|
||||
printf("ccd%d: %s: getattr failed %s = %d\n",
|
||||
ccd->ccd_unit, ci->ci_path,
|
||||
printf("%s: %s: getattr failed %s = %d\n",
|
||||
cs->sc_xname, ci->ci_path,
|
||||
"error", error);
|
||||
#endif
|
||||
free(ci->ci_path, M_DEVBUF);
|
||||
@ -294,8 +287,8 @@ ccdinit(ccd, cpaths, p)
|
||||
FREAD, p->p_ucred, p)) {
|
||||
#ifdef DEBUG
|
||||
if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
|
||||
printf("ccd%d: %s: ioctl failed, error = %d\n",
|
||||
ccd->ccd_unit, ci->ci_path, error);
|
||||
printf("%s: %s: ioctl failed, error = %d\n",
|
||||
cs->sc_xname, ci->ci_path, error);
|
||||
#endif
|
||||
free(ci->ci_path, M_DEVBUF);
|
||||
free(cs->sc_cinfo, M_DEVBUF);
|
||||
@ -309,8 +302,8 @@ ccdinit(ccd, cpaths, p)
|
||||
} else {
|
||||
#ifdef DEBUG
|
||||
if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
|
||||
printf("ccd%d: %s: incorrect partition type\n",
|
||||
ccd->ccd_unit, ci->ci_path);
|
||||
printf("%s: %s: incorrect partition type\n",
|
||||
cs->sc_xname, ci->ci_path);
|
||||
#endif
|
||||
free(ci->ci_path, M_DEVBUF);
|
||||
free(cs->sc_cinfo, M_DEVBUF);
|
||||
@ -330,8 +323,8 @@ ccdinit(ccd, cpaths, p)
|
||||
if (size == 0) {
|
||||
#ifdef DEBUG
|
||||
if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
|
||||
printf("ccd%d: %s: size == 0\n",
|
||||
ccd->ccd_unit, ci->ci_path);
|
||||
printf("%s: %s: size == 0\n",
|
||||
cs->sc_xname, ci->ci_path);
|
||||
#endif
|
||||
free(ci->ci_path, M_DEVBUF);
|
||||
free(cs->sc_cinfo, M_DEVBUF);
|
||||
@ -352,8 +345,8 @@ ccdinit(ccd, cpaths, p)
|
||||
(cs->sc_ileave < (maxsecsize / DEV_BSIZE))) {
|
||||
#ifdef DEBUG
|
||||
if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
|
||||
printf("ccd%d: interleave must be at least %d\n",
|
||||
ccd->ccd_unit, (maxsecsize / DEV_BSIZE));
|
||||
printf("%s: interleave must be at least %d\n",
|
||||
cs->sc_xname, (maxsecsize / DEV_BSIZE));
|
||||
#endif
|
||||
free(ci->ci_path, M_DEVBUF);
|
||||
free(cs->sc_cinfo, M_DEVBUF);
|
||||
@ -385,14 +378,10 @@ ccdinit(ccd, cpaths, p)
|
||||
ccg->ccg_nsectors = 1024 * (1024 / ccg->ccg_secsize);
|
||||
ccg->ccg_ncylinders = cs->sc_size / ccg->ccg_nsectors;
|
||||
|
||||
#ifdef WORKING_DISK_STATISTICS /* XXX !! */
|
||||
if (ccd->ccd_dk >= 0)
|
||||
dk_wpms[ccd->ccd_dk] = 32 * (60 * DEV_BSIZE / 2); /* XXX */
|
||||
#endif
|
||||
|
||||
cs->sc_flags |= CCDF_INITED;
|
||||
cs->sc_cflags = ccd->ccd_flags; /* So we can find out later... */
|
||||
cs->sc_unit = ccd->ccd_unit;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -523,7 +512,7 @@ ccdopen(dev, flags, fmt, p)
|
||||
if (error = ccdlock(cs))
|
||||
return (error);
|
||||
|
||||
lp = &cs->sc_dkdev.dk_label;
|
||||
lp = cs->sc_dkdev.dk_label;
|
||||
|
||||
part = DISKPART(dev);
|
||||
pmask = (1 << part);
|
||||
@ -628,7 +617,7 @@ ccdstrategy(bp)
|
||||
if (bp->b_bcount == 0)
|
||||
goto done;
|
||||
|
||||
lp = &cs->sc_dkdev.dk_label;
|
||||
lp = cs->sc_dkdev.dk_label;
|
||||
|
||||
/*
|
||||
* Do bounds checking and adjust transfer. If there's an
|
||||
@ -668,24 +657,15 @@ ccdstart(cs, bp)
|
||||
printf("ccdstart(%x, %x)\n", cs, bp);
|
||||
#endif
|
||||
|
||||
#ifdef WORKING_DISK_STATISTICS /* XXX !! */
|
||||
/*
|
||||
* Instrumentation (not very meaningful)
|
||||
*/
|
||||
cs->sc_nactive++;
|
||||
if (cs->sc_dk >= 0) {
|
||||
dk_busy |= 1 << cs->sc_dk;
|
||||
dk_xfer[cs->sc_dk]++;
|
||||
dk_wds[cs->sc_dk] += bp->b_bcount >> 6;
|
||||
}
|
||||
#endif
|
||||
/* Instrumentation. */
|
||||
disk_busy(&cs->sc_dkdev);
|
||||
|
||||
/*
|
||||
* Translate the partition-relative block number to an absolute.
|
||||
*/
|
||||
bn = bp->b_blkno;
|
||||
if (DISKPART(bp->b_dev) != RAW_PART) {
|
||||
pp = &cs->sc_dkdev.dk_label.d_partitions[DISKPART(bp->b_dev)];
|
||||
pp = &cs->sc_dkdev.dk_label->d_partitions[DISKPART(bp->b_dev)];
|
||||
bn += pp->p_offset;
|
||||
}
|
||||
|
||||
@ -813,18 +793,9 @@ ccdintr(cs, bp)
|
||||
/*
|
||||
* Request is done for better or worse, wakeup the top half.
|
||||
*/
|
||||
#ifdef WORKING_DISK_STATISTICS /* XXX !! */
|
||||
--cs->sc_nactive;
|
||||
#ifdef DIAGNOSTIC
|
||||
if (cs->sc_nactive < 0)
|
||||
panic("ccdintr: ccd%d: sc_nactive < 0", cs->sc_unit);
|
||||
#endif
|
||||
|
||||
if (cs->sc_nactive == 0 && cs->sc_dk >= 0)
|
||||
dk_busy &= ~(1 << cs->sc_dk);
|
||||
#endif
|
||||
if (bp->b_flags & B_ERROR)
|
||||
bp->b_resid = bp->b_bcount;
|
||||
disk_unbusy(&cs->sc_dkdev, (bp->b_bcount - bp->b_resid));
|
||||
biodone(bp);
|
||||
}
|
||||
|
||||
@ -839,6 +810,7 @@ ccdiodone(cbp)
|
||||
{
|
||||
register struct buf *bp = cbp->cb_obp;
|
||||
register int unit = cbp->cb_unit;
|
||||
struct ccd_softc *cs = &ccd_softc[unit];
|
||||
int count, s;
|
||||
|
||||
s = splbio();
|
||||
@ -859,8 +831,8 @@ ccdiodone(cbp)
|
||||
bp->b_flags |= B_ERROR;
|
||||
bp->b_error = cbp->cb_buf.b_error ? cbp->cb_buf.b_error : EIO;
|
||||
#ifdef DEBUG
|
||||
printf("ccd%d: error %d on component %d\n",
|
||||
unit, bp->b_error, cbp->cb_comp);
|
||||
printf("%s: error %d on component %d\n",
|
||||
cs->sc_xname, bp->b_error, cbp->cb_comp);
|
||||
#endif
|
||||
}
|
||||
count = cbp->cb_buf.b_bcount;
|
||||
@ -951,9 +923,6 @@ ccdioctl(dev, cmd, data, flag, p)
|
||||
struct ccddevice ccd;
|
||||
char **cpp;
|
||||
struct vnode **vpp;
|
||||
#ifdef WORKING_DISK_STATISTICS /* XXX !! */
|
||||
extern int dkn;
|
||||
#endif
|
||||
|
||||
if (unit >= numccd)
|
||||
return (ENXIO);
|
||||
@ -1022,27 +991,10 @@ ccdioctl(dev, cmd, data, flag, p)
|
||||
ccd.ccd_vpp = vpp;
|
||||
ccd.ccd_ndev = ccio->ccio_ndisks;
|
||||
|
||||
#ifdef WORKING_DISK_STATISTICS /* XXX !! */
|
||||
/*
|
||||
* Assign disk index first so that init routine
|
||||
* can use it (saves having the driver drag around
|
||||
* the ccddevice pointer just to set up the dk_*
|
||||
* info in the open routine).
|
||||
*/
|
||||
if (dkn < DK_NDRIVE)
|
||||
ccd.ccd_dk = dkn++;
|
||||
else
|
||||
ccd.ccd_dk = -1;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initialize the ccd. Fills in the softc for us.
|
||||
*/
|
||||
if (error = ccdinit(&ccd, cpp, p)) {
|
||||
#ifdef WORKING_DISK_STATISTICS /* XXX !! */
|
||||
if (ccd.ccd_dk >= 0)
|
||||
--dkn;
|
||||
#endif
|
||||
for (j = 0; j < lookedup; ++j)
|
||||
(void)vn_close(vpp[j], FREAD|FWRITE,
|
||||
p->p_ucred, p);
|
||||
@ -1055,11 +1007,20 @@ ccdioctl(dev, cmd, data, flag, p)
|
||||
|
||||
/*
|
||||
* The ccd has been successfully initialized, so
|
||||
* we can place it into the array and read the disklabel.
|
||||
* we can place it into the array. Don't try to
|
||||
* read the disklabel until the disk has been attached,
|
||||
* because space for the disklabel is allocated
|
||||
* in disk_attach();
|
||||
*/
|
||||
bcopy(&ccd, &ccddevs[unit], sizeof(ccd));
|
||||
ccio->ccio_unit = unit;
|
||||
ccio->ccio_size = cs->sc_size;
|
||||
|
||||
/* Attach the disk. */
|
||||
cs->sc_dkdev.dk_name = cs->sc_xname;
|
||||
disk_attach(&cs->sc_dkdev);
|
||||
|
||||
/* Try and read the disklabel. */
|
||||
ccdgetdisklabel(dev);
|
||||
|
||||
ccdunlock(cs);
|
||||
@ -1125,9 +1086,11 @@ ccdioctl(dev, cmd, data, flag, p)
|
||||
*/
|
||||
free(ccddevs[unit].ccd_cpp, M_DEVBUF);
|
||||
free(ccddevs[unit].ccd_vpp, M_DEVBUF);
|
||||
ccd.ccd_dk = -1;
|
||||
bcopy(&ccd, &ccddevs[unit], sizeof(ccd));
|
||||
|
||||
/* Detatch the disk. */
|
||||
disk_detatch(&cs->sc_dkdev);
|
||||
|
||||
/* This must be atomic. */
|
||||
s = splhigh();
|
||||
ccdunlock(cs);
|
||||
@ -1140,16 +1103,16 @@ ccdioctl(dev, cmd, data, flag, p)
|
||||
if ((cs->sc_flags & CCDF_INITED) == 0)
|
||||
return (ENXIO);
|
||||
|
||||
*(struct disklabel *)data = cs->sc_dkdev.dk_label;
|
||||
*(struct disklabel *)data = *(cs->sc_dkdev.dk_label);
|
||||
break;
|
||||
|
||||
case DIOCGPART:
|
||||
if ((cs->sc_flags & CCDF_INITED) == 0)
|
||||
return (ENXIO);
|
||||
|
||||
((struct partinfo *)data)->disklab = &cs->sc_dkdev.dk_label;
|
||||
((struct partinfo *)data)->disklab = cs->sc_dkdev.dk_label;
|
||||
((struct partinfo *)data)->part =
|
||||
&cs->sc_dkdev.dk_label.d_partitions[DISKPART(dev)];
|
||||
&cs->sc_dkdev.dk_label->d_partitions[DISKPART(dev)];
|
||||
break;
|
||||
|
||||
case DIOCWDINFO:
|
||||
@ -1165,13 +1128,13 @@ ccdioctl(dev, cmd, data, flag, p)
|
||||
|
||||
cs->sc_flags |= CCDF_LABELLING;
|
||||
|
||||
error = setdisklabel(&cs->sc_dkdev.dk_label,
|
||||
(struct disklabel *)data, 0, &cs->sc_dkdev.dk_cpulabel);
|
||||
error = setdisklabel(cs->sc_dkdev.dk_label,
|
||||
(struct disklabel *)data, 0, cs->sc_dkdev.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (cmd == DIOCWDINFO)
|
||||
error = writedisklabel(CCDLABELDEV(dev),
|
||||
ccdstrategy, &cs->sc_dkdev.dk_label,
|
||||
&cs->sc_dkdev.dk_cpulabel);
|
||||
ccdstrategy, cs->sc_dkdev.dk_label,
|
||||
cs->sc_dkdev.dk_cpulabel);
|
||||
}
|
||||
|
||||
cs->sc_flags &= ~CCDF_LABELLING;
|
||||
@ -1217,10 +1180,10 @@ ccdsize(dev)
|
||||
if ((cs->sc_flags & CCDF_INITED) == 0)
|
||||
return (-1);
|
||||
|
||||
if (cs->sc_dkdev.dk_label.d_partitions[part].p_fstype != FS_SWAP)
|
||||
if (cs->sc_dkdev.dk_label->d_partitions[part].p_fstype != FS_SWAP)
|
||||
size = -1;
|
||||
else
|
||||
size = cs->sc_dkdev.dk_label.d_partitions[part].p_size;
|
||||
size = cs->sc_dkdev.dk_label->d_partitions[part].p_size;
|
||||
|
||||
if (ccdclose(dev, 0, S_IFBLK, curproc))
|
||||
return (-1);
|
||||
@ -1310,8 +1273,8 @@ ccdgetdisklabel(dev)
|
||||
int unit = ccdunit(dev);
|
||||
struct ccd_softc *cs = &ccd_softc[unit];
|
||||
char *errstring;
|
||||
struct disklabel *lp = &cs->sc_dkdev.dk_label;
|
||||
struct cpu_disklabel *clp = &cs->sc_dkdev.dk_cpulabel;
|
||||
struct disklabel *lp = cs->sc_dkdev.dk_label;
|
||||
struct cpu_disklabel *clp = cs->sc_dkdev.dk_cpulabel;
|
||||
struct ccdgeom *ccg = &cs->sc_geom;
|
||||
|
||||
bzero(lp, sizeof(*lp));
|
||||
@ -1338,20 +1301,20 @@ ccdgetdisklabel(dev)
|
||||
|
||||
lp->d_magic = DISKMAGIC;
|
||||
lp->d_magic2 = DISKMAGIC;
|
||||
lp->d_checksum = dkcksum(&cs->sc_dkdev.dk_label);
|
||||
lp->d_checksum = dkcksum(cs->sc_dkdev.dk_label);
|
||||
|
||||
/*
|
||||
* Call the generic disklabel extraction routine.
|
||||
*/
|
||||
if (errstring = readdisklabel(CCDLABELDEV(dev), ccdstrategy,
|
||||
&cs->sc_dkdev.dk_label, &cs->sc_dkdev.dk_cpulabel))
|
||||
cs->sc_dkdev.dk_label, cs->sc_dkdev.dk_cpulabel))
|
||||
ccdmakedisklabel(cs);
|
||||
|
||||
#ifdef DEBUG
|
||||
/* It's actually extremely common to have unlabeled ccds. */
|
||||
if (ccddebug & CCDB_LABEL)
|
||||
if (errstring != NULL)
|
||||
printf("ccd%d: %s\n", unit, errstring);
|
||||
printf("%s: %s\n", cs->sc_xname, errstring);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1363,7 +1326,7 @@ static void
|
||||
ccdmakedisklabel(cs)
|
||||
struct ccd_softc *cs;
|
||||
{
|
||||
struct disklabel *lp = &cs->sc_dkdev.dk_label;
|
||||
struct disklabel *lp = cs->sc_dkdev.dk_label;
|
||||
|
||||
/*
|
||||
* For historical reasons, if there's no disklabel present
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: ccdvar.h,v 1.8 1995/10/12 21:28:35 thorpej Exp $ */
|
||||
/* $NetBSD: ccdvar.h,v 1.9 1996/01/07 22:03:30 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Jason R. Thorpe.
|
||||
@ -90,7 +90,6 @@ struct ccddevice {
|
||||
int ccd_unit; /* logical unit of this ccd */
|
||||
int ccd_interleave; /* interleave (DEV_BSIZE blocks) */
|
||||
int ccd_flags; /* misc. information */
|
||||
int ccd_dk; /* disk number */
|
||||
struct vnode **ccd_vpp; /* array of component vnodes */
|
||||
char **ccd_cpp; /* array of component pathnames */
|
||||
int ccd_ndev; /* number of component devices */
|
||||
@ -182,10 +181,9 @@ struct ccd_softc {
|
||||
int sc_nccdisks; /* number of components */
|
||||
struct ccdcinfo *sc_cinfo; /* component info */
|
||||
struct ccdiinfo *sc_itable; /* interleave table */
|
||||
int sc_nactive; /* number of requests active */
|
||||
int sc_dk; /* disk index */
|
||||
struct ccdgeom sc_geom; /* pseudo geometry info */
|
||||
struct dkdevice sc_dkdev; /* generic disk device info */
|
||||
char sc_xname[8]; /* XXX external name */
|
||||
struct disk sc_dkdev; /* generic disk device info */
|
||||
};
|
||||
|
||||
/* sc_flags */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: mcd.c,v 1.43 1995/12/24 02:31:42 mycroft Exp $ */
|
||||
/* $NetBSD: mcd.c,v 1.44 1996/01/07 22:03:37 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993, 1994, 1995 Charles M. Hannum. All rights reserved.
|
||||
@ -107,7 +107,7 @@ struct mcd_mbx {
|
||||
|
||||
struct mcd_softc {
|
||||
struct device sc_dev;
|
||||
struct dkdevice sc_dk;
|
||||
struct disk sc_dk;
|
||||
void *sc_ih;
|
||||
|
||||
int iobase;
|
||||
@ -207,6 +207,13 @@ mcdattach(parent, self, aux)
|
||||
struct isa_attach_args *ia = aux;
|
||||
struct mcd_mbox mbx;
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
sc->sc_dk.dk_driver = &mcddkdriver;
|
||||
sc->sc_dk.dk_name = sc->sc_dev.dv_xname;
|
||||
disk_attach(&sc->sc_dk);
|
||||
|
||||
printf(": model %s\n", sc->type != 0 ? sc->type : "unknown");
|
||||
|
||||
(void) mcd_setlock(sc, MCD_LK_UNLOCK);
|
||||
@ -220,8 +227,6 @@ mcdattach(parent, self, aux)
|
||||
|
||||
mcd_soft_reset(sc);
|
||||
|
||||
sc->sc_dk.dk_driver = &mcddkdriver;
|
||||
|
||||
sc->sc_ih = isa_intr_establish(ia->ia_irq, IST_EDGE, IPL_BIO, mcdintr,
|
||||
sc);
|
||||
}
|
||||
@ -332,8 +337,8 @@ mcdopen(dev, flag, fmt, p)
|
||||
|
||||
/* Check that the partition exists. */
|
||||
if (part != RAW_PART &&
|
||||
(part >= sc->sc_dk.dk_label.d_npartitions ||
|
||||
sc->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= sc->sc_dk.dk_label->d_npartitions ||
|
||||
sc->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
error = ENXIO;
|
||||
goto bad;
|
||||
}
|
||||
@ -439,7 +444,7 @@ mcdstrategy(bp)
|
||||
* If end of partition, just return.
|
||||
*/
|
||||
if (MCDPART(bp->b_dev) != RAW_PART &&
|
||||
bounds_check_with_label(bp, &sc->sc_dk.dk_label,
|
||||
bounds_check_with_label(bp, sc->sc_dk.dk_label,
|
||||
(sc->flags & (MCDF_WLABEL|MCDF_LABELLING)) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -492,12 +497,17 @@ loop:
|
||||
|
||||
dp->b_active = 1;
|
||||
|
||||
/* Instrumentation. */
|
||||
s = splbio();
|
||||
disk_busy(&sc->sc_dk);
|
||||
splx(s);
|
||||
|
||||
sc->mbx.retry = MCD_RDRETRIES;
|
||||
sc->mbx.bp = bp;
|
||||
sc->mbx.blkno = bp->b_blkno / (sc->blksize / DEV_BSIZE);
|
||||
if (MCDPART(bp->b_dev) != RAW_PART) {
|
||||
struct partition *p;
|
||||
p = &sc->sc_dk.dk_label.d_partitions[MCDPART(bp->b_dev)];
|
||||
p = &sc->sc_dk.dk_label->d_partitions[MCDPART(bp->b_dev)];
|
||||
sc->mbx.blkno += p->p_offset;
|
||||
}
|
||||
sc->mbx.nblk = bp->b_bcount / sc->blksize;
|
||||
@ -547,13 +557,13 @@ mcdioctl(dev, cmd, addr, flag, p)
|
||||
|
||||
switch (cmd) {
|
||||
case DIOCGDINFO:
|
||||
*(struct disklabel *)addr = sc->sc_dk.dk_label;
|
||||
*(struct disklabel *)addr = *(sc->sc_dk.dk_label);
|
||||
return 0;
|
||||
|
||||
case DIOCGPART:
|
||||
((struct partinfo *)addr)->disklab = &sc->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->disklab = sc->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->part =
|
||||
&sc->sc_dk.dk_label.d_partitions[MCDPART(dev)];
|
||||
&sc->sc_dk.dk_label->d_partitions[MCDPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCWDINFO:
|
||||
@ -565,9 +575,9 @@ mcdioctl(dev, cmd, addr, flag, p)
|
||||
return error;
|
||||
sc->flags |= MCDF_LABELLING;
|
||||
|
||||
error = setdisklabel(&sc->sc_dk.dk_label,
|
||||
error = setdisklabel(sc->sc_dk.dk_label,
|
||||
(struct disklabel *)addr, /*sc->sc_dk.dk_openmask : */0,
|
||||
&sc->sc_dk.dk_cpulabel);
|
||||
sc->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
}
|
||||
|
||||
@ -639,10 +649,10 @@ void
|
||||
mcdgetdisklabel(sc)
|
||||
struct mcd_softc *sc;
|
||||
{
|
||||
struct disklabel *lp = &sc->sc_dk.dk_label;
|
||||
struct disklabel *lp = sc->sc_dk.dk_label;
|
||||
|
||||
bzero(lp, sizeof(struct disklabel));
|
||||
bzero(&sc->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
bzero(sc->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
|
||||
lp->d_secsize = sc->blksize;
|
||||
lp->d_ntracks = 1;
|
||||
@ -1111,6 +1121,7 @@ mcdintr(arg)
|
||||
|
||||
/* Return buffer. */
|
||||
bp->b_resid = 0;
|
||||
disk_unbusy(&sc->sc_dk, bp->b_bcount);
|
||||
biodone(bp);
|
||||
|
||||
mcdstart(sc);
|
||||
@ -1143,6 +1154,7 @@ harderr:
|
||||
/* Invalidate the buffer. */
|
||||
bp->b_flags |= B_ERROR;
|
||||
bp->b_resid = bp->b_bcount - mbx->skip;
|
||||
disk_unbusy(&sc->sc_dk, (bp->b_bcount - bp->b_resid));
|
||||
biodone(bp);
|
||||
|
||||
mcdstart(sc);
|
||||
|
101
sys/dev/isa/wd.c
101
sys/dev/isa/wd.c
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: wd.c,v 1.143 1995/12/24 02:31:59 mycroft Exp $ */
|
||||
/* $NetBSD: wd.c,v 1.144 1996/01/07 22:03:41 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
|
||||
@ -32,8 +32,6 @@
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#define INSTRUMENT /* instrumentation stuff by Brad Parker */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
@ -77,7 +75,7 @@
|
||||
|
||||
struct wd_softc {
|
||||
struct device sc_dev;
|
||||
struct dkdevice sc_dk;
|
||||
struct disk sc_dk;
|
||||
|
||||
/* Information about the current transfer: */
|
||||
daddr_t sc_blkno; /* starting block number */
|
||||
@ -289,6 +287,13 @@ wdattach(parent, self, aux)
|
||||
|
||||
wd->sc_drive = wa->wa_drive;
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
wd->sc_dk.dk_driver = &wddkdriver;
|
||||
wd->sc_dk.dk_name = wd->sc_dev.dv_xname;
|
||||
disk_attach(&wd->sc_dk);
|
||||
|
||||
wd_get_parms(wd);
|
||||
for (blank = 0, p = wd->sc_params.wdp_model, q = buf, i = 0;
|
||||
i < sizeof(wd->sc_params.wdp_model); i++) {
|
||||
@ -337,8 +342,6 @@ wdattach(parent, self, aux)
|
||||
printf(" lba addressing\n");
|
||||
else
|
||||
printf(" chs addressing\n");
|
||||
|
||||
wd->sc_dk.dk_driver = &wddkdriver;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -354,8 +357,8 @@ wdstrategy(bp)
|
||||
|
||||
/* Valid request? */
|
||||
if (bp->b_blkno < 0 ||
|
||||
(bp->b_bcount % wd->sc_dk.dk_label.d_secsize) != 0 ||
|
||||
(bp->b_bcount / wd->sc_dk.dk_label.d_secsize) >= (1 << NBBY)) {
|
||||
(bp->b_bcount % wd->sc_dk.dk_label->d_secsize) != 0 ||
|
||||
(bp->b_bcount / wd->sc_dk.dk_label->d_secsize) >= (1 << NBBY)) {
|
||||
bp->b_error = EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
@ -375,7 +378,7 @@ wdstrategy(bp)
|
||||
* If end of partition, just return.
|
||||
*/
|
||||
if (WDPART(bp->b_dev) != RAW_PART &&
|
||||
bounds_check_with_label(bp, &wd->sc_dk.dk_label,
|
||||
bounds_check_with_label(bp, wd->sc_dk.dk_label,
|
||||
(wd->sc_flags & (WDF_WLABEL|WDF_LABELLING)) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -417,6 +420,9 @@ wdstart(wd)
|
||||
/* Link onto controller queue. */
|
||||
wd->sc_q.b_active = 1;
|
||||
TAILQ_INSERT_TAIL(&wdc->sc_drives, wd, sc_drivechain);
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&wd->sc_dk);
|
||||
|
||||
/* If controller not already active, start it. */
|
||||
if (!active)
|
||||
@ -450,6 +456,9 @@ wdfinish(wd, bp)
|
||||
bp->b_resid = wd->sc_bcount;
|
||||
wd->sc_skip = 0;
|
||||
wd->sc_q.b_actf = bp->b_actf;
|
||||
|
||||
disk_unbusy(&wd->sc_dk, (bp->b_bcount - bp->b_resid));
|
||||
|
||||
biodone(bp);
|
||||
}
|
||||
|
||||
@ -549,7 +558,7 @@ loop:
|
||||
}
|
||||
}
|
||||
|
||||
lp = &wd->sc_dk.dk_label;
|
||||
lp = wd->sc_dk.dk_label;
|
||||
|
||||
/* When starting a transfer... */
|
||||
if (wd->sc_skip == 0) {
|
||||
@ -914,8 +923,8 @@ wdopen(dev, flag, fmt)
|
||||
|
||||
/* Check that the partition exists. */
|
||||
if (part != RAW_PART &&
|
||||
(part >= wd->sc_dk.dk_label.d_npartitions ||
|
||||
wd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= wd->sc_dk.dk_label->d_npartitions ||
|
||||
wd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
error = ENXIO;
|
||||
goto bad;
|
||||
}
|
||||
@ -983,11 +992,11 @@ void
|
||||
wdgetdisklabel(wd)
|
||||
struct wd_softc *wd;
|
||||
{
|
||||
struct disklabel *lp = &wd->sc_dk.dk_label;
|
||||
struct disklabel *lp = wd->sc_dk.dk_label;
|
||||
char *errstring;
|
||||
|
||||
bzero(lp, sizeof(struct disklabel));
|
||||
bzero(&wd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
bzero(wd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
|
||||
lp->d_secsize = DEV_BSIZE;
|
||||
lp->d_ntracks = wd->sc_params.wdp_heads;
|
||||
@ -1020,7 +1029,7 @@ wdgetdisklabel(wd)
|
||||
if (wd->sc_state > RECAL)
|
||||
wd->sc_state = RECAL;
|
||||
errstring = readdisklabel(MAKEWDDEV(0, wd->sc_dev.dv_unit, RAW_PART),
|
||||
wdstrategy, lp, &wd->sc_dk.dk_cpulabel);
|
||||
wdstrategy, lp, wd->sc_dk.dk_cpulabel);
|
||||
if (errstring) {
|
||||
/*
|
||||
* This probably happened because the drive's default
|
||||
@ -1031,7 +1040,7 @@ wdgetdisklabel(wd)
|
||||
if (wd->sc_state > GEOMETRY)
|
||||
wd->sc_state = GEOMETRY;
|
||||
errstring = readdisklabel(MAKEWDDEV(0, wd->sc_dev.dv_unit, RAW_PART),
|
||||
wdstrategy, lp, &wd->sc_dk.dk_cpulabel);
|
||||
wdstrategy, lp, wd->sc_dk.dk_cpulabel);
|
||||
}
|
||||
if (errstring) {
|
||||
printf("%s: %s\n", wd->sc_dev.dv_xname, errstring);
|
||||
@ -1149,8 +1158,8 @@ wdcommand(wd, command, cylin, head, sector, count)
|
||||
return -1;
|
||||
|
||||
/* Load parameters. */
|
||||
if (wd->sc_dk.dk_label.d_type == DTYPE_ST506)
|
||||
outb(iobase+wd_precomp, wd->sc_dk.dk_label.d_precompcyl / 4);
|
||||
if (wd->sc_dk.dk_label->d_type == DTYPE_ST506)
|
||||
outb(iobase+wd_precomp, wd->sc_dk.dk_label->d_precompcyl / 4);
|
||||
else
|
||||
outb(iobase+wd_features, 0);
|
||||
outb(iobase+wd_cyl_lo, cylin);
|
||||
@ -1197,13 +1206,13 @@ wdsetctlr(wd)
|
||||
|
||||
#ifdef WDDEBUG
|
||||
printf("wd(%d,%d) C%dH%dS%d\n", wd->sc_dev.dv_unit, wd->sc_drive,
|
||||
wd->sc_dk.dk_label.d_ncylinders, wd->sc_dk.dk_label.d_ntracks,
|
||||
wd->sc_dk.dk_label.d_nsectors);
|
||||
wd->sc_dk.dk_label->d_ncylinders, wd->sc_dk.dk_label->d_ntracks,
|
||||
wd->sc_dk.dk_label->d_nsectors);
|
||||
#endif
|
||||
|
||||
if (wdcommand(wd, WDCC_IDP, wd->sc_dk.dk_label.d_ncylinders,
|
||||
wd->sc_dk.dk_label.d_ntracks - 1, 0, wd->sc_dk.dk_label.d_nsectors)
|
||||
!= 0) {
|
||||
if (wdcommand(wd, WDCC_IDP, wd->sc_dk.dk_label->d_ncylinders,
|
||||
wd->sc_dk.dk_label->d_ntracks - 1, 0,
|
||||
wd->sc_dk.dk_label->d_nsectors) != 0) {
|
||||
wderror(wd, NULL, "wdsetctlr: geometry upload failed");
|
||||
return -1;
|
||||
}
|
||||
@ -1248,9 +1257,9 @@ wd_get_parms(wd)
|
||||
* This geometry is only used to read the MBR and print a
|
||||
* (false) attach message.
|
||||
*/
|
||||
strncpy(wd->sc_dk.dk_label.d_typename, "ST506",
|
||||
sizeof wd->sc_dk.dk_label.d_typename);
|
||||
wd->sc_dk.dk_label.d_type = DTYPE_ST506;
|
||||
strncpy(wd->sc_dk.dk_label->d_typename, "ST506",
|
||||
sizeof wd->sc_dk.dk_label->d_typename);
|
||||
wd->sc_dk.dk_label->d_type = DTYPE_ST506;
|
||||
|
||||
strncpy(wd->sc_params.wdp_model, "unknown",
|
||||
sizeof wd->sc_params.wdp_model);
|
||||
@ -1262,9 +1271,9 @@ wd_get_parms(wd)
|
||||
wd->sc_params.wdp_usedmovsd = 0;
|
||||
wd->sc_params.wdp_capabilities = 0;
|
||||
} else {
|
||||
strncpy(wd->sc_dk.dk_label.d_typename, "ESDI/IDE",
|
||||
sizeof wd->sc_dk.dk_label.d_typename);
|
||||
wd->sc_dk.dk_label.d_type = DTYPE_ESDI;
|
||||
strncpy(wd->sc_dk.dk_label->d_typename, "ESDI/IDE",
|
||||
sizeof wd->sc_dk.dk_label->d_typename);
|
||||
wd->sc_dk.dk_label->d_type = DTYPE_ESDI;
|
||||
|
||||
/* Read in parameter block. */
|
||||
insw(wdc->sc_iobase+wd_data, tb, sizeof(tb) / sizeof(short));
|
||||
@ -1306,19 +1315,19 @@ wdioctl(dev, cmd, addr, flag, p)
|
||||
case DIOCSBAD:
|
||||
if ((flag & FWRITE) == 0)
|
||||
return EBADF;
|
||||
wd->sc_dk.dk_cpulabel.bad = *(struct dkbad *)addr;
|
||||
wd->sc_dk.dk_label.d_flags |= D_BADSECT;
|
||||
wd->sc_dk.dk_cpulabel->bad = *(struct dkbad *)addr;
|
||||
wd->sc_dk.dk_label->d_flags |= D_BADSECT;
|
||||
bad144intern(wd);
|
||||
return 0;
|
||||
|
||||
case DIOCGDINFO:
|
||||
*(struct disklabel *)addr = wd->sc_dk.dk_label;
|
||||
*(struct disklabel *)addr = *(wd->sc_dk.dk_label);
|
||||
return 0;
|
||||
|
||||
case DIOCGPART:
|
||||
((struct partinfo *)addr)->disklab = &wd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->disklab = wd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->part =
|
||||
&wd->sc_dk.dk_label.d_partitions[WDPART(dev)];
|
||||
&wd->sc_dk.dk_label->d_partitions[WDPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCWDINFO:
|
||||
@ -1330,16 +1339,16 @@ wdioctl(dev, cmd, addr, flag, p)
|
||||
return error;
|
||||
wd->sc_flags |= WDF_LABELLING;
|
||||
|
||||
error = setdisklabel(&wd->sc_dk.dk_label,
|
||||
error = setdisklabel(wd->sc_dk.dk_label,
|
||||
(struct disklabel *)addr, /*wd->sc_dk.dk_openmask : */0,
|
||||
&wd->sc_dk.dk_cpulabel);
|
||||
wd->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (wd->sc_state > GEOMETRY)
|
||||
wd->sc_state = GEOMETRY;
|
||||
if (cmd == DIOCWDINFO)
|
||||
error = writedisklabel(WDLABELDEV(dev),
|
||||
wdstrategy, &wd->sc_dk.dk_label,
|
||||
&wd->sc_dk.dk_cpulabel);
|
||||
wdstrategy, wd->sc_dk.dk_label,
|
||||
wd->sc_dk.dk_cpulabel);
|
||||
}
|
||||
|
||||
wd->sc_flags &= ~WDF_LABELLING;
|
||||
@ -1372,7 +1381,7 @@ wdioctl(dev, cmd, addr, flag, p)
|
||||
auio.uio_resid = fop->df_count;
|
||||
auio.uio_segflg = 0;
|
||||
auio.uio_offset =
|
||||
fop->df_startblk * wd->sc_dk.dk_label.d_secsize;
|
||||
fop->df_startblk * wd->sc_dk.dk_label->d_secsize;
|
||||
auio.uio_procp = p;
|
||||
error = physio(wdformat, NULL, dev, B_WRITE, minphys,
|
||||
&auio);
|
||||
@ -1382,7 +1391,7 @@ wdioctl(dev, cmd, addr, flag, p)
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
default:
|
||||
return ENOTTY;
|
||||
}
|
||||
@ -1414,10 +1423,10 @@ wdsize(dev)
|
||||
return -1;
|
||||
wd = wdcd.cd_devs[WDUNIT(dev)];
|
||||
part = WDPART(dev);
|
||||
if (wd->sc_dk.dk_label.d_partitions[part].p_fstype != FS_SWAP)
|
||||
if (wd->sc_dk.dk_label->d_partitions[part].p_fstype != FS_SWAP)
|
||||
size = -1;
|
||||
else
|
||||
size = wd->sc_dk.dk_label.d_partitions[part].p_size;
|
||||
size = wd->sc_dk.dk_label->d_partitions[part].p_size;
|
||||
if (wdclose(dev, 0, S_IFBLK) != 0)
|
||||
return -1;
|
||||
return size;
|
||||
@ -1466,7 +1475,7 @@ wddump(dev, blkno, va, size)
|
||||
wdc = (void *)wd->sc_dev.dv_parent;
|
||||
|
||||
/* Convert to disk sectors. Request must be a multiple of size. */
|
||||
lp = &wd->sc_dk.dk_label;
|
||||
lp = wd->sc_dk.dk_label;
|
||||
if ((size % lp->d_secsize) != 0)
|
||||
return EFAULT;
|
||||
nblks = size / lp->d_secsize;
|
||||
@ -1578,8 +1587,8 @@ void
|
||||
bad144intern(wd)
|
||||
struct wd_softc *wd;
|
||||
{
|
||||
struct dkbad *bt = &wd->sc_dk.dk_cpulabel.bad;
|
||||
struct disklabel *lp = &wd->sc_dk.dk_label;
|
||||
struct dkbad *bt = &wd->sc_dk.dk_cpulabel->bad;
|
||||
struct disklabel *lp = wd->sc_dk.dk_label;
|
||||
int i = 0;
|
||||
|
||||
for (; i < 126; i++) {
|
||||
@ -1719,7 +1728,7 @@ wderror(dev, bp, msg)
|
||||
|
||||
if (bp) {
|
||||
diskerr(bp, "wd", msg, LOG_PRINTF, wd->sc_skip / DEV_BSIZE,
|
||||
&wd->sc_dk.dk_label);
|
||||
wd->sc_dk.dk_label);
|
||||
printf("\n");
|
||||
} else
|
||||
printf("%s: %s: status %b error %b\n", wdc->sc_dev.dv_xname,
|
||||
|
18
sys/dev/md.c
18
sys/dev/md.c
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: md.c,v 1.3 1995/11/17 23:33:34 gwr Exp $ */
|
||||
/* $NetBSD: md.c,v 1.4 1996/01/07 22:03:31 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Gordon W. Ross, Leo Weppelman.
|
||||
@ -49,6 +49,7 @@
|
||||
#include <sys/systm.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/disk.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_kern.h>
|
||||
@ -86,6 +87,7 @@ extern vm_offset_t kmem_alloc __P((vm_map_t, vm_size_t));
|
||||
|
||||
struct rd_softc {
|
||||
struct device sc_dev; /* REQUIRED first entry */
|
||||
struct disk sc_dkdev; /* hook for generic disk handling */
|
||||
struct rd_conf sc_rd;
|
||||
struct buf *sc_buflist;
|
||||
int sc_flags;
|
||||
@ -105,6 +107,10 @@ struct cfdriver rdcd = {
|
||||
NULL, "rd", rd_match, rd_attach,
|
||||
DV_DULL, sizeof(struct rd_softc), NULL, 0 };
|
||||
|
||||
void rdstrategy __P((struct buf *bp));
|
||||
|
||||
struct dkdriver rddkdriver = { rdstrategy };
|
||||
|
||||
static int
|
||||
rd_match(parent, self, aux)
|
||||
struct device *parent;
|
||||
@ -131,6 +137,14 @@ rd_attach(parent, self, aux)
|
||||
rd_attach_hook(sc->sc_dev.dv_unit, &sc->sc_rd);
|
||||
#endif
|
||||
printf("\n");
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
bzero(&sc->sc_dkdev, sizeof(sc->sc_dkdev));
|
||||
sc->sc_dkdev.dk_driver = &rddkdriver;
|
||||
sc->sc_dkdev.dk_name = sc->sc_dev.dv_xname;
|
||||
disk_attach(&sc->sc_dkdev);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -139,8 +153,6 @@ rd_attach(parent, self, aux)
|
||||
* ioctl, dump, size
|
||||
*/
|
||||
|
||||
void rdstrategy __P((struct buf *bp));
|
||||
|
||||
#if RAMDISK_SERVER
|
||||
static int rd_server_loop __P((struct rd_softc *sc));
|
||||
static int rd_ioctl_server __P((struct rd_softc *sc,
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: ramdisk.c,v 1.3 1995/11/17 23:33:34 gwr Exp $ */
|
||||
/* $NetBSD: ramdisk.c,v 1.4 1996/01/07 22:03:31 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Gordon W. Ross, Leo Weppelman.
|
||||
@ -49,6 +49,7 @@
|
||||
#include <sys/systm.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/disk.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_kern.h>
|
||||
@ -86,6 +87,7 @@ extern vm_offset_t kmem_alloc __P((vm_map_t, vm_size_t));
|
||||
|
||||
struct rd_softc {
|
||||
struct device sc_dev; /* REQUIRED first entry */
|
||||
struct disk sc_dkdev; /* hook for generic disk handling */
|
||||
struct rd_conf sc_rd;
|
||||
struct buf *sc_buflist;
|
||||
int sc_flags;
|
||||
@ -105,6 +107,10 @@ struct cfdriver rdcd = {
|
||||
NULL, "rd", rd_match, rd_attach,
|
||||
DV_DULL, sizeof(struct rd_softc), NULL, 0 };
|
||||
|
||||
void rdstrategy __P((struct buf *bp));
|
||||
|
||||
struct dkdriver rddkdriver = { rdstrategy };
|
||||
|
||||
static int
|
||||
rd_match(parent, self, aux)
|
||||
struct device *parent;
|
||||
@ -131,6 +137,14 @@ rd_attach(parent, self, aux)
|
||||
rd_attach_hook(sc->sc_dev.dv_unit, &sc->sc_rd);
|
||||
#endif
|
||||
printf("\n");
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
bzero(&sc->sc_dkdev, sizeof(sc->sc_dkdev));
|
||||
sc->sc_dkdev.dk_driver = &rddkdriver;
|
||||
sc->sc_dkdev.dk_name = sc->sc_dev.dv_xname;
|
||||
disk_attach(&sc->sc_dkdev);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -139,8 +153,6 @@ rd_attach(parent, self, aux)
|
||||
* ioctl, dump, size
|
||||
*/
|
||||
|
||||
void rdstrategy __P((struct buf *bp));
|
||||
|
||||
#if RAMDISK_SERVER
|
||||
static int rd_server_loop __P((struct rd_softc *sc));
|
||||
static int rd_ioctl_server __P((struct rd_softc *sc,
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cd.c,v 1.78 1995/12/07 19:11:32 thorpej Exp $ */
|
||||
/* $NetBSD: cd.c,v 1.79 1996/01/07 22:03:58 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
|
||||
@ -77,7 +77,7 @@
|
||||
|
||||
struct cd_softc {
|
||||
struct device sc_dev;
|
||||
struct dkdevice sc_dk;
|
||||
struct disk sc_dk;
|
||||
|
||||
int flags;
|
||||
#define CDF_LOCKED 0x01
|
||||
@ -103,6 +103,7 @@ void cdgetdisklabel __P((struct cd_softc *));
|
||||
int cd_get_parms __P((struct cd_softc *, int));
|
||||
void cdstrategy __P((struct buf *));
|
||||
void cdstart __P((struct cd_softc *));
|
||||
int cddone __P((struct scsi_xfer *));
|
||||
|
||||
struct dkdriver cddkdriver = { cdstrategy };
|
||||
|
||||
@ -110,7 +111,7 @@ struct scsi_device cd_switch = {
|
||||
NULL, /* use default error handler */
|
||||
cdstart, /* we have a queue, which is started by this */
|
||||
NULL, /* we do not have an async handler */
|
||||
NULL, /* use default 'done' routine */
|
||||
cddone, /* deal with stats at interrupt time */
|
||||
};
|
||||
|
||||
struct scsi_inquiry_pattern cd_patterns[] = {
|
||||
@ -162,9 +163,15 @@ cdattach(parent, self, aux)
|
||||
if (sc_link->openings > CDOUTSTANDING)
|
||||
sc_link->openings = CDOUTSTANDING;
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
cd->sc_dk.dk_driver = &cddkdriver;
|
||||
cd->sc_dk.dk_name = cd->sc_dev.dv_xname;
|
||||
disk_attach(&cd->sc_dk);
|
||||
|
||||
#if !defined(i386) || defined(NEWCONFIG)
|
||||
dk_establish(&cd->sc_dk, &cd->sc_dev);
|
||||
dk_establish(&cd->sc_dk, &cd->sc_dev); /* XXX */
|
||||
#endif
|
||||
|
||||
printf("\n");
|
||||
@ -282,8 +289,8 @@ cdopen(dev, flag, fmt)
|
||||
|
||||
/* Check that the partition exists. */
|
||||
if (part != RAW_PART &&
|
||||
(part >= cd->sc_dk.dk_label.d_npartitions ||
|
||||
cd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= cd->sc_dk.dk_label->d_npartitions ||
|
||||
cd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
error = ENXIO;
|
||||
goto bad;
|
||||
}
|
||||
@ -374,7 +381,7 @@ cdstrategy(bp)
|
||||
/*
|
||||
* The transfer must be a whole number of blocks.
|
||||
*/
|
||||
if ((bp->b_bcount % cd->sc_dk.dk_label.d_secsize) != 0) {
|
||||
if ((bp->b_bcount % cd->sc_dk.dk_label->d_secsize) != 0) {
|
||||
bp->b_error = EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
@ -397,7 +404,7 @@ cdstrategy(bp)
|
||||
* If end of partition, just return.
|
||||
*/
|
||||
if (CDPART(bp->b_dev) != RAW_PART &&
|
||||
bounds_check_with_label(bp, &cd->sc_dk.dk_label,
|
||||
bounds_check_with_label(bp, cd->sc_dk.dk_label,
|
||||
(cd->flags & (CDF_WLABEL|CDF_LABELLING)) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -499,12 +506,12 @@ cdstart(cd)
|
||||
* of the logical blocksize of the device.
|
||||
*/
|
||||
blkno =
|
||||
bp->b_blkno / (cd->sc_dk.dk_label.d_secsize / DEV_BSIZE);
|
||||
bp->b_blkno / (cd->sc_dk.dk_label->d_secsize / DEV_BSIZE);
|
||||
if (CDPART(bp->b_dev) != RAW_PART) {
|
||||
p = &cd->sc_dk.dk_label.d_partitions[CDPART(bp->b_dev)];
|
||||
blkno += p->p_offset;
|
||||
p = &cd->sc_dk.dk_label->d_partitions[CDPART(bp->b_dev)];
|
||||
blkno += p->p_offset;
|
||||
}
|
||||
nblks = howmany(bp->b_bcount, cd->sc_dk.dk_label.d_secsize);
|
||||
nblks = howmany(bp->b_bcount, cd->sc_dk.dk_label->d_secsize);
|
||||
|
||||
/*
|
||||
* Fill out the scsi command. If the transfer will
|
||||
@ -541,6 +548,9 @@ cdstart(cd)
|
||||
cmdp = (struct scsi_generic *)&cmd_big;
|
||||
}
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&cd->sc_dk);
|
||||
|
||||
/*
|
||||
* Call the routine that chats with the adapter.
|
||||
* Note: we cannot sleep as we may be an interrupt
|
||||
@ -553,6 +563,18 @@ cdstart(cd)
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
cddone(xs)
|
||||
struct scsi_xfer *xs;
|
||||
{
|
||||
struct cd_softc *cd = xs->sc_link->device_softc;
|
||||
|
||||
if (xs->bp != NULL)
|
||||
disk_unbusy(&cd->sc_dk, (xs->bp->b_bcount - xs->bp->b_resid));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
cdread(dev, uio)
|
||||
dev_t dev;
|
||||
@ -600,13 +622,13 @@ cdioctl(dev, cmd, addr, flag, p)
|
||||
|
||||
switch (cmd) {
|
||||
case DIOCGDINFO:
|
||||
*(struct disklabel *)addr = cd->sc_dk.dk_label;
|
||||
*(struct disklabel *)addr = *(cd->sc_dk.dk_label);
|
||||
return 0;
|
||||
|
||||
case DIOCGPART:
|
||||
((struct partinfo *)addr)->disklab = &cd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->disklab = cd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->part =
|
||||
&cd->sc_dk.dk_label.d_partitions[CDPART(dev)];
|
||||
&cd->sc_dk.dk_label->d_partitions[CDPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCWDINFO:
|
||||
@ -618,9 +640,9 @@ cdioctl(dev, cmd, addr, flag, p)
|
||||
return error;
|
||||
cd->flags |= CDF_LABELLING;
|
||||
|
||||
error = setdisklabel(&cd->sc_dk.dk_label,
|
||||
error = setdisklabel(cd->sc_dk.dk_label,
|
||||
(struct disklabel *)addr, /*cd->sc_dk.dk_openmask : */0,
|
||||
&cd->sc_dk.dk_cpulabel);
|
||||
cd->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
}
|
||||
|
||||
@ -851,10 +873,10 @@ void
|
||||
cdgetdisklabel(cd)
|
||||
struct cd_softc *cd;
|
||||
{
|
||||
struct disklabel *lp = &cd->sc_dk.dk_label;
|
||||
struct disklabel *lp = cd->sc_dk.dk_label;
|
||||
|
||||
bzero(lp, sizeof(struct disklabel));
|
||||
bzero(&cd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
bzero(cd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
|
||||
lp->d_secsize = cd->params.blksize;
|
||||
lp->d_ntracks = 1;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sd.c,v 1.83 1995/12/07 21:54:24 thorpej Exp $ */
|
||||
/* $NetBSD: sd.c,v 1.84 1996/01/07 22:04:02 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
|
||||
@ -77,7 +77,7 @@
|
||||
|
||||
struct sd_softc {
|
||||
struct device sc_dev;
|
||||
struct dkdevice sc_dk;
|
||||
struct disk sc_dk;
|
||||
|
||||
int flags;
|
||||
#define SDF_LOCKED 0x01
|
||||
@ -107,6 +107,7 @@ void sdgetdisklabel __P((struct sd_softc *));
|
||||
int sd_get_parms __P((struct sd_softc *, int));
|
||||
void sdstrategy __P((struct buf *));
|
||||
void sdstart __P((struct sd_softc *));
|
||||
int sddone __P((struct scsi_xfer *));
|
||||
void sdminphys __P((struct buf *));
|
||||
|
||||
struct dkdriver sddkdriver = { sdstrategy };
|
||||
@ -115,7 +116,7 @@ struct scsi_device sd_switch = {
|
||||
NULL, /* Use default error handler */
|
||||
sdstart, /* have a queue, served by this */
|
||||
NULL, /* have no async handler */
|
||||
NULL, /* Use default 'done' routine */
|
||||
sddone, /* deal with stats at interrupt time */
|
||||
};
|
||||
|
||||
struct scsi_inquiry_pattern sd_patterns[] = {
|
||||
@ -169,17 +170,24 @@ sdattach(parent, self, aux)
|
||||
if (sc_link->openings > SDOUTSTANDING)
|
||||
sc_link->openings = SDOUTSTANDING;
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
sd->sc_dk.dk_driver = &sddkdriver;
|
||||
sd->sc_dk.dk_name = sd->sc_dev.dv_xname;
|
||||
disk_attach(&sd->sc_dk);
|
||||
|
||||
sd->sc_dk.dk_driver = &sddkdriver;
|
||||
#if !defined(i386) || defined(NEWCONFIG)
|
||||
dk_establish(&sd->sc_dk, &sd->sc_dev); /* XXX */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Note if this device is ancient. This is used in sdminphys().
|
||||
*/
|
||||
if ((sa->sa_inqbuf->version & SID_ANSII) == 0)
|
||||
sd->flags |= SDF_ANCIENT;
|
||||
|
||||
sd->sc_dk.dk_driver = &sddkdriver;
|
||||
#if !defined(i386) || defined(NEWCONFIG)
|
||||
dk_establish(&sd->sc_dk, &sd->sc_dev);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Use the subdriver to request information regarding
|
||||
* the drive. We cannot use interrupts yet, so the
|
||||
@ -307,8 +315,8 @@ sdopen(dev, flag, fmt)
|
||||
|
||||
/* Check that the partition exists. */
|
||||
if (part != RAW_PART &&
|
||||
(part >= sd->sc_dk.dk_label.d_npartitions ||
|
||||
sd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= sd->sc_dk.dk_label->d_npartitions ||
|
||||
sd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
error = ENXIO;
|
||||
goto bad;
|
||||
}
|
||||
@ -399,7 +407,7 @@ sdstrategy(bp)
|
||||
/*
|
||||
* The transfer must be a whole number of blocks.
|
||||
*/
|
||||
if ((bp->b_bcount % sd->sc_dk.dk_label.d_secsize) != 0) {
|
||||
if ((bp->b_bcount % sd->sc_dk.dk_label->d_secsize) != 0) {
|
||||
bp->b_error = EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
@ -421,7 +429,7 @@ sdstrategy(bp)
|
||||
* If end of partition, just return.
|
||||
*/
|
||||
if (SDPART(bp->b_dev) != RAW_PART &&
|
||||
bounds_check_with_label(bp, &sd->sc_dk.dk_label,
|
||||
bounds_check_with_label(bp, sd->sc_dk.dk_label,
|
||||
(sd->flags & (SDF_WLABEL|SDF_LABELLING)) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -523,12 +531,12 @@ sdstart(sd)
|
||||
* of the logical blocksize of the device.
|
||||
*/
|
||||
blkno =
|
||||
bp->b_blkno / (sd->sc_dk.dk_label.d_secsize / DEV_BSIZE);
|
||||
bp->b_blkno / (sd->sc_dk.dk_label->d_secsize / DEV_BSIZE);
|
||||
if (SDPART(bp->b_dev) != RAW_PART) {
|
||||
p = &sd->sc_dk.dk_label.d_partitions[SDPART(bp->b_dev)];
|
||||
blkno += p->p_offset;
|
||||
p = &sd->sc_dk.dk_label->d_partitions[SDPART(bp->b_dev)];
|
||||
blkno += p->p_offset;
|
||||
}
|
||||
nblks = howmany(bp->b_bcount, sd->sc_dk.dk_label.d_secsize);
|
||||
nblks = howmany(bp->b_bcount, sd->sc_dk.dk_label->d_secsize);
|
||||
|
||||
/*
|
||||
* Fill out the scsi command. If the transfer will
|
||||
@ -565,6 +573,9 @@ sdstart(sd)
|
||||
cmdp = (struct scsi_generic *)&cmd_big;
|
||||
}
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&sd->sc_dk);
|
||||
|
||||
/*
|
||||
* Call the routine that chats with the adapter.
|
||||
* Note: we cannot sleep as we may be an interrupt
|
||||
@ -577,6 +588,18 @@ sdstart(sd)
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sddone(xs)
|
||||
struct scsi_xfer *xs;
|
||||
{
|
||||
struct sd_softc *sd = xs->sc_link->device_softc;
|
||||
|
||||
if (xs->bp != NULL)
|
||||
disk_unbusy(&sd->sc_dk, (xs->bp->b_bcount - xs->bp->b_resid));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
sdminphys(bp)
|
||||
struct buf *bp;
|
||||
@ -596,7 +619,7 @@ sdminphys(bp)
|
||||
* in a 10-byte read/write actually means 0 blocks.
|
||||
*/
|
||||
if (sd->flags & SDF_ANCIENT) {
|
||||
max = sd->sc_dk.dk_label.d_secsize * 0xff;
|
||||
max = sd->sc_dk.dk_label->d_secsize * 0xff;
|
||||
|
||||
if (bp->b_bcount > max)
|
||||
bp->b_bcount = max;
|
||||
@ -648,13 +671,13 @@ sdioctl(dev, cmd, addr, flag, p)
|
||||
|
||||
switch (cmd) {
|
||||
case DIOCGDINFO:
|
||||
*(struct disklabel *)addr = sd->sc_dk.dk_label;
|
||||
*(struct disklabel *)addr = *(sd->sc_dk.dk_label);
|
||||
return 0;
|
||||
|
||||
case DIOCGPART:
|
||||
((struct partinfo *)addr)->disklab = &sd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->disklab = sd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->part =
|
||||
&sd->sc_dk.dk_label.d_partitions[SDPART(dev)];
|
||||
&sd->sc_dk.dk_label->d_partitions[SDPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCWDINFO:
|
||||
@ -666,14 +689,14 @@ sdioctl(dev, cmd, addr, flag, p)
|
||||
return error;
|
||||
sd->flags |= SDF_LABELLING;
|
||||
|
||||
error = setdisklabel(&sd->sc_dk.dk_label,
|
||||
error = setdisklabel(sd->sc_dk.dk_label,
|
||||
(struct disklabel *)addr, /*sd->sc_dk.dk_openmask : */0,
|
||||
&sd->sc_dk.dk_cpulabel);
|
||||
sd->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (cmd == DIOCWDINFO)
|
||||
error = writedisklabel(SDLABELDEV(dev),
|
||||
sdstrategy, &sd->sc_dk.dk_label,
|
||||
&sd->sc_dk.dk_cpulabel);
|
||||
sdstrategy, sd->sc_dk.dk_label,
|
||||
sd->sc_dk.dk_cpulabel);
|
||||
}
|
||||
|
||||
sd->flags &= ~SDF_LABELLING;
|
||||
@ -707,11 +730,11 @@ void
|
||||
sdgetdisklabel(sd)
|
||||
struct sd_softc *sd;
|
||||
{
|
||||
struct disklabel *lp = &sd->sc_dk.dk_label;
|
||||
struct disklabel *lp = sd->sc_dk.dk_label;
|
||||
char *errstring;
|
||||
|
||||
bzero(lp, sizeof(struct disklabel));
|
||||
bzero(&sd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
bzero(sd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
|
||||
lp->d_secsize = sd->params.blksize;
|
||||
lp->d_ntracks = sd->params.heads;
|
||||
@ -745,7 +768,7 @@ sdgetdisklabel(sd)
|
||||
* Call the generic disklabel extraction routine
|
||||
*/
|
||||
if (errstring = readdisklabel(MAKESDDEV(0, sd->sc_dev.dv_unit,
|
||||
RAW_PART), sdstrategy, lp, &sd->sc_dk.dk_cpulabel)) {
|
||||
RAW_PART), sdstrategy, lp, sd->sc_dk.dk_cpulabel)) {
|
||||
printf("%s: %s\n", sd->sc_dev.dv_xname, errstring);
|
||||
return;
|
||||
}
|
||||
@ -910,10 +933,10 @@ sdsize(dev)
|
||||
return -1;
|
||||
sd = sdcd.cd_devs[SDUNIT(dev)];
|
||||
part = SDPART(dev);
|
||||
if (sd->sc_dk.dk_label.d_partitions[part].p_fstype != FS_SWAP)
|
||||
if (sd->sc_dk.dk_label->d_partitions[part].p_fstype != FS_SWAP)
|
||||
size = -1;
|
||||
else
|
||||
size = sd->sc_dk.dk_label.d_partitions[part].p_size;
|
||||
size = sd->sc_dk.dk_label->d_partitions[part].p_size;
|
||||
if (sdclose(dev, 0, S_IFBLK) != 0)
|
||||
return -1;
|
||||
return size;
|
||||
@ -966,7 +989,7 @@ sddump(dev, blkno, va, size)
|
||||
return ENXIO;
|
||||
|
||||
/* Convert to disk sectors. Request must be a multiple of size. */
|
||||
lp = &sd->sc_dk.dk_label;
|
||||
lp = sd->sc_dk.dk_label;
|
||||
sectorsize = lp->d_secsize;
|
||||
if ((size % sectorsize) != 0)
|
||||
return EFAULT;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: vnd.c,v 1.22 1995/11/06 20:28:09 thorpej Exp $ */
|
||||
/* $NetBSD: vnd.c,v 1.23 1996/01/07 22:03:33 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988 University of Utah.
|
||||
@ -66,7 +66,6 @@
|
||||
#include <sys/namei.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/dkstat.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/ioctl.h>
|
||||
@ -113,7 +112,8 @@ struct vnd_softc {
|
||||
struct ucred *sc_cred; /* credentials */
|
||||
int sc_maxactive; /* max # of active requests */
|
||||
struct buf sc_tab; /* transfer queue */
|
||||
struct dkdevice sc_dkdev; /* generic disk device info */
|
||||
char sc_xname[8]; /* XXX external name */
|
||||
struct disk sc_dkdev; /* generic disk device info */
|
||||
};
|
||||
|
||||
/* sc_flags */
|
||||
@ -400,6 +400,10 @@ vndstart(vnd)
|
||||
vnd-vnd_softc, bp, bp->b_vp, bp->b_blkno, bp->b_data,
|
||||
bp->b_bcount);
|
||||
#endif
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&vnd->sc_dkdev);
|
||||
|
||||
if ((bp->b_flags & B_READ) == 0)
|
||||
bp->b_vp->v_numoutput++;
|
||||
VOP_STRATEGY(bp);
|
||||
@ -420,6 +424,7 @@ vndiodone(vbp)
|
||||
vnd-vnd_softc, vbp, vbp->vb_buf.b_vp, vbp->vb_buf.b_blkno,
|
||||
vbp->vb_buf.b_data, vbp->vb_buf.b_bcount);
|
||||
#endif
|
||||
|
||||
if (vbp->vb_buf.b_error) {
|
||||
#ifdef DEBUG
|
||||
if (vnddebug & VDB_IO)
|
||||
@ -431,6 +436,7 @@ vndiodone(vbp)
|
||||
}
|
||||
pbp->b_resid -= vbp->vb_buf.b_bcount;
|
||||
putvndbuf(vbp);
|
||||
disk_unbusy(&vnd->sc_dkdev, (pbp->b_bcount - pbp->b_resid));
|
||||
if (pbp->b_resid == 0) {
|
||||
#ifdef DEBUG
|
||||
if (vnddebug & VDB_IO)
|
||||
@ -567,6 +573,12 @@ vndioctl(dev, cmd, data, flag, p)
|
||||
vnd->sc_vp, vnd->sc_size);
|
||||
#endif
|
||||
|
||||
/* Attach the disk. */
|
||||
bzero(vnd->sc_xname, sizeof(vnd->sc_xname)); /* XXX */
|
||||
sprintf(vnd->sc_xname, "vnd%d", unit); /* XXX */
|
||||
vnd->sc_dkdev.dk_name = vnd->sc_xname;
|
||||
disk_attach(&vnd->sc_dkdev);
|
||||
|
||||
vndunlock(vnd);
|
||||
|
||||
break;
|
||||
@ -598,6 +610,9 @@ vndioctl(dev, cmd, data, flag, p)
|
||||
printf("vndioctl: CLRed\n");
|
||||
#endif
|
||||
|
||||
/* Detatch the disk. */
|
||||
disk_detatch(&vnd->sc_dkdev);
|
||||
|
||||
/* This must be atomic. */
|
||||
s = splhigh();
|
||||
vndunlock(vnd);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: init_main.c,v 1.79 1995/12/09 04:07:41 mycroft Exp $ */
|
||||
/* $NetBSD: init_main.c,v 1.80 1996/01/07 22:03:47 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Christopher G. Demetriou. All rights reserved.
|
||||
@ -144,6 +144,7 @@ main(framep)
|
||||
extern struct pdevinit pdevinit[];
|
||||
extern void roundrobin __P((void *));
|
||||
extern void schedcpu __P((void *));
|
||||
extern void disk_init __P((void));
|
||||
|
||||
/*
|
||||
* Initialize the current process pointer (curproc) before
|
||||
@ -160,6 +161,7 @@ main(framep)
|
||||
|
||||
vm_mem_init();
|
||||
kmeminit();
|
||||
disk_init(); /* must come before autoconfiguration */
|
||||
cpu_startup();
|
||||
|
||||
/*
|
||||
|
@ -1,6 +1,7 @@
|
||||
/* $NetBSD: subr_disk.c,v 1.14 1995/12/28 19:16:39 thorpej Exp $ */
|
||||
/* $NetBSD: subr_disk.c,v 1.15 1996/01/07 22:03:49 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Jason R. Thorpe. All rights reserved.
|
||||
* Copyright (c) 1982, 1986, 1988, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* (c) UNIX System Laboratories, Inc.
|
||||
@ -42,11 +43,22 @@
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/disk.h>
|
||||
#include <sys/dkstat.h> /* XXX */
|
||||
|
||||
/*
|
||||
* A global list of all disks attached to the system. May grow or
|
||||
* shrink over time.
|
||||
*/
|
||||
struct disklist_head disklist; /* TAILQ_HEAD */
|
||||
int disk_count; /* number of drives in global disklist */
|
||||
|
||||
/*
|
||||
* Old-style disk instrumentation structures. These will go away
|
||||
* someday.
|
||||
@ -57,7 +69,7 @@ long dk_wds[DK_NDRIVE];
|
||||
long dk_wpms[DK_NDRIVE];
|
||||
long dk_xfer[DK_NDRIVE];
|
||||
int dk_busy;
|
||||
int dk_ndrive = DK_NDRIVE;
|
||||
int dk_ndrive;
|
||||
int dkn; /* number of slots filled so far */
|
||||
|
||||
/*
|
||||
@ -231,3 +243,169 @@ diskerr(bp, dname, what, pri, blkdone, lp)
|
||||
(*pr)(" tn %d sn %d)", sn / lp->d_nsectors, sn % lp->d_nsectors);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the disklist. Called by main() before autoconfiguration.
|
||||
*/
|
||||
void
|
||||
disk_init()
|
||||
{
|
||||
|
||||
TAILQ_INIT(&disklist);
|
||||
disk_count = 0;
|
||||
dk_ndrive = DK_NDRIVE; /* XXX */
|
||||
}
|
||||
|
||||
/*
|
||||
* Searches the disklist for the disk corresponding to the
|
||||
* name provided.
|
||||
*/
|
||||
struct disk *
|
||||
disk_find(name)
|
||||
char *name;
|
||||
{
|
||||
struct disk *diskp;
|
||||
|
||||
if ((name == NULL) || (disk_count <= 0))
|
||||
return (NULL);
|
||||
|
||||
for (diskp = disklist.tqh_first; diskp != NULL;
|
||||
diskp = diskp->dk_link.tqe_next)
|
||||
if (strcmp(diskp->dk_name, name) == 0)
|
||||
return (diskp);
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Attach a disk.
|
||||
*/
|
||||
void
|
||||
disk_attach(diskp)
|
||||
struct disk *diskp;
|
||||
{
|
||||
int s;
|
||||
|
||||
/*
|
||||
* Allocate and initialize the disklabel structures. Note that
|
||||
* it's not safe to sleep here, since we're probably going to be
|
||||
* called during autoconfiguration.
|
||||
*/
|
||||
diskp->dk_label = malloc(sizeof(struct disklabel), M_DEVBUF, M_NOWAIT);
|
||||
diskp->dk_cpulabel = malloc(sizeof(struct cpu_disklabel), M_DEVBUF,
|
||||
M_NOWAIT);
|
||||
if ((diskp->dk_label == NULL) || (diskp->dk_cpulabel == NULL))
|
||||
panic("disk_attach: can't allocate storage for disklabel");
|
||||
|
||||
bzero(diskp->dk_label, sizeof(struct disklabel));
|
||||
bzero(diskp->dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
|
||||
/*
|
||||
* Set the attached timestamp.
|
||||
*/
|
||||
s = splclock();
|
||||
diskp->dk_attachtime = mono_time;
|
||||
splx(s);
|
||||
|
||||
/*
|
||||
* Link into the disklist.
|
||||
*/
|
||||
TAILQ_INSERT_TAIL(&disklist, diskp, dk_link);
|
||||
++disk_count;
|
||||
}
|
||||
|
||||
/*
|
||||
* Detatch a disk.
|
||||
*/
|
||||
void
|
||||
disk_detatch(diskp)
|
||||
struct disk *diskp;
|
||||
{
|
||||
|
||||
/*
|
||||
* Free the space used by the disklabel structures.
|
||||
*/
|
||||
free(diskp->dk_label, M_DEVBUF);
|
||||
free(diskp->dk_cpulabel, M_DEVBUF);
|
||||
|
||||
/*
|
||||
* Remove from the disklist.
|
||||
*/
|
||||
TAILQ_REMOVE(&disklist, diskp, dk_link);
|
||||
if (--disk_count < 0)
|
||||
panic("disk_detatch: disk_count < 0");
|
||||
}
|
||||
|
||||
/*
|
||||
* Increment a disk's busy counter. If the counter is going from
|
||||
* 0 to 1, set the timestamp.
|
||||
*/
|
||||
void
|
||||
disk_busy(diskp)
|
||||
struct disk *diskp;
|
||||
{
|
||||
int s;
|
||||
|
||||
/*
|
||||
* XXX We'd like to use something as accurate as microtime(),
|
||||
* but that doesn't depend on the system TOD clock.
|
||||
*/
|
||||
if (diskp->dk_busy++ == 0) {
|
||||
s = splclock();
|
||||
diskp->dk_timestamp = mono_time;
|
||||
splx(s);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Decrement a disk's busy counter, increment the byte count, total busy
|
||||
* time, and reset the timestamp.
|
||||
*/
|
||||
void
|
||||
disk_unbusy(diskp, bcount)
|
||||
struct disk *diskp;
|
||||
long bcount;
|
||||
{
|
||||
int s;
|
||||
struct timeval dv_time, diff_time;
|
||||
|
||||
if (diskp->dk_busy-- == 0)
|
||||
panic("disk_unbusy: %s: dk_busy < 0", diskp->dk_name);
|
||||
|
||||
s = splclock();
|
||||
dv_time = mono_time;
|
||||
splx(s);
|
||||
|
||||
timersub(&dv_time, &diskp->dk_timestamp, &diff_time);
|
||||
timeradd(&diskp->dk_time, &diff_time, &diskp->dk_time);
|
||||
|
||||
diskp->dk_timestamp = dv_time;
|
||||
if (bcount > 0) {
|
||||
diskp->dk_bytes += bcount;
|
||||
diskp->dk_xfer++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset the metrics counters on the given disk. Note that we cannot
|
||||
* reset the busy counter, as it may case a panic in disk_unbusy().
|
||||
* We also must avoid playing with the timestamp information, as it
|
||||
* may skew any pending transfer results.
|
||||
*/
|
||||
void
|
||||
disk_resetstat(diskp)
|
||||
struct disk *diskp;
|
||||
{
|
||||
int s = splbio(), t;
|
||||
|
||||
diskp->dk_xfer = 0;
|
||||
diskp->dk_bytes = 0;
|
||||
|
||||
t = splclock();
|
||||
diskp->dk_attachtime = mono_time;
|
||||
splx(t);
|
||||
|
||||
timerclear(&diskp->dk_time);
|
||||
|
||||
splx(s);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cd.c,v 1.78 1995/12/07 19:11:32 thorpej Exp $ */
|
||||
/* $NetBSD: cd.c,v 1.79 1996/01/07 22:03:58 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
|
||||
@ -77,7 +77,7 @@
|
||||
|
||||
struct cd_softc {
|
||||
struct device sc_dev;
|
||||
struct dkdevice sc_dk;
|
||||
struct disk sc_dk;
|
||||
|
||||
int flags;
|
||||
#define CDF_LOCKED 0x01
|
||||
@ -103,6 +103,7 @@ void cdgetdisklabel __P((struct cd_softc *));
|
||||
int cd_get_parms __P((struct cd_softc *, int));
|
||||
void cdstrategy __P((struct buf *));
|
||||
void cdstart __P((struct cd_softc *));
|
||||
int cddone __P((struct scsi_xfer *));
|
||||
|
||||
struct dkdriver cddkdriver = { cdstrategy };
|
||||
|
||||
@ -110,7 +111,7 @@ struct scsi_device cd_switch = {
|
||||
NULL, /* use default error handler */
|
||||
cdstart, /* we have a queue, which is started by this */
|
||||
NULL, /* we do not have an async handler */
|
||||
NULL, /* use default 'done' routine */
|
||||
cddone, /* deal with stats at interrupt time */
|
||||
};
|
||||
|
||||
struct scsi_inquiry_pattern cd_patterns[] = {
|
||||
@ -162,9 +163,15 @@ cdattach(parent, self, aux)
|
||||
if (sc_link->openings > CDOUTSTANDING)
|
||||
sc_link->openings = CDOUTSTANDING;
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
cd->sc_dk.dk_driver = &cddkdriver;
|
||||
cd->sc_dk.dk_name = cd->sc_dev.dv_xname;
|
||||
disk_attach(&cd->sc_dk);
|
||||
|
||||
#if !defined(i386) || defined(NEWCONFIG)
|
||||
dk_establish(&cd->sc_dk, &cd->sc_dev);
|
||||
dk_establish(&cd->sc_dk, &cd->sc_dev); /* XXX */
|
||||
#endif
|
||||
|
||||
printf("\n");
|
||||
@ -282,8 +289,8 @@ cdopen(dev, flag, fmt)
|
||||
|
||||
/* Check that the partition exists. */
|
||||
if (part != RAW_PART &&
|
||||
(part >= cd->sc_dk.dk_label.d_npartitions ||
|
||||
cd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= cd->sc_dk.dk_label->d_npartitions ||
|
||||
cd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
error = ENXIO;
|
||||
goto bad;
|
||||
}
|
||||
@ -374,7 +381,7 @@ cdstrategy(bp)
|
||||
/*
|
||||
* The transfer must be a whole number of blocks.
|
||||
*/
|
||||
if ((bp->b_bcount % cd->sc_dk.dk_label.d_secsize) != 0) {
|
||||
if ((bp->b_bcount % cd->sc_dk.dk_label->d_secsize) != 0) {
|
||||
bp->b_error = EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
@ -397,7 +404,7 @@ cdstrategy(bp)
|
||||
* If end of partition, just return.
|
||||
*/
|
||||
if (CDPART(bp->b_dev) != RAW_PART &&
|
||||
bounds_check_with_label(bp, &cd->sc_dk.dk_label,
|
||||
bounds_check_with_label(bp, cd->sc_dk.dk_label,
|
||||
(cd->flags & (CDF_WLABEL|CDF_LABELLING)) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -499,12 +506,12 @@ cdstart(cd)
|
||||
* of the logical blocksize of the device.
|
||||
*/
|
||||
blkno =
|
||||
bp->b_blkno / (cd->sc_dk.dk_label.d_secsize / DEV_BSIZE);
|
||||
bp->b_blkno / (cd->sc_dk.dk_label->d_secsize / DEV_BSIZE);
|
||||
if (CDPART(bp->b_dev) != RAW_PART) {
|
||||
p = &cd->sc_dk.dk_label.d_partitions[CDPART(bp->b_dev)];
|
||||
blkno += p->p_offset;
|
||||
p = &cd->sc_dk.dk_label->d_partitions[CDPART(bp->b_dev)];
|
||||
blkno += p->p_offset;
|
||||
}
|
||||
nblks = howmany(bp->b_bcount, cd->sc_dk.dk_label.d_secsize);
|
||||
nblks = howmany(bp->b_bcount, cd->sc_dk.dk_label->d_secsize);
|
||||
|
||||
/*
|
||||
* Fill out the scsi command. If the transfer will
|
||||
@ -541,6 +548,9 @@ cdstart(cd)
|
||||
cmdp = (struct scsi_generic *)&cmd_big;
|
||||
}
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&cd->sc_dk);
|
||||
|
||||
/*
|
||||
* Call the routine that chats with the adapter.
|
||||
* Note: we cannot sleep as we may be an interrupt
|
||||
@ -553,6 +563,18 @@ cdstart(cd)
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
cddone(xs)
|
||||
struct scsi_xfer *xs;
|
||||
{
|
||||
struct cd_softc *cd = xs->sc_link->device_softc;
|
||||
|
||||
if (xs->bp != NULL)
|
||||
disk_unbusy(&cd->sc_dk, (xs->bp->b_bcount - xs->bp->b_resid));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
cdread(dev, uio)
|
||||
dev_t dev;
|
||||
@ -600,13 +622,13 @@ cdioctl(dev, cmd, addr, flag, p)
|
||||
|
||||
switch (cmd) {
|
||||
case DIOCGDINFO:
|
||||
*(struct disklabel *)addr = cd->sc_dk.dk_label;
|
||||
*(struct disklabel *)addr = *(cd->sc_dk.dk_label);
|
||||
return 0;
|
||||
|
||||
case DIOCGPART:
|
||||
((struct partinfo *)addr)->disklab = &cd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->disklab = cd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->part =
|
||||
&cd->sc_dk.dk_label.d_partitions[CDPART(dev)];
|
||||
&cd->sc_dk.dk_label->d_partitions[CDPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCWDINFO:
|
||||
@ -618,9 +640,9 @@ cdioctl(dev, cmd, addr, flag, p)
|
||||
return error;
|
||||
cd->flags |= CDF_LABELLING;
|
||||
|
||||
error = setdisklabel(&cd->sc_dk.dk_label,
|
||||
error = setdisklabel(cd->sc_dk.dk_label,
|
||||
(struct disklabel *)addr, /*cd->sc_dk.dk_openmask : */0,
|
||||
&cd->sc_dk.dk_cpulabel);
|
||||
cd->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
}
|
||||
|
||||
@ -851,10 +873,10 @@ void
|
||||
cdgetdisklabel(cd)
|
||||
struct cd_softc *cd;
|
||||
{
|
||||
struct disklabel *lp = &cd->sc_dk.dk_label;
|
||||
struct disklabel *lp = cd->sc_dk.dk_label;
|
||||
|
||||
bzero(lp, sizeof(struct disklabel));
|
||||
bzero(&cd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
bzero(cd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
|
||||
lp->d_secsize = cd->params.blksize;
|
||||
lp->d_ntracks = 1;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sd.c,v 1.83 1995/12/07 21:54:24 thorpej Exp $ */
|
||||
/* $NetBSD: sd.c,v 1.84 1996/01/07 22:04:02 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
|
||||
@ -77,7 +77,7 @@
|
||||
|
||||
struct sd_softc {
|
||||
struct device sc_dev;
|
||||
struct dkdevice sc_dk;
|
||||
struct disk sc_dk;
|
||||
|
||||
int flags;
|
||||
#define SDF_LOCKED 0x01
|
||||
@ -107,6 +107,7 @@ void sdgetdisklabel __P((struct sd_softc *));
|
||||
int sd_get_parms __P((struct sd_softc *, int));
|
||||
void sdstrategy __P((struct buf *));
|
||||
void sdstart __P((struct sd_softc *));
|
||||
int sddone __P((struct scsi_xfer *));
|
||||
void sdminphys __P((struct buf *));
|
||||
|
||||
struct dkdriver sddkdriver = { sdstrategy };
|
||||
@ -115,7 +116,7 @@ struct scsi_device sd_switch = {
|
||||
NULL, /* Use default error handler */
|
||||
sdstart, /* have a queue, served by this */
|
||||
NULL, /* have no async handler */
|
||||
NULL, /* Use default 'done' routine */
|
||||
sddone, /* deal with stats at interrupt time */
|
||||
};
|
||||
|
||||
struct scsi_inquiry_pattern sd_patterns[] = {
|
||||
@ -169,17 +170,24 @@ sdattach(parent, self, aux)
|
||||
if (sc_link->openings > SDOUTSTANDING)
|
||||
sc_link->openings = SDOUTSTANDING;
|
||||
|
||||
/*
|
||||
* Initialize and attach the disk structure.
|
||||
*/
|
||||
sd->sc_dk.dk_driver = &sddkdriver;
|
||||
sd->sc_dk.dk_name = sd->sc_dev.dv_xname;
|
||||
disk_attach(&sd->sc_dk);
|
||||
|
||||
sd->sc_dk.dk_driver = &sddkdriver;
|
||||
#if !defined(i386) || defined(NEWCONFIG)
|
||||
dk_establish(&sd->sc_dk, &sd->sc_dev); /* XXX */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Note if this device is ancient. This is used in sdminphys().
|
||||
*/
|
||||
if ((sa->sa_inqbuf->version & SID_ANSII) == 0)
|
||||
sd->flags |= SDF_ANCIENT;
|
||||
|
||||
sd->sc_dk.dk_driver = &sddkdriver;
|
||||
#if !defined(i386) || defined(NEWCONFIG)
|
||||
dk_establish(&sd->sc_dk, &sd->sc_dev);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Use the subdriver to request information regarding
|
||||
* the drive. We cannot use interrupts yet, so the
|
||||
@ -307,8 +315,8 @@ sdopen(dev, flag, fmt)
|
||||
|
||||
/* Check that the partition exists. */
|
||||
if (part != RAW_PART &&
|
||||
(part >= sd->sc_dk.dk_label.d_npartitions ||
|
||||
sd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
(part >= sd->sc_dk.dk_label->d_npartitions ||
|
||||
sd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
|
||||
error = ENXIO;
|
||||
goto bad;
|
||||
}
|
||||
@ -399,7 +407,7 @@ sdstrategy(bp)
|
||||
/*
|
||||
* The transfer must be a whole number of blocks.
|
||||
*/
|
||||
if ((bp->b_bcount % sd->sc_dk.dk_label.d_secsize) != 0) {
|
||||
if ((bp->b_bcount % sd->sc_dk.dk_label->d_secsize) != 0) {
|
||||
bp->b_error = EINVAL;
|
||||
goto bad;
|
||||
}
|
||||
@ -421,7 +429,7 @@ sdstrategy(bp)
|
||||
* If end of partition, just return.
|
||||
*/
|
||||
if (SDPART(bp->b_dev) != RAW_PART &&
|
||||
bounds_check_with_label(bp, &sd->sc_dk.dk_label,
|
||||
bounds_check_with_label(bp, sd->sc_dk.dk_label,
|
||||
(sd->flags & (SDF_WLABEL|SDF_LABELLING)) != 0) <= 0)
|
||||
goto done;
|
||||
|
||||
@ -523,12 +531,12 @@ sdstart(sd)
|
||||
* of the logical blocksize of the device.
|
||||
*/
|
||||
blkno =
|
||||
bp->b_blkno / (sd->sc_dk.dk_label.d_secsize / DEV_BSIZE);
|
||||
bp->b_blkno / (sd->sc_dk.dk_label->d_secsize / DEV_BSIZE);
|
||||
if (SDPART(bp->b_dev) != RAW_PART) {
|
||||
p = &sd->sc_dk.dk_label.d_partitions[SDPART(bp->b_dev)];
|
||||
blkno += p->p_offset;
|
||||
p = &sd->sc_dk.dk_label->d_partitions[SDPART(bp->b_dev)];
|
||||
blkno += p->p_offset;
|
||||
}
|
||||
nblks = howmany(bp->b_bcount, sd->sc_dk.dk_label.d_secsize);
|
||||
nblks = howmany(bp->b_bcount, sd->sc_dk.dk_label->d_secsize);
|
||||
|
||||
/*
|
||||
* Fill out the scsi command. If the transfer will
|
||||
@ -565,6 +573,9 @@ sdstart(sd)
|
||||
cmdp = (struct scsi_generic *)&cmd_big;
|
||||
}
|
||||
|
||||
/* Instrumentation. */
|
||||
disk_busy(&sd->sc_dk);
|
||||
|
||||
/*
|
||||
* Call the routine that chats with the adapter.
|
||||
* Note: we cannot sleep as we may be an interrupt
|
||||
@ -577,6 +588,18 @@ sdstart(sd)
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sddone(xs)
|
||||
struct scsi_xfer *xs;
|
||||
{
|
||||
struct sd_softc *sd = xs->sc_link->device_softc;
|
||||
|
||||
if (xs->bp != NULL)
|
||||
disk_unbusy(&sd->sc_dk, (xs->bp->b_bcount - xs->bp->b_resid));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
sdminphys(bp)
|
||||
struct buf *bp;
|
||||
@ -596,7 +619,7 @@ sdminphys(bp)
|
||||
* in a 10-byte read/write actually means 0 blocks.
|
||||
*/
|
||||
if (sd->flags & SDF_ANCIENT) {
|
||||
max = sd->sc_dk.dk_label.d_secsize * 0xff;
|
||||
max = sd->sc_dk.dk_label->d_secsize * 0xff;
|
||||
|
||||
if (bp->b_bcount > max)
|
||||
bp->b_bcount = max;
|
||||
@ -648,13 +671,13 @@ sdioctl(dev, cmd, addr, flag, p)
|
||||
|
||||
switch (cmd) {
|
||||
case DIOCGDINFO:
|
||||
*(struct disklabel *)addr = sd->sc_dk.dk_label;
|
||||
*(struct disklabel *)addr = *(sd->sc_dk.dk_label);
|
||||
return 0;
|
||||
|
||||
case DIOCGPART:
|
||||
((struct partinfo *)addr)->disklab = &sd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->disklab = sd->sc_dk.dk_label;
|
||||
((struct partinfo *)addr)->part =
|
||||
&sd->sc_dk.dk_label.d_partitions[SDPART(dev)];
|
||||
&sd->sc_dk.dk_label->d_partitions[SDPART(dev)];
|
||||
return 0;
|
||||
|
||||
case DIOCWDINFO:
|
||||
@ -666,14 +689,14 @@ sdioctl(dev, cmd, addr, flag, p)
|
||||
return error;
|
||||
sd->flags |= SDF_LABELLING;
|
||||
|
||||
error = setdisklabel(&sd->sc_dk.dk_label,
|
||||
error = setdisklabel(sd->sc_dk.dk_label,
|
||||
(struct disklabel *)addr, /*sd->sc_dk.dk_openmask : */0,
|
||||
&sd->sc_dk.dk_cpulabel);
|
||||
sd->sc_dk.dk_cpulabel);
|
||||
if (error == 0) {
|
||||
if (cmd == DIOCWDINFO)
|
||||
error = writedisklabel(SDLABELDEV(dev),
|
||||
sdstrategy, &sd->sc_dk.dk_label,
|
||||
&sd->sc_dk.dk_cpulabel);
|
||||
sdstrategy, sd->sc_dk.dk_label,
|
||||
sd->sc_dk.dk_cpulabel);
|
||||
}
|
||||
|
||||
sd->flags &= ~SDF_LABELLING;
|
||||
@ -707,11 +730,11 @@ void
|
||||
sdgetdisklabel(sd)
|
||||
struct sd_softc *sd;
|
||||
{
|
||||
struct disklabel *lp = &sd->sc_dk.dk_label;
|
||||
struct disklabel *lp = sd->sc_dk.dk_label;
|
||||
char *errstring;
|
||||
|
||||
bzero(lp, sizeof(struct disklabel));
|
||||
bzero(&sd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
bzero(sd->sc_dk.dk_cpulabel, sizeof(struct cpu_disklabel));
|
||||
|
||||
lp->d_secsize = sd->params.blksize;
|
||||
lp->d_ntracks = sd->params.heads;
|
||||
@ -745,7 +768,7 @@ sdgetdisklabel(sd)
|
||||
* Call the generic disklabel extraction routine
|
||||
*/
|
||||
if (errstring = readdisklabel(MAKESDDEV(0, sd->sc_dev.dv_unit,
|
||||
RAW_PART), sdstrategy, lp, &sd->sc_dk.dk_cpulabel)) {
|
||||
RAW_PART), sdstrategy, lp, sd->sc_dk.dk_cpulabel)) {
|
||||
printf("%s: %s\n", sd->sc_dev.dv_xname, errstring);
|
||||
return;
|
||||
}
|
||||
@ -910,10 +933,10 @@ sdsize(dev)
|
||||
return -1;
|
||||
sd = sdcd.cd_devs[SDUNIT(dev)];
|
||||
part = SDPART(dev);
|
||||
if (sd->sc_dk.dk_label.d_partitions[part].p_fstype != FS_SWAP)
|
||||
if (sd->sc_dk.dk_label->d_partitions[part].p_fstype != FS_SWAP)
|
||||
size = -1;
|
||||
else
|
||||
size = sd->sc_dk.dk_label.d_partitions[part].p_size;
|
||||
size = sd->sc_dk.dk_label->d_partitions[part].p_size;
|
||||
if (sdclose(dev, 0, S_IFBLK) != 0)
|
||||
return -1;
|
||||
return size;
|
||||
@ -966,7 +989,7 @@ sddump(dev, blkno, va, size)
|
||||
return ENXIO;
|
||||
|
||||
/* Convert to disk sectors. Request must be a multiple of size. */
|
||||
lp = &sd->sc_dk.dk_label;
|
||||
lp = sd->sc_dk.dk_label;
|
||||
sectorsize = lp->d_secsize;
|
||||
if ((size % sectorsize) != 0)
|
||||
return EFAULT;
|
||||
|
@ -1,6 +1,7 @@
|
||||
/* $NetBSD: disk.h,v 1.8 1994/10/30 21:49:49 cgd Exp $ */
|
||||
/* $NetBSD: disk.h,v 1.9 1996/01/07 22:04:07 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Jason R. Thorpe. All rights reserved.
|
||||
* Copyright (c) 1992, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
@ -48,26 +49,47 @@
|
||||
|
||||
/*
|
||||
* Disk device structures.
|
||||
*
|
||||
* Note that this is only a preliminary outline. The final disk structures
|
||||
* may be somewhat different.
|
||||
*/
|
||||
struct buf;
|
||||
|
||||
struct dkdevice {
|
||||
struct device dk_dev; /* base device */
|
||||
struct dkdevice *dk_next; /* list of disks; not yet used */
|
||||
int dk_bps; /* xfer rate: bytes per second */
|
||||
int dk_bopenmask; /* block devices open */
|
||||
int dk_copenmask; /* character devices open */
|
||||
int dk_openmask; /* composite (bopen|copen) */
|
||||
int dk_state; /* label state ### */
|
||||
int dk_blkshift; /* shift to convert DEV_BSIZE to blks */
|
||||
int dk_byteshift; /* shift to convert bytes to blks */
|
||||
#include <sys/time.h>
|
||||
#include <sys/queue.h>
|
||||
|
||||
struct buf;
|
||||
struct disklabel;
|
||||
struct cpu_disklabel;
|
||||
|
||||
struct disk {
|
||||
TAILQ_ENTRY(disk) dk_link; /* link in global disklist */
|
||||
char *dk_name; /* disk name */
|
||||
int dk_bopenmask; /* block devices open */
|
||||
int dk_copenmask; /* character devices open */
|
||||
int dk_openmask; /* composite (bopen|copen) */
|
||||
int dk_state; /* label state ### */
|
||||
int dk_blkshift; /* shift to convert DEV_BSIZE to blks */
|
||||
int dk_byteshift; /* shift to convert bytes to blks */
|
||||
|
||||
/*
|
||||
* Metrics data; note that some metrics may have no meaning
|
||||
* on certain types of disks.
|
||||
*/
|
||||
int dk_busy; /* busy counter */
|
||||
u_int64_t dk_xfer; /* total number of transfers */
|
||||
u_int64_t dk_seek; /* total independent seek operations */
|
||||
u_int64_t dk_bytes; /* total bytes transfered */
|
||||
struct timeval dk_attachtime; /* time disk was attached */
|
||||
struct timeval dk_timestamp; /* timestamp of last unbusy */
|
||||
struct timeval dk_time; /* total time spent busy */
|
||||
|
||||
struct dkdriver *dk_driver; /* pointer to driver */
|
||||
daddr_t dk_labelsector; /* sector containing label */
|
||||
struct disklabel dk_label; /* label */
|
||||
struct cpu_disklabel dk_cpulabel;
|
||||
|
||||
/*
|
||||
* Disk label information. Storage for the in-core disk label
|
||||
* must be dynamically allocated, otherwise the size of this
|
||||
* structure becomes machine-dependent.
|
||||
*/
|
||||
daddr_t dk_labelsector; /* sector containing label */
|
||||
struct disklabel *dk_label; /* label */
|
||||
struct cpu_disklabel *dk_cpulabel;
|
||||
};
|
||||
|
||||
struct dkdriver {
|
||||
@ -79,7 +101,7 @@ struct dkdriver {
|
||||
struct proc *));
|
||||
int (*d_dump) __P((dev_t));
|
||||
void (*d_start) __P((struct buf *, daddr_t));
|
||||
int (*d_mklabel) __P((struct dkdevice *));
|
||||
int (*d_mklabel) __P((struct disk *));
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -105,3 +127,20 @@ struct disksort_stats {
|
||||
long ds_endsecond; /* # insertions at end of 2nd list */
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* disklist_head is defined here so that user-land has access to it.
|
||||
*/
|
||||
TAILQ_HEAD(disklist_head, disk); /* the disklist is a TAILQ */
|
||||
|
||||
#ifdef _KERNEL
|
||||
extern int disk_count; /* number of disks in global disklist */
|
||||
|
||||
void disk_init __P((void));
|
||||
void disk_attach __P((struct disk *));
|
||||
void disk_detach __P((struct disk *));
|
||||
void disk_busy __P((struct disk *));
|
||||
void disk_unbusy __P((struct disk *, long));
|
||||
void disk_resetstat __P((struct disk *));
|
||||
struct disk *disk_find __P((char *));
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user