1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53#ifndef __WUSBHC_H__
54#define __WUSBHC_H__
55
56#include <linux/usb.h>
57#include <linux/list.h>
58#include <linux/mutex.h>
59#include <linux/kref.h>
60#include <linux/workqueue.h>
61#include <linux/usb/hcd.h>
62#include <linux/uwb.h>
63#include <linux/usb/wusb.h>
64
65
66
67
68
69
70
71#define WUSB_CHANNEL_STOP_DELAY_MS 8
72#define WUSB_RETRY_COUNT_MAX 15
73#define WUSB_RETRY_COUNT_INFINITE 0
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96struct wusb_dev {
97 struct kref refcnt;
98 struct wusbhc *wusbhc;
99 struct list_head cack_node;
100 struct list_head rekey_node;
101 u8 port_idx;
102 u8 addr;
103 u8 beacon_type:4;
104 struct usb_encryption_descriptor ccm1_etd;
105 struct wusb_ckhdid cdid;
106 unsigned long entry_ts;
107 struct usb_bos_descriptor *bos;
108 struct usb_wireless_cap_descriptor *wusb_cap_descr;
109 struct uwb_mas_bm availability;
110 struct work_struct devconnect_acked_work;
111 struct usb_device *usb_dev;
112};
113
114#define WUSB_DEV_ADDR_UNAUTH 0x80
115
116static inline void wusb_dev_init(struct wusb_dev *wusb_dev)
117{
118 kref_init(&wusb_dev->refcnt);
119
120}
121
122extern void wusb_dev_destroy(struct kref *_wusb_dev);
123
124static inline struct wusb_dev *wusb_dev_get(struct wusb_dev *wusb_dev)
125{
126 kref_get(&wusb_dev->refcnt);
127 return wusb_dev;
128}
129
130static inline void wusb_dev_put(struct wusb_dev *wusb_dev)
131{
132 kref_put(&wusb_dev->refcnt, wusb_dev_destroy);
133}
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152struct wusb_port {
153 u16 status;
154 u16 change;
155 struct wusb_dev *wusb_dev;
156 u32 ptk_tkid;
157};
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247struct wusbhc {
248 struct usb_hcd usb_hcd;
249 struct device *dev;
250 struct uwb_rc *uwb_rc;
251 struct uwb_pal pal;
252
253 unsigned trust_timeout;
254 struct wusb_ckhdid chid;
255 uint8_t phy_rate;
256 uint8_t dnts_num_slots;
257 uint8_t dnts_interval;
258 uint8_t retry_count;
259 struct wuie_host_info *wuie_host_info;
260
261 struct mutex mutex;
262 u16 cluster_id;
263 struct wusb_port *port;
264 struct wusb_dev_info *dev_info;
265 u8 ports_max;
266 unsigned active:1;
267 struct wuie_keep_alive keep_alive_ie;
268 struct delayed_work keep_alive_timer;
269 struct list_head cack_list;
270 size_t cack_count;
271 struct wuie_connect_ack cack_ie;
272 struct uwb_rsv *rsv;
273
274 struct mutex mmcie_mutex;
275 struct wuie_hdr **mmcie;
276 u8 mmcies_max;
277
278 int (*start)(struct wusbhc *wusbhc);
279 void (*stop)(struct wusbhc *wusbhc, int delay);
280 int (*mmcie_add)(struct wusbhc *wusbhc, u8 interval, u8 repeat_cnt,
281 u8 handle, struct wuie_hdr *wuie);
282 int (*mmcie_rm)(struct wusbhc *wusbhc, u8 handle);
283 int (*dev_info_set)(struct wusbhc *, struct wusb_dev *wusb_dev);
284 int (*bwa_set)(struct wusbhc *wusbhc, s8 stream_index,
285 const struct uwb_mas_bm *);
286 int (*set_ptk)(struct wusbhc *wusbhc, u8 port_idx,
287 u32 tkid, const void *key, size_t key_size);
288 int (*set_gtk)(struct wusbhc *wusbhc,
289 u32 tkid, const void *key, size_t key_size);
290 int (*set_num_dnts)(struct wusbhc *wusbhc, u8 interval, u8 slots);
291
292 struct {
293 struct usb_key_descriptor descr;
294 u8 data[16];
295 } __attribute__((packed)) gtk;
296 u8 gtk_index;
297 u32 gtk_tkid;
298
299
300 struct workqueue_struct *wq_security;
301 struct work_struct gtk_rekey_work;
302
303 struct usb_encryption_descriptor *ccm1_etd;
304};
305
306#define usb_hcd_to_wusbhc(u) container_of((u), struct wusbhc, usb_hcd)
307
308
309extern int wusbhc_create(struct wusbhc *);
310extern int wusbhc_b_create(struct wusbhc *);
311extern void wusbhc_b_destroy(struct wusbhc *);
312extern void wusbhc_destroy(struct wusbhc *);
313extern int wusb_dev_sysfs_add(struct wusbhc *, struct usb_device *,
314 struct wusb_dev *);
315extern void wusb_dev_sysfs_rm(struct wusb_dev *);
316extern int wusbhc_sec_create(struct wusbhc *);
317extern int wusbhc_sec_start(struct wusbhc *);
318extern void wusbhc_sec_stop(struct wusbhc *);
319extern void wusbhc_sec_destroy(struct wusbhc *);
320extern void wusbhc_giveback_urb(struct wusbhc *wusbhc, struct urb *urb,
321 int status);
322void wusbhc_reset_all(struct wusbhc *wusbhc);
323
324int wusbhc_pal_register(struct wusbhc *wusbhc);
325void wusbhc_pal_unregister(struct wusbhc *wusbhc);
326
327
328
329
330
331
332
333
334
335static inline
336struct usb_hcd *usb_hcd_get_by_usb_dev(struct usb_device *usb_dev)
337{
338 struct usb_hcd *usb_hcd;
339 usb_hcd = container_of(usb_dev->bus, struct usb_hcd, self);
340 return usb_get_hcd(usb_hcd);
341}
342
343
344
345
346
347
348static inline struct wusbhc *wusbhc_get(struct wusbhc *wusbhc)
349{
350 return usb_get_hcd(&wusbhc->usb_hcd) ? wusbhc : NULL;
351}
352
353
354
355
356
357
358
359
360
361
362
363static inline struct wusbhc *wusbhc_get_by_usb_dev(struct usb_device *usb_dev)
364{
365 struct wusbhc *wusbhc = NULL;
366 struct usb_hcd *usb_hcd;
367 if (usb_dev->devnum > 1 && !usb_dev->wusb) {
368
369 dev_err(&usb_dev->dev, "devnum %d wusb %d\n", usb_dev->devnum,
370 usb_dev->wusb);
371 BUG_ON(usb_dev->devnum > 1 && !usb_dev->wusb);
372 }
373 usb_hcd = usb_hcd_get_by_usb_dev(usb_dev);
374 if (usb_hcd == NULL)
375 return NULL;
376 BUG_ON(usb_hcd->wireless == 0);
377 return wusbhc = usb_hcd_to_wusbhc(usb_hcd);
378}
379
380
381static inline void wusbhc_put(struct wusbhc *wusbhc)
382{
383 usb_put_hcd(&wusbhc->usb_hcd);
384}
385
386int wusbhc_start(struct wusbhc *wusbhc);
387void wusbhc_stop(struct wusbhc *wusbhc);
388extern int wusbhc_chid_set(struct wusbhc *, const struct wusb_ckhdid *);
389
390
391extern int wusbhc_devconnect_create(struct wusbhc *);
392extern void wusbhc_devconnect_destroy(struct wusbhc *);
393extern int wusbhc_devconnect_start(struct wusbhc *wusbhc);
394extern void wusbhc_devconnect_stop(struct wusbhc *wusbhc);
395extern void wusbhc_handle_dn(struct wusbhc *, u8 srcaddr,
396 struct wusb_dn_hdr *dn_hdr, size_t size);
397extern void __wusbhc_dev_disable(struct wusbhc *wusbhc, u8 port);
398extern int wusb_usb_ncb(struct notifier_block *nb, unsigned long val,
399 void *priv);
400extern int wusb_set_dev_addr(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev,
401 u8 addr);
402
403
404extern int wusbhc_rh_create(struct wusbhc *);
405extern void wusbhc_rh_destroy(struct wusbhc *);
406
407extern int wusbhc_rh_status_data(struct usb_hcd *, char *);
408extern int wusbhc_rh_control(struct usb_hcd *, u16, u16, u16, char *, u16);
409extern int wusbhc_rh_start_port_reset(struct usb_hcd *, unsigned);
410
411
412extern int wusbhc_mmcie_create(struct wusbhc *);
413extern void wusbhc_mmcie_destroy(struct wusbhc *);
414extern int wusbhc_mmcie_set(struct wusbhc *, u8 interval, u8 repeat_cnt,
415 struct wuie_hdr *);
416extern void wusbhc_mmcie_rm(struct wusbhc *, struct wuie_hdr *);
417
418
419int wusbhc_rsv_establish(struct wusbhc *wusbhc);
420void wusbhc_rsv_terminate(struct wusbhc *wusbhc);
421
422
423
424
425
426
427
428
429
430
431
432
433
434extern int wusb_dev_sec_add(struct wusbhc *, struct usb_device *,
435 struct wusb_dev *);
436extern void wusb_dev_sec_rm(struct wusb_dev *) ;
437extern int wusb_dev_4way_handshake(struct wusbhc *, struct wusb_dev *,
438 struct wusb_ckhdid *ck);
439void wusbhc_gtk_rekey(struct wusbhc *wusbhc);
440int wusb_dev_update_address(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev);
441
442
443
444extern u8 wusb_cluster_id_get(void);
445extern void wusb_cluster_id_put(u8);
446
447
448
449
450
451
452
453
454static inline struct wusb_port *wusb_port_by_idx(struct wusbhc *wusbhc,
455 u8 port_idx)
456{
457 return &wusbhc->port[port_idx];
458}
459
460
461
462
463
464
465
466
467
468static inline u8 wusb_port_no_to_idx(u8 port_no)
469{
470 return port_no - 1;
471}
472
473extern struct wusb_dev *__wusb_dev_get_by_usb_dev(struct wusbhc *,
474 struct usb_device *);
475
476
477
478
479
480
481
482
483static inline
484struct wusb_dev *wusb_dev_get_by_usb_dev(struct usb_device *usb_dev)
485{
486 struct wusbhc *wusbhc;
487 struct wusb_dev *wusb_dev;
488 wusbhc = wusbhc_get_by_usb_dev(usb_dev);
489 if (wusbhc == NULL)
490 return NULL;
491 mutex_lock(&wusbhc->mutex);
492 wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, usb_dev);
493 mutex_unlock(&wusbhc->mutex);
494 wusbhc_put(wusbhc);
495 return wusb_dev;
496}
497
498
499
500extern struct workqueue_struct *wusbd;
501#endif
502