blob: 13f5e064e98925ab65229cda0e379e49976588b9 [file] [log] [blame]
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
/*
* Storage Device.
*/
struct devconf;
struct sdev;
struct sdifc;
struct sdio;
struct sdpart;
struct sdperm;
struct sdreq;
struct sdunit;
struct sdperm {
char *name;
char *user;
uint32_t perm;
};
struct sdpart {
uint64_t start;
uint64_t end;
struct sdperm sdperm;
int valid;
uint32_t vers;
};
struct sdunit {
struct sdev *dev;
int subno;
unsigned char inquiry[255]; /* format follows SCSI spec */
unsigned char sense[18]; /* format follows SCSI spec */
struct sdperm sdperm;
qlock_t ctl;
uint64_t sectors;
uint32_t secsize;
struct sdpart *part; /* nil or array of size npart */
int npart;
uint32_t vers;
struct sdperm ctlperm;
qlock_t raw; /* raw read or write in progress */
uint32_t rawinuse; /* really just a test-and-set */
int state;
struct sdreq *req;
struct sdperm rawperm;
};
/*
* Each controller is represented by a struct sdev.
*/
struct sdev {
struct kref r; /* Number of callers using device */
struct sdifc *ifc; /* pnp/legacy */
void *ctlr;
int idno;
char name[8];
struct sdev *next;
qlock_t ql; /* enable/disable */
int enabled;
int nunit; /* Number of units */
qlock_t unitlock; /* `Loading' of units */
int *unitflg; /* Unit flags */
struct sdunit **unit;
};
struct sdifc {
char *name;
struct sdev *(*pnp)(void);
struct sdev *(*legacy)(int, int);
int (*enable)(struct sdev *);
int (*disable)(struct sdev *);
int (*verify)(struct sdunit *);
int (*online)(struct sdunit *);
int (*rio)(struct sdreq *);
int (*rctl)(struct sdunit *, char *, int);
int (*wctl)(struct sdunit *, struct cmdbuf *);
int32_t (*bio)(struct sdunit *, int, int, void *, int32_t, uint64_t);
struct sdev *(*probe)(struct devconf *);
void (*clear)(struct sdev *);
char *(*rtopctl)(struct sdev *, char *, char *);
int (*wtopctl)(struct sdev *, struct cmdbuf *);
};
struct sdreq {
struct sdunit *unit;
int lun;
int write;
unsigned char cmd[16];
int clen;
void *data;
int dlen;
int flags;
int status;
int32_t rlen;
unsigned char sense[256];
};
enum {
SDnosense = 0x00000001,
SDvalidsense = 0x00010000,
SDinq0periphqual = 0xe0,
SDinq0periphtype = 0x1f,
SDinq1removable = 0x80,
/* periphtype values */
SDperdisk = 0, /* Direct access (disk) */
SDpertape = 1, /* Sequential eg, tape */
SDperpr = 2, /* Printer */
SDperworm = 4, /* Worm */
SDpercd = 5, /* CD-ROM */
SDpermo = 7, /* rewriteable MO */
SDperjuke = 8, /* medium-changer */
};
enum {
SDretry = -5, /* internal to controllers */
SDmalloc = -4,
SDeio = -3,
SDtimeout = -2,
SDnostatus = -1,
SDok = 0,
SDcheck = 0x02, /* check condition */
SDbusy = 0x08, /* busy */
SDmaxio = 2048 * 1024,
SDnpart = 16,
};
/*
* mmc/sd/sdio host controller interface
*/
struct sdio {
char *name;
int (*init)(void);
void (*enable)(void);
int (*inquiry)(char *, int);
int (*cmd)(uint32_t, uint32_t, uint32_t *);
void (*iosetup)(int, void *, int, int);
void (*io)(int, unsigned char *, int);
};
extern struct sdio sdio;
/* devsd.c */
extern void sdadddevs(struct sdev *);
extern void sdaddconf(struct sdunit *);
extern void sdaddallconfs(void (*f)(struct sdunit *));
extern void sdaddpart(struct sdunit *, char *, uint64_t, uint64_t);
extern int sdsetsense(struct sdreq *, int, int, int, int);
extern int sdmodesense(struct sdreq *, unsigned char *, void *, int);
extern int sdfakescsi(struct sdreq *, void *, int);
/* sdscsi.c */
extern int scsiverify(struct sdunit *);
extern int scsionline(struct sdunit *);
extern int32_t scsibio(struct sdunit *, int, int, void *, int32_t, uint64_t);
extern struct sdev *scsiid(struct sdev *, struct sdifc *);
/*
* hardware info about a device
*/
struct devport {
uint32_t port;
int size;
};
struct devconf {
uint32_t intnum; /* interrupt number */
char *type; /* card type, malloced */
int nports; /* Number of ports */
struct devport *ports; /* The ports themselves */
};