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