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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94struct wusb_dev {
95 struct kref refcnt;
96 struct wusbhc *wusbhc;
97 struct list_head cack_node;
98 u8 port_idx;
99 u8 addr;
100 u8 beacon_type:4;
101 struct usb_encryption_descriptor ccm1_etd;
102 struct wusb_ckhdid cdid;
103 unsigned long entry_ts;
104 struct usb_bos_descriptor *bos;
105 struct usb_wireless_cap_descriptor *wusb_cap_descr;
106 struct uwb_mas_bm availability;
107 struct work_struct devconnect_acked_work;
108 struct urb *set_gtk_urb;
109 struct usb_ctrlrequest *set_gtk_req;
110 struct usb_device *usb_dev;
111};
112
113#define WUSB_DEV_ADDR_UNAUTH 0x80
114
115static inline void wusb_dev_init(struct wusb_dev *wusb_dev)
116{
117 kref_init(&wusb_dev->refcnt);
118
119}
120
121extern void wusb_dev_destroy(struct kref *_wusb_dev);
122
123static inline struct wusb_dev *wusb_dev_get(struct wusb_dev *wusb_dev)
124{
125 kref_get(&wusb_dev->refcnt);
126 return wusb_dev;
127}
128
129static inline void wusb_dev_put(struct wusb_dev *wusb_dev)
130{
131 kref_put(&wusb_dev->refcnt, wusb_dev_destroy);
132}
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151struct wusb_port {
152 u16 status;
153 u16 change;
154 struct wusb_dev *wusb_dev;
155 u32 ptk_tkid;
156};
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
246struct wusbhc {
247 struct usb_hcd usb_hcd;
248 struct device *dev;
249 struct uwb_rc *uwb_rc;
250 struct uwb_pal pal;
251
252 unsigned trust_timeout;
253 struct wusb_ckhdid chid;
254 uint8_t phy_rate;
255 struct wuie_host_info *wuie_host_info;
256
257 struct mutex mutex;
258 u16 cluster_id;
259 struct wusb_port *port;
260 struct wusb_dev_info *dev_info;
261 u8 ports_max;
262 unsigned active:1;
263 struct wuie_keep_alive keep_alive_ie;
264 struct delayed_work keep_alive_timer;
265 struct list_head cack_list;
266 size_t cack_count;
267 struct wuie_connect_ack cack_ie;
268 struct uwb_rsv *rsv;
269
270 struct mutex mmcie_mutex;
271 struct wuie_hdr **mmcie;
272 u8 mmcies_max;
273
274 int (*start)(struct wusbhc *wusbhc);
275 void (*stop)(struct wusbhc *wusbhc, int delay);
276 int (*mmcie_add)(struct wusbhc *wusbhc, u8 interval, u8 repeat_cnt,
277 u8 handle, struct wuie_hdr *wuie);
278 int (*mmcie_rm)(struct wusbhc *wusbhc, u8 handle);
279 int (*dev_info_set)(struct wusbhc *, struct wusb_dev *wusb_dev);
280 int (*bwa_set)(struct wusbhc *wusbhc, s8 stream_index,
281 const struct uwb_mas_bm *);
282 int (*set_ptk)(struct wusbhc *wusbhc, u8 port_idx,
283 u32 tkid, const void *key, size_t key_size);
284 int (*set_gtk)(struct wusbhc *wusbhc,
285 u32 tkid, const void *key, size_t key_size);
286 int (*set_num_dnts)(struct wusbhc *wusbhc, u8 interval, u8 slots);
287
288 struct {
289 struct usb_key_descriptor descr;
290 u8 data[16];
291 } __attribute__((packed)) gtk;
292 u8 gtk_index;
293 u32 gtk_tkid;
294 struct work_struct gtk_rekey_done_work;
295 int pending_set_gtks;
296
297 struct usb_encryption_descriptor *ccm1_etd;
298};
299
300#define usb_hcd_to_wusbhc(u) container_of((u), struct wusbhc, usb_hcd)
301
302
303extern int wusbhc_create(struct wusbhc *);
304extern int wusbhc_b_create(struct wusbhc *);
305extern void wusbhc_b_destroy(struct wusbhc *);
306extern void wusbhc_destroy(struct wusbhc *);
307extern int wusb_dev_sysfs_add(struct wusbhc *, struct usb_device *,
308 struct wusb_dev *);
309extern void wusb_dev_sysfs_rm(struct wusb_dev *);
310extern int wusbhc_sec_create(struct wusbhc *);
311extern int wusbhc_sec_start(struct wusbhc *);
312extern void wusbhc_sec_stop(struct wusbhc *);
313extern void wusbhc_sec_destroy(struct wusbhc *);
314extern void wusbhc_giveback_urb(struct wusbhc *wusbhc, struct urb *urb,
315 int status);
316void wusbhc_reset_all(struct wusbhc *wusbhc);
317
318int wusbhc_pal_register(struct wusbhc *wusbhc);
319void wusbhc_pal_unregister(struct wusbhc *wusbhc);
320
321
322
323
324
325
326
327
328
329static inline struct usb_hcd *usb_hcd_get_by_usb_dev(struct usb_device *usb_dev)
330{
331 struct usb_hcd *usb_hcd;
332 usb_hcd = container_of(usb_dev->bus, struct usb_hcd, self);
333 return usb_get_hcd(usb_hcd);
334}
335
336
337
338
339
340
341static inline struct wusbhc *wusbhc_get(struct wusbhc *wusbhc)
342{
343 return usb_get_hcd(&wusbhc->usb_hcd) ? wusbhc : NULL;
344}
345
346
347
348
349
350
351
352
353
354
355
356static inline struct wusbhc *wusbhc_get_by_usb_dev(struct usb_device *usb_dev)
357{
358 struct wusbhc *wusbhc = NULL;
359 struct usb_hcd *usb_hcd;
360 if (usb_dev->devnum > 1 && !usb_dev->wusb) {
361
362 dev_err(&usb_dev->dev, "devnum %d wusb %d\n", usb_dev->devnum,
363 usb_dev->wusb);
364 BUG_ON(usb_dev->devnum > 1 && !usb_dev->wusb);
365 }
366 usb_hcd = usb_hcd_get_by_usb_dev(usb_dev);
367 if (usb_hcd == NULL)
368 return NULL;
369 BUG_ON(usb_hcd->wireless == 0);
370 return wusbhc = usb_hcd_to_wusbhc(usb_hcd);
371}
372
373
374static inline void wusbhc_put(struct wusbhc *wusbhc)
375{
376 usb_put_hcd(&wusbhc->usb_hcd);
377}
378
379int wusbhc_start(struct wusbhc *wusbhc);
380void wusbhc_stop(struct wusbhc *wusbhc);
381extern int wusbhc_chid_set(struct wusbhc *, const struct wusb_ckhdid *);
382
383
384extern int wusbhc_devconnect_create(struct wusbhc *);
385extern void wusbhc_devconnect_destroy(struct wusbhc *);
386extern int wusbhc_devconnect_start(struct wusbhc *wusbhc);
387extern void wusbhc_devconnect_stop(struct wusbhc *wusbhc);
388extern void wusbhc_handle_dn(struct wusbhc *, u8 srcaddr,
389 struct wusb_dn_hdr *dn_hdr, size_t size);
390extern void __wusbhc_dev_disable(struct wusbhc *wusbhc, u8 port);
391extern int wusb_usb_ncb(struct notifier_block *nb, unsigned long val,
392 void *priv);
393extern int wusb_set_dev_addr(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev,
394 u8 addr);
395
396
397extern int wusbhc_rh_create(struct wusbhc *);
398extern void wusbhc_rh_destroy(struct wusbhc *);
399
400extern int wusbhc_rh_status_data(struct usb_hcd *, char *);
401extern int wusbhc_rh_control(struct usb_hcd *, u16, u16, u16, char *, u16);
402extern int wusbhc_rh_suspend(struct usb_hcd *);
403extern int wusbhc_rh_resume(struct usb_hcd *);
404extern int wusbhc_rh_start_port_reset(struct usb_hcd *, unsigned);
405
406
407extern int wusbhc_mmcie_create(struct wusbhc *);
408extern void wusbhc_mmcie_destroy(struct wusbhc *);
409extern int wusbhc_mmcie_set(struct wusbhc *, u8 interval, u8 repeat_cnt,
410 struct wuie_hdr *);
411extern void wusbhc_mmcie_rm(struct wusbhc *, struct wuie_hdr *);
412
413
414int wusbhc_rsv_establish(struct wusbhc *wusbhc);
415void wusbhc_rsv_terminate(struct wusbhc *wusbhc);
416
417
418
419
420
421
422
423
424
425
426
427
428
429extern int wusb_dev_sec_add(struct wusbhc *, struct usb_device *,
430 struct wusb_dev *);
431extern void wusb_dev_sec_rm(struct wusb_dev *) ;
432extern int wusb_dev_4way_handshake(struct wusbhc *, struct wusb_dev *,
433 struct wusb_ckhdid *ck);
434void wusbhc_gtk_rekey(struct wusbhc *wusbhc);
435int wusb_dev_update_address(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev);
436
437
438
439extern u8 wusb_cluster_id_get(void);
440extern void wusb_cluster_id_put(u8);
441
442
443
444
445
446
447
448
449static inline struct wusb_port *wusb_port_by_idx(struct wusbhc *wusbhc,
450 u8 port_idx)
451{
452 return &wusbhc->port[port_idx];
453}
454
455
456
457
458
459
460
461
462
463static inline u8 wusb_port_no_to_idx(u8 port_no)
464{
465 return port_no - 1;
466}
467
468extern struct wusb_dev *__wusb_dev_get_by_usb_dev(struct wusbhc *,
469 struct usb_device *);
470
471
472
473
474
475
476
477
478static inline
479struct wusb_dev *wusb_dev_get_by_usb_dev(struct usb_device *usb_dev)
480{
481 struct wusbhc *wusbhc;
482 struct wusb_dev *wusb_dev;
483 wusbhc = wusbhc_get_by_usb_dev(usb_dev);
484 if (wusbhc == NULL)
485 return NULL;
486 mutex_lock(&wusbhc->mutex);
487 wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, usb_dev);
488 mutex_unlock(&wusbhc->mutex);
489 wusbhc_put(wusbhc);
490 return wusb_dev;
491}
492
493
494
495extern struct workqueue_struct *wusbd;
496#endif
497