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()
113 qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number, in dwc2_qh_init()
115 qh->interval = urb->interval; in dwc2_qh_init()
118 if (qh->ep_type == USB_ENDPOINT_XFER_INT) in dwc2_qh_init()
119 qh->interval = 8; in dwc2_qh_init()
126 qh->interval *= 8; in dwc2_qh_init()
127 qh->sched_frame |= 0x7; in dwc2_qh_init()
128 qh->start_split_frame = qh->sched_frame; in dwc2_qh_init()
130 dev_dbg(hsotg->dev, "interval=%d\n", qh->interval); in dwc2_qh_init()
134 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - qh = %p\n", qh); in dwc2_qh_init()
141 qh->dev_speed = dev_speed; in dwc2_qh_init()
159 switch (qh->ep_type) { in dwc2_qh_init()
179 if (qh->ep_type == USB_ENDPOINT_XFER_INT) { in dwc2_qh_init()
181 qh->usecs); in dwc2_qh_init()
183 qh->interval); in dwc2_qh_init()
201 struct dwc2_qh *qh; in dwc2_hcd_qh_create() local
207 qh = kzalloc(sizeof(*qh), mem_flags); in dwc2_hcd_qh_create()
208 if (!qh) in dwc2_hcd_qh_create()
211 dwc2_qh_init(hsotg, qh, urb); in dwc2_hcd_qh_create()
214 dwc2_hcd_qh_init_ddma(hsotg, qh, mem_flags) < 0) { in dwc2_hcd_qh_create()
215 dwc2_hcd_qh_free(hsotg, qh); in dwc2_hcd_qh_create()
219 return qh; in dwc2_hcd_qh_create()
233 void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_free() argument
236 dwc2_hcd_qh_free_ddma(hsotg, qh); in dwc2_hcd_qh_free()
239 kfree(qh->dw_align_buf); in dwc2_hcd_qh_free()
240 qh->dw_align_buf_dma = (dma_addr_t)0; in dwc2_hcd_qh_free()
242 kfree(qh); in dwc2_hcd_qh_free()
292 struct dwc2_qh *qh) in dwc2_check_periodic_bandwidth() argument
299 if (qh->dev_speed == USB_SPEED_HIGH || qh->do_split) { in dwc2_check_periodic_bandwidth()
304 max_claimed_usecs = 100 - qh->usecs; in dwc2_check_periodic_bandwidth()
310 max_claimed_usecs = 900 - qh->usecs; in dwc2_check_periodic_bandwidth()
316 __func__, hsotg->periodic_usecs, qh->usecs); in dwc2_check_periodic_bandwidth()
341 static int dwc2_find_single_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_single_uframe() argument
343 unsigned short utime = qh->usecs; in dwc2_find_single_uframe()
350 qh->frame_usecs[i] += utime; in dwc2_find_single_uframe()
360 static int dwc2_find_multi_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_multi_uframe() argument
362 unsigned short utime = qh->usecs; in dwc2_find_multi_uframe()
393 qh->frame_usecs[k] += in dwc2_find_multi_uframe()
399 qh->frame_usecs[k] += in dwc2_find_multi_uframe()
416 static int dwc2_find_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_uframe() argument
420 if (qh->dev_speed == USB_SPEED_HIGH) { in dwc2_find_uframe()
422 ret = dwc2_find_single_uframe(hsotg, qh); in dwc2_find_uframe()
428 ret = dwc2_find_multi_uframe(hsotg, qh); in dwc2_find_uframe()
444 struct dwc2_qh *qh) in dwc2_check_max_xfer_size() argument
450 max_xfer_size = dwc2_max_packet(qh->maxp) * dwc2_hb_mult(qh->maxp); in dwc2_check_max_xfer_size()
473 static int dwc2_schedule_periodic(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_schedule_periodic() argument
480 status = dwc2_find_uframe(hsotg, qh); in dwc2_schedule_periodic()
488 qh->sched_frame &= ~0x7; in dwc2_schedule_periodic()
489 qh->sched_frame |= (frame & 7); in dwc2_schedule_periodic()
503 status = dwc2_check_periodic_bandwidth(hsotg, qh); in dwc2_schedule_periodic()
513 status = dwc2_check_max_xfer_size(hsotg, qh); in dwc2_schedule_periodic()
523 list_add_tail(&qh->qh_list_entry, &hsotg->periodic_sched_ready); in dwc2_schedule_periodic()
526 list_add_tail(&qh->qh_list_entry, in dwc2_schedule_periodic()
534 hsotg->periodic_usecs += qh->usecs; in dwc2_schedule_periodic()
547 struct dwc2_qh *qh) in dwc2_deschedule_periodic() argument
551 list_del_init(&qh->qh_list_entry); in dwc2_deschedule_periodic()
554 hsotg->periodic_usecs -= qh->usecs; in dwc2_deschedule_periodic()
558 hsotg->frame_usecs[i] += qh->frame_usecs[i]; in dwc2_deschedule_periodic()
559 qh->frame_usecs[i] = 0; in dwc2_deschedule_periodic()
577 int dwc2_hcd_qh_add(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_add() argument
582 if (dbg_qh(qh)) in dwc2_hcd_qh_add()
585 if (!list_empty(&qh->qh_list_entry)) in dwc2_hcd_qh_add()
589 if (!dwc2_frame_num_le(qh->sched_frame, hsotg->frame_number) && in dwc2_hcd_qh_add()
593 qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number, in dwc2_hcd_qh_add()
598 if (dwc2_qh_is_non_per(qh)) { in dwc2_hcd_qh_add()
600 list_add_tail(&qh->qh_list_entry, in dwc2_hcd_qh_add()
605 status = dwc2_schedule_periodic(hsotg, qh); in dwc2_hcd_qh_add()
625 void dwc2_hcd_qh_unlink(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_unlink() argument
631 if (list_empty(&qh->qh_list_entry)) in dwc2_hcd_qh_unlink()
635 if (dwc2_qh_is_non_per(qh)) { in dwc2_hcd_qh_unlink()
636 if (hsotg->non_periodic_qh_ptr == &qh->qh_list_entry) in dwc2_hcd_qh_unlink()
639 list_del_init(&qh->qh_list_entry); in dwc2_hcd_qh_unlink()
643 dwc2_deschedule_periodic(hsotg, qh); in dwc2_hcd_qh_unlink()
656 struct dwc2_qh *qh, u16 frame_number, in dwc2_sched_periodic_split() argument
662 qh->sched_frame = frame_number; in dwc2_sched_periodic_split()
663 incr = dwc2_frame_num_inc(qh->start_split_frame, 1); in dwc2_sched_periodic_split()
671 if (qh->ep_type != USB_ENDPOINT_XFER_ISOC || in dwc2_sched_periodic_split()
672 qh->ep_is_in != 0) { in dwc2_sched_periodic_split()
673 qh->sched_frame = in dwc2_sched_periodic_split()
674 dwc2_frame_num_inc(qh->sched_frame, 1); in dwc2_sched_periodic_split()
678 qh->sched_frame = dwc2_frame_num_inc(qh->start_split_frame, in dwc2_sched_periodic_split()
679 qh->interval); in dwc2_sched_periodic_split()
680 if (dwc2_frame_num_le(qh->sched_frame, frame_number)) in dwc2_sched_periodic_split()
681 qh->sched_frame = frame_number; in dwc2_sched_periodic_split()
682 qh->sched_frame |= 0x7; in dwc2_sched_periodic_split()
683 qh->start_split_frame = qh->sched_frame; in dwc2_sched_periodic_split()
700 void dwc2_hcd_qh_deactivate(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, in dwc2_hcd_qh_deactivate() argument
705 if (dbg_qh(qh)) in dwc2_hcd_qh_deactivate()
708 if (dwc2_qh_is_non_per(qh)) { in dwc2_hcd_qh_deactivate()
709 dwc2_hcd_qh_unlink(hsotg, qh); in dwc2_hcd_qh_deactivate()
710 if (!list_empty(&qh->qtd_list)) in dwc2_hcd_qh_deactivate()
712 dwc2_hcd_qh_add(hsotg, qh); in dwc2_hcd_qh_deactivate()
718 if (qh->do_split) { in dwc2_hcd_qh_deactivate()
719 dwc2_sched_periodic_split(hsotg, qh, frame_number, in dwc2_hcd_qh_deactivate()
722 qh->sched_frame = dwc2_frame_num_inc(qh->sched_frame, in dwc2_hcd_qh_deactivate()
723 qh->interval); in dwc2_hcd_qh_deactivate()
724 if (dwc2_frame_num_le(qh->sched_frame, frame_number)) in dwc2_hcd_qh_deactivate()
725 qh->sched_frame = frame_number; in dwc2_hcd_qh_deactivate()
728 if (list_empty(&qh->qtd_list)) { in dwc2_hcd_qh_deactivate()
729 dwc2_hcd_qh_unlink(hsotg, qh); in dwc2_hcd_qh_deactivate()
737 dwc2_frame_num_le(qh->sched_frame, frame_number)) || in dwc2_hcd_qh_deactivate()
739 qh->sched_frame == frame_number)) in dwc2_hcd_qh_deactivate()
740 list_move(&qh->qh_list_entry, &hsotg->periodic_sched_ready); in dwc2_hcd_qh_deactivate()
742 list_move(&qh->qh_list_entry, &hsotg->periodic_sched_inactive); in dwc2_hcd_qh_deactivate()
789 struct dwc2_qh *qh) in dwc2_hcd_qtd_add() argument
793 if (unlikely(!qh)) { in dwc2_hcd_qtd_add()
799 retval = dwc2_hcd_qh_add(hsotg, qh); in dwc2_hcd_qtd_add()
803 qtd->qh = qh; in dwc2_hcd_qtd_add()
804 list_add_tail(&qtd->qtd_list_entry, &qh->qtd_list); in dwc2_hcd_qtd_add()