1 /* 2 * Storage Device. 3 */ 4 typedef struct SDev SDev; 5 typedef struct SDifc SDifc; 6 typedef struct SDio SDio; 7 typedef struct SDpart SDpart; 8 typedef struct SDperm SDperm; 9 typedef struct SDreq SDreq; 10 typedef struct SDunit SDunit; 11 12 struct SDperm { 13 char* name; 14 char* user; 15 ulong perm; 16 }; 17 18 struct SDpart { 19 uvlong start; 20 uvlong end; 21 SDperm; 22 int valid; 23 ulong vers; 24 }; 25 26 struct SDunit { 27 SDev* dev; 28 int subno; 29 uchar inquiry[255]; /* format follows SCSI spec */ 30 uchar sense[18]; /* format follows SCSI spec */ 31 SDperm; 32 33 QLock ctl; 34 uvlong sectors; 35 ulong secsize; 36 SDpart* part; /* nil or array of size npart */ 37 int npart; 38 ulong vers; 39 SDperm ctlperm; 40 41 QLock raw; /* raw read or write in progress */ 42 ulong rawinuse; /* really just a test-and-set */ 43 int state; 44 SDreq* req; 45 SDperm rawperm; 46 }; 47 48 /* 49 * Each controller is represented by a SDev. 50 */ 51 struct SDev { 52 Ref r; /* Number of callers using device */ 53 SDifc* ifc; /* pnp/legacy */ 54 void* ctlr; 55 int idno; 56 char name[8]; 57 SDev* next; 58 59 QLock; /* enable/disable */ 60 int enabled; 61 int nunit; /* Number of units */ 62 QLock unitlock; /* `Loading' of units */ 63 int* unitflg; /* Unit flags */ 64 SDunit**unit; 65 }; 66 67 struct SDifc { 68 char* name; 69 70 SDev* (*pnp)(void); 71 SDev* (*legacy)(int, int); 72 int (*enable)(SDev*); 73 int (*disable)(SDev*); 74 75 int (*verify)(SDunit*); 76 int (*online)(SDunit*); 77 int (*rio)(SDreq*); 78 int (*rctl)(SDunit*, char*, int); 79 int (*wctl)(SDunit*, Cmdbuf*); 80 81 long (*bio)(SDunit*, int, int, void*, long, uvlong); 82 SDev* (*probe)(DevConf*); 83 void (*clear)(SDev*); 84 char* (*rtopctl)(SDev*, char*, char*); 85 int (*wtopctl)(SDev*, Cmdbuf*); 86 }; 87 88 struct SDreq { 89 SDunit* unit; 90 int lun; 91 int write; 92 uchar cmd[16]; 93 int clen; 94 void* data; 95 int dlen; 96 97 int flags; 98 99 int status; 100 long rlen; 101 uchar sense[256]; 102 }; 103 104 enum { 105 SDnosense = 0x00000001, 106 SDvalidsense = 0x00010000, 107 108 SDinq0periphqual= 0xe0, 109 SDinq0periphtype= 0x1f, 110 SDinq1removable = 0x80, 111 112 /* periphtype values */ 113 SDperdisk = 0, /* Direct access (disk) */ 114 SDpertape = 1, /* Sequential eg, tape */ 115 SDperpr = 2, /* Printer */ 116 SDperworm = 4, /* Worm */ 117 SDpercd = 5, /* CD-ROM */ 118 SDpermo = 7, /* rewriteable MO */ 119 SDperjuke = 8, /* medium-changer */ 120 }; 121 122 enum { 123 SDretry = -5, /* internal to controllers */ 124 SDmalloc = -4, 125 SDeio = -3, 126 SDtimeout = -2, 127 SDnostatus = -1, 128 129 SDok = 0, 130 131 SDcheck = 0x02, /* check condition */ 132 SDbusy = 0x08, /* busy */ 133 134 SDmaxio = 2048*1024, 135 SDnpart = 16, 136 }; 137 138 /* 139 * Allow the default #defines for sdmalloc & sdfree to be overridden by 140 * system-specific versions. This can be used to avoid extra copying 141 * by making sure sd buffers are cache-aligned (some ARM systems) or 142 * page-aligned (xen) for DMA. 143 */ 144 #ifndef sdmalloc 145 #define sdmalloc(n) malloc(n) 146 #define sdfree(p) free(p) 147 #endif 148 149 /* 150 * mmc/sd/sdio host controller interface 151 */ 152 153 struct SDio { 154 char *name; 155 int (*init)(void); 156 void (*enable)(void); 157 int (*inquiry)(char*, int); 158 int (*cmd)(u32int, u32int, u32int*); 159 void (*iosetup)(int, void*, int, int); 160 void (*io)(int, uchar*, int); 161 }; 162 163 extern SDio sdio; 164 165 /* devsd.c */ 166 extern void sdadddevs(SDev*); 167 extern void sdaddconf(SDunit*); 168 extern void sdaddallconfs(void (*f)(SDunit*)); 169 extern void sdaddpart(SDunit*, char*, uvlong, uvlong); 170 extern int sdsetsense(SDreq*, int, int, int, int); 171 extern int sdmodesense(SDreq*, uchar*, void*, int); 172 extern int sdfakescsi(SDreq*, void*, int); 173 174 /* sdscsi.c */ 175 extern int scsiverify(SDunit*); 176 extern int scsionline(SDunit*); 177 extern long scsibio(SDunit*, int, int, void*, long, uvlong); 178 extern SDev* scsiid(SDev*, SDifc*); 179