Lines Matching refs:qh
189 static void musb_ep_set_qh(struct musb_hw_ep *ep, int is_in, struct musb_qh *qh) in musb_ep_set_qh() argument
192 ep->in_qh = qh; in musb_ep_set_qh()
194 ep->out_qh = qh; in musb_ep_set_qh()
209 musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) in musb_start_urb() argument
214 struct urb *urb = next_urb(qh); in musb_start_urb()
217 struct musb_hw_ep *hw_ep = qh->hw_ep; in musb_start_urb()
223 qh->offset = 0; in musb_start_urb()
224 qh->segsize = 0; in musb_start_urb()
227 switch (qh->type) { in musb_start_urb()
236 qh->iso_idx = 0; in musb_start_urb()
237 qh->frame = 0; in musb_start_urb()
248 qh, urb, address, qh->epnum, in musb_start_urb()
250 ({char *s; switch (qh->type) { in musb_start_urb()
259 musb_ep_set_qh(hw_ep, is_in, qh); in musb_start_urb()
267 switch (qh->type) { in musb_start_urb()
279 qh->frame = 0; in musb_start_urb()
282 qh->frame = urb->start_frame; in musb_start_urb()
323 static inline void musb_save_toggle(struct musb_qh *qh, int is_in, in musb_save_toggle() argument
326 void __iomem *epio = qh->hw_ep->regs; in musb_save_toggle()
339 usb_settoggle(urb->dev, qh->epnum, !is_in, csr ? 1 : 0); in musb_save_toggle()
352 struct musb_qh *qh = musb_ep_get_qh(hw_ep, is_in); in musb_advance_schedule() local
353 struct musb_hw_ep *ep = qh->hw_ep; in musb_advance_schedule()
354 int ready = qh->is_ready; in musb_advance_schedule()
360 switch (qh->type) { in musb_advance_schedule()
363 musb_save_toggle(qh, is_in, urb); in musb_advance_schedule()
371 qh->is_ready = 0; in musb_advance_schedule()
373 qh->is_ready = ready; in musb_advance_schedule()
378 if (list_empty(&qh->hep->urb_list)) { in musb_advance_schedule()
398 qh->hep->hcpriv = NULL; in musb_advance_schedule()
400 switch (qh->type) { in musb_advance_schedule()
407 if (qh->mux == 1) { in musb_advance_schedule()
408 head = qh->ring.prev; in musb_advance_schedule()
409 list_del(&qh->ring); in musb_advance_schedule()
410 kfree(qh); in musb_advance_schedule()
411 qh = first_qh(head); in musb_advance_schedule()
421 kfree(qh); in musb_advance_schedule()
422 qh = NULL; in musb_advance_schedule()
427 if (qh != NULL && qh->is_ready) { in musb_advance_schedule()
429 hw_ep->epnum, is_in ? 'R' : 'T', next_urb(qh)); in musb_advance_schedule()
430 musb_start_urb(musb, is_in, qh); in musb_advance_schedule()
467 struct musb_qh *qh = hw_ep->in_qh; in musb_host_packet_rx() local
474 urb->transfer_buffer, qh->offset, in musb_host_packet_rx()
487 d = urb->iso_frame_desc + qh->iso_idx; in musb_host_packet_rx()
505 done = (++qh->iso_idx >= urb->number_of_packets); in musb_host_packet_rx()
508 buf = buffer + qh->offset; in musb_host_packet_rx()
509 length = urb->transfer_buffer_length - qh->offset; in musb_host_packet_rx()
518 qh->offset += length; in musb_host_packet_rx()
522 || (rx_count < qh->maxpacket) in musb_host_packet_rx()
558 musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep) in musb_rx_reinit() argument
597 musb_write_rxfunaddr(ep->target_regs, qh->addr_reg); in musb_rx_reinit()
598 musb_write_rxhubaddr(ep->target_regs, qh->h_addr_reg); in musb_rx_reinit()
599 musb_write_rxhubport(ep->target_regs, qh->h_port_reg); in musb_rx_reinit()
602 musb_writeb(musb->mregs, MUSB_FADDR, qh->addr_reg); in musb_rx_reinit()
605 musb_writeb(ep->regs, MUSB_RXTYPE, qh->type_reg); in musb_rx_reinit()
606 musb_writeb(ep->regs, MUSB_RXINTERVAL, qh->intv_reg); in musb_rx_reinit()
615 qh->maxpacket | ((qh->hb_mult - 1) << 11)); in musb_rx_reinit()
621 struct musb_hw_ep *hw_ep, struct musb_qh *qh, in musb_tx_dma_program() argument
626 u16 pkt_size = qh->maxpacket; in musb_tx_dma_program()
648 if (qh->hb_mult == 1 || (qh->hb_mult > 1 && in musb_tx_dma_program()
649 can_bulk_split(hw_ep->musb, qh->type))) in musb_tx_dma_program()
671 qh->segsize = length; in musb_tx_dma_program()
706 struct musb_qh *qh = musb_ep_get_qh(hw_ep, !is_out); in musb_ep_program() local
707 u16 packet_sz = qh->maxpacket; in musb_ep_program()
715 qh->addr_reg, qh->epnum, is_out ? "out" : "in", in musb_ep_program()
716 qh->h_addr_reg, qh->h_port_reg, in musb_ep_program()
785 if (usb_gettoggle(urb->dev, qh->epnum, 1)) in musb_ep_program()
804 musb_write_txfunaddr(mbase, epnum, qh->addr_reg); in musb_ep_program()
805 musb_write_txhubaddr(mbase, epnum, qh->h_addr_reg); in musb_ep_program()
806 musb_write_txhubport(mbase, epnum, qh->h_port_reg); in musb_ep_program()
809 musb_writeb(mbase, MUSB_FADDR, qh->addr_reg); in musb_ep_program()
813 musb_writeb(epio, MUSB_TXTYPE, qh->type_reg); in musb_ep_program()
817 } else if (can_bulk_split(musb, qh->type)) { in musb_ep_program()
818 qh->hb_mult = hw_ep->max_packet_sz_tx in musb_ep_program()
821 | ((qh->hb_mult) - 1) << 11); in musb_ep_program()
824 qh->maxpacket | in musb_ep_program()
825 ((qh->hb_mult - 1) << 11)); in musb_ep_program()
827 musb_writeb(epio, MUSB_TXINTERVAL, qh->intv_reg); in musb_ep_program()
829 musb_writeb(epio, MUSB_NAKLIMIT0, qh->intv_reg); in musb_ep_program()
832 qh->type_reg); in musb_ep_program()
835 if (can_bulk_split(musb, qh->type)) in musb_ep_program()
842 hw_ep, qh, urb, offset, len)) in musb_ep_program()
847 qh->segsize = load_count; in musb_ep_program()
849 sg_miter_start(&qh->sg_miter, urb->sg, 1, in musb_ep_program()
852 if (!sg_miter_next(&qh->sg_miter)) { in musb_ep_program()
856 sg_miter_stop(&qh->sg_miter); in musb_ep_program()
859 buf = qh->sg_miter.addr + urb->sg->offset + in musb_ep_program()
862 qh->sg_miter.length); in musb_ep_program()
864 qh->sg_miter.consumed = load_count; in musb_ep_program()
865 sg_miter_stop(&qh->sg_miter); in musb_ep_program()
878 musb_rx_reinit(musb, qh, hw_ep); in musb_ep_program()
881 if (usb_gettoggle(urb->dev, qh->epnum, 0)) in musb_ep_program()
886 if (qh->type == USB_ENDPOINT_XFER_INT) in musb_ep_program()
907 qh->segsize = len; in musb_ep_program()
921 qh->segsize); in musb_ep_program()
1014 struct musb_qh *qh = hw_ep->in_qh; in musb_h_ep0_continue() local
1028 if (len < qh->maxpacket) { in musb_h_ep0_continue()
1054 fifo_count = min_t(size_t, qh->maxpacket, in musb_h_ep0_continue()
1092 struct musb_qh *qh = hw_ep->in_qh; in musb_h_ep0_irq() local
1097 urb = next_urb(qh); in musb_h_ep0_irq()
1106 csr, qh, len, urb, musb->ep0_stage); in musb_h_ep0_irq()
1234 struct musb_qh *qh = hw_ep->out_qh; in musb_host_tx() local
1235 struct urb *urb = next_urb(qh); in musb_host_tx()
1270 if (USB_ENDPOINT_XFER_BULK == qh->type && qh->mux == 1 in musb_host_tx()
1392 length = qh->segsize; in musb_host_tx()
1393 qh->offset += length; in musb_host_tx()
1398 d = urb->iso_frame_desc + qh->iso_idx; in musb_host_tx()
1401 if (++qh->iso_idx >= urb->number_of_packets) { in musb_host_tx()
1408 } else if (dma && urb->transfer_buffer_length == qh->offset) { in musb_host_tx()
1412 if (qh->segsize < qh->maxpacket) in musb_host_tx()
1414 else if (qh->offset == urb->transfer_buffer_length in musb_host_tx()
1419 offset = qh->offset; in musb_host_tx()
1438 urb->actual_length = qh->offset; in musb_host_tx()
1442 if (musb_tx_dma_program(musb->dma_controller, hw_ep, qh, urb, in musb_host_tx()
1460 if (length > qh->maxpacket) in musb_host_tx()
1461 length = qh->maxpacket; in musb_host_tx()
1470 qh->use_sg = true; in musb_host_tx()
1472 if (qh->use_sg) { in musb_host_tx()
1474 if (!sg_miter_next(&qh->sg_miter)) { in musb_host_tx()
1476 sg_miter_stop(&qh->sg_miter); in musb_host_tx()
1480 urb->transfer_buffer = qh->sg_miter.addr; in musb_host_tx()
1481 length = min_t(u32, length, qh->sg_miter.length); in musb_host_tx()
1483 qh->sg_miter.consumed = length; in musb_host_tx()
1484 sg_miter_stop(&qh->sg_miter); in musb_host_tx()
1489 qh->segsize = length; in musb_host_tx()
1491 if (qh->use_sg) { in musb_host_tx()
1493 qh->use_sg = false; in musb_host_tx()
1550 struct musb_qh *qh = hw_ep->in_qh; in musb_host_rx() local
1563 urb = next_urb(qh); in musb_host_rx()
1604 if (USB_ENDPOINT_XFER_ISOC != qh->type) { in musb_host_rx()
1616 && qh->mux == 1 in musb_host_rx()
1702 d = urb->iso_frame_desc + qh->iso_idx; in musb_host_rx()
1711 if (++qh->iso_idx >= urb->number_of_packets) { in musb_host_rx()
1721 urb->iso_frame_desc[qh->iso_idx].offset in musb_host_rx()
1725 urb->iso_frame_desc[qh->iso_idx].length; in musb_host_rx()
1730 ret = c->channel_program(dma, qh->maxpacket, in musb_host_rx()
1740 || dma->actual_len < qh->maxpacket in musb_host_rx()
1789 qh->offset, in musb_host_rx()
1798 d = urb->iso_frame_desc + qh->iso_idx; in musb_host_rx()
1832 > qh->maxpacket) in musb_host_rx()
1869 if (qh->hb_mult == 1) in musb_host_rx()
1880 dma, qh->maxpacket, in musb_host_rx()
1907 qh->use_sg = true; in musb_host_rx()
1908 sg_miter_start(&qh->sg_miter, urb->sg, 1, in musb_host_rx()
1912 if (qh->use_sg) { in musb_host_rx()
1913 if (!sg_miter_next(&qh->sg_miter)) { in musb_host_rx()
1915 sg_miter_stop(&qh->sg_miter); in musb_host_rx()
1920 urb->transfer_buffer = qh->sg_miter.addr; in musb_host_rx()
1922 qh->offset = 0x0; in musb_host_rx()
1928 qh->sg_miter.consumed = received_len; in musb_host_rx()
1929 sg_miter_stop(&qh->sg_miter); in musb_host_rx()
1940 qh->offset += xfer_len; in musb_host_rx()
1942 if (qh->use_sg) in musb_host_rx()
1943 qh->use_sg = false; in musb_host_rx()
1958 struct musb_qh *qh, in musb_schedule() argument
1968 struct urb *urb = next_urb(qh); in musb_schedule()
1971 if (qh->type == USB_ENDPOINT_XFER_CONTROL) { in musb_schedule()
2004 diff -= (qh->maxpacket * qh->hb_mult); in musb_schedule()
2021 toggle = usb_gettoggle(urb->dev, qh->epnum, !is_in); in musb_schedule()
2024 if (!is_in && (qh->type == USB_ENDPOINT_XFER_BULK) && in musb_schedule()
2033 if (best_end < 0 && qh->type == USB_ENDPOINT_XFER_BULK) { in musb_schedule()
2047 if (qh->dev) in musb_schedule()
2048 qh->intv_reg = in musb_schedule()
2049 (USB_SPEED_HIGH == qh->dev->speed) ? 8 : 4; in musb_schedule()
2056 qh->mux = 0; in musb_schedule()
2058 dev_dbg(musb->controller, "qh %p periodic slot %d\n", qh, best_end); in musb_schedule()
2062 list_add_tail(&qh->ring, head); in musb_schedule()
2063 qh->mux = 1; in musb_schedule()
2065 qh->hw_ep = hw_ep; in musb_schedule()
2066 qh->hep->hcpriv = qh; in musb_schedule()
2068 musb_start_urb(musb, is_in, qh); in musb_schedule()
2080 struct musb_qh *qh; in musb_urb_enqueue() local
2092 qh = ret ? NULL : hep->hcpriv; in musb_urb_enqueue()
2093 if (qh) in musb_urb_enqueue()
2094 urb->hcpriv = qh; in musb_urb_enqueue()
2105 if (qh || ret) in musb_urb_enqueue()
2114 qh = kzalloc(sizeof *qh, mem_flags); in musb_urb_enqueue()
2115 if (!qh) { in musb_urb_enqueue()
2122 qh->hep = hep; in musb_urb_enqueue()
2123 qh->dev = urb->dev; in musb_urb_enqueue()
2124 INIT_LIST_HEAD(&qh->ring); in musb_urb_enqueue()
2125 qh->is_ready = 1; in musb_urb_enqueue()
2127 qh->maxpacket = usb_endpoint_maxp(epd); in musb_urb_enqueue()
2128 qh->type = usb_endpoint_type(epd); in musb_urb_enqueue()
2134 qh->hb_mult = 1 + ((qh->maxpacket >> 11) & 0x03); in musb_urb_enqueue()
2135 if (qh->hb_mult > 1) { in musb_urb_enqueue()
2136 int ok = (qh->type == USB_ENDPOINT_XFER_ISOC); in musb_urb_enqueue()
2145 qh->maxpacket &= 0x7ff; in musb_urb_enqueue()
2148 qh->epnum = usb_endpoint_num(epd); in musb_urb_enqueue()
2151 qh->addr_reg = (u8) usb_pipedevice(urb->pipe); in musb_urb_enqueue()
2154 type_reg = (qh->type << 4) | qh->epnum; in musb_urb_enqueue()
2165 qh->type_reg = type_reg; in musb_urb_enqueue()
2168 switch (qh->type) { in musb_urb_enqueue()
2200 qh->intv_reg = interval; in musb_urb_enqueue()
2207 qh->h_addr_reg = (u8) parent->devnum; in musb_urb_enqueue()
2211 qh->h_port_reg = (u8) urb->dev->ttport; in musb_urb_enqueue()
2213 qh->h_addr_reg = in musb_urb_enqueue()
2216 qh->h_addr_reg |= 0x80; in musb_urb_enqueue()
2226 if (hep->hcpriv || !next_urb(qh)) { in musb_urb_enqueue()
2230 kfree(qh); in musb_urb_enqueue()
2231 qh = NULL; in musb_urb_enqueue()
2234 ret = musb_schedule(musb, qh, in musb_urb_enqueue()
2238 urb->hcpriv = qh; in musb_urb_enqueue()
2250 kfree(qh); in musb_urb_enqueue()
2261 static int musb_cleanup_urb(struct urb *urb, struct musb_qh *qh) in musb_cleanup_urb() argument
2263 struct musb_hw_ep *ep = qh->hw_ep; in musb_cleanup_urb()
2322 struct musb_qh *qh; in musb_urb_dequeue() local
2337 qh = urb->hcpriv; in musb_urb_dequeue()
2338 if (!qh) in musb_urb_dequeue()
2353 if (!qh->is_ready in musb_urb_dequeue()
2354 || urb->urb_list.prev != &qh->hep->urb_list in musb_urb_dequeue()
2355 || musb_ep_get_qh(qh->hw_ep, is_in) != qh) { in musb_urb_dequeue()
2356 int ready = qh->is_ready; in musb_urb_dequeue()
2358 qh->is_ready = 0; in musb_urb_dequeue()
2360 qh->is_ready = ready; in musb_urb_dequeue()
2365 if (ready && list_empty(&qh->hep->urb_list)) { in musb_urb_dequeue()
2366 qh->hep->hcpriv = NULL; in musb_urb_dequeue()
2367 list_del(&qh->ring); in musb_urb_dequeue()
2368 kfree(qh); in musb_urb_dequeue()
2371 ret = musb_cleanup_urb(urb, qh); in musb_urb_dequeue()
2384 struct musb_qh *qh; in musb_h_disable() local
2389 qh = hep->hcpriv; in musb_h_disable()
2390 if (qh == NULL) in musb_h_disable()
2396 qh->is_ready = 0; in musb_h_disable()
2397 if (musb_ep_get_qh(qh->hw_ep, is_in) == qh) { in musb_h_disable()
2398 urb = next_urb(qh); in musb_h_disable()
2405 musb_cleanup_urb(urb, qh); in musb_h_disable()
2411 urb = next_urb(qh); in musb_h_disable()
2413 musb_advance_schedule(musb, urb, qh->hw_ep, is_in); in musb_h_disable()
2421 musb_giveback(musb, next_urb(qh), -ESHUTDOWN); in musb_h_disable()
2424 list_del(&qh->ring); in musb_h_disable()
2425 kfree(qh); in musb_h_disable()