4 typedef struct SDev SDev;
5 typedef struct SDfile SDfile;
6 typedef struct SDifc SDifc;
7 typedef struct SDpart SDpart;
8 typedef struct SDperm SDperm;
9 typedef struct SDreq SDreq;
10 typedef struct SDunit SDunit;
26 typedef long SDrw(SDunit*, Chan*, void*, long, vlong);
36 uchar inquiry[255]; /* format follows SCSI spec */
37 uchar sense[18]; /* format follows SCSI spec */
38 uchar rsense[18]; /* support seperate rq sense and inline return */
45 SDpart* part; /* nil or array of size npart */
50 QLock raw; /* raw read or write in progress */
51 ulong rawinuse; /* really just a test-and-set */
60 * Each controller is represented by a SDev.
63 Ref r; /* Number of callers using device */
64 SDifc* ifc; /* pnp/legacy */
70 QLock; /* enable/disable */
72 int nunit; /* Number of units */
73 QLock unitlock; /* `Loading' of units */
74 int* unitflg; /* Unit flags */
82 SDev* (*xxlegacy)(int, int); /* unused. remove me */
84 int (*disable)(SDev*);
86 int (*verify)(SDunit*);
87 int (*online)(SDunit*);
89 int (*rctl)(SDunit*, char*, int);
90 int (*wctl)(SDunit*, Cmdbuf*);
92 long (*bio)(SDunit*, int, int, void*, long, uvlong);
93 SDev* (*probe)(DevConf*);
95 char* (*rtopctl)(SDev*, char*, char*);
96 int (*wtopctl)(SDev*, Cmdbuf*);
112 ulong timeout; /* in ticks */
120 SDnosense = 0x00000001,
121 SDvalidsense = 0x00010000,
125 SDretry = -5, /* internal to controllers */
133 SDcheck = 0x02, /* check condition */
134 SDbusy = 0x08, /* busy */
146 #define sdmalloc(n) malloc(n)
147 #define sdfree(p) free(p)
150 extern void sdadddevs(SDev*);
151 extern int sdsetsense(SDreq*, int, int, int, int);
152 extern int sdfakescsi(SDreq*);
153 extern int sdfakescsirw(SDreq*, uvlong*, int*, int*);
154 extern int sdaddfile(SDunit*, char*, int, char*, SDrw*, SDrw*);
157 extern int scsiverify(SDunit*);
158 extern int scsionline(SDunit*);
159 extern long scsibio(SDunit*, int, int, void*, long, uvlong);