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