H A D | bcm63xx_udc.c | 236 * @iudma: Pointer to IUDMA channel state. 244 struct iudma_ch *iudma; member in struct:bcm63xx_ep 257 * @iudma: IUDMA channel used for the request. 264 struct iudma_ch *iudma; member in struct:bcm63xx_req 279 * @iudma: Array of all IUDMA channels used by this controller. 314 struct iudma_ch iudma[BCM63XX_NUM_IUDMA]; member in struct:bcm63xx_udc 573 udc->iudma[i].max_pkt = max_pkt; bcm63xx_ep_setup() 593 * @iudma: IUDMA channel to use. 603 static void iudma_write(struct bcm63xx_udc *udc, struct iudma_ch *iudma, iudma_write() argument 608 const int max_bd_bytes = !irq_coalesce && !iudma->is_tx ? iudma_write() 609 iudma->max_pkt : IUDMA_MAX_FRAGMENT; iudma_write() 611 iudma->n_bds_used = 0; iudma_write() 613 breq->iudma = iudma; iudma_write() 615 if ((bytes_left % iudma->max_pkt == 0) && bytes_left && breq->req.zero) iudma_write() 619 struct bcm_enet_desc *d = iudma->write_bd; iudma_write() 623 if (d == iudma->end_bd) { iudma_write() 625 iudma->write_bd = iudma->bd_ring; iudma_write() 627 iudma->write_bd++; iudma_write() 629 iudma->n_bds_used++; iudma_write() 651 if (!iudma->is_tx || iudma->n_bds_used == iudma->n_bds || iudma_write() 667 ENETDMAC_CHANCFG_REG, iudma->ch_idx); iudma_write() 673 * @iudma: IUDMA channel to use. 679 static int iudma_read(struct bcm63xx_udc *udc, struct iudma_ch *iudma) iudma_read() argument 682 struct bcm_enet_desc *d = iudma->read_bd; iudma_read() 684 if (!iudma->n_bds_used) iudma_read() 687 for (i = 0; i < iudma->n_bds_used; i++) { iudma_read() 697 if (d == iudma->end_bd) iudma_read() 698 d = iudma->bd_ring; iudma_read() 703 iudma->read_bd = d; iudma_read() 704 iudma->n_bds_used = 0; iudma_read() 711 * @iudma: IUDMA channel to reset. 713 static void iudma_reset_channel(struct bcm63xx_udc *udc, struct iudma_ch *iudma) iudma_reset_channel() argument 717 int ch_idx = iudma->ch_idx; iudma_reset_channel() 719 if (!iudma->is_tx) iudma_reset_channel() 720 bcm63xx_fifo_reset_ep(udc, max(0, iudma->ep_num)); iudma_reset_channel() 730 if (iudma->is_tx && iudma->ep_num >= 0) iudma_reset_channel() 731 bcm63xx_fifo_reset_ep(udc, iudma->ep_num); iudma_reset_channel() 748 for (d = iudma->bd_ring; d <= iudma->end_bd; d++) iudma_reset_channel() 752 iudma->read_bd = iudma->write_bd = iudma->bd_ring; iudma_reset_channel() 753 iudma->n_bds_used = 0; iudma_reset_channel() 760 usb_dmas_writel(udc, iudma->bd_ring_dma, ENETDMAS_RSTART_REG, ch_idx); iudma_reset_channel() 771 struct iudma_ch *iudma = &udc->iudma[ch_idx]; iudma_init_channel() local 776 iudma->ep_num = cfg->ep_num; iudma_init_channel() 777 iudma->ch_idx = ch_idx; iudma_init_channel() 778 iudma->is_tx = !!(ch_idx & 0x01); iudma_init_channel() 779 if (iudma->ep_num >= 0) { iudma_init_channel() 780 bep = &udc->bep[iudma->ep_num]; iudma_init_channel() 781 bep->iudma = iudma; iudma_init_channel() 785 iudma->bep = bep; iudma_init_channel() 786 iudma->udc = udc; iudma_init_channel() 789 if (iudma->ep_num <= 0) iudma_init_channel() 790 iudma->enabled = true; iudma_init_channel() 792 iudma->n_bds = n_bds; iudma_init_channel() 793 iudma->bd_ring = dmam_alloc_coherent(udc->dev, iudma_init_channel() 795 &iudma->bd_ring_dma, GFP_KERNEL); iudma_init_channel() 796 if (!iudma->bd_ring) iudma_init_channel() 798 iudma->end_bd = &iudma->bd_ring[n_bds - 1]; iudma_init_channel() 819 iudma_reset_channel(udc, &udc->iudma[i]); iudma_init() 839 iudma_reset_channel(udc, &udc->iudma[i]); iudma_uninit() 1046 struct iudma_ch *iudma = bep->iudma; bcm63xx_ep_enable() local 1056 if (iudma->enabled) { bcm63xx_ep_enable() 1061 iudma->enabled = true; bcm63xx_ep_enable() 1064 iudma_reset_channel(udc, iudma); bcm63xx_ep_enable() 1085 struct iudma_ch *iudma = bep->iudma; bcm63xx_ep_disable() local 1093 if (!iudma->enabled) { bcm63xx_ep_disable() 1097 iudma->enabled = false; bcm63xx_ep_disable() 1099 iudma_reset_channel(udc, iudma); bcm63xx_ep_disable() 1107 iudma->is_tx); bcm63xx_ep_disable() 1112 usb_gadget_giveback_request(&iudma->bep->ep, &breq->req); bcm63xx_ep_disable() 1191 if (!bep->iudma->enabled) { bcm63xx_udc_queue() 1196 rc = usb_gadget_map_request(&udc->gadget, req, bep->iudma->is_tx); bcm63xx_udc_queue() 1200 iudma_write(udc, bep->iudma, breq); bcm63xx_udc_queue() 1232 usb_gadget_unmap_request(&udc->gadget, &breq->req, bep->iudma->is_tx); bcm63xx_udc_dequeue() 1235 iudma_reset_channel(udc, bep->iudma); bcm63xx_udc_dequeue() 1243 iudma_write(udc, bep->iudma, next); bcm63xx_udc_dequeue() 1399 struct iudma_ch *iudma = &udc->iudma[ch_idx]; bcm63xx_ep0_map_write() local 1406 usb_gadget_map_request(&udc->gadget, req, iudma->is_tx); bcm63xx_ep0_map_write() 1407 iudma_write(udc, iudma, breq); bcm63xx_ep0_map_write() 1564 iudma_reset_channel(udc, &udc->iudma[IUDMA_EP0_RXCHAN]); bcm63xx_ep0_do_idle() 1641 iudma_reset_channel(udc, &udc->iudma[IUDMA_EP0_TXCHAN]); bcm63xx_ep0_one_round() 1667 iudma_reset_channel(udc, &udc->iudma[IUDMA_EP0_RXCHAN]); bcm63xx_ep0_one_round() 1686 iudma_reset_channel(udc, &udc->iudma[IUDMA_EP0_TXCHAN]); bcm63xx_ep0_one_round() 2055 struct iudma_ch *iudma = dev_id; bcm63xx_udc_data_isr() local 2056 struct bcm63xx_udc *udc = iudma->udc; bcm63xx_udc_data_isr() 2066 ENETDMAC_IR_REG, iudma->ch_idx); bcm63xx_udc_data_isr() 2067 bep = iudma->bep; bcm63xx_udc_data_isr() 2068 rc = iudma_read(udc, iudma); bcm63xx_udc_data_isr() 2071 if (iudma->ch_idx == IUDMA_EP0_RXCHAN || bcm63xx_udc_data_isr() 2072 iudma->ch_idx == IUDMA_EP0_TXCHAN) { bcm63xx_udc_data_isr() 2089 iudma_write(udc, iudma, breq); bcm63xx_udc_data_isr() 2110 iudma_write(udc, iudma, next); bcm63xx_udc_data_isr() 2113 iudma_write(udc, iudma, breq); bcm63xx_udc_data_isr() 2120 usb_gadget_unmap_request(&udc->gadget, req, iudma->is_tx); bcm63xx_udc_data_isr() 2175 * This file nominally shows up as /sys/kernel/debug/bcm63xx_udc/iudma 2187 struct iudma_ch *iudma = &udc->iudma[ch_idx]; bcm63xx_iudma_dbg_show() local 2218 seq_printf(s, " desc: %d/%d used", iudma->n_bds_used, bcm63xx_iudma_dbg_show() 2219 iudma->n_bds); bcm63xx_iudma_dbg_show() 2221 if (iudma->bep) { bcm63xx_iudma_dbg_show() 2223 list_for_each(pos, &iudma->bep->queue) bcm63xx_iudma_dbg_show() 2230 for (i = 0; i < iudma->n_bds; i++) { bcm63xx_iudma_dbg_show() 2231 struct bcm_enet_desc *d = &iudma->bd_ring[i]; bcm63xx_iudma_dbg_show() 2237 if (d == iudma->read_bd) bcm63xx_iudma_dbg_show() 2239 if (d == iudma->write_bd) bcm63xx_iudma_dbg_show() 2283 struct dentry *root, *usbd, *iudma; bcm63xx_udc_init_debugfs() local 2296 iudma = debugfs_create_file("iudma", 0400, root, udc, bcm63xx_udc_init_debugfs() 2298 if (!iudma) bcm63xx_udc_init_debugfs() 2303 udc->debugfs_iudma = iudma; bcm63xx_udc_init_debugfs() 2409 dev_name(dev), &udc->iudma[i]) < 0) { bcm63xx_udc_probe()
|