Lines Matching refs:ep
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()
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()
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()
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()
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
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()
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()
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()
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
939 end = ep->dummy; in queue_dma()
940 ep->dummy = req->td; in queue_dma()
943 tmp = ep->td_dma; in queue_dma()
944 ep->td_dma = req->td_dma; in queue_dma()
947 end->dmadesc = cpu_to_le32 (ep->td_dma); in queue_dma()
949 fill_dma_desc(ep, req, valid); in queue_dma()
953 done(struct net2280_ep *ep, struct net2280_request *req, int status) in done() argument
956 unsigned stopped = ep->stopped; in done()
965 dev = ep->dev; in done()
966 if (ep->dma) in done()
967 usb_gadget_unmap_request(&dev->gadget, &req->req, ep->is_in); in done()
971 ep->ep.name, &req->req, status, in done()
975 ep->stopped = 1; in done()
977 usb_gadget_giveback_request(&ep->ep, &req->req); in done()
979 ep->stopped = stopped; in done()
988 struct net2280_ep *ep; in net2280_queue() local
996 ep = container_of(_ep, struct net2280_ep, ep); in net2280_queue()
997 if (!_ep || (!ep->desc && ep->num != 0)) { in net2280_queue()
1011 dev = ep->dev; in net2280_queue()
1018 if (ep->dma && _req->length == 0) { in net2280_queue()
1024 if (ep->dma) { in net2280_queue()
1026 ep->is_in); in net2280_queue()
1040 if (list_empty(&ep->queue) && !ep->stopped && in net2280_queue()
1041 !((dev->quirks & PLX_PCIE) && ep->dma && in net2280_queue()
1042 (readl(&ep->regs->ep_rsp) & BIT(CLEAR_ENDPOINT_HALT)))) { in net2280_queue()
1045 if (ep->dma) in net2280_queue()
1046 start_dma(ep, req); in net2280_queue()
1049 if (ep->num == 0 && _req->length == 0) { in net2280_queue()
1050 allow_status(ep); in net2280_queue()
1051 done(ep, req, 0); in net2280_queue()
1052 ep_vdbg(dev, "%s status ack\n", ep->ep.name); in net2280_queue()
1057 if (ep->is_in) in net2280_queue()
1058 write_fifo(ep, _req); in net2280_queue()
1063 s = readl(&ep->regs->ep_stat); in net2280_queue()
1071 if (read_fifo(ep, req) && in net2280_queue()
1072 ep->num == 0) { in net2280_queue()
1073 done(ep, req, 0); in net2280_queue()
1074 allow_status(ep); in net2280_queue()
1077 } else if (read_fifo(ep, req) && in net2280_queue()
1078 ep->num != 0) { in net2280_queue()
1079 done(ep, req, 0); in net2280_queue()
1082 s = readl(&ep->regs->ep_stat); in net2280_queue()
1088 &ep->regs->ep_rsp); in net2280_queue()
1092 } else if (ep->dma) { in net2280_queue()
1095 if (ep->is_in) { in net2280_queue()
1102 (req->req.length % ep->ep.maxpacket)); in net2280_queue()
1103 if (expect != ep->in_fifo_validate) in net2280_queue()
1106 queue_dma(ep, req, valid); in net2280_queue()
1110 ep->responded = 1; in net2280_queue()
1112 list_add_tail(&req->queue, &ep->queue); in net2280_queue()
1120 dev_err(&ep->dev->pdev->dev, "%s: error=%d\n", __func__, ret); in net2280_queue()
1125 dma_done(struct net2280_ep *ep, struct net2280_request *req, u32 dmacount, in dma_done() argument
1129 done(ep, req, status); in dma_done()
1132 static int scan_dma_completions(struct net2280_ep *ep) in scan_dma_completions() argument
1139 while (!list_empty(&ep->queue)) { in scan_dma_completions()
1143 req = list_entry(ep->queue.next, in scan_dma_completions()
1158 u32 const ep_dmacount = readl(&ep->dma->dmacount); in scan_dma_completions()
1163 dma_done(ep, req, req_dma_count, 0); in scan_dma_completions()
1166 } else if (!ep->is_in && in scan_dma_completions()
1167 (req->req.length % ep->ep.maxpacket) && in scan_dma_completions()
1168 !(ep->dev->quirks & PLX_PCIE)) { in scan_dma_completions()
1170 u32 const ep_stat = readl(&ep->regs->ep_stat); in scan_dma_completions()
1176 ep_warn(ep->dev, "%s lost packet sync!\n", in scan_dma_completions()
1177 ep->ep.name); in scan_dma_completions()
1180 u32 const ep_avail = readl(&ep->regs->ep_avail); in scan_dma_completions()
1183 ep->out_overflow = 1; in scan_dma_completions()
1184 ep_dbg(ep->dev, in scan_dma_completions()
1186 ep->ep.name, ep_avail, in scan_dma_completions()
1192 dma_done(ep, req, req_dma_count, 0); in scan_dma_completions()
1199 static void restart_dma(struct net2280_ep *ep) in restart_dma() argument
1203 if (ep->stopped) in restart_dma()
1205 req = list_entry(ep->queue.next, struct net2280_request, queue); in restart_dma()
1207 start_dma(ep, req); in restart_dma()
1210 static void abort_dma(struct net2280_ep *ep) in abort_dma() argument
1213 if (likely(!list_empty(&ep->queue))) { in abort_dma()
1215 writel(BIT(DMA_ABORT), &ep->dma->dmastat); in abort_dma()
1216 spin_stop_dma(ep->dma); in abort_dma()
1218 stop_dma(ep->dma); in abort_dma()
1219 scan_dma_completions(ep); in abort_dma()
1223 static void nuke(struct net2280_ep *ep) in nuke() argument
1228 ep->stopped = 1; in nuke()
1229 if (ep->dma) in nuke()
1230 abort_dma(ep); in nuke()
1231 while (!list_empty(&ep->queue)) { in nuke()
1232 req = list_entry(ep->queue.next, in nuke()
1235 done(ep, req, -ESHUTDOWN); in nuke()
1242 struct net2280_ep *ep; in net2280_dequeue() local
1248 ep = container_of(_ep, struct net2280_ep, ep); in net2280_dequeue()
1249 if (!_ep || (!ep->desc && ep->num != 0) || !_req) { in net2280_dequeue()
1255 spin_lock_irqsave(&ep->dev->lock, flags); in net2280_dequeue()
1256 stopped = ep->stopped; in net2280_dequeue()
1260 ep->stopped = 1; in net2280_dequeue()
1261 if (ep->dma) { in net2280_dequeue()
1262 dmactl = readl(&ep->dma->dmactl); in net2280_dequeue()
1264 stop_dma(ep->dma); in net2280_dequeue()
1265 scan_dma_completions(ep); in net2280_dequeue()
1269 list_for_each_entry(req, &ep->queue, queue) { in net2280_dequeue()
1274 ep->stopped = stopped; in net2280_dequeue()
1275 spin_unlock_irqrestore(&ep->dev->lock, flags); in net2280_dequeue()
1276 ep_dbg(ep->dev, "%s: Request mismatch\n", __func__); in net2280_dequeue()
1281 if (ep->queue.next == &req->queue) { in net2280_dequeue()
1282 if (ep->dma) { in net2280_dequeue()
1283 ep_dbg(ep->dev, "unlink (%s) dma\n", _ep->name); in net2280_dequeue()
1285 abort_dma(ep); in net2280_dequeue()
1286 if (likely(ep->queue.next == &req->queue)) { in net2280_dequeue()
1289 dma_done(ep, req, in net2280_dequeue()
1290 readl(&ep->dma->dmacount), in net2280_dequeue()
1294 ep_dbg(ep->dev, "unlink (%s) pio\n", _ep->name); in net2280_dequeue()
1295 done(ep, req, -ECONNRESET); in net2280_dequeue()
1301 done(ep, req, -ECONNRESET); in net2280_dequeue()
1302 ep->stopped = stopped; in net2280_dequeue()
1304 if (ep->dma) { in net2280_dequeue()
1306 if (list_empty(&ep->queue)) in net2280_dequeue()
1307 stop_dma(ep->dma); in net2280_dequeue()
1308 else if (!ep->stopped) { in net2280_dequeue()
1311 writel(dmactl, &ep->dma->dmactl); in net2280_dequeue()
1313 start_dma(ep, list_entry(ep->queue.next, in net2280_dequeue()
1318 spin_unlock_irqrestore(&ep->dev->lock, flags); in net2280_dequeue()
1329 struct net2280_ep *ep; in net2280_set_halt_and_wedge() local
1333 ep = container_of(_ep, struct net2280_ep, ep); in net2280_set_halt_and_wedge()
1334 if (!_ep || (!ep->desc && ep->num != 0)) { in net2280_set_halt_and_wedge()
1338 if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN) { in net2280_set_halt_and_wedge()
1342 if (ep->desc /* not ep0 */ && (ep->desc->bmAttributes & 0x03) in net2280_set_halt_and_wedge()
1348 spin_lock_irqsave(&ep->dev->lock, flags); in net2280_set_halt_and_wedge()
1349 if (!list_empty(&ep->queue)) { in net2280_set_halt_and_wedge()
1352 } else if (ep->is_in && value && net2280_fifo_status(_ep) != 0) { in net2280_set_halt_and_wedge()
1356 ep_vdbg(ep->dev, "%s %s %s\n", _ep->name, in net2280_set_halt_and_wedge()
1361 if (ep->num == 0) in net2280_set_halt_and_wedge()
1362 ep->dev->protocol_stall = 1; in net2280_set_halt_and_wedge()
1364 set_halt(ep); in net2280_set_halt_and_wedge()
1366 ep->wedged = 1; in net2280_set_halt_and_wedge()
1368 clear_halt(ep); in net2280_set_halt_and_wedge()
1369 if (ep->dev->quirks & PLX_PCIE && in net2280_set_halt_and_wedge()
1370 !list_empty(&ep->queue) && ep->td_dma) in net2280_set_halt_and_wedge()
1371 restart_dma(ep); in net2280_set_halt_and_wedge()
1372 ep->wedged = 0; in net2280_set_halt_and_wedge()
1374 (void) readl(&ep->regs->ep_rsp); in net2280_set_halt_and_wedge()
1376 spin_unlock_irqrestore(&ep->dev->lock, flags); in net2280_set_halt_and_wedge()
1381 spin_unlock_irqrestore(&ep->dev->lock, flags); in net2280_set_halt_and_wedge()
1383 dev_err(&ep->dev->pdev->dev, "%s: error=%d\n", __func__, retval); in net2280_set_halt_and_wedge()
1403 struct net2280_ep *ep; in net2280_fifo_status() local
1406 ep = container_of(_ep, struct net2280_ep, ep); in net2280_fifo_status()
1407 if (!_ep || (!ep->desc && ep->num != 0)) { in net2280_fifo_status()
1411 if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN) { in net2280_fifo_status()
1412 dev_err(&ep->dev->pdev->dev, in net2280_fifo_status()
1414 __func__, ep->dev->driver, ep->dev->gadget.speed); in net2280_fifo_status()
1418 avail = readl(&ep->regs->ep_avail) & (BIT(12) - 1); in net2280_fifo_status()
1419 if (avail > ep->fifo_size) { in net2280_fifo_status()
1420 dev_err(&ep->dev->pdev->dev, "%s: Fifo overflow\n", __func__); in net2280_fifo_status()
1423 if (ep->is_in) in net2280_fifo_status()
1424 avail = ep->fifo_size - avail; in net2280_fifo_status()
1430 struct net2280_ep *ep; in net2280_fifo_flush() local
1432 ep = container_of(_ep, struct net2280_ep, ep); in net2280_fifo_flush()
1433 if (!_ep || (!ep->desc && ep->num != 0)) { in net2280_fifo_flush()
1437 if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN) { in net2280_fifo_flush()
1438 dev_err(&ep->dev->pdev->dev, in net2280_fifo_flush()
1440 __func__, ep->dev->driver, ep->dev->gadget.speed); in net2280_fifo_flush()
1444 writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat); in net2280_fifo_flush()
1445 (void) readl(&ep->regs->ep_rsp); in net2280_fifo_flush()
1557 struct usb_ep *ep; in net2280_match_ep() local
1561 ep = gadget_find_ep_by_name(_gadget, "ep-e"); in net2280_match_ep()
1562 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1563 return ep; in net2280_match_ep()
1564 ep = gadget_find_ep_by_name(_gadget, "ep-f"); in net2280_match_ep()
1565 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1566 return ep; in net2280_match_ep()
1575 ep = gadget_find_ep_by_name(_gadget, "ep2in"); in net2280_match_ep()
1576 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1577 return ep; in net2280_match_ep()
1578 ep = gadget_find_ep_by_name(_gadget, "ep4in"); 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()
1583 ep = gadget_find_ep_by_name(_gadget, "ep1out"); in net2280_match_ep()
1584 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1585 return ep; in net2280_match_ep()
1586 ep = gadget_find_ep_by_name(_gadget, "ep3out"); 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()
1591 ep = gadget_find_ep_by_name(_gadget, "ep1in"); in net2280_match_ep()
1592 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1593 return ep; in net2280_match_ep()
1594 ep = gadget_find_ep_by_name(_gadget, "ep3in"); 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()
1599 ep = gadget_find_ep_by_name(_gadget, "ep2out"); in net2280_match_ep()
1600 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1601 return ep; in net2280_match_ep()
1602 ep = gadget_find_ep_by_name(_gadget, "ep4out"); in net2280_match_ep()
1603 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1604 return ep; in net2280_match_ep()
1610 ep = gadget_find_ep_by_name(_gadget, name); in net2280_match_ep()
1611 if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp)) in net2280_match_ep()
1612 return ep; in net2280_match_ep()
1718 struct net2280_ep *ep; in registers_show() local
1720 ep = &dev->ep[i]; in registers_show()
1721 if (i && !ep->desc) in registers_show()
1724 t1 = readl(&ep->cfg->ep_cfg); in registers_show()
1725 t2 = readl(&ep->regs->ep_rsp) & 0xff; in registers_show()
1729 ep->ep.name, t1, t2, in registers_show()
1746 readl(&ep->regs->ep_irqenb)); in registers_show()
1753 readl(&ep->regs->ep_stat), in registers_show()
1754 readl(&ep->regs->ep_avail), in registers_show()
1757 ep->stopped ? "*" : ""); in registers_show()
1761 if (!ep->dma) in registers_show()
1767 readl(&ep->dma->dmactl), in registers_show()
1768 readl(&ep->dma->dmastat), in registers_show()
1769 readl(&ep->dma->dmacount), in registers_show()
1770 readl(&ep->dma->dmaaddr), in registers_show()
1771 readl(&ep->dma->dmadesc)); in registers_show()
1784 struct net2280_ep *ep; in registers_show() local
1786 ep = &dev->ep[i]; in registers_show()
1787 if (i && !ep->irqs) in registers_show()
1789 t = scnprintf(next, size, " %s/%lu", ep->ep.name, ep->irqs); in registers_show()
1819 struct net2280_ep *ep = &dev->ep[i]; in queues_show() local
1826 d = ep->desc; in queues_show()
1832 ep->ep.name, t & USB_ENDPOINT_NUMBER_MASK, in queues_show()
1836 ep->dma ? "dma" : "pio", ep->fifo_size in queues_show()
1840 ep->is_in ? "in" : "out"); in queues_show()
1846 if (list_empty(&ep->queue)) { in queues_show()
1854 list_for_each_entry(req, &ep->queue, queue) { in queues_show()
1855 if (ep->dma && req->td_dma == readl(&ep->dma->dmadesc)) in queues_show()
1861 readl(&ep->dma->dmacount)); in queues_show()
1872 if (ep->dma) { in queues_show()
1917 list_add_tail(&dev->ep[1].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1918 list_add_tail(&dev->ep[2].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1921 list_add_tail(&dev->ep[3].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1922 list_add_tail(&dev->ep[4].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1923 dev->ep[1].fifo_size = dev->ep[2].fifo_size = 1024; in set_fifo_mode()
1926 dev->ep[1].fifo_size = dev->ep[2].fifo_size = 2048; in set_fifo_mode()
1929 list_add_tail(&dev->ep[3].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1930 dev->ep[1].fifo_size = 2048; in set_fifo_mode()
1931 dev->ep[2].fifo_size = 1024; in set_fifo_mode()
1935 list_add_tail(&dev->ep[5].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1936 list_add_tail(&dev->ep[6].ep.ep_list, &dev->gadget.ep_list); in set_fifo_mode()
1946 struct net2280_ep *ep; in defect7374_disable_data_eps() local
1952 ep = &dev->ep[i]; in defect7374_disable_data_eps()
1953 writel(i, &ep->cfg->ep_cfg); in defect7374_disable_data_eps()
2004 writel(tmp, &dev->ep[i].cfg->ep_cfg); in defect7374_enable_data_eps_zero()
2076 struct net2280_ep *ep = &dev->ep[tmp + 1]; in usb_reset_228x() local
2077 if (ep->dma) in usb_reset_228x()
2078 abort_dma(ep); in usb_reset_228x()
2114 struct net2280_ep *ep = &dev->ep[tmp + 1]; in usb_reset_338x() local
2117 if (ep->dma) { in usb_reset_338x()
2118 abort_dma(ep); in usb_reset_338x()
2143 list_add_tail(&dev->ep[tmp].ep.ep_list, &dev->gadget.ep_list); in usb_reset_338x()
2160 struct net2280_ep *ep = &dev->ep[tmp]; in usb_reinit_228x() local
2162 ep->ep.name = ep_info_dft[tmp].name; in usb_reinit_228x()
2163 ep->ep.caps = ep_info_dft[tmp].caps; in usb_reinit_228x()
2164 ep->dev = dev; in usb_reinit_228x()
2165 ep->num = tmp; in usb_reinit_228x()
2168 ep->fifo_size = 1024; in usb_reinit_228x()
2169 ep->dma = &dev->dma[tmp - 1]; in usb_reinit_228x()
2171 ep->fifo_size = 64; in usb_reinit_228x()
2172 ep->regs = &dev->epregs[tmp]; in usb_reinit_228x()
2173 ep->cfg = &dev->epregs[tmp]; in usb_reinit_228x()
2174 ep_reset_228x(dev->regs, ep); in usb_reinit_228x()
2176 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, 64); in usb_reinit_228x()
2177 usb_ep_set_maxpacket_limit(&dev->ep[5].ep, 64); in usb_reinit_228x()
2178 usb_ep_set_maxpacket_limit(&dev->ep[6].ep, 64); in usb_reinit_228x()
2180 dev->gadget.ep0 = &dev->ep[0].ep; in usb_reinit_228x()
2181 dev->ep[0].stopped = 0; in usb_reinit_228x()
2201 struct net2280_ep *ep = &dev->ep[i]; in usb_reinit_338x() local
2203 ep->ep.name = dev->enhanced_mode ? ep_info_adv[i].name : in usb_reinit_338x()
2205 ep->ep.caps = dev->enhanced_mode ? ep_info_adv[i].caps : in usb_reinit_338x()
2207 ep->dev = dev; in usb_reinit_338x()
2208 ep->num = i; in usb_reinit_338x()
2211 ep->dma = &dev->dma[i - 1]; in usb_reinit_338x()
2214 ep->cfg = &dev->epregs[ne[i]]; in usb_reinit_338x()
2220 writel(ne[i], &ep->cfg->ep_cfg); in usb_reinit_338x()
2221 ep->regs = (struct net2280_ep_regs __iomem *) in usb_reinit_338x()
2225 ep->cfg = &dev->epregs[i]; in usb_reinit_338x()
2226 ep->regs = &dev->epregs[i]; in usb_reinit_338x()
2229 ep->fifo_size = (i != 0) ? 2048 : 512; in usb_reinit_338x()
2231 ep_reset_338x(dev->regs, ep); in usb_reinit_338x()
2233 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, 512); in usb_reinit_338x()
2235 dev->gadget.ep0 = &dev->ep[0].ep; in usb_reinit_338x()
2236 dev->ep[0].stopped = 0; in usb_reinit_338x()
2426 dev->ep[i].irqs = 0; in net2280_start()
2472 nuke(&dev->ep[i]); in stop_activity()
2511 static void handle_ep_small(struct net2280_ep *ep) in handle_ep_small() argument
2518 if (!list_empty(&ep->queue)) in handle_ep_small()
2519 req = list_entry(ep->queue.next, in handle_ep_small()
2525 t = readl(&ep->regs->ep_stat); in handle_ep_small()
2526 ep->irqs++; in handle_ep_small()
2528 ep_vdbg(ep->dev, "%s ack ep_stat %08x, req %p\n", in handle_ep_small()
2529 ep->ep.name, t, req ? &req->req : NULL); in handle_ep_small()
2531 if (!ep->is_in || (ep->dev->quirks & PLX_2280)) in handle_ep_small()
2532 writel(t & ~BIT(NAK_OUT_PACKETS), &ep->regs->ep_stat); in handle_ep_small()
2535 writel(t, &ep->regs->ep_stat); in handle_ep_small()
2547 if (unlikely(ep->num == 0)) { in handle_ep_small()
2548 if (ep->is_in) { in handle_ep_small()
2551 if (ep->dev->protocol_stall) { in handle_ep_small()
2552 ep->stopped = 1; in handle_ep_small()
2553 set_halt(ep); in handle_ep_small()
2556 allow_status(ep); in handle_ep_small()
2560 if (ep->dev->protocol_stall) { in handle_ep_small()
2561 ep->stopped = 1; in handle_ep_small()
2562 set_halt(ep); in handle_ep_small()
2564 } else if (ep->responded && in handle_ep_small()
2565 !req && !ep->stopped) in handle_ep_small()
2566 write_fifo(ep, NULL); in handle_ep_small()
2571 if (ep->dev->protocol_stall) { in handle_ep_small()
2572 ep->stopped = 1; in handle_ep_small()
2573 set_halt(ep); in handle_ep_small()
2580 (ep->responded && !req)) { in handle_ep_small()
2581 ep->dev->protocol_stall = 1; in handle_ep_small()
2582 set_halt(ep); in handle_ep_small()
2583 ep->stopped = 1; in handle_ep_small()
2585 done(ep, req, -EOVERFLOW); in handle_ep_small()
2595 if (likely(ep->dma)) { in handle_ep_small()
2598 int stopped = ep->stopped; in handle_ep_small()
2607 ep->stopped = 1; in handle_ep_small()
2608 for (count = 0; ; t = readl(&ep->regs->ep_stat)) { in handle_ep_small()
2613 num_completed = scan_dma_completions(ep); in handle_ep_small()
2614 if (unlikely(list_empty(&ep->queue) || in handle_ep_small()
2615 ep->out_overflow)) { in handle_ep_small()
2619 req = list_entry(ep->queue.next, in handle_ep_small()
2626 count = readl(&ep->dma->dmacount); in handle_ep_small()
2628 if (readl(&ep->dma->dmadesc) in handle_ep_small()
2639 readl(&ep->dma->dmadesc) != in handle_ep_small()
2642 &ep->dma->dmacount); in handle_ep_small()
2645 ep_dbg(ep->dev, "%s escape stuck %d, count %u\n", in handle_ep_small()
2646 ep->ep.name, stuck, in handle_ep_small()
2662 writel(BIT(DMA_ABORT), &ep->dma->dmastat); in handle_ep_small()
2663 spin_stop_dma(ep->dma); in handle_ep_small()
2667 t = readl(&ep->regs->ep_avail); in handle_ep_small()
2668 dma_done(ep, req, count, in handle_ep_small()
2669 (ep->out_overflow || t) in handle_ep_small()
2674 if (unlikely(ep->out_overflow || in handle_ep_small()
2675 (ep->dev->chiprev == 0x0100 && in handle_ep_small()
2676 ep->dev->gadget.speed in handle_ep_small()
2678 out_flush(ep); in handle_ep_small()
2679 ep->out_overflow = 0; in handle_ep_small()
2683 ep->stopped = stopped; in handle_ep_small()
2684 if (!list_empty(&ep->queue)) in handle_ep_small()
2685 restart_dma(ep); in handle_ep_small()
2687 ep_dbg(ep->dev, "%s dma ep_stat %08x ??\n", in handle_ep_small()
2688 ep->ep.name, t); in handle_ep_small()
2693 if (read_fifo(ep, req) && ep->num != 0) in handle_ep_small()
2701 if (len > ep->ep.maxpacket) in handle_ep_small()
2702 len = ep->ep.maxpacket; in handle_ep_small()
2708 (!req->req.zero || len != ep->ep.maxpacket) && ep->num) in handle_ep_small()
2718 done(ep, req, 0); in handle_ep_small()
2721 if (ep->num == 0) { in handle_ep_small()
2726 if (!ep->stopped) in handle_ep_small()
2727 allow_status(ep); in handle_ep_small()
2730 if (!list_empty(&ep->queue) && !ep->stopped) in handle_ep_small()
2731 req = list_entry(ep->queue.next, in handle_ep_small()
2735 if (req && !ep->is_in) in handle_ep_small()
2736 stop_out_naking(ep); in handle_ep_small()
2743 if (req && !ep->stopped) { in handle_ep_small()
2747 write_fifo(ep, &req->req); in handle_ep_small()
2753 struct net2280_ep *ep; in get_ep_by_addr() local
2756 return &dev->ep[0]; in get_ep_by_addr()
2757 list_for_each_entry(ep, &dev->gadget.ep_list, ep.ep_list) { in get_ep_by_addr()
2760 if (!ep->desc) in get_ep_by_addr()
2762 bEndpointAddress = ep->desc->bEndpointAddress; in get_ep_by_addr()
2766 return ep; in get_ep_by_addr()
2845 static void ep_clear_seqnum(struct net2280_ep *ep) in ep_clear_seqnum() argument
2847 struct net2280 *dev = ep->dev; in ep_clear_seqnum()
2852 val |= ep_pl[ep->num]; in ep_clear_seqnum()
2861 struct net2280_ep *ep, struct usb_ctrlrequest r) in handle_stat0_irqs_superspeed() argument
2885 set_fifo_bytecount(ep, sizeof(status)); in handle_stat0_irqs_superspeed()
2887 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2897 set_fifo_bytecount(ep, sizeof(status)); in handle_stat0_irqs_superspeed()
2899 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2917 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2925 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2933 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2945 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2956 ep_vdbg(dev, "%s clear halt\n", e->ep.name); in handle_stat0_irqs_superspeed()
2965 allow_status(ep); in handle_stat0_irqs_superspeed()
2966 ep->stopped = 1; in handle_stat0_irqs_superspeed()
2983 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2991 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
2999 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
3011 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
3020 ep->stopped = 1; in handle_stat0_irqs_superspeed()
3021 if (ep->num == 0) in handle_stat0_irqs_superspeed()
3022 ep->dev->protocol_stall = 1; in handle_stat0_irqs_superspeed()
3024 if (ep->dma) in handle_stat0_irqs_superspeed()
3025 abort_dma(ep); in handle_stat0_irqs_superspeed()
3026 set_halt(ep); in handle_stat0_irqs_superspeed()
3028 allow_status_338x(ep); in handle_stat0_irqs_superspeed()
3042 readl(&ep->cfg->ep_cfg)); in handle_stat0_irqs_superspeed()
3044 ep->responded = 0; in handle_stat0_irqs_superspeed()
3055 set_halt(ep); in handle_stat0_irqs_superspeed()
3083 handle_ep_small(&dev->ep[index]); in usb338x_handle_ep_intr()
3089 struct net2280_ep *ep; in handle_stat0_irqs() local
3111 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, in handle_stat0_irqs()
3115 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, in handle_stat0_irqs()
3119 usb_ep_set_maxpacket_limit(&dev->ep[0].ep, in handle_stat0_irqs()
3127 ep = &dev->ep[0]; in handle_stat0_irqs()
3128 ep->irqs++; in handle_stat0_irqs()
3132 while (!list_empty(&ep->queue)) { in handle_stat0_irqs()
3133 req = list_entry(ep->queue.next, in handle_stat0_irqs()
3135 done(ep, req, (req->req.actual == req->req.length) in handle_stat0_irqs()
3138 ep->stopped = 0; in handle_stat0_irqs()
3141 if (ep->dev->quirks & PLX_2280) in handle_stat0_irqs()
3159 &ep->regs->ep_stat); in handle_stat0_irqs()
3185 ep->is_in = (u.r.bRequestType & USB_DIR_IN) != 0; in handle_stat0_irqs()
3186 if (ep->is_in) { in handle_stat0_irqs()
3190 stop_out_naking(ep); in handle_stat0_irqs()
3200 ep->responded = 1; in handle_stat0_irqs()
3203 handle_stat0_irqs_superspeed(dev, ep, u.r); in handle_stat0_irqs()
3226 set_fifo_bytecount(ep, w_length); in handle_stat0_irqs()
3228 allow_status(ep); in handle_stat0_irqs()
3229 ep_vdbg(dev, "%s stat %02x\n", ep->ep.name, status); in handle_stat0_irqs()
3246 ep->ep.name); in handle_stat0_irqs()
3248 ep_vdbg(dev, "%s clear halt\n", e->ep.name); in handle_stat0_irqs()
3250 if ((ep->dev->quirks & PLX_PCIE) && in handle_stat0_irqs()
3254 allow_status(ep); in handle_stat0_irqs()
3269 if (e->ep.name == ep0name) in handle_stat0_irqs()
3274 allow_status(ep); in handle_stat0_irqs()
3275 ep_vdbg(dev, "%s set halt\n", ep->ep.name); in handle_stat0_irqs()
3285 readl(&ep->cfg->ep_cfg)); in handle_stat0_irqs()
3286 ep->responded = 0; in handle_stat0_irqs()
3333 ep = &dev->ep[num]; in handle_stat0_irqs()
3334 handle_ep_small(ep); in handle_stat0_irqs()
3355 struct net2280_ep *ep; in handle_stat1_irqs() local
3467 ep = &dev->ep[num + 1]; in handle_stat1_irqs()
3468 dma = ep->dma; in handle_stat1_irqs()
3480 if (!ep->is_in && (r_dmacount & 0x00FFFFFF) && in handle_stat1_irqs()
3486 ep_dbg(ep->dev, "%s no xact done? %08x\n", in handle_stat1_irqs()
3487 ep->ep.name, tmp); in handle_stat1_irqs()
3490 stop_dma(ep->dma); in handle_stat1_irqs()
3502 scan_dma_completions(ep); in handle_stat1_irqs()
3505 if (!list_empty(&ep->queue)) { in handle_stat1_irqs()
3507 restart_dma(ep); in handle_stat1_irqs()
3509 ep->irqs++; in handle_stat1_irqs()
3583 if (!dev->ep[i].dummy) in net2280_remove()
3585 dma_pool_free(dev->requests, dev->ep[i].dummy, in net2280_remove()
3586 dev->ep[i].td_dma); in net2280_remove()
3741 &dev->ep[i].td_dma); in net2280_probe()
3749 dev->ep[i].dummy = td; in net2280_probe()