Lines Matching refs:qh

80 qh_update (struct ehci_hcd *ehci, struct ehci_qh *qh, struct ehci_qtd *qtd)  in qh_update()  argument
82 struct ehci_qh_hw *hw = qh->hw; in qh_update()
85 WARN_ON(qh->qh_state != QH_STATE_IDLE); in qh_update()
98 is_out = qh->is_out; in qh_update()
100 if (unlikely(!usb_gettoggle(qh->ps.udev, epnum, is_out))) { in qh_update()
102 usb_settoggle(qh->ps.udev, epnum, is_out, 1); in qh_update()
114 qh_refresh (struct ehci_hcd *ehci, struct ehci_qh *qh) in qh_refresh() argument
118 qtd = list_entry(qh->qtd_list.next, struct ehci_qtd, qtd_list); in qh_refresh()
127 if (qh->hw->hw_token & ACTIVE_BIT(ehci)) { in qh_refresh()
128 qh->hw->hw_qtd_next = qtd->hw_next; in qh_refresh()
129 if (qh->should_be_inactive) in qh_refresh()
130 ehci_warn(ehci, "qh %p should be inactive!\n", qh); in qh_refresh()
132 qh_update(ehci, qh, qtd); in qh_refresh()
134 qh->should_be_inactive = 0; in qh_refresh()
139 static void qh_link_async(struct ehci_hcd *ehci, struct ehci_qh *qh);
145 struct ehci_qh *qh = ep->hcpriv; in ehci_clear_tt_buffer_complete() local
149 qh->clearing_tt = 0; in ehci_clear_tt_buffer_complete()
150 if (qh->qh_state == QH_STATE_IDLE && !list_empty(&qh->qtd_list) in ehci_clear_tt_buffer_complete()
152 qh_link_async(ehci, qh); in ehci_clear_tt_buffer_complete()
156 static void ehci_clear_tt_buffer(struct ehci_hcd *ehci, struct ehci_qh *qh, in ehci_clear_tt_buffer() argument
166 if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) { in ehci_clear_tt_buffer()
178 qh->clearing_tt = 1; in ehci_clear_tt_buffer()
282 static int qh_schedule (struct ehci_hcd *ehci, struct ehci_qh *qh);
290 qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) in qh_completions() argument
292 struct ehci_qtd *last, *end = qh->dummy; in qh_completions()
297 struct ehci_qh_hw *hw = qh->hw; in qh_completions()
309 state = qh->qh_state; in qh_completions()
310 qh->qh_state = QH_STATE_COMPLETING; in qh_completions()
316 qh->dequeue_during_giveback = 0; in qh_completions()
323 list_for_each_safe (entry, tmp, &qh->qtd_list) { in qh_completions()
362 qh); in qh_completions()
374 ++qh->xacterrs < QH_XACTERR_MAX && in qh_completions()
378 qtd->length - QTD_LENGTH(token), qtd->length, qh->xacterrs); in qh_completions()
396 qh->unlink_reason |= QH_UNLINK_HALTED; in qh_completions()
411 qh->unlink_reason |= QH_UNLINK_SHORT_READ; in qh_completions()
426 qh->unlink_reason |= QH_UNLINK_SHUTDOWN; in qh_completions()
444 qh->qtd_list.next == &qtd->qtd_list && in qh_completions()
448 qh->should_be_inactive = 1; in qh_completions()
454 ehci_clear_tt_buffer(ehci, qh, urb, token); in qh_completions()
488 ehci_clear_tt_buffer(ehci, qh, urb, in qh_completions()
496 if (stopped && qtd->qtd_list.prev != &qh->qtd_list) { in qh_completions()
507 qh->xacterrs = 0; in qh_completions()
517 if (unlikely(qh->dequeue_during_giveback)) { in qh_completions()
526 qh->qh_state = state; in qh_completions()
544 qh->unlink_reason |= QH_UNLINK_DUMMY_OVERLAY; in qh_completions()
547 return qh->unlink_reason; in qh_completions()
766 struct ehci_qh *qh = ehci_qh_alloc (ehci, flags); in qh_make() local
775 if (!qh) in qh_make()
776 return qh; in qh_make()
809 qh->ps.usecs = NS_TO_US(usb_calc_bus_time(USB_SPEED_HIGH, in qh_make()
811 qh->ps.phase = NO_FRAME; in qh_make()
814 qh->ps.c_usecs = 0; in qh_make()
815 qh->gap_uf = 0; in qh_make()
826 qh->ps.period = urb->interval >> 3; in qh_make()
833 qh->ps.bw_uperiod = min_t(unsigned, tmp, urb->interval); in qh_make()
834 qh->ps.bw_period = qh->ps.bw_uperiod >> 3; in qh_make()
839 qh->gap_uf = 1 + usb_calc_bus_time (urb->dev->speed, in qh_make()
844 qh->ps.c_usecs = qh->ps.usecs + HS_USECS(0); in qh_make()
845 qh->ps.usecs = HS_USECS(1); in qh_make()
847 qh->ps.usecs += HS_USECS(1); in qh_make()
848 qh->ps.c_usecs = HS_USECS(0); in qh_make()
852 qh->ps.tt_usecs = NS_TO_US(think_time + in qh_make()
857 qh->ps.period = urb->interval; in qh_make()
865 qh->ps.bw_period = min_t(unsigned, tmp, urb->interval); in qh_make()
866 qh->ps.bw_uperiod = qh->ps.bw_period << 3; in qh_make()
871 qh->ps.udev = urb->dev; in qh_make()
872 qh->ps.ep = urb->ep; in qh_make()
936 qh_destroy(ehci, qh); in qh_make()
943 qh->qh_state = QH_STATE_IDLE; in qh_make()
944 hw = qh->hw; in qh_make()
947 qh->is_out = !is_input; in qh_make()
949 return qh; in qh_make()
973 WARN_ON(ehci->async->qh_next.qh || !list_empty(&ehci->async_unlink) || in disable_async()
982 static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh) in qh_link_async() argument
984 __hc32 dma = QH_NEXT(ehci, qh->qh_dma); in qh_link_async()
988 if (unlikely(qh->clearing_tt)) in qh_link_async()
991 WARN_ON(qh->qh_state != QH_STATE_IDLE); in qh_link_async()
994 qh_refresh(ehci, qh); in qh_link_async()
998 qh->qh_next = head->qh_next; in qh_link_async()
999 qh->hw->hw_next = head->hw->hw_next; in qh_link_async()
1002 head->qh_next.qh = qh; in qh_link_async()
1005 qh->qh_state = QH_STATE_LINKED; in qh_link_async()
1006 qh->xacterrs = 0; in qh_link_async()
1007 qh->unlink_reason = 0; in qh_link_async()
1029 struct ehci_qh *qh = NULL; in qh_append_tds() local
1032 qh = (struct ehci_qh *) *ptr; in qh_append_tds()
1033 if (unlikely (qh == NULL)) { in qh_append_tds()
1035 qh = qh_make (ehci, urb, GFP_ATOMIC); in qh_append_tds()
1036 *ptr = qh; in qh_append_tds()
1038 if (likely (qh != NULL)) { in qh_append_tds()
1052 qh->hw->hw_info1 &= ~qh_addr_mask; in qh_append_tds()
1071 dummy = qh->dummy; in qh_append_tds()
1079 list_splice_tail(qtd_list, &qh->qtd_list); in qh_append_tds()
1082 qh->dummy = qtd; in qh_append_tds()
1086 qtd = list_entry (qh->qtd_list.prev, in qh_append_tds()
1094 urb->hcpriv = qh; in qh_append_tds()
1097 return qh; in qh_append_tds()
1111 struct ehci_qh *qh = NULL; in submit_async() local
1138 qh = qh_append_tds(ehci, urb, qtd_list, epnum, &urb->ep->hcpriv); in submit_async()
1139 if (unlikely(qh == NULL)) { in submit_async()
1148 if (likely (qh->qh_state == QH_STATE_IDLE)) in submit_async()
1149 qh_link_async(ehci, qh); in submit_async()
1152 if (unlikely (qh == NULL)) in submit_async()
1258 static void single_unlink_async(struct ehci_hcd *ehci, struct ehci_qh *qh) in single_unlink_async() argument
1263 qh->qh_state = QH_STATE_UNLINK_WAIT; in single_unlink_async()
1264 list_add_tail(&qh->unlink_node, &ehci->async_unlink); in single_unlink_async()
1268 while (prev->qh_next.qh != qh) in single_unlink_async()
1269 prev = prev->qh_next.qh; in single_unlink_async()
1271 prev->hw->hw_next = qh->hw->hw_next; in single_unlink_async()
1272 prev->qh_next = qh->qh_next; in single_unlink_async()
1273 if (ehci->qh_scan_next == qh) in single_unlink_async()
1274 ehci->qh_scan_next = qh->qh_next.qh; in single_unlink_async()
1314 struct ehci_qh *qh; in end_unlink_async() local
1319 qh = list_first_entry(&ehci->async_unlink, struct ehci_qh, in end_unlink_async()
1337 else if (qh->qh_state == QH_STATE_UNLINK) { in end_unlink_async()
1342 list_move_tail(&qh->unlink_node, &ehci->async_idle); in end_unlink_async()
1359 else if (qh->unlink_reason & (QH_UNLINK_HALTED | in end_unlink_async()
1364 else if ((qh->unlink_reason & QH_UNLINK_QUEUE_EMPTY) && in end_unlink_async()
1365 list_empty(&qh->qtd_list)) in end_unlink_async()
1369 else if (qh->hw->hw_token & cpu_to_hc32(ehci, QTD_STS_HALT)) in end_unlink_async()
1376 qh_current = qh->hw->hw_current; in end_unlink_async()
1377 qh_token = qh->hw->hw_token; in end_unlink_async()
1387 qh->qh_state = QH_STATE_UNLINK; in end_unlink_async()
1406 qh = list_first_entry(&ehci->async_idle, struct ehci_qh, in end_unlink_async()
1408 list_del(&qh->unlink_node); in end_unlink_async()
1410 qh->qh_state = QH_STATE_IDLE; in end_unlink_async()
1411 qh->qh_next.qh = NULL; in end_unlink_async()
1413 if (!list_empty(&qh->qtd_list)) in end_unlink_async()
1414 qh_completions(ehci, qh); in end_unlink_async()
1415 if (!list_empty(&qh->qtd_list) && in end_unlink_async()
1417 qh_link_async(ehci, qh); in end_unlink_async()
1423 static void start_unlink_async(struct ehci_hcd *ehci, struct ehci_qh *qh);
1427 struct ehci_qh *qh; in unlink_empty_async() local
1432 for (qh = ehci->async->qh_next.qh; qh; qh = qh->qh_next.qh) { in unlink_empty_async()
1433 if (list_empty(&qh->qtd_list) && in unlink_empty_async()
1434 qh->qh_state == QH_STATE_LINKED) { in unlink_empty_async()
1436 if (qh->unlink_cycle != ehci->async_unlink_cycle) in unlink_empty_async()
1437 qh_to_unlink = qh; in unlink_empty_async()
1460 struct ehci_qh *qh; in unlink_empty_async_suspended() local
1462 while (ehci->async->qh_next.qh) { in unlink_empty_async_suspended()
1463 qh = ehci->async->qh_next.qh; in unlink_empty_async_suspended()
1464 WARN_ON(!list_empty(&qh->qtd_list)); in unlink_empty_async_suspended()
1465 single_unlink_async(ehci, qh); in unlink_empty_async_suspended()
1474 static void start_unlink_async(struct ehci_hcd *ehci, struct ehci_qh *qh) in start_unlink_async() argument
1477 if (qh->qh_state != QH_STATE_LINKED) in start_unlink_async()
1480 single_unlink_async(ehci, qh); in start_unlink_async()
1488 struct ehci_qh *qh; in scan_async() local
1491 ehci->qh_scan_next = ehci->async->qh_next.qh; in scan_async()
1493 qh = ehci->qh_scan_next; in scan_async()
1494 ehci->qh_scan_next = qh->qh_next.qh; in scan_async()
1497 if (!list_empty(&qh->qtd_list)) { in scan_async()
1507 temp = qh_completions(ehci, qh); in scan_async()
1509 start_unlink_async(ehci, qh); in scan_async()
1510 } else if (list_empty(&qh->qtd_list) in scan_async()
1511 && qh->qh_state == QH_STATE_LINKED) { in scan_async()
1512 qh->unlink_cycle = ehci->async_unlink_cycle; in scan_async()