summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/scsi/sd.c181
1 files changed, 102 insertions, 79 deletions
diff --git a/sys/scsi/sd.c b/sys/scsi/sd.c
index e0805b5..ce065ff 100644
--- a/sys/scsi/sd.c
+++ b/sys/scsi/sd.c
@@ -14,7 +14,7 @@
*
* Ported to run under 386BSD by Julian Elischer (julian@dialix.oz.au) Sept 1992
*
- * $Id: sd.c,v 1.127 1998/05/06 22:14:46 julian Exp $
+ * $Id: sd.c,v 1.128 1998/05/07 02:05:21 julian Exp $
*/
#include "opt_bounce.h"
@@ -87,40 +87,41 @@ struct scsi_data {
u_int32_t flags;
#define SDINIT 0x04 /* device has been init'd */
struct disk_parms {
- u_char heads; /* Number of heads */
- u_int16_t cyls; /* Number of cylinders */
- u_char sectors; /*dubious *//* Number of sectors/track */
- u_int16_t secsiz; /* Number of bytes/sector */
- u_int32_t disksize; /* total number sectors */
+ u_char heads; /* Number of heads */
+ u_int16_t cyls; /* Number of cylinders */
+ u_char sectors;/*XXX*/ /* Number of sectors/track */
+ u_int16_t secsiz; /* Number of bytes/sector */
+ u_int32_t disksize; /* total number sectors */
} params;
- struct diskslices *dk_slices; /* virtual drives */
- struct buf_queue_head buf_queue;
- int dkunit; /* disk stats unit number */
+ struct diskslices *dk_slices; /* virtual drives */
+ struct buf_queue_head buf_queue;
+ int dkunit; /* disk stats unit number */
#ifdef DEVFS
#ifdef SLICE
- struct slice *slice;
- int mynor;
- struct slicelimits limit;
- struct scsi_link *sc_link;
- int unit;
- struct intr_config_hook ich;
+ struct slice *slice;
+ int mynor;
+ struct slicelimits limit;
+ struct scsi_link *sc_link;
+ int unit;
+ struct intr_config_hook ich;
#else /* SLICE */
- void *b_devfs_token;
- void *c_devfs_token;
+ void *b_devfs_token;
+ void *c_devfs_token;
#endif /* SLICE */
- void *ctl_devfs_token;
+ void *ctl_devfs_token;
#endif
};
+
+#ifndef SLICE
static int sdunit(dev_t dev) { return SDUNIT(dev); }
static dev_t sdsetunit(dev_t dev, int unit) { return SDSETUNIT(dev, unit); }
-
static errval sd_open __P((dev_t dev, int mode, int fmt, struct proc *p,
- struct scsi_link *sc_link));
+ struct scsi_link *sc_link));
static errval sd_ioctl(dev_t dev, int cmd, caddr_t addr, int flag,
- struct proc *p, struct scsi_link *sc_link);
-static errval sd_close __P((dev_t dev, int fflag, int fmt, struct proc *p,
- struct scsi_link *sc_link));
+ struct proc *p, struct scsi_link *sc_link);
+static errval sd_close __P((dev_t dev, int flag, int fmt, struct proc *p,
+ struct scsi_link *sc_link));
static void sd_strategy(struct buf *bp, struct scsi_link *sc_link);
static d_open_t sdopen;
@@ -132,17 +133,17 @@ static d_strategy_t sdstrategy;
#define CDEV_MAJOR 13
#define BDEV_MAJOR 4
-#ifndef SLICE
static struct cdevsw sd_cdevsw;
static struct bdevsw sd_bdevsw =
{ sdopen, sdclose, sdstrategy, sdioctl, /*4*/
sddump, sdsize, D_DISK, "sd", &sd_cdevsw, -1 };
#else /* ! SLICE */
+static errval sdattach(struct scsi_link *sc_link);
static sl_h_IO_req_t sdsIOreq; /* IO req downward (to device) */
static sl_h_ioctl_t sdsioctl; /* ioctl req downward (to device) */
static sl_h_open_t sdsopen; /* downwards travelling open */
-/*static sl_h_close_t sdsclose; */ /* downwards travelling close */
+static sl_h_close_t sdsclose; /* downwards travelling close */
static void sds_init (void *arg);
static sl_h_dump_t sdsdump; /* core dump req downward */
@@ -155,7 +156,7 @@ static struct slice_handler slicetype = {
&sdsIOreq,
&sdsioctl,
&sdsopen,
- /*&sdsclose*/NULL,
+ NULL, /* was close, now free */
NULL, /* revoke */
NULL, /* claim */
NULL, /* verify */
@@ -165,6 +166,7 @@ static struct slice_handler slicetype = {
#endif
+#ifndef SLICE
SCSI_DEVICE_ENTRIES(sd)
@@ -188,13 +190,41 @@ static struct scsi_device sd_switch =
sd_open,
sd_ioctl,
sd_close,
-#ifndef SLICE
sd_strategy,
-#else
+};
+#else /* SLICE */
+static struct scsi_device sd_switch =
+{
+ sd_sense_handler,
+ sdstart, /* have a queue, served by this */
+ NULL, /* have no async handler */
+ NULL, /* Use default 'done' routine */
+ "sd",
+ 0,
+ {0, 0},
+ 0, /* Link flags */
+ sdattach,
+ "Direct-Access",
+ NULL,
+ sizeof(struct scsi_data),
+ T_DIRECT,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
NULL,
-#endif
};
+
+/* this should be called by the SYSINIT (?!) */
+void
+sdinit(void)
+{
+ scsi_device_register(&sd_switch);
+}
+
+#endif /* SLICE */
static struct scsi_xfer sx;
@@ -332,14 +362,32 @@ sds_init(void *arg)
/*
* open the device. Make sure the partition info is a up-to-date as can be.
*/
+#ifdef SLICE
+static int
+sdsopen(void *private, int flags, int mode, struct proc *p)
+#else /* !SLICE */
static errval
-sd_open(dev, mode, fmt, p, sc_link)
- dev_t dev;
- int mode;
- int fmt;
- struct proc *p;
- struct scsi_link *sc_link;
+sd_open(dev_t dev, int mode, int fmt, struct proc *p, struct scsi_link *sc_link)
+#endif
{
+#ifdef SLICE
+ errval errcode = 0;
+ struct scsi_data *sd = private;
+ struct scsi_link *sc_link = sd->sc_link;
+ u_int32_t unit = sd->unit;
+
+ if ((flags & (FREAD|FWRITE)) == 0) {
+ /* Mode chenge to mode 0 (closed) */
+ errcode = scsi_device_lock(sc_link);
+ if (errcode) {
+ return errcode; /* how can close fail? */
+ }
+ scsi_prevent(sc_link, PR_ALLOW, SCSI_SILENT | SCSI_ERR_OK);
+ sc_link->flags &= ~SDEV_OPEN;
+ scsi_device_unlock(sc_link);
+ return (0);
+ }
+#else /* !SLICE */
errval errcode = 0;
u_int32_t unit;
struct disklabel label;
@@ -347,6 +395,7 @@ sd_open(dev, mode, fmt, p, sc_link)
unit = SDUNIT(dev);
sd = sc_link->sd;
+#endif /* !SLICE */
/*
* Make sure the disk has been initialised
@@ -357,9 +406,13 @@ sd_open(dev, mode, fmt, p, sc_link)
return (ENXIO);
}
+#ifdef SLICE
+ SC_DEBUG(sc_link, SDEV_DB1, ("sdsopen: (unit %ld)\n", unit));
+#else /* !SLICE */
SC_DEBUG(sc_link, SDEV_DB1,
("sd_open: dev=0x%lx (unit %ld, partition %d)\n",
dev, unit, PARTITION(dev)));
+#endif /* !SLICE */
/*
* "unit attention" errors should occur here if the
@@ -385,7 +438,7 @@ sd_open(dev, mode, fmt, p, sc_link)
*/
if (dsisopen(sd->dk_slices)) {
errcode = ENXIO;
- goto bad;
+ goto close;
}
dsgone(&sd->dk_slices);
@@ -398,7 +451,7 @@ sd_open(dev, mode, fmt, p, sc_link)
if (scsi_test_unit_ready(sc_link, 0)) {
SC_DEBUG(sc_link, SDEV_DB3, ("device not reponding\n"));
errcode = ENXIO;
- goto bad;
+ goto close;
}
SC_DEBUG(sc_link, SDEV_DB3, ("device ok\n"));
@@ -406,13 +459,14 @@ sd_open(dev, mode, fmt, p, sc_link)
* Load the physical device parameters
*/
if(errcode = sd_get_parms(unit, 0)) /* sets SDEV_MEDIA_LOADED */
- goto bad;
+ goto close;
SC_DEBUG(sc_link, SDEV_DB3, ("Params loaded "));
/* Lock the pack in. */
scsi_prevent(sc_link, PR_PREVENT, SCSI_ERR_OK | SCSI_SILENT);
+#ifndef SLICE
/* Build label for whole disk. */
bzero(&label, sizeof label);
label.d_secsize = sd->params.secsiz;
@@ -425,12 +479,11 @@ sd_open(dev, mode, fmt, p, sc_link)
/* XXX as long as it's not 0 - readdisklabel divides by it (?) */
label.d_secperunit = sd->params.disksize;
-#ifndef SLICE
/* Initialize slice tables. */
errcode = dsopen("sd", dev, fmt, &sd->dk_slices, &label, sdstrategy1,
(ds_setgeom_t *)NULL, &sd_bdevsw, &sd_cdevsw);
if (errcode != 0)
- goto bad;
+ goto close;
#endif /* !SLICE */
SC_DEBUG(sc_link, SDEV_DB3, ("Slice tables initialized "));
@@ -439,8 +492,13 @@ sd_open(dev, mode, fmt, p, sc_link)
scsi_device_unlock(sc_link);
return 0;
-bad:
- if (!dsisopen(sd->dk_slices)) {
+close:
+#ifndef SLICE
+ if (!dsisopen(sd->dk_slices))
+#else
+ if((sd->slice->flags & SLF_OPEN_STATE) == SLF_CLOSED)
+#endif
+ {
scsi_prevent(sc_link, PR_ALLOW, SCSI_ERR_OK | SCSI_SILENT);
sc_link->flags &= ~SDEV_OPEN;
}
@@ -448,17 +506,13 @@ bad:
return errcode;
}
+#ifndef SLICE
/*
* close the device.. only called if we are the LAST occurence of an open
* device. Convenient now but usually a pain.
*/
static errval
-sd_close(dev, fflag, fmt, p, sc_link)
- dev_t dev;
- int fflag;
- int fmt;
- struct proc *p;
- struct scsi_link *sc_link;
+sd_close(dev_t dev,int mode, int fmt, struct proc *p, struct scsi_link *sc_link)
{
struct scsi_data *sd;
errval errcode;
@@ -467,18 +521,15 @@ sd_close(dev, fflag, fmt, p, sc_link)
errcode = scsi_device_lock(sc_link);
if (errcode)
return errcode;
-#ifndef SLICE
dsclose(dev, fmt, sd->dk_slices);
if (!dsisopen(sd->dk_slices)) {
scsi_prevent(sc_link, PR_ALLOW, SCSI_SILENT | SCSI_ERR_OK);
sc_link->flags &= ~SDEV_OPEN;
}
-#endif /* ! SLICE */
scsi_device_unlock(sc_link);
return (0);
}
-#ifndef SLICE
/*
* Actually translate the requested transfer into one the physical driver
* can understand. The transfer is described by a buf and will include
@@ -1298,32 +1349,4 @@ bad:
biodone(bp);
return;
}
-
-
-static int
-sdsopen(void *private, int flags, int mode, struct proc *p)
-{
- struct scsi_data *sd;
-
- sd = private;
-
- if ((flags & (FREAD|FWRITE)) == 0) {
- return(sdclose(makedev(0,sd->mynor), 0 , 0, p));
- } else {
- return(sdopen(makedev(0,sd->mynor), 0 , 0, p));
- }
-}
-
-#if 0
-static void
-sdsclose(void *private, int flags, int mode, struct proc *p)
-{
- struct scsi_data *sd;
-
- sd = private;
-
- sdclose(makedev(0,sd->mynor), 0 , 0, p);
- return;
-}
-#endif /* 0 */
#endif
OpenPOWER on IntegriCloud