• Home
  • Raw
  • Download

Lines Matching refs:ehci

50 qtd_fill(struct ehci_hcd *ehci, struct ehci_qtd *qtd, dma_addr_t buf,  in qtd_fill()  argument
57 qtd->hw_buf[0] = cpu_to_hc32(ehci, (u32)addr); in qtd_fill()
58 qtd->hw_buf_hi[0] = cpu_to_hc32(ehci, (u32)(addr >> 32)); in qtd_fill()
69 qtd->hw_buf[i] = cpu_to_hc32(ehci, (u32)addr); in qtd_fill()
70 qtd->hw_buf_hi[i] = cpu_to_hc32(ehci, in qtd_fill()
83 qtd->hw_token = cpu_to_hc32(ehci, (count << 16) | token); in qtd_fill()
92 qh_update (struct ehci_hcd *ehci, struct ehci_qh *qh, struct ehci_qtd *qtd) in qh_update() argument
99 hw->hw_qtd_next = QTD_NEXT(ehci, qtd->qtd_dma); in qh_update()
100 hw->hw_alt_next = EHCI_LIST_END(ehci); in qh_update()
107 if (!(hw->hw_info1 & cpu_to_hc32(ehci, QH_TOGGLE_CTL))) { in qh_update()
111 epnum = (hc32_to_cpup(ehci, &hw->hw_info1) >> 8) & 0x0f; in qh_update()
113 hw->hw_token &= ~cpu_to_hc32(ehci, QTD_TOGGLE); in qh_update()
118 hw->hw_token &= cpu_to_hc32(ehci, QTD_TOGGLE | QTD_STS_PING); in qh_update()
126 qh_refresh (struct ehci_hcd *ehci, struct ehci_qh *qh) in qh_refresh() argument
139 if (qh->hw->hw_token & ACTIVE_BIT(ehci)) in qh_refresh()
142 qh_update(ehci, qh, qtd); in qh_refresh()
147 static void qh_link_async(struct ehci_hcd *ehci, struct ehci_qh *qh);
152 struct ehci_hcd *ehci = hcd_to_ehci(hcd); in ehci_clear_tt_buffer_complete() local
156 spin_lock_irqsave(&ehci->lock, flags); in ehci_clear_tt_buffer_complete()
159 && ehci->rh_state == EHCI_RH_RUNNING) in ehci_clear_tt_buffer_complete()
160 qh_link_async(ehci, qh); in ehci_clear_tt_buffer_complete()
161 spin_unlock_irqrestore(&ehci->lock, flags); in ehci_clear_tt_buffer_complete()
164 static void ehci_clear_tt_buffer(struct ehci_hcd *ehci, struct ehci_qh *qh, in ehci_clear_tt_buffer() argument
182 if (!ehci_is_TDI(ehci) in ehci_clear_tt_buffer()
184 ehci_to_hcd(ehci)->self.root_hub) { in ehci_clear_tt_buffer()
197 struct ehci_hcd *ehci, in qtd_copy_status() argument
246 ehci_dbg(ehci, "devpath %s ep%d%s 3strikes\n", in qtd_copy_status()
260 ehci_urb_done(struct ehci_hcd *ehci, struct urb *urb, int status) in ehci_urb_done() argument
264 ehci_to_hcd(ehci)->self.bandwidth_int_reqs--; in ehci_urb_done()
268 COUNT(ehci->stats.unlink); in ehci_urb_done()
273 COUNT(ehci->stats.complete); in ehci_urb_done()
277 ehci_dbg (ehci, in ehci_urb_done()
286 usb_hcd_unlink_urb_from_ep(ehci_to_hcd(ehci), urb); in ehci_urb_done()
287 usb_hcd_giveback_urb(ehci_to_hcd(ehci), urb, status); in ehci_urb_done()
290 static int qh_schedule (struct ehci_hcd *ehci, struct ehci_qh *qh);
298 qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) in qh_completions() argument
342 ehci_urb_done(ehci, last->urb, last_status); in qh_completions()
345 ehci_qtd_free (ehci, last); in qh_completions()
355 token = hc32_to_cpu(ehci, qtd->hw_token); in qh_completions()
363 ehci_dbg(ehci, in qh_completions()
384 ehci_dbg(ehci, in qh_completions()
396 qtd->hw_token = cpu_to_hc32(ehci, in qh_completions()
399 hw->hw_token = cpu_to_hc32(ehci, in qh_completions()
416 & EHCI_LIST_END(ehci))) { in qh_completions()
422 && ehci->rh_state >= EHCI_RH_RUNNING)) { in qh_completions()
430 if (ehci->rh_state < EHCI_RH_RUNNING) in qh_completions()
449 (hw->hw_token & ACTIVE_BIT(ehci))) { in qh_completions()
450 token = hc32_to_cpu(ehci, hw->hw_token); in qh_completions()
451 hw->hw_token &= ~ACTIVE_BIT(ehci); in qh_completions()
457 ehci_clear_tt_buffer(ehci, qh, urb, token); in qh_completions()
469 last_status = qtd_copy_status(ehci, urb, in qh_completions()
473 & EHCI_LIST_END(ehci))) in qh_completions()
491 ehci_clear_tt_buffer(ehci, qh, urb, in qh_completions()
515 ehci_urb_done(ehci, last->urb, last_status); in qh_completions()
516 ehci_qtd_free (ehci, last); in qh_completions()
546 if (stopped != 0 || hw->hw_qtd_next == EHCI_LIST_END(ehci)) in qh_completions()
565 struct ehci_hcd *ehci, in qtd_list_free() argument
576 ehci_qtd_free (ehci, qtd); in qtd_list_free()
585 struct ehci_hcd *ehci, in qh_urb_transaction() argument
601 qtd = ehci_qtd_alloc (ehci, flags); in qh_urb_transaction()
615 qtd_fill(ehci, qtd, urb->setup_dma, in qh_urb_transaction()
622 qtd = ehci_qtd_alloc (ehci, flags); in qh_urb_transaction()
626 qtd_prev->hw_next = QTD_NEXT(ehci, qtd->qtd_dma); in qh_urb_transaction()
666 this_qtd_len = qtd_fill(ehci, qtd, buf, this_sg_len, token, in qh_urb_transaction()
678 qtd->hw_alt_next = ehci->async->hw->hw_alt_next; in qh_urb_transaction()
693 qtd = ehci_qtd_alloc (ehci, flags); in qh_urb_transaction()
697 qtd_prev->hw_next = QTD_NEXT(ehci, qtd->qtd_dma); in qh_urb_transaction()
708 qtd->hw_alt_next = EHCI_LIST_END(ehci); in qh_urb_transaction()
729 qtd = ehci_qtd_alloc (ehci, flags); in qh_urb_transaction()
733 qtd_prev->hw_next = QTD_NEXT(ehci, qtd->qtd_dma); in qh_urb_transaction()
737 qtd_fill(ehci, qtd, 0, 0, token, 0); in qh_urb_transaction()
743 qtd->hw_token |= cpu_to_hc32(ehci, QTD_IOC); in qh_urb_transaction()
747 qtd_list_free (ehci, urb, head); in qh_urb_transaction()
770 struct ehci_hcd *ehci, in qh_make() argument
774 struct ehci_qh *qh = ehci_qh_alloc (ehci, flags); in qh_make()
798 ehci_dbg(ehci, "bogus qh maxpacket %d\n", max_packet(maxp)); in qh_make()
828 } else if (urb->interval > ehci->periodic_size << 3) { in qh_make()
829 urb->interval = ehci->periodic_size << 3; in qh_make()
860 if (urb->interval > ehci->periodic_size) in qh_make()
861 urb->interval = ehci->periodic_size; in qh_make()
900 if (ehci_has_fsl_portno_bug(ehci)) in qh_make()
908 if (tt && tt->hub != ehci_to_hcd(ehci)->self.root_hub) in qh_make()
938 ehci_dbg(ehci, "bogus dev %p speed %d\n", urb->dev, in qh_make()
941 qh_destroy(ehci, qh); in qh_make()
950 hw->hw_info1 = cpu_to_hc32(ehci, info1); in qh_make()
951 hw->hw_info2 = cpu_to_hc32(ehci, info2); in qh_make()
959 static void enable_async(struct ehci_hcd *ehci) in enable_async() argument
961 if (ehci->async_count++) in enable_async()
965 ehci->enabled_hrtimer_events &= ~BIT(EHCI_HRTIMER_DISABLE_ASYNC); in enable_async()
968 ehci_poll_ASS(ehci); in enable_async()
969 turn_on_io_watchdog(ehci); in enable_async()
972 static void disable_async(struct ehci_hcd *ehci) in disable_async() argument
974 if (--ehci->async_count) in disable_async()
978 WARN_ON(ehci->async->qh_next.qh || !list_empty(&ehci->async_unlink) || in disable_async()
979 !list_empty(&ehci->async_idle)); in disable_async()
982 ehci_poll_ASS(ehci); in disable_async()
987 static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh) in qh_link_async() argument
989 __hc32 dma = QH_NEXT(ehci, qh->qh_dma); in qh_link_async()
999 qh_refresh(ehci, qh); in qh_link_async()
1002 head = ehci->async; in qh_link_async()
1015 enable_async(ehci); in qh_link_async()
1027 struct ehci_hcd *ehci, in qh_append_tds() argument
1035 __hc32 qh_addr_mask = cpu_to_hc32(ehci, 0x7f); in qh_append_tds()
1040 qh = qh_make (ehci, urb, GFP_ATOMIC); in qh_append_tds()
1074 qtd->hw_token = HALT_BIT(ehci); in qh_append_tds()
1086 ehci_qtd_init(ehci, qtd, qtd->qtd_dma); in qh_append_tds()
1093 qtd->hw_next = QTD_NEXT(ehci, dma); in qh_append_tds()
1109 struct ehci_hcd *ehci, in submit_async() argument
1125 ehci_dbg(ehci, in submit_async()
1134 spin_lock_irqsave (&ehci->lock, flags); in submit_async()
1135 if (unlikely(!HCD_HW_ACCESSIBLE(ehci_to_hcd(ehci)))) { in submit_async()
1139 rc = usb_hcd_link_urb_to_ep(ehci_to_hcd(ehci), urb); in submit_async()
1143 qh = qh_append_tds(ehci, urb, qtd_list, epnum, &urb->ep->hcpriv); in submit_async()
1145 usb_hcd_unlink_urb_from_ep(ehci_to_hcd(ehci), urb); in submit_async()
1154 qh_link_async(ehci, qh); in submit_async()
1156 spin_unlock_irqrestore (&ehci->lock, flags); in submit_async()
1158 qtd_list_free (ehci, urb, qtd_list); in submit_async()
1179 struct ehci_hcd *ehci = hcd_to_ehci(hcd); in submit_single_step_set_feature() local
1192 qtd = ehci_qtd_alloc(ehci, GFP_KERNEL); in submit_single_step_set_feature()
1209 qtd_fill(ehci, qtd, urb->setup_dma, in submit_single_step_set_feature()
1213 submit_async(ehci, urb, &qtd_list, GFP_ATOMIC); in submit_single_step_set_feature()
1228 qtd_fill(ehci, qtd, buf, len, token, maxpacket); in submit_single_step_set_feature()
1234 qtd->hw_alt_next = EHCI_LIST_END(ehci); in submit_single_step_set_feature()
1241 qtd = ehci_qtd_alloc(ehci, GFP_ATOMIC); in submit_single_step_set_feature()
1245 qtd_prev->hw_next = QTD_NEXT(ehci, qtd->qtd_dma); in submit_single_step_set_feature()
1249 qtd_fill(ehci, qtd, 0, 0, token, 0); in submit_single_step_set_feature()
1253 qtd->hw_token |= cpu_to_hc32(ehci, QTD_IOC); in submit_single_step_set_feature()
1255 submit_async(ehci, urb, &qtd_list, GFP_KERNEL); in submit_single_step_set_feature()
1260 qtd_list_free(ehci, urb, head); in submit_single_step_set_feature()
1267 static void single_unlink_async(struct ehci_hcd *ehci, struct ehci_qh *qh) in single_unlink_async() argument
1273 list_add_tail(&qh->unlink_node, &ehci->async_unlink); in single_unlink_async()
1276 prev = ehci->async; in single_unlink_async()
1282 if (ehci->qh_scan_next == qh) in single_unlink_async()
1283 ehci->qh_scan_next = qh->qh_next.qh; in single_unlink_async()
1286 static void start_iaa_cycle(struct ehci_hcd *ehci) in start_iaa_cycle() argument
1289 if (ehci->iaa_in_progress) in start_iaa_cycle()
1291 ehci->iaa_in_progress = true; in start_iaa_cycle()
1294 if (unlikely(ehci->rh_state < EHCI_RH_RUNNING)) { in start_iaa_cycle()
1295 end_unlink_async(ehci); in start_iaa_cycle()
1298 } else if (likely(ehci->rh_state == EHCI_RH_RUNNING)) { in start_iaa_cycle()
1303 ehci_writel(ehci, ehci->command | CMD_IAAD, in start_iaa_cycle()
1304 &ehci->regs->command); in start_iaa_cycle()
1305 ehci_readl(ehci, &ehci->regs->command); in start_iaa_cycle()
1306 ehci_enable_event(ehci, EHCI_HRTIMER_IAA_WATCHDOG, true); in start_iaa_cycle()
1312 static void end_unlink_async(struct ehci_hcd *ehci) in end_unlink_async() argument
1317 if (ehci->has_synopsys_hc_bug) in end_unlink_async()
1318 ehci_writel(ehci, (u32) ehci->async->qh_dma, in end_unlink_async()
1319 &ehci->regs->async_next); in end_unlink_async()
1322 ehci->iaa_in_progress = false; in end_unlink_async()
1324 if (list_empty(&ehci->async_unlink)) in end_unlink_async()
1326 qh = list_first_entry(&ehci->async_unlink, struct ehci_qh, in end_unlink_async()
1333 early_exit = ehci->async_unlinking; in end_unlink_async()
1336 if (ehci->rh_state < EHCI_RH_RUNNING) in end_unlink_async()
1337 list_splice_tail_init(&ehci->async_unlink, &ehci->async_idle); in end_unlink_async()
1351 list_move_tail(&qh->unlink_node, &ehci->async_idle); in end_unlink_async()
1354 if (!list_empty(&ehci->async_unlink)) in end_unlink_async()
1355 start_iaa_cycle(ehci); in end_unlink_async()
1365 ehci->async_unlinking = true; in end_unlink_async()
1366 while (!list_empty(&ehci->async_idle)) { in end_unlink_async()
1367 qh = list_first_entry(&ehci->async_idle, struct ehci_qh, in end_unlink_async()
1375 qh_completions(ehci, qh); in end_unlink_async()
1377 ehci->rh_state == EHCI_RH_RUNNING) in end_unlink_async()
1378 qh_link_async(ehci, qh); in end_unlink_async()
1379 disable_async(ehci); in end_unlink_async()
1381 ehci->async_unlinking = false; in end_unlink_async()
1384 static void start_unlink_async(struct ehci_hcd *ehci, struct ehci_qh *qh);
1386 static void unlink_empty_async(struct ehci_hcd *ehci) in unlink_empty_async() argument
1393 for (qh = ehci->async->qh_next.qh; qh; qh = qh->qh_next.qh) { in unlink_empty_async()
1397 if (qh->unlink_cycle != ehci->async_unlink_cycle) in unlink_empty_async()
1403 if (list_empty(&ehci->async_unlink) && qh_to_unlink) { in unlink_empty_async()
1404 start_unlink_async(ehci, qh_to_unlink); in unlink_empty_async()
1410 ehci_enable_event(ehci, EHCI_HRTIMER_ASYNC_UNLINKS, true); in unlink_empty_async()
1411 ++ehci->async_unlink_cycle; in unlink_empty_async()
1416 static void __maybe_unused unlink_empty_async_suspended(struct ehci_hcd *ehci) in unlink_empty_async_suspended() argument
1420 while (ehci->async->qh_next.qh) { in unlink_empty_async_suspended()
1421 qh = ehci->async->qh_next.qh; in unlink_empty_async_suspended()
1423 single_unlink_async(ehci, qh); in unlink_empty_async_suspended()
1425 start_iaa_cycle(ehci); in unlink_empty_async_suspended()
1431 static void start_unlink_async(struct ehci_hcd *ehci, struct ehci_qh *qh) in start_unlink_async() argument
1437 single_unlink_async(ehci, qh); in start_unlink_async()
1438 start_iaa_cycle(ehci); in start_unlink_async()
1443 static void scan_async (struct ehci_hcd *ehci) in scan_async() argument
1448 ehci->qh_scan_next = ehci->async->qh_next.qh; in scan_async()
1449 while (ehci->qh_scan_next) { in scan_async()
1450 qh = ehci->qh_scan_next; in scan_async()
1451 ehci->qh_scan_next = qh->qh_next.qh; in scan_async()
1464 temp = qh_completions(ehci, qh); in scan_async()
1466 start_unlink_async(ehci, qh); in scan_async()
1469 qh->unlink_cycle = ehci->async_unlink_cycle; in scan_async()
1481 if (check_unlinks_later && ehci->rh_state == EHCI_RH_RUNNING && in scan_async()
1482 !(ehci->enabled_hrtimer_events & in scan_async()
1484 ehci_enable_event(ehci, EHCI_HRTIMER_ASYNC_UNLINKS, true); in scan_async()
1485 ++ehci->async_unlink_cycle; in scan_async()