Lines Matching +full:bd +full:- +full:address
1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (c) 2006-2008 Freescale Semiconductor, Inc. All rights reserved.
34 #include <linux/dma-mapping.h>
55 "ep0-control", /* everyone has ep0 */
74 /*-----------------------------------------------------------------
75 * done() - retire a request; caller blocked irqs
76 *--------------------------------------------------------------*/
79 struct qe_udc *udc = ep->udc; in done()
80 unsigned char stopped = ep->stopped; in done()
82 /* the req->queue pointer is used by ep_queue() func, in which in done()
83 * the request will be added into a udc_ep->queue 'd tail in done()
84 * so here the req will be dropped from the ep->queue in done()
86 list_del_init(&req->queue); in done()
88 /* req.status should be set as -EINPROGRESS in ep_queue() */ in done()
89 if (req->req.status == -EINPROGRESS) in done()
90 req->req.status = status; in done()
92 status = req->req.status; in done()
94 if (req->mapped) { in done()
95 dma_unmap_single(udc->gadget.dev.parent, in done()
96 req->req.dma, req->req.length, in done()
100 req->req.dma = DMA_ADDR_INVALID; in done()
101 req->mapped = 0; in done()
103 dma_sync_single_for_cpu(udc->gadget.dev.parent, in done()
104 req->req.dma, req->req.length, in done()
109 if (status && (status != -ESHUTDOWN)) in done()
110 dev_vdbg(udc->dev, "complete %s req %p stat %d len %u/%u\n", in done()
111 ep->ep.name, &req->req, status, in done()
112 req->req.actual, req->req.length); in done()
115 ep->stopped = 1; in done()
116 spin_unlock(&udc->lock); in done()
118 usb_gadget_giveback_request(&ep->ep, &req->req); in done()
120 spin_lock(&udc->lock); in done()
122 ep->stopped = stopped; in done()
125 /*-----------------------------------------------------------------
127 *--------------------------------------------------------------*/
131 while (!list_empty(&ep->queue)) { in nuke()
133 req = list_entry(ep->queue.next, struct qe_req, queue); in nuke()
139 /*---------------------------------------------------------------------------*
141 *---------------------------------------------------------------------------*/
142 /* @value: 1--set stall 0--clean stall */
146 u8 epnum = ep->epnum; in qe_eprx_stall_change()
147 struct qe_udc *udc = ep->udc; in qe_eprx_stall_change()
149 tem_usep = in_be16(&udc->usb_regs->usb_usep[epnum]); in qe_eprx_stall_change()
153 else if (ep->dir == USB_DIR_IN) in qe_eprx_stall_change()
156 out_be16(&udc->usb_regs->usb_usep[epnum], tem_usep); in qe_eprx_stall_change()
163 u8 epnum = ep->epnum; in qe_eptx_stall_change()
164 struct qe_udc *udc = ep->udc; in qe_eptx_stall_change()
166 tem_usep = in_be16(&udc->usb_regs->usb_usep[epnum]); in qe_eptx_stall_change()
170 else if (ep->dir == USB_DIR_OUT) in qe_eptx_stall_change()
173 out_be16(&udc->usb_regs->usb_usep[epnum], tem_usep); in qe_eptx_stall_change()
180 qe_eptx_stall_change(&udc->eps[0], 1); in qe_ep0_stall()
181 qe_eprx_stall_change(&udc->eps[0], 1); in qe_ep0_stall()
182 udc->ep0_state = WAIT_FOR_SETUP; in qe_ep0_stall()
183 udc->ep0_dir = 0; in qe_ep0_stall()
189 u8 epnum = ep->epnum; in qe_eprx_nack()
190 struct qe_udc *udc = ep->udc; in qe_eprx_nack()
192 if (ep->state == EP_STATE_IDLE) { in qe_eprx_nack()
194 clrsetbits_be16(&udc->usb_regs->usb_usep[epnum], in qe_eprx_nack()
198 clrbits16(&udc->usb_regs->usb_usbmr, in qe_eprx_nack()
201 ep->state = EP_STATE_NACK; in qe_eprx_nack()
208 struct qe_udc *udc = ep->udc; in qe_eprx_normal()
210 if (ep->state == EP_STATE_NACK) { in qe_eprx_normal()
211 clrsetbits_be16(&udc->usb_regs->usb_usep[ep->epnum], in qe_eprx_normal()
215 out_be16(&udc->usb_regs->usb_usber, in qe_eprx_normal()
217 setbits16(&udc->usb_regs->usb_usbmr, in qe_eprx_normal()
220 ep->state = EP_STATE_IDLE; in qe_eprx_normal()
221 ep->has_data = 0; in qe_eprx_normal()
229 if (ep->udc->soc_type == PORT_CPM) in qe_ep_cmd_stoptx()
230 cpm_command(CPM_USB_STOP_TX | (ep->epnum << CPM_USB_EP_SHIFT), in qe_ep_cmd_stoptx()
234 ep->epnum, 0); in qe_ep_cmd_stoptx()
241 if (ep->udc->soc_type == PORT_CPM) in qe_ep_cmd_restarttx()
242 cpm_command(CPM_USB_RESTART_TX | (ep->epnum << in qe_ep_cmd_restarttx()
246 ep->epnum, 0); in qe_ep_cmd_restarttx()
253 struct qe_udc *udc = ep->udc; in qe_ep_flushtxfifo()
256 i = (int)ep->epnum; in qe_ep_flushtxfifo()
259 out_8(&udc->usb_regs->usb_uscom, in qe_ep_flushtxfifo()
260 USB_CMD_FLUSH_FIFO | (USB_CMD_EP_MASK & (ep->epnum))); in qe_ep_flushtxfifo()
261 out_be16(&udc->ep_param[i]->tbptr, in_be16(&udc->ep_param[i]->tbase)); in qe_ep_flushtxfifo()
262 out_be32(&udc->ep_param[i]->tstate, 0); in qe_ep_flushtxfifo()
263 out_be16(&udc->ep_param[i]->tbcnt, 0); in qe_ep_flushtxfifo()
265 ep->c_txbd = ep->txbase; in qe_ep_flushtxfifo()
266 ep->n_txbd = ep->txbase; in qe_ep_flushtxfifo()
273 struct qe_udc *udc = ep->udc; in qe_ep_filltxfifo()
275 out_8(&udc->usb_regs->usb_uscom, in qe_ep_filltxfifo()
276 USB_CMD_STR_FIFO | (USB_CMD_EP_MASK & (ep->epnum))); in qe_ep_filltxfifo()
284 struct qe_bd __iomem *bd; in qe_epbds_reset() local
287 ep = &udc->eps[pipe_num]; in qe_epbds_reset()
289 if (ep->dir == USB_DIR_OUT) in qe_epbds_reset()
294 bd = ep->rxbase; in qe_epbds_reset()
295 for (i = 0; i < (bdring_len - 1); i++) { in qe_epbds_reset()
296 out_be32((u32 __iomem *)bd, R_E | R_I); in qe_epbds_reset()
297 bd++; in qe_epbds_reset()
299 out_be32((u32 __iomem *)bd, R_E | R_I | R_W); in qe_epbds_reset()
301 bd = ep->txbase; in qe_epbds_reset()
302 for (i = 0; i < USB_BDRING_LEN_TX - 1; i++) { in qe_epbds_reset()
303 out_be32(&bd->buf, 0); in qe_epbds_reset()
304 out_be32((u32 __iomem *)bd, 0); in qe_epbds_reset()
305 bd++; in qe_epbds_reset()
307 out_be32((u32 __iomem *)bd, T_W); in qe_epbds_reset()
317 ep = &udc->eps[pipe_num]; in qe_ep_reset()
318 tmpusep = in_be16(&udc->usb_regs->usb_usep[pipe_num]); in qe_ep_reset()
321 switch (ep->dir) { in qe_ep_reset()
335 out_be16(&udc->usb_regs->usb_usep[pipe_num], tmpusep); in qe_ep_reset()
344 ep->data01 ^= 0x1; in qe_ep_toggledata01()
350 struct qe_ep *ep = &udc->eps[pipe_num]; in qe_ep_bd_init()
354 struct qe_bd __iomem *bd; in qe_ep_bd_init() local
357 if (ep->dir == USB_DIR_OUT) in qe_ep_bd_init()
362 epparam = udc->ep_param[pipe_num]; in qe_ep_bd_init()
363 /* alloc multi-ram for BD rings and set the ep parameters */ in qe_ep_bd_init()
367 return -ENOMEM; in qe_ep_bd_init()
369 out_be16(&epparam->rbase, (u16)tmp_addr); in qe_ep_bd_init()
370 out_be16(&epparam->tbase, (u16)(tmp_addr + in qe_ep_bd_init()
373 out_be16(&epparam->rbptr, in_be16(&epparam->rbase)); in qe_ep_bd_init()
374 out_be16(&epparam->tbptr, in_be16(&epparam->tbase)); in qe_ep_bd_init()
376 ep->rxbase = cpm_muram_addr(tmp_addr); in qe_ep_bd_init()
377 ep->txbase = cpm_muram_addr(tmp_addr + (sizeof(struct qe_bd) in qe_ep_bd_init()
379 ep->n_rxbd = ep->rxbase; in qe_ep_bd_init()
380 ep->e_rxbd = ep->rxbase; in qe_ep_bd_init()
381 ep->n_txbd = ep->txbase; in qe_ep_bd_init()
382 ep->c_txbd = ep->txbase; in qe_ep_bd_init()
383 ep->data01 = 0; /* data0 */ in qe_ep_bd_init()
386 bd = ep->rxbase; in qe_ep_bd_init()
387 for (i = 0; i < bdring_len - 1; i++) { in qe_ep_bd_init()
388 out_be32(&bd->buf, 0); in qe_ep_bd_init()
389 out_be32((u32 __iomem *)bd, 0); in qe_ep_bd_init()
390 bd++; in qe_ep_bd_init()
392 out_be32(&bd->buf, 0); in qe_ep_bd_init()
393 out_be32((u32 __iomem *)bd, R_W); in qe_ep_bd_init()
395 bd = ep->txbase; in qe_ep_bd_init()
396 for (i = 0; i < USB_BDRING_LEN_TX - 1; i++) { in qe_ep_bd_init()
397 out_be32(&bd->buf, 0); in qe_ep_bd_init()
398 out_be32((u32 __iomem *)bd, 0); in qe_ep_bd_init()
399 bd++; in qe_ep_bd_init()
401 out_be32(&bd->buf, 0); in qe_ep_bd_init()
402 out_be32((u32 __iomem *)bd, T_W); in qe_ep_bd_init()
412 struct qe_bd __iomem *bd; in qe_ep_rxbd_update() local
415 if (ep->rxbase == NULL) in qe_ep_rxbd_update()
416 return -EINVAL; in qe_ep_rxbd_update()
418 bd = ep->rxbase; in qe_ep_rxbd_update()
420 ep->rxframe = kmalloc(sizeof(*ep->rxframe), GFP_ATOMIC); in qe_ep_rxbd_update()
421 if (!ep->rxframe) in qe_ep_rxbd_update()
422 return -ENOMEM; in qe_ep_rxbd_update()
424 qe_frame_init(ep->rxframe); in qe_ep_rxbd_update()
426 if (ep->dir == USB_DIR_OUT) in qe_ep_rxbd_update()
431 size = (ep->ep.maxpacket + USB_CRC_SIZE + 2) * (bdring_len + 1); in qe_ep_rxbd_update()
432 ep->rxbuffer = kzalloc(size, GFP_ATOMIC); in qe_ep_rxbd_update()
433 if (!ep->rxbuffer) { in qe_ep_rxbd_update()
434 kfree(ep->rxframe); in qe_ep_rxbd_update()
435 return -ENOMEM; in qe_ep_rxbd_update()
438 ep->rxbuf_d = virt_to_phys((void *)ep->rxbuffer); in qe_ep_rxbd_update()
439 if (ep->rxbuf_d == DMA_ADDR_INVALID) { in qe_ep_rxbd_update()
440 ep->rxbuf_d = dma_map_single(ep->udc->gadget.dev.parent, in qe_ep_rxbd_update()
441 ep->rxbuffer, in qe_ep_rxbd_update()
444 ep->rxbufmap = 1; in qe_ep_rxbd_update()
446 dma_sync_single_for_device(ep->udc->gadget.dev.parent, in qe_ep_rxbd_update()
447 ep->rxbuf_d, size, in qe_ep_rxbd_update()
449 ep->rxbufmap = 0; in qe_ep_rxbd_update()
452 size = ep->ep.maxpacket + USB_CRC_SIZE + 2; in qe_ep_rxbd_update()
453 tmp = ep->rxbuf_d; in qe_ep_rxbd_update()
456 for (i = 0; i < bdring_len - 1; i++) { in qe_ep_rxbd_update()
457 out_be32(&bd->buf, tmp); in qe_ep_rxbd_update()
458 out_be32((u32 __iomem *)bd, (R_E | R_I)); in qe_ep_rxbd_update()
460 bd++; in qe_ep_rxbd_update()
462 out_be32(&bd->buf, tmp); in qe_ep_rxbd_update()
463 out_be32((u32 __iomem *)bd, (R_E | R_I | R_W)); in qe_ep_rxbd_update()
470 struct qe_ep *ep = &udc->eps[pipe_num]; in qe_ep_register_init()
476 epparam = udc->ep_param[pipe_num]; in qe_ep_register_init()
479 logepnum = (ep->ep.desc->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); in qe_ep_register_init()
482 switch (ep->ep.desc->bmAttributes & 0x03) { in qe_ep_register_init()
497 switch (ep->dir) { in qe_ep_register_init()
507 out_be16(&udc->usb_regs->usb_usep[pipe_num], usep); in qe_ep_register_init()
510 out_8(&epparam->rbmr, rtfcr); in qe_ep_register_init()
511 out_8(&epparam->tbmr, rtfcr); in qe_ep_register_init()
513 tmp = (u16)(ep->ep.maxpacket + USB_CRC_SIZE); in qe_ep_register_init()
516 out_be16(&epparam->mrblr, tmp); in qe_ep_register_init()
525 struct qe_ep *ep = &udc->eps[pipe_num]; in qe_ep_init()
533 /* Refer to USB2.0 spec table 9-13, in qe_ep_init()
536 switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { in qe_ep_init()
538 if (strstr(ep->ep.name, "-iso") in qe_ep_init()
539 || strstr(ep->ep.name, "-int")) in qe_ep_init()
541 switch (udc->gadget.speed) { in qe_ep_init()
561 if (strstr(ep->ep.name, "-iso")) /* bulk is ok */ in qe_ep_init()
563 switch (udc->gadget.speed) { in qe_ep_init()
579 if (strstr(ep->ep.name, "-bulk") in qe_ep_init()
580 || strstr(ep->ep.name, "-int")) in qe_ep_init()
582 switch (udc->gadget.speed) { in qe_ep_init()
596 if (strstr(ep->ep.name, "-iso") in qe_ep_init()
597 || strstr(ep->ep.name, "-int")) in qe_ep_init()
599 switch (udc->gadget.speed) { in qe_ep_init()
635 spin_lock_irqsave(&udc->lock, flags); in qe_ep_init()
638 ep->ep.maxpacket = max; in qe_ep_init()
639 ep->tm = (u8)(desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK); in qe_ep_init()
640 ep->ep.desc = desc; in qe_ep_init()
641 ep->stopped = 0; in qe_ep_init()
642 ep->init = 1; in qe_ep_init()
645 ep->dir = USB_DIR_BOTH; in qe_ep_init()
646 udc->ep0_dir = USB_DIR_OUT; in qe_ep_init()
647 udc->ep0_state = WAIT_FOR_SETUP; in qe_ep_init()
649 switch (desc->bEndpointAddress & USB_ENDPOINT_DIR_MASK) { in qe_ep_init()
651 ep->dir = USB_DIR_OUT; in qe_ep_init()
654 ep->dir = USB_DIR_IN; in qe_ep_init()
662 if ((ep->tm == USBP_TM_CTL) || (ep->dir == USB_DIR_OUT)) { in qe_ep_init()
668 if ((ep->tm == USBP_TM_CTL) || (ep->dir == USB_DIR_IN)) { in qe_ep_init()
669 ep->txframe = kmalloc(sizeof(*ep->txframe), GFP_ATOMIC); in qe_ep_init()
670 if (!ep->txframe) in qe_ep_init()
672 qe_frame_init(ep->txframe); in qe_ep_init()
679 spin_unlock_irqrestore(&udc->lock, flags); in qe_ep_init()
683 kfree(ep->rxbuffer); in qe_ep_init()
684 kfree(ep->rxframe); in qe_ep_init()
686 spin_unlock_irqrestore(&udc->lock, flags); in qe_ep_init()
688 dev_err(udc->dev, "failed to initialize %s\n", ep->ep.name); in qe_ep_init()
689 return -ENODEV; in qe_ep_init()
694 setbits8(&udc->usb_regs->usb_usmod, USB_MODE_EN); in qe_usb_enable()
699 clrbits8(&udc->usb_regs->usb_usmod, USB_MODE_EN); in qe_usb_disable()
702 /*----------------------------------------------------------------------------*
704 *----------------------------------------------------------------------------*/
714 bdstatus = in_be32((u32 __iomem *)ep->e_rxbd); in recycle_one_rxbd()
716 out_be32((u32 __iomem *)ep->e_rxbd, bdstatus); in recycle_one_rxbd()
719 ep->e_rxbd = ep->rxbase; in recycle_one_rxbd()
721 ep->e_rxbd++; in recycle_one_rxbd()
727 struct qe_bd __iomem *bd, *nextbd; in recycle_rxbds() local
730 nextbd = ep->n_rxbd; in recycle_rxbds()
731 bd = ep->e_rxbd; in recycle_rxbds()
732 bdstatus = in_be32((u32 __iomem *)bd); in recycle_rxbds()
736 out_be32((u32 __iomem *)bd, bdstatus); in recycle_rxbds()
739 bd = ep->rxbase; in recycle_rxbds()
741 bd++; in recycle_rxbds()
743 bdstatus = in_be32((u32 __iomem *)bd); in recycle_rxbds()
744 if (stopatnext && (bd == nextbd)) in recycle_rxbds()
748 ep->e_rxbd = bd; in recycle_rxbds()
753 struct qe_bd __iomem *bd = ep->n_rxbd; in ep_recycle_rxbds() local
755 u8 epnum = ep->epnum; in ep_recycle_rxbds()
756 struct qe_udc *udc = ep->udc; in ep_recycle_rxbds()
758 bdstatus = in_be32((u32 __iomem *)bd); in ep_recycle_rxbds()
760 bd = ep->rxbase + in ep_recycle_rxbds()
761 ((in_be16(&udc->ep_param[epnum]->rbptr) - in ep_recycle_rxbds()
762 in_be16(&udc->ep_param[epnum]->rbase)) in ep_recycle_rxbds()
764 bdstatus = in_be32((u32 __iomem *)bd); in ep_recycle_rxbds()
767 bd = ep->rxbase; in ep_recycle_rxbds()
769 bd++; in ep_recycle_rxbds()
771 ep->e_rxbd = bd; in ep_recycle_rxbds()
773 ep->e_rxbd = ep->n_rxbd; in ep_recycle_rxbds()
777 if (in_be16(&udc->usb_regs->usb_usber) & USB_E_BSY_MASK) in ep_recycle_rxbds()
778 out_be16(&udc->usb_regs->usb_usber, USB_E_BSY_MASK); in ep_recycle_rxbds()
780 if (ep->has_data <= 0 && (!list_empty(&ep->queue))) in ep_recycle_rxbds()
783 ep->localnack = 0; in ep_recycle_rxbds()
790 /* when BD PID is setup, handle the packet */
793 struct qe_ep *ep = &udc->eps[0]; in ep0_setup_handle()
798 pframe = ep->rxframe; in ep0_setup_handle()
800 && (udc->ep0_state == WAIT_FOR_SETUP)) { in ep0_setup_handle()
803 return -EINVAL; in ep0_setup_handle()
804 cp = (u8 *)&udc->local_setup_buff; in ep0_setup_handle()
805 memcpy(cp, pframe->data, fsize); in ep0_setup_handle()
806 ep->data01 = 1; in ep0_setup_handle()
809 setup_received_handle(udc, &udc->local_setup_buff); in ep0_setup_handle()
812 return -EINVAL; in ep0_setup_handle()
817 struct qe_ep *ep = &udc->eps[0]; in qe_ep0_rx()
819 struct qe_bd __iomem *bd; in qe_ep0_rx() local
823 pframe = ep->rxframe; in qe_ep0_rx()
825 if (ep->dir == USB_DIR_IN) { in qe_ep0_rx()
826 dev_err(udc->dev, "ep0 not a control endpoint\n"); in qe_ep0_rx()
827 return -EINVAL; in qe_ep0_rx()
830 bd = ep->n_rxbd; in qe_ep0_rx()
831 bdstatus = in_be32((u32 __iomem *)bd); in qe_ep0_rx()
838 udc->ep0_state = WAIT_FOR_SETUP; in qe_ep0_rx()
839 dev_vdbg(udc->dev, in qe_ep0_rx()
843 vaddr = (u32)phys_to_virt(in_be32(&bd->buf)); in qe_ep0_rx()
846 (length - USB_CRC_SIZE)); in qe_ep0_rx()
866 dev_err(udc->dev, "The receive frame with error!\n"); in qe_ep0_rx()
869 /* note: don't clear the rxbd's buffer address */ in qe_ep0_rx()
872 /* Get next BD */ in qe_ep0_rx()
874 bd = ep->rxbase; in qe_ep0_rx()
876 bd++; in qe_ep0_rx()
878 bdstatus = in_be32((u32 __iomem *)bd); in qe_ep0_rx()
883 ep->n_rxbd = bd; in qe_ep0_rx()
896 pframe = ep->rxframe; in qe_ep_rxframe_handle()
901 if (framepid != ep->data01) { in qe_ep_rxframe_handle()
902 dev_err(ep->udc->dev, "the data01 error!\n"); in qe_ep_rxframe_handle()
903 return -EIO; in qe_ep_rxframe_handle()
907 if (list_empty(&ep->queue)) { in qe_ep_rxframe_handle()
908 dev_err(ep->udc->dev, "the %s have no requeue!\n", ep->name); in qe_ep_rxframe_handle()
910 req = list_entry(ep->queue.next, struct qe_req, queue); in qe_ep_rxframe_handle()
912 cp = (u8 *)(req->req.buf) + req->req.actual; in qe_ep_rxframe_handle()
914 memcpy(cp, pframe->data, fsize); in qe_ep_rxframe_handle()
915 req->req.actual += fsize; in qe_ep_rxframe_handle()
916 if ((fsize < ep->ep.maxpacket) || in qe_ep_rxframe_handle()
917 (req->req.actual >= req->req.length)) { in qe_ep_rxframe_handle()
918 if (ep->epnum == 0) in qe_ep_rxframe_handle()
919 ep0_req_complete(ep->udc, req); in qe_ep_rxframe_handle()
922 if (list_empty(&ep->queue) && ep->epnum != 0) in qe_ep_rxframe_handle()
938 struct qe_bd __iomem *bd; in ep_rx_tasklet() local
943 spin_lock_irqsave(&udc->lock, flags); in ep_rx_tasklet()
946 ep = &udc->eps[i]; in ep_rx_tasklet()
948 if (ep->dir == USB_DIR_IN || ep->enable_tasklet == 0) { in ep_rx_tasklet()
949 dev_dbg(udc->dev, in ep_rx_tasklet()
954 pframe = ep->rxframe; in ep_rx_tasklet()
955 bd = ep->n_rxbd; in ep_rx_tasklet()
956 bdstatus = in_be32((u32 __iomem *)bd); in ep_rx_tasklet()
960 if (list_empty(&ep->queue)) { in ep_rx_tasklet()
962 dev_dbg(udc->dev, in ep_rx_tasklet()
964 ep->has_data); in ep_rx_tasklet()
971 vaddr = (u32)phys_to_virt(in_be32(&bd->buf)); in ep_rx_tasklet()
974 (length - USB_CRC_SIZE)); in ep_rx_tasklet()
990 dev_err(udc->dev, in ep_rx_tasklet()
993 /* note: don't clear the rxbd's buffer address */ in ep_rx_tasklet()
995 out_be32((u32 __iomem *)bd, bdstatus & BD_STATUS_MASK); in ep_rx_tasklet()
996 ep->has_data--; in ep_rx_tasklet()
997 if (!(ep->localnack)) in ep_rx_tasklet()
1000 /* Get next BD */ in ep_rx_tasklet()
1002 bd = ep->rxbase; in ep_rx_tasklet()
1004 bd++; in ep_rx_tasklet()
1006 bdstatus = in_be32((u32 __iomem *)bd); in ep_rx_tasklet()
1010 ep->n_rxbd = bd; in ep_rx_tasklet()
1012 if (ep->localnack) in ep_rx_tasklet()
1015 ep->enable_tasklet = 0; in ep_rx_tasklet()
1018 spin_unlock_irqrestore(&udc->lock, flags); in ep_rx_tasklet()
1025 struct qe_bd __iomem *bd; in qe_ep_rx() local
1028 udc = ep->udc; in qe_ep_rx()
1029 pframe = ep->rxframe; in qe_ep_rx()
1031 if (ep->dir == USB_DIR_IN) { in qe_ep_rx()
1032 dev_err(udc->dev, "transmit ep in rx function\n"); in qe_ep_rx()
1033 return -EINVAL; in qe_ep_rx()
1036 bd = ep->n_rxbd; in qe_ep_rx()
1038 swoffs = (u16)(bd - ep->rxbase); in qe_ep_rx()
1039 ucoffs = (u16)((in_be16(&udc->ep_param[ep->epnum]->rbptr) - in qe_ep_rx()
1040 in_be16(&udc->ep_param[ep->epnum]->rbase)) >> 3); in qe_ep_rx()
1042 emptybds = USB_BDRING_LEN_RX - ucoffs + swoffs; in qe_ep_rx()
1044 emptybds = swoffs - ucoffs; in qe_ep_rx()
1048 ep->localnack = 1; in qe_ep_rx()
1049 dev_vdbg(udc->dev, "%d empty bds, send NACK\n", emptybds); in qe_ep_rx()
1051 ep->has_data = USB_BDRING_LEN_RX - emptybds; in qe_ep_rx()
1053 if (list_empty(&ep->queue)) { in qe_ep_rx()
1055 dev_vdbg(udc->dev, "The rxep have no req queued with %d BDs\n", in qe_ep_rx()
1056 ep->has_data); in qe_ep_rx()
1060 tasklet_schedule(&udc->rx_tasklet); in qe_ep_rx()
1061 ep->enable_tasklet = 1; in qe_ep_rx()
1069 struct qe_udc *udc = ep->udc; in qe_ep_tx()
1070 struct qe_bd __iomem *bd; in qe_ep_tx() local
1075 if (ep->dir == USB_DIR_OUT) { in qe_ep_tx()
1076 dev_err(udc->dev, "receive ep passed to tx function\n"); in qe_ep_tx()
1077 return -EINVAL; in qe_ep_tx()
1081 saveusbmr = in_be16(&udc->usb_regs->usb_usbmr); in qe_ep_tx()
1082 out_be16(&udc->usb_regs->usb_usbmr, in qe_ep_tx()
1085 bd = ep->n_txbd; in qe_ep_tx()
1086 bdstatus = in_be32((u32 __iomem *)bd); in qe_ep_tx()
1090 frame_set_data(frame, udc->nullbuf); in qe_ep_tx()
1092 frame->info |= (ZLP | NO_CRC); in qe_ep_tx()
1093 dev_vdbg(udc->dev, "the frame size = 0\n"); in qe_ep_tx()
1095 paddr = virt_to_phys((void *)frame->data); in qe_ep_tx()
1096 out_be32(&bd->buf, paddr); in qe_ep_tx()
1105 if ((ep->epnum == 0) && (udc->ep0_state == DATA_STATE_NEED_ZLP)) in qe_ep_tx()
1106 ep->data01 = 0x1; in qe_ep_tx()
1108 if (ep->data01) { in qe_ep_tx()
1110 frame->info |= PID_DATA1; in qe_ep_tx()
1113 frame->info |= PID_DATA0; in qe_ep_tx()
1117 out_be32((u32 __iomem *)bd, bdstatus); in qe_ep_tx()
1121 out_be16(&udc->usb_regs->usb_usbmr, saveusbmr); in qe_ep_tx()
1125 ep->n_txbd = ep->txbase; in qe_ep_tx()
1127 ep->n_txbd++; in qe_ep_tx()
1131 out_be16(&udc->usb_regs->usb_usbmr, saveusbmr); in qe_ep_tx()
1132 dev_vdbg(udc->dev, "The tx bd is not ready!\n"); in qe_ep_tx()
1133 return -EBUSY; in qe_ep_tx()
1137 /* when a bd was transmitted, the function can
1141 if (ep->tx_req != NULL) { in txcomplete()
1142 struct qe_req *req = ep->tx_req; in txcomplete()
1145 last_len = min_t(unsigned, req->req.length - ep->sent, in txcomplete()
1146 ep->ep.maxpacket); in txcomplete()
1149 int asent = ep->last; in txcomplete()
1150 ep->sent += asent; in txcomplete()
1151 ep->last -= asent; in txcomplete()
1153 ep->last = 0; in txcomplete()
1156 /* zlp needed when req->re.zero is set */ in txcomplete()
1157 if (req->req.zero) { in txcomplete()
1159 (req->req.length % ep->ep.maxpacket) != 0) in txcomplete()
1167 if (((ep->tx_req->req.length - ep->sent) <= 0) && !zlp) { in txcomplete()
1168 done(ep, ep->tx_req, 0); in txcomplete()
1169 ep->tx_req = NULL; in txcomplete()
1170 ep->last = 0; in txcomplete()
1171 ep->sent = 0; in txcomplete()
1176 if (ep->tx_req == NULL) { in txcomplete()
1177 if (!list_empty(&ep->queue)) { in txcomplete()
1178 ep->tx_req = list_entry(ep->queue.next, struct qe_req, in txcomplete()
1180 ep->last = 0; in txcomplete()
1181 ep->sent = 0; in txcomplete()
1195 size = min_t(u32, (ep->tx_req->req.length - ep->sent), in qe_usb_senddata()
1196 ep->ep.maxpacket); in qe_usb_senddata()
1197 buf = (u8 *)ep->tx_req->req.buf + ep->sent; in qe_usb_senddata()
1199 ep->last = size; in qe_usb_senddata()
1200 ep->tx_req->req.actual += size; in qe_usb_senddata()
1207 return -EIO; in qe_usb_senddata()
1213 struct qe_udc *udc = ep->udc; in sendnulldata()
1216 return -ENODEV; in sendnulldata()
1219 frame_set_data(frame, (u8 *)udc->nullbuf); in sendnulldata()
1229 struct qe_req *req = ep->tx_req; in frame_create_tx()
1233 return -ENODEV; in frame_create_tx()
1235 if ((req->req.length - ep->sent) > 0) in frame_create_tx()
1243 /* if direction is DIR_IN, the status is Device->Host
1244 * if direction is DIR_OUT, the status transaction is Device<-Host
1249 struct qe_ep *ep = &udc->eps[0]; in ep0_prime_status()
1252 udc->ep0_state = DATA_STATE_NEED_ZLP; in ep0_prime_status()
1253 udc->ep0_dir = USB_DIR_IN; in ep0_prime_status()
1254 sendnulldata(ep, ep->txframe, SETUP_STATUS | NO_REQ); in ep0_prime_status()
1256 udc->ep0_dir = USB_DIR_OUT; in ep0_prime_status()
1257 udc->ep0_state = WAIT_FOR_OUT_STATUS; in ep0_prime_status()
1266 struct qe_ep *ep = &udc->eps[0]; in ep0_req_complete()
1269 switch (udc->ep0_state) { in ep0_req_complete()
1279 udc->ep0_state = WAIT_FOR_SETUP; in ep0_req_complete()
1291 udc->ep0_state = WAIT_FOR_SETUP; in ep0_req_complete()
1295 dev_vdbg(udc->dev, "Unexpected interrupt\n"); in ep0_req_complete()
1307 struct qe_frame *frame = ep->txframe; in ep0_txcomplete()
1311 ep->udc->ep0_state = WAIT_FOR_SETUP; in ep0_txcomplete()
1313 sendnulldata(ep, ep->txframe, SETUP_STATUS | NO_REQ); in ep0_txcomplete()
1317 tx_req = ep->tx_req; in ep0_txcomplete()
1320 int asent = ep->last; in ep0_txcomplete()
1321 ep->sent += asent; in ep0_txcomplete()
1322 ep->last -= asent; in ep0_txcomplete()
1324 ep->last = 0; in ep0_txcomplete()
1328 if ((ep->tx_req->req.length - ep->sent) <= 0) { in ep0_txcomplete()
1329 ep->tx_req->req.actual = (unsigned int)ep->sent; in ep0_txcomplete()
1330 ep0_req_complete(ep->udc, ep->tx_req); in ep0_txcomplete()
1331 ep->tx_req = NULL; in ep0_txcomplete()
1332 ep->last = 0; in ep0_txcomplete()
1333 ep->sent = 0; in ep0_txcomplete()
1336 dev_vdbg(ep->udc->dev, "the ep0_controller have no req\n"); in ep0_txcomplete()
1345 if (frame_get_status(ep->txframe) & FRAME_ERROR) { in ep0_txframe_handle()
1347 dev_vdbg(ep->udc->dev, "The EP0 transmit data have error!\n"); in ep0_txframe_handle()
1348 if (frame_get_info(ep->txframe) & PID_DATA0) in ep0_txframe_handle()
1349 ep->data01 = 0; in ep0_txframe_handle()
1351 ep->data01 = 1; in ep0_txframe_handle()
1357 frame_create_tx(ep, ep->txframe); in ep0_txframe_handle()
1363 struct qe_bd __iomem *bd; in qe_ep0_txconf() local
1367 bd = ep->c_txbd; in qe_ep0_txconf()
1368 bdstatus = in_be32((u32 __iomem *)bd); in qe_ep0_txconf()
1370 pframe = ep->txframe; in qe_ep0_txconf()
1372 /* clear and recycle the BD */ in qe_ep0_txconf()
1373 out_be32((u32 __iomem *)bd, bdstatus & T_W); in qe_ep0_txconf()
1374 out_be32(&bd->buf, 0); in qe_ep0_txconf()
1376 ep->c_txbd = ep->txbase; in qe_ep0_txconf()
1378 ep->c_txbd++; in qe_ep0_txconf()
1380 if (ep->c_txbd == ep->n_txbd) { in qe_ep0_txconf()
1384 pframe->status |= TX_ER_TIMEOUT; in qe_ep0_txconf()
1386 pframe->status |= TX_ER_UNDERUN; in qe_ep0_txconf()
1391 bd = ep->c_txbd; in qe_ep0_txconf()
1392 bdstatus = in_be32((u32 __iomem *)bd); in qe_ep0_txconf()
1400 if (frame_get_status(ep->txframe) & FRAME_ERROR) { in ep_txframe_handle()
1402 dev_vdbg(ep->udc->dev, "The EP0 transmit data have error!\n"); in ep_txframe_handle()
1403 if (frame_get_info(ep->txframe) & PID_DATA0) in ep_txframe_handle()
1404 ep->data01 = 0; in ep_txframe_handle()
1406 ep->data01 = 1; in ep_txframe_handle()
1412 frame_create_tx(ep, ep->txframe); /* send the data */ in ep_txframe_handle()
1416 /* confirm the already transmitted bd */
1419 struct qe_bd __iomem *bd; in qe_ep_txconf() local
1424 bd = ep->c_txbd; in qe_ep_txconf()
1425 bdstatus = in_be32((u32 __iomem *)bd); in qe_ep_txconf()
1427 pframe = ep->txframe; in qe_ep_txconf()
1431 pframe->status |= TX_ER_TIMEOUT; in qe_ep_txconf()
1433 pframe->status |= TX_ER_UNDERUN; in qe_ep_txconf()
1436 /* clear and recycle the BD */ in qe_ep_txconf()
1437 out_be32((u32 __iomem *)bd, bdstatus & T_W); in qe_ep_txconf()
1438 out_be32(&bd->buf, 0); in qe_ep_txconf()
1440 ep->c_txbd = ep->txbase; in qe_ep_txconf()
1442 ep->c_txbd++; in qe_ep_txconf()
1446 bd = ep->c_txbd; in qe_ep_txconf()
1447 bdstatus = in_be32((u32 __iomem *)bd); in qe_ep_txconf()
1450 return -EIO; in qe_ep_txconf()
1460 if (ep->tx_req == NULL) { in ep_req_send()
1461 ep->sent = 0; in ep_req_send()
1462 ep->last = 0; in ep_req_send()
1464 reval = frame_create_tx(ep, ep->txframe); in ep_req_send()
1472 struct qe_udc *udc = ep->udc; in ep_req_rx()
1474 struct qe_bd __iomem *bd; in ep_req_rx() local
1481 if (list_empty(&ep->queue)) { in ep_req_rx()
1482 dev_vdbg(udc->dev, "the req already finish!\n"); in ep_req_rx()
1485 pframe = ep->rxframe; in ep_req_rx()
1487 bd = ep->n_rxbd; in ep_req_rx()
1488 bdstatus = in_be32((u32 __iomem *)bd); in ep_req_rx()
1497 vaddr = (u32)phys_to_virt(in_be32(&bd->buf)); in ep_req_rx()
1499 frame_set_length(pframe, (length - USB_CRC_SIZE)); in ep_req_rx()
1514 if (framepid != ep->data01) { in ep_req_rx()
1515 dev_vdbg(udc->dev, "the data01 error!\n"); in ep_req_rx()
1519 cp = (u8 *)(req->req.buf) + req->req.actual; in ep_req_rx()
1521 memcpy(cp, pframe->data, fsize); in ep_req_rx()
1522 req->req.actual += fsize; in ep_req_rx()
1523 if ((fsize < ep->ep.maxpacket) in ep_req_rx()
1524 || (req->req.actual >= in ep_req_rx()
1525 req->req.length)) { in ep_req_rx()
1528 if (list_empty(&ep->queue)) in ep_req_rx()
1535 dev_err(udc->dev, "The receive frame with error!\n"); in ep_req_rx()
1538 /* note: don't clear the rxbd's buffer address * in ep_req_rx()
1540 out_be32((u32 __iomem *)bd, (bdstatus & BD_STATUS_MASK)); in ep_req_rx()
1541 ep->has_data--; in ep_req_rx()
1543 /* Get next BD */ in ep_req_rx()
1545 bd = ep->rxbase; in ep_req_rx()
1547 bd++; in ep_req_rx()
1549 bdstatus = in_be32((u32 __iomem *)bd); in ep_req_rx()
1553 ep->n_rxbd = bd; in ep_req_rx()
1562 if (ep->state == EP_STATE_NACK) { in ep_req_receive()
1563 if (ep->has_data <= 0) { in ep_req_receive()
1567 /* Copy the exist BD data */ in ep_req_receive()
1579 /*-----------------------------------------------------------------------
1581 -----------------------------------------------------------------------*/
1593 if (!_ep || !desc || _ep->name == ep_name[0] || in qe_ep_enable()
1594 (desc->bDescriptorType != USB_DT_ENDPOINT)) in qe_ep_enable()
1595 return -EINVAL; in qe_ep_enable()
1597 udc = ep->udc; in qe_ep_enable()
1598 if (!udc->driver || (udc->gadget.speed == USB_SPEED_UNKNOWN)) in qe_ep_enable()
1599 return -ESHUTDOWN; in qe_ep_enable()
1601 epnum = (u8)desc->bEndpointAddress & 0xF; in qe_ep_enable()
1605 cpm_muram_free(cpm_muram_offset(ep->rxbase)); in qe_ep_enable()
1606 dev_dbg(udc->dev, "enable ep%d failed\n", ep->epnum); in qe_ep_enable()
1607 return -EINVAL; in qe_ep_enable()
1609 dev_dbg(udc->dev, "enable ep%d successful\n", ep->epnum); in qe_ep_enable()
1621 udc = ep->udc; in qe_ep_disable()
1623 if (!_ep || !ep->ep.desc) { in qe_ep_disable()
1624 dev_dbg(udc->dev, "%s not enabled\n", _ep ? ep->ep.name : NULL); in qe_ep_disable()
1625 return -EINVAL; in qe_ep_disable()
1628 spin_lock_irqsave(&udc->lock, flags); in qe_ep_disable()
1630 nuke(ep, -ESHUTDOWN); in qe_ep_disable()
1631 ep->ep.desc = NULL; in qe_ep_disable()
1632 ep->stopped = 1; in qe_ep_disable()
1633 ep->tx_req = NULL; in qe_ep_disable()
1634 qe_ep_reset(udc, ep->epnum); in qe_ep_disable()
1635 spin_unlock_irqrestore(&udc->lock, flags); in qe_ep_disable()
1637 cpm_muram_free(cpm_muram_offset(ep->rxbase)); in qe_ep_disable()
1639 if (ep->dir == USB_DIR_OUT) in qe_ep_disable()
1640 size = (ep->ep.maxpacket + USB_CRC_SIZE + 2) * in qe_ep_disable()
1643 size = (ep->ep.maxpacket + USB_CRC_SIZE + 2) * in qe_ep_disable()
1646 if (ep->dir != USB_DIR_IN) { in qe_ep_disable()
1647 kfree(ep->rxframe); in qe_ep_disable()
1648 if (ep->rxbufmap) { in qe_ep_disable()
1649 dma_unmap_single(udc->gadget.dev.parent, in qe_ep_disable()
1650 ep->rxbuf_d, size, in qe_ep_disable()
1652 ep->rxbuf_d = DMA_ADDR_INVALID; in qe_ep_disable()
1655 udc->gadget.dev.parent, in qe_ep_disable()
1656 ep->rxbuf_d, size, in qe_ep_disable()
1659 kfree(ep->rxbuffer); in qe_ep_disable()
1662 if (ep->dir != USB_DIR_OUT) in qe_ep_disable()
1663 kfree(ep->txframe); in qe_ep_disable()
1665 dev_dbg(udc->dev, "disabled %s OK\n", _ep->name); in qe_ep_disable()
1677 req->req.dma = DMA_ADDR_INVALID; in qe_alloc_request()
1679 INIT_LIST_HEAD(&req->queue); in qe_alloc_request()
1681 return &req->req; in qe_alloc_request()
1701 udc = ep->udc; in __qe_ep_queue()
1703 if (!_req || !req->req.complete || !req->req.buf in __qe_ep_queue()
1704 || !list_empty(&req->queue)) { in __qe_ep_queue()
1705 dev_dbg(udc->dev, "bad params\n"); in __qe_ep_queue()
1706 return -EINVAL; in __qe_ep_queue()
1708 if (!_ep || (!ep->ep.desc && ep_index(ep))) { in __qe_ep_queue()
1709 dev_dbg(udc->dev, "bad ep\n"); in __qe_ep_queue()
1710 return -EINVAL; in __qe_ep_queue()
1713 if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) in __qe_ep_queue()
1714 return -ESHUTDOWN; in __qe_ep_queue()
1716 req->ep = ep; in __qe_ep_queue()
1718 /* map virtual address to hardware */ in __qe_ep_queue()
1719 if (req->req.dma == DMA_ADDR_INVALID) { in __qe_ep_queue()
1720 req->req.dma = dma_map_single(ep->udc->gadget.dev.parent, in __qe_ep_queue()
1721 req->req.buf, in __qe_ep_queue()
1722 req->req.length, in __qe_ep_queue()
1726 req->mapped = 1; in __qe_ep_queue()
1728 dma_sync_single_for_device(ep->udc->gadget.dev.parent, in __qe_ep_queue()
1729 req->req.dma, req->req.length, in __qe_ep_queue()
1733 req->mapped = 0; in __qe_ep_queue()
1736 req->req.status = -EINPROGRESS; in __qe_ep_queue()
1737 req->req.actual = 0; in __qe_ep_queue()
1739 list_add_tail(&req->queue, &ep->queue); in __qe_ep_queue()
1740 dev_vdbg(udc->dev, "gadget have request in %s! %d\n", in __qe_ep_queue()
1741 ep->name, req->req.length); in __qe_ep_queue()
1748 if (ep_index(ep) == 0 && req->req.length > 0) { in __qe_ep_queue()
1750 udc->ep0_state = DATA_STATE_XMIT; in __qe_ep_queue()
1752 udc->ep0_state = DATA_STATE_RECV; in __qe_ep_queue()
1755 if (ep->dir == USB_DIR_OUT) in __qe_ep_queue()
1766 struct qe_udc *udc = ep->udc; in qe_ep_queue()
1770 spin_lock_irqsave(&udc->lock, flags); in qe_ep_queue()
1772 spin_unlock_irqrestore(&udc->lock, flags); in qe_ep_queue()
1785 return -EINVAL; in qe_ep_dequeue()
1787 spin_lock_irqsave(&ep->udc->lock, flags); in qe_ep_dequeue()
1790 list_for_each_entry(iter, &ep->queue, queue) { in qe_ep_dequeue()
1791 if (&iter->req != _req) in qe_ep_dequeue()
1798 spin_unlock_irqrestore(&ep->udc->lock, flags); in qe_ep_dequeue()
1799 return -EINVAL; in qe_ep_dequeue()
1802 done(ep, req, -ECONNRESET); in qe_ep_dequeue()
1804 spin_unlock_irqrestore(&ep->udc->lock, flags); in qe_ep_dequeue()
1808 /*-----------------------------------------------------------------
1810 * @ep: the non-isochronous endpoint being stalled
1811 * @value: 1--set halt 0--clear halt
1813 *----------------------------------------------------------------*/
1818 int status = -EOPNOTSUPP; in qe_ep_set_halt()
1822 if (!_ep || !ep->ep.desc) { in qe_ep_set_halt()
1823 status = -EINVAL; in qe_ep_set_halt()
1827 udc = ep->udc; in qe_ep_set_halt()
1830 if (value && ep_is_in(ep) && !list_empty(&ep->queue)) { in qe_ep_set_halt()
1831 status = -EAGAIN; in qe_ep_set_halt()
1836 spin_lock_irqsave(&ep->udc->lock, flags); in qe_ep_set_halt()
1839 spin_unlock_irqrestore(&ep->udc->lock, flags); in qe_ep_set_halt()
1841 if (ep->epnum == 0) { in qe_ep_set_halt()
1842 udc->ep0_state = WAIT_FOR_SETUP; in qe_ep_set_halt()
1843 udc->ep0_dir = 0; in qe_ep_set_halt()
1848 ep->data01 = 0; in qe_ep_set_halt()
1850 dev_vdbg(udc->dev, "%s %s halt stat %d\n", ep->ep.name, in qe_ep_set_halt()
1869 /*------------------------------------------------------------------------
1871 ------------------------------------------------------------------------*/
1879 tmp = in_be16(&udc->usb_param->frame_n); in qe_get_frame()
1882 return -EINVAL; in qe_get_frame()
1896 /*-------------------------------------------------------------------------
1898 -------------------------------------------------------------------------*/
1901 struct qe_ep *ep = &udc->eps[pipe]; in udc_reset_ep_queue()
1903 nuke(ep, -ECONNRESET); in udc_reset_ep_queue()
1904 ep->tx_req = NULL; in udc_reset_ep_queue()
1916 spin_unlock(&udc->lock); in reset_queues()
1917 usb_gadget_udc_reset(&udc->gadget, udc->driver); in reset_queues()
1918 spin_lock(&udc->lock); in reset_queues()
1926 /* Save the new address to device struct */ in ch9setaddress()
1927 udc->device_address = (u8) value; in ch9setaddress()
1929 udc->usb_state = USB_STATE_ADDRESS; in ch9setaddress()
1940 req->req.buf = NULL; in ownercomplete()
1952 ep = &udc->eps[0]; in ch9getstatus()
1965 struct qe_ep *target_ep = &udc->eps[pipe]; in ch9getstatus()
1969 if (!target_ep->ep.desc) in ch9getstatus()
1972 usep = in_be16(&udc->usb_regs->usb_usep[pipe]); in ch9getstatus()
1974 if (target_ep->dir != USB_DIR_IN) in ch9getstatus()
1979 if (target_ep->dir != USB_DIR_OUT) in ch9getstatus()
1986 req = container_of(qe_alloc_request(&ep->ep, GFP_KERNEL), in ch9getstatus()
1988 req->req.length = 2; in ch9getstatus()
1989 req->req.buf = udc->statusbuf; in ch9getstatus()
1990 *(u16 *)req->req.buf = cpu_to_le16(usb_status); in ch9getstatus()
1991 req->req.status = -EINPROGRESS; in ch9getstatus()
1992 req->req.actual = 0; in ch9getstatus()
1993 req->req.complete = ownercomplete; in ch9getstatus()
1995 udc->ep0_dir = USB_DIR_IN; in ch9getstatus()
1998 status = __qe_ep_queue(&ep->ep, &req->req); in ch9getstatus()
2003 dev_err(udc->dev, "Can't respond to getstatus request \n"); in ch9getstatus()
2011 /* Fix Endian (udc->local_setup_buff is cpu Endian now)*/ in setup_received_handle()
2012 u16 wValue = le16_to_cpu(setup->wValue); in setup_received_handle()
2013 u16 wIndex = le16_to_cpu(setup->wIndex); in setup_received_handle()
2014 u16 wLength = le16_to_cpu(setup->wLength); in setup_received_handle()
2019 if (setup->bRequestType & USB_DIR_IN) in setup_received_handle()
2020 udc->ep0_dir = USB_DIR_IN; in setup_received_handle()
2022 udc->ep0_dir = USB_DIR_OUT; in setup_received_handle()
2024 switch (setup->bRequest) { in setup_received_handle()
2027 if ((setup->bRequestType & (USB_DIR_IN | USB_TYPE_MASK)) in setup_received_handle()
2030 ch9getstatus(udc, setup->bRequestType, wValue, wIndex, in setup_received_handle()
2036 if (setup->bRequestType != (USB_DIR_OUT | USB_TYPE_STANDARD | in setup_received_handle()
2045 if ((setup->bRequestType & USB_TYPE_MASK) in setup_received_handle()
2049 if ((setup->bRequestType & USB_RECIP_MASK) in setup_received_handle()
2057 ep = &udc->eps[pipe]; in setup_received_handle()
2059 spin_unlock(&udc->lock); in setup_received_handle()
2060 qe_ep_set_halt(&ep->ep, in setup_received_handle()
2061 (setup->bRequest == USB_REQ_SET_FEATURE) in setup_received_handle()
2063 spin_lock(&udc->lock); in setup_received_handle()
2076 if (setup->bRequestType & USB_DIR_IN) { in setup_received_handle()
2077 udc->ep0_state = DATA_STATE_XMIT; in setup_received_handle()
2078 udc->ep0_dir = USB_DIR_IN; in setup_received_handle()
2080 udc->ep0_state = DATA_STATE_RECV; in setup_received_handle()
2081 udc->ep0_dir = USB_DIR_OUT; in setup_received_handle()
2083 spin_unlock(&udc->lock); in setup_received_handle()
2084 if (udc->driver->setup(&udc->gadget, in setup_received_handle()
2085 &udc->local_setup_buff) < 0) in setup_received_handle()
2087 spin_lock(&udc->lock); in setup_received_handle()
2090 udc->ep0_dir = USB_DIR_IN; in setup_received_handle()
2091 spin_unlock(&udc->lock); in setup_received_handle()
2092 if (udc->driver->setup(&udc->gadget, in setup_received_handle()
2093 &udc->local_setup_buff) < 0) in setup_received_handle()
2095 spin_lock(&udc->lock); in setup_received_handle()
2096 udc->ep0_state = DATA_STATE_NEED_ZLP; in setup_received_handle()
2100 /*-------------------------------------------------------------------------
2102 -------------------------------------------------------------------------*/
2105 udc->resume_state = udc->usb_state; in suspend_irq()
2106 udc->usb_state = USB_STATE_SUSPENDED; in suspend_irq()
2109 if (udc->driver->suspend) in suspend_irq()
2110 udc->driver->suspend(&udc->gadget); in suspend_irq()
2115 udc->usb_state = udc->resume_state; in resume_irq()
2116 udc->resume_state = 0; in resume_irq()
2119 if (udc->driver->resume) in resume_irq()
2120 udc->driver->resume(&udc->gadget); in resume_irq()
2127 usbs = in_8(&udc->usb_regs->usb_usbs); in idle_irq()
2129 if ((udc->usb_state) != USB_STATE_SUSPENDED) in idle_irq()
2132 if (udc->usb_state == USB_STATE_SUSPENDED) in idle_irq()
2141 if (udc->usb_state == USB_STATE_DEFAULT) in reset_irq()
2145 out_8(&udc->usb_regs->usb_usadr, 0); in reset_irq()
2148 if (udc->eps[i].init) in reset_irq()
2153 udc->usb_state = USB_STATE_DEFAULT; in reset_irq()
2154 udc->ep0_state = WAIT_FOR_SETUP; in reset_irq()
2155 udc->ep0_dir = USB_DIR_OUT; in reset_irq()
2174 struct qe_bd __iomem *bd; in tx_irq() local
2177 if ((udc->usb_state == USB_STATE_ADDRESS) in tx_irq()
2178 && (in_8(&udc->usb_regs->usb_usadr) == 0)) in tx_irq()
2179 out_8(&udc->usb_regs->usb_usadr, udc->device_address); in tx_irq()
2181 for (i = (USB_MAX_ENDPOINTS-1); ((i >= 0) && (res == 0)); i--) { in tx_irq()
2182 ep = &udc->eps[i]; in tx_irq()
2183 if (ep && ep->init && (ep->dir != USB_DIR_OUT)) { in tx_irq()
2184 bd = ep->c_txbd; in tx_irq()
2185 if (!(in_be32((u32 __iomem *)bd) & T_R) in tx_irq()
2186 && (in_be32(&bd->buf))) { in tx_irq()
2187 /* confirm the transmitted bd */ in tx_irq()
2188 if (ep->epnum == 0) in tx_irq()
2203 struct qe_bd __iomem *bd; in rx_irq() local
2207 ep = &udc->eps[i]; in rx_irq()
2208 if (ep && ep->init && (ep->dir != USB_DIR_IN)) { in rx_irq()
2209 bd = ep->n_rxbd; in rx_irq()
2210 if (!(in_be32((u32 __iomem *)bd) & R_E) in rx_irq()
2211 && (in_be32(&bd->buf))) { in rx_irq()
2212 if (ep->epnum == 0) { in rx_irq()
2215 /*non-setup package receive*/ in rx_irq()
2230 spin_lock_irqsave(&udc->lock, flags); in qe_udc_irq()
2232 irq_src = in_be16(&udc->usb_regs->usb_usber) & in qe_udc_irq()
2233 in_be16(&udc->usb_regs->usb_usbmr); in qe_udc_irq()
2235 out_be16(&udc->usb_regs->usb_usber, irq_src); in qe_udc_irq()
2273 spin_unlock_irqrestore(&udc->lock, flags); in qe_udc_irq()
2278 /*-------------------------------------------------------------------------
2280 --------------------------------------------------------------------------*/
2289 spin_lock_irqsave(&udc->lock, flags); in fsl_qe_start()
2292 udc->driver = driver; in fsl_qe_start()
2293 udc->gadget.speed = driver->max_speed; in fsl_qe_start()
2298 out_be16(&udc->usb_regs->usb_usber, 0xffff); in fsl_qe_start()
2299 out_be16(&udc->usb_regs->usb_usbmr, USB_E_DEFAULT_DEVICE); in fsl_qe_start()
2300 udc->usb_state = USB_STATE_ATTACHED; in fsl_qe_start()
2301 udc->ep0_state = WAIT_FOR_SETUP; in fsl_qe_start()
2302 udc->ep0_dir = USB_DIR_OUT; in fsl_qe_start()
2303 spin_unlock_irqrestore(&udc->lock, flags); in fsl_qe_start()
2319 udc->usb_state = USB_STATE_ATTACHED; in fsl_qe_stop()
2320 udc->ep0_state = WAIT_FOR_SETUP; in fsl_qe_stop()
2321 udc->ep0_dir = 0; in fsl_qe_stop()
2324 spin_lock_irqsave(&udc->lock, flags); in fsl_qe_stop()
2325 udc->gadget.speed = USB_SPEED_UNKNOWN; in fsl_qe_stop()
2326 nuke(&udc->eps[0], -ESHUTDOWN); in fsl_qe_stop()
2327 list_for_each_entry(loop_ep, &udc->gadget.ep_list, ep.ep_list) in fsl_qe_stop()
2328 nuke(loop_ep, -ESHUTDOWN); in fsl_qe_stop()
2329 spin_unlock_irqrestore(&udc->lock, flags); in fsl_qe_stop()
2331 udc->driver = NULL; in fsl_qe_stop()
2336 /* udc structure's alloc and setup, include ep-param alloc */
2340 struct device_node *np = ofdev->dev.of_node; in qe_udc_config()
2351 udc->dev = &ofdev->dev; in qe_udc_config()
2353 /* get default address of usb parameter in MURAM from device tree */ in qe_udc_config()
2355 udc->usb_param = cpm_muram_addr(offset); in qe_udc_config()
2356 memset_io(udc->usb_param, 0, size); in qe_udc_config()
2358 usbpram = udc->usb_param; in qe_udc_config()
2359 out_be16(&usbpram->frame_n, 0); in qe_udc_config()
2360 out_be32(&usbpram->rstate, 0); in qe_udc_config()
2369 out_be16(&usbpram->epptr[i], (u16)tmp_addr); in qe_udc_config()
2370 udc->ep_param[i] = cpm_muram_addr(tmp_addr); in qe_udc_config()
2374 memset_io(udc->ep_param[0], 0, in qe_udc_config()
2377 udc->resume_state = USB_STATE_NOTATTACHED; in qe_udc_config()
2378 udc->usb_state = USB_STATE_POWERED; in qe_udc_config()
2379 udc->ep0_dir = 0; in qe_udc_config()
2381 spin_lock_init(&udc->lock); in qe_udc_config()
2393 qe_usbregs = udc->usb_regs; in qe_udc_reg_init()
2396 out_8(&qe_usbregs->usb_usmod, 0x01); in qe_udc_reg_init()
2398 out_8(&qe_usbregs->usb_usmod, 0x00); in qe_udc_reg_init()
2401 out_be16(&qe_usbregs->usb_usbmr, 0); in qe_udc_reg_init()
2402 out_8(&qe_usbregs->usb_uscom, 0); in qe_udc_reg_init()
2403 out_be16(&qe_usbregs->usb_usber, USBER_ALL_CLEAR); in qe_udc_reg_init()
2410 struct qe_ep *ep = &udc->eps[pipe_num]; in qe_ep_config()
2412 ep->udc = udc; in qe_ep_config()
2413 strcpy(ep->name, ep_name[pipe_num]); in qe_ep_config()
2414 ep->ep.name = ep_name[pipe_num]; in qe_ep_config()
2417 ep->ep.caps.type_control = true; in qe_ep_config()
2419 ep->ep.caps.type_iso = true; in qe_ep_config()
2420 ep->ep.caps.type_bulk = true; in qe_ep_config()
2421 ep->ep.caps.type_int = true; in qe_ep_config()
2424 ep->ep.caps.dir_in = true; in qe_ep_config()
2425 ep->ep.caps.dir_out = true; in qe_ep_config()
2427 ep->ep.ops = &qe_ep_ops; in qe_ep_config()
2428 ep->stopped = 1; in qe_ep_config()
2429 usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0); in qe_ep_config()
2430 ep->ep.desc = NULL; in qe_ep_config()
2431 ep->dir = 0xff; in qe_ep_config()
2432 ep->epnum = (u8)pipe_num; in qe_ep_config()
2433 ep->sent = 0; in qe_ep_config()
2434 ep->last = 0; in qe_ep_config()
2435 ep->init = 0; in qe_ep_config()
2436 ep->rxframe = NULL; in qe_ep_config()
2437 ep->txframe = NULL; in qe_ep_config()
2438 ep->tx_req = NULL; in qe_ep_config()
2439 ep->state = EP_STATE_IDLE; in qe_ep_config()
2440 ep->has_data = 0; in qe_ep_config()
2443 INIT_LIST_HEAD(&ep->queue); in qe_ep_config()
2447 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); in qe_ep_config()
2449 ep->gadget = &udc->gadget; in qe_ep_config()
2454 /*-----------------------------------------------------------------------
2456 *----------------------------------------------------------------------*/
2462 complete(udc->done); in qe_udc_release()
2463 cpm_muram_free(cpm_muram_offset(udc->ep_param[0])); in qe_udc_release()
2465 udc->ep_param[i] = NULL; in qe_udc_release()
2475 struct device_node *np = ofdev->dev.of_node; in qe_udc_probe()
2483 return -ENODEV; in qe_udc_probe()
2488 dev_err(&ofdev->dev, "failed to initialize\n"); in qe_udc_probe()
2489 return -ENOMEM; in qe_udc_probe()
2492 udc->soc_type = (unsigned long)device_get_match_data(&ofdev->dev); in qe_udc_probe()
2493 udc->usb_regs = of_iomap(np, 0); in qe_udc_probe()
2494 if (!udc->usb_regs) { in qe_udc_probe()
2495 ret = -ENOMEM; in qe_udc_probe()
2504 * set the qe_udc->gadget.xxx */ in qe_udc_probe()
2505 udc->gadget.ops = &qe_gadget_ops; in qe_udc_probe()
2508 udc->gadget.ep0 = &udc->eps[0].ep; in qe_udc_probe()
2510 INIT_LIST_HEAD(&udc->gadget.ep_list); in qe_udc_probe()
2513 udc->gadget.speed = USB_SPEED_UNKNOWN; in qe_udc_probe()
2516 udc->gadget.name = driver_name; in qe_udc_probe()
2517 udc->gadget.dev.parent = &ofdev->dev; in qe_udc_probe()
2535 udc->nullbuf = devm_kzalloc(&ofdev->dev, 256, GFP_KERNEL); in qe_udc_probe()
2536 if (udc->nullbuf == NULL) { in qe_udc_probe()
2537 ret = -ENOMEM; in qe_udc_probe()
2542 udc->statusbuf = devm_kzalloc(&ofdev->dev, 2, GFP_KERNEL); in qe_udc_probe()
2543 if (udc->statusbuf == NULL) { in qe_udc_probe()
2544 ret = -ENOMEM; in qe_udc_probe()
2548 udc->nullp = virt_to_phys((void *)udc->nullbuf); in qe_udc_probe()
2549 if (udc->nullp == DMA_ADDR_INVALID) { in qe_udc_probe()
2550 udc->nullp = dma_map_single( in qe_udc_probe()
2551 udc->gadget.dev.parent, in qe_udc_probe()
2552 udc->nullbuf, in qe_udc_probe()
2555 udc->nullmap = 1; in qe_udc_probe()
2557 dma_sync_single_for_device(udc->gadget.dev.parent, in qe_udc_probe()
2558 udc->nullp, 256, in qe_udc_probe()
2562 tasklet_setup(&udc->rx_tasklet, ep_rx_tasklet); in qe_udc_probe()
2564 udc->usb_irq = irq_of_parse_and_map(np, 0); in qe_udc_probe()
2565 if (!udc->usb_irq) { in qe_udc_probe()
2566 ret = -EINVAL; in qe_udc_probe()
2570 ret = request_irq(udc->usb_irq, qe_udc_irq, 0, in qe_udc_probe()
2573 dev_err(udc->dev, "cannot request irq %d err %d\n", in qe_udc_probe()
2574 udc->usb_irq, ret); in qe_udc_probe()
2578 ret = usb_add_gadget_udc_release(&ofdev->dev, &udc->gadget, in qe_udc_probe()
2584 dev_info(udc->dev, in qe_udc_probe()
2586 (udc->soc_type == PORT_QE) ? "QE" : "CPM"); in qe_udc_probe()
2590 free_irq(udc->usb_irq, udc); in qe_udc_probe()
2592 irq_dispose_mapping(udc->usb_irq); in qe_udc_probe()
2594 if (udc->nullmap) { in qe_udc_probe()
2595 dma_unmap_single(udc->gadget.dev.parent, in qe_udc_probe()
2596 udc->nullp, 256, in qe_udc_probe()
2598 udc->nullp = DMA_ADDR_INVALID; in qe_udc_probe()
2600 dma_sync_single_for_cpu(udc->gadget.dev.parent, in qe_udc_probe()
2601 udc->nullp, 256, in qe_udc_probe()
2605 ep = &udc->eps[0]; in qe_udc_probe()
2606 cpm_muram_free(cpm_muram_offset(ep->rxbase)); in qe_udc_probe()
2607 kfree(ep->rxframe); in qe_udc_probe()
2608 kfree(ep->rxbuffer); in qe_udc_probe()
2609 kfree(ep->txframe); in qe_udc_probe()
2611 iounmap(udc->usb_regs); in qe_udc_probe()
2620 return -ENOTSUPP; in qe_udc_suspend()
2625 return -ENOTSUPP; in qe_udc_resume()
2636 usb_del_gadget_udc(&udc->gadget); in qe_udc_remove()
2638 udc->done = &done; in qe_udc_remove()
2639 tasklet_disable(&udc->rx_tasklet); in qe_udc_remove()
2641 if (udc->nullmap) { in qe_udc_remove()
2642 dma_unmap_single(udc->gadget.dev.parent, in qe_udc_remove()
2643 udc->nullp, 256, in qe_udc_remove()
2645 udc->nullp = DMA_ADDR_INVALID; in qe_udc_remove()
2647 dma_sync_single_for_cpu(udc->gadget.dev.parent, in qe_udc_remove()
2648 udc->nullp, 256, in qe_udc_remove()
2652 ep = &udc->eps[0]; in qe_udc_remove()
2653 cpm_muram_free(cpm_muram_offset(ep->rxbase)); in qe_udc_remove()
2654 size = (ep->ep.maxpacket + USB_CRC_SIZE + 2) * (USB_BDRING_LEN + 1); in qe_udc_remove()
2656 kfree(ep->rxframe); in qe_udc_remove()
2657 if (ep->rxbufmap) { in qe_udc_remove()
2658 dma_unmap_single(udc->gadget.dev.parent, in qe_udc_remove()
2659 ep->rxbuf_d, size, in qe_udc_remove()
2661 ep->rxbuf_d = DMA_ADDR_INVALID; in qe_udc_remove()
2663 dma_sync_single_for_cpu(udc->gadget.dev.parent, in qe_udc_remove()
2664 ep->rxbuf_d, size, in qe_udc_remove()
2668 kfree(ep->rxbuffer); in qe_udc_remove()
2669 kfree(ep->txframe); in qe_udc_remove()
2671 free_irq(udc->usb_irq, udc); in qe_udc_remove()
2672 irq_dispose_mapping(udc->usb_irq); in qe_udc_remove()
2674 tasklet_kill(&udc->rx_tasklet); in qe_udc_remove()
2676 iounmap(udc->usb_regs); in qe_udc_remove()
2682 /*-------------------------------------------------------------------------*/
2685 .compatible = "fsl,mpc8323-qe-usb",
2689 .compatible = "fsl,mpc8360-qe-usb",
2693 .compatible = "fsl,mpc8272-cpm-usb",