174a4d8c2SCharles.Forsyth /* 274a4d8c2SCharles.Forsyth * Storage Device. 374a4d8c2SCharles.Forsyth */ 474a4d8c2SCharles.Forsyth typedef struct SDev SDev; 574a4d8c2SCharles.Forsyth typedef struct SDifc SDifc; 674a4d8c2SCharles.Forsyth typedef struct SDpart SDpart; 774a4d8c2SCharles.Forsyth typedef struct SDreq SDreq; 874a4d8c2SCharles.Forsyth typedef struct SDunit SDunit; 974a4d8c2SCharles.Forsyth 1074a4d8c2SCharles.Forsyth typedef struct SDpart { 11*8a8c2d74SCharles.Forsyth uvlong start; 12*8a8c2d74SCharles.Forsyth uvlong end; 1374a4d8c2SCharles.Forsyth char name[NAMELEN]; 1474a4d8c2SCharles.Forsyth char user[NAMELEN]; 1574a4d8c2SCharles.Forsyth ulong perm; 1674a4d8c2SCharles.Forsyth int valid; 1774a4d8c2SCharles.Forsyth void *crud; 1874a4d8c2SCharles.Forsyth } SDpart; 1974a4d8c2SCharles.Forsyth 2074a4d8c2SCharles.Forsyth typedef struct SDunit { 2174a4d8c2SCharles.Forsyth SDev* dev; 2274a4d8c2SCharles.Forsyth int subno; 2374a4d8c2SCharles.Forsyth uchar inquiry[256]; /* format follows SCSI spec */ 2474a4d8c2SCharles.Forsyth char name[NAMELEN]; 2574a4d8c2SCharles.Forsyth // Rendez rendez; 2674a4d8c2SCharles.Forsyth 2774a4d8c2SCharles.Forsyth // QLock ctl; 28*8a8c2d74SCharles.Forsyth uvlong sectors; 2974a4d8c2SCharles.Forsyth ulong secsize; 3074a4d8c2SCharles.Forsyth SDpart* part; 3174a4d8c2SCharles.Forsyth int npart; /* of valid partitions */ 3274a4d8c2SCharles.Forsyth int changed; 3374a4d8c2SCharles.Forsyth 3474a4d8c2SCharles.Forsyth // QLock raw; 3574a4d8c2SCharles.Forsyth int state; 3674a4d8c2SCharles.Forsyth ulong pid; 3774a4d8c2SCharles.Forsyth SDreq* req; 3874a4d8c2SCharles.Forsyth } SDunit; 3974a4d8c2SCharles.Forsyth 4074a4d8c2SCharles.Forsyth typedef struct SDev { 4174a4d8c2SCharles.Forsyth SDifc* ifc; /* pnp/legacy */ 4274a4d8c2SCharles.Forsyth void *ctlr; 4374a4d8c2SCharles.Forsyth int idno; 4474a4d8c2SCharles.Forsyth int index; /* into unit space */ 4574a4d8c2SCharles.Forsyth int nunit; 4674a4d8c2SCharles.Forsyth SDev* next; 4774a4d8c2SCharles.Forsyth 4874a4d8c2SCharles.Forsyth // QLock; /* enable/disable */ 4974a4d8c2SCharles.Forsyth int enabled; 5074a4d8c2SCharles.Forsyth } SDev; 5174a4d8c2SCharles.Forsyth 5274a4d8c2SCharles.Forsyth typedef struct SDifc { 5374a4d8c2SCharles.Forsyth char* name; 5474a4d8c2SCharles.Forsyth 5574a4d8c2SCharles.Forsyth SDev* (*pnp)(void); 5674a4d8c2SCharles.Forsyth SDev* (*legacy)(int, int); 5774a4d8c2SCharles.Forsyth SDev* (*id)(SDev*); 5874a4d8c2SCharles.Forsyth int (*enable)(SDev*); 5974a4d8c2SCharles.Forsyth int (*disable)(SDev*); 6074a4d8c2SCharles.Forsyth 6174a4d8c2SCharles.Forsyth int (*verify)(SDunit*); 6274a4d8c2SCharles.Forsyth int (*online)(SDunit*); 6374a4d8c2SCharles.Forsyth int (*rio)(SDreq*); 6474a4d8c2SCharles.Forsyth int (*rctl)(SDunit*, char*, int); 6574a4d8c2SCharles.Forsyth int (*wctl)(SDunit*, void*); 6674a4d8c2SCharles.Forsyth 6774a4d8c2SCharles.Forsyth long (*bio)(SDunit*, int, int, void*, long, long); 6874a4d8c2SCharles.Forsyth } SDifc; 6974a4d8c2SCharles.Forsyth 7074a4d8c2SCharles.Forsyth typedef struct SDreq { 7174a4d8c2SCharles.Forsyth SDunit* unit; 7274a4d8c2SCharles.Forsyth int lun; 7374a4d8c2SCharles.Forsyth int write; 7474a4d8c2SCharles.Forsyth uchar cmd[16]; 7574a4d8c2SCharles.Forsyth int clen; 7674a4d8c2SCharles.Forsyth void* data; 7774a4d8c2SCharles.Forsyth int dlen; 7874a4d8c2SCharles.Forsyth 7974a4d8c2SCharles.Forsyth int flags; 8074a4d8c2SCharles.Forsyth 8174a4d8c2SCharles.Forsyth int status; 8274a4d8c2SCharles.Forsyth long rlen; 8374a4d8c2SCharles.Forsyth uchar sense[256]; 8474a4d8c2SCharles.Forsyth } SDreq; 8574a4d8c2SCharles.Forsyth 8674a4d8c2SCharles.Forsyth enum { 8774a4d8c2SCharles.Forsyth SDnosense = 0x00000001, 8874a4d8c2SCharles.Forsyth SDvalidsense = 0x00010000, 8974a4d8c2SCharles.Forsyth }; 9074a4d8c2SCharles.Forsyth 9174a4d8c2SCharles.Forsyth enum { 9274a4d8c2SCharles.Forsyth SDmalloc = -4, 9374a4d8c2SCharles.Forsyth SDeio = -3, 9474a4d8c2SCharles.Forsyth SDtimeout = -2, 9574a4d8c2SCharles.Forsyth SDnostatus = -1, 9674a4d8c2SCharles.Forsyth 9774a4d8c2SCharles.Forsyth SDok = 0, 9874a4d8c2SCharles.Forsyth 9974a4d8c2SCharles.Forsyth SDcheck = 0x02, /* check condition */ 10074a4d8c2SCharles.Forsyth SDbusy = 0x08, /* busy */ 10174a4d8c2SCharles.Forsyth 10274a4d8c2SCharles.Forsyth SDmaxio = 2048*1024, 10374a4d8c2SCharles.Forsyth SDnpart = 16, 10474a4d8c2SCharles.Forsyth }; 10574a4d8c2SCharles.Forsyth 10674a4d8c2SCharles.Forsyth /* sdscsi.c */ 10774a4d8c2SCharles.Forsyth extern int scsiverify(SDunit*); 10874a4d8c2SCharles.Forsyth extern int scsionline(SDunit*); 10974a4d8c2SCharles.Forsyth extern long scsibio(SDunit*, int, int, void*, long, long); 11074a4d8c2SCharles.Forsyth extern SDev* scsiid(SDev*, SDifc*); 11174a4d8c2SCharles.Forsyth 11274a4d8c2SCharles.Forsyth #define IrqATA0 14 11374a4d8c2SCharles.Forsyth #define IrqATA1 15 11474a4d8c2SCharles.Forsyth #define qlock(i) while(0) 11574a4d8c2SCharles.Forsyth #define qunlock(i) while(0) 11674a4d8c2SCharles.Forsyth 11774a4d8c2SCharles.Forsyth #define putstrn consputs 11874a4d8c2SCharles.Forsyth 11974a4d8c2SCharles.Forsyth void sleep(void*, int(*)(void*), void*); 12074a4d8c2SCharles.Forsyth void tsleep(void*, int(*)(void*), void*, int); 12174a4d8c2SCharles.Forsyth #define wakeup(x) while(0) 12274a4d8c2SCharles.Forsyth extern long sdbio(SDunit *unit, SDpart *pp, void *a, long len, vlong off); 12374a4d8c2SCharles.Forsyth void partition(SDunit*); 12474a4d8c2SCharles.Forsyth SDpart* sdfindpart(SDunit*, char*); 125*8a8c2d74SCharles.Forsyth void sdaddpart(SDunit*, char*, uvlong, uvlong); 12674a4d8c2SCharles.Forsyth void* sdmalloc(void*, ulong); 127