Lines Matching defs:hwep

52 static int reprime_dtd(struct ci_hdrc *ci, struct ci_hw_ep *hwep,
357 static int add_td_to_list(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq,
368 node->ptr = dma_pool_zalloc(hwep->td_pool, GFP_ATOMIC, &node->dma);
377 if (hwep->type == USB_ENDPOINT_XFER_ISOC && hwep->dir == TX) {
378 u32 mul = hwreq->req.length / hwep->ep.maxpacket;
381 || hwreq->req.length % hwep->ep.maxpacket)
426 static int prepare_td_for_non_sg(struct ci_hw_ep *hwep,
434 ret = add_td_to_list(hwep, hwreq, 0, NULL);
450 ret = add_td_to_list(hwep, hwreq, count, NULL);
457 if (hwreq->req.zero && hwreq->req.length && hwep->dir == TX
458 && (hwreq->req.length % hwep->ep.maxpacket == 0)) {
459 ret = add_td_to_list(hwep, hwreq, 0, NULL);
467 static int prepare_td_per_sg(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq,
478 ret = add_td_to_list(hwep, hwreq, count, s);
507 static int prepare_td_for_sg(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq)
515 dev_err(hwep->ci->dev, "not supported operation for sg\n");
521 dev_err(hwep->ci->dev, "not page aligned sg buffer\n");
529 ret = prepare_td_per_sg(hwep, hwreq, s);
545 * @hwep: endpoint
550 static int _hardware_enqueue(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq)
552 struct ci_hdrc *ci = hwep->ci;
563 &hwreq->req, hwep->dir);
568 ret = prepare_td_for_sg(hwep, hwreq);
570 ret = prepare_td_for_non_sg(hwep, hwreq);
583 trace_ci_prepare_td(hwep, hwreq, firstnode);
590 if (!list_empty(&hwep->qh.queue)) {
592 int n = hw_ep_bit(hwep->num, hwep->dir);
597 hwreqprev = list_entry(hwep->qh.queue.prev,
607 reprime_dtd(ci, hwep, prevlastnode);
622 hwep->qh.ptr->td.next = cpu_to_le32(firstnode->dma);
623 hwep->qh.ptr->td.token &=
626 if (hwep->type == USB_ENDPOINT_XFER_ISOC && hwep->dir == RX) {
627 u32 mul = hwreq->req.length / hwep->ep.maxpacket;
630 || hwreq->req.length % hwep->ep.maxpacket)
632 hwep->qh.ptr->cap |= cpu_to_le32(mul << __ffs(QH_MULT));
635 ret = hw_ep_prime(ci, hwep->num, hwep->dir,
636 hwep->type == USB_ENDPOINT_XFER_CONTROL);
643 * @hwep: endpoint
645 static void free_pending_td(struct ci_hw_ep *hwep)
647 struct td_node *pending = hwep->pending_td;
649 dma_pool_free(hwep->td_pool, pending->ptr, pending->dma);
650 hwep->pending_td = NULL;
654 static int reprime_dtd(struct ci_hdrc *ci, struct ci_hw_ep *hwep,
657 hwep->qh.ptr->td.next = cpu_to_le32(node->dma);
658 hwep->qh.ptr->td.token &=
661 return hw_ep_prime(ci, hwep->num, hwep->dir,
662 hwep->type == USB_ENDPOINT_XFER_CONTROL);
667 * @hwep: endpoint
672 static int _hardware_dequeue(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq)
678 struct ci_hdrc *ci = hwep->ci;
687 trace_ci_complete_td(hwep, hwreq, node);
689 int n = hw_ep_bit(hwep->num, hwep->dir);
693 reprime_dtd(ci, hwep, node);
715 if (hwep->dir == TX) {
725 if (hwep->pending_td)
726 free_pending_td(hwep);
728 hwep->pending_td = node;
732 usb_gadget_unmap_request_by_dev(hwep->ci->dev->parent,
733 &hwreq->req, hwep->dir);
745 * @hwep: endpoint
750 static int _ep_nuke(struct ci_hw_ep *hwep)
751 __releases(hwep->lock)
752 __acquires(hwep->lock)
755 if (hwep == NULL)
758 hw_ep_flush(hwep->ci, hwep->num, hwep->dir);
760 while (!list_empty(&hwep->qh.queue)) {
763 struct ci_hw_req *hwreq = list_entry(hwep->qh.queue.next,
767 dma_pool_free(hwep->td_pool, node->ptr, node->dma);
777 spin_unlock(hwep->lock);
778 usb_gadget_giveback_request(&hwep->ep, &hwreq->req);
779 spin_lock(hwep->lock);
783 if (hwep->pending_td)
784 free_pending_td(hwep);
791 struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep);
795 if (ep == NULL || hwep->ep.desc == NULL)
798 if (usb_endpoint_xfer_isoc(hwep->ep.desc))
801 spin_lock_irqsave(hwep->lock, flags);
803 if (value && hwep->dir == TX && check_transfer &&
804 !list_empty(&hwep->qh.queue) &&
805 !usb_endpoint_xfer_control(hwep->ep.desc)) {
806 spin_unlock_irqrestore(hwep->lock, flags);
810 direction = hwep->dir;
812 retval |= hw_ep_set_halt(hwep->ci, hwep->num, hwep->dir, value);
815 hwep->wedge = 0;
817 if (hwep->type == USB_ENDPOINT_XFER_CONTROL)
818 hwep->dir = (hwep->dir == TX) ? RX : TX;
820 } while (hwep->dir != direction);
822 spin_unlock_irqrestore(hwep->lock, flags);
931 struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep);
933 struct ci_hdrc *ci = hwep->ci;
936 if (ep == NULL || req == NULL || hwep->ep.desc == NULL)
939 if (hwep->type == USB_ENDPOINT_XFER_CONTROL) {
941 hwep = (ci->ep0_dir == RX) ?
943 if (!list_empty(&hwep->qh.queue)) {
944 _ep_nuke(hwep);
945 dev_warn(hwep->ci->dev, "endpoint ctrl %X nuked\n",
946 _usb_addr(hwep));
950 if (usb_endpoint_xfer_isoc(hwep->ep.desc) &&
951 hwreq->req.length > hwep->ep.mult * hwep->ep.maxpacket) {
952 dev_err(hwep->ci->dev, "request length too big for isochronous\n");
958 dev_err(hwep->ci->dev, "request already in queue\n");
966 retval = _hardware_enqueue(hwep, hwreq);
971 list_add_tail(&hwreq->queue, &hwep->qh.queue);
985 __releases(hwep->lock)
986 __acquires(hwep->lock)
988 struct ci_hw_ep *hwep = ci->ep0in;
993 if (hwep == NULL || setup == NULL)
996 spin_unlock(hwep->lock);
997 req = usb_ep_alloc_request(&hwep->ep, gfp_flags);
998 spin_lock(hwep->lock);
1022 retval = _ep_queue(&hwep->ep, req, gfp_flags);
1031 spin_unlock(hwep->lock);
1032 usb_ep_free_request(&hwep->ep, req);
1033 spin_lock(hwep->lock);
1075 struct ci_hw_ep *hwep;
1086 hwep = (ci->ep0_dir == TX) ? ci->ep0out : ci->ep0in;
1090 return _ep_queue(&hwep->ep, ci->status, GFP_ATOMIC);
1095 * @hwep: endpoint
1100 static int isr_tr_complete_low(struct ci_hw_ep *hwep)
1101 __releases(hwep->lock)
1102 __acquires(hwep->lock)
1105 struct ci_hw_ep *hweptemp = hwep;
1108 list_for_each_entry_safe(hwreq, hwreqtemp, &hwep->qh.queue,
1110 retval = _hardware_dequeue(hwep, hwreq);
1115 spin_unlock(hwep->lock);
1116 if ((hwep->type == USB_ENDPOINT_XFER_CONTROL) &&
1118 hweptemp = hwep->ci->ep0in;
1120 spin_lock(hwep->lock);
1147 struct ci_hw_ep *hwep = &ci->ci_hw_ep[0];
1162 memcpy(&req, &hwep->qh.ptr->setup, sizeof(req));
1301 if (_ep_set_halt(&hwep->ep, 1, false))
1321 struct ci_hw_ep *hwep = &ci->ci_hw_ep[i];
1323 if (hwep->ep.desc == NULL)
1327 err = isr_tr_complete_low(hwep);
1328 if (hwep->type == USB_ENDPOINT_XFER_CONTROL) {
1333 if (_ep_set_halt(&hwep->ep, 1, false))
1359 struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep);
1367 spin_lock_irqsave(hwep->lock, flags);
1371 if (!list_empty(&hwep->qh.queue)) {
1372 dev_warn(hwep->ci->dev, "enabling a non-empty endpoint!\n");
1373 spin_unlock_irqrestore(hwep->lock, flags);
1377 hwep->ep.desc = desc;
1379 hwep->dir = usb_endpoint_dir_in(desc) ? TX : RX;
1380 hwep->num = usb_endpoint_num(desc);
1381 hwep->type = usb_endpoint_type(desc);
1383 hwep->ep.maxpacket = usb_endpoint_maxp(desc);
1384 hwep->ep.mult = usb_endpoint_maxp_mult(desc);
1386 if (hwep->type == USB_ENDPOINT_XFER_CONTROL)
1390 cap |= (hwep->ep.maxpacket << __ffs(QH_MAX_PKT)) & QH_MAX_PKT;
1395 if (hwep->type == USB_ENDPOINT_XFER_ISOC && hwep->dir == TX)
1398 hwep->qh.ptr->cap = cpu_to_le32(cap);
1400 hwep->qh.ptr->td.next |= cpu_to_le32(TD_TERMINATE); /* needed? */
1402 if (hwep->num != 0 && hwep->type == USB_ENDPOINT_XFER_CONTROL) {
1403 dev_err(hwep->ci->dev, "Set control xfer at non-ep0\n");
1411 if (hwep->num)
1412 retval |= hw_ep_enable(hwep->ci, hwep->num, hwep->dir,
1413 hwep->type);
1415 spin_unlock_irqrestore(hwep->lock, flags);
1426 struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep);
1432 else if (hwep->ep.desc == NULL)
1435 spin_lock_irqsave(hwep->lock, flags);
1436 if (hwep->ci->gadget.speed == USB_SPEED_UNKNOWN) {
1437 spin_unlock_irqrestore(hwep->lock, flags);
1443 direction = hwep->dir;
1445 retval |= _ep_nuke(hwep);
1446 retval |= hw_ep_disable(hwep->ci, hwep->num, hwep->dir);
1448 if (hwep->type == USB_ENDPOINT_XFER_CONTROL)
1449 hwep->dir = (hwep->dir == TX) ? RX : TX;
1451 } while (hwep->dir != direction);
1453 hwep->ep.desc = NULL;
1455 spin_unlock_irqrestore(hwep->lock, flags);
1487 struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep);
1495 dev_err(hwep->ci->dev, "freeing queued request\n");
1499 spin_lock_irqsave(hwep->lock, flags);
1502 dma_pool_free(hwep->td_pool, node->ptr, node->dma);
1510 spin_unlock_irqrestore(hwep->lock, flags);
1521 struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep);
1525 if (ep == NULL || req == NULL || hwep->ep.desc == NULL)
1528 spin_lock_irqsave(hwep->lock, flags);
1529 if (hwep->ci->gadget.speed == USB_SPEED_UNKNOWN) {
1530 spin_unlock_irqrestore(hwep->lock, flags);
1534 spin_unlock_irqrestore(hwep->lock, flags);
1545 struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep);
1551 hwep->ep.desc == NULL || list_empty(&hwreq->queue) ||
1552 list_empty(&hwep->qh.queue))
1555 spin_lock_irqsave(hwep->lock, flags);
1556 if (hwep->ci->gadget.speed != USB_SPEED_UNKNOWN)
1557 hw_ep_flush(hwep->ci, hwep->num, hwep->dir);
1560 dma_pool_free(hwep->td_pool, node->ptr, node->dma);
1568 usb_gadget_unmap_request(&hwep->ci->gadget, req, hwep->dir);
1573 spin_unlock(hwep->lock);
1574 usb_gadget_giveback_request(&hwep->ep, &hwreq->req);
1575 spin_lock(hwep->lock);
1578 spin_unlock_irqrestore(hwep->lock, flags);
1599 struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep);
1602 if (ep == NULL || hwep->ep.desc == NULL)
1605 spin_lock_irqsave(hwep->lock, flags);
1606 hwep->wedge = 1;
1607 spin_unlock_irqrestore(hwep->lock, flags);
1619 struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep);
1623 dev_err(hwep->ci->dev, "%02X: -EINVAL\n", _usb_addr(hwep));
1627 spin_lock_irqsave(hwep->lock, flags);
1628 if (hwep->ci->gadget.speed == USB_SPEED_UNKNOWN) {
1629 spin_unlock_irqrestore(hwep->lock, flags);
1633 hw_ep_flush(hwep->ci, hwep->num, hwep->dir);
1635 spin_unlock_irqrestore(hwep->lock, flags);
1771 struct ci_hw_ep *hwep = ci->ep0in;
1774 spin_lock_irqsave(hwep->lock, flags);
1776 spin_unlock_irqrestore(hwep->lock, flags);
1851 struct ci_hw_ep *hwep = &ci->ci_hw_ep[k];
1853 scnprintf(hwep->name, sizeof(hwep->name), "ep%i%s", i,
1856 hwep->ci = ci;
1857 hwep->lock = &ci->lock;
1858 hwep->td_pool = ci->td_pool;
1860 hwep->ep.name = hwep->name;
1861 hwep->ep.ops = &usb_ep_ops;
1864 hwep->ep.caps.type_control = true;
1866 hwep->ep.caps.type_iso = true;
1867 hwep->ep.caps.type_bulk = true;
1868 hwep->ep.caps.type_int = true;
1872 hwep->ep.caps.dir_in = true;
1874 hwep->ep.caps.dir_out = true;
1881 usb_ep_set_maxpacket_limit(&hwep->ep, (unsigned short)~0);
1883 INIT_LIST_HEAD(&hwep->qh.queue);
1884 hwep->qh.ptr = dma_pool_zalloc(ci->qh_pool, GFP_KERNEL,
1885 &hwep->qh.dma);
1886 if (hwep->qh.ptr == NULL)
1895 ci->ep0out = hwep;
1897 ci->ep0in = hwep;
1899 usb_ep_set_maxpacket_limit(&hwep->ep, CTRL_PAYLOAD_MAX);
1903 list_add_tail(&hwep->ep.ep_list, &ci->gadget.ep_list);
1914 struct ci_hw_ep *hwep = &ci->ci_hw_ep[i];
1916 if (hwep->pending_td)
1917 free_pending_td(hwep);
1918 dma_pool_free(ci->qh_pool, hwep->qh.ptr, hwep->qh.dma);