mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 08:43:19 -04:00
Moved unit definitions out of scsiconf.h;
Added CONTROL device that only does user-ioctl and nothing else; Added protection so user-ioctl requires write access; Clean up scsiconf.h a little. It needs more work.
This commit is contained in:
parent
5604568b64
commit
7d613f6a39
12 changed files with 188 additions and 214 deletions
|
|
@ -14,7 +14,7 @@
|
|||
*
|
||||
* Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
|
||||
*
|
||||
* $Id: cd.c,v 1.38 1995/04/14 15:10:24 dufault Exp $
|
||||
* $Id: cd.c,v 1.39 1995/04/23 22:07:48 gibbs Exp $
|
||||
*/
|
||||
|
||||
#define SPLCD splbio
|
||||
|
|
@ -58,6 +58,9 @@ static errval cd_getdisklabel __P((u_int8));
|
|||
|
||||
int32 cdstrats, cdqueues;
|
||||
|
||||
#define CDUNIT(DEV) ((minor(DEV)&0xF8) >> 3) /* 5 bit unit */
|
||||
#define CDSETUNIT(DEV, U) makedev(major(DEV), ((U) << 3))
|
||||
|
||||
#define PAGESIZ 4096
|
||||
#define SECSIZE 2048 /* XXX */ /* default only */
|
||||
#define CDOUTSTANDING 2
|
||||
|
|
@ -872,7 +875,7 @@ struct scsi_link *sc_link)
|
|||
return (cd_reset(unit));
|
||||
break;
|
||||
default:
|
||||
if(part == RAW_PART || SCSI_SUPER(dev))
|
||||
if(part == RAW_PART)
|
||||
error = scsi_do_ioctl(dev, cmd, addr, flag, p, sc_link);
|
||||
else
|
||||
error = ENOTTY;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
* Written by grefen@?????
|
||||
* Based on scsi drivers by Julian Elischer (julian@tfs.com)
|
||||
*
|
||||
* $Id: ch.c,v 1.17 1995/03/28 07:57:22 bde Exp $
|
||||
* $Id: ch.c,v 1.18 1995/04/14 15:10:26 dufault Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
|
@ -34,6 +34,9 @@ errval ch_position __P((u_int32 unit, short *stat, u_int32 chm, u_int32 to,
|
|||
|
||||
#define CHRETRIES 2
|
||||
|
||||
#define CHUNIT(DEV) ((minor(DEV)&0xF0) >> 4) /* 4 bit unit. */
|
||||
#define CHSETUNIT(DEV, U) makedev(major(DEV), ((U) << 4))
|
||||
|
||||
#define MODE(z) ( (minor(z) & 0x0F) )
|
||||
|
||||
#define ESUCCESS 0
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: pt.c,v 1.2 1995/04/14 15:10:28 dufault Exp $
|
||||
* $Id: pt.c,v 1.3 1995/04/23 22:07:49 gibbs Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
@ -178,7 +178,7 @@ pt_strategy(struct buf *bp, struct scsi_link *sc_link)
|
|||
u_int32 opri;
|
||||
struct scsi_data *pt;
|
||||
|
||||
unit = STUNIT((bp->b_dev));
|
||||
unit = minor((bp->b_dev));
|
||||
pt = sc_link->sd;
|
||||
|
||||
opri = splbio();
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: scsi_driver.c,v 1.7 1995/03/21 11:21:02 dufault Exp $
|
||||
* $Id: scsi_driver.c,v 1.8 1995/04/14 15:10:33 dufault Exp $
|
||||
*
|
||||
*/
|
||||
#include <sys/types.h>
|
||||
|
|
@ -45,6 +45,7 @@
|
|||
#include <sys/buf.h>
|
||||
#include <sys/devconf.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
#include <machine/cpu.h> /* XXX For bootverbose (funny place) */
|
||||
|
||||
|
|
@ -75,9 +76,8 @@ int scsi_device_attach(struct scsi_link *sc_link)
|
|||
dev_t dev;
|
||||
struct scsi_device *device = sc_link->device;
|
||||
|
||||
if (bootverbose) {
|
||||
if (bootverbose)
|
||||
sc_link->flags |= SDEV_BOOTVERBOSE;
|
||||
}
|
||||
|
||||
SC_DEBUG(sc_link, SDEV_DB2,
|
||||
("%s%dattach: ", device->name, sc_link->dev_unit));
|
||||
|
|
@ -122,20 +122,20 @@ struct scsi_device *device)
|
|||
if (sc_link == 0 || sc_link->sd == 0)
|
||||
return ENXIO;
|
||||
|
||||
errcode = (device->dev_open) ?
|
||||
(*device->dev_open)(dev, flags, fmt, p, sc_link) : 0;
|
||||
/* If it is a "once only" device that is already open return EBUSY.
|
||||
*/
|
||||
if ((sc_link->flags & SDEV_ONCE_ONLY) && (sc_link->flags & SDEV_IS_OPEN))
|
||||
return EBUSY;
|
||||
|
||||
if (errcode == 0 && (sc_link->flags & SDEV_ONCE_ONLY)) {
|
||||
/*
|
||||
* Only allow one at a time
|
||||
*/
|
||||
if (sc_link->flags & SDEV_OPEN) {
|
||||
errcode = EBUSY;
|
||||
}
|
||||
else {
|
||||
sc_link->flags |= SDEV_OPEN;
|
||||
}
|
||||
}
|
||||
/* For the control device (user ioctl's only) don't call the open
|
||||
* entry.
|
||||
*/
|
||||
if (SCSI_CONTROL(dev) || (device->dev_open == 0))
|
||||
errcode = 0;
|
||||
else
|
||||
errcode = (*device->dev_open)(dev, flags, fmt, p, sc_link);
|
||||
|
||||
sc_link->flags |= SDEV_IS_OPEN;
|
||||
|
||||
SC_DEBUG(sc_link, SDEV_DB1, ("%sopen: dev=0x%lx (unit %ld) result %d\n",
|
||||
device->name, dev, unit, errcode));
|
||||
|
|
@ -143,38 +143,36 @@ struct scsi_device *device)
|
|||
return errcode;
|
||||
}
|
||||
|
||||
/*
|
||||
* close the device.. only called if we are the LAST
|
||||
* occurence of an open device
|
||||
*/
|
||||
int
|
||||
scsi_close(dev_t dev, int flags, int fmt, struct proc *p,
|
||||
struct scsi_device *device)
|
||||
{
|
||||
errval errcode;
|
||||
struct scsi_link *scsi_link = SCSI_LINK(device, GETUNIT(device, dev));
|
||||
struct scsi_link *sc_link = SCSI_LINK(device, GETUNIT(device, dev));
|
||||
|
||||
SC_DEBUG(scsi_link, SDEV_DB1, ("%sclose: Closing device\n", device->name));
|
||||
SC_DEBUG(sc_link, SDEV_DB1, ("%sclose: Closing device\n", device->name));
|
||||
|
||||
errcode = (device->dev_close) ?
|
||||
(*device->dev_close)(dev, flags, fmt, p, scsi_link) : 0;
|
||||
if (SCSI_CONTROL(dev) || (device->dev_close == 0))
|
||||
errcode = 0;
|
||||
else
|
||||
errcode = (*device->dev_close)(dev, flags, fmt, p, sc_link);
|
||||
|
||||
if (scsi_link->flags & SDEV_ONCE_ONLY)
|
||||
scsi_link->flags &= ~SDEV_OPEN;
|
||||
sc_link->flags &= ~SDEV_IS_OPEN;
|
||||
|
||||
return errcode;
|
||||
}
|
||||
|
||||
int
|
||||
scsi_ioctl(dev_t dev, u_int32 cmd, caddr_t arg, int mode, struct proc *p,
|
||||
scsi_ioctl(dev_t dev, u_int32 cmd, caddr_t arg, int flags, struct proc *p,
|
||||
struct scsi_device *device)
|
||||
{
|
||||
errval errcode;
|
||||
struct scsi_link *scsi_link = SCSI_LINK(device, GETUNIT(device, dev));
|
||||
struct scsi_link *sc_link = SCSI_LINK(device, GETUNIT(device, dev));
|
||||
|
||||
errcode = (device->dev_ioctl) ?
|
||||
(*device->dev_ioctl)(dev, cmd, arg, mode, p, scsi_link)
|
||||
: scsi_do_ioctl(dev, cmd, arg, mode, p, scsi_link);
|
||||
if (SCSI_CONTROL(dev) || (device->dev_ioctl == 0))
|
||||
errcode = scsi_do_ioctl(dev, cmd, arg, flags, p, sc_link);
|
||||
else
|
||||
errcode = (*device->dev_ioctl)(dev, cmd, arg, flags, p, sc_link);
|
||||
|
||||
return errcode;
|
||||
}
|
||||
|
|
@ -196,16 +194,24 @@ scsi_strategy(struct buf *bp, struct scsi_device *device)
|
|||
SC_DEBUG(sc_link, SDEV_DB1, ("%ld bytes @ blk%ld\n",
|
||||
bp->b_bcount, bp->b_blkno));
|
||||
|
||||
bp->b_resid = 0;
|
||||
bp->b_error = 0;
|
||||
|
||||
if (bp->b_bcount == 0)
|
||||
if (SCSI_CONTROL(bp->b_dev) || (device->dev_strategy == 0))
|
||||
{
|
||||
bp->b_resid = bp->b_bcount;
|
||||
bp->b_error = EIO;
|
||||
bp->b_flags |= B_ERROR;
|
||||
biodone(bp);
|
||||
}
|
||||
else if (device->dev_strategy)
|
||||
else
|
||||
{
|
||||
(*sc_link->adapter->scsi_minphys)(bp);
|
||||
(*device->dev_strategy)(bp, sc_link);
|
||||
bp->b_resid = 0;
|
||||
bp->b_error = 0;
|
||||
|
||||
if (bp->b_bcount == 0)
|
||||
biodone(bp);
|
||||
else
|
||||
{
|
||||
(*sc_link->adapter->scsi_minphys)(bp);
|
||||
(*device->dev_strategy)(bp, sc_link);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,4 @@
|
|||
/*
|
||||
*Begin copyright
|
||||
*
|
||||
* Copyright (C) 1992, 1993, 1994, HD Associates, Inc.
|
||||
* PO Box 276
|
||||
* Pepperell, MA 01463
|
||||
|
|
@ -38,7 +36,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*End copyright
|
||||
*
|
||||
* $Id: scsi_ioctl.c,v 1.12 1995/03/04 20:50:55 dufault Exp $
|
||||
* $Id: scsi_ioctl.c,v 1.13 1995/04/14 15:10:35 dufault Exp $
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
|
@ -47,8 +45,11 @@
|
|||
#include <sys/errno.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/buf.h>
|
||||
|
||||
#define b_screq b_driver1 /* a patch in buf.h */
|
||||
#define b_sc_link b_driver2 /* a patch in buf.h */
|
||||
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/proc.h>
|
||||
#include <vm/vm.h>
|
||||
|
||||
|
|
@ -245,11 +246,17 @@ void scsiminphys(struct buf *bp)
|
|||
* If user-level type command, we must still be running
|
||||
* in the context of the calling process
|
||||
*/
|
||||
errval scsi_do_ioctl(dev_t dev, int cmd, caddr_t addr, int f,
|
||||
errval scsi_do_ioctl(dev_t dev, int cmd, caddr_t addr, int flags,
|
||||
struct proc *p, struct scsi_link *sc_link)
|
||||
{
|
||||
errval ret = 0;
|
||||
|
||||
/* If we can't write the device we can't permit much:
|
||||
*/
|
||||
|
||||
if (cmd != SCIOCIDENTIFY && !(flags & FWRITE))
|
||||
return EACCES;
|
||||
|
||||
SC_DEBUG(sc_link,SDEV_DB2,("scsi_do_ioctl(0x%x)\n",cmd));
|
||||
switch(cmd)
|
||||
{
|
||||
|
|
@ -345,6 +352,7 @@ struct proc *p, struct scsi_link *sc_link)
|
|||
case SCIOCDECONFIG:
|
||||
ret = EINVAL;
|
||||
break;
|
||||
|
||||
case SCIOCIDENTIFY:
|
||||
{
|
||||
struct scsi_addr *sca = (struct scsi_addr *) addr;
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
*
|
||||
* New configuration setup: dufault@hda.com
|
||||
*
|
||||
* $Id: scsiconf.c,v 1.27 1995/04/14 15:10:37 dufault Exp $
|
||||
* $Id: scsiconf.c,v 1.28 1995/04/23 07:47:10 bde Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
|
@ -70,13 +70,20 @@ static void *extend_alloc(size_t s)
|
|||
|
||||
static void extend_free(void *p) { free(p, M_DEVBUF); }
|
||||
|
||||
#define EXTEND_CHUNK 8
|
||||
/* EXTEND_CHUNK: Number of extend slots to allocate whenever we need a new
|
||||
* one.
|
||||
*/
|
||||
#ifndef EXTEND_CHUNK
|
||||
#define EXTEND_CHUNK 8
|
||||
#endif
|
||||
|
||||
struct extend_array *extend_new(void)
|
||||
{
|
||||
struct extend_array *p = extend_alloc(sizeof(*p));
|
||||
p->nelem = 0;
|
||||
p->ps = 0;
|
||||
if (p) {
|
||||
p->nelem = 0;
|
||||
p->ps = 0;
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
|
@ -126,7 +133,7 @@ void extend_release(struct extend_array *ea, int index)
|
|||
* This extend_array holds an array of "scsibus_data" pointers.
|
||||
* One of these is allocated and filled in for each scsi bus.
|
||||
* it holds pointers to allow the scsi bus to get to the driver
|
||||
* That is running each LUN on the bus
|
||||
* that is running each LUN on the bus
|
||||
* it also has a template entry which is the prototype struct
|
||||
* supplied by the adapter driver, this is used to initialise
|
||||
* the others, before they have the rest of the fields filled in
|
||||
|
|
@ -588,8 +595,8 @@ void scsi_configure_finish(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* The routine called by the adapter boards to get all their
|
||||
* devices configured in.
|
||||
* scsi_attachdevs is the routine called by the adapter boards
|
||||
* to get all their devices configured in.
|
||||
*/
|
||||
void
|
||||
scsi_attachdevs(sc_link_proto)
|
||||
|
|
@ -971,7 +978,8 @@ scsi_probedev(sc_link, maybe_more, type_p)
|
|||
u_int8 target = sc_link->target;
|
||||
u_int8 lu = sc_link->lun;
|
||||
struct scsidevs *bestmatch = (struct scsidevs *) 0;
|
||||
char *dtype = (char *) 0, *desc;
|
||||
int dtype = 0;
|
||||
char *desc;
|
||||
char *qtype;
|
||||
struct scsi_inquiry_data *inqbuf;
|
||||
u_int32 len, qualifier, type;
|
||||
|
|
@ -1053,7 +1061,7 @@ scsi_probedev(sc_link, maybe_more, type_p)
|
|||
return (struct scsidevs *) 0;
|
||||
|
||||
default:
|
||||
dtype = "";
|
||||
dtype = 1;
|
||||
qtype = "Vendor specific peripheral qualifier";
|
||||
*maybe_more = 1;
|
||||
break;
|
||||
|
|
@ -1064,7 +1072,7 @@ scsi_probedev(sc_link, maybe_more, type_p)
|
|||
*maybe_more = 1;
|
||||
return (struct scsidevs *) 0;
|
||||
}
|
||||
dtype = scsi_type_long_name(type);
|
||||
dtype = 1;
|
||||
}
|
||||
/*
|
||||
* Then if it's advanced enough, more detailed
|
||||
|
|
@ -1288,43 +1296,3 @@ scsi_externalize(struct scsi_link *sl, void *userp, size_t *lenp)
|
|||
|
||||
return copyout(sl, userp, sizeof *sl);
|
||||
}
|
||||
|
||||
/* XXX dufault@hda.com:
|
||||
* having this table of names conflicts with our decision
|
||||
* that all type information be contained in a type driver.
|
||||
*/
|
||||
static struct {char *name; char *long_name; } types[] = {
|
||||
{ "sd", "direct" },
|
||||
{ "st", "sequential" },
|
||||
{ "prn", "printer" },
|
||||
{ "proc", "processor" },
|
||||
{ "worm", "worm" },
|
||||
{ "cd", "readonly" },
|
||||
{ "scan", "scanner" },
|
||||
{ "opmem", "optical" },
|
||||
{ "ch", "changer" },
|
||||
{ "comm", "communication" },
|
||||
{ "asc0", "ASC-0" },
|
||||
{ "asc1", "ASC-1" },
|
||||
{ "uk", "unknown" },
|
||||
{ "inval", "invalid" },
|
||||
};
|
||||
|
||||
char *
|
||||
scsi_type_name(int type)
|
||||
{
|
||||
if (type >= 0 && type < (sizeof(types) / sizeof(types[0])))
|
||||
return types[type].name;
|
||||
|
||||
return "inval";
|
||||
}
|
||||
|
||||
char *
|
||||
scsi_type_long_name(int type)
|
||||
{
|
||||
if (type >= 0 && type < (sizeof(types) / sizeof(types[0])))
|
||||
return types[type].long_name;
|
||||
|
||||
return "invalid";
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
*
|
||||
* Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
|
||||
*
|
||||
* $Id: scsiconf.h,v 1.23 1995/04/23 07:47:12 bde Exp $
|
||||
* $Id: scsiconf.h,v 1.24 1995/04/23 22:07:51 gibbs Exp $
|
||||
*/
|
||||
#ifndef SCSI_SCSICONF_H
|
||||
#define SCSI_SCSICONF_H 1
|
||||
|
|
@ -31,46 +31,6 @@ typedef unsigned char u_int8;
|
|||
#include <scsi/scsi_all.h>
|
||||
#include <scsi/scsi_driver.h>
|
||||
|
||||
/* Minor number fields:
|
||||
*
|
||||
* NON-FIXED SCSI devices:
|
||||
*
|
||||
* ???? ???? ???? ???N MMMMMMMM mmmmmmmm
|
||||
*
|
||||
* ?: Don't know; those bits didn't use to exist, currently always 0.
|
||||
* N: New style device: must be zero.
|
||||
* M: Major device number.
|
||||
* m: old style minor device number.
|
||||
*
|
||||
* FIXED SCSI devices:
|
||||
*
|
||||
* ???? SBBB LLLI IIIN MMMMMMMM mmmmmmmm
|
||||
*
|
||||
* ?: Not used yet.
|
||||
* S: "Super" device; reserved for things like resetting the SCSI bus.
|
||||
* B: Scsi bus
|
||||
* L: Logical unit
|
||||
* I: Scsi target (XXX: Why 16? Why that many in scsiconf.h?)
|
||||
* N: New style device; must be one.
|
||||
* M: Major device number
|
||||
* m: Old style minor device number.
|
||||
*/
|
||||
|
||||
#define SCSI_SUPER(DEV) (((DEV) & 0x08000000) >> 27)
|
||||
#define SCSI_MKSUPER(DEV) ((DEV) | 0x08000000)
|
||||
|
||||
#define SCSI_BUS(DEV) (((DEV) & 0x07000000) >> 24)
|
||||
#define SCSI_LUN(DEV) (((DEV) & 0x00E00000) >> 21)
|
||||
#define SCSI_ID(DEV) (((DEV) & 0x001E0000) >> 17)
|
||||
#define SCSI_FIXED(DEV) (((DEV) & 0x00010000) >> 16)
|
||||
|
||||
|
||||
#define SCSI_MKDEV(B, L, I) ( \
|
||||
((B) << 24) | \
|
||||
((L) << 21) | \
|
||||
((I) << 17) | \
|
||||
( 1 << 16) )
|
||||
|
||||
/*
|
||||
* The following documentation tries to describe the relationship between the
|
||||
* various structures defined in this file:
|
||||
|
|
@ -143,11 +103,11 @@ struct scsi_adapter
|
|||
* driver has its own definition for it.
|
||||
*/
|
||||
struct scsi_data;
|
||||
|
||||
struct scsi_link; /* scsi_link refers to scsi_device and vice-versa */
|
||||
struct scsi_xfer;
|
||||
|
||||
struct proc;
|
||||
struct buf;
|
||||
|
||||
/*
|
||||
* These entry points are called by the low-end drivers to get services from
|
||||
|
|
@ -162,21 +122,21 @@ struct proc;
|
|||
|
||||
struct scsi_device
|
||||
{
|
||||
/* 4*/ errval (*err_handler)(struct scsi_xfer *xs); /* return -1 to say
|
||||
* err processing complete */
|
||||
/* 8*/ void (*start)(u_int32 unit, u_int32 flags);
|
||||
/* 4*/ errval (*err_handler)(struct scsi_xfer *xs); /* return -1 to say
|
||||
* err processing complete */
|
||||
/* 8*/ void (*start)(u_int32 unit, u_int32 flags);
|
||||
/* 12*/ int32 (*async)();
|
||||
/* 16*/ int32 (*done)(); /* returns -1 to say done processing complete */
|
||||
/* 20*/ char *name; /* name of device type */
|
||||
/* 24*/ u_int32 flags; /* device type dependent flags */
|
||||
/* 32*/ int32 spare[2];
|
||||
|
||||
/* 36*/ int32 link_flags; /* Flags OR'd into sc_link at attach time */
|
||||
/* 36*/ int32 link_flags; /* Flags OR'd into sc_link at attach time */
|
||||
/* 40*/ errval (*attach)(struct scsi_link *sc_link);
|
||||
/* 44*/ char *desc; /* Description of device */
|
||||
/* 48*/ int (*open)(dev_t dev, int flags, int fmt, struct proc *p);
|
||||
/* 52*/ int sizeof_scsi_data;
|
||||
/* 56*/ int type; /* Type of device this supports */
|
||||
/* 56*/ int type; /* Type of device this supports */
|
||||
/* 60*/ int (*getunit)(dev_t dev);
|
||||
/* 64*/ dev_t (*setunit)(dev_t dev, int unit);
|
||||
|
||||
|
|
@ -209,32 +169,26 @@ struct scsi_device
|
|||
/* SCSI_DEVICE_ENTRIES: A macro to generate all the entry points from the
|
||||
* name.
|
||||
*/
|
||||
#define SCSI_DEVICE_ENTRIES(NAME) \
|
||||
errval NAME##attach(struct scsi_link *sc_link); \
|
||||
extern struct scsi_device NAME##_switch; \
|
||||
void NAME##init(void) \
|
||||
{ \
|
||||
scsi_device_register(&NAME##_switch); \
|
||||
} \
|
||||
int NAME##open(dev_t dev, int flags, int fmt, struct proc *p) \
|
||||
{ \
|
||||
return scsi_open(dev, flags, fmt, p, &NAME##_switch); \
|
||||
} \
|
||||
int NAME##ioctl(dev_t dev, int cmd, caddr_t addr, int flag, struct proc *p) \
|
||||
{ \
|
||||
return scsi_ioctl(dev, cmd, addr, flag, p, &NAME##_switch); \
|
||||
} \
|
||||
int NAME##close(dev_t dev, int flag, int fmt, struct proc *p) \
|
||||
{ \
|
||||
return scsi_close(dev, flag, fmt, p, &NAME##_switch); \
|
||||
} \
|
||||
void NAME##minphys(struct buf *bp) \
|
||||
{ \
|
||||
scsi_minphys(bp, &NAME##_switch); \
|
||||
#define SCSI_DEVICE_ENTRIES(NAME) \
|
||||
errval NAME##attach(struct scsi_link *sc_link); \
|
||||
extern struct scsi_device NAME##_switch; \
|
||||
void NAME##init(void) { \
|
||||
scsi_device_register(&NAME##_switch); \
|
||||
} \
|
||||
void NAME##strategy(struct buf *bp) \
|
||||
{ \
|
||||
scsi_strategy(bp, &NAME##_switch); \
|
||||
int NAME##open(dev_t dev, int flags, int fmt, struct proc *p) { \
|
||||
return scsi_open(dev, flags, fmt, p, &NAME##_switch); \
|
||||
} \
|
||||
int NAME##ioctl(dev_t dev, int cmd, caddr_t addr, int flag, struct proc *p) { \
|
||||
return scsi_ioctl(dev, cmd, addr, flag, p, &NAME##_switch); \
|
||||
} \
|
||||
int NAME##close(dev_t dev, int flag, int fmt, struct proc *p) { \
|
||||
return scsi_close(dev, flag, fmt, p, &NAME##_switch); \
|
||||
} \
|
||||
void NAME##minphys(struct buf *bp) { \
|
||||
scsi_minphys(bp, &NAME##_switch); \
|
||||
} \
|
||||
void NAME##strategy(struct buf *bp) { \
|
||||
scsi_strategy(bp, &NAME##_switch); \
|
||||
}
|
||||
|
||||
#ifdef KERNEL
|
||||
|
|
@ -348,6 +302,11 @@ struct scsi_link
|
|||
* adapter driver.
|
||||
* XXX-HA And I added the "supports residuals properly" flag that ALSO goes
|
||||
* in an adapter structure. I figure I'll fix both at once.
|
||||
*
|
||||
* XXX SDEV_OPEN is used for two things: To prevent more than one
|
||||
* open and to make unit attentions errors be logged on the console.
|
||||
* These should be split up; I'm adding SDEV_IS_OPEN to enforce one
|
||||
* open only.
|
||||
*/
|
||||
|
||||
#define SDEV_MEDIA_LOADED 0x0001 /* device figures are still valid */
|
||||
|
|
@ -359,6 +318,7 @@ struct scsi_link
|
|||
#define SDEV_BOOTVERBOSE 0x0200 /* be noisy during boot */
|
||||
#define SDEV_RESIDS_WORK 0x0400 /* XXX-HA: Residuals work */
|
||||
#define SDEV_TARGET_OPS 0x0800 /* XXX-HA: Supports target ops */
|
||||
#define SDEV_IS_OPEN 0x1000 /* at least 1 open session */
|
||||
|
||||
/*
|
||||
* One of these is allocated and filled in for each scsi bus.
|
||||
|
|
@ -448,8 +408,6 @@ struct scsi_xfer
|
|||
|
||||
#ifdef KERNEL
|
||||
void *extend_get(struct extend_array *ea, int index);
|
||||
char * scsi_type_long_name(int type);
|
||||
char * scsi_type_name(int type);
|
||||
void scsi_attachdevs __P((struct scsi_link *sc_link_proto));
|
||||
struct scsi_xfer *get_xs( struct scsi_link *sc_link, u_int32 flags);
|
||||
void free_xs(struct scsi_xfer *xs, struct scsi_link *sc_link,u_int32 flags);
|
||||
|
|
@ -516,6 +474,10 @@ void scsi_configure_finish __P((void));
|
|||
#define SCSI_EXTERNALLEN (sizeof(struct scsi_link))
|
||||
|
||||
#ifdef NEW_SCSICONF
|
||||
|
||||
/* XXX This belongs in a tape file.
|
||||
*/
|
||||
|
||||
/**********************************************************************
|
||||
from the scsi2 spec
|
||||
Value Tracks Density(bpi) Code Type Reference Note
|
||||
|
|
@ -578,43 +540,52 @@ void scsi_configure_finish __P((void));
|
|||
#define DAT_1 0x13
|
||||
#endif /* NEW_SCSICONF */
|
||||
|
||||
/* Macros for getting and setting the unit numbers in the original
|
||||
* (not fixed device name) device numbers.
|
||||
/* XXX (dufault@hda.com) This is used only by "su" and "sctarg".
|
||||
* The minor number field conflicts with the disk slice code,
|
||||
* and so it is tough to access the disks through the "su" device.
|
||||
*/
|
||||
#define SH0_UNIT(DEV) (minor(DEV)&0xFF) /* 8 bit unit */
|
||||
#define SH0SETUNIT(DEV, U) makedev(major(DEV), (U))
|
||||
|
||||
#define SH3_UNIT(DEV) ((minor(DEV)&0xF8) >> 3) /* 5 bit unit */
|
||||
#define SH3SETUNIT(DEV, U) makedev(major(DEV), ((U) << 3))
|
||||
|
||||
#define SH4_UNIT(DEV) ((minor(DEV)&0xF0) >> 4) /* 4 bit unit. */
|
||||
#define SH4SETUNIT(DEV, U) makedev(major(DEV), ((U) << 4))
|
||||
|
||||
#define CDUNITSHIFT 3
|
||||
#define CDUNIT(DEV) SH3_UNIT(DEV)
|
||||
#define CDSETUNIT(DEV, U) SH3SETUNIT((DEV), (U))
|
||||
|
||||
#define CHUNIT(DEV) SH4_UNIT(DEV)
|
||||
#define CHSETUNIT(DEV, U) SH4SETUNIT((DEV), (U))
|
||||
|
||||
#define STUNIT(DEV) SH4_UNIT(DEV)
|
||||
#define STSETUNIT(DEV, U) SH4SETUNIT((DEV), (U))
|
||||
|
||||
#define UKUNIT(DEV) SH0_UNIT(DEV)
|
||||
#define UKSETUNIT(DEV, U) SH0SETUNIT((DEV), (U))
|
||||
|
||||
/* Build an old style device number (unit encoded in the minor number)
|
||||
* from a base old one (no flag bits) and a full new one
|
||||
* (BUS, LUN, TARG in the minor number, and flag bits).
|
||||
/* Device number fields:
|
||||
*
|
||||
* OLDDEV has the major number and device unit only. It was constructed
|
||||
* at attach time and is stored in the scsi_link structure.
|
||||
* NON-FIXED SCSI devices:
|
||||
*
|
||||
* NEWDEV can have whatever in it, but only the old control flags and the
|
||||
* super bit are present. IT CAN'T HAVE ANY UNIT INFORMATION or you'll
|
||||
* wind up with the wrong unit.
|
||||
* ?FC? ???? ???? ???? MMMMMMMM mmmmmmmm
|
||||
*
|
||||
* F: Fixed device (nexus in number): must be 0.
|
||||
* C: Control device; only user mode ioctl is supported.
|
||||
* ?: Don't know; those bits didn't use to exist, currently always 0.
|
||||
* M: Major device number.
|
||||
* m: Old style minor device number.
|
||||
*
|
||||
* FIXED SCSI devices:
|
||||
*
|
||||
* XXX Conflicts with the slice code. Maybe the slice code can be
|
||||
* changed to respect the F bit?
|
||||
*
|
||||
* ?FC? ?BBB TTTT ?LLL MMMMMMMM mmmmmmmm
|
||||
*
|
||||
* F: Fixed device (nexus in number); must be 1.
|
||||
* C: Control device; only user mode ioctl is supported.
|
||||
* B: SCSI bus
|
||||
* T: SCSI target ID
|
||||
* L: Logical unit
|
||||
* M: Major device number
|
||||
* m: Old style minor device number.
|
||||
*/
|
||||
#define OLD_DEV(NEWDEV, OLDDEV) ((OLDDEV) | ((NEWDEV) & 0x080000FF))
|
||||
|
||||
#define SCSI_FIXED(DEV) (((DEV) & SCSI_FIXED_MASK))
|
||||
#define SCSI_FIXED_MASK 0x40000000
|
||||
#define SCSI_CONTROL(DEV) (((DEV) & 0x20000000))
|
||||
|
||||
#define SCSI_BUS(DEV) (((DEV) & 0x07000000) >> 24)
|
||||
#define SCSI_ID(DEV) (((DEV) & 0x00F00000) >> 20)
|
||||
#define SCSI_LUN(DEV) (((DEV) & 0x00070000) >> 16)
|
||||
|
||||
#define SCSI_MKFIXED(B, T, L) ( \
|
||||
((B) << 24) | \
|
||||
((T) << 20) | \
|
||||
((L) << 16) | \
|
||||
SCSI_FIXED_MASK )
|
||||
|
||||
#endif /*SCSI_SCSICONF_H*/
|
||||
/* END OF FILE */
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: sctarg.c,v 1.1 1995/03/04 20:50:46 dufault Exp $
|
||||
* $Id: sctarg.c,v 1.1 1995/04/14 15:10:41 dufault Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
@ -236,7 +236,7 @@ sctarg_strategy(struct buf *bp, struct scsi_link *sc_link)
|
|||
u_int32 opri;
|
||||
struct scsi_data *sctarg;
|
||||
|
||||
unit = STUNIT((bp->b_dev));
|
||||
unit = minor((bp->b_dev));
|
||||
sctarg = sc_link->sd;
|
||||
|
||||
opri = splbio();
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
*
|
||||
* Ported to run under 386BSD by Julian Elischer (julian@dialix.oz.au) Sept 1992
|
||||
*
|
||||
* $Id: sd.c,v 1.61 1995/04/29 17:52:44 dufault Exp $
|
||||
* $Id: sd.c,v 1.62 1995/04/30 15:14:34 bde Exp $
|
||||
*/
|
||||
|
||||
#define SPLSD splbio
|
||||
|
|
@ -579,7 +579,7 @@ sd_ioctl(dev_t dev, int cmd, caddr_t addr, int flag, struct proc *p,
|
|||
sdstrategy1, (ds_setgeom_t *)NULL);
|
||||
if (error != -1)
|
||||
return (error);
|
||||
if (PARTITION(dev) != RAW_PART && !SCSI_SUPER(dev))
|
||||
if (PARTITION(dev) != RAW_PART)
|
||||
return (ENOTTY);
|
||||
return (scsi_do_ioctl(dev, cmd, addr, flag, p, sc_link));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* "superscsi" pseudo device. This requires options SCSISUPER.
|
||||
/* "superscsi" pseudo device.
|
||||
* "superscsi" supports general SCSI utilities that can iterate
|
||||
* over all SCSI targets, including those without device entry
|
||||
* points.
|
||||
|
|
@ -49,7 +49,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*End copyright
|
||||
* $Id:$
|
||||
* $Id: ssc.c,v 1.2 1995/01/08 15:56:09 dufault Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
|
@ -85,8 +85,7 @@ int sscioctl(dev_t dev, int cmd, caddr_t data, int fflag, struct proc *p)
|
|||
if (cmd == SCIOCADDR)
|
||||
{
|
||||
struct scsi_addr *sca = (struct scsi_addr *) data;
|
||||
dev_t newdev =
|
||||
SCSI_MKSUPER(SCSI_MKDEV(sca->scbus,sca->lun,sca->target));
|
||||
dev_t newdev = SCSI_MKFIXED(sca->scbus,sca->target,sca->lun);
|
||||
int ret;
|
||||
|
||||
if (sscdev != NODEV)
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
* on the understanding that TFS is not responsible for the correct
|
||||
* functioning of this software in any circumstances.
|
||||
*
|
||||
* $Id: st.c,v 1.33 1995/04/23 22:07:54 gibbs Exp $
|
||||
* $Id: st.c,v 1.34 1995/04/29 21:30:29 joerg Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
@ -53,11 +53,14 @@ u_int32 ststrats, stqueues;
|
|||
#define DEF_FIXED_BSIZE 512
|
||||
#define ST_RETRIES 4 /* only on non IO commands */
|
||||
|
||||
#define STUNIT(DEV) ((minor(DEV)&0xF0) >> 4) /* 4 bit unit. */
|
||||
#define STSETUNIT(DEV, U) makedev(major(DEV), ((U) << 4))
|
||||
|
||||
#define MODE(z) ( (minor(z) & 0x03) )
|
||||
#define DSTY(z) ( ((minor(z) >> 2) & 0x03) )
|
||||
#define CTLMODE 3
|
||||
|
||||
#define IS_CTLMODE(DEV) (MODE(DEV) == CTLMODE || SCSI_SUPER(DEV))
|
||||
#define IS_CTLMODE(DEV) (MODE(DEV) == CTLMODE)
|
||||
|
||||
#define SCSI_2_MAX_DENSITY_CODE 0x17 /* maximum density code specified
|
||||
* in SCSI II spec. */
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*End copyright
|
||||
*
|
||||
* $Id: su.c,v 1.3 1995/01/08 15:56:10 dufault Exp $
|
||||
* $Id: su.c,v 1.4 1995/03/04 20:51:07 dufault Exp $
|
||||
*
|
||||
* Tabstops 4
|
||||
*/
|
||||
|
|
@ -58,6 +58,19 @@
|
|||
#include <sys/buf.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
/* Build an old style device number (unit encoded in the minor number)
|
||||
* from a base old one (no flag bits) and a full new one
|
||||
* (BUS, LUN, TARG in the minor number, and flag bits).
|
||||
*
|
||||
* OLDDEV has the major number and device unit only. It was constructed
|
||||
* at attach time and is stored in the scsi_link structure.
|
||||
*
|
||||
* NEWDEV can have whatever in it, but only the old control flags and the
|
||||
* super bit are present. IT CAN'T HAVE ANY UNIT INFORMATION or you'll
|
||||
* wind up with the wrong unit.
|
||||
*/
|
||||
#define OLD_DEV(NEWDEV, OLDDEV) ((OLDDEV) | ((NEWDEV) & 0x080000FF))
|
||||
|
||||
/* XXX: These are taken from, and perhaps belong in, conf.c
|
||||
*/
|
||||
#define nxopen (d_open_t *)enxio
|
||||
|
|
|
|||
Loading…
Reference in a new issue