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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89#include <linux/jiffies.h>
90#include <linux/ctype.h>
91#include <linux/slab.h>
92#include <linux/workqueue.h>
93#include "wusbhc.h"
94
95static void wusbhc_devconnect_acked_work(struct work_struct *work);
96
97static void wusb_dev_free(struct wusb_dev *wusb_dev)
98{
99 if (wusb_dev) {
100 kfree(wusb_dev->set_gtk_req);
101 usb_free_urb(wusb_dev->set_gtk_urb);
102 kfree(wusb_dev);
103 }
104}
105
106static struct wusb_dev *wusb_dev_alloc(struct wusbhc *wusbhc)
107{
108 struct wusb_dev *wusb_dev;
109 struct urb *urb;
110 struct usb_ctrlrequest *req;
111
112 wusb_dev = kzalloc(sizeof(*wusb_dev), GFP_KERNEL);
113 if (wusb_dev == NULL)
114 goto err;
115
116 wusb_dev->wusbhc = wusbhc;
117
118 INIT_WORK(&wusb_dev->devconnect_acked_work, wusbhc_devconnect_acked_work);
119
120 urb = usb_alloc_urb(0, GFP_KERNEL);
121 if (urb == NULL)
122 goto err;
123 wusb_dev->set_gtk_urb = urb;
124
125 req = kmalloc(sizeof(*req), GFP_KERNEL);
126 if (req == NULL)
127 goto err;
128 wusb_dev->set_gtk_req = req;
129
130 req->bRequestType = USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE;
131 req->bRequest = USB_REQ_SET_DESCRIPTOR;
132 req->wValue = cpu_to_le16(USB_DT_KEY << 8 | wusbhc->gtk_index);
133 req->wIndex = 0;
134 req->wLength = cpu_to_le16(wusbhc->gtk.descr.bLength);
135
136 return wusb_dev;
137err:
138 wusb_dev_free(wusb_dev);
139 return NULL;
140}
141
142
143
144
145
146
147
148
149
150
151
152
153static void wusbhc_fill_cack_ie(struct wusbhc *wusbhc)
154{
155 unsigned cnt;
156 struct wusb_dev *dev_itr;
157 struct wuie_connect_ack *cack_ie;
158
159 cack_ie = &wusbhc->cack_ie;
160 cnt = 0;
161 list_for_each_entry(dev_itr, &wusbhc->cack_list, cack_node) {
162 cack_ie->blk[cnt].CDID = dev_itr->cdid;
163 cack_ie->blk[cnt].bDeviceAddress = dev_itr->addr;
164 if (++cnt >= WUIE_ELT_MAX)
165 break;
166 }
167 cack_ie->hdr.bLength = sizeof(cack_ie->hdr)
168 + cnt * sizeof(cack_ie->blk[0]);
169}
170
171
172
173
174
175
176
177
178
179
180
181
182
183static struct wusb_dev *wusbhc_cack_add(struct wusbhc *wusbhc,
184 struct wusb_dn_connect *dnc,
185 const char *pr_cdid, u8 port_idx)
186{
187 struct device *dev = wusbhc->dev;
188 struct wusb_dev *wusb_dev;
189 int new_connection = wusb_dn_connect_new_connection(dnc);
190 u8 dev_addr;
191 int result;
192
193
194 list_for_each_entry(wusb_dev, &wusbhc->cack_list, cack_node)
195 if (!memcmp(&wusb_dev->cdid, &dnc->CDID,
196 sizeof(wusb_dev->cdid)))
197 return wusb_dev;
198
199 wusb_dev = wusb_dev_alloc(wusbhc);
200 if (wusb_dev == NULL)
201 return NULL;
202 wusb_dev_init(wusb_dev);
203 wusb_dev->cdid = dnc->CDID;
204 wusb_dev->port_idx = port_idx;
205
206
207
208
209
210
211
212
213 bitmap_fill(wusb_dev->availability.bm, UWB_NUM_MAS);
214
215
216
217 if (1 && new_connection == 0)
218 new_connection = 1;
219 if (new_connection) {
220 dev_addr = (port_idx + 2) | WUSB_DEV_ADDR_UNAUTH;
221
222 dev_info(dev, "Connecting new WUSB device to address %u, "
223 "port %u\n", dev_addr, port_idx);
224
225 result = wusb_set_dev_addr(wusbhc, wusb_dev, dev_addr);
226 if (result < 0)
227 return NULL;
228 }
229 wusb_dev->entry_ts = jiffies;
230 list_add_tail(&wusb_dev->cack_node, &wusbhc->cack_list);
231 wusbhc->cack_count++;
232 wusbhc_fill_cack_ie(wusbhc);
233
234 return wusb_dev;
235}
236
237
238
239
240
241
242static void wusbhc_cack_rm(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev)
243{
244 list_del_init(&wusb_dev->cack_node);
245 wusbhc->cack_count--;
246 wusbhc_fill_cack_ie(wusbhc);
247}
248
249
250
251static
252void wusbhc_devconnect_acked(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev)
253{
254 wusbhc_cack_rm(wusbhc, wusb_dev);
255 if (wusbhc->cack_count)
256 wusbhc_mmcie_set(wusbhc, 0, 0, &wusbhc->cack_ie.hdr);
257 else
258 wusbhc_mmcie_rm(wusbhc, &wusbhc->cack_ie.hdr);
259}
260
261static void wusbhc_devconnect_acked_work(struct work_struct *work)
262{
263 struct wusb_dev *wusb_dev = container_of(work, struct wusb_dev,
264 devconnect_acked_work);
265 struct wusbhc *wusbhc = wusb_dev->wusbhc;
266
267 mutex_lock(&wusbhc->mutex);
268 wusbhc_devconnect_acked(wusbhc, wusb_dev);
269 mutex_unlock(&wusbhc->mutex);
270
271 wusb_dev_put(wusb_dev);
272}
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300static
301void wusbhc_devconnect_ack(struct wusbhc *wusbhc, struct wusb_dn_connect *dnc,
302 const char *pr_cdid)
303{
304 int result;
305 struct device *dev = wusbhc->dev;
306 struct wusb_dev *wusb_dev;
307 struct wusb_port *port;
308 unsigned idx, devnum;
309
310 mutex_lock(&wusbhc->mutex);
311
312
313 for (idx = 0; idx < wusbhc->ports_max; idx++) {
314 port = wusb_port_by_idx(wusbhc, idx);
315 if (port->wusb_dev
316 && memcmp(&dnc->CDID, &port->wusb_dev->cdid, sizeof(dnc->CDID)) == 0)
317 goto error_unlock;
318 }
319
320 for (idx = 0; idx < wusbhc->ports_max; idx++) {
321 port = wusb_port_by_idx(wusbhc, idx);
322 if ((port->status & USB_PORT_STAT_POWER)
323 && !(port->status & USB_PORT_STAT_CONNECTION))
324 break;
325 }
326 if (idx >= wusbhc->ports_max) {
327 dev_err(dev, "Host controller can't connect more devices "
328 "(%u already connected); device %s rejected\n",
329 wusbhc->ports_max, pr_cdid);
330
331
332
333 goto error_unlock;
334 }
335
336 devnum = idx + 2;
337
338
339 wusbhc->set_ptk(wusbhc, idx, 0, NULL, 0);
340
341
342
343 wusb_dev = wusbhc_cack_add(wusbhc, dnc, pr_cdid, idx);
344 if (wusb_dev == NULL)
345 goto error_unlock;
346 result = wusbhc_mmcie_set(wusbhc, 0, 0, &wusbhc->cack_ie.hdr);
347 if (result < 0)
348 goto error_unlock;
349
350
351 msleep(3);
352 port->wusb_dev = wusb_dev;
353 port->status |= USB_PORT_STAT_CONNECTION;
354 port->change |= USB_PORT_STAT_C_CONNECTION;
355
356
357
358
359
360error_unlock:
361 mutex_unlock(&wusbhc->mutex);
362 return;
363
364}
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381static void __wusbhc_dev_disconnect(struct wusbhc *wusbhc,
382 struct wusb_port *port)
383{
384 struct wusb_dev *wusb_dev = port->wusb_dev;
385
386 port->status &= ~(USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE
387 | USB_PORT_STAT_SUSPEND | USB_PORT_STAT_RESET
388 | USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_HIGH_SPEED);
389 port->change |= USB_PORT_STAT_C_CONNECTION | USB_PORT_STAT_C_ENABLE;
390 if (wusb_dev) {
391 dev_dbg(wusbhc->dev, "disconnecting device from port %d\n", wusb_dev->port_idx);
392 if (!list_empty(&wusb_dev->cack_node))
393 list_del_init(&wusb_dev->cack_node);
394
395 wusb_dev_put(wusb_dev);
396 }
397 port->wusb_dev = NULL;
398
399
400
401 if (wusbhc->active)
402 wusbhc_gtk_rekey(wusbhc);
403
404
405
406
407
408}
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429static void __wusbhc_keep_alive(struct wusbhc *wusbhc)
430{
431 struct device *dev = wusbhc->dev;
432 unsigned cnt;
433 struct wusb_dev *wusb_dev;
434 struct wusb_port *wusb_port;
435 struct wuie_keep_alive *ie = &wusbhc->keep_alive_ie;
436 unsigned keep_alives, old_keep_alives;
437
438 old_keep_alives = ie->hdr.bLength - sizeof(ie->hdr);
439 keep_alives = 0;
440 for (cnt = 0;
441 keep_alives < WUIE_ELT_MAX && cnt < wusbhc->ports_max;
442 cnt++) {
443 unsigned tt = msecs_to_jiffies(wusbhc->trust_timeout);
444
445 wusb_port = wusb_port_by_idx(wusbhc, cnt);
446 wusb_dev = wusb_port->wusb_dev;
447
448 if (wusb_dev == NULL)
449 continue;
450 if (wusb_dev->usb_dev == NULL || !wusb_dev->usb_dev->authenticated)
451 continue;
452
453 if (time_after(jiffies, wusb_dev->entry_ts + tt)) {
454 dev_err(dev, "KEEPALIVE: device %u timed out\n",
455 wusb_dev->addr);
456 __wusbhc_dev_disconnect(wusbhc, wusb_port);
457 } else if (time_after(jiffies, wusb_dev->entry_ts + tt/2)) {
458
459 ie->bDeviceAddress[keep_alives++] = wusb_dev->addr;
460 }
461 }
462 if (keep_alives & 0x1)
463 ie->bDeviceAddress[keep_alives++] = 0x7f;
464 ie->hdr.bLength = sizeof(ie->hdr) +
465 keep_alives*sizeof(ie->bDeviceAddress[0]);
466 if (keep_alives > 0)
467 wusbhc_mmcie_set(wusbhc, 10, 5, &ie->hdr);
468 else if (old_keep_alives != 0)
469 wusbhc_mmcie_rm(wusbhc, &ie->hdr);
470}
471
472
473
474
475static void wusbhc_keep_alive_run(struct work_struct *ws)
476{
477 struct delayed_work *dw = to_delayed_work(ws);
478 struct wusbhc *wusbhc = container_of(dw, struct wusbhc, keep_alive_timer);
479
480 mutex_lock(&wusbhc->mutex);
481 __wusbhc_keep_alive(wusbhc);
482 mutex_unlock(&wusbhc->mutex);
483
484 queue_delayed_work(wusbd, &wusbhc->keep_alive_timer,
485 msecs_to_jiffies(wusbhc->trust_timeout / 2));
486}
487
488
489
490
491
492
493
494
495static struct wusb_dev *wusbhc_find_dev_by_addr(struct wusbhc *wusbhc, u8 addr)
496{
497 int p;
498
499 if (addr == 0xff)
500 return NULL;
501
502 if (addr > 0) {
503 int port = (addr & ~0x80) - 2;
504 if (port < 0 || port >= wusbhc->ports_max)
505 return NULL;
506 return wusb_port_by_idx(wusbhc, port)->wusb_dev;
507 }
508
509
510 for (p = 0; p < wusbhc->ports_max; p++) {
511 struct wusb_dev *wusb_dev = wusb_port_by_idx(wusbhc, p)->wusb_dev;
512 if (wusb_dev && wusb_dev->addr == addr)
513 return wusb_dev;
514 }
515 return NULL;
516}
517
518
519
520
521
522
523
524
525
526static void wusbhc_handle_dn_alive(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev)
527{
528 mutex_lock(&wusbhc->mutex);
529 wusb_dev->entry_ts = jiffies;
530 __wusbhc_keep_alive(wusbhc);
531 mutex_unlock(&wusbhc->mutex);
532}
533
534
535
536
537
538
539
540
541
542
543
544
545
546static void wusbhc_handle_dn_connect(struct wusbhc *wusbhc,
547 struct wusb_dn_hdr *dn_hdr,
548 size_t size)
549{
550 struct device *dev = wusbhc->dev;
551 struct wusb_dn_connect *dnc;
552 char pr_cdid[WUSB_CKHDID_STRSIZE];
553 static const char *beacon_behaviour[] = {
554 "reserved",
555 "self-beacon",
556 "directed-beacon",
557 "no-beacon"
558 };
559
560 if (size < sizeof(*dnc)) {
561 dev_err(dev, "DN CONNECT: short notification (%zu < %zu)\n",
562 size, sizeof(*dnc));
563 return;
564 }
565
566 dnc = container_of(dn_hdr, struct wusb_dn_connect, hdr);
567 ckhdid_printf(pr_cdid, sizeof(pr_cdid), &dnc->CDID);
568 dev_info(dev, "DN CONNECT: device %s @ %x (%s) wants to %s\n",
569 pr_cdid,
570 wusb_dn_connect_prev_dev_addr(dnc),
571 beacon_behaviour[wusb_dn_connect_beacon_behavior(dnc)],
572 wusb_dn_connect_new_connection(dnc) ? "connect" : "reconnect");
573
574 wusbhc_devconnect_ack(wusbhc, dnc, pr_cdid);
575}
576
577
578
579
580
581
582
583
584static void wusbhc_handle_dn_disconnect(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev)
585{
586 struct device *dev = wusbhc->dev;
587
588 dev_info(dev, "DN DISCONNECT: device 0x%02x going down\n", wusb_dev->addr);
589
590 mutex_lock(&wusbhc->mutex);
591 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, wusb_dev->port_idx));
592 mutex_unlock(&wusbhc->mutex);
593}
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609void wusbhc_handle_dn(struct wusbhc *wusbhc, u8 srcaddr,
610 struct wusb_dn_hdr *dn_hdr, size_t size)
611{
612 struct device *dev = wusbhc->dev;
613 struct wusb_dev *wusb_dev;
614
615 if (size < sizeof(struct wusb_dn_hdr)) {
616 dev_err(dev, "DN data shorter than DN header (%d < %d)\n",
617 (int)size, (int)sizeof(struct wusb_dn_hdr));
618 return;
619 }
620
621 wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr);
622 if (wusb_dev == NULL && dn_hdr->bType != WUSB_DN_CONNECT) {
623 dev_dbg(dev, "ignoring DN %d from unconnected device %02x\n",
624 dn_hdr->bType, srcaddr);
625 return;
626 }
627
628 switch (dn_hdr->bType) {
629 case WUSB_DN_CONNECT:
630 wusbhc_handle_dn_connect(wusbhc, dn_hdr, size);
631 break;
632 case WUSB_DN_ALIVE:
633 wusbhc_handle_dn_alive(wusbhc, wusb_dev);
634 break;
635 case WUSB_DN_DISCONNECT:
636 wusbhc_handle_dn_disconnect(wusbhc, wusb_dev);
637 break;
638 case WUSB_DN_MASAVAILCHANGED:
639 case WUSB_DN_RWAKE:
640 case WUSB_DN_SLEEP:
641
642 break;
643 case WUSB_DN_EPRDY:
644
645 break;
646 default:
647 dev_warn(dev, "unknown DN %u (%d octets) from %u\n",
648 dn_hdr->bType, (int)size, srcaddr);
649 }
650}
651EXPORT_SYMBOL_GPL(wusbhc_handle_dn);
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672void __wusbhc_dev_disable(struct wusbhc *wusbhc, u8 port_idx)
673{
674 int result;
675 struct device *dev = wusbhc->dev;
676 struct wusb_dev *wusb_dev;
677 struct wuie_disconnect *ie;
678
679 wusb_dev = wusb_port_by_idx(wusbhc, port_idx)->wusb_dev;
680 if (wusb_dev == NULL) {
681
682 dev_dbg(dev, "DISCONNECT: no device at port %u, ignoring\n",
683 port_idx);
684 return;
685 }
686 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, port_idx));
687
688 ie = kzalloc(sizeof(*ie), GFP_KERNEL);
689 if (ie == NULL)
690 return;
691 ie->hdr.bLength = sizeof(*ie);
692 ie->hdr.bIEIdentifier = WUIE_ID_DEVICE_DISCONNECT;
693 ie->bDeviceAddress = wusb_dev->addr;
694 result = wusbhc_mmcie_set(wusbhc, 0, 0, &ie->hdr);
695 if (result < 0)
696 dev_err(dev, "DISCONNECT: can't set MMC: %d\n", result);
697 else {
698
699 msleep(7*4);
700 wusbhc_mmcie_rm(wusbhc, &ie->hdr);
701 }
702 kfree(ie);
703}
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721static int wusb_dev_bos_grok(struct usb_device *usb_dev,
722 struct wusb_dev *wusb_dev,
723 struct usb_bos_descriptor *bos, size_t desc_size)
724{
725 ssize_t result;
726 struct device *dev = &usb_dev->dev;
727 void *itr, *top;
728
729
730 itr = (void *)bos + sizeof(*bos);
731 top = itr + desc_size - sizeof(*bos);
732 while (itr < top) {
733 struct usb_dev_cap_header *cap_hdr = itr;
734 size_t cap_size;
735 u8 cap_type;
736 if (top - itr < sizeof(*cap_hdr)) {
737 dev_err(dev, "Device BUG? premature end of BOS header "
738 "data [offset 0x%02x]: only %zu bytes left\n",
739 (int)(itr - (void *)bos), top - itr);
740 result = -ENOSPC;
741 goto error_bad_cap;
742 }
743 cap_size = cap_hdr->bLength;
744 cap_type = cap_hdr->bDevCapabilityType;
745 if (cap_size == 0)
746 break;
747 if (cap_size > top - itr) {
748 dev_err(dev, "Device BUG? premature end of BOS data "
749 "[offset 0x%02x cap %02x %zu bytes]: "
750 "only %zu bytes left\n",
751 (int)(itr - (void *)bos),
752 cap_type, cap_size, top - itr);
753 result = -EBADF;
754 goto error_bad_cap;
755 }
756 switch (cap_type) {
757 case USB_CAP_TYPE_WIRELESS_USB:
758 if (cap_size != sizeof(*wusb_dev->wusb_cap_descr))
759 dev_err(dev, "Device BUG? WUSB Capability "
760 "descriptor is %zu bytes vs %zu "
761 "needed\n", cap_size,
762 sizeof(*wusb_dev->wusb_cap_descr));
763 else
764 wusb_dev->wusb_cap_descr = itr;
765 break;
766 default:
767 dev_err(dev, "BUG? Unknown BOS capability 0x%02x "
768 "(%zu bytes) at offset 0x%02x\n", cap_type,
769 cap_size, (int)(itr - (void *)bos));
770 }
771 itr += cap_size;
772 }
773 result = 0;
774error_bad_cap:
775 return result;
776}
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792static int wusb_dev_bos_add(struct usb_device *usb_dev,
793 struct wusb_dev *wusb_dev)
794{
795 ssize_t result;
796 struct device *dev = &usb_dev->dev;
797 struct usb_bos_descriptor *bos;
798 size_t alloc_size = 32, desc_size = 4;
799
800 bos = kmalloc(alloc_size, GFP_KERNEL);
801 if (bos == NULL)
802 return -ENOMEM;
803 result = usb_get_descriptor(usb_dev, USB_DT_BOS, 0, bos, desc_size);
804 if (result < 4) {
805 dev_err(dev, "Can't get BOS descriptor or too short: %zd\n",
806 result);
807 goto error_get_descriptor;
808 }
809 desc_size = le16_to_cpu(bos->wTotalLength);
810 if (desc_size >= alloc_size) {
811 kfree(bos);
812 alloc_size = desc_size;
813 bos = kmalloc(alloc_size, GFP_KERNEL);
814 if (bos == NULL)
815 return -ENOMEM;
816 }
817 result = usb_get_descriptor(usb_dev, USB_DT_BOS, 0, bos, desc_size);
818 if (result < 0 || result != desc_size) {
819 dev_err(dev, "Can't get BOS descriptor or too short (need "
820 "%zu bytes): %zd\n", desc_size, result);
821 goto error_get_descriptor;
822 }
823 if (result < sizeof(*bos)
824 || le16_to_cpu(bos->wTotalLength) != desc_size) {
825 dev_err(dev, "Can't get BOS descriptor or too short (need "
826 "%zu bytes): %zd\n", desc_size, result);
827 goto error_get_descriptor;
828 }
829
830 result = wusb_dev_bos_grok(usb_dev, wusb_dev, bos, result);
831 if (result < 0)
832 goto error_bad_bos;
833 wusb_dev->bos = bos;
834 return 0;
835
836error_bad_bos:
837error_get_descriptor:
838 kfree(bos);
839 wusb_dev->wusb_cap_descr = NULL;
840 return result;
841}
842
843static void wusb_dev_bos_rm(struct wusb_dev *wusb_dev)
844{
845 kfree(wusb_dev->bos);
846 wusb_dev->wusb_cap_descr = NULL;
847};
848
849static struct usb_wireless_cap_descriptor wusb_cap_descr_default = {
850 .bLength = sizeof(wusb_cap_descr_default),
851 .bDescriptorType = USB_DT_DEVICE_CAPABILITY,
852 .bDevCapabilityType = USB_CAP_TYPE_WIRELESS_USB,
853
854 .bmAttributes = USB_WIRELESS_BEACON_NONE,
855 .wPHYRates = cpu_to_le16(USB_WIRELESS_PHY_53),
856 .bmTFITXPowerInfo = 0,
857 .bmFFITXPowerInfo = 0,
858 .bmBandGroup = cpu_to_le16(0x0001),
859 .bReserved = 0
860};
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884static void wusb_dev_add_ncb(struct usb_device *usb_dev)
885{
886 int result = 0;
887 struct wusb_dev *wusb_dev;
888 struct wusbhc *wusbhc;
889 struct device *dev = &usb_dev->dev;
890 u8 port_idx;
891
892 if (usb_dev->wusb == 0 || usb_dev->devnum == 1)
893 return;
894
895 usb_set_device_state(usb_dev, USB_STATE_UNAUTHENTICATED);
896
897 wusbhc = wusbhc_get_by_usb_dev(usb_dev);
898 if (wusbhc == NULL)
899 goto error_nodev;
900 mutex_lock(&wusbhc->mutex);
901 wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, usb_dev);
902 port_idx = wusb_port_no_to_idx(usb_dev->portnum);
903 mutex_unlock(&wusbhc->mutex);
904 if (wusb_dev == NULL)
905 goto error_nodev;
906 wusb_dev->usb_dev = usb_get_dev(usb_dev);
907 usb_dev->wusb_dev = wusb_dev_get(wusb_dev);
908 result = wusb_dev_sec_add(wusbhc, usb_dev, wusb_dev);
909 if (result < 0) {
910 dev_err(dev, "Cannot enable security: %d\n", result);
911 goto error_sec_add;
912 }
913
914 result = wusb_dev_bos_add(usb_dev, wusb_dev);
915 if (result < 0) {
916 dev_err(dev, "Cannot get BOS descriptors: %d\n", result);
917 goto error_bos_add;
918 }
919 result = wusb_dev_sysfs_add(wusbhc, usb_dev, wusb_dev);
920 if (result < 0)
921 goto error_add_sysfs;
922out:
923 wusb_dev_put(wusb_dev);
924 wusbhc_put(wusbhc);
925error_nodev:
926 return;
927
928 wusb_dev_sysfs_rm(wusb_dev);
929error_add_sysfs:
930 wusb_dev_bos_rm(wusb_dev);
931error_bos_add:
932 wusb_dev_sec_rm(wusb_dev);
933error_sec_add:
934 mutex_lock(&wusbhc->mutex);
935 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, port_idx));
936 mutex_unlock(&wusbhc->mutex);
937 goto out;
938}
939
940
941
942
943
944
945static void wusb_dev_rm_ncb(struct usb_device *usb_dev)
946{
947 struct wusb_dev *wusb_dev = usb_dev->wusb_dev;
948
949 if (usb_dev->wusb == 0 || usb_dev->devnum == 1)
950 return;
951
952 wusb_dev_sysfs_rm(wusb_dev);
953 wusb_dev_bos_rm(wusb_dev);
954 wusb_dev_sec_rm(wusb_dev);
955 wusb_dev->usb_dev = NULL;
956 usb_dev->wusb_dev = NULL;
957 wusb_dev_put(wusb_dev);
958 usb_put_dev(usb_dev);
959}
960
961
962
963
964
965
966
967
968
969int wusb_usb_ncb(struct notifier_block *nb, unsigned long val,
970 void *priv)
971{
972 int result = NOTIFY_OK;
973
974 switch (val) {
975 case USB_DEVICE_ADD:
976 wusb_dev_add_ncb(priv);
977 break;
978 case USB_DEVICE_REMOVE:
979 wusb_dev_rm_ncb(priv);
980 break;
981 case USB_BUS_ADD:
982
983 case USB_BUS_REMOVE:
984 break;
985 default:
986 WARN_ON(1);
987 result = NOTIFY_BAD;
988 };
989 return result;
990}
991
992
993
994
995struct wusb_dev *__wusb_dev_get_by_usb_dev(struct wusbhc *wusbhc,
996 struct usb_device *usb_dev)
997{
998 struct wusb_dev *wusb_dev;
999 u8 port_idx;
1000
1001 port_idx = wusb_port_no_to_idx(usb_dev->portnum);
1002 BUG_ON(port_idx > wusbhc->ports_max);
1003 wusb_dev = wusb_port_by_idx(wusbhc, port_idx)->wusb_dev;
1004 if (wusb_dev != NULL)
1005 wusb_dev_get(wusb_dev);
1006 return wusb_dev;
1007}
1008EXPORT_SYMBOL_GPL(__wusb_dev_get_by_usb_dev);
1009
1010void wusb_dev_destroy(struct kref *_wusb_dev)
1011{
1012 struct wusb_dev *wusb_dev = container_of(_wusb_dev, struct wusb_dev, refcnt);
1013
1014 list_del_init(&wusb_dev->cack_node);
1015 wusb_dev_free(wusb_dev);
1016}
1017EXPORT_SYMBOL_GPL(wusb_dev_destroy);
1018
1019
1020
1021
1022
1023
1024
1025int wusbhc_devconnect_create(struct wusbhc *wusbhc)
1026{
1027 wusbhc->keep_alive_ie.hdr.bIEIdentifier = WUIE_ID_KEEP_ALIVE;
1028 wusbhc->keep_alive_ie.hdr.bLength = sizeof(wusbhc->keep_alive_ie.hdr);
1029 INIT_DELAYED_WORK(&wusbhc->keep_alive_timer, wusbhc_keep_alive_run);
1030
1031 wusbhc->cack_ie.hdr.bIEIdentifier = WUIE_ID_CONNECTACK;
1032 wusbhc->cack_ie.hdr.bLength = sizeof(wusbhc->cack_ie.hdr);
1033 INIT_LIST_HEAD(&wusbhc->cack_list);
1034
1035 return 0;
1036}
1037
1038
1039
1040
1041void wusbhc_devconnect_destroy(struct wusbhc *wusbhc)
1042{
1043
1044}
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055int wusbhc_devconnect_start(struct wusbhc *wusbhc)
1056{
1057 struct device *dev = wusbhc->dev;
1058 struct wuie_host_info *hi;
1059 int result;
1060
1061 hi = kzalloc(sizeof(*hi), GFP_KERNEL);
1062 if (hi == NULL)
1063 return -ENOMEM;
1064
1065 hi->hdr.bLength = sizeof(*hi);
1066 hi->hdr.bIEIdentifier = WUIE_ID_HOST_INFO;
1067 hi->attributes = cpu_to_le16((wusbhc->rsv->stream << 3) | WUIE_HI_CAP_ALL);
1068 hi->CHID = wusbhc->chid;
1069 result = wusbhc_mmcie_set(wusbhc, 0, 0, &hi->hdr);
1070 if (result < 0) {
1071 dev_err(dev, "Cannot add Host Info MMCIE: %d\n", result);
1072 goto error_mmcie_set;
1073 }
1074 wusbhc->wuie_host_info = hi;
1075
1076 queue_delayed_work(wusbd, &wusbhc->keep_alive_timer,
1077 (wusbhc->trust_timeout*CONFIG_HZ)/1000/2);
1078
1079 return 0;
1080
1081error_mmcie_set:
1082 kfree(hi);
1083 return result;
1084}
1085
1086
1087
1088
1089
1090
1091
1092
1093void wusbhc_devconnect_stop(struct wusbhc *wusbhc)
1094{
1095 int i;
1096
1097 mutex_lock(&wusbhc->mutex);
1098 for (i = 0; i < wusbhc->ports_max; i++) {
1099 if (wusbhc->port[i].wusb_dev)
1100 __wusbhc_dev_disconnect(wusbhc, &wusbhc->port[i]);
1101 }
1102 mutex_unlock(&wusbhc->mutex);
1103
1104 cancel_delayed_work_sync(&wusbhc->keep_alive_timer);
1105 wusbhc_mmcie_rm(wusbhc, &wusbhc->wuie_host_info->hdr);
1106 kfree(wusbhc->wuie_host_info);
1107 wusbhc->wuie_host_info = NULL;
1108}
1109
1110
1111
1112
1113
1114
1115
1116int wusb_set_dev_addr(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev, u8 addr)
1117{
1118 int result;
1119
1120 wusb_dev->addr = addr;
1121 result = wusbhc->dev_info_set(wusbhc, wusb_dev);
1122 if (result < 0)
1123 dev_err(wusbhc->dev, "device %d: failed to set device "
1124 "address\n", wusb_dev->port_idx);
1125 else
1126 dev_info(wusbhc->dev, "device %d: %s addr %u\n",
1127 wusb_dev->port_idx,
1128 (addr & WUSB_DEV_ADDR_UNAUTH) ? "unauth" : "auth",
1129 wusb_dev->addr);
1130
1131 return result;
1132}
1133