Lines Matching +full:tx +full:- +full:burst +full:- +full:length
1 // SPDX-License-Identifier: GPL-2.0
3 * mtu3_gadget.c - MediaTek usb3 DRD peripheral support
16 __releases(mep->mtu->lock)
17 __acquires(mep->mtu->lock)
20 struct mtu3 *mtu = mreq->mtu;
22 list_del(&mreq->list);
23 if (req->status == -EINPROGRESS)
24 req->status = status;
29 if (mep->epnum)
30 usb_gadget_unmap_request(&mtu->g, req, mep->is_in);
32 dev_dbg(mtu->dev, "%s complete req: %p, sts %d, %d/%d\n",
33 mep->name, req, req->status, req->actual, req->length);
35 spin_unlock(&mtu->lock);
36 usb_gadget_giveback_request(&mep->ep, req);
37 spin_lock(&mtu->lock);
44 if (list_empty(&mep->req_list))
47 dev_dbg(mep->mtu->dev, "abort %s's req: sts %d\n", mep->name, status);
50 if (mep->epnum)
53 while (!list_empty(&mep->req_list)) {
54 mreq = list_first_entry(&mep->req_list,
56 mtu3_req_complete(mep, &mreq->request, status);
64 struct mtu3 *mtu = mep->mtu;
67 u32 burst = 0;
70 desc = mep->desc;
71 comp_desc = mep->comp_desc;
72 mep->type = usb_endpoint_type(desc);
73 mep->maxp = usb_endpoint_maxp(desc);
75 switch (mtu->g.speed) {
80 interval = desc->bInterval;
83 mult = comp_desc->bmAttributes;
86 burst = comp_desc->bMaxBurst;
92 interval = desc->bInterval;
94 mult = usb_endpoint_maxp_mult(desc) - 1;
99 interval = clamp_val(desc->bInterval, 1, 16);
101 interval = clamp_val(desc->bInterval, 1, 255);
108 dev_dbg(mtu->dev, "%s maxp:%d, interval:%d, burst:%d, mult:%d\n",
109 __func__, mep->maxp, interval, burst, mult);
111 mep->ep.maxpacket = mep->maxp;
112 mep->ep.desc = desc;
113 mep->ep.comp_desc = comp_desc;
116 mep->slot = usb_endpoint_xfer_int(desc) ? 0 : mtu->slot;
118 ret = mtu3_config_ep(mtu, mep, interval, burst, mult);
135 struct mtu3 *mtu = mep->mtu;
138 nuke(mep, -ESHUTDOWN);
143 mep->desc = NULL;
144 mep->ep.desc = NULL;
145 mep->comp_desc = NULL;
146 mep->type = 0;
147 mep->flags = 0;
158 int ret = -EINVAL;
160 if (!ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) {
162 return -EINVAL;
165 if (!desc->wMaxPacketSize) {
167 return -EINVAL;
170 mtu = mep->mtu;
173 if (usb_endpoint_num(desc) != mep->epnum)
174 return -EINVAL;
176 if (!!usb_endpoint_dir_in(desc) ^ !!mep->is_in)
177 return -EINVAL;
179 dev_dbg(mtu->dev, "%s %s\n", __func__, ep->name);
181 if (mep->flags & MTU3_EP_ENABLED) {
182 dev_WARN_ONCE(mtu->dev, true, "%s is already enabled\n",
183 mep->name);
187 spin_lock_irqsave(&mtu->lock, flags);
188 mep->desc = desc;
189 mep->comp_desc = ep->comp_desc;
195 mep->flags = MTU3_EP_ENABLED;
196 mtu->active_ep++;
199 spin_unlock_irqrestore(&mtu->lock, flags);
201 dev_dbg(mtu->dev, "%s active_ep=%d\n", __func__, mtu->active_ep);
210 struct mtu3 *mtu = mep->mtu;
213 dev_dbg(mtu->dev, "%s %s\n", __func__, mep->name);
216 if (!(mep->flags & MTU3_EP_ENABLED)) {
217 dev_warn(mtu->dev, "%s is already disabled\n", mep->name);
221 spin_lock_irqsave(&mtu->lock, flags);
223 mep->flags = 0;
224 mtu->active_ep--;
225 spin_unlock_irqrestore(&(mtu->lock), flags);
227 dev_dbg(mtu->dev, "%s active_ep=%d, mtu3 is_active=%d\n",
228 __func__, mtu->active_ep, mtu->is_active);
242 mreq->request.dma = DMA_ADDR_INVALID;
243 mreq->epnum = mep->epnum;
244 mreq->mep = mep;
245 INIT_LIST_HEAD(&mreq->list);
248 return &mreq->request;
264 struct mtu3 *mtu = mep->mtu;
268 if (!req->buf)
269 return -ENODATA;
271 if (mreq->mep != mep)
272 return -EINVAL;
274 dev_dbg(mtu->dev, "%s %s EP%d(%s), req=%p, maxp=%d, len#%d\n",
275 __func__, mep->is_in ? "TX" : "RX", mreq->epnum, ep->name,
276 mreq, ep->maxpacket, mreq->request.length);
278 if (req->length > GPD_BUF_SIZE ||
279 (mtu->gen2cp && req->length > GPD_BUF_SIZE_EL)) {
280 dev_warn(mtu->dev,
281 "req length > supported MAX:%d requested:%d\n",
282 mtu->gen2cp ? GPD_BUF_SIZE_EL : GPD_BUF_SIZE,
283 req->length);
284 return -EOPNOTSUPP;
288 if (!mep->desc) {
289 dev_dbg(mtu->dev, "req=%p queued to %s while it's disabled\n",
290 req, ep->name);
291 return -ESHUTDOWN;
294 mreq->mtu = mtu;
295 mreq->request.actual = 0;
296 mreq->request.status = -EINPROGRESS;
298 ret = usb_gadget_map_request(&mtu->g, req, mep->is_in);
300 dev_err(mtu->dev, "dma mapping failed\n");
304 spin_lock_irqsave(&mtu->lock, flags);
307 ret = -EAGAIN;
311 list_add_tail(&mreq->list, &mep->req_list);
316 spin_unlock_irqrestore(&mtu->lock, flags);
327 struct mtu3 *mtu = mep->mtu;
331 if (mreq->mep != mep)
332 return -EINVAL;
334 dev_dbg(mtu->dev, "%s : req=%p\n", __func__, req);
337 spin_lock_irqsave(&mtu->lock, flags);
339 list_for_each_entry(r, &mep->req_list, list) {
344 dev_dbg(mtu->dev, "req=%p not queued to %s\n", req, ep->name);
345 ret = -EINVAL;
350 mtu3_req_complete(mep, req, -ECONNRESET);
354 spin_unlock_irqrestore(&mtu->lock, flags);
361 * A halted EP won't TX/RX any data but will queue requests.
366 struct mtu3 *mtu = mep->mtu;
371 dev_dbg(mtu->dev, "%s : %s...", __func__, ep->name);
373 spin_lock_irqsave(&mtu->lock, flags);
375 if (mep->type == USB_ENDPOINT_XFER_ISOC) {
376 ret = -EINVAL;
383 * If there is not request for TX-EP, QMU will not transfer
384 * data to TX-FIFO, so no need check whether TX-FIFO
388 dev_dbg(mtu->dev, "req in progress, cannot halt %s\n",
389 ep->name);
390 ret = -EAGAIN;
394 mep->flags &= ~MTU3_EP_WEDGE;
397 dev_dbg(mtu->dev, "%s %s stall\n", ep->name, value ? "set" : "clear");
402 spin_unlock_irqrestore(&mtu->lock, flags);
413 mep->flags |= MTU3_EP_WEDGE;
433 return (int)mtu3_readl(mtu->mac_base, U3D_USB20_FRAME_NUM);
438 mtu3_writel(mtu->mac_base, U3D_DEV_NOTIF_0,
440 mtu3_setbits(mtu->mac_base, U3D_DEV_NOTIF_0, SEND_DEV_NOTIF);
448 dev_dbg(mtu->dev, "%s\n", __func__);
451 if (!mtu->may_wakeup)
452 return -EOPNOTSUPP;
454 spin_lock_irqsave(&mtu->lock, flags);
455 if (mtu->g.speed >= USB_SPEED_SUPER) {
460 mtu3_setbits(mtu->mac_base, U3D_LINK_POWER_CONTROL, UX_EXIT);
469 mtu3_setbits(mtu->mac_base, U3D_POWER_MANAGEMENT, RESUME);
470 spin_unlock_irqrestore(&mtu->lock, flags);
472 spin_lock_irqsave(&mtu->lock, flags);
473 mtu3_clrbits(mtu->mac_base, U3D_POWER_MANAGEMENT, RESUME);
475 spin_unlock_irqrestore(&mtu->lock, flags);
484 mtu->is_self_powered = !!is_selfpowered;
493 dev_dbg(mtu->dev, "%s (%s) for %sactive device\n", __func__,
494 str_on_off(is_on), mtu->is_active ? "" : "in");
496 pm_runtime_get_sync(mtu->dev);
499 spin_lock_irqsave(&mtu->lock, flags);
502 if (!mtu->is_active) {
504 mtu->softconnect = is_on;
505 } else if (is_on != mtu->softconnect) {
506 mtu->softconnect = is_on;
510 spin_unlock_irqrestore(&mtu->lock, flags);
511 pm_runtime_put(mtu->dev);
522 if (mtu->gadget_driver) {
523 dev_err(mtu->dev, "%s is already bound to %s\n",
524 mtu->g.name, mtu->gadget_driver->driver.name);
525 return -EBUSY;
528 dev_dbg(mtu->dev, "bind driver %s\n", driver->function);
529 pm_runtime_get_sync(mtu->dev);
531 spin_lock_irqsave(&mtu->lock, flags);
533 mtu->softconnect = 0;
534 mtu->gadget_driver = driver;
536 if (mtu->ssusb->dr_mode == USB_DR_MODE_PERIPHERAL)
539 spin_unlock_irqrestore(&mtu->lock, flags);
540 pm_runtime_put(mtu->dev);
547 struct usb_gadget_driver *driver = mtu->gadget_driver;
551 if (mtu->g.speed == USB_SPEED_UNKNOWN)
554 mtu->g.speed = USB_SPEED_UNKNOWN;
557 if (mtu->softconnect) {
558 mtu->softconnect = 0;
566 nuke(mtu->ep0, -ESHUTDOWN);
567 for (i = 1; i < mtu->num_eps; i++) {
568 nuke(mtu->in_eps + i, -ESHUTDOWN);
569 nuke(mtu->out_eps + i, -ESHUTDOWN);
573 spin_unlock(&mtu->lock);
574 driver->disconnect(&mtu->g);
575 spin_lock(&mtu->lock);
584 dev_dbg(mtu->dev, "%s\n", __func__);
586 spin_lock_irqsave(&mtu->lock, flags);
589 mtu->gadget_driver = NULL;
591 if (mtu->ssusb->dr_mode == USB_DR_MODE_PERIPHERAL)
594 spin_unlock_irqrestore(&mtu->lock, flags);
596 synchronize_irq(mtu->irq);
606 dev_dbg(mtu->dev, "%s %s\n", __func__, usb_speed_string(speed));
608 spin_lock_irqsave(&mtu->lock, flags);
609 mtu->speed = speed;
610 spin_unlock_irqrestore(&mtu->lock, flags);
618 dev_dbg(mtu->dev, "%s %s\n", __func__, enable ? "en" : "dis");
620 spin_lock_irqsave(&mtu->lock, flags);
621 mtu->async_callbacks = enable;
622 spin_unlock_irqrestore(&mtu->lock, flags);
638 mtu->address = 0;
639 mtu->ep0_state = MU3D_EP0_STATE_SETUP;
640 mtu->may_wakeup = 0;
641 mtu->u1_enable = 0;
642 mtu->u2_enable = 0;
643 mtu->delayed_status = false;
644 mtu->test_mode = false;
650 mep->epnum = epnum;
651 mep->mtu = mtu;
652 mep->is_in = is_in;
654 INIT_LIST_HEAD(&mep->req_list);
656 sprintf(mep->name, "ep%d%s", epnum,
659 mep->ep.name = mep->name;
660 INIT_LIST_HEAD(&mep->ep.ep_list);
664 usb_ep_set_maxpacket_limit(&mep->ep, 512);
665 mep->ep.caps.type_control = true;
666 mep->ep.ops = &mtu3_ep0_ops;
667 mtu->g.ep0 = &mep->ep;
669 usb_ep_set_maxpacket_limit(&mep->ep, 1024);
670 mep->ep.caps.type_iso = true;
671 mep->ep.caps.type_bulk = true;
672 mep->ep.caps.type_int = true;
673 mep->ep.ops = &mtu3_ep_ops;
674 list_add_tail(&mep->ep.ep_list, &mtu->g.ep_list);
677 dev_dbg(mtu->dev, "%s, name=%s, maxp=%d\n", __func__, mep->ep.name,
678 mep->ep.maxpacket);
681 mep->ep.caps.dir_in = true;
682 mep->ep.caps.dir_out = true;
684 mep->ep.caps.dir_in = true;
686 mep->ep.caps.dir_out = true;
695 INIT_LIST_HEAD(&(mtu->g.ep_list));
697 dev_dbg(mtu->dev, "%s num_eps(1 for a pair of tx&rx ep)=%d\n",
698 __func__, mtu->num_eps);
700 init_hw_ep(mtu, mtu->ep0, 0, 0);
701 for (epnum = 1; epnum < mtu->num_eps; epnum++) {
702 init_hw_ep(mtu, mtu->in_eps + epnum, epnum, 1);
703 init_hw_ep(mtu, mtu->out_eps + epnum, epnum, 0);
709 mtu->g.ops = &mtu3_gadget_ops;
710 mtu->g.max_speed = mtu->max_speed;
711 mtu->g.speed = USB_SPEED_UNKNOWN;
712 mtu->g.sg_supported = 0;
713 mtu->g.name = MTU3_DRIVER_NAME;
714 mtu->g.irq = mtu->irq;
715 mtu->is_active = 0;
716 mtu->delayed_status = false;
720 return usb_add_gadget_udc(mtu->dev, &mtu->g);
725 usb_del_gadget_udc(&mtu->g);
730 dev_dbg(mtu->dev, "gadget RESUME\n");
731 if (mtu->async_callbacks && mtu->gadget_driver && mtu->gadget_driver->resume) {
732 spin_unlock(&mtu->lock);
733 mtu->gadget_driver->resume(&mtu->g);
734 spin_lock(&mtu->lock);
741 dev_dbg(mtu->dev, "gadget SUSPEND\n");
742 if (mtu->async_callbacks && mtu->gadget_driver && mtu->gadget_driver->suspend) {
743 spin_unlock(&mtu->lock);
744 mtu->gadget_driver->suspend(&mtu->g);
745 spin_lock(&mtu->lock);
752 dev_dbg(mtu->dev, "gadget DISCONNECT\n");
753 if (mtu->async_callbacks && mtu->gadget_driver && mtu->gadget_driver->disconnect) {
754 spin_unlock(&mtu->lock);
755 mtu->gadget_driver->disconnect(&mtu->g);
756 spin_lock(&mtu->lock);
760 usb_gadget_set_state(&mtu->g, USB_STATE_NOTATTACHED);
765 dev_dbg(mtu->dev, "gadget RESET\n");
768 if (mtu->g.speed != USB_SPEED_UNKNOWN)