]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/port/sd.h
devproc: return process id when reading /proc/n/ctl file
[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 SDio SDio;
8 typedef struct SDpart SDpart;
9 typedef struct SDperm SDperm;
10 typedef struct SDreq SDreq;
11 typedef struct SDunit SDunit;
12
13 struct SDperm {
14         char*   name;
15         char*   user;
16         ulong   perm;
17 };
18
19 struct SDpart {
20         uvlong  start;
21         uvlong  end;
22         SDperm;
23         int     valid;
24         ulong   vers;
25 };
26
27 typedef long SDrw(SDunit*, Chan*, void*, long, vlong);
28 struct SDfile {
29         SDperm;
30         SDrw    *r;
31         SDrw    *w;
32 };
33
34 struct SDunit {
35         SDev*   dev;
36         int     subno;
37         uchar   inquiry[255];           /* format follows SCSI spec */
38         uchar   sense[18];              /* format follows SCSI spec */
39         uchar   rsense[18];             /* support seperate rq sense and inline return */
40         uchar   haversense;
41         SDperm;
42
43         QLock   ctl;
44         uvlong  sectors;
45         ulong   secsize;
46         SDpart* part;                   /* nil or array of size npart */
47         int     npart;
48         ulong   vers;
49         SDperm  ctlperm;
50
51         QLock   raw;                    /* raw read or write in progress */
52         ulong   rawinuse;               /* really just a test-and-set */
53         int     state;
54         SDreq*  req;
55         SDperm  rawperm;
56         SDfile  efile[5];
57         int     nefile;
58 };
59
60 /*
61  * Each controller is represented by a SDev.
62  */
63 struct SDev {
64         Ref     r;                      /* Number of callers using device */
65         SDifc*  ifc;                    /* pnp/legacy */
66         void*   ctlr;
67         int     idno;
68         char    name[8];
69         SDev*   next;
70
71         QLock;                          /* enable/disable */
72         int     enabled;
73         int     nunit;                  /* Number of units */
74         QLock   unitlock;               /* `Loading' of units */
75         int*    unitflg;                /* Unit flags */
76         SDunit**unit;
77 };
78
79 struct SDifc {
80         char*   name;
81
82         SDev*   (*pnp)(void);
83         SDev*   (*xxlegacy)(int, int);          /* unused.  remove me */
84         int     (*enable)(SDev*);
85         int     (*disable)(SDev*);
86
87         int     (*verify)(SDunit*);
88         int     (*online)(SDunit*);
89         int     (*rio)(SDreq*);
90         int     (*rctl)(SDunit*, char*, int);
91         int     (*wctl)(SDunit*, Cmdbuf*);
92
93         long    (*bio)(SDunit*, int, int, void*, long, uvlong);
94         SDev*   (*probe)(DevConf*);
95         void    (*clear)(SDev*);
96         char*   (*rtopctl)(SDev*, char*, char*);
97         int     (*wtopctl)(SDev*, Cmdbuf*);
98         int     (*ataio)(SDreq*);
99 };
100
101 struct SDreq {
102         SDunit* unit;
103         int     lun;
104         char    write;
105         char    proto;
106         char    ataproto;
107         uchar   cmd[0x20];
108         int     clen;
109         void*   data;
110         int     dlen;
111
112         int     flags;
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 /*
147  * Avoid extra copying by making sd buffers page-aligned for DMA.
148  */
149 #define sdmalloc(n)     mallocalign(n, BY2PG, 0, 0)
150 #define sdfree(p)       free(p)
151
152 /*
153  * mmc/sd/sdio host controller interface
154  */
155
156 struct SDio {
157         char    *name;
158         int     (*init)(void);
159         void    (*enable)(void);
160         int     (*inquiry)(char*, int);
161         int     (*cmd)(u32int, u32int, u32int*);
162         void    (*iosetup)(int, void*, int, int);
163         void    (*io)(int, uchar*, int);
164         char    highspeed;
165 };
166
167 extern SDio sdio;
168
169 /* devsd.c */
170 extern void sdadddevs(SDev*);
171 extern int sdsetsense(SDreq*, int, int, int, int);
172 extern int sdfakescsi(SDreq*);
173 extern int sdfakescsirw(SDreq*, uvlong*, int*, int*);
174 extern int sdaddfile(SDunit*, char*, int, char*, SDrw*, SDrw*);
175
176 /* sdscsi.c */
177 extern int scsiverify(SDunit*);
178 extern int scsionline(SDunit*);
179 extern long scsibio(SDunit*, int, int, void*, long, uvlong);