Lines Matching refs:whc

28 static void qset_get_next_prev(struct whc *whc, struct whc_qset *qset,  in qset_get_next_prev()  argument
33 BUG_ON(list_empty(&whc->async_list)); in qset_get_next_prev()
36 if (n == &whc->async_list) in qset_get_next_prev()
39 if (p == &whc->async_list) in qset_get_next_prev()
47 static void asl_qset_insert_begin(struct whc *whc, struct whc_qset *qset) in asl_qset_insert_begin() argument
49 list_move(&qset->list_node, &whc->async_list); in asl_qset_insert_begin()
53 static void asl_qset_insert(struct whc *whc, struct whc_qset *qset) in asl_qset_insert() argument
57 qset_clear(whc, qset); in asl_qset_insert()
60 qset_get_next_prev(whc, qset, &next, &prev); in asl_qset_insert()
66 static void asl_qset_remove(struct whc *whc, struct whc_qset *qset) in asl_qset_remove() argument
70 qset_get_next_prev(whc, qset, &next, &prev); in asl_qset_remove()
72 list_move(&qset->list_node, &whc->async_removed_list); in asl_qset_remove()
79 if (list_empty(&whc->async_list)) in asl_qset_remove()
97 static uint32_t process_qset(struct whc *whc, struct whc_qset *qset) in process_qset() argument
118 process_halted_qtd(whc, qset, td); in process_qset()
127 process_inactive_qtd(whc, qset, td); in process_qset()
131 update |= qset_add_qtds(whc, qset); in process_qset()
139 asl_qset_remove(whc, qset); in process_qset()
145 void asl_start(struct whc *whc) in asl_start() argument
149 qset = list_first_entry(&whc->async_list, struct whc_qset, list_node); in asl_start()
151 le_writeq(qset->qset_dma | QH_LINK_NTDS(8), whc->base + WUSBASYNCLISTADDR); in asl_start()
153 whc_write_wusbcmd(whc, WUSBCMD_ASYNC_EN, WUSBCMD_ASYNC_EN); in asl_start()
154 whci_wait_for(&whc->umc->dev, whc->base + WUSBSTS, in asl_start()
159 void asl_stop(struct whc *whc) in asl_stop() argument
161 whc_write_wusbcmd(whc, WUSBCMD_ASYNC_EN, 0); in asl_stop()
162 whci_wait_for(&whc->umc->dev, whc->base + WUSBSTS, in asl_stop()
176 void asl_update(struct whc *whc, uint32_t wusbcmd) in asl_update() argument
178 struct wusbhc *wusbhc = &whc->wusbhc; in asl_update()
183 whc_write_wusbcmd(whc, wusbcmd, wusbcmd); in asl_update()
185 whc->async_list_wq, in asl_update()
186 (le_readl(whc->base + WUSBCMD) & WUSBCMD_ASYNC_UPDATED) == 0, in asl_update()
189 whc_hw_error(whc, "ASL update timeout"); in asl_update()
204 struct whc *whc = container_of(work, struct whc, async_work); in scan_async_work() local
208 spin_lock_irq(&whc->lock); in scan_async_work()
214 list_for_each_entry_safe_reverse(qset, t, &whc->async_list, list_node) { in scan_async_work()
216 asl_qset_insert(whc, qset); in scan_async_work()
220 update |= process_qset(whc, qset); in scan_async_work()
223 spin_unlock_irq(&whc->lock); in scan_async_work()
229 asl_update(whc, wusbcmd); in scan_async_work()
239 spin_lock_irq(&whc->lock); in scan_async_work()
241 list_for_each_entry_safe(qset, t, &whc->async_removed_list, list_node) { in scan_async_work()
242 qset_remove_complete(whc, qset); in scan_async_work()
244 qset_reset(whc, qset); in scan_async_work()
246 asl_qset_insert_begin(whc, qset); in scan_async_work()
247 queue_work(whc->workqueue, &whc->async_work); in scan_async_work()
252 spin_unlock_irq(&whc->lock); in scan_async_work()
265 int asl_urb_enqueue(struct whc *whc, struct urb *urb, gfp_t mem_flags) in asl_urb_enqueue() argument
271 spin_lock_irqsave(&whc->lock, flags); in asl_urb_enqueue()
273 err = usb_hcd_link_urb_to_ep(&whc->wusbhc.usb_hcd, urb); in asl_urb_enqueue()
275 spin_unlock_irqrestore(&whc->lock, flags); in asl_urb_enqueue()
279 qset = get_qset(whc, urb, GFP_ATOMIC); in asl_urb_enqueue()
283 err = qset_add_urb(whc, qset, urb, GFP_ATOMIC); in asl_urb_enqueue()
286 asl_qset_insert_begin(whc, qset); in asl_urb_enqueue()
288 usb_hcd_unlink_urb_from_ep(&whc->wusbhc.usb_hcd, urb); in asl_urb_enqueue()
290 spin_unlock_irqrestore(&whc->lock, flags); in asl_urb_enqueue()
293 queue_work(whc->workqueue, &whc->async_work); in asl_urb_enqueue()
308 int asl_urb_dequeue(struct whc *whc, struct urb *urb, int status) in asl_urb_dequeue() argument
317 spin_lock_irqsave(&whc->lock, flags); in asl_urb_dequeue()
319 ret = usb_hcd_check_unlink_urb(&whc->wusbhc.usb_hcd, urb, status); in asl_urb_dequeue()
327 qset_free_std(whc, std); in asl_urb_dequeue()
333 asl_qset_remove(whc, qset); in asl_urb_dequeue()
336 queue_work(whc->workqueue, &wurb->dequeue_work); in asl_urb_dequeue()
338 qset_remove_urb(whc, qset, urb, status); in asl_urb_dequeue()
340 spin_unlock_irqrestore(&whc->lock, flags); in asl_urb_dequeue()
348 void asl_qset_delete(struct whc *whc, struct whc_qset *qset) in asl_qset_delete() argument
351 queue_work(whc->workqueue, &whc->async_work); in asl_qset_delete()
352 qset_delete(whc, qset); in asl_qset_delete()
361 int asl_init(struct whc *whc) in asl_init() argument
365 qset = qset_alloc(whc, GFP_KERNEL); in asl_init()
369 asl_qset_insert_begin(whc, qset); in asl_init()
370 asl_qset_insert(whc, qset); in asl_init()
380 void asl_clean_up(struct whc *whc) in asl_clean_up() argument
384 if (!list_empty(&whc->async_list)) { in asl_clean_up()
385 qset = list_first_entry(&whc->async_list, struct whc_qset, list_node); in asl_clean_up()
387 qset_free(whc, qset); in asl_clean_up()