Lines Matching refs:whc

28 static void update_pzl_pointers(struct whc *whc, int period, u64 addr)  in update_pzl_pointers()  argument
32 whc_qset_set_link_ptr(&whc->pz_list[0], addr); in update_pzl_pointers()
33 whc_qset_set_link_ptr(&whc->pz_list[2], addr); in update_pzl_pointers()
34 whc_qset_set_link_ptr(&whc->pz_list[4], addr); in update_pzl_pointers()
35 whc_qset_set_link_ptr(&whc->pz_list[6], addr); in update_pzl_pointers()
36 whc_qset_set_link_ptr(&whc->pz_list[8], addr); in update_pzl_pointers()
37 whc_qset_set_link_ptr(&whc->pz_list[10], addr); in update_pzl_pointers()
38 whc_qset_set_link_ptr(&whc->pz_list[12], addr); in update_pzl_pointers()
39 whc_qset_set_link_ptr(&whc->pz_list[14], addr); in update_pzl_pointers()
42 whc_qset_set_link_ptr(&whc->pz_list[1], addr); in update_pzl_pointers()
43 whc_qset_set_link_ptr(&whc->pz_list[5], addr); in update_pzl_pointers()
44 whc_qset_set_link_ptr(&whc->pz_list[9], addr); in update_pzl_pointers()
45 whc_qset_set_link_ptr(&whc->pz_list[13], addr); in update_pzl_pointers()
48 whc_qset_set_link_ptr(&whc->pz_list[3], addr); in update_pzl_pointers()
49 whc_qset_set_link_ptr(&whc->pz_list[11], addr); in update_pzl_pointers()
52 whc_qset_set_link_ptr(&whc->pz_list[7], addr); in update_pzl_pointers()
55 whc_qset_set_link_ptr(&whc->pz_list[15], addr); in update_pzl_pointers()
65 static int qset_get_period(struct whc *whc, struct whc_qset *qset) in qset_get_period() argument
76 static void qset_insert_in_sw_list(struct whc *whc, struct whc_qset *qset) in qset_insert_in_sw_list() argument
80 period = qset_get_period(whc, qset); in qset_insert_in_sw_list()
82 qset_clear(whc, qset); in qset_insert_in_sw_list()
83 list_move(&qset->list_node, &whc->periodic_list[period]); in qset_insert_in_sw_list()
87 static void pzl_qset_remove(struct whc *whc, struct whc_qset *qset) in pzl_qset_remove() argument
89 list_move(&qset->list_node, &whc->periodic_removed_list); in pzl_qset_remove()
103 static enum whc_update pzl_process_qset(struct whc *whc, struct whc_qset *qset) in pzl_process_qset() argument
124 process_halted_qtd(whc, qset, td); in pzl_process_qset()
133 process_inactive_qtd(whc, qset, td); in pzl_process_qset()
137 update |= qset_add_qtds(whc, qset); in pzl_process_qset()
144 pzl_qset_remove(whc, qset); in pzl_process_qset()
158 void pzl_start(struct whc *whc) in pzl_start() argument
160 le_writeq(whc->pz_list_dma, whc->base + WUSBPERIODICLISTBASE); in pzl_start()
162 whc_write_wusbcmd(whc, WUSBCMD_PERIODIC_EN, WUSBCMD_PERIODIC_EN); in pzl_start()
163 whci_wait_for(&whc->umc->dev, whc->base + WUSBSTS, in pzl_start()
172 void pzl_stop(struct whc *whc) in pzl_stop() argument
174 whc_write_wusbcmd(whc, WUSBCMD_PERIODIC_EN, 0); in pzl_stop()
175 whci_wait_for(&whc->umc->dev, whc->base + WUSBSTS, in pzl_stop()
189 void pzl_update(struct whc *whc, uint32_t wusbcmd) in pzl_update() argument
191 struct wusbhc *wusbhc = &whc->wusbhc; in pzl_update()
196 whc_write_wusbcmd(whc, wusbcmd, wusbcmd); in pzl_update()
198 whc->periodic_list_wq, in pzl_update()
199 (le_readl(whc->base + WUSBCMD) & WUSBCMD_PERIODIC_UPDATED) == 0, in pzl_update()
202 whc_hw_error(whc, "PZL update timeout"); in pzl_update()
207 static void update_pzl_hw_view(struct whc *whc) in update_pzl_hw_view() argument
214 list_for_each_entry_safe(qset, t, &whc->periodic_list[period], list_node) { in update_pzl_hw_view()
219 update_pzl_pointers(whc, period, tmp_qh); in update_pzl_hw_view()
233 struct whc *whc = container_of(work, struct whc, periodic_work); in scan_periodic_work() local
238 spin_lock_irq(&whc->lock); in scan_periodic_work()
241 list_for_each_entry_safe(qset, t, &whc->periodic_list[period], list_node) { in scan_periodic_work()
244 update |= pzl_process_qset(whc, qset); in scan_periodic_work()
249 update_pzl_hw_view(whc); in scan_periodic_work()
251 spin_unlock_irq(&whc->lock); in scan_periodic_work()
257 pzl_update(whc, wusbcmd); in scan_periodic_work()
267 spin_lock_irq(&whc->lock); in scan_periodic_work()
269 list_for_each_entry_safe(qset, t, &whc->periodic_removed_list, list_node) { in scan_periodic_work()
270 qset_remove_complete(whc, qset); in scan_periodic_work()
272 qset_reset(whc, qset); in scan_periodic_work()
274 qset_insert_in_sw_list(whc, qset); in scan_periodic_work()
275 queue_work(whc->workqueue, &whc->periodic_work); in scan_periodic_work()
280 spin_unlock_irq(&whc->lock); in scan_periodic_work()
293 int pzl_urb_enqueue(struct whc *whc, struct urb *urb, gfp_t mem_flags) in pzl_urb_enqueue() argument
299 spin_lock_irqsave(&whc->lock, flags); in pzl_urb_enqueue()
301 err = usb_hcd_link_urb_to_ep(&whc->wusbhc.usb_hcd, urb); in pzl_urb_enqueue()
303 spin_unlock_irqrestore(&whc->lock, flags); in pzl_urb_enqueue()
307 qset = get_qset(whc, urb, GFP_ATOMIC); in pzl_urb_enqueue()
311 err = qset_add_urb(whc, qset, urb, GFP_ATOMIC); in pzl_urb_enqueue()
314 qset_insert_in_sw_list(whc, qset); in pzl_urb_enqueue()
316 usb_hcd_unlink_urb_from_ep(&whc->wusbhc.usb_hcd, urb); in pzl_urb_enqueue()
318 spin_unlock_irqrestore(&whc->lock, flags); in pzl_urb_enqueue()
321 queue_work(whc->workqueue, &whc->periodic_work); in pzl_urb_enqueue()
336 int pzl_urb_dequeue(struct whc *whc, struct urb *urb, int status) in pzl_urb_dequeue() argument
345 spin_lock_irqsave(&whc->lock, flags); in pzl_urb_dequeue()
347 ret = usb_hcd_check_unlink_urb(&whc->wusbhc.usb_hcd, urb, status); in pzl_urb_dequeue()
355 qset_free_std(whc, std); in pzl_urb_dequeue()
361 pzl_qset_remove(whc, qset); in pzl_urb_dequeue()
362 update_pzl_hw_view(whc); in pzl_urb_dequeue()
365 queue_work(whc->workqueue, &wurb->dequeue_work); in pzl_urb_dequeue()
367 qset_remove_urb(whc, qset, urb, status); in pzl_urb_dequeue()
369 spin_unlock_irqrestore(&whc->lock, flags); in pzl_urb_dequeue()
377 void pzl_qset_delete(struct whc *whc, struct whc_qset *qset) in pzl_qset_delete() argument
380 queue_work(whc->workqueue, &whc->periodic_work); in pzl_qset_delete()
381 qset_delete(whc, qset); in pzl_qset_delete()
388 int pzl_init(struct whc *whc) in pzl_init() argument
392 whc->pz_list = dma_alloc_coherent(&whc->umc->dev, sizeof(u64) * 16, in pzl_init()
393 &whc->pz_list_dma, GFP_KERNEL); in pzl_init()
394 if (whc->pz_list == NULL) in pzl_init()
399 whc->pz_list[i] = cpu_to_le64(QH_LINK_NTDS(8) | QH_LINK_T); in pzl_init()
401 le_writeq(whc->pz_list_dma, whc->base + WUSBPERIODICLISTBASE); in pzl_init()
412 void pzl_clean_up(struct whc *whc) in pzl_clean_up() argument
414 if (whc->pz_list) in pzl_clean_up()
415 dma_free_coherent(&whc->umc->dev, sizeof(u64) * 16, whc->pz_list, in pzl_clean_up()
416 whc->pz_list_dma); in pzl_clean_up()