Linux-libre 3.10.48-gnu
[librecmc/linux-libre.git] / drivers / staging / ozwpan / ozprotocol.h
1 /* -----------------------------------------------------------------------------
2  * Copyright (c) 2011 Ozmo Inc
3  * Released under the GNU General Public License Version 2 (GPLv2).
4  * -----------------------------------------------------------------------------
5  */
6 #ifndef _OZPROTOCOL_H
7 #define _OZPROTOCOL_H
8
9 #define PACKED __packed
10
11 #define OZ_ETHERTYPE 0x892e
12
13 /* Status codes
14  */
15 #define OZ_STATUS_SUCCESS               0
16 #define OZ_STATUS_INVALID_PARAM         1
17 #define OZ_STATUS_TOO_MANY_PDS          2
18 #define OZ_STATUS_NOT_ALLOWED           4
19 #define OZ_STATUS_SESSION_MISMATCH      5
20 #define OZ_STATUS_SESSION_TEARDOWN      6
21
22 /* This is the generic element header.
23    Every element starts with this.
24  */
25 struct oz_elt {
26         u8 type;
27         u8 length;
28 } PACKED;
29
30 #define oz_next_elt(__elt)      \
31         (struct oz_elt *)((u8 *)((__elt) + 1) + (__elt)->length)
32
33 /* Protocol element IDs.
34  */
35 #define OZ_ELT_CONNECT_REQ      0x06
36 #define OZ_ELT_CONNECT_RSP      0x07
37 #define OZ_ELT_DISCONNECT       0x08
38 #define OZ_ELT_UPDATE_PARAM_REQ 0x11
39 #define OZ_ELT_FAREWELL_REQ     0x12
40 #define OZ_ELT_APP_DATA         0x31
41
42 /* This is the Ozmo header which is the first Ozmo specific part
43  * of a frame and comes after the MAC header.
44  */
45 struct oz_hdr {
46         u8      control;
47         u8      last_pkt_num;
48         u32     pkt_num;
49 } PACKED;
50
51 #define OZ_PROTOCOL_VERSION     0x1
52 /* Bits in the control field. */
53 #define OZ_VERSION_MASK         0xc
54 #define OZ_VERSION_SHIFT        2
55 #define OZ_F_ACK                0x10
56 #define OZ_F_ISOC               0x20
57 #define OZ_F_MORE_DATA          0x40
58 #define OZ_F_ACK_REQUESTED      0x80
59
60 #define oz_get_prot_ver(__x)    (((__x) & OZ_VERSION_MASK) >> OZ_VERSION_SHIFT)
61
62 /* Used to select the bits of packet number to put in the last_pkt_num.
63  */
64 #define OZ_LAST_PN_MASK         0x00ff
65
66 #define OZ_LAST_PN_HALF_CYCLE   127
67
68 #define OZ_LATENCY_MASK         0xc0
69 #define OZ_ONE_MS_LATENCY       0x40
70 #define OZ_TEN_MS_LATENCY       0x80
71
72 /* Connect request data structure.
73  */
74 struct oz_elt_connect_req {
75         u8      mode;
76         u8      resv1[16];
77         u8      pd_info;
78         u8      session_id;
79         u8      presleep;
80         u8      ms_isoc_latency;
81         u8      host_vendor;
82         u8      keep_alive;
83         u16     apps;
84         u8      max_len_div16;
85         u8      ms_per_isoc;
86         u8      resv3[2];
87 } PACKED;
88
89 /* mode field bits.
90  */
91 #define OZ_MODE_POLLED          0x0
92 #define OZ_MODE_TRIGGERED       0x1
93 #define OZ_MODE_MASK            0xf
94 #define OZ_F_ISOC_NO_ELTS       0x40
95 #define OZ_F_ISOC_ANYTIME       0x80
96 #define OZ_NO_ELTS_ANYTIME      0xc0
97
98 /* Keep alive field.
99  */
100 #define OZ_KALIVE_TYPE_MASK     0xc0
101 #define OZ_KALIVE_VALUE_MASK    0x3f
102 #define OZ_KALIVE_SPECIAL       0x00
103 #define OZ_KALIVE_SECS          0x40
104 #define OZ_KALIVE_MINS          0x80
105 #define OZ_KALIVE_HOURS         0xc0
106
107 /* Connect response data structure.
108  */
109 struct oz_elt_connect_rsp {
110         u8      mode;
111         u8      status;
112         u8      resv1[3];
113         u8      session_id;
114         u16     apps;
115         u32     resv2;
116 } PACKED;
117
118 struct oz_elt_farewell {
119         u8      ep_num;
120         u8      index;
121         u8      report[1];
122 } PACKED;
123
124 struct oz_elt_update_param {
125         u8      resv1[16];
126         u8      presleep;
127         u8      resv2;
128         u8      host_vendor;
129         u8      keepalive;
130 } PACKED;
131
132 /* Header common to all application elements.
133  */
134 struct oz_app_hdr {
135         u8      app_id;
136         u8      elt_seq_num;
137 } PACKED;
138
139 /* Values for app_id.
140  */
141 #define OZ_APPID_USB                            0x1
142 #define OZ_APPID_UNUSED1                        0x2
143 #define OZ_APPID_UNUSED2                        0x3
144 #define OZ_APPID_SERIAL                         0x4
145 #define OZ_APPID_MAX                            OZ_APPID_SERIAL
146 #define OZ_NB_APPS                              (OZ_APPID_MAX+1)
147
148 /* USB header common to all elements for the  USB application.
149  * This header extends the oz_app_hdr and comes directly after
150  * the element header in a USB application.
151  */
152 struct oz_usb_hdr {
153         u8      app_id;
154         u8      elt_seq_num;
155         u8      type;
156 } PACKED;
157
158
159
160 /* USB requests element subtypes (type field of hs_usb_hdr).
161  */
162 #define OZ_GET_DESC_REQ                 1
163 #define OZ_GET_DESC_RSP                 2
164 #define OZ_SET_CONFIG_REQ               3
165 #define OZ_SET_CONFIG_RSP               4
166 #define OZ_SET_INTERFACE_REQ            5
167 #define OZ_SET_INTERFACE_RSP            6
168 #define OZ_VENDOR_CLASS_REQ             7
169 #define OZ_VENDOR_CLASS_RSP             8
170 #define OZ_GET_STATUS_REQ               9
171 #define OZ_GET_STATUS_RSP               10
172 #define OZ_CLEAR_FEATURE_REQ            11
173 #define OZ_CLEAR_FEATURE_RSP            12
174 #define OZ_SET_FEATURE_REQ              13
175 #define OZ_SET_FEATURE_RSP              14
176 #define OZ_GET_CONFIGURATION_REQ        15
177 #define OZ_GET_CONFIGURATION_RSP        16
178 #define OZ_GET_INTERFACE_REQ            17
179 #define OZ_GET_INTERFACE_RSP            18
180 #define OZ_SYNCH_FRAME_REQ              19
181 #define OZ_SYNCH_FRAME_RSP              20
182 #define OZ_USB_ENDPOINT_DATA            23
183
184 #define OZ_REQD_D2H                     0x80
185
186 struct oz_get_desc_req {
187         u8      app_id;
188         u8      elt_seq_num;
189         u8      type;
190         u8      req_id;
191         u16     offset;
192         u16     size;
193         u8      req_type;
194         u8      desc_type;
195         u16     w_index;
196         u8      index;
197 } PACKED;
198
199 /* Values for desc_type field.
200 */
201 #define OZ_DESC_DEVICE                  0x01
202 #define OZ_DESC_CONFIG                  0x02
203 #define OZ_DESC_STRING                  0x03
204
205 /* Values for req_type field.
206  */
207 #define OZ_RECP_MASK                    0x1F
208 #define OZ_RECP_DEVICE                  0x00
209 #define OZ_RECP_INTERFACE               0x01
210 #define OZ_RECP_ENDPOINT                0x02
211
212 #define OZ_REQT_MASK                    0x60
213 #define OZ_REQT_STD                     0x00
214 #define OZ_REQT_CLASS                   0x20
215 #define OZ_REQT_VENDOR                  0x40
216
217 struct oz_get_desc_rsp {
218         u8      app_id;
219         u8      elt_seq_num;
220         u8      type;
221         u8      req_id;
222         u16     offset;
223         u16     total_size;
224         u8      rcode;
225         u8      data[1];
226 } PACKED;
227
228 struct oz_feature_req {
229         u8      app_id;
230         u8      elt_seq_num;
231         u8      type;
232         u8      req_id;
233         u8      recipient;
234         u8      index;
235         u16     feature;
236 } PACKED;
237
238 struct oz_feature_rsp {
239         u8      app_id;
240         u8      elt_seq_num;
241         u8      type;
242         u8      req_id;
243         u8      rcode;
244 } PACKED;
245
246 struct oz_set_config_req {
247         u8      app_id;
248         u8      elt_seq_num;
249         u8      type;
250         u8      req_id;
251         u8      index;
252 } PACKED;
253
254 struct oz_set_config_rsp {
255         u8      app_id;
256         u8      elt_seq_num;
257         u8      type;
258         u8      req_id;
259         u8      rcode;
260 } PACKED;
261
262 struct oz_set_interface_req {
263         u8      app_id;
264         u8      elt_seq_num;
265         u8      type;
266         u8      req_id;
267         u8      index;
268         u8      alternative;
269 } PACKED;
270
271 struct oz_set_interface_rsp {
272         u8      app_id;
273         u8      elt_seq_num;
274         u8      type;
275         u8      req_id;
276         u8      rcode;
277 } PACKED;
278
279 struct oz_get_interface_req {
280         u8      app_id;
281         u8      elt_seq_num;
282         u8      type;
283         u8      req_id;
284         u8      index;
285 } PACKED;
286
287 struct oz_get_interface_rsp {
288         u8      app_id;
289         u8      elt_seq_num;
290         u8      type;
291         u8      req_id;
292         u8      rcode;
293         u8      alternative;
294 } PACKED;
295
296 struct oz_vendor_class_req {
297         u8      app_id;
298         u8      elt_seq_num;
299         u8      type;
300         u8      req_id;
301         u8      req_type;
302         u8      request;
303         u16     value;
304         u16     index;
305         u8      data[1];
306 } PACKED;
307
308 struct oz_vendor_class_rsp {
309         u8      app_id;
310         u8      elt_seq_num;
311         u8      type;
312         u8      req_id;
313         u8      rcode;
314         u8      data[1];
315 } PACKED;
316
317 struct oz_data {
318         u8      app_id;
319         u8      elt_seq_num;
320         u8      type;
321         u8      endpoint;
322         u8      format;
323 } PACKED;
324
325 struct oz_isoc_fixed {
326         u8      app_id;
327         u8      elt_seq_num;
328         u8      type;
329         u8      endpoint;
330         u8      format;
331         u8      unit_size;
332         u8      frame_number;
333         u8      data[1];
334 } PACKED;
335
336 struct oz_multiple_fixed {
337         u8      app_id;
338         u8      elt_seq_num;
339         u8      type;
340         u8      endpoint;
341         u8      format;
342         u8      unit_size;
343         u8      data[1];
344 } PACKED;
345
346 struct oz_fragmented {
347         u8      app_id;
348         u8      elt_seq_num;
349         u8      type;
350         u8      endpoint;
351         u8      format;
352         u16     total_size;
353         u16     offset;
354         u8      data[1];
355 } PACKED;
356
357 /* Note: the following does not get packaged in an element in the same way
358  * that other data formats are packaged. Instead the data is put in a frame
359  * directly after the oz_header and is the only permitted data in such a
360  * frame. The length of the data is directly determined from the frame size.
361  */
362 struct oz_isoc_large {
363         u8      endpoint;
364         u8      format;
365         u8      ms_data;
366         u8      frame_number;
367 } PACKED;
368
369 #define OZ_DATA_F_TYPE_MASK             0xF
370 #define OZ_DATA_F_MULTIPLE_FIXED        0x1
371 #define OZ_DATA_F_MULTIPLE_VAR          0x2
372 #define OZ_DATA_F_ISOC_FIXED            0x3
373 #define OZ_DATA_F_ISOC_VAR              0x4
374 #define OZ_DATA_F_FRAGMENTED            0x5
375 #define OZ_DATA_F_ISOC_LARGE            0x7
376
377 #endif /* _OZPROTOCOL_H */