Lines Matching refs:wusbhc
89 static struct wusb_dev *wusb_dev_alloc(struct wusbhc *wusbhc) in wusb_dev_alloc() argument
97 wusb_dev->wusbhc = wusbhc; in wusb_dev_alloc()
118 static void wusbhc_fill_cack_ie(struct wusbhc *wusbhc) in wusbhc_fill_cack_ie() argument
124 cack_ie = &wusbhc->cack_ie; in wusbhc_fill_cack_ie()
126 list_for_each_entry(dev_itr, &wusbhc->cack_list, cack_node) { in wusbhc_fill_cack_ie()
148 static struct wusb_dev *wusbhc_cack_add(struct wusbhc *wusbhc, in wusbhc_cack_add() argument
152 struct device *dev = wusbhc->dev; in wusbhc_cack_add()
159 list_for_each_entry(wusb_dev, &wusbhc->cack_list, cack_node) in wusbhc_cack_add()
164 wusb_dev = wusb_dev_alloc(wusbhc); in wusbhc_cack_add()
190 result = wusb_set_dev_addr(wusbhc, wusb_dev, dev_addr); in wusbhc_cack_add()
195 list_add_tail(&wusb_dev->cack_node, &wusbhc->cack_list); in wusbhc_cack_add()
196 wusbhc->cack_count++; in wusbhc_cack_add()
197 wusbhc_fill_cack_ie(wusbhc); in wusbhc_cack_add()
207 static void wusbhc_cack_rm(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) in wusbhc_cack_rm() argument
210 wusbhc->cack_count--; in wusbhc_cack_rm()
211 wusbhc_fill_cack_ie(wusbhc); in wusbhc_cack_rm()
217 void wusbhc_devconnect_acked(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) in wusbhc_devconnect_acked() argument
219 wusbhc_cack_rm(wusbhc, wusb_dev); in wusbhc_devconnect_acked()
220 if (wusbhc->cack_count) in wusbhc_devconnect_acked()
221 wusbhc_mmcie_set(wusbhc, 0, 0, &wusbhc->cack_ie.hdr); in wusbhc_devconnect_acked()
223 wusbhc_mmcie_rm(wusbhc, &wusbhc->cack_ie.hdr); in wusbhc_devconnect_acked()
230 struct wusbhc *wusbhc = wusb_dev->wusbhc; in wusbhc_devconnect_acked_work() local
232 mutex_lock(&wusbhc->mutex); in wusbhc_devconnect_acked_work()
233 wusbhc_devconnect_acked(wusbhc, wusb_dev); in wusbhc_devconnect_acked_work()
234 mutex_unlock(&wusbhc->mutex); in wusbhc_devconnect_acked_work()
266 void wusbhc_devconnect_ack(struct wusbhc *wusbhc, struct wusb_dn_connect *dnc, in wusbhc_devconnect_ack() argument
270 struct device *dev = wusbhc->dev; in wusbhc_devconnect_ack()
275 mutex_lock(&wusbhc->mutex); in wusbhc_devconnect_ack()
278 for (idx = 0; idx < wusbhc->ports_max; idx++) { in wusbhc_devconnect_ack()
279 port = wusb_port_by_idx(wusbhc, idx); in wusbhc_devconnect_ack()
285 for (idx = 0; idx < wusbhc->ports_max; idx++) { in wusbhc_devconnect_ack()
286 port = wusb_port_by_idx(wusbhc, idx); in wusbhc_devconnect_ack()
291 if (idx >= wusbhc->ports_max) { in wusbhc_devconnect_ack()
294 wusbhc->ports_max, pr_cdid); in wusbhc_devconnect_ack()
302 wusbhc->set_ptk(wusbhc, idx, 0, NULL, 0); in wusbhc_devconnect_ack()
306 wusb_dev = wusbhc_cack_add(wusbhc, dnc, pr_cdid, idx); in wusbhc_devconnect_ack()
309 result = wusbhc_mmcie_set(wusbhc, 0, 0, &wusbhc->cack_ie.hdr); in wusbhc_devconnect_ack()
324 mutex_unlock(&wusbhc->mutex); in wusbhc_devconnect_ack()
344 static void __wusbhc_dev_disconnect(struct wusbhc *wusbhc, in __wusbhc_dev_disconnect() argument
354 dev_dbg(wusbhc->dev, "disconnecting device from port %d\n", wusb_dev->port_idx); in __wusbhc_dev_disconnect()
364 if (wusbhc->active) in __wusbhc_dev_disconnect()
365 wusbhc_gtk_rekey(wusbhc); in __wusbhc_dev_disconnect()
389 static void __wusbhc_keep_alive(struct wusbhc *wusbhc) in __wusbhc_keep_alive() argument
391 struct device *dev = wusbhc->dev; in __wusbhc_keep_alive()
395 struct wuie_keep_alive *ie = &wusbhc->keep_alive_ie; in __wusbhc_keep_alive()
401 keep_alives < WUIE_ELT_MAX && cnt < wusbhc->ports_max; in __wusbhc_keep_alive()
403 unsigned tt = msecs_to_jiffies(wusbhc->trust_timeout); in __wusbhc_keep_alive()
405 wusb_port = wusb_port_by_idx(wusbhc, cnt); in __wusbhc_keep_alive()
416 __wusbhc_dev_disconnect(wusbhc, wusb_port); in __wusbhc_keep_alive()
427 wusbhc_mmcie_set(wusbhc, 10, 5, &ie->hdr); in __wusbhc_keep_alive()
429 wusbhc_mmcie_rm(wusbhc, &ie->hdr); in __wusbhc_keep_alive()
438 struct wusbhc *wusbhc = container_of(dw, struct wusbhc, keep_alive_timer); in wusbhc_keep_alive_run() local
440 mutex_lock(&wusbhc->mutex); in wusbhc_keep_alive_run()
441 __wusbhc_keep_alive(wusbhc); in wusbhc_keep_alive_run()
442 mutex_unlock(&wusbhc->mutex); in wusbhc_keep_alive_run()
444 queue_delayed_work(wusbd, &wusbhc->keep_alive_timer, in wusbhc_keep_alive_run()
445 msecs_to_jiffies(wusbhc->trust_timeout / 2)); in wusbhc_keep_alive_run()
455 static struct wusb_dev *wusbhc_find_dev_by_addr(struct wusbhc *wusbhc, u8 addr) in wusbhc_find_dev_by_addr() argument
464 if (port < 0 || port >= wusbhc->ports_max) in wusbhc_find_dev_by_addr()
466 return wusb_port_by_idx(wusbhc, port)->wusb_dev; in wusbhc_find_dev_by_addr()
470 for (p = 0; p < wusbhc->ports_max; p++) { in wusbhc_find_dev_by_addr()
471 struct wusb_dev *wusb_dev = wusb_port_by_idx(wusbhc, p)->wusb_dev; in wusbhc_find_dev_by_addr()
486 static void wusbhc_handle_dn_alive(struct wusbhc *wusbhc, u8 srcaddr) in wusbhc_handle_dn_alive() argument
490 mutex_lock(&wusbhc->mutex); in wusbhc_handle_dn_alive()
491 wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr); in wusbhc_handle_dn_alive()
493 dev_dbg(wusbhc->dev, "ignoring DN_Alive from unconnected device %02x\n", in wusbhc_handle_dn_alive()
497 __wusbhc_keep_alive(wusbhc); in wusbhc_handle_dn_alive()
499 mutex_unlock(&wusbhc->mutex); in wusbhc_handle_dn_alive()
514 static void wusbhc_handle_dn_connect(struct wusbhc *wusbhc, in wusbhc_handle_dn_connect() argument
518 struct device *dev = wusbhc->dev; in wusbhc_handle_dn_connect()
542 wusbhc_devconnect_ack(wusbhc, dnc, pr_cdid); in wusbhc_handle_dn_connect()
552 static void wusbhc_handle_dn_disconnect(struct wusbhc *wusbhc, u8 srcaddr) in wusbhc_handle_dn_disconnect() argument
554 struct device *dev = wusbhc->dev; in wusbhc_handle_dn_disconnect()
557 mutex_lock(&wusbhc->mutex); in wusbhc_handle_dn_disconnect()
558 wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr); in wusbhc_handle_dn_disconnect()
565 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, in wusbhc_handle_dn_disconnect()
568 mutex_unlock(&wusbhc->mutex); in wusbhc_handle_dn_disconnect()
585 void wusbhc_handle_dn(struct wusbhc *wusbhc, u8 srcaddr, in wusbhc_handle_dn() argument
588 struct device *dev = wusbhc->dev; in wusbhc_handle_dn()
597 wusbhc_handle_dn_connect(wusbhc, dn_hdr, size); in wusbhc_handle_dn()
600 wusbhc_handle_dn_alive(wusbhc, srcaddr); in wusbhc_handle_dn()
603 wusbhc_handle_dn_disconnect(wusbhc, srcaddr); in wusbhc_handle_dn()
639 void __wusbhc_dev_disable(struct wusbhc *wusbhc, u8 port_idx) in __wusbhc_dev_disable() argument
642 struct device *dev = wusbhc->dev; in __wusbhc_dev_disable()
646 wusb_dev = wusb_port_by_idx(wusbhc, port_idx)->wusb_dev; in __wusbhc_dev_disable()
653 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, port_idx)); in __wusbhc_dev_disable()
661 result = wusbhc_mmcie_set(wusbhc, 0, 0, &ie->hdr); in __wusbhc_dev_disable()
667 wusbhc_mmcie_rm(wusbhc, &ie->hdr); in __wusbhc_dev_disable()
842 struct wusbhc *wusbhc; in wusb_dev_add_ncb() local
851 wusbhc = wusbhc_get_by_usb_dev(usb_dev); in wusb_dev_add_ncb()
852 if (wusbhc == NULL) in wusb_dev_add_ncb()
854 mutex_lock(&wusbhc->mutex); in wusb_dev_add_ncb()
855 wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, usb_dev); in wusb_dev_add_ncb()
857 mutex_unlock(&wusbhc->mutex); in wusb_dev_add_ncb()
862 result = wusb_dev_sec_add(wusbhc, usb_dev, wusb_dev); in wusb_dev_add_ncb()
873 result = wusb_dev_sysfs_add(wusbhc, usb_dev, wusb_dev); in wusb_dev_add_ncb()
878 wusbhc_put(wusbhc); in wusb_dev_add_ncb()
887 mutex_lock(&wusbhc->mutex); in wusb_dev_add_ncb()
888 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, port_idx)); in wusb_dev_add_ncb()
889 mutex_unlock(&wusbhc->mutex); in wusb_dev_add_ncb()
948 struct wusb_dev *__wusb_dev_get_by_usb_dev(struct wusbhc *wusbhc, in __wusb_dev_get_by_usb_dev() argument
955 BUG_ON(port_idx > wusbhc->ports_max); in __wusb_dev_get_by_usb_dev()
956 wusb_dev = wusb_port_by_idx(wusbhc, port_idx)->wusb_dev; in __wusb_dev_get_by_usb_dev()
978 int wusbhc_devconnect_create(struct wusbhc *wusbhc) in wusbhc_devconnect_create() argument
980 wusbhc->keep_alive_ie.hdr.bIEIdentifier = WUIE_ID_KEEP_ALIVE; in wusbhc_devconnect_create()
981 wusbhc->keep_alive_ie.hdr.bLength = sizeof(wusbhc->keep_alive_ie.hdr); in wusbhc_devconnect_create()
982 INIT_DELAYED_WORK(&wusbhc->keep_alive_timer, wusbhc_keep_alive_run); in wusbhc_devconnect_create()
984 wusbhc->cack_ie.hdr.bIEIdentifier = WUIE_ID_CONNECTACK; in wusbhc_devconnect_create()
985 wusbhc->cack_ie.hdr.bLength = sizeof(wusbhc->cack_ie.hdr); in wusbhc_devconnect_create()
986 INIT_LIST_HEAD(&wusbhc->cack_list); in wusbhc_devconnect_create()
994 void wusbhc_devconnect_destroy(struct wusbhc *wusbhc) in wusbhc_devconnect_destroy() argument
1008 int wusbhc_devconnect_start(struct wusbhc *wusbhc) in wusbhc_devconnect_start() argument
1010 struct device *dev = wusbhc->dev; in wusbhc_devconnect_start()
1020 hi->attributes = cpu_to_le16((wusbhc->rsv->stream << 3) | WUIE_HI_CAP_ALL); in wusbhc_devconnect_start()
1021 hi->CHID = wusbhc->chid; in wusbhc_devconnect_start()
1022 result = wusbhc_mmcie_set(wusbhc, 0, 0, &hi->hdr); in wusbhc_devconnect_start()
1027 wusbhc->wuie_host_info = hi; in wusbhc_devconnect_start()
1029 queue_delayed_work(wusbd, &wusbhc->keep_alive_timer, in wusbhc_devconnect_start()
1030 msecs_to_jiffies(wusbhc->trust_timeout / 2)); in wusbhc_devconnect_start()
1046 void wusbhc_devconnect_stop(struct wusbhc *wusbhc) in wusbhc_devconnect_stop() argument
1050 mutex_lock(&wusbhc->mutex); in wusbhc_devconnect_stop()
1051 for (i = 0; i < wusbhc->ports_max; i++) { in wusbhc_devconnect_stop()
1052 if (wusbhc->port[i].wusb_dev) in wusbhc_devconnect_stop()
1053 __wusbhc_dev_disconnect(wusbhc, &wusbhc->port[i]); in wusbhc_devconnect_stop()
1055 mutex_unlock(&wusbhc->mutex); in wusbhc_devconnect_stop()
1057 cancel_delayed_work_sync(&wusbhc->keep_alive_timer); in wusbhc_devconnect_stop()
1058 wusbhc_mmcie_rm(wusbhc, &wusbhc->wuie_host_info->hdr); in wusbhc_devconnect_stop()
1059 kfree(wusbhc->wuie_host_info); in wusbhc_devconnect_stop()
1060 wusbhc->wuie_host_info = NULL; in wusbhc_devconnect_stop()
1069 int wusb_set_dev_addr(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev, u8 addr) in wusb_set_dev_addr() argument
1074 result = wusbhc->dev_info_set(wusbhc, wusb_dev); in wusb_set_dev_addr()
1076 dev_err(wusbhc->dev, "device %d: failed to set device " in wusb_set_dev_addr()
1079 dev_info(wusbhc->dev, "device %d: %s addr %u\n", in wusb_set_dev_addr()