• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/usb/wusbcore/

Lines Matching defs:wusbhc

7 #include "wusbhc.h"
20 static struct wusb_dev *wusb_dev_alloc(struct wusbhc *wusbhc)
30 wusb_dev->wusbhc = wusbhc;
46 req->wValue = cpu_to_le16(USB_DT_KEY << 8 | wusbhc->gtk_index);
48 req->wLength = cpu_to_le16(wusbhc->gtk.descr.bLength);
58 * Using the Connect-Ack list, fill out the @wusbhc Connect-Ack WUSB IE
61 * We just get the @wusbhc->ca_list and fill out the first four ones or
65 * @wusbhc->mutex must be taken
67 static void wusbhc_fill_cack_ie(struct wusbhc *wusbhc)
73 cack_ie = &wusbhc->cack_ie;
75 list_for_each_entry(dev_itr, &wusbhc->cack_list, cack_node) {
95 * @wusbhc->mutex must be taken
97 static struct wusb_dev *wusbhc_cack_add(struct wusbhc *wusbhc,
101 struct device *dev = wusbhc->dev;
108 list_for_each_entry(wusb_dev, &wusbhc->cack_list, cack_node)
113 wusb_dev = wusb_dev_alloc(wusbhc);
137 result = wusb_set_dev_addr(wusbhc, wusb_dev, dev_addr);
142 list_add_tail(&wusb_dev->cack_node, &wusbhc->cack_list);
143 wusbhc->cack_count++;
144 wusbhc_fill_cack_ie(wusbhc);
152 * @wusbhc->mutex must be taken
154 static void wusbhc_cack_rm(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev)
157 wusbhc->cack_count--;
158 wusbhc_fill_cack_ie(wusbhc);
162 * @wusbhc->mutex must be taken */
164 void wusbhc_devconnect_acked(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev)
166 wusbhc_cack_rm(wusbhc, wusb_dev);
167 if (wusbhc->cack_count)
168 wusbhc_mmcie_set(wusbhc, 0, 0, &wusbhc->cack_ie.hdr);
170 wusbhc_mmcie_rm(wusbhc, &wusbhc->cack_ie.hdr);
177 struct wusbhc *wusbhc = wusb_dev->wusbhc;
179 mutex_lock(&wusbhc->mutex);
180 wusbhc_devconnect_acked(wusbhc, wusb_dev);
181 mutex_unlock(&wusbhc->mutex);
187 void wusbhc_devconnect_ack(struct wusbhc *wusbhc, struct wusb_dn_connect *dnc,
191 struct device *dev = wusbhc->dev;
196 mutex_lock(&wusbhc->mutex);
199 for (idx = 0; idx < wusbhc->ports_max; idx++) {
200 port = wusb_port_by_idx(wusbhc, idx);
206 for (idx = 0; idx < wusbhc->ports_max; idx++) {
207 port = wusb_port_by_idx(wusbhc, idx);
212 if (idx >= wusbhc->ports_max) {
215 wusbhc->ports_max, pr_cdid);
225 wusbhc->set_ptk(wusbhc, idx, 0, NULL, 0);
229 wusb_dev = wusbhc_cack_add(wusbhc, dnc, pr_cdid, idx);
232 result = wusbhc_mmcie_set(wusbhc, 0, 0, &wusbhc->cack_ie.hdr);
247 mutex_unlock(&wusbhc->mutex);
262 * NOTE: @wusbhc->mutex is locked
267 static void __wusbhc_dev_disconnect(struct wusbhc *wusbhc,
277 dev_dbg(wusbhc->dev, "disconnecting device from port %d\n", wusb_dev->port_idx);
287 if (wusbhc->active)
288 wusbhc_gtk_rekey(wusbhc);
296 static void __wusbhc_keep_alive(struct wusbhc *wusbhc)
298 struct device *dev = wusbhc->dev;
302 struct wuie_keep_alive *ie = &wusbhc->keep_alive_ie;
308 keep_alives < WUIE_ELT_MAX && cnt < wusbhc->ports_max;
310 unsigned tt = msecs_to_jiffies(wusbhc->trust_timeout);
312 wusb_port = wusb_port_by_idx(wusbhc, cnt);
323 __wusbhc_dev_disconnect(wusbhc, wusb_port);
334 wusbhc_mmcie_set(wusbhc, 10, 5, &ie->hdr);
336 wusbhc_mmcie_rm(wusbhc, &ie->hdr);
345 struct wusbhc *wusbhc = container_of(dw, struct wusbhc, keep_alive_timer);
347 mutex_lock(&wusbhc->mutex);
348 __wusbhc_keep_alive(wusbhc);
349 mutex_unlock(&wusbhc->mutex);
351 queue_delayed_work(wusbd, &wusbhc->keep_alive_timer,
352 msecs_to_jiffies(wusbhc->trust_timeout / 2));
362 static struct wusb_dev *wusbhc_find_dev_by_addr(struct wusbhc *wusbhc, u8 addr)
371 if (port < 0 || port >= wusbhc->ports_max)
373 return wusb_port_by_idx(wusbhc, port)->wusb_dev;
377 for (p = 0; p < wusbhc->ports_max; p++) {
378 struct wusb_dev *wusb_dev = wusb_port_by_idx(wusbhc, p)->wusb_dev;
391 * @wusbhc shall be referenced and unlocked
393 static void wusbhc_handle_dn_alive(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev)
395 mutex_lock(&wusbhc->mutex);
397 __wusbhc_keep_alive(wusbhc);
398 mutex_unlock(&wusbhc->mutex);
404 * @wusbhc
411 * @wusbhc->mutex shall be held
413 static void wusbhc_handle_dn_connect(struct wusbhc *wusbhc,
417 struct device *dev = wusbhc->dev;
441 wusbhc_devconnect_ack(wusbhc, dnc, pr_cdid);
449 * @wusbhc shall be referenced and unlocked
451 static void wusbhc_handle_dn_disconnect(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev)
453 struct device *dev = wusbhc->dev;
457 mutex_lock(&wusbhc->mutex);
458 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, wusb_dev->port_idx));
459 mutex_unlock(&wusbhc->mutex);
471 * @wusbhc shall be referenced
476 void wusbhc_handle_dn(struct wusbhc *wusbhc, u8 srcaddr,
479 struct device *dev = wusbhc->dev;
488 wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr);
497 wusbhc_handle_dn_connect(wusbhc, dn_hdr, size);
500 wusbhc_handle_dn_alive(wusbhc, wusb_dev);
503 wusbhc_handle_dn_disconnect(wusbhc, wusb_dev);
522 * @wusbhc
523 * @port Fake port where the device is (wusbhc index, not USB port number).
536 * @wusbhc should be refcounted and locked
538 void __wusbhc_dev_disable(struct wusbhc *wusbhc, u8 port_idx)
541 struct device *dev = wusbhc->dev;
545 wusb_dev = wusb_port_by_idx(wusbhc, port_idx)->wusb_dev;
552 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, port_idx));
560 result = wusbhc_mmcie_set(wusbhc, 0, 0, &ie->hdr);
566 wusbhc_mmcie_rm(wusbhc, &ie->hdr);
732 struct wusbhc *wusbhc;
741 wusbhc = wusbhc_get_by_usb_dev(usb_dev);
742 if (wusbhc == NULL)
744 mutex_lock(&wusbhc->mutex);
745 wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, usb_dev);
747 mutex_unlock(&wusbhc->mutex);
752 result = wusb_dev_sec_add(wusbhc, usb_dev, wusb_dev);
763 result = wusb_dev_sysfs_add(wusbhc, usb_dev, wusb_dev);
768 wusbhc_put(wusbhc);
778 mutex_lock(&wusbhc->mutex);
779 __wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, port_idx));
780 mutex_unlock(&wusbhc->mutex);
837 * Return a referenced wusb_dev given a @wusbhc and @usb_dev
839 struct wusb_dev *__wusb_dev_get_by_usb_dev(struct wusbhc *wusbhc,
846 BUG_ON(port_idx > wusbhc->ports_max);
847 wusb_dev = wusb_port_by_idx(wusbhc, port_idx)->wusb_dev;
869 int wusbhc_devconnect_create(struct wusbhc *wusbhc)
871 wusbhc->keep_alive_ie.hdr.bIEIdentifier = WUIE_ID_KEEP_ALIVE;
872 wusbhc->keep_alive_ie.hdr.bLength = sizeof(wusbhc->keep_alive_ie.hdr);
873 INIT_DELAYED_WORK(&wusbhc->keep_alive_timer, wusbhc_keep_alive_run);
875 wusbhc->cack_ie.hdr.bIEIdentifier = WUIE_ID_CONNECTACK;
876 wusbhc->cack_ie.hdr.bLength = sizeof(wusbhc->cack_ie.hdr);
877 INIT_LIST_HEAD(&wusbhc->cack_list);
885 void wusbhc_devconnect_destroy(struct wusbhc *wusbhc)
890 int wusbhc_devconnect_start(struct wusbhc *wusbhc)
892 struct device *dev = wusbhc->dev;
902 hi->attributes = cpu_to_le16((wusbhc->rsv->stream << 3) | WUIE_HI_CAP_ALL);
903 hi->CHID = wusbhc->chid;
904 result = wusbhc_mmcie_set(wusbhc, 0, 0, &hi->hdr);
909 wusbhc->wuie_host_info = hi;
911 queue_delayed_work(wusbd, &wusbhc->keep_alive_timer,
912 (wusbhc->trust_timeout*CONFIG_HZ)/1000/2);
923 * @wusbhc: the WUSB HC
928 void wusbhc_devconnect_stop(struct wusbhc *wusbhc)
932 mutex_lock(&wusbhc->mutex);
933 for (i = 0; i < wusbhc->ports_max; i++) {
934 if (wusbhc->port[i].wusb_dev)
935 __wusbhc_dev_disconnect(wusbhc, &wusbhc->port[i]);
937 mutex_unlock(&wusbhc->mutex);
939 cancel_delayed_work_sync(&wusbhc->keep_alive_timer);
940 wusbhc_mmcie_rm(wusbhc, &wusbhc->wuie_host_info->hdr);
941 kfree(wusbhc->wuie_host_info);
942 wusbhc->wuie_host_info = NULL;
947 * @wusbhc: the WUSB HC the device is connect to
951 int wusb_set_dev_addr(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev, u8 addr)
956 result = wusbhc->dev_info_set(wusbhc, wusb_dev);
958 dev_err(wusbhc->dev, "device %d: failed to set device "
961 dev_info(wusbhc->dev, "device %d: %s addr %u\n",