180ee5cbfSDavid du Colombier /* 280ee5cbfSDavid du Colombier * Storage Device. 380ee5cbfSDavid du Colombier */ 480ee5cbfSDavid du Colombier typedef struct SDev SDev; 580ee5cbfSDavid du Colombier typedef struct SDifc SDifc; 6*0cc6832dSDavid du Colombier typedef struct SDio SDio; 780ee5cbfSDavid du Colombier typedef struct SDpart SDpart; 880ee5cbfSDavid du Colombier typedef struct SDperm SDperm; 980ee5cbfSDavid du Colombier typedef struct SDreq SDreq; 1080ee5cbfSDavid du Colombier typedef struct SDunit SDunit; 119a747e4fSDavid du Colombier 129a747e4fSDavid du Colombier struct SDperm { 139a747e4fSDavid du Colombier char* name; 149a747e4fSDavid du Colombier char* user; 1580ee5cbfSDavid du Colombier ulong perm; 169a747e4fSDavid du Colombier }; 1780ee5cbfSDavid du Colombier 189a747e4fSDavid du Colombier struct SDpart { 1917629263SDavid du Colombier uvlong start; 2017629263SDavid du Colombier uvlong end; 2180ee5cbfSDavid du Colombier SDperm; 2280ee5cbfSDavid du Colombier int valid; 2380ee5cbfSDavid du Colombier ulong vers; 249a747e4fSDavid du Colombier }; 2580ee5cbfSDavid du Colombier 269a747e4fSDavid du Colombier struct SDunit { 2780ee5cbfSDavid du Colombier SDev* dev; 2880ee5cbfSDavid du Colombier int subno; 29eb2d877eSDavid du Colombier uchar inquiry[255]; /* format follows SCSI spec */ 304de34a7eSDavid du Colombier uchar sense[18]; /* format follows SCSI spec */ 3180ee5cbfSDavid du Colombier SDperm; 3280ee5cbfSDavid du Colombier 3380ee5cbfSDavid du Colombier QLock ctl; 3417629263SDavid du Colombier uvlong sectors; 3580ee5cbfSDavid du Colombier ulong secsize; 3680ee5cbfSDavid du Colombier SDpart* part; /* nil or array of size npart */ 3780ee5cbfSDavid du Colombier int npart; 3880ee5cbfSDavid du Colombier ulong vers; 3980ee5cbfSDavid du Colombier SDperm ctlperm; 4080ee5cbfSDavid du Colombier 4180ee5cbfSDavid du Colombier QLock raw; /* raw read or write in progress */ 429a747e4fSDavid du Colombier ulong rawinuse; /* really just a test-and-set */ 4380ee5cbfSDavid du Colombier int state; 4480ee5cbfSDavid du Colombier SDreq* req; 4580ee5cbfSDavid du Colombier SDperm rawperm; 469a747e4fSDavid du Colombier }; 4780ee5cbfSDavid du Colombier 489a747e4fSDavid du Colombier /* 499a747e4fSDavid du Colombier * Each controller is represented by a SDev. 509a747e4fSDavid du Colombier */ 519a747e4fSDavid du Colombier struct SDev { 529a747e4fSDavid du Colombier Ref r; /* Number of callers using device */ 5380ee5cbfSDavid du Colombier SDifc* ifc; /* pnp/legacy */ 5480ee5cbfSDavid du Colombier void* ctlr; 5580ee5cbfSDavid du Colombier int idno; 564de34a7eSDavid du Colombier char name[8]; 5780ee5cbfSDavid du Colombier SDev* next; 5880ee5cbfSDavid du Colombier 5980ee5cbfSDavid du Colombier QLock; /* enable/disable */ 6080ee5cbfSDavid du Colombier int enabled; 619a747e4fSDavid du Colombier int nunit; /* Number of units */ 629a747e4fSDavid du Colombier QLock unitlock; /* `Loading' of units */ 639a747e4fSDavid du Colombier int* unitflg; /* Unit flags */ 649a747e4fSDavid du Colombier SDunit**unit; 659a747e4fSDavid du Colombier }; 6680ee5cbfSDavid du Colombier 679a747e4fSDavid du Colombier struct SDifc { 6880ee5cbfSDavid du Colombier char* name; 6980ee5cbfSDavid du Colombier 7080ee5cbfSDavid du Colombier SDev* (*pnp)(void); 7180ee5cbfSDavid du Colombier SDev* (*legacy)(int, int); 7280ee5cbfSDavid du Colombier int (*enable)(SDev*); 7380ee5cbfSDavid du Colombier int (*disable)(SDev*); 7480ee5cbfSDavid du Colombier 7580ee5cbfSDavid du Colombier int (*verify)(SDunit*); 7680ee5cbfSDavid du Colombier int (*online)(SDunit*); 7780ee5cbfSDavid du Colombier int (*rio)(SDreq*); 7880ee5cbfSDavid du Colombier int (*rctl)(SDunit*, char*, int); 7980ee5cbfSDavid du Colombier int (*wctl)(SDunit*, Cmdbuf*); 8080ee5cbfSDavid du Colombier 8117629263SDavid du Colombier long (*bio)(SDunit*, int, int, void*, long, uvlong); 829a747e4fSDavid du Colombier SDev* (*probe)(DevConf*); 839a747e4fSDavid du Colombier void (*clear)(SDev*); 844de34a7eSDavid du Colombier char* (*rtopctl)(SDev*, char*, char*); 854de34a7eSDavid du Colombier int (*wtopctl)(SDev*, Cmdbuf*); 869a747e4fSDavid du Colombier }; 8780ee5cbfSDavid du Colombier 889a747e4fSDavid du Colombier struct SDreq { 8980ee5cbfSDavid du Colombier SDunit* unit; 9080ee5cbfSDavid du Colombier int lun; 9180ee5cbfSDavid du Colombier int write; 9280ee5cbfSDavid du Colombier uchar cmd[16]; 9380ee5cbfSDavid du Colombier int clen; 9480ee5cbfSDavid du Colombier void* data; 9580ee5cbfSDavid du Colombier int dlen; 9680ee5cbfSDavid du Colombier 9780ee5cbfSDavid du Colombier int flags; 9880ee5cbfSDavid du Colombier 9980ee5cbfSDavid du Colombier int status; 10080ee5cbfSDavid du Colombier long rlen; 10180ee5cbfSDavid du Colombier uchar sense[256]; 1029a747e4fSDavid du Colombier }; 10380ee5cbfSDavid du Colombier 10480ee5cbfSDavid du Colombier enum { 10580ee5cbfSDavid du Colombier SDnosense = 0x00000001, 10680ee5cbfSDavid du Colombier SDvalidsense = 0x00010000, 10727522402SDavid du Colombier 10827522402SDavid du Colombier SDinq0periphqual= 0xe0, 10927522402SDavid du Colombier SDinq0periphtype= 0x1f, 11027522402SDavid du Colombier SDinq1removable = 0x80, 11127522402SDavid du Colombier 11227522402SDavid du Colombier /* periphtype values */ 11327522402SDavid du Colombier SDperdisk = 0, /* Direct access (disk) */ 11427522402SDavid du Colombier SDpertape = 1, /* Sequential eg, tape */ 11527522402SDavid du Colombier SDperpr = 2, /* Printer */ 11627522402SDavid du Colombier SDperworm = 4, /* Worm */ 11727522402SDavid du Colombier SDpercd = 5, /* CD-ROM */ 11827522402SDavid du Colombier SDpermo = 7, /* rewriteable MO */ 11927522402SDavid du Colombier SDperjuke = 8, /* medium-changer */ 12080ee5cbfSDavid du Colombier }; 12180ee5cbfSDavid du Colombier 12280ee5cbfSDavid du Colombier enum { 12380ee5cbfSDavid du Colombier SDretry = -5, /* internal to controllers */ 12480ee5cbfSDavid du Colombier SDmalloc = -4, 12580ee5cbfSDavid du Colombier SDeio = -3, 12680ee5cbfSDavid du Colombier SDtimeout = -2, 12780ee5cbfSDavid du Colombier SDnostatus = -1, 12880ee5cbfSDavid du Colombier 12980ee5cbfSDavid du Colombier SDok = 0, 13080ee5cbfSDavid du Colombier 13180ee5cbfSDavid du Colombier SDcheck = 0x02, /* check condition */ 13280ee5cbfSDavid du Colombier SDbusy = 0x08, /* busy */ 13380ee5cbfSDavid du Colombier 13480ee5cbfSDavid du Colombier SDmaxio = 2048*1024, 13580ee5cbfSDavid du Colombier SDnpart = 16, 13680ee5cbfSDavid du Colombier }; 13780ee5cbfSDavid du Colombier 1387ee275a1SDavid du Colombier /* 1397ee275a1SDavid du Colombier * Allow the default #defines for sdmalloc & sdfree to be overridden by 1407ee275a1SDavid du Colombier * system-specific versions. This can be used to avoid extra copying 1417ee275a1SDavid du Colombier * by making sure sd buffers are cache-aligned (some ARM systems) or 1427ee275a1SDavid du Colombier * page-aligned (xen) for DMA. 1437ee275a1SDavid du Colombier */ 1447ee275a1SDavid du Colombier #ifndef sdmalloc 14580ee5cbfSDavid du Colombier #define sdmalloc(n) malloc(n) 14680ee5cbfSDavid du Colombier #define sdfree(p) free(p) 1477ee275a1SDavid du Colombier #endif 14880ee5cbfSDavid du Colombier 149*0cc6832dSDavid du Colombier /* 150*0cc6832dSDavid du Colombier * mmc/sd/sdio host controller interface 151*0cc6832dSDavid du Colombier */ 152*0cc6832dSDavid du Colombier 153*0cc6832dSDavid du Colombier struct SDio { 154*0cc6832dSDavid du Colombier char *name; 155*0cc6832dSDavid du Colombier int (*init)(void); 156*0cc6832dSDavid du Colombier void (*enable)(void); 157*0cc6832dSDavid du Colombier int (*inquiry)(char*, int); 158*0cc6832dSDavid du Colombier int (*cmd)(u32int, u32int, u32int*); 159*0cc6832dSDavid du Colombier void (*iosetup)(int, void*, int, int); 160*0cc6832dSDavid du Colombier void (*io)(int, uchar*, int); 161*0cc6832dSDavid du Colombier }; 162*0cc6832dSDavid du Colombier 163*0cc6832dSDavid du Colombier extern SDio sdio; 164*0cc6832dSDavid du Colombier 1654de34a7eSDavid du Colombier /* devsd.c */ 1664de34a7eSDavid du Colombier extern void sdadddevs(SDev*); 1672210c76eSDavid du Colombier extern void sdaddconf(SDunit*); 1682210c76eSDavid du Colombier extern void sdaddallconfs(void (*f)(SDunit*)); 1692210c76eSDavid du Colombier extern void sdaddpart(SDunit*, char*, uvlong, uvlong); 1704de34a7eSDavid du Colombier extern int sdsetsense(SDreq*, int, int, int, int); 1714de34a7eSDavid du Colombier extern int sdmodesense(SDreq*, uchar*, void*, int); 1724de34a7eSDavid du Colombier extern int sdfakescsi(SDreq*, void*, int); 1734de34a7eSDavid du Colombier 17480ee5cbfSDavid du Colombier /* sdscsi.c */ 17580ee5cbfSDavid du Colombier extern int scsiverify(SDunit*); 17680ee5cbfSDavid du Colombier extern int scsionline(SDunit*); 17717629263SDavid du Colombier extern long scsibio(SDunit*, int, int, void*, long, uvlong); 17880ee5cbfSDavid du Colombier extern SDev* scsiid(SDev*, SDifc*); 179