Lines Matching refs:wusbhc
103 static struct wusb_dev *wusb_dev_alloc(struct wusbhc *wusbhc) in wusb_dev_alloc() argument
111 wusb_dev->wusbhc = wusbhc; in wusb_dev_alloc()
132 static void wusbhc_fill_cack_ie(struct wusbhc *wusbhc) in wusbhc_fill_cack_ie() argument
138 cack_ie = &wusbhc->cack_ie; in wusbhc_fill_cack_ie()
140 list_for_each_entry(dev_itr, &wusbhc->cack_list, cack_node) { in wusbhc_fill_cack_ie()
162 static struct wusb_dev *wusbhc_cack_add(struct wusbhc *wusbhc, in wusbhc_cack_add() argument
166 struct device *dev = wusbhc->dev; in wusbhc_cack_add()
173 list_for_each_entry(wusb_dev, &wusbhc->cack_list, cack_node) in wusbhc_cack_add()
178 wusb_dev = wusb_dev_alloc(wusbhc); in wusbhc_cack_add()
204 result = wusb_set_dev_addr(wusbhc, wusb_dev, dev_addr); in wusbhc_cack_add()
209 list_add_tail(&wusb_dev->cack_node, &wusbhc->cack_list); in wusbhc_cack_add()
210 wusbhc->cack_count++; in wusbhc_cack_add()
211 wusbhc_fill_cack_ie(wusbhc); in wusbhc_cack_add()
221 static void wusbhc_cack_rm(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) in wusbhc_cack_rm() argument
224 wusbhc->cack_count--; in wusbhc_cack_rm()
225 wusbhc_fill_cack_ie(wusbhc); in wusbhc_cack_rm()
231 void wusbhc_devconnect_acked(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) in wusbhc_devconnect_acked() argument
233 wusbhc_cack_rm(wusbhc, wusb_dev); in wusbhc_devconnect_acked()
234 if (wusbhc->cack_count) in wusbhc_devconnect_acked()
235 wusbhc_mmcie_set(wusbhc, 0, 0, &wusbhc->cack_ie.hdr); in wusbhc_devconnect_acked()
237 wusbhc_mmcie_rm(wusbhc, &wusbhc->cack_ie.hdr); in wusbhc_devconnect_acked()
244 struct wusbhc *wusbhc = wusb_dev->wusbhc; in wusbhc_devconnect_acked_work() local
246 mutex_lock(&wusbhc->mutex); in wusbhc_devconnect_acked_work()
247 wusbhc_devconnect_acked(wusbhc, wusb_dev); in wusbhc_devconnect_acked_work()
248 mutex_unlock(&wusbhc->mutex); in wusbhc_devconnect_acked_work()
280 void wusbhc_devconnect_ack(struct wusbhc *wusbhc, struct wusb_dn_connect *dnc, in wusbhc_devconnect_ack() argument
284 struct device *dev = wusbhc->dev; in wusbhc_devconnect_ack()
289 mutex_lock(&wusbhc->mutex); in wusbhc_devconnect_ack()
292 for (idx = 0; idx < wusbhc->ports_max; idx++) { in wusbhc_devconnect_ack()
293 port = wusb_port_by_idx(wusbhc, idx); in wusbhc_devconnect_ack()
299 for (idx = 0; idx < wusbhc->ports_max; idx++) { in wusbhc_devconnect_ack()
300 port = wusb_port_by_idx(wusbhc, idx); in wusbhc_devconnect_ack()
305 if (idx >= wusbhc->ports_max) { in wusbhc_devconnect_ack()
308 wusbhc->ports_max, pr_cdid); in wusbhc_devconnect_ack()
316 wusbhc->set_ptk(wusbhc, idx, 0, NULL, 0); in wusbhc_devconnect_ack()
320 wusb_dev = wusbhc_cack_add(wusbhc, dnc, pr_cdid, idx); in wusbhc_devconnect_ack()
323 result = wusbhc_mmcie_set(wusbhc, 0, 0, &wusbhc->cack_ie.hdr); in wusbhc_devconnect_ack()
338 mutex_unlock(&wusbhc->mutex); in wusbhc_devconnect_ack()
358 static void __wusbhc_dev_disconnect(struct wusbhc *wusbhc, in __wusbhc_dev_disconnect() argument
368 dev_dbg(wusbhc->dev, "disconnecting device from port %d\n", wusb_dev->port_idx); in __wusbhc_dev_disconnect()
378 if (wusbhc->active) in __wusbhc_dev_disconnect()
379 wusbhc_gtk_rekey(wusbhc); in __wusbhc_dev_disconnect()
403 static void __wusbhc_keep_alive(struct wusbhc *wusbhc) in __wusbhc_keep_alive() argument
405 struct device *dev = wusbhc->dev; in __wusbhc_keep_alive()
409 struct wuie_keep_alive *ie = &wusbhc->keep_alive_ie; in __wusbhc_keep_alive()
415 keep_alives < WUIE_ELT_MAX && cnt < wusbhc->ports_max; in __wusbhc_keep_alive()
417 unsigned tt = msecs_to_jiffies(wusbhc->trust_timeout); in __wusbhc_keep_alive()
419 wusb_port = wusb_port_by_idx(wusbhc, cnt); in __wusbhc_keep_alive()
430 __wusbhc_dev_disconnect(wusbhc, wusb_port); in __wusbhc_keep_alive()
441 wusbhc_mmcie_set(wusbhc, 10, 5, &ie->hdr); in __wusbhc_keep_alive()
443 wusbhc_mmcie_rm(wusbhc, &ie->hdr); in __wusbhc_keep_alive()
452 struct wusbhc *wusbhc = container_of(dw, struct wusbhc, keep_alive_timer); in wusbhc_keep_alive_run() local
454 mutex_lock(&wusbhc->mutex); in wusbhc_keep_alive_run()
455 __wusbhc_keep_alive(wusbhc); in wusbhc_keep_alive_run()
456 mutex_unlock(&wusbhc->mutex); in wusbhc_keep_alive_run()
458 queue_delayed_work(wusbd, &wusbhc->keep_alive_timer, in wusbhc_keep_alive_run()
459 msecs_to_jiffies(wusbhc->trust_timeout / 2)); in wusbhc_keep_alive_run()
469 static struct wusb_dev *wusbhc_find_dev_by_addr(struct wusbhc *wusbhc, u8 addr) in wusbhc_find_dev_by_addr() argument
478 if (port < 0 || port >= wusbhc->ports_max) in wusbhc_find_dev_by_addr()
480 return wusb_port_by_idx(wusbhc, port)->wusb_dev; in wusbhc_find_dev_by_addr()
484 for (p = 0; p < wusbhc->ports_max; p++) { in wusbhc_find_dev_by_addr()
485 struct wusb_dev *wusb_dev = wusb_port_by_idx(wusbhc, p)->wusb_dev; in wusbhc_find_dev_by_addr()
500 static void wusbhc_handle_dn_alive(struct wusbhc *wusbhc, u8 srcaddr) in wusbhc_handle_dn_alive() argument
504 mutex_lock(&wusbhc->mutex); in wusbhc_handle_dn_alive()
505 wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr); in wusbhc_handle_dn_alive()
507 dev_dbg(wusbhc->dev, "ignoring DN_Alive from unconnected device %02x\n", in wusbhc_handle_dn_alive()
511 __wusbhc_keep_alive(wusbhc); in wusbhc_handle_dn_alive()
513 mutex_unlock(&wusbhc->mutex); in wusbhc_handle_dn_alive()
528 static void wusbhc_handle_dn_connect(struct wusbhc *wusbhc, in wusbhc_handle_dn_connect() argument
532 struct device *dev = wusbhc->dev; in wusbhc_handle_dn_connect()
556 wusbhc_devconnect_ack(wusbhc, dnc, pr_cdid); in wusbhc_handle_dn_connect()
566 static void wusbhc_handle_dn_disconnect(struct wusbhc *wusbhc, u8 srcaddr) in wusbhc_handle_dn_disconnect() argument
568 struct device *dev = wusbhc->dev; in wusbhc_handle_dn_disconnect()
571 mutex_lock(&wusbhc->mutex); in wusbhc_handle_dn_disconnect()
572 wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr); in wusbhc_handle_dn_disconnect()
579 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, in wusbhc_handle_dn_disconnect()
582 mutex_unlock(&wusbhc->mutex); in wusbhc_handle_dn_disconnect()
599 void wusbhc_handle_dn(struct wusbhc *wusbhc, u8 srcaddr, in wusbhc_handle_dn() argument
602 struct device *dev = wusbhc->dev; in wusbhc_handle_dn()
611 wusbhc_handle_dn_connect(wusbhc, dn_hdr, size); in wusbhc_handle_dn()
614 wusbhc_handle_dn_alive(wusbhc, srcaddr); in wusbhc_handle_dn()
617 wusbhc_handle_dn_disconnect(wusbhc, srcaddr); in wusbhc_handle_dn()
653 void __wusbhc_dev_disable(struct wusbhc *wusbhc, u8 port_idx) in __wusbhc_dev_disable() argument
656 struct device *dev = wusbhc->dev; in __wusbhc_dev_disable()
660 wusb_dev = wusb_port_by_idx(wusbhc, port_idx)->wusb_dev; in __wusbhc_dev_disable()
667 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, port_idx)); in __wusbhc_dev_disable()
675 result = wusbhc_mmcie_set(wusbhc, 0, 0, &ie->hdr); in __wusbhc_dev_disable()
681 wusbhc_mmcie_rm(wusbhc, &ie->hdr); in __wusbhc_dev_disable()
856 struct wusbhc *wusbhc; in wusb_dev_add_ncb() local
865 wusbhc = wusbhc_get_by_usb_dev(usb_dev); in wusb_dev_add_ncb()
866 if (wusbhc == NULL) in wusb_dev_add_ncb()
868 mutex_lock(&wusbhc->mutex); in wusb_dev_add_ncb()
869 wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, usb_dev); in wusb_dev_add_ncb()
871 mutex_unlock(&wusbhc->mutex); in wusb_dev_add_ncb()
876 result = wusb_dev_sec_add(wusbhc, usb_dev, wusb_dev); in wusb_dev_add_ncb()
887 result = wusb_dev_sysfs_add(wusbhc, usb_dev, wusb_dev); in wusb_dev_add_ncb()
892 wusbhc_put(wusbhc); in wusb_dev_add_ncb()
902 mutex_lock(&wusbhc->mutex); in wusb_dev_add_ncb()
903 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, port_idx)); in wusb_dev_add_ncb()
904 mutex_unlock(&wusbhc->mutex); in wusb_dev_add_ncb()
963 struct wusb_dev *__wusb_dev_get_by_usb_dev(struct wusbhc *wusbhc, in __wusb_dev_get_by_usb_dev() argument
970 BUG_ON(port_idx > wusbhc->ports_max); in __wusb_dev_get_by_usb_dev()
971 wusb_dev = wusb_port_by_idx(wusbhc, port_idx)->wusb_dev; in __wusb_dev_get_by_usb_dev()
993 int wusbhc_devconnect_create(struct wusbhc *wusbhc) in wusbhc_devconnect_create() argument
995 wusbhc->keep_alive_ie.hdr.bIEIdentifier = WUIE_ID_KEEP_ALIVE; in wusbhc_devconnect_create()
996 wusbhc->keep_alive_ie.hdr.bLength = sizeof(wusbhc->keep_alive_ie.hdr); in wusbhc_devconnect_create()
997 INIT_DELAYED_WORK(&wusbhc->keep_alive_timer, wusbhc_keep_alive_run); in wusbhc_devconnect_create()
999 wusbhc->cack_ie.hdr.bIEIdentifier = WUIE_ID_CONNECTACK; in wusbhc_devconnect_create()
1000 wusbhc->cack_ie.hdr.bLength = sizeof(wusbhc->cack_ie.hdr); in wusbhc_devconnect_create()
1001 INIT_LIST_HEAD(&wusbhc->cack_list); in wusbhc_devconnect_create()
1009 void wusbhc_devconnect_destroy(struct wusbhc *wusbhc) in wusbhc_devconnect_destroy() argument
1023 int wusbhc_devconnect_start(struct wusbhc *wusbhc) in wusbhc_devconnect_start() argument
1025 struct device *dev = wusbhc->dev; in wusbhc_devconnect_start()
1035 hi->attributes = cpu_to_le16((wusbhc->rsv->stream << 3) | WUIE_HI_CAP_ALL); in wusbhc_devconnect_start()
1036 hi->CHID = wusbhc->chid; in wusbhc_devconnect_start()
1037 result = wusbhc_mmcie_set(wusbhc, 0, 0, &hi->hdr); in wusbhc_devconnect_start()
1042 wusbhc->wuie_host_info = hi; in wusbhc_devconnect_start()
1044 queue_delayed_work(wusbd, &wusbhc->keep_alive_timer, in wusbhc_devconnect_start()
1045 msecs_to_jiffies(wusbhc->trust_timeout / 2)); in wusbhc_devconnect_start()
1061 void wusbhc_devconnect_stop(struct wusbhc *wusbhc) in wusbhc_devconnect_stop() argument
1065 mutex_lock(&wusbhc->mutex); in wusbhc_devconnect_stop()
1066 for (i = 0; i < wusbhc->ports_max; i++) { in wusbhc_devconnect_stop()
1067 if (wusbhc->port[i].wusb_dev) in wusbhc_devconnect_stop()
1068 __wusbhc_dev_disconnect(wusbhc, &wusbhc->port[i]); in wusbhc_devconnect_stop()
1070 mutex_unlock(&wusbhc->mutex); in wusbhc_devconnect_stop()
1072 cancel_delayed_work_sync(&wusbhc->keep_alive_timer); in wusbhc_devconnect_stop()
1073 wusbhc_mmcie_rm(wusbhc, &wusbhc->wuie_host_info->hdr); in wusbhc_devconnect_stop()
1074 kfree(wusbhc->wuie_host_info); in wusbhc_devconnect_stop()
1075 wusbhc->wuie_host_info = NULL; in wusbhc_devconnect_stop()
1084 int wusb_set_dev_addr(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev, u8 addr) in wusb_set_dev_addr() argument
1089 result = wusbhc->dev_info_set(wusbhc, wusb_dev); in wusb_set_dev_addr()
1091 dev_err(wusbhc->dev, "device %d: failed to set device " in wusb_set_dev_addr()
1094 dev_info(wusbhc->dev, "device %d: %s addr %u\n", in wusb_set_dev_addr()