Lines Matching refs:qh
65 static void dwc2_qh_init(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, in dwc2_qh_init() argument
74 qh->ep_type = dwc2_hcd_get_pipe_type(&urb->pipe_info); in dwc2_qh_init()
75 qh->ep_is_in = dwc2_hcd_is_pipe_in(&urb->pipe_info) ? 1 : 0; in dwc2_qh_init()
77 qh->data_toggle = DWC2_HC_PID_DATA0; in dwc2_qh_init()
78 qh->maxp = dwc2_hcd_get_mps(&urb->pipe_info); in dwc2_qh_init()
79 INIT_LIST_HEAD(&qh->qtd_list); in dwc2_qh_init()
80 INIT_LIST_HEAD(&qh->qh_list_entry); in dwc2_qh_init()
93 qh->do_split = 1; in dwc2_qh_init()
96 if (qh->ep_type == USB_ENDPOINT_XFER_INT || in dwc2_qh_init()
97 qh->ep_type == USB_ENDPOINT_XFER_ISOC) { in dwc2_qh_init()
103 dwc2_hb_mult(qh->maxp) * dwc2_max_packet(qh->maxp); in dwc2_qh_init()
105 qh->usecs = NS_TO_US(usb_calc_bus_time(qh->do_split ? in dwc2_qh_init()
106 USB_SPEED_HIGH : dev_speed, qh->ep_is_in, in dwc2_qh_init()
107 qh->ep_type == USB_ENDPOINT_XFER_ISOC, in dwc2_qh_init()
110 qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number, in dwc2_qh_init()
112 qh->interval = urb->interval; in dwc2_qh_init()
115 if (qh->ep_type == USB_ENDPOINT_XFER_INT) in dwc2_qh_init()
116 qh->interval = 8; in dwc2_qh_init()
123 qh->interval *= 8; in dwc2_qh_init()
124 qh->sched_frame |= 0x7; in dwc2_qh_init()
125 qh->start_split_frame = qh->sched_frame; in dwc2_qh_init()
127 dev_dbg(hsotg->dev, "interval=%d\n", qh->interval); in dwc2_qh_init()
131 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - qh = %p\n", qh); in dwc2_qh_init()
138 qh->dev_speed = dev_speed; in dwc2_qh_init()
156 switch (qh->ep_type) { in dwc2_qh_init()
176 if (qh->ep_type == USB_ENDPOINT_XFER_INT) { in dwc2_qh_init()
178 qh->usecs); in dwc2_qh_init()
180 qh->interval); in dwc2_qh_init()
198 struct dwc2_qh *qh; in dwc2_hcd_qh_create() local
204 qh = kzalloc(sizeof(*qh), mem_flags); in dwc2_hcd_qh_create()
205 if (!qh) in dwc2_hcd_qh_create()
208 dwc2_qh_init(hsotg, qh, urb); in dwc2_hcd_qh_create()
211 dwc2_hcd_qh_init_ddma(hsotg, qh, mem_flags) < 0) { in dwc2_hcd_qh_create()
212 dwc2_hcd_qh_free(hsotg, qh); in dwc2_hcd_qh_create()
216 return qh; in dwc2_hcd_qh_create()
230 void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_free() argument
233 dwc2_hcd_qh_free_ddma(hsotg, qh); in dwc2_hcd_qh_free()
234 else if (qh->dw_align_buf) in dwc2_hcd_qh_free()
235 dma_free_coherent(hsotg->dev, qh->dw_align_buf_size, in dwc2_hcd_qh_free()
236 qh->dw_align_buf, qh->dw_align_buf_dma); in dwc2_hcd_qh_free()
237 kfree(qh); in dwc2_hcd_qh_free()
287 struct dwc2_qh *qh) in dwc2_check_periodic_bandwidth() argument
294 if (qh->dev_speed == USB_SPEED_HIGH || qh->do_split) { in dwc2_check_periodic_bandwidth()
299 max_claimed_usecs = 100 - qh->usecs; in dwc2_check_periodic_bandwidth()
305 max_claimed_usecs = 900 - qh->usecs; in dwc2_check_periodic_bandwidth()
311 __func__, hsotg->periodic_usecs, qh->usecs); in dwc2_check_periodic_bandwidth()
336 static int dwc2_find_single_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_single_uframe() argument
338 unsigned short utime = qh->usecs; in dwc2_find_single_uframe()
345 qh->frame_usecs[i] += utime; in dwc2_find_single_uframe()
355 static int dwc2_find_multi_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_multi_uframe() argument
357 unsigned short utime = qh->usecs; in dwc2_find_multi_uframe()
388 qh->frame_usecs[k] += in dwc2_find_multi_uframe()
394 qh->frame_usecs[k] += in dwc2_find_multi_uframe()
411 static int dwc2_find_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_uframe() argument
415 if (qh->dev_speed == USB_SPEED_HIGH) { in dwc2_find_uframe()
417 ret = dwc2_find_single_uframe(hsotg, qh); in dwc2_find_uframe()
423 ret = dwc2_find_multi_uframe(hsotg, qh); in dwc2_find_uframe()
439 struct dwc2_qh *qh) in dwc2_check_max_xfer_size() argument
445 max_xfer_size = dwc2_max_packet(qh->maxp) * dwc2_hb_mult(qh->maxp); in dwc2_check_max_xfer_size()
468 static int dwc2_schedule_periodic(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_schedule_periodic() argument
475 status = dwc2_find_uframe(hsotg, qh); in dwc2_schedule_periodic()
483 qh->sched_frame &= ~0x7; in dwc2_schedule_periodic()
484 qh->sched_frame |= (frame & 7); in dwc2_schedule_periodic()
498 status = dwc2_check_periodic_bandwidth(hsotg, qh); in dwc2_schedule_periodic()
508 status = dwc2_check_max_xfer_size(hsotg, qh); in dwc2_schedule_periodic()
518 list_add_tail(&qh->qh_list_entry, &hsotg->periodic_sched_ready); in dwc2_schedule_periodic()
521 list_add_tail(&qh->qh_list_entry, in dwc2_schedule_periodic()
529 hsotg->periodic_usecs += qh->usecs; in dwc2_schedule_periodic()
542 struct dwc2_qh *qh) in dwc2_deschedule_periodic() argument
546 list_del_init(&qh->qh_list_entry); in dwc2_deschedule_periodic()
549 hsotg->periodic_usecs -= qh->usecs; in dwc2_deschedule_periodic()
553 hsotg->frame_usecs[i] += qh->frame_usecs[i]; in dwc2_deschedule_periodic()
554 qh->frame_usecs[i] = 0; in dwc2_deschedule_periodic()
572 int dwc2_hcd_qh_add(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_add() argument
577 if (dbg_qh(qh)) in dwc2_hcd_qh_add()
580 if (!list_empty(&qh->qh_list_entry)) in dwc2_hcd_qh_add()
585 if (dwc2_qh_is_non_per(qh)) { in dwc2_hcd_qh_add()
587 list_add_tail(&qh->qh_list_entry, in dwc2_hcd_qh_add()
592 status = dwc2_schedule_periodic(hsotg, qh); in dwc2_hcd_qh_add()
612 void dwc2_hcd_qh_unlink(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_unlink() argument
618 if (list_empty(&qh->qh_list_entry)) in dwc2_hcd_qh_unlink()
622 if (dwc2_qh_is_non_per(qh)) { in dwc2_hcd_qh_unlink()
623 if (hsotg->non_periodic_qh_ptr == &qh->qh_list_entry) in dwc2_hcd_qh_unlink()
626 list_del_init(&qh->qh_list_entry); in dwc2_hcd_qh_unlink()
630 dwc2_deschedule_periodic(hsotg, qh); in dwc2_hcd_qh_unlink()
643 struct dwc2_qh *qh, u16 frame_number, in dwc2_sched_periodic_split() argument
649 qh->sched_frame = frame_number; in dwc2_sched_periodic_split()
650 incr = dwc2_frame_num_inc(qh->start_split_frame, 1); in dwc2_sched_periodic_split()
658 if (qh->ep_type != USB_ENDPOINT_XFER_ISOC || in dwc2_sched_periodic_split()
659 qh->ep_is_in != 0) { in dwc2_sched_periodic_split()
660 qh->sched_frame = in dwc2_sched_periodic_split()
661 dwc2_frame_num_inc(qh->sched_frame, 1); in dwc2_sched_periodic_split()
665 qh->sched_frame = dwc2_frame_num_inc(qh->start_split_frame, in dwc2_sched_periodic_split()
666 qh->interval); in dwc2_sched_periodic_split()
667 if (dwc2_frame_num_le(qh->sched_frame, frame_number)) in dwc2_sched_periodic_split()
668 qh->sched_frame = frame_number; in dwc2_sched_periodic_split()
669 qh->sched_frame |= 0x7; in dwc2_sched_periodic_split()
670 qh->start_split_frame = qh->sched_frame; in dwc2_sched_periodic_split()
687 void dwc2_hcd_qh_deactivate(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, in dwc2_hcd_qh_deactivate() argument
692 if (dbg_qh(qh)) in dwc2_hcd_qh_deactivate()
695 if (dwc2_qh_is_non_per(qh)) { in dwc2_hcd_qh_deactivate()
696 dwc2_hcd_qh_unlink(hsotg, qh); in dwc2_hcd_qh_deactivate()
697 if (!list_empty(&qh->qtd_list)) in dwc2_hcd_qh_deactivate()
699 dwc2_hcd_qh_add(hsotg, qh); in dwc2_hcd_qh_deactivate()
705 if (qh->do_split) { in dwc2_hcd_qh_deactivate()
706 dwc2_sched_periodic_split(hsotg, qh, frame_number, in dwc2_hcd_qh_deactivate()
709 qh->sched_frame = dwc2_frame_num_inc(qh->sched_frame, in dwc2_hcd_qh_deactivate()
710 qh->interval); in dwc2_hcd_qh_deactivate()
711 if (dwc2_frame_num_le(qh->sched_frame, frame_number)) in dwc2_hcd_qh_deactivate()
712 qh->sched_frame = frame_number; in dwc2_hcd_qh_deactivate()
715 if (list_empty(&qh->qtd_list)) { in dwc2_hcd_qh_deactivate()
716 dwc2_hcd_qh_unlink(hsotg, qh); in dwc2_hcd_qh_deactivate()
724 dwc2_frame_num_le(qh->sched_frame, frame_number)) || in dwc2_hcd_qh_deactivate()
726 qh->sched_frame == frame_number)) in dwc2_hcd_qh_deactivate()
727 list_move(&qh->qh_list_entry, &hsotg->periodic_sched_ready); in dwc2_hcd_qh_deactivate()
729 list_move(&qh->qh_list_entry, &hsotg->periodic_sched_inactive); in dwc2_hcd_qh_deactivate()
777 struct dwc2_qh **qh, gfp_t mem_flags) in dwc2_hcd_qtd_add() argument
788 if (*qh == NULL) { in dwc2_hcd_qtd_add()
789 *qh = dwc2_hcd_qh_create(hsotg, urb, mem_flags); in dwc2_hcd_qtd_add()
790 if (*qh == NULL) in dwc2_hcd_qtd_add()
797 retval = dwc2_hcd_qh_add(hsotg, *qh); in dwc2_hcd_qtd_add()
801 qtd->qh = *qh; in dwc2_hcd_qtd_add()
802 list_add_tail(&qtd->qtd_list_entry, &(*qh)->qtd_list); in dwc2_hcd_qtd_add()
810 struct dwc2_qh *qh_tmp = *qh; in dwc2_hcd_qtd_add()
812 *qh = NULL; in dwc2_hcd_qtd_add()