Lines Matching refs:dln2

129 	struct dln2_dev *dln2 = dev_get_drvdata(pdev->dev.parent);  in dln2_register_event_cb()  local
142 spin_lock_irqsave(&dln2->event_cb_lock, flags); in dln2_register_event_cb()
144 list_for_each_entry(i, &dln2->event_cb_list, list) { in dln2_register_event_cb()
152 list_add_rcu(&entry->list, &dln2->event_cb_list); in dln2_register_event_cb()
154 spin_unlock_irqrestore(&dln2->event_cb_lock, flags); in dln2_register_event_cb()
165 struct dln2_dev *dln2 = dev_get_drvdata(pdev->dev.parent); in dln2_unregister_event_cb() local
170 spin_lock_irqsave(&dln2->event_cb_lock, flags); in dln2_unregister_event_cb()
172 list_for_each_entry(i, &dln2->event_cb_list, list) { in dln2_unregister_event_cb()
180 spin_unlock_irqrestore(&dln2->event_cb_lock, flags); in dln2_unregister_event_cb()
194 static bool dln2_transfer_complete(struct dln2_dev *dln2, struct urb *urb, in dln2_transfer_complete() argument
197 struct device *dev = &dln2->interface->dev; in dln2_transfer_complete()
198 struct dln2_mod_rx_slots *rxs = &dln2->mod_rx_slots[handle]; in dln2_transfer_complete()
223 static void dln2_run_event_callbacks(struct dln2_dev *dln2, u16 id, u16 echo, in dln2_run_event_callbacks() argument
230 list_for_each_entry_rcu(i, &dln2->event_cb_list, list) { in dln2_run_event_callbacks()
242 struct dln2_dev *dln2 = urb->context; in dln2_rx() local
244 struct device *dev = &dln2->interface->dev; in dln2_rx()
293 spin_lock_irqsave(&dln2->event_cb_lock, flags); in dln2_rx()
294 dln2_run_event_callbacks(dln2, id, echo, data, len); in dln2_rx()
295 spin_unlock_irqrestore(&dln2->event_cb_lock, flags); in dln2_rx()
298 if (dln2_transfer_complete(dln2, urb, handle, echo)) in dln2_rx()
333 static int dln2_send_wait(struct dln2_dev *dln2, u16 handle, u16 cmd, u16 echo, in dln2_send_wait() argument
345 ret = usb_bulk_msg(dln2->usb_dev, in dln2_send_wait()
346 usb_sndbulkpipe(dln2->usb_dev, dln2->ep_out), in dln2_send_wait()
354 static bool find_free_slot(struct dln2_dev *dln2, u16 handle, int *slot) in find_free_slot() argument
359 if (dln2->disconnect) { in find_free_slot()
364 rxs = &dln2->mod_rx_slots[handle]; in find_free_slot()
382 static int alloc_rx_slot(struct dln2_dev *dln2, u16 handle) in alloc_rx_slot() argument
391 ret = wait_event_interruptible(dln2->mod_rx_slots[handle].wq, in alloc_rx_slot()
392 find_free_slot(dln2, handle, &slot)); in alloc_rx_slot()
399 static void free_rx_slot(struct dln2_dev *dln2, u16 handle, int slot) in free_rx_slot() argument
406 rxs = &dln2->mod_rx_slots[handle]; in free_rx_slot()
422 struct device *dev = &dln2->interface->dev; in free_rx_slot()
432 static int _dln2_transfer(struct dln2_dev *dln2, u16 handle, u16 cmd, in _dln2_transfer() argument
440 struct device *dev = &dln2->interface->dev; in _dln2_transfer()
442 struct dln2_mod_rx_slots *rxs = &dln2->mod_rx_slots[handle]; in _dln2_transfer()
445 spin_lock(&dln2->disconnect_lock); in _dln2_transfer()
446 if (!dln2->disconnect) in _dln2_transfer()
447 dln2->active_transfers++; in _dln2_transfer()
450 spin_unlock(&dln2->disconnect_lock); in _dln2_transfer()
455 rx_slot = alloc_rx_slot(dln2, handle); in _dln2_transfer()
461 ret = dln2_send_wait(dln2, handle, cmd, rx_slot, obuf, obuf_len); in _dln2_transfer()
478 if (dln2->disconnect) { in _dln2_transfer()
508 free_rx_slot(dln2, handle, rx_slot); in _dln2_transfer()
510 spin_lock(&dln2->disconnect_lock); in _dln2_transfer()
511 dln2->active_transfers--; in _dln2_transfer()
512 spin_unlock(&dln2->disconnect_lock); in _dln2_transfer()
513 if (dln2->disconnect) in _dln2_transfer()
514 wake_up(&dln2->disconnect_wq); in _dln2_transfer()
524 struct dln2_dev *dln2; in dln2_transfer() local
527 dln2 = dev_get_drvdata(pdev->dev.parent); in dln2_transfer()
531 return _dln2_transfer(dln2, handle, cmd, obuf, obuf_len, ibuf, in dln2_transfer()
536 static int dln2_check_hw(struct dln2_dev *dln2) in dln2_check_hw() argument
542 ret = _dln2_transfer(dln2, DLN2_HANDLE_CTRL, CMD_GET_DEVICE_VER, in dln2_check_hw()
550 dev_err(&dln2->interface->dev, "Device ID 0x%x not supported\n", in dln2_check_hw()
558 static int dln2_print_serialno(struct dln2_dev *dln2) in dln2_print_serialno() argument
563 struct device *dev = &dln2->interface->dev; in dln2_print_serialno()
565 ret = _dln2_transfer(dln2, DLN2_HANDLE_CTRL, CMD_GET_DEVICE_SN, NULL, 0, in dln2_print_serialno()
577 static int dln2_hw_init(struct dln2_dev *dln2) in dln2_hw_init() argument
581 ret = dln2_check_hw(dln2); in dln2_hw_init()
585 return dln2_print_serialno(dln2); in dln2_hw_init()
588 static void dln2_free_rx_urbs(struct dln2_dev *dln2) in dln2_free_rx_urbs() argument
593 usb_free_urb(dln2->rx_urb[i]); in dln2_free_rx_urbs()
594 kfree(dln2->rx_buf[i]); in dln2_free_rx_urbs()
598 static void dln2_stop_rx_urbs(struct dln2_dev *dln2) in dln2_stop_rx_urbs() argument
603 usb_kill_urb(dln2->rx_urb[i]); in dln2_stop_rx_urbs()
606 static void dln2_free(struct dln2_dev *dln2) in dln2_free() argument
608 dln2_free_rx_urbs(dln2); in dln2_free()
609 usb_put_dev(dln2->usb_dev); in dln2_free()
610 kfree(dln2); in dln2_free()
613 static int dln2_setup_rx_urbs(struct dln2_dev *dln2, in dln2_setup_rx_urbs() argument
620 dln2->rx_buf[i] = kmalloc(rx_max_size, GFP_KERNEL); in dln2_setup_rx_urbs()
621 if (!dln2->rx_buf[i]) in dln2_setup_rx_urbs()
624 dln2->rx_urb[i] = usb_alloc_urb(0, GFP_KERNEL); in dln2_setup_rx_urbs()
625 if (!dln2->rx_urb[i]) in dln2_setup_rx_urbs()
628 usb_fill_bulk_urb(dln2->rx_urb[i], dln2->usb_dev, in dln2_setup_rx_urbs()
629 usb_rcvbulkpipe(dln2->usb_dev, dln2->ep_in), in dln2_setup_rx_urbs()
630 dln2->rx_buf[i], rx_max_size, dln2_rx, dln2); in dln2_setup_rx_urbs()
636 static int dln2_start_rx_urbs(struct dln2_dev *dln2, gfp_t gfp) in dln2_start_rx_urbs() argument
638 struct device *dev = &dln2->interface->dev; in dln2_start_rx_urbs()
643 ret = usb_submit_urb(dln2->rx_urb[i], gfp); in dln2_start_rx_urbs()
725 static void dln2_stop(struct dln2_dev *dln2) in dln2_stop() argument
730 spin_lock(&dln2->disconnect_lock); in dln2_stop()
731 dln2->disconnect = true; in dln2_stop()
732 spin_unlock(&dln2->disconnect_lock); in dln2_stop()
736 struct dln2_mod_rx_slots *rxs = &dln2->mod_rx_slots[i]; in dln2_stop()
753 wait_event(dln2->disconnect_wq, !dln2->active_transfers); in dln2_stop()
755 dln2_stop_rx_urbs(dln2); in dln2_stop()
760 struct dln2_dev *dln2 = usb_get_intfdata(interface); in dln2_disconnect() local
762 dln2_stop(dln2); in dln2_disconnect()
766 dln2_free(dln2); in dln2_disconnect()
776 struct dln2_dev *dln2; in dln2_probe() local
791 dln2 = kzalloc(sizeof(*dln2), GFP_KERNEL); in dln2_probe()
792 if (!dln2) in dln2_probe()
795 dln2->ep_out = epout->bEndpointAddress; in dln2_probe()
796 dln2->ep_in = epin->bEndpointAddress; in dln2_probe()
797 dln2->usb_dev = usb_get_dev(interface_to_usbdev(interface)); in dln2_probe()
798 dln2->interface = interface; in dln2_probe()
799 usb_set_intfdata(interface, dln2); in dln2_probe()
800 init_waitqueue_head(&dln2->disconnect_wq); in dln2_probe()
803 init_waitqueue_head(&dln2->mod_rx_slots[i].wq); in dln2_probe()
804 spin_lock_init(&dln2->mod_rx_slots[i].lock); in dln2_probe()
806 init_completion(&dln2->mod_rx_slots[i].slots[j].done); in dln2_probe()
809 spin_lock_init(&dln2->event_cb_lock); in dln2_probe()
810 spin_lock_init(&dln2->disconnect_lock); in dln2_probe()
811 INIT_LIST_HEAD(&dln2->event_cb_list); in dln2_probe()
813 ret = dln2_setup_rx_urbs(dln2, hostif); in dln2_probe()
817 ret = dln2_start_rx_urbs(dln2, GFP_KERNEL); in dln2_probe()
821 ret = dln2_hw_init(dln2); in dln2_probe()
836 dln2_stop_rx_urbs(dln2); in dln2_probe()
839 dln2_free(dln2); in dln2_probe()
846 struct dln2_dev *dln2 = usb_get_intfdata(iface); in dln2_suspend() local
848 dln2_stop(dln2); in dln2_suspend()
855 struct dln2_dev *dln2 = usb_get_intfdata(iface); in dln2_resume() local
857 dln2->disconnect = false; in dln2_resume()
859 return dln2_start_rx_urbs(dln2, GFP_NOIO); in dln2_resume()