]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/port/sd.h
fix utf and rune handling in preparation for 32bit runes
[plan9front.git] / sys / src / 9 / port / sd.h
1 /*
2  * Storage Device.
3  */
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;
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 typedef long SDrw(SDunit*, Chan*, void*, long, vlong);
27 struct SDfile {
28         SDperm;
29         SDrw    *r;
30         SDrw    *w;
31 };
32
33 struct SDunit {
34         SDev*   dev;
35         int     subno;
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 */
39         uchar   haversense;
40         SDperm;
41
42         QLock   ctl;
43         uvlong  sectors;
44         ulong   secsize;
45         SDpart* part;                   /* nil or array of size npart */
46         int     npart;
47         ulong   vers;
48         SDperm  ctlperm;
49
50         QLock   raw;                    /* raw read or write in progress */
51         ulong   rawinuse;               /* really just a test-and-set */
52         int     state;
53         SDreq*  req;
54         SDperm  rawperm;
55         SDfile  efile[5];
56         int     nefile;
57 };
58
59 /*
60  * Each controller is represented by a SDev.
61  */
62 struct SDev {
63         Ref     r;                      /* Number of callers using device */
64         SDifc*  ifc;                    /* pnp/legacy */
65         void*   ctlr;
66         int     idno;
67         char    name[8];
68         SDev*   next;
69
70         QLock;                          /* enable/disable */
71         int     enabled;
72         int     nunit;                  /* Number of units */
73         QLock   unitlock;               /* `Loading' of units */
74         int*    unitflg;                /* Unit flags */
75         SDunit**unit;
76 };
77
78 struct SDifc {
79         char*   name;
80
81         SDev*   (*pnp)(void);
82         SDev*   (*xxlegacy)(int, int);          /* unused.  remove me */
83         int     (*enable)(SDev*);
84         int     (*disable)(SDev*);
85
86         int     (*verify)(SDunit*);
87         int     (*online)(SDunit*);
88         int     (*rio)(SDreq*);
89         int     (*rctl)(SDunit*, char*, int);
90         int     (*wctl)(SDunit*, Cmdbuf*);
91
92         long    (*bio)(SDunit*, int, int, void*, long, uvlong);
93         SDev*   (*probe)(DevConf*);
94         void    (*clear)(SDev*);
95         char*   (*rtopctl)(SDev*, char*, char*);
96         int     (*wtopctl)(SDev*, Cmdbuf*);
97         int     (*ataio)(SDreq*);
98 };
99
100 struct SDreq {
101         SDunit* unit;
102         int     lun;
103         char    write;
104         char    proto;
105         char    ataproto;
106         uchar   cmd[0x20];
107         int     clen;
108         void*   data;
109         int     dlen;
110
111         int     flags;
112         ulong   timeout;                /* in ticks */
113
114         int     status;
115         long    rlen;
116         uchar   sense[32];
117 };
118
119 enum {
120         SDnosense       = 0x00000001,
121         SDvalidsense    = 0x00010000,
122 };
123
124 enum {
125         SDretry         = -5,           /* internal to controllers */
126         SDmalloc        = -4,
127         SDeio           = -3,
128         SDtimeout       = -2,
129         SDnostatus      = -1,
130
131         SDok            = 0,
132
133         SDcheck         = 0x02,         /* check condition */
134         SDbusy          = 0x08,         /* busy */
135
136         SDmaxio         = 2048*1024,
137         SDnpart         = 16,
138
139         SDread  = 0,
140         SDwrite,
141
142         SData           = 1,
143         SDcdb           = 2,
144 };
145
146 #define sdmalloc(n)     malloc(n)
147 #define sdfree(p)       free(p)
148
149 /* devsd.c */
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*);
155
156 /* sdscsi.c */
157 extern int scsiverify(SDunit*);
158 extern int scsionline(SDunit*);
159 extern long scsibio(SDunit*, int, int, void*, long, uvlong);