Lines Matching full:mtu
18 #define next_ep0_request(mtu) next_request((mtu)->ep0) argument
39 static char *decode_ep0_state(struct mtu3 *mtu) in decode_ep0_state() argument
41 switch (mtu->ep0_state) { in decode_ep0_state()
57 static void ep0_req_giveback(struct mtu3 *mtu, struct usb_request *req) in ep0_req_giveback() argument
59 mtu3_req_complete(mtu->ep0, req, 0); in ep0_req_giveback()
63 forward_to_driver(struct mtu3 *mtu, const struct usb_ctrlrequest *setup) in forward_to_driver() argument
64 __releases(mtu->lock) in forward_to_driver()
65 __acquires(mtu->lock) in forward_to_driver()
69 if (!mtu->gadget_driver) in forward_to_driver()
72 spin_unlock(&mtu->lock); in forward_to_driver()
73 ret = mtu->gadget_driver->setup(&mtu->g, setup); in forward_to_driver()
74 spin_lock(&mtu->lock); in forward_to_driver()
76 dev_dbg(mtu->dev, "%s ret %d\n", __func__, ret); in forward_to_driver()
82 void __iomem *fifo = mep->mtu->mac_base + U3D_FIFO0; in ep0_write_fifo()
85 dev_dbg(mep->mtu->dev, "%s: ep%din, len=%d, buf=%p\n", in ep0_write_fifo()
102 void __iomem *fifo = mep->mtu->mac_base + U3D_FIFO0; in ep0_read_fifo()
106 dev_dbg(mep->mtu->dev, "%s: ep%dout len=%d buf=%p\n", in ep0_read_fifo()
120 static void ep0_load_test_packet(struct mtu3 *mtu) in ep0_load_test_packet() argument
126 ep0_write_fifo(mtu->ep0, mtu3_test_packet, sizeof(mtu3_test_packet)); in ep0_load_test_packet()
137 struct mtu3 *mtu = mep0->mtu; in ep0_stall_set() local
138 void __iomem *mbase = mtu->mac_base; in ep0_stall_set()
147 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr); in ep0_stall_set()
149 mtu->delayed_status = false; in ep0_stall_set()
150 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in ep0_stall_set()
152 dev_dbg(mtu->dev, "ep0: %s STALL, ep0_state: %s\n", in ep0_stall_set()
153 set ? "SEND" : "CLEAR", decode_ep0_state(mtu)); in ep0_stall_set()
164 struct mtu3 *mtu; in ep0_set_sel_complete() local
170 mtu = mreq->mtu; in ep0_set_sel_complete()
171 dev_dbg(mtu->dev, "u1sel:%d, u1pel:%d, u2sel:%d, u2pel:%d\n", in ep0_set_sel_complete()
176 static int ep0_set_sel(struct mtu3 *mtu, struct usb_ctrlrequest *setup) in ep0_set_sel() argument
182 dev_err(mtu->dev, "%s wrong wLength:%d\n", in ep0_set_sel()
187 mtu->ep0_req.mep = mtu->ep0; in ep0_set_sel()
188 mtu->ep0_req.request.length = 6; in ep0_set_sel()
189 mtu->ep0_req.request.buf = mtu->setup_buf; in ep0_set_sel()
190 mtu->ep0_req.request.complete = ep0_set_sel_complete; in ep0_set_sel()
191 ret = ep0_queue(mtu->ep0, &mtu->ep0_req); in ep0_set_sel()
197 ep0_get_status(struct mtu3 *mtu, const struct usb_ctrlrequest *setup) in ep0_get_status() argument
207 result[0] = mtu->is_self_powered << USB_DEVICE_SELF_POWERED; in ep0_get_status()
208 result[0] |= mtu->may_wakeup << USB_DEVICE_REMOTE_WAKEUP; in ep0_get_status()
210 if (mtu->g.speed >= USB_SPEED_SUPER) { in ep0_get_status()
211 result[0] |= mtu->u1_enable << USB_DEV_STAT_U1_ENABLED; in ep0_get_status()
212 result[0] |= mtu->u2_enable << USB_DEV_STAT_U2_ENABLED; in ep0_get_status()
215 dev_dbg(mtu->dev, "%s result=%x, U1=%x, U2=%x\n", __func__, in ep0_get_status()
216 result[0], mtu->u1_enable, mtu->u2_enable); in ep0_get_status()
226 if (epnum >= mtu->num_eps) { in ep0_get_status()
233 mep = (is_in ? mtu->in_eps : mtu->out_eps) + epnum; in ep0_get_status()
252 dev_dbg(mtu->dev, "get_status=%x\n", *(u16 *)result); in ep0_get_status()
253 memcpy(mtu->setup_buf, result, sizeof(result)); in ep0_get_status()
254 mtu->ep0_req.mep = mtu->ep0; in ep0_get_status()
255 mtu->ep0_req.request.length = 2; in ep0_get_status()
256 mtu->ep0_req.request.buf = &mtu->setup_buf; in ep0_get_status()
257 mtu->ep0_req.request.complete = ep0_dummy_complete; in ep0_get_status()
258 ret = ep0_queue(mtu->ep0, &mtu->ep0_req); in ep0_get_status()
265 static int handle_test_mode(struct mtu3 *mtu, struct usb_ctrlrequest *setup) in handle_test_mode() argument
267 void __iomem *mbase = mtu->mac_base; in handle_test_mode()
273 dev_dbg(mtu->dev, "TEST_J\n"); in handle_test_mode()
274 mtu->test_mode_nr = TEST_J_MODE; in handle_test_mode()
277 dev_dbg(mtu->dev, "TEST_K\n"); in handle_test_mode()
278 mtu->test_mode_nr = TEST_K_MODE; in handle_test_mode()
281 dev_dbg(mtu->dev, "TEST_SE0_NAK\n"); in handle_test_mode()
282 mtu->test_mode_nr = TEST_SE0_NAK_MODE; in handle_test_mode()
285 dev_dbg(mtu->dev, "TEST_PACKET\n"); in handle_test_mode()
286 mtu->test_mode_nr = TEST_PACKET_MODE; in handle_test_mode()
293 mtu->test_mode = true; in handle_test_mode()
296 if (mtu->test_mode_nr == TEST_PACKET_MODE) in handle_test_mode()
297 ep0_load_test_packet(mtu); in handle_test_mode()
307 mtu3_writel(mbase, U3D_USB2_TEST_MODE, mtu->test_mode_nr); in handle_test_mode()
309 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in handle_test_mode()
315 static int ep0_handle_feature_dev(struct mtu3 *mtu, in ep0_handle_feature_dev() argument
318 void __iomem *mbase = mtu->mac_base; in ep0_handle_feature_dev()
324 mtu->may_wakeup = !!set; in ep0_handle_feature_dev()
328 if (!set || (mtu->g.speed != USB_SPEED_HIGH) || in ep0_handle_feature_dev()
332 handled = handle_test_mode(mtu, setup); in ep0_handle_feature_dev()
335 if (mtu->g.speed < USB_SPEED_SUPER || in ep0_handle_feature_dev()
336 mtu->g.state != USB_STATE_CONFIGURED) in ep0_handle_feature_dev()
346 mtu->u1_enable = !!set; in ep0_handle_feature_dev()
350 if (mtu->g.speed < USB_SPEED_SUPER || in ep0_handle_feature_dev()
351 mtu->g.state != USB_STATE_CONFIGURED) in ep0_handle_feature_dev()
361 mtu->u2_enable = !!set; in ep0_handle_feature_dev()
371 static int ep0_handle_feature(struct mtu3 *mtu, in ep0_handle_feature() argument
386 handled = ep0_handle_feature_dev(mtu, setup, set); in ep0_handle_feature()
391 mtu->g.speed >= USB_SPEED_SUPER) { in ep0_handle_feature()
401 if (epnum == 0 || epnum >= mtu->num_eps || in ep0_handle_feature()
406 mep = (is_in ? mtu->in_eps : mtu->out_eps) + epnum; in ep0_handle_feature()
432 static int handle_standard_request(struct mtu3 *mtu, in handle_standard_request() argument
435 void __iomem *mbase = mtu->mac_base; in handle_standard_request()
436 enum usb_device_state state = mtu->g.state; in handle_standard_request()
447 mtu->address = (u8) (value & 0x7f); in handle_standard_request()
448 dev_dbg(mtu->dev, "set address to 0x%x\n", mtu->address); in handle_standard_request()
452 dev_conf |= DEV_ADDR(mtu->address); in handle_standard_request()
455 if (mtu->address) in handle_standard_request()
456 usb_gadget_set_state(&mtu->g, USB_STATE_ADDRESS); in handle_standard_request()
458 usb_gadget_set_state(&mtu->g, USB_STATE_DEFAULT); in handle_standard_request()
464 usb_gadget_set_state(&mtu->g, in handle_standard_request()
472 usb_gadget_set_state(&mtu->g, in handle_standard_request()
478 handled = ep0_handle_feature(mtu, setup, 0); in handle_standard_request()
481 handled = ep0_handle_feature(mtu, setup, 1); in handle_standard_request()
484 handled = ep0_get_status(mtu, setup); in handle_standard_request()
487 handled = ep0_set_sel(mtu, setup); in handle_standard_request()
501 static void ep0_rx_state(struct mtu3 *mtu) in ep0_rx_state() argument
505 void __iomem *mbase = mtu->mac_base; in ep0_rx_state()
510 dev_dbg(mtu->dev, "%s\n", __func__); in ep0_rx_state()
513 mreq = next_ep0_request(mtu); in ep0_rx_state()
527 ep0_read_fifo(mtu->ep0, buf, count); in ep0_rx_state()
531 maxp = mtu->g.ep0->maxpacket; in ep0_rx_state()
533 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in ep0_rx_state()
534 dev_dbg(mtu->dev, "ep0 state: %s\n", in ep0_rx_state()
535 decode_ep0_state(mtu)); in ep0_rx_state()
543 dev_dbg(mtu->dev, "%s: SENDSTALL\n", __func__); in ep0_rx_state()
550 ep0_req_giveback(mtu, req); in ep0_rx_state()
555 static void ep0_tx_state(struct mtu3 *mtu) in ep0_tx_state() argument
557 struct mtu3_request *mreq = next_ep0_request(mtu); in ep0_tx_state()
564 dev_dbg(mtu->dev, "%s\n", __func__); in ep0_tx_state()
569 maxp = mtu->g.ep0->maxpacket; in ep0_tx_state()
576 ep0_write_fifo(mtu->ep0, src, count); in ep0_tx_state()
578 dev_dbg(mtu->dev, "%s act=%d, len=%d, cnt=%d, maxp=%d zero=%d\n", in ep0_tx_state()
585 mtu->ep0_state = MU3D_EP0_STATE_TX_END; in ep0_tx_state()
588 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR) & EP0_W1C_BITS; in ep0_tx_state()
589 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr | EP0_TXPKTRDY); in ep0_tx_state()
591 dev_dbg(mtu->dev, "%s ep0csr=0x%x\n", __func__, in ep0_tx_state()
592 mtu3_readl(mtu->mac_base, U3D_EP0CSR)); in ep0_tx_state()
595 static void ep0_read_setup(struct mtu3 *mtu, struct usb_ctrlrequest *setup) in ep0_read_setup() argument
601 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR) & EP0_W1C_BITS; in ep0_read_setup()
602 count = mtu3_readl(mtu->mac_base, U3D_RXCOUNT0); in ep0_read_setup()
604 ep0_read_fifo(mtu->ep0, (u8 *)setup, count); in ep0_read_setup()
606 dev_dbg(mtu->dev, "SETUP req%02x.%02x v%04x i%04x l%04x\n", in ep0_read_setup()
612 mreq = next_ep0_request(mtu); in ep0_read_setup()
614 ep0_req_giveback(mtu, &mreq->request); in ep0_read_setup()
619 mtu3_writel(mtu->mac_base, U3D_EP0CSR, in ep0_read_setup()
621 mtu->ep0_state = MU3D_EP0_STATE_TX; in ep0_read_setup()
623 mtu3_writel(mtu->mac_base, U3D_EP0CSR, in ep0_read_setup()
625 mtu->ep0_state = MU3D_EP0_STATE_RX; in ep0_read_setup()
629 static int ep0_handle_setup(struct mtu3 *mtu) in ep0_handle_setup() argument
630 __releases(mtu->lock) in ep0_handle_setup()
631 __acquires(mtu->lock) in ep0_handle_setup()
635 void __iomem *mbase = mtu->mac_base; in ep0_handle_setup()
638 ep0_read_setup(mtu, &setup); in ep0_handle_setup()
642 handled = handle_standard_request(mtu, &setup); in ep0_handle_setup()
644 dev_dbg(mtu->dev, "handled %d, ep0_state: %s\n", in ep0_handle_setup()
645 handled, decode_ep0_state(mtu)); in ep0_handle_setup()
652 handled = forward_to_driver(mtu, &setup); in ep0_handle_setup()
655 dev_dbg(mtu->dev, "%s stall (%d)\n", __func__, handled); in ep0_handle_setup()
657 ep0_stall_set(mtu->ep0, true, in ep0_handle_setup()
664 if (mtu->test_mode) { in ep0_handle_setup()
668 mtu->delayed_status = true; in ep0_handle_setup()
676 mreq = next_ep0_request(mtu); in ep0_handle_setup()
678 ep0_req_giveback(mtu, &mreq->request); in ep0_handle_setup()
684 irqreturn_t mtu3_ep0_isr(struct mtu3 *mtu) in mtu3_ep0_isr() argument
686 void __iomem *mbase = mtu->mac_base; in mtu3_ep0_isr()
703 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in mtu3_ep0_isr()
707 dev_dbg(mtu->dev, "%s csr=0x%x\n", __func__, csr); in mtu3_ep0_isr()
711 ep0_stall_set(mtu->ep0, false, 0); in mtu3_ep0_isr()
715 dev_dbg(mtu->dev, "ep0_state: %s\n", decode_ep0_state(mtu)); in mtu3_ep0_isr()
716 mtu3_dbg_trace(mtu->dev, "ep0_state %s", decode_ep0_state(mtu)); in mtu3_ep0_isr()
718 switch (mtu->ep0_state) { in mtu3_ep0_isr()
722 ep0_tx_state(mtu); in mtu3_ep0_isr()
729 ep0_rx_state(mtu); in mtu3_ep0_isr()
737 mreq = next_ep0_request(mtu); in mtu3_ep0_isr()
739 ep0_req_giveback(mtu, &mreq->request); in mtu3_ep0_isr()
741 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in mtu3_ep0_isr()
743 dev_dbg(mtu->dev, "ep0_state: %s\n", decode_ep0_state(mtu)); in mtu3_ep0_isr()
751 dev_err(mtu->dev, "SETUP packet len %d != 8 ?\n", len); in mtu3_ep0_isr()
755 ep0_handle_setup(mtu); in mtu3_ep0_isr()
760 ep0_stall_set(mtu->ep0, true, 0); in mtu3_ep0_isr()
784 struct mtu3 *mtu = mep->mtu; in ep0_queue() local
786 mreq->mtu = mtu; in ep0_queue()
790 dev_dbg(mtu->dev, "%s %s (ep0_state: %s), len#%d\n", __func__, in ep0_queue()
791 mep->name, decode_ep0_state(mtu), mreq->request.length); in ep0_queue()
793 switch (mtu->ep0_state) { in ep0_queue()
799 dev_err(mtu->dev, "%s, error in ep0 state %s\n", __func__, in ep0_queue()
800 decode_ep0_state(mtu)); in ep0_queue()
804 if (mtu->delayed_status) { in ep0_queue()
807 mtu->delayed_status = false; in ep0_queue()
808 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR) & EP0_W1C_BITS; in ep0_queue()
810 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr); in ep0_queue()
821 if (mtu->ep0_state == MU3D_EP0_STATE_TX) in ep0_queue()
822 ep0_tx_state(mtu); in ep0_queue()
832 struct mtu3 *mtu; in mtu3_ep0_queue() local
840 mtu = mep->mtu; in mtu3_ep0_queue()
843 spin_lock_irqsave(&mtu->lock, flags); in mtu3_ep0_queue()
845 spin_unlock_irqrestore(&mtu->lock, flags); in mtu3_ep0_queue()
858 struct mtu3 *mtu; in mtu3_ep0_halt() local
866 mtu = mep->mtu; in mtu3_ep0_halt()
868 dev_dbg(mtu->dev, "%s\n", __func__); in mtu3_ep0_halt()
870 spin_lock_irqsave(&mtu->lock, flags); in mtu3_ep0_halt()
877 switch (mtu->ep0_state) { in mtu3_ep0_halt()
886 ep0_stall_set(mtu->ep0, true, 0); in mtu3_ep0_halt()
889 dev_dbg(mtu->dev, "ep0 can't halt in state %s\n", in mtu3_ep0_halt()
890 decode_ep0_state(mtu)); in mtu3_ep0_halt()
895 spin_unlock_irqrestore(&mtu->lock, flags); in mtu3_ep0_halt()