Lines Matching full:ep
87 EP_INFO("ep-a",
89 EP_INFO("ep-b",
91 EP_INFO("ep-c",
93 EP_INFO("ep-d",
95 EP_INFO("ep-e",
97 EP_INFO("ep-f",
99 EP_INFO("ep-g",
101 EP_INFO("ep-h",
126 /* mode 0 == ep-{a,b,c,d} 1K fifo each
127 * mode 1 == ep-{a,b} 2K fifo each, ep-{c,d} unavailable
128 * mode 2 == ep-a 2K fifo, ep-{b,c} 1K each, ep-d unavailable
162 static void ep_clear_seqnum(struct net2280_ep *ep);
168 static inline void enable_pciirqenb(struct net2280_ep *ep) in enable_pciirqenb() argument
170 u32 tmp = readl(&ep->dev->regs->pciirqenb0); in enable_pciirqenb()
172 if (ep->dev->quirks & PLX_LEGACY) in enable_pciirqenb()
173 tmp |= BIT(ep->num); in enable_pciirqenb()
175 tmp |= BIT(ep_bit[ep->num]); in enable_pciirqenb()
176 writel(tmp, &ep->dev->regs->pciirqenb0); in enable_pciirqenb()
185 struct net2280_ep *ep; in net2280_enable() local
193 ep = container_of(_ep, struct net2280_ep, ep); in net2280_enable()
194 if (!_ep || !desc || ep->desc || _ep->name == ep0name || in net2280_enable()
199 dev = ep->dev; in net2280_enable()
216 ep->is_in = !!usb_endpoint_dir_in(desc); in net2280_enable()
217 if (dev->enhanced_mode && ep->is_in && ep_key[ep->num]) { in net2280_enable()
223 /* sanity check ep-e/ep-f since their fifos are small */ in net2280_enable()
225 if (ep->num > 4 && max > 64 && (dev->quirks & PLX_LEGACY)) { in net2280_enable()
232 ep->desc = desc; in net2280_enable()
235 ep->stopped = 0; in net2280_enable()
236 ep->wedged = 0; in net2280_enable()
237 ep->out_overflow = 0; in net2280_enable()
240 set_max_speed(ep, max); in net2280_enable()
243 writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat); in net2280_enable()
246 tmp = readl(&ep->cfg->ep_cfg); in net2280_enable()
247 /* If USB ep number doesn't match hardware ep number */ in net2280_enable()
253 if (ep->is_in) in net2280_enable()
265 &ep->regs->ep_rsp); in net2280_enable()
276 ep->is_iso = (type == USB_ENDPOINT_XFER_ISOC); in net2280_enable()
284 ep->is_in = (tmp & USB_DIR_IN) != 0; in net2280_enable()
287 if (dev->enhanced_mode && ep->is_in) { in net2280_enable()
293 tmp |= (ep->is_in << ENDPOINT_DIRECTION); in net2280_enable()
299 tmp |= (ep->ep.maxburst << MAX_BURST_SIZE); in net2280_enable()
306 if (!ep->is_in) in net2280_enable()
307 writel(BIT(SET_NAK_OUT_PACKETS), &ep->regs->ep_rsp); in net2280_enable()
313 BIT(CLEAR_NAK_OUT_PACKETS_MODE), &ep->regs->ep_rsp); in net2280_enable()
317 ep_clear_seqnum(ep); in net2280_enable()
318 writel(tmp, &ep->cfg->ep_cfg); in net2280_enable()
321 if (!ep->dma) { /* pio, per-packet */ in net2280_enable()
322 enable_pciirqenb(ep); in net2280_enable()
327 tmp |= readl(&ep->regs->ep_irqenb); in net2280_enable()
328 writel(tmp, &ep->regs->ep_irqenb); in net2280_enable()
330 tmp = BIT((8 + ep->num)); /* completion */ in net2280_enable()
340 writel(tmp, &ep->regs->ep_irqenb); in net2280_enable()
342 enable_pciirqenb(ep); in net2280_enable()
347 ep_dbg(dev, "enabled %s (ep%d%s-%s) %s max %04x\n", in net2280_enable()
350 ep->dma ? "dma" : "pio", max); in net2280_enable()
357 dev_err(&ep->dev->pdev->dev, "%s: error=%d\n", __func__, ret); in net2280_enable()
379 struct net2280_ep *ep) in ep_reset_228x() argument
383 ep->desc = NULL; in ep_reset_228x()
384 INIT_LIST_HEAD(&ep->queue); in ep_reset_228x()
386 usb_ep_set_maxpacket_limit(&ep->ep, ~0); in ep_reset_228x()
387 ep->ep.ops = &net2280_ep_ops; in ep_reset_228x()
390 if (ep->dma) { in ep_reset_228x()
391 writel(0, &ep->dma->dmactl); in ep_reset_228x()
395 &ep->dma->dmastat); in ep_reset_228x()
398 tmp &= ~BIT(ep->num); in ep_reset_228x()
402 tmp &= ~BIT((8 + ep->num)); /* completion */ in ep_reset_228x()
405 writel(0, &ep->regs->ep_irqenb); in ep_reset_228x()
410 if (!ep->is_in || (ep->dev->quirks & PLX_2280)) { in ep_reset_228x()
423 if (ep->num != 0) { in ep_reset_228x()
427 writel(tmp, &ep->regs->ep_rsp); in ep_reset_228x()
430 if (ep->dev->quirks & PLX_2280) in ep_reset_228x()
449 &ep->regs->ep_stat); in ep_reset_228x()
455 struct net2280_ep *ep) in ep_reset_338x() argument
459 ep->desc = NULL; in ep_reset_338x()
460 INIT_LIST_HEAD(&ep->queue); in ep_reset_338x()
462 usb_ep_set_maxpacket_limit(&ep->ep, ~0); in ep_reset_338x()
463 ep->ep.ops = &net2280_ep_ops; in ep_reset_338x()
466 if (ep->dma) { in ep_reset_338x()
467 writel(0, &ep->dma->dmactl); in ep_reset_338x()
473 &ep->dma->dmastat); in ep_reset_338x()
475 dmastat = readl(&ep->dma->dmastat); in ep_reset_338x()
477 ep_warn(ep->dev, "The dmastat return = %x!!\n", in ep_reset_338x()
479 writel(0x5a, &ep->dma->dmastat); in ep_reset_338x()
483 tmp &= ~BIT(ep_bit[ep->num]); in ep_reset_338x()
486 if (ep->num < 5) { in ep_reset_338x()
488 tmp &= ~BIT((8 + ep->num)); /* completion */ in ep_reset_338x()
492 writel(0, &ep->regs->ep_irqenb); in ep_reset_338x()
500 BIT(DATA_IN_TOKEN_INTERRUPT), &ep->regs->ep_stat); in ep_reset_338x()
502 tmp = readl(&ep->cfg->ep_cfg); in ep_reset_338x()
503 if (ep->is_in) in ep_reset_338x()
507 writel(tmp, &ep->cfg->ep_cfg); in ep_reset_338x()
514 struct net2280_ep *ep; in net2280_disable() local
517 ep = container_of(_ep, struct net2280_ep, ep); in net2280_disable()
519 pr_err("%s: Invalid ep=%p\n", __func__, _ep); in net2280_disable()
522 spin_lock_irqsave(&ep->dev->lock, flags); in net2280_disable()
523 nuke(ep); in net2280_disable()
525 if (ep->dev->quirks & PLX_PCIE) in net2280_disable()
526 ep_reset_338x(ep->dev->regs, ep); in net2280_disable()
528 ep_reset_228x(ep->dev->regs, ep); in net2280_disable()
530 ep_vdbg(ep->dev, "disabled %s %s\n", in net2280_disable()
531 ep->dma ? "dma" : "pio", _ep->name); in net2280_disable()
534 (void)readl(&ep->cfg->ep_cfg); in net2280_disable()
536 if (!ep->dma && ep->num >= 1 && ep->num <= 4) in net2280_disable()
537 ep->dma = &ep->dev->dma[ep->num - 1]; in net2280_disable()
539 spin_unlock_irqrestore(&ep->dev->lock, flags); in net2280_disable()
548 struct net2280_ep *ep; in net2280_alloc_request() local
552 pr_err("%s: Invalid ep\n", __func__); in net2280_alloc_request()
555 ep = container_of(_ep, struct net2280_ep, ep); in net2280_alloc_request()
564 if (ep->dma) { in net2280_alloc_request()
567 td = dma_pool_alloc(ep->dev->requests, gfp_flags, in net2280_alloc_request()
582 struct net2280_ep *ep; in net2280_free_request() local
585 ep = container_of(_ep, struct net2280_ep, ep); in net2280_free_request()
587 dev_err(&ep->dev->pdev->dev, "%s: Invalid ep=%p or req=%p\n", in net2280_free_request()
595 dma_pool_free(ep->dev->requests, req->td, req->td_dma); in net2280_free_request()
604 * NOTE: pio with ep-a..ep-d could stuff multiple packets into the fifo
606 * one packet. ep-a..ep-d should use dma instead.
608 static void write_fifo(struct net2280_ep *ep, struct usb_request *req) in write_fifo() argument
610 struct net2280_ep_regs __iomem *regs = ep->regs; in write_fifo()
627 count = ep->ep.maxpacket; in write_fifo()
631 ep_vdbg(ep->dev, "write %s fifo (IN) %d bytes%s req %p\n", in write_fifo()
632 ep->ep.name, count, in write_fifo()
633 (count != ep->ep.maxpacket) ? " (short)" : "", in write_fifo()
651 if (count || total < ep->ep.maxpacket) { in write_fifo()
654 set_fifo_bytecount(ep, count & 0x03); in write_fifo()
668 static void out_flush(struct net2280_ep *ep) in out_flush() argument
673 statp = &ep->regs->ep_stat; in out_flush()
677 ep_dbg(ep->dev, "%s %s %08x !NAK\n", in out_flush()
678 ep->ep.name, __func__, tmp); in out_flush()
679 writel(BIT(SET_NAK_OUT_PACKETS), &ep->regs->ep_rsp); in out_flush()
691 ep->dev->gadget.speed == USB_SPEED_FULL) { in out_flush()
705 * for ep-a..ep-d this will read multiple packets out when they
708 static int read_fifo(struct net2280_ep *ep, struct net2280_request *req) in read_fifo() argument
710 struct net2280_ep_regs __iomem *regs = ep->regs; in read_fifo()
718 if (ep->dev->chiprev == 0x0100 && in read_fifo()
719 ep->dev->gadget.speed == USB_SPEED_FULL) { in read_fifo()
721 tmp = readl(&ep->regs->ep_stat); in read_fifo()
725 start_out_naking(ep); in read_fifo()
738 tmp = readl(&ep->regs->ep_stat); in read_fifo()
748 if ((tmp % ep->ep.maxpacket) != 0) { in read_fifo()
749 ep_err(ep->dev, in read_fifo()
751 ep->ep.name, count, tmp); in read_fifo()
762 is_short = (count == 0) || ((count % ep->ep.maxpacket) != 0); in read_fifo()
764 ep_vdbg(ep->dev, "read %s fifo (OUT) %d bytes%s%s%s req %p %d/%d\n", in read_fifo()
765 ep->ep.name, count, is_short ? " (short)" : "", in read_fifo()
785 out_flush(ep); in read_fifo()
787 writel(BIT(CLEAR_NAK_OUT_PACKETS), &ep->regs->ep_rsp); in read_fifo()
788 (void) readl(&ep->regs->ep_rsp); in read_fifo()
795 static void fill_dma_desc(struct net2280_ep *ep, in fill_dma_desc() argument
806 if (ep->is_in) in fill_dma_desc()
808 if ((!ep->is_in && (dmacount % ep->ep.maxpacket) != 0) || in fill_dma_desc()
809 !(ep->dev->quirks & PLX_2280)) in fill_dma_desc()
820 /* 2280 may be polling VALID_BIT through ep->dma->dmadesc */ in fill_dma_desc()
847 static void start_queue(struct net2280_ep *ep, u32 dmactl, u32 td_dma) in start_queue() argument
849 struct net2280_dma_regs __iomem *dma = ep->dma; in start_queue()
850 unsigned int tmp = BIT(VALID_BIT) | (ep->is_in << DMA_DIRECTION); in start_queue()
852 if (!(ep->dev->quirks & PLX_2280)) in start_queue()
859 if (ep->dev->quirks & PLX_PCIE) in start_queue()
864 (void) readl(&ep->dev->pci->pcimstctl); in start_queue()
869 static void start_dma(struct net2280_ep *ep, struct net2280_request *req) in start_dma() argument
872 struct net2280_dma_regs __iomem *dma = ep->dma; in start_dma()
878 writel(0, &ep->dma->dmactl); in start_dma()
881 if (!ep->is_in && (readl(&ep->regs->ep_stat) & in start_dma()
884 &ep->regs->ep_stat); in start_dma()
886 tmp = readl(&ep->regs->ep_avail); in start_dma()
905 stop_out_naking(ep); in start_dma()
914 if (ep->is_in) { in start_dma()
915 if (likely((req->req.length % ep->ep.maxpacket) || in start_dma()
918 ep->in_fifo_validate = 1; in start_dma()
920 ep->in_fifo_validate = 0; in start_dma()
924 req->td->dmadesc = cpu_to_le32 (ep->td_dma); in start_dma()
925 fill_dma_desc(ep, req, 1); in start_dma()
929 start_queue(ep, tmp, req->td_dma); in start_dma()
933 queue_dma(struct net2280_ep *ep, struct net2280_request *req, int valid) in queue_dma() argument
936 swap(ep->dummy, req->td); in queue_dma()
937 swap(ep->td_dma, req->td_dma); in queue_dma()
939 req->td->dmadesc = cpu_to_le32 (ep->td_dma); in queue_dma()
941 fill_dma_desc(ep, req, valid); in queue_dma()
945 done(struct net2280_ep *ep, struct net2280_request *req, int status) in done() argument
948 unsigned stopped = ep->stopped; in done()
957 dev = ep->dev; in done()
958 if (ep->dma) in done()
959 usb_gadget_unmap_request(&dev->gadget, &req->req, ep->is_in); in done()
963 ep->ep.name, &req->req, status, in done()
967 ep->stopped = 1; in done()
969 usb_gadget_giveback_request(&ep->ep, &req->req); in done()
971 ep->stopped = stopped; in done()
980 struct net2280_ep *ep; in net2280_queue() local
988 ep = container_of(_ep, struct net2280_ep, ep); in net2280_queue()
989 if (!_ep || (!ep->desc && ep->num != 0)) { in net2280_queue()
990 pr_err("%s: Invalid ep=%p or ep->desc\n", __func__, _ep); in net2280_queue()
1003 dev = ep->dev; in net2280_queue()
1010 if (ep->dma && _req->length == 0) { in net2280_queue()
1016 if (ep->dma) { in net2280_queue()
1018 ep->is_in); in net2280_queue()
1032 if (list_empty(&ep->queue) && !ep->stopped && in net2280_queue()
1033 !((dev->quirks & PLX_PCIE) && ep->dma && in net2280_queue()
1034 (readl(&ep->regs->ep_rsp) & BIT(CLEAR_ENDPOINT_HALT)))) { in net2280_queue()
1037 if (ep->dma) in net2280_queue()
1038 start_dma(ep, req); in net2280_queue()
1041 if (ep->num == 0 && _req->length == 0) { in net2280_queue()
1042 allow_status(ep); in net2280_queue()
1043 done(ep, req, 0); in net2280_queue()
1044 ep_vdbg(dev, "%s status ack\n", ep->ep.name); in net2280_queue()
1049 if (ep->is_in) in net2280_queue()
1050 write_fifo(ep, _req); in net2280_queue()
1055 s = readl(&ep->regs->ep_stat); in net2280_queue()
1063 if (read_fifo(ep, req) && in net2280_queue()
1064 ep->num == 0) { in net2280_queue()
1065 done(ep, req, 0); in net2280_queue()
1066 allow_status(ep); in net2280_queue()
1069 } else if (read_fifo(ep, req) && in net2280_queue()
1070 ep->num != 0) { in net2280_queue()
1071 done(ep, req, 0); in net2280_queue()
1074 s = readl(&ep->regs->ep_stat); in net2280_queue()
1080 &ep->regs->ep_rsp); in net2280_queue()
1084 } else if (ep->dma) { in net2280_queue()
1087 if (ep->is_in) { in net2280_queue()
1094 (req->req.length % ep->ep.maxpacket)); in net2280_queue()
1095 if (expect != ep->in_fifo_validate) in net2280_queue()
1098 queue_dma(ep, req, valid); in net2280_queue()
1102 ep->responded = 1; in net2280_queue()
1104 list_add_tail(&req->queue, &ep->queue); in net2280_queue()
1112 dev_err(&ep->dev->pdev->dev, "%s: error=%d\n", __func__, ret); in net2280_queue()
1117 dma_done(struct net2280_ep *ep, struct net2280_request *req, u32 dmacount, in dma_done() argument
1121 done(ep, req, status); in dma_done()
1124 static int scan_dma_completions(struct net2280_ep *ep) in scan_dma_completions() argument
1131 while (!list_empty(&ep->queue)) { in scan_dma_completions()
1135 req = list_entry(ep->queue.next, in scan_dma_completions()
1150 u32 const ep_dmacount = readl(&ep->dma->dmacount); in scan_dma_completions()
1155 dma_done(ep, req, req_dma_count, 0); in scan_dma_completions()
1158 } else if (!ep->is_in && in scan_dma_completions()
1159 (req->req.length % ep->ep.maxpacket) && in scan_dma_completions()
1160 !(ep->dev->quirks & PLX_PCIE)) { in scan_dma_completions()
1162 u32 const ep_stat = readl(&ep->regs->ep_stat); in scan_dma_completions()
1168 ep_warn(ep->dev, "%s lost packet sync!\n", in scan_dma_completions()
1169 ep->ep.name); in scan_dma_completions()
1172 u32 const ep_avail = readl(&ep->regs->ep_avail); in scan_dma_completions()
1175 ep->out_overflow = 1; in scan_dma_completions()
1176 ep_dbg(ep->dev, in scan_dma_completions()
1178 ep->ep.name, ep_avail, in scan_dma_completions()
1184 dma_done(ep, req, req_dma_count, 0); in scan_dma_completions()
1191 static void restart_dma(struct net2280_ep *ep) in restart_dma() argument
1195 if (ep->stopped) in restart_dma()
1197 req = list_entry(ep->queue.next, struct net2280_request, queue); in restart_dma()
1199 start_dma(ep, req); in restart_dma()
1202 static void abort_dma(struct net2280_ep *ep) in abort_dma() argument
1205 if (likely(!list_empty(&ep->queue))) { in abort_dma()
1207 writel(BIT(DMA_ABORT), &ep->dma->dmastat); in abort_dma()
1208 spin_stop_dma(ep->dma); in abort_dma()
1210 stop_dma(ep->dma); in abort_dma()
1211 scan_dma_completions(ep); in abort_dma()
1215 static void nuke(struct net2280_ep *ep) in nuke() argument
1220 ep->stopped = 1; in nuke()
1221 if (ep->dma) in nuke()
1222 abort_dma(ep); in nuke()
1223 while (!list_empty(&ep->queue)) { in nuke()
1224 req = list_entry(ep->queue.next, in nuke()
1227 done(ep, req, -ESHUTDOWN); in nuke()
1234 struct net2280_ep *ep; in net2280_dequeue() local
1241 ep = container_of(_ep, struct net2280_ep, ep); in net2280_dequeue()
1242 if (!_ep || (!ep->desc && ep->num != 0) || !_req) { in net2280_dequeue()
1243 pr_err("%s: Invalid ep=%p or ep->desc or req=%p\n", in net2280_dequeue()
1248 spin_lock_irqsave(&ep->dev->lock, flags); in net2280_dequeue()
1249 stopped = ep->stopped; in net2280_dequeue()
1253 ep->stopped = 1; in net2280_dequeue()
1254 if (ep->dma) { in net2280_dequeue()
1255 dmactl = readl(&ep->dma->dmactl); in net2280_dequeue()
1257 stop_dma(ep->dma); in net2280_dequeue()
1258 scan_dma_completions(ep); in net2280_dequeue()
1262 list_for_each_entry(iter, &ep->queue, queue) { in net2280_dequeue()
1269 ep->stopped = stopped; in net2280_dequeue()
1270 spin_unlock_irqrestore(&ep->dev->lock, flags); in net2280_dequeue()
1271 ep_dbg(ep->dev, "%s: Request mismatch\n", __func__); in net2280_dequeue()
1276 if (ep->queue.next == &req->queue) { in net2280_dequeue()
1277 if (ep->dma) { in net2280_dequeue()
1278 ep_dbg(ep->dev, "unlink (%s) dma\n", _ep->name); in net2280_dequeue()
1280 abort_dma(ep); in net2280_dequeue()
1281 if (likely(ep->queue.next == &req->queue)) { in net2280_dequeue()
1284 dma_done(ep, req, in net2280_dequeue()
1285 readl(&ep->dma->dmacount), in net2280_dequeue()
1289 ep_dbg(ep->dev, "unlink (%s) pio\n", _ep->name); in net2280_dequeue()
1290 done(ep, req, -ECONNRESET); in net2280_dequeue()
1296 done(ep, req, -ECONNRESET); in net2280_dequeue()
1297 ep->stopped = stopped; in net2280_dequeue()
1299 if (ep->dma) { in net2280_dequeue()
1301 if (list_empty(&ep->queue)) in net2280_dequeue()
1302 stop_dma(ep->dma); in net2280_dequeue()
1303 else if (!ep->stopped) { in net2280_dequeue()
1306 writel(dmactl, &ep->dma->dmactl); in net2280_dequeue()
1308 start_dma(ep, list_entry(ep->queue.next, in net2280_dequeue()
1313 spin_unlock_irqrestore(&ep->dev->lock, flags); in net2280_dequeue()
1324 struct net2280_ep *ep; in net2280_set_halt_and_wedge() local
1328 ep = container_of(_ep, struct net2280_ep, ep); in net2280_set_halt_and_wedge()
1329 if (!_ep || (!ep->desc && ep->num != 0)) { in net2280_set_halt_and_wedge()
1330 pr_err("%s: Invalid ep=%p or ep->desc\n", __func__, _ep); in net2280_set_halt_and_wedge()
1333 if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN) { in net2280_set_halt_and_wedge()
1337 if (ep->desc /* not ep0 */ && (ep->desc->bmAttributes & 0x03) in net2280_set_halt_and_wedge()
1343 spin_lock_irqsave(&ep->dev->lock, flags); in net2280_set_halt_and_wedge()
1344 if (!list_empty(&ep->queue)) { in net2280_set_halt_and_wedge()
1347 } else if (ep->is_in && value && net2280_fifo_status(_ep) != 0) { in net2280_set_halt_and_wedge()
1351 ep_vdbg(ep->dev, "%s %s %s\n", _ep->name, in net2280_set_halt_and_wedge()
1356 if (ep->num == 0) in net2280_set_halt_and_wedge()
1357 ep->dev->protocol_stall = 1; in net2280_set_halt_and_wedge()
1359 set_halt(ep); in net2280_set_halt_and_wedge()
1361 ep->wedged = 1; in net2280_set_halt_and_wedge()
1363 clear_halt(ep); in net2280_set_halt_and_wedge()
1364 if (ep->dev->quirks & PLX_PCIE && in net2280_set_halt_and_wedge()
1365 !list_empty(&ep->queue) && ep->td_dma) in net2280_set_halt_and_wedge()
1366 restart_dma(ep); in net2280_set_halt_and_wedge()
1367 ep->wedged = 0; in net2280_set_halt_and_wedge()
1369 (void) readl(&ep->regs->ep_rsp); in net2280_set_halt_and_wedge()
1371 spin_unlock_irqrestore(&ep->dev->lock, flags); in net2280_set_halt_and_wedge()
1376 spin_unlock_irqrestore(&ep->dev->lock, flags); in net2280_set_halt_and_wedge()
1378 dev_err(&ep->dev->pdev->dev, "%s: error=%d\n", __func__, retval); in net2280_set_halt_and_wedge()
1390 pr_err("%s: Invalid ep=%p or ep0\n", __func__, _ep); in net2280_set_wedge()
1398 struct net2280_ep *ep; in net2280_fifo_status() local
1401 ep = container_of(_ep, struct net2280_ep, ep); in net2280_fifo_status()
1402 if (!_ep || (!ep->desc && ep->num != 0)) { in net2280_fifo_status()
1403 pr_err("%s: Invalid ep=%p or ep->desc\n", __func__, _ep); in net2280_fifo_status()
1406 if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN) { in net2280_fifo_status()
1407 dev_err(&ep->dev->pdev->dev, in net2280_fifo_status()
1409 __func__, ep->dev->driver, ep->dev->gadget.speed); in net2280_fifo_status()
1413 avail = readl(&ep->regs->ep_avail) & (BIT(12) - 1); in net2280_fifo_status()
1414 if (avail > ep->fifo_size) { in net2280_fifo_status()
1415 dev_err(&ep->dev->pdev->dev, "%s: Fifo overflow\n", __func__); in net2280_fifo_status()
1418 if (ep->is_in) in net2280_fifo_status()
1419 avail = ep->fifo_size - avail; in net2280_fifo_status()
1425 struct net2280_ep *ep; in net2280_fifo_flush() local
1427 ep = container_of(_ep, struct net2280_ep, ep); in net2280_fifo_flush()
1428 if (!_ep || (!ep->desc && ep->num != 0)) { in net2280_fifo_flush()
1429 pr_err("%s: Invalid ep=%p or ep->desc\n", __func__, _ep); in net2280_fifo_flush()
1432 if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN) { in net2280_fifo_flush()
1433 dev_err(&ep->dev->pdev->dev, in net2280_fifo_flush()
1435 __func__, ep->dev->driver, ep->dev->gadget.speed); in net2280_fifo_flush()
1439 writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat); in net2280_fifo_flush()
1440 (void) readl(&ep->regs->ep_rsp); in net2280_fifo_flush()
1552 struct usb_ep *ep; in net2280_match_ep() local
1555 /* ep-e, ep-f are PIO with only 64 byte fifos */ in net2280_match_ep()
1556 ep = gadget_find_ep_by_name(_gadget, "ep-e"); in net2280_match_ep()
1557 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1558 return ep; in net2280_match_ep()
1559 ep = gadget_find_ep_by_name(_gadget, "ep-f"); in net2280_match_ep()
1560 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1561 return ep; in net2280_match_ep()
1570 ep = gadget_find_ep_by_name(_gadget, "ep2in"); in net2280_match_ep()
1571 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1572 return ep; in net2280_match_ep()
1573 ep = gadget_find_ep_by_name(_gadget, "ep4in"); in net2280_match_ep()
1574 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1575 return ep; in net2280_match_ep()
1578 ep = gadget_find_ep_by_name(_gadget, "ep1out"); in net2280_match_ep()
1579 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1580 return ep; in net2280_match_ep()
1581 ep = gadget_find_ep_by_name(_gadget, "ep3out"); in net2280_match_ep()
1582 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1583 return ep; in net2280_match_ep()
1586 ep = gadget_find_ep_by_name(_gadget, "ep1in"); in net2280_match_ep()
1587 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1588 return ep; in net2280_match_ep()
1589 ep = gadget_find_ep_by_name(_gadget, "ep3in"); in net2280_match_ep()
1590 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1591 return ep; in net2280_match_ep()
1594 ep = gadget_find_ep_by_name(_gadget, "ep2out"); in net2280_match_ep()
1595 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1596 return ep; in net2280_match_ep()
1597 ep = gadget_find_ep_by_name(_gadget, "ep4out"); in net2280_match_ep()
1598 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1599 return ep; in net2280_match_ep()
1603 snprintf(name, sizeof(name), "ep%d%s", usb_endpoint_num(desc), in net2280_match_ep()
1605 ep = gadget_find_ep_by_name(_gadget, name); in net2280_match_ep()
1606 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1607 return ep; in net2280_match_ep()
1713 /* Configurable EP Control Registers */ in registers_show()
1715 struct net2280_ep *ep; in registers_show() local
1717 ep = &dev->ep[i]; in registers_show()
1718 if (i && !ep->desc) in registers_show()
1721 t1 = readl(&ep->cfg->ep_cfg); in registers_show()
1722 t2 = readl(&ep->regs->ep_rsp) & 0xff; in registers_show()
1726 ep->ep.name, t1, t2, in registers_show()
1743 readl(&ep->regs->ep_irqenb)); in registers_show()
1749 "(ep%d%s-%s)%s\n", in registers_show()
1750 readl(&ep->regs->ep_stat), in registers_show()
1751 readl(&ep->regs->ep_avail), in registers_show()
1754 ep->stopped ? "*" : ""); in registers_show()
1758 if (!ep->dma) in registers_show()
1764 readl(&ep->dma->dmactl), in registers_show()
1765 readl(&ep->dma->dmastat), in registers_show()
1766 readl(&ep->dma->dmacount), in registers_show()
1767 readl(&ep->dma->dmaaddr), in registers_show()
1768 readl(&ep->dma->dmadesc)); in registers_show()
1781 struct net2280_ep *ep; in registers_show() local
1783 ep = &dev->ep[i]; in registers_show()
1784 if (i && !ep->irqs) in registers_show()
1786 t = scnprintf(next, size, " %s/%lu", ep->ep.name, ep->irqs); in registers_show()
1816 struct net2280_ep *ep = &dev->ep[i]; in queues_show() local
1823 d = ep->desc; in queues_show()
1828 "\n%s (ep%d%s-%s) max %04x %s fifo %d\n", in queues_show()
1829 ep->ep.name, t & USB_ENDPOINT_NUMBER_MASK, in queues_show()
1833 ep->dma ? "dma" : "pio", ep->fifo_size in queues_show()
1837 ep->is_in ? "in" : "out"); in queues_show()
1843 if (list_empty(&ep->queue)) { in queues_show()
1851 list_for_each_entry(req, &ep->queue, queue) { in queues_show()
1852 if (ep->dma && req->td_dma == readl(&ep->dma->dmadesc)) in queues_show()
1858 readl(&ep->dma->dmacount)); in queues_show()
1869 if (ep->dma) { in queues_show()
1912 /* always ep-{a,b,e,f} ... maybe not ep-c or ep-d */ in set_fifo_mode()
1914 list_add_tail(&dev->ep[1].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1915 list_add_tail(&dev->ep[2].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1918 list_add_tail(&dev->ep[3].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1919 list_add_tail(&dev->ep[4].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1920 dev->ep[1].fifo_size = dev->ep[2].fifo_size = 1024; in set_fifo_mode()
1923 dev->ep[1].fifo_size = dev->ep[2].fifo_size = 2048; in set_fifo_mode()
1926 list_add_tail(&dev->ep[3].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1927 dev->ep[1].fifo_size = 2048; in set_fifo_mode()
1928 dev->ep[2].fifo_size = 1024; in set_fifo_mode()
1931 /* fifo sizes for ep0, ep-c, ep-d, ep-e, and ep-f never change */ in set_fifo_mode()
1932 list_add_tail(&dev->ep[5].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1933 list_add_tail(&dev->ep[6].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1941 * returing ep regs back to normal. in defect7374_disable_data_eps()
1943 struct net2280_ep *ep; in defect7374_disable_data_eps() local
1949 ep = &dev->ep[i]; in defect7374_disable_data_eps()
1950 writel(i, &ep->cfg->ep_cfg); in defect7374_disable_data_eps()
2001 writel(tmp, &dev->ep[i].cfg->ep_cfg); in defect7374_enable_data_eps_zero()
2073 struct net2280_ep *ep = &dev->ep[tmp + 1]; in usb_reset_228x() local
2074 if (ep->dma) in usb_reset_228x()
2075 abort_dma(ep); in usb_reset_228x()
2111 struct net2280_ep *ep = &dev->ep[tmp + 1]; in usb_reset_338x() local
2114 if (ep->dma) { in usb_reset_338x()
2115 abort_dma(ep); in usb_reset_338x()
2136 /* always ep-{1,2,3,4} ... maybe not ep-3 or ep-4 */ in usb_reset_338x()
2140 list_add_tail(&dev->ep[tmp].ep.ep_list, &dev->gadget.ep_list); in usb_reset_338x()
2157 struct net2280_ep *ep = &dev->ep[tmp]; in usb_reinit_228x() local
2159 ep->ep.name = ep_info_dft[tmp].name; in usb_reinit_228x()
2160 ep->ep.caps = ep_info_dft[tmp].caps; in usb_reinit_228x()
2161 ep->dev = dev; in usb_reinit_228x()
2162 ep->num = tmp; in usb_reinit_228x()
2165 ep->fifo_size = 1024; in usb_reinit_228x()
2166 ep->dma = &dev->dma[tmp - 1]; in usb_reinit_228x()
2168 ep->fifo_size = 64; in usb_reinit_228x()
2169 ep->regs = &dev->epregs[tmp]; in usb_reinit_228x()
2170 ep->cfg = &dev->epregs[tmp]; in usb_reinit_228x()
2171 ep_reset_228x(dev->regs, ep); in usb_reinit_228x()
2173 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, 64); in usb_reinit_228x()
2174 usb_ep_set_maxpacket_limit(&dev->ep[5].ep, 64); in usb_reinit_228x()
2175 usb_ep_set_maxpacket_limit(&dev->ep[6].ep, 64); in usb_reinit_228x()
2177 dev->gadget.ep0 = &dev->ep[0].ep; in usb_reinit_228x()
2178 dev->ep[0].stopped = 0; in usb_reinit_228x()
2198 struct net2280_ep *ep = &dev->ep[i]; in usb_reinit_338x() local
2200 ep->ep.name = dev->enhanced_mode ? ep_info_adv[i].name : in usb_reinit_338x()
2202 ep->ep.caps = dev->enhanced_mode ? ep_info_adv[i].caps : in usb_reinit_338x()
2204 ep->dev = dev; in usb_reinit_338x()
2205 ep->num = i; in usb_reinit_338x()
2208 ep->dma = &dev->dma[i - 1]; in usb_reinit_338x()
2211 ep->cfg = &dev->epregs[ne[i]]; in usb_reinit_338x()
2217 writel(ne[i], &ep->cfg->ep_cfg); in usb_reinit_338x()
2218 ep->regs = (struct net2280_ep_regs __iomem *) in usb_reinit_338x()
2222 ep->cfg = &dev->epregs[i]; in usb_reinit_338x()
2223 ep->regs = &dev->epregs[i]; in usb_reinit_338x()
2226 ep->fifo_size = (i != 0) ? 2048 : 512; in usb_reinit_338x()
2228 ep_reset_338x(dev->regs, ep); in usb_reinit_338x()
2230 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, 512); in usb_reinit_338x()
2232 dev->gadget.ep0 = &dev->ep[0].ep; in usb_reinit_338x()
2233 dev->ep[0].stopped = 0; in usb_reinit_338x()
2423 dev->ep[i].irqs = 0; in net2280_start()
2468 nuke(&dev->ep[i]); in stop_activity()
2512 /* handle ep0, ep-e, ep-f with 64 byte packets: packet per irq.
2516 static void handle_ep_small(struct net2280_ep *ep) in handle_ep_small() argument
2523 if (!list_empty(&ep->queue)) in handle_ep_small()
2524 req = list_entry(ep->queue.next, in handle_ep_small()
2530 t = readl(&ep->regs->ep_stat); in handle_ep_small()
2531 ep->irqs++; in handle_ep_small()
2533 ep_vdbg(ep->dev, "%s ack ep_stat %08x, req %p\n", in handle_ep_small()
2534 ep->ep.name, t, req ? &req->req : NULL); in handle_ep_small()
2536 if (!ep->is_in || (ep->dev->quirks & PLX_2280)) in handle_ep_small()
2537 writel(t & ~BIT(NAK_OUT_PACKETS), &ep->regs->ep_stat); in handle_ep_small()
2540 writel(t, &ep->regs->ep_stat); in handle_ep_small()
2552 if (unlikely(ep->num == 0)) { in handle_ep_small()
2553 if (ep->is_in) { in handle_ep_small()
2556 if (ep->dev->protocol_stall) { in handle_ep_small()
2557 ep->stopped = 1; in handle_ep_small()
2558 set_halt(ep); in handle_ep_small()
2561 allow_status(ep); in handle_ep_small()
2565 if (ep->dev->protocol_stall) { in handle_ep_small()
2566 ep->stopped = 1; in handle_ep_small()
2567 set_halt(ep); in handle_ep_small()
2569 } else if (ep->responded && in handle_ep_small()
2570 !req && !ep->stopped) in handle_ep_small()
2571 write_fifo(ep, NULL); in handle_ep_small()
2576 if (ep->dev->protocol_stall) { in handle_ep_small()
2577 ep->stopped = 1; in handle_ep_small()
2578 set_halt(ep); in handle_ep_small()
2585 (ep->responded && !req)) { in handle_ep_small()
2586 ep->dev->protocol_stall = 1; in handle_ep_small()
2587 set_halt(ep); in handle_ep_small()
2588 ep->stopped = 1; in handle_ep_small()
2590 done(ep, req, -EOVERFLOW); in handle_ep_small()
2600 if (likely(ep->dma)) { in handle_ep_small()
2603 int stopped = ep->stopped; in handle_ep_small()
2612 ep->stopped = 1; in handle_ep_small()
2613 for (count = 0; ; t = readl(&ep->regs->ep_stat)) { in handle_ep_small()
2618 num_completed = scan_dma_completions(ep); in handle_ep_small()
2619 if (unlikely(list_empty(&ep->queue) || in handle_ep_small()
2620 ep->out_overflow)) { in handle_ep_small()
2624 req = list_entry(ep->queue.next, in handle_ep_small()
2631 count = readl(&ep->dma->dmacount); in handle_ep_small()
2633 if (readl(&ep->dma->dmadesc) in handle_ep_small()
2644 readl(&ep->dma->dmadesc) != in handle_ep_small()
2647 &ep->dma->dmacount); in handle_ep_small()
2650 ep_dbg(ep->dev, "%s escape stuck %d, count %u\n", in handle_ep_small()
2651 ep->ep.name, stuck, in handle_ep_small()
2666 /* stop DMA, leave ep NAKing */ in handle_ep_small()
2667 writel(BIT(DMA_ABORT), &ep->dma->dmastat); in handle_ep_small()
2668 spin_stop_dma(ep->dma); in handle_ep_small()
2672 t = readl(&ep->regs->ep_avail); in handle_ep_small()
2673 dma_done(ep, req, count, in handle_ep_small()
2674 (ep->out_overflow || t) in handle_ep_small()
2679 if (unlikely(ep->out_overflow || in handle_ep_small()
2680 (ep->dev->chiprev == 0x0100 && in handle_ep_small()
2681 ep->dev->gadget.speed in handle_ep_small()
2683 out_flush(ep); in handle_ep_small()
2684 ep->out_overflow = 0; in handle_ep_small()
2688 ep->stopped = stopped; in handle_ep_small()
2689 if (!list_empty(&ep->queue)) in handle_ep_small()
2690 restart_dma(ep); in handle_ep_small()
2692 ep_dbg(ep->dev, "%s dma ep_stat %08x ??\n", in handle_ep_small()
2693 ep->ep.name, t); in handle_ep_small()
2698 if (read_fifo(ep, req) && ep->num != 0) in handle_ep_small()
2706 if (len > ep->ep.maxpacket) in handle_ep_small()
2707 len = ep->ep.maxpacket; in handle_ep_small()
2713 (!req->req.zero || len != ep->ep.maxpacket) && ep->num) in handle_ep_small()
2723 done(ep, req, 0); in handle_ep_small()
2726 if (ep->num == 0) { in handle_ep_small()
2731 if (!ep->stopped) in handle_ep_small()
2732 allow_status(ep); in handle_ep_small()
2735 if (!list_empty(&ep->queue) && !ep->stopped) in handle_ep_small()
2736 req = list_entry(ep->queue.next, in handle_ep_small()
2740 if (req && !ep->is_in) in handle_ep_small()
2741 stop_out_naking(ep); in handle_ep_small()
2748 if (req && !ep->stopped) { in handle_ep_small()
2752 write_fifo(ep, &req->req); in handle_ep_small()
2758 struct net2280_ep *ep; in get_ep_by_addr() local
2761 return &dev->ep[0]; in get_ep_by_addr()
2762 list_for_each_entry(ep, &dev->gadget.ep_list, ep.ep_list) { in get_ep_by_addr()
2765 if (!ep->desc) in get_ep_by_addr()
2767 bEndpointAddress = ep->desc->bEndpointAddress; in get_ep_by_addr()
2771 return ep; in get_ep_by_addr()
2848 static void ep_clear_seqnum(struct net2280_ep *ep) in ep_clear_seqnum() argument
2850 struct net2280 *dev = ep->dev; in ep_clear_seqnum()
2855 val |= ep_pl[ep->num]; in ep_clear_seqnum()
2864 struct net2280_ep *ep, struct usb_ctrlrequest r) in handle_stat0_irqs_superspeed() argument
2888 set_fifo_bytecount(ep, sizeof(status)); in handle_stat0_irqs_superspeed()
2890 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2900 set_fifo_bytecount(ep, sizeof(status)); in handle_stat0_irqs_superspeed()
2902 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2920 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2928 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2936 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2948 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2959 ep_vdbg(dev, "%s clear halt\n", e->ep.name); in handle_stat0_irqs_superspeed()
2968 allow_status(ep); in handle_stat0_irqs_superspeed()
2969 ep->stopped = 1; in handle_stat0_irqs_superspeed()
2986 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2994 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
3002 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
3014 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
3023 ep->stopped = 1; in handle_stat0_irqs_superspeed()
3024 if (ep->num == 0) in handle_stat0_irqs_superspeed()
3025 ep->dev->protocol_stall = 1; in handle_stat0_irqs_superspeed()
3027 if (ep->dma) in handle_stat0_irqs_superspeed()
3028 abort_dma(ep); in handle_stat0_irqs_superspeed()
3029 set_halt(ep); in handle_stat0_irqs_superspeed()
3031 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
3045 readl(&ep->cfg->ep_cfg)); in handle_stat0_irqs_superspeed()
3047 ep->responded = 0; in handle_stat0_irqs_superspeed()
3060 set_halt(ep); in handle_stat0_irqs_superspeed()
3088 handle_ep_small(&dev->ep[index]); in usb338x_handle_ep_intr()
3094 struct net2280_ep *ep; in handle_stat0_irqs() local
3116 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, in handle_stat0_irqs()
3120 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, in handle_stat0_irqs()
3124 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, in handle_stat0_irqs()
3132 ep = &dev->ep[0]; in handle_stat0_irqs()
3133 ep->irqs++; in handle_stat0_irqs()
3137 while (!list_empty(&ep->queue)) { in handle_stat0_irqs()
3138 req = list_entry(ep->queue.next, in handle_stat0_irqs()
3140 done(ep, req, (req->req.actual == req->req.length) in handle_stat0_irqs()
3143 ep->stopped = 0; in handle_stat0_irqs()
3146 if (ep->dev->quirks & PLX_2280) in handle_stat0_irqs()
3164 &ep->regs->ep_stat); in handle_stat0_irqs()
3190 ep->is_in = (u.r.bRequestType & USB_DIR_IN) != 0; in handle_stat0_irqs()
3191 if (ep->is_in) { in handle_stat0_irqs()
3195 stop_out_naking(ep); in handle_stat0_irqs()
3205 ep->responded = 1; in handle_stat0_irqs()
3208 handle_stat0_irqs_superspeed(dev, ep, u.r); in handle_stat0_irqs()
3231 set_fifo_bytecount(ep, w_length); in handle_stat0_irqs()
3233 allow_status(ep); in handle_stat0_irqs()
3234 ep_vdbg(dev, "%s stat %02x\n", ep->ep.name, status); in handle_stat0_irqs()
3251 ep->ep.name); in handle_stat0_irqs()
3253 ep_vdbg(dev, "%s clear halt\n", e->ep.name); in handle_stat0_irqs()
3255 if ((ep->dev->quirks & PLX_PCIE) && in handle_stat0_irqs()
3259 allow_status(ep); in handle_stat0_irqs()
3274 if (e->ep.name == ep0name) in handle_stat0_irqs()
3279 allow_status(ep); in handle_stat0_irqs()
3280 ep_vdbg(dev, "%s set halt\n", ep->ep.name); in handle_stat0_irqs()
3290 readl(&ep->cfg->ep_cfg)); in handle_stat0_irqs()
3291 ep->responded = 0; in handle_stat0_irqs()
3340 ep = &dev->ep[num]; in handle_stat0_irqs()
3341 handle_ep_small(ep); in handle_stat0_irqs()
3362 struct net2280_ep *ep; in handle_stat1_irqs() local
3462 /* DMA status, for ep-{a,b,c,d} */ in handle_stat1_irqs()
3474 ep = &dev->ep[num + 1]; in handle_stat1_irqs()
3475 dma = ep->dma; in handle_stat1_irqs()
3480 /* clear ep's dma status */ in handle_stat1_irqs()
3487 if (!ep->is_in && (r_dmacount & 0x00FFFFFF) && in handle_stat1_irqs()
3493 ep_dbg(ep->dev, "%s no xact done? %08x\n", in handle_stat1_irqs()
3494 ep->ep.name, tmp); in handle_stat1_irqs()
3497 stop_dma(ep->dma); in handle_stat1_irqs()
3509 scan_dma_completions(ep); in handle_stat1_irqs()
3512 if (!list_empty(&ep->queue)) { in handle_stat1_irqs()
3514 restart_dma(ep); in handle_stat1_irqs()
3516 ep->irqs++; in handle_stat1_irqs()
3590 if (!dev->ep[i].dummy) in net2280_remove()
3592 dma_pool_free(dev->requests, dev->ep[i].dummy, in net2280_remove()
3593 dev->ep[i].td_dma); in net2280_remove()
3748 &dev->ep[i].td_dma); in net2280_probe()
3756 dev->ep[i].dummy = td; in net2280_probe()