123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /*
- * Storage Device.
- */
- typedef struct SDev SDev;
- typedef struct SDifc SDifc;
- typedef struct SDpart SDpart;
- typedef struct SDreq SDreq;
- typedef struct SDunit SDunit;
- typedef struct SDpart {
- Devsize start;
- Devsize end;
- char name[NAMELEN];
- char user[NAMELEN];
- ulong perm;
- int valid;
- void *crud;
- } SDpart;
- typedef struct SDunit {
- SDev* dev;
- int subno;
- uchar inquiry[256]; /* format follows SCSI spec */
- char name[NAMELEN];
- Rendez rendez;
- QLock ctl;
- Devsize sectors; /* not Off: even 32-bit fs can have big disks */
- ulong secsize;
- SDpart* part;
- int npart; /* of valid partitions */
- int changed;
- QLock raw;
- int state;
- ulong pid;
- SDreq* req;
- } SDunit;
- typedef struct SDev {
- SDifc* ifc; /* pnp/legacy */
- void *ctlr;
- int idno;
- int index; /* into unit space */
- int nunit;
- SDev* next;
- QLock; /* enable/disable */
- int enabled;
- } SDev;
- typedef struct SDifc {
- char* name;
- SDev* (*pnp)(void);
- SDev* (*legacy)(int, int);
- SDev* (*id)(SDev*);
- int (*enable)(SDev*);
- int (*disable)(SDev*);
- int (*verify)(SDunit*);
- int (*online)(SDunit*);
- int (*rio)(SDreq*);
- int (*rctl)(SDunit*, char*, int);
- int (*wctl)(SDunit*, void*);
- long (*bio)(SDunit*, int, int, void*, long, Off);
- } SDifc;
- typedef struct SDreq {
- SDunit* unit;
- int lun;
- int write;
- uchar cmd[16];
- int clen;
- void* data;
- int dlen;
- int flags;
- int status;
- long rlen;
- uchar sense[256];
- } SDreq;
- enum {
- SDnosense = 0x00000001,
- SDvalidsense = 0x00010000,
- };
- 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,
- };
- /* sdscsi.c */
- extern int scsiverify(SDunit*);
- extern int scsionline(SDunit*);
- extern long scsibio(SDunit*, int, int, void*, long, Off);
- extern SDev* scsiid(SDev*, SDifc*);
- extern long sdbio(SDunit *unit, SDpart *pp, void *a, long len, Off off);
- void partition(SDunit*);
- void addpartconf(SDunit*);
- SDpart* sdfindpart(SDunit*, char*);
- void sdaddpart(SDunit*, char*, Devsize, Devsize);
- void* sdmalloc(void*, ulong);
- enum {
- IrqATA0 = 14,
- IrqATA1,
- };
|