Lines Matching refs:qh

176 static void musb_ep_set_qh(struct musb_hw_ep *ep, int is_in, struct musb_qh *qh)  in musb_ep_set_qh()  argument
179 ep->in_qh = qh; in musb_ep_set_qh()
181 ep->out_qh = qh; in musb_ep_set_qh()
196 musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) in musb_start_urb() argument
200 struct urb *urb = next_urb(qh); in musb_start_urb()
203 struct musb_hw_ep *hw_ep = qh->hw_ep; in musb_start_urb()
207 qh->offset = 0; in musb_start_urb()
208 qh->segsize = 0; in musb_start_urb()
211 switch (qh->type) { in musb_start_urb()
220 qh->iso_idx = 0; in musb_start_urb()
221 qh->frame = 0; in musb_start_urb()
234 musb_ep_set_qh(hw_ep, is_in, qh); in musb_start_urb()
242 switch (qh->type) { in musb_start_urb()
253 qh->frame = 0; in musb_start_urb()
256 qh->frame = urb->start_frame; in musb_start_urb()
299 struct musb_qh *qh = musb_ep_get_qh(hw_ep, is_in); in musb_advance_schedule() local
300 struct musb_hw_ep *ep = qh->hw_ep; in musb_advance_schedule()
301 int ready = qh->is_ready; in musb_advance_schedule()
308 switch (qh->type) { in musb_advance_schedule()
311 toggle = musb->io.get_toggle(qh, !is_in); in musb_advance_schedule()
312 usb_settoggle(urb->dev, qh->epnum, !is_in, toggle ? 1 : 0); in musb_advance_schedule()
320 qh->is_ready = 0; in musb_advance_schedule()
322 qh->is_ready = ready; in musb_advance_schedule()
327 if (list_empty(&qh->hep->urb_list)) { in musb_advance_schedule()
347 qh->hep->hcpriv = NULL; in musb_advance_schedule()
349 switch (qh->type) { in musb_advance_schedule()
356 if (qh->mux == 1) { in musb_advance_schedule()
357 head = qh->ring.prev; in musb_advance_schedule()
358 list_del(&qh->ring); in musb_advance_schedule()
359 kfree(qh); in musb_advance_schedule()
360 qh = first_qh(head); in musb_advance_schedule()
371 kfree(qh); in musb_advance_schedule()
372 qh = NULL; in musb_advance_schedule()
377 if (qh != NULL && qh->is_ready) { in musb_advance_schedule()
379 hw_ep->epnum, is_in ? 'R' : 'T', next_urb(qh)); in musb_advance_schedule()
380 musb_start_urb(musb, is_in, qh); in musb_advance_schedule()
417 struct musb_qh *qh = hw_ep->in_qh; in musb_host_packet_rx() local
424 urb->transfer_buffer, qh->offset, in musb_host_packet_rx()
437 d = urb->iso_frame_desc + qh->iso_idx; in musb_host_packet_rx()
455 done = (++qh->iso_idx >= urb->number_of_packets); in musb_host_packet_rx()
458 buf = buffer + qh->offset; in musb_host_packet_rx()
459 length = urb->transfer_buffer_length - qh->offset; in musb_host_packet_rx()
468 qh->offset += length; in musb_host_packet_rx()
472 || (rx_count < qh->maxpacket) in musb_host_packet_rx()
508 musb_rx_reinit(struct musb *musb, struct musb_qh *qh, u8 epnum) in musb_rx_reinit() argument
547 musb_write_rxfunaddr(musb, epnum, qh->addr_reg); in musb_rx_reinit()
548 musb_write_rxhubaddr(musb, epnum, qh->h_addr_reg); in musb_rx_reinit()
549 musb_write_rxhubport(musb, epnum, qh->h_port_reg); in musb_rx_reinit()
551 musb_writeb(musb->mregs, MUSB_FADDR, qh->addr_reg); in musb_rx_reinit()
554 musb_writeb(ep->regs, MUSB_RXTYPE, qh->type_reg); in musb_rx_reinit()
555 musb_writeb(ep->regs, MUSB_RXINTERVAL, qh->intv_reg); in musb_rx_reinit()
561 qh->maxpacket | ((qh->hb_mult - 1) << 11)); in musb_rx_reinit()
567 struct musb_qh *qh, in musb_tx_dma_set_mode_mentor() argument
572 u16 pkt_size = qh->maxpacket; in musb_tx_dma_set_mode_mentor()
592 if (qh->hb_mult == 1 || (qh->hb_mult > 1 && in musb_tx_dma_set_mode_mentor()
593 can_bulk_split(hw_ep->musb, qh->type))) in musb_tx_dma_set_mode_mentor()
620 struct musb_hw_ep *hw_ep, struct musb_qh *qh, in musb_tx_dma_program() argument
624 u16 pkt_size = qh->maxpacket; in musb_tx_dma_program()
628 musb_tx_dma_set_mode_mentor(hw_ep, qh, in musb_tx_dma_program()
635 qh->segsize = length; in musb_tx_dma_program()
673 struct musb_qh *qh = musb_ep_get_qh(hw_ep, !is_out); in musb_ep_program() local
674 u16 packet_sz = qh->maxpacket; in musb_ep_program()
682 qh->addr_reg, qh->epnum, is_out ? "out" : "in", in musb_ep_program()
683 qh->h_addr_reg, qh->h_port_reg, in musb_ep_program()
752 csr |= musb->io.set_toggle(qh, is_out, urb); in musb_ep_program()
766 musb_write_txfunaddr(musb, epnum, qh->addr_reg); in musb_ep_program()
767 musb_write_txhubaddr(musb, epnum, qh->h_addr_reg); in musb_ep_program()
768 musb_write_txhubport(musb, epnum, qh->h_port_reg); in musb_ep_program()
771 musb_writeb(mbase, MUSB_FADDR, qh->addr_reg); in musb_ep_program()
775 musb_writeb(epio, MUSB_TXTYPE, qh->type_reg); in musb_ep_program()
776 if (can_bulk_split(musb, qh->type)) { in musb_ep_program()
777 qh->hb_mult = hw_ep->max_packet_sz_tx in musb_ep_program()
780 | ((qh->hb_mult) - 1) << 11); in musb_ep_program()
783 qh->maxpacket | in musb_ep_program()
784 ((qh->hb_mult - 1) << 11)); in musb_ep_program()
786 musb_writeb(epio, MUSB_TXINTERVAL, qh->intv_reg); in musb_ep_program()
788 musb_writeb(epio, MUSB_NAKLIMIT0, qh->intv_reg); in musb_ep_program()
791 qh->type_reg); in musb_ep_program()
794 if (can_bulk_split(musb, qh->type)) in musb_ep_program()
801 hw_ep, qh, urb, offset, len)) in musb_ep_program()
806 qh->segsize = load_count; in musb_ep_program()
808 sg_miter_start(&qh->sg_miter, urb->sg, 1, in musb_ep_program()
811 if (!sg_miter_next(&qh->sg_miter)) { in musb_ep_program()
815 sg_miter_stop(&qh->sg_miter); in musb_ep_program()
818 buf = qh->sg_miter.addr + urb->sg->offset + in musb_ep_program()
821 qh->sg_miter.length); in musb_ep_program()
823 qh->sg_miter.consumed = load_count; in musb_ep_program()
824 sg_miter_stop(&qh->sg_miter); in musb_ep_program()
837 musb_rx_reinit(musb, qh, epnum); in musb_ep_program()
838 csr |= musb->io.set_toggle(qh, is_out, urb); in musb_ep_program()
840 if (qh->type == USB_ENDPOINT_XFER_INT) in musb_ep_program()
861 qh->segsize = len; in musb_ep_program()
875 qh->segsize); in musb_ep_program()
978 struct musb_qh *qh = hw_ep->in_qh; in musb_h_ep0_continue() local
992 if (len < qh->maxpacket) { in musb_h_ep0_continue()
1018 fifo_count = min_t(size_t, qh->maxpacket, in musb_h_ep0_continue()
1056 struct musb_qh *qh = hw_ep->in_qh; in musb_h_ep0_irq() local
1061 urb = next_urb(qh); in musb_h_ep0_irq()
1070 csr, qh, len, urb, musb->ep0_stage); in musb_h_ep0_irq()
1198 struct musb_qh *qh = hw_ep->out_qh; in musb_host_tx() local
1199 struct urb *urb = next_urb(qh); in musb_host_tx()
1235 if (USB_ENDPOINT_XFER_BULK == qh->type && qh->mux == 1 in musb_host_tx()
1356 length = qh->segsize; in musb_host_tx()
1357 qh->offset += length; in musb_host_tx()
1362 d = urb->iso_frame_desc + qh->iso_idx; in musb_host_tx()
1365 if (++qh->iso_idx >= urb->number_of_packets) { in musb_host_tx()
1372 } else if (dma && urb->transfer_buffer_length == qh->offset) { in musb_host_tx()
1376 if (qh->segsize < qh->maxpacket) in musb_host_tx()
1378 else if (qh->offset == urb->transfer_buffer_length in musb_host_tx()
1383 offset = qh->offset; in musb_host_tx()
1402 urb->actual_length = qh->offset; in musb_host_tx()
1406 if (musb_tx_dma_program(musb->dma_controller, hw_ep, qh, urb, in musb_host_tx()
1424 if (length > qh->maxpacket) in musb_host_tx()
1425 length = qh->maxpacket; in musb_host_tx()
1435 if (!sg_miter_next(&qh->sg_miter)) { in musb_host_tx()
1437 sg_miter_stop(&qh->sg_miter); in musb_host_tx()
1441 length = min_t(u32, length, qh->sg_miter.length); in musb_host_tx()
1442 musb_write_fifo(hw_ep, length, qh->sg_miter.addr); in musb_host_tx()
1443 qh->sg_miter.consumed = length; in musb_host_tx()
1444 sg_miter_stop(&qh->sg_miter); in musb_host_tx()
1449 qh->segsize = length; in musb_host_tx()
1460 struct musb_qh *qh, in musb_rx_dma_iso_cppi41() argument
1470 buf = (void *)urb->iso_frame_desc[qh->iso_idx].offset + in musb_rx_dma_iso_cppi41()
1473 length = urb->iso_frame_desc[qh->iso_idx].length; in musb_rx_dma_iso_cppi41()
1479 return dma->channel_program(channel, qh->maxpacket, 0, in musb_rx_dma_iso_cppi41()
1485 struct musb_qh *qh, in musb_rx_dma_iso_cppi41() argument
1531 struct musb_qh *qh, in musb_rx_dma_inventra_cppi41() argument
1546 d = urb->iso_frame_desc + qh->iso_idx; in musb_rx_dma_inventra_cppi41()
1555 if (++qh->iso_idx >= urb->number_of_packets) { in musb_rx_dma_inventra_cppi41()
1560 done = musb_rx_dma_iso_cppi41(dma, hw_ep, qh, in musb_rx_dma_inventra_cppi41()
1569 || channel->actual_len < qh->maxpacket in musb_rx_dma_inventra_cppi41()
1601 struct musb_qh *qh, in musb_rx_dma_in_inventra_cppi41() argument
1620 d = urb->iso_frame_desc + qh->iso_idx; in musb_rx_dma_in_inventra_cppi41()
1651 > qh->maxpacket) in musb_rx_dma_in_inventra_cppi41()
1672 if (qh->hb_mult == 1) in musb_rx_dma_in_inventra_cppi41()
1681 done = dma->channel_program(channel, qh->maxpacket, in musb_rx_dma_in_inventra_cppi41()
1701 struct musb_qh *qh, in musb_rx_dma_inventra_cppi41() argument
1710 struct musb_qh *qh, in musb_rx_dma_in_inventra_cppi41() argument
1729 struct musb_qh *qh = hw_ep->in_qh; in musb_host_rx() local
1741 urb = next_urb(qh); in musb_host_rx()
1787 if (USB_ENDPOINT_XFER_ISOC != qh->type) { in musb_host_rx()
1799 && qh->mux == 1 in musb_host_rx()
1881 done = musb_rx_dma_inventra_cppi41(c, hw_ep, qh, urb, xfer_len); in musb_host_rx()
1915 qh->offset, in musb_host_rx()
1918 if (musb_rx_dma_in_inventra_cppi41(c, hw_ep, qh, urb, in musb_host_rx()
1936 qh->use_sg = true; in musb_host_rx()
1937 sg_miter_start(&qh->sg_miter, urb->sg, 1, in musb_host_rx()
1941 if (qh->use_sg) { in musb_host_rx()
1942 if (!sg_miter_next(&qh->sg_miter)) { in musb_host_rx()
1944 sg_miter_stop(&qh->sg_miter); in musb_host_rx()
1949 urb->transfer_buffer = qh->sg_miter.addr; in musb_host_rx()
1951 qh->offset = 0x0; in musb_host_rx()
1957 qh->sg_miter.consumed = received_len; in musb_host_rx()
1958 sg_miter_stop(&qh->sg_miter); in musb_host_rx()
1969 qh->offset += xfer_len; in musb_host_rx()
1971 if (qh->use_sg) { in musb_host_rx()
1972 qh->use_sg = false; in musb_host_rx()
1989 struct musb_qh *qh, in musb_schedule() argument
1999 struct urb *urb = next_urb(qh); in musb_schedule()
2002 if (qh->type == USB_ENDPOINT_XFER_CONTROL) { in musb_schedule()
2035 diff -= (qh->maxpacket * qh->hb_mult); in musb_schedule()
2052 toggle = usb_gettoggle(urb->dev, qh->epnum, !is_in); in musb_schedule()
2055 if (!is_in && (qh->type == USB_ENDPOINT_XFER_BULK) && in musb_schedule()
2064 if (best_end < 0 && qh->type == USB_ENDPOINT_XFER_BULK) { in musb_schedule()
2078 if (qh->dev) in musb_schedule()
2079 qh->intv_reg = in musb_schedule()
2080 (USB_SPEED_HIGH == qh->dev->speed) ? 8 : 4; in musb_schedule()
2085 musb_ep_xfertype_string(qh->type), in musb_schedule()
2086 qh->hb_mult, qh->maxpacket); in musb_schedule()
2091 qh->mux = 0; in musb_schedule()
2093 musb_dbg(musb, "qh %p periodic slot %d", qh, best_end); in musb_schedule()
2097 list_add_tail(&qh->ring, head); in musb_schedule()
2098 qh->mux = 1; in musb_schedule()
2100 qh->hw_ep = hw_ep; in musb_schedule()
2101 qh->hep->hcpriv = qh; in musb_schedule()
2103 musb_start_urb(musb, is_in, qh); in musb_schedule()
2115 struct musb_qh *qh; in musb_urb_enqueue() local
2129 qh = ret ? NULL : hep->hcpriv; in musb_urb_enqueue()
2130 if (qh) in musb_urb_enqueue()
2131 urb->hcpriv = qh; in musb_urb_enqueue()
2142 if (qh || ret) in musb_urb_enqueue()
2151 qh = kzalloc(sizeof *qh, mem_flags); in musb_urb_enqueue()
2152 if (!qh) { in musb_urb_enqueue()
2159 qh->hep = hep; in musb_urb_enqueue()
2160 qh->dev = urb->dev; in musb_urb_enqueue()
2161 INIT_LIST_HEAD(&qh->ring); in musb_urb_enqueue()
2162 qh->is_ready = 1; in musb_urb_enqueue()
2164 qh->maxpacket = usb_endpoint_maxp(epd); in musb_urb_enqueue()
2165 qh->type = usb_endpoint_type(epd); in musb_urb_enqueue()
2171 qh->hb_mult = usb_endpoint_maxp_mult(epd); in musb_urb_enqueue()
2172 if (qh->hb_mult > 1) { in musb_urb_enqueue()
2173 int ok = (qh->type == USB_ENDPOINT_XFER_ISOC); in musb_urb_enqueue()
2181 musb_ep_xfertype_string(qh->type), in musb_urb_enqueue()
2182 qh->hb_mult, qh->maxpacket & 0x7ff); in musb_urb_enqueue()
2186 qh->maxpacket &= 0x7ff; in musb_urb_enqueue()
2189 qh->epnum = usb_endpoint_num(epd); in musb_urb_enqueue()
2192 qh->addr_reg = (u8) usb_pipedevice(urb->pipe); in musb_urb_enqueue()
2195 type_reg = (qh->type << 4) | qh->epnum; in musb_urb_enqueue()
2206 qh->type_reg = type_reg; in musb_urb_enqueue()
2209 switch (qh->type) { in musb_urb_enqueue()
2241 qh->intv_reg = interval; in musb_urb_enqueue()
2248 qh->h_addr_reg = (u8) parent->devnum; in musb_urb_enqueue()
2252 qh->h_port_reg = (u8) urb->dev->ttport; in musb_urb_enqueue()
2254 qh->h_addr_reg = in musb_urb_enqueue()
2257 qh->h_addr_reg |= 0x80; in musb_urb_enqueue()
2267 if (hep->hcpriv || !next_urb(qh)) { in musb_urb_enqueue()
2271 kfree(qh); in musb_urb_enqueue()
2272 qh = NULL; in musb_urb_enqueue()
2275 ret = musb_schedule(musb, qh, in musb_urb_enqueue()
2279 urb->hcpriv = qh; in musb_urb_enqueue()
2291 kfree(qh); in musb_urb_enqueue()
2302 static int musb_cleanup_urb(struct urb *urb, struct musb_qh *qh) in musb_cleanup_urb() argument
2304 struct musb_hw_ep *ep = qh->hw_ep; in musb_cleanup_urb()
2360 struct musb_qh *qh; in musb_urb_dequeue() local
2372 qh = urb->hcpriv; in musb_urb_dequeue()
2373 if (!qh) in musb_urb_dequeue()
2388 if (!qh->is_ready in musb_urb_dequeue()
2389 || urb->urb_list.prev != &qh->hep->urb_list in musb_urb_dequeue()
2390 || musb_ep_get_qh(qh->hw_ep, is_in) != qh) { in musb_urb_dequeue()
2391 int ready = qh->is_ready; in musb_urb_dequeue()
2393 qh->is_ready = 0; in musb_urb_dequeue()
2395 qh->is_ready = ready; in musb_urb_dequeue()
2400 if (ready && list_empty(&qh->hep->urb_list)) { in musb_urb_dequeue()
2401 qh->hep->hcpriv = NULL; in musb_urb_dequeue()
2402 list_del(&qh->ring); in musb_urb_dequeue()
2403 kfree(qh); in musb_urb_dequeue()
2406 ret = musb_cleanup_urb(urb, qh); in musb_urb_dequeue()
2419 struct musb_qh *qh; in musb_h_disable() local
2424 qh = hep->hcpriv; in musb_h_disable()
2425 if (qh == NULL) in musb_h_disable()
2431 qh->is_ready = 0; in musb_h_disable()
2432 if (musb_ep_get_qh(qh->hw_ep, is_in) == qh) { in musb_h_disable()
2433 urb = next_urb(qh); in musb_h_disable()
2440 musb_cleanup_urb(urb, qh); in musb_h_disable()
2446 urb = next_urb(qh); in musb_h_disable()
2448 musb_advance_schedule(musb, urb, qh->hw_ep, is_in); in musb_h_disable()
2456 musb_giveback(musb, next_urb(qh), -ESHUTDOWN); in musb_h_disable()
2459 list_del(&qh->ring); in musb_h_disable()
2460 kfree(qh); in musb_h_disable()