Lines Matching refs:uhci
28 static void uhci_set_next_interrupt(struct uhci_hcd *uhci) in uhci_set_next_interrupt() argument
30 if (uhci->is_stopped) in uhci_set_next_interrupt()
31 mod_timer(&uhci_to_hcd(uhci)->rh_timer, jiffies); in uhci_set_next_interrupt()
32 uhci->term_td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); in uhci_set_next_interrupt()
35 static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci) in uhci_clear_next_interrupt() argument
37 uhci->term_td->status &= ~cpu_to_hc32(uhci, TD_CTRL_IOC); in uhci_clear_next_interrupt()
46 static void uhci_fsbr_on(struct uhci_hcd *uhci) in uhci_fsbr_on() argument
53 uhci->fsbr_is_on = 1; in uhci_fsbr_on()
54 lqh = list_entry(uhci->skel_async_qh->node.prev, in uhci_fsbr_on()
56 lqh->link = LINK_TO_QH(uhci, uhci->skel_term_qh); in uhci_fsbr_on()
59 static void uhci_fsbr_off(struct uhci_hcd *uhci) in uhci_fsbr_off() argument
65 uhci->fsbr_is_on = 0; in uhci_fsbr_off()
66 lqh = list_entry(uhci->skel_async_qh->node.prev, in uhci_fsbr_off()
68 lqh->link = UHCI_PTR_TERM(uhci); in uhci_fsbr_off()
71 static void uhci_add_fsbr(struct uhci_hcd *uhci, struct urb *urb) in uhci_add_fsbr() argument
79 static void uhci_urbp_wants_fsbr(struct uhci_hcd *uhci, struct urb_priv *urbp) in uhci_urbp_wants_fsbr() argument
82 uhci->fsbr_is_wanted = 1; in uhci_urbp_wants_fsbr()
83 if (!uhci->fsbr_is_on) in uhci_urbp_wants_fsbr()
84 uhci_fsbr_on(uhci); in uhci_urbp_wants_fsbr()
85 else if (uhci->fsbr_expiring) { in uhci_urbp_wants_fsbr()
86 uhci->fsbr_expiring = 0; in uhci_urbp_wants_fsbr()
87 del_timer(&uhci->fsbr_timer); in uhci_urbp_wants_fsbr()
94 struct uhci_hcd *uhci = (struct uhci_hcd *) _uhci; in uhci_fsbr_timeout() local
97 spin_lock_irqsave(&uhci->lock, flags); in uhci_fsbr_timeout()
98 if (uhci->fsbr_expiring) { in uhci_fsbr_timeout()
99 uhci->fsbr_expiring = 0; in uhci_fsbr_timeout()
100 uhci_fsbr_off(uhci); in uhci_fsbr_timeout()
102 spin_unlock_irqrestore(&uhci->lock, flags); in uhci_fsbr_timeout()
106 static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci) in uhci_alloc_td() argument
111 td = dma_pool_alloc(uhci->td_pool, GFP_ATOMIC, &dma_handle); in uhci_alloc_td()
124 static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td) in uhci_free_td() argument
127 dev_WARN(uhci_dev(uhci), "td %p still in list!\n", td); in uhci_free_td()
129 dev_WARN(uhci_dev(uhci), "td %p still in fl_list!\n", td); in uhci_free_td()
131 dma_pool_free(uhci->td_pool, td, td->dma_handle); in uhci_free_td()
134 static inline void uhci_fill_td(struct uhci_hcd *uhci, struct uhci_td *td, in uhci_fill_td() argument
137 td->status = cpu_to_hc32(uhci, status); in uhci_fill_td()
138 td->token = cpu_to_hc32(uhci, token); in uhci_fill_td()
139 td->buffer = cpu_to_hc32(uhci, buffer); in uhci_fill_td()
155 static inline void uhci_insert_td_in_frame_list(struct uhci_hcd *uhci, in uhci_insert_td_in_frame_list() argument
163 if (uhci->frame_cpu[framenum]) { in uhci_insert_td_in_frame_list()
166 ftd = uhci->frame_cpu[framenum]; in uhci_insert_td_in_frame_list()
173 ltd->link = LINK_TO_TD(uhci, td); in uhci_insert_td_in_frame_list()
175 td->link = uhci->frame[framenum]; in uhci_insert_td_in_frame_list()
177 uhci->frame[framenum] = LINK_TO_TD(uhci, td); in uhci_insert_td_in_frame_list()
178 uhci->frame_cpu[framenum] = td; in uhci_insert_td_in_frame_list()
182 static inline void uhci_remove_td_from_frame_list(struct uhci_hcd *uhci, in uhci_remove_td_from_frame_list() argument
191 if (uhci->frame_cpu[td->frame] == td) { in uhci_remove_td_from_frame_list()
193 uhci->frame[td->frame] = td->link; in uhci_remove_td_from_frame_list()
194 uhci->frame_cpu[td->frame] = NULL; in uhci_remove_td_from_frame_list()
201 uhci->frame[td->frame] = LINK_TO_TD(uhci, ntd); in uhci_remove_td_from_frame_list()
202 uhci->frame_cpu[td->frame] = ntd; in uhci_remove_td_from_frame_list()
215 static inline void uhci_remove_tds_from_frame(struct uhci_hcd *uhci, in uhci_remove_tds_from_frame() argument
222 ftd = uhci->frame_cpu[framenum]; in uhci_remove_tds_from_frame()
225 uhci->frame[framenum] = ltd->link; in uhci_remove_tds_from_frame()
226 uhci->frame_cpu[framenum] = NULL; in uhci_remove_tds_from_frame()
236 static void uhci_unlink_isochronous_tds(struct uhci_hcd *uhci, struct urb *urb) in uhci_unlink_isochronous_tds() argument
242 uhci_remove_td_from_frame_list(uhci, td); in uhci_unlink_isochronous_tds()
245 static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, in uhci_alloc_qh() argument
251 qh = dma_pool_alloc(uhci->qh_pool, GFP_ATOMIC, &dma_handle); in uhci_alloc_qh()
258 qh->element = UHCI_PTR_TERM(uhci); in uhci_alloc_qh()
259 qh->link = UHCI_PTR_TERM(uhci); in uhci_alloc_qh()
267 qh->dummy_td = uhci_alloc_td(uhci); in uhci_alloc_qh()
269 dma_pool_free(uhci->qh_pool, qh, dma_handle); in uhci_alloc_qh()
293 static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) in uhci_free_qh() argument
297 dev_WARN(uhci_dev(uhci), "qh %p list not empty!\n", qh); in uhci_free_qh()
303 uhci_free_td(uhci, qh->dummy_td); in uhci_free_qh()
305 dma_pool_free(uhci->qh_pool, qh, qh->dma_handle); in uhci_free_qh()
315 static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh, in uhci_cleanup_queue() argument
327 ret = (uhci->frame_number + uhci->is_stopped != in uhci_cleanup_queue()
351 if (qh_element(qh) == UHCI_PTR_TERM(uhci)) in uhci_cleanup_queue()
353 qh->element = UHCI_PTR_TERM(uhci); in uhci_cleanup_queue()
363 qh->initial_toggle = uhci_toggle(td_token(uhci, td)); in uhci_cleanup_queue()
373 static void uhci_fixup_toggles(struct uhci_hcd *uhci, struct uhci_qh *qh, in uhci_fixup_toggles() argument
388 else if (qh_element(qh) != UHCI_PTR_TERM(uhci)) in uhci_fixup_toggles()
400 if (toggle > 1 || uhci_toggle(td_token(uhci, td)) == toggle) { in uhci_fixup_toggles()
403 toggle = uhci_toggle(td_token(uhci, td)) ^ 1; in uhci_fixup_toggles()
408 td->token ^= cpu_to_hc32(uhci, in uhci_fixup_toggles()
425 static inline void link_iso(struct uhci_hcd *uhci, struct uhci_qh *qh) in link_iso() argument
427 list_add_tail(&qh->node, &uhci->skel_iso_qh->node); in link_iso()
436 static void link_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) in link_interrupt() argument
440 list_add_tail(&qh->node, &uhci->skelqh[qh->skel]->node); in link_interrupt()
445 pqh->link = LINK_TO_QH(uhci, qh); in link_interrupt()
452 static void link_async(struct uhci_hcd *uhci, struct uhci_qh *qh) in link_async() argument
460 list_for_each_entry_reverse(pqh, &uhci->skel_async_qh->node, node) { in link_async()
469 link_to_new_qh = LINK_TO_QH(uhci, qh); in link_async()
475 uhci->skel_term_qh->link = link_to_new_qh; in link_async()
481 static void uhci_activate_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) in uhci_activate_qh() argument
487 if (qh_element(qh) == UHCI_PTR_TERM(uhci)) { in uhci_activate_qh()
493 qh->element = LINK_TO_TD(uhci, td); in uhci_activate_qh()
506 if (qh == uhci->next_qh) in uhci_activate_qh()
507 uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, in uhci_activate_qh()
512 link_iso(uhci, qh); in uhci_activate_qh()
514 link_interrupt(uhci, qh); in uhci_activate_qh()
516 link_async(uhci, qh); in uhci_activate_qh()
522 static void unlink_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) in unlink_interrupt() argument
534 static void unlink_async(struct uhci_hcd *uhci, struct uhci_qh *qh) in unlink_async() argument
545 uhci->skel_term_qh->link = link_to_next_qh; in unlink_async()
552 static void uhci_unlink_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) in uhci_unlink_qh() argument
563 unlink_interrupt(uhci, qh); in uhci_unlink_qh()
565 unlink_async(uhci, qh); in uhci_unlink_qh()
567 uhci_get_current_frame_number(uhci); in uhci_unlink_qh()
568 qh->unlink_frame = uhci->frame_number; in uhci_unlink_qh()
571 if (list_empty(&uhci->skel_unlink_qh->node) || uhci->is_stopped) in uhci_unlink_qh()
572 uhci_set_next_interrupt(uhci); in uhci_unlink_qh()
575 if (qh == uhci->next_qh) in uhci_unlink_qh()
576 uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, in uhci_unlink_qh()
578 list_move_tail(&qh->node, &uhci->skel_unlink_qh->node); in uhci_unlink_qh()
587 static void uhci_make_qh_idle(struct uhci_hcd *uhci, struct uhci_qh *qh) in uhci_make_qh_idle() argument
591 if (qh == uhci->next_qh) in uhci_make_qh_idle()
592 uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, in uhci_make_qh_idle()
594 list_move(&qh->node, &uhci->idle_qh_list); in uhci_make_qh_idle()
599 uhci_free_td(uhci, qh->post_td); in uhci_make_qh_idle()
604 if (uhci->num_waiting) in uhci_make_qh_idle()
605 wake_up_all(&uhci->waitqh); in uhci_make_qh_idle()
611 static int uhci_highest_load(struct uhci_hcd *uhci, int phase, int period) in uhci_highest_load() argument
613 int highest_load = uhci->load[phase]; in uhci_highest_load()
616 highest_load = max_t(int, highest_load, uhci->load[phase]); in uhci_highest_load()
624 static int uhci_check_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh) in uhci_check_bandwidth() argument
631 minimax_load = uhci_highest_load(uhci, qh->phase, qh->period); in uhci_check_bandwidth()
637 minimax_load = uhci_highest_load(uhci, qh->phase, qh->period); in uhci_check_bandwidth()
639 load = uhci_highest_load(uhci, phase, qh->period); in uhci_check_bandwidth()
649 dev_dbg(uhci_dev(uhci), "bandwidth allocation failed: " in uhci_check_bandwidth()
660 static void uhci_reserve_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh) in uhci_reserve_bandwidth() argument
667 uhci->load[i] += load; in uhci_reserve_bandwidth()
668 uhci->total_load += load; in uhci_reserve_bandwidth()
670 uhci_to_hcd(uhci)->self.bandwidth_allocated = in uhci_reserve_bandwidth()
671 uhci->total_load / MAX_PHASE; in uhci_reserve_bandwidth()
674 ++uhci_to_hcd(uhci)->self.bandwidth_int_reqs; in uhci_reserve_bandwidth()
678 ++uhci_to_hcd(uhci)->self.bandwidth_isoc_reqs; in uhci_reserve_bandwidth()
683 dev_dbg(uhci_dev(uhci), in uhci_reserve_bandwidth()
693 static void uhci_release_bandwidth(struct uhci_hcd *uhci, struct uhci_qh *qh) in uhci_release_bandwidth() argument
700 uhci->load[i] -= load; in uhci_release_bandwidth()
701 uhci->total_load -= load; in uhci_release_bandwidth()
703 uhci_to_hcd(uhci)->self.bandwidth_allocated = in uhci_release_bandwidth()
704 uhci->total_load / MAX_PHASE; in uhci_release_bandwidth()
707 --uhci_to_hcd(uhci)->self.bandwidth_int_reqs; in uhci_release_bandwidth()
711 --uhci_to_hcd(uhci)->self.bandwidth_isoc_reqs; in uhci_release_bandwidth()
716 dev_dbg(uhci_dev(uhci), in uhci_release_bandwidth()
723 static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, in uhci_alloc_urb_priv() argument
741 static void uhci_free_urb_priv(struct uhci_hcd *uhci, in uhci_free_urb_priv() argument
747 dev_WARN(uhci_dev(uhci), "urb %p still on QH's list!\n", in uhci_free_urb_priv()
752 uhci_free_td(uhci, td); in uhci_free_urb_priv()
790 static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, in uhci_submit_control() argument
815 uhci_fill_td(uhci, td, status, destination | uhci_explen(8), in uhci_submit_control()
845 td = uhci_alloc_td(uhci); in uhci_submit_control()
848 *plink = LINK_TO_TD(uhci, td); in uhci_submit_control()
854 uhci_fill_td(uhci, td, status, in uhci_submit_control()
865 td = uhci_alloc_td(uhci); in uhci_submit_control()
868 *plink = LINK_TO_TD(uhci, td); in uhci_submit_control()
875 uhci_fill_td(uhci, td, status | TD_CTRL_IOC, in uhci_submit_control()
882 td = uhci_alloc_td(uhci); in uhci_submit_control()
885 *plink = LINK_TO_TD(uhci, td); in uhci_submit_control()
887 uhci_fill_td(uhci, td, 0, USB_PID_OUT | uhci_explen(0), 0); in uhci_submit_control()
889 qh->dummy_td->status |= cpu_to_hc32(uhci, TD_CTRL_ACTIVE); in uhci_submit_control()
901 uhci_add_fsbr(uhci, urb); in uhci_submit_control()
916 static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, in uhci_submit_common() argument
975 td = uhci_alloc_td(uhci); in uhci_submit_common()
978 *plink = LINK_TO_TD(uhci, td); in uhci_submit_common()
981 uhci_fill_td(uhci, td, status, in uhci_submit_common()
1011 td = uhci_alloc_td(uhci); in uhci_submit_common()
1014 *plink = LINK_TO_TD(uhci, td); in uhci_submit_common()
1017 uhci_fill_td(uhci, td, status, in uhci_submit_common()
1032 td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); in uhci_submit_common()
1037 td = uhci_alloc_td(uhci); in uhci_submit_common()
1040 *plink = LINK_TO_TD(uhci, td); in uhci_submit_common()
1042 uhci_fill_td(uhci, td, 0, USB_PID_OUT | uhci_explen(0), 0); in uhci_submit_common()
1044 qh->dummy_td->status |= cpu_to_hc32(uhci, TD_CTRL_ACTIVE); in uhci_submit_common()
1057 static int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb, in uhci_submit_bulk() argument
1068 ret = uhci_submit_common(uhci, urb, qh); in uhci_submit_bulk()
1070 uhci_add_fsbr(uhci, urb); in uhci_submit_bulk()
1074 static int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb, in uhci_submit_interrupt() argument
1104 ret = uhci_check_bandwidth(uhci, qh); in uhci_submit_interrupt()
1111 ret = uhci_submit_common(uhci, urb, qh); in uhci_submit_interrupt()
1115 uhci_reserve_bandwidth(uhci, qh); in uhci_submit_interrupt()
1123 static int uhci_fixup_short_transfer(struct uhci_hcd *uhci, in uhci_fixup_short_transfer() argument
1137 qh->element = LINK_TO_TD(uhci, td); in uhci_fixup_short_transfer()
1147 uhci_toggle(td_token(uhci, qh->post_td)) ^ 1; in uhci_fixup_short_transfer()
1148 uhci_fixup_toggles(uhci, qh, 1); in uhci_fixup_short_transfer()
1163 uhci_free_td(uhci, td); in uhci_fixup_short_transfer()
1171 static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) in uhci_result_common() argument
1183 ctrlstat = td_status(uhci, td); in uhci_result_common()
1193 uhci_packetout(td_token(uhci, td))); in uhci_result_common()
1202 uhci_show_qh(uhci, urbp->qh, errbuf, in uhci_result_common()
1209 } else if (len < uhci_expected_length(td_token(uhci, td))) { in uhci_result_common()
1229 uhci_free_td(uhci, qh->post_td); in uhci_result_common()
1241 qh->element = UHCI_PTR_TERM(uhci); in uhci_result_common()
1244 qh->initial_toggle = uhci_toggle(td_token(uhci, td)) ^ in uhci_result_common()
1248 ret = uhci_fixup_short_transfer(uhci, qh, urbp); in uhci_result_common()
1255 static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, in uhci_submit_isochronous() argument
1269 uhci_get_current_frame_number(uhci); in uhci_submit_isochronous()
1275 i = uhci_check_bandwidth(uhci, qh); in uhci_submit_isochronous()
1280 next = uhci->frame_number + 10; in uhci_submit_isochronous()
1290 next = uhci->frame_number + 1; in uhci_submit_isochronous()
1320 dev_dbg(uhci_dev(uhci), "iso underrun %p (%u+%u < %u)\n", in uhci_submit_isochronous()
1329 if (uhci_frame_before_eq(uhci->last_iso_frame + UHCI_NUMFRAMES, in uhci_submit_isochronous()
1338 td = uhci_alloc_td(uhci); in uhci_submit_isochronous()
1343 uhci_fill_td(uhci, td, status, destination | in uhci_submit_isochronous()
1350 td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); in uhci_submit_isochronous()
1355 uhci_insert_td_in_frame_list(uhci, td, frame); in uhci_submit_isochronous()
1366 uhci_reserve_bandwidth(uhci, qh); in uhci_submit_isochronous()
1370 static int uhci_result_isochronous(struct uhci_hcd *uhci, struct urb *urb) in uhci_result_isochronous() argument
1381 if (uhci_frame_before_eq(uhci->cur_iso_frame, qh->iso_frame)) in uhci_result_isochronous()
1384 uhci_remove_tds_from_frame(uhci, qh->iso_frame); in uhci_result_isochronous()
1386 ctrlstat = td_status(uhci, td); in uhci_result_isochronous()
1402 uhci_free_td(uhci, td); in uhci_result_isochronous()
1413 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_urb_enqueue() local
1418 spin_lock_irqsave(&uhci->lock, flags); in uhci_urb_enqueue()
1425 urbp = uhci_alloc_urb_priv(uhci, urb); in uhci_urb_enqueue()
1432 qh = uhci_alloc_qh(uhci, urb->dev, urb->ep); in uhci_urb_enqueue()
1440 ret = uhci_submit_control(uhci, urb, qh); in uhci_urb_enqueue()
1443 ret = uhci_submit_bulk(uhci, urb, qh); in uhci_urb_enqueue()
1446 ret = uhci_submit_interrupt(uhci, urb, qh); in uhci_urb_enqueue()
1450 ret = uhci_submit_isochronous(uhci, urb, qh); in uhci_urb_enqueue()
1464 uhci_activate_qh(uhci, qh); in uhci_urb_enqueue()
1465 uhci_urbp_wants_fsbr(uhci, urbp); in uhci_urb_enqueue()
1471 uhci_make_qh_idle(uhci, qh); /* Reclaim unused QH */ in uhci_urb_enqueue()
1473 uhci_free_urb_priv(uhci, urbp); in uhci_urb_enqueue()
1478 spin_unlock_irqrestore(&uhci->lock, flags); in uhci_urb_enqueue()
1484 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_urb_dequeue() local
1489 spin_lock_irqsave(&uhci->lock, flags); in uhci_urb_dequeue()
1498 uhci_unlink_isochronous_tds(uhci, urb); in uhci_urb_dequeue()
1502 uhci_get_current_frame_number(uhci); in uhci_urb_dequeue()
1503 if (uhci_frame_before_eq(urb->start_frame, uhci->frame_number)) in uhci_urb_dequeue()
1504 qh->unlink_frame = uhci->frame_number; in uhci_urb_dequeue()
1507 uhci_unlink_qh(uhci, qh); in uhci_urb_dequeue()
1510 spin_unlock_irqrestore(&uhci->lock, flags); in uhci_urb_dequeue()
1517 static void uhci_giveback_urb(struct uhci_hcd *uhci, struct uhci_qh *qh, in uhci_giveback_urb() argument
1519 __releases(uhci->lock) in uhci_giveback_urb()
1520 __acquires(uhci->lock) in uhci_giveback_urb()
1553 uhci_free_urb_priv(uhci, urbp); in uhci_giveback_urb()
1554 usb_hcd_unlink_urb_from_ep(uhci_to_hcd(uhci), urb); in uhci_giveback_urb()
1556 spin_unlock(&uhci->lock); in uhci_giveback_urb()
1557 usb_hcd_giveback_urb(uhci_to_hcd(uhci), urb, status); in uhci_giveback_urb()
1558 spin_lock(&uhci->lock); in uhci_giveback_urb()
1563 uhci_unlink_qh(uhci, qh); in uhci_giveback_urb()
1565 uhci_release_bandwidth(uhci, qh); in uhci_giveback_urb()
1574 uhci->frame_number + uhci->is_stopped != qh->unlink_frame)
1576 static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) in uhci_scan_qh() argument
1587 status = uhci_result_isochronous(uhci, urb); in uhci_scan_qh()
1589 status = uhci_result_common(uhci, urb); in uhci_scan_qh()
1602 uhci_giveback_urb(uhci, qh, urb, status); in uhci_scan_qh()
1623 if (!uhci_cleanup_queue(uhci, qh, urb)) { in uhci_scan_qh()
1627 uhci_giveback_urb(uhci, qh, urb, 0); in uhci_scan_qh()
1637 uhci_fixup_toggles(uhci, qh, 0); in uhci_scan_qh()
1647 td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); in uhci_scan_qh()
1650 uhci_activate_qh(uhci, qh); in uhci_scan_qh()
1656 uhci_make_qh_idle(uhci, qh); in uhci_scan_qh()
1669 static int uhci_advance_check(struct uhci_hcd *uhci, struct uhci_qh *qh) in uhci_advance_check() argument
1694 status = td_status(uhci, td); in uhci_advance_check()
1702 ret = uhci->is_stopped; in uhci_advance_check()
1713 LINK_TO_TD(uhci, qh->post_td)) { in uhci_advance_check()
1727 uhci_unlink_qh(uhci, qh); in uhci_advance_check()
1732 uhci_urbp_wants_fsbr(uhci, urbp); in uhci_advance_check()
1742 static void uhci_scan_schedule(struct uhci_hcd *uhci) in uhci_scan_schedule() argument
1748 if (uhci->scan_in_progress) { in uhci_scan_schedule()
1749 uhci->need_rescan = 1; in uhci_scan_schedule()
1752 uhci->scan_in_progress = 1; in uhci_scan_schedule()
1754 uhci->need_rescan = 0; in uhci_scan_schedule()
1755 uhci->fsbr_is_wanted = 0; in uhci_scan_schedule()
1757 uhci_clear_next_interrupt(uhci); in uhci_scan_schedule()
1758 uhci_get_current_frame_number(uhci); in uhci_scan_schedule()
1759 uhci->cur_iso_frame = uhci->frame_number; in uhci_scan_schedule()
1763 uhci->next_qh = list_entry(uhci->skelqh[i]->node.next, in uhci_scan_schedule()
1765 while ((qh = uhci->next_qh) != uhci->skelqh[i]) { in uhci_scan_schedule()
1766 uhci->next_qh = list_entry(qh->node.next, in uhci_scan_schedule()
1769 if (uhci_advance_check(uhci, qh)) { in uhci_scan_schedule()
1770 uhci_scan_qh(uhci, qh); in uhci_scan_schedule()
1772 uhci_urbp_wants_fsbr(uhci, in uhci_scan_schedule()
1779 uhci->last_iso_frame = uhci->cur_iso_frame; in uhci_scan_schedule()
1780 if (uhci->need_rescan) in uhci_scan_schedule()
1782 uhci->scan_in_progress = 0; in uhci_scan_schedule()
1784 if (uhci->fsbr_is_on && !uhci->fsbr_is_wanted && in uhci_scan_schedule()
1785 !uhci->fsbr_expiring) { in uhci_scan_schedule()
1786 uhci->fsbr_expiring = 1; in uhci_scan_schedule()
1787 mod_timer(&uhci->fsbr_timer, jiffies + FSBR_OFF_DELAY); in uhci_scan_schedule()
1790 if (list_empty(&uhci->skel_unlink_qh->node)) in uhci_scan_schedule()
1791 uhci_clear_next_interrupt(uhci); in uhci_scan_schedule()
1793 uhci_set_next_interrupt(uhci); in uhci_scan_schedule()