Lines Matching full:mtu
16 #define next_ep0_request(mtu) next_request((mtu)->ep0) argument
37 static char *decode_ep0_state(struct mtu3 *mtu) in decode_ep0_state() argument
39 switch (mtu->ep0_state) { in decode_ep0_state()
55 static void ep0_req_giveback(struct mtu3 *mtu, struct usb_request *req) in ep0_req_giveback() argument
57 mtu3_req_complete(mtu->ep0, req, 0); in ep0_req_giveback()
61 forward_to_driver(struct mtu3 *mtu, const struct usb_ctrlrequest *setup) in forward_to_driver() argument
62 __releases(mtu->lock) in forward_to_driver()
63 __acquires(mtu->lock) in forward_to_driver()
67 if (!mtu->gadget_driver) in forward_to_driver()
70 spin_unlock(&mtu->lock); in forward_to_driver()
71 ret = mtu->gadget_driver->setup(&mtu->g, setup); in forward_to_driver()
72 spin_lock(&mtu->lock); in forward_to_driver()
74 dev_dbg(mtu->dev, "%s ret %d\n", __func__, ret); in forward_to_driver()
80 void __iomem *fifo = mep->mtu->mac_base + U3D_FIFO0; in ep0_write_fifo()
83 dev_dbg(mep->mtu->dev, "%s: ep%din, len=%d, buf=%p\n", in ep0_write_fifo()
100 void __iomem *fifo = mep->mtu->mac_base + U3D_FIFO0; in ep0_read_fifo()
104 dev_dbg(mep->mtu->dev, "%s: ep%dout len=%d buf=%p\n", in ep0_read_fifo()
118 static void ep0_load_test_packet(struct mtu3 *mtu) in ep0_load_test_packet() argument
124 ep0_write_fifo(mtu->ep0, mtu3_test_packet, sizeof(mtu3_test_packet)); in ep0_load_test_packet()
135 struct mtu3 *mtu = mep0->mtu; in ep0_stall_set() local
136 void __iomem *mbase = mtu->mac_base; in ep0_stall_set()
145 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr); in ep0_stall_set()
147 mtu->delayed_status = false; in ep0_stall_set()
148 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in ep0_stall_set()
150 dev_dbg(mtu->dev, "ep0: %s STALL, ep0_state: %s\n", in ep0_stall_set()
151 set ? "SEND" : "CLEAR", decode_ep0_state(mtu)); in ep0_stall_set()
162 struct mtu3 *mtu; in ep0_set_sel_complete() local
168 mtu = mreq->mtu; in ep0_set_sel_complete()
169 dev_dbg(mtu->dev, "u1sel:%d, u1pel:%d, u2sel:%d, u2pel:%d\n", in ep0_set_sel_complete()
174 static int ep0_set_sel(struct mtu3 *mtu, struct usb_ctrlrequest *setup) in ep0_set_sel() argument
180 dev_err(mtu->dev, "%s wrong wLength:%d\n", in ep0_set_sel()
185 mtu->ep0_req.mep = mtu->ep0; in ep0_set_sel()
186 mtu->ep0_req.request.length = 6; in ep0_set_sel()
187 mtu->ep0_req.request.buf = mtu->setup_buf; in ep0_set_sel()
188 mtu->ep0_req.request.complete = ep0_set_sel_complete; in ep0_set_sel()
189 ret = ep0_queue(mtu->ep0, &mtu->ep0_req); in ep0_set_sel()
195 ep0_get_status(struct mtu3 *mtu, const struct usb_ctrlrequest *setup) in ep0_get_status() argument
205 result[0] = mtu->is_self_powered << USB_DEVICE_SELF_POWERED; in ep0_get_status()
206 result[0] |= mtu->may_wakeup << USB_DEVICE_REMOTE_WAKEUP; in ep0_get_status()
208 if (mtu->g.speed >= USB_SPEED_SUPER) { in ep0_get_status()
209 result[0] |= mtu->u1_enable << USB_DEV_STAT_U1_ENABLED; in ep0_get_status()
210 result[0] |= mtu->u2_enable << USB_DEV_STAT_U2_ENABLED; in ep0_get_status()
213 dev_dbg(mtu->dev, "%s result=%x, U1=%x, U2=%x\n", __func__, in ep0_get_status()
214 result[0], mtu->u1_enable, mtu->u2_enable); in ep0_get_status()
224 if (epnum >= mtu->num_eps) { in ep0_get_status()
231 mep = (is_in ? mtu->in_eps : mtu->out_eps) + epnum; in ep0_get_status()
250 dev_dbg(mtu->dev, "get_status=%x\n", *(u16 *)result); in ep0_get_status()
251 memcpy(mtu->setup_buf, result, sizeof(result)); in ep0_get_status()
252 mtu->ep0_req.mep = mtu->ep0; in ep0_get_status()
253 mtu->ep0_req.request.length = 2; in ep0_get_status()
254 mtu->ep0_req.request.buf = &mtu->setup_buf; in ep0_get_status()
255 mtu->ep0_req.request.complete = ep0_dummy_complete; in ep0_get_status()
256 ret = ep0_queue(mtu->ep0, &mtu->ep0_req); in ep0_get_status()
263 static int handle_test_mode(struct mtu3 *mtu, struct usb_ctrlrequest *setup) in handle_test_mode() argument
265 void __iomem *mbase = mtu->mac_base; in handle_test_mode()
271 dev_dbg(mtu->dev, "TEST_J\n"); in handle_test_mode()
272 mtu->test_mode_nr = TEST_J_MODE; in handle_test_mode()
275 dev_dbg(mtu->dev, "TEST_K\n"); in handle_test_mode()
276 mtu->test_mode_nr = TEST_K_MODE; in handle_test_mode()
279 dev_dbg(mtu->dev, "TEST_SE0_NAK\n"); in handle_test_mode()
280 mtu->test_mode_nr = TEST_SE0_NAK_MODE; in handle_test_mode()
283 dev_dbg(mtu->dev, "TEST_PACKET\n"); in handle_test_mode()
284 mtu->test_mode_nr = TEST_PACKET_MODE; in handle_test_mode()
291 mtu->test_mode = true; in handle_test_mode()
294 if (mtu->test_mode_nr == TEST_PACKET_MODE) in handle_test_mode()
295 ep0_load_test_packet(mtu); in handle_test_mode()
305 mtu3_writel(mbase, U3D_USB2_TEST_MODE, mtu->test_mode_nr); in handle_test_mode()
307 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in handle_test_mode()
313 static int ep0_handle_feature_dev(struct mtu3 *mtu, in ep0_handle_feature_dev() argument
316 void __iomem *mbase = mtu->mac_base; in ep0_handle_feature_dev()
322 mtu->may_wakeup = !!set; in ep0_handle_feature_dev()
326 if (!set || (mtu->g.speed != USB_SPEED_HIGH) || in ep0_handle_feature_dev()
330 handled = handle_test_mode(mtu, setup); in ep0_handle_feature_dev()
333 if (mtu->g.speed < USB_SPEED_SUPER || in ep0_handle_feature_dev()
334 mtu->g.state != USB_STATE_CONFIGURED) in ep0_handle_feature_dev()
344 mtu->u1_enable = !!set; in ep0_handle_feature_dev()
348 if (mtu->g.speed < USB_SPEED_SUPER || in ep0_handle_feature_dev()
349 mtu->g.state != USB_STATE_CONFIGURED) in ep0_handle_feature_dev()
359 mtu->u2_enable = !!set; in ep0_handle_feature_dev()
369 static int ep0_handle_feature(struct mtu3 *mtu, in ep0_handle_feature() argument
384 handled = ep0_handle_feature_dev(mtu, setup, set); in ep0_handle_feature()
389 mtu->g.speed >= USB_SPEED_SUPER) { in ep0_handle_feature()
399 if (epnum == 0 || epnum >= mtu->num_eps || in ep0_handle_feature()
404 mep = (is_in ? mtu->in_eps : mtu->out_eps) + epnum; in ep0_handle_feature()
430 static int handle_standard_request(struct mtu3 *mtu, in handle_standard_request() argument
433 void __iomem *mbase = mtu->mac_base; in handle_standard_request()
434 enum usb_device_state state = mtu->g.state; in handle_standard_request()
445 mtu->address = (u8) (value & 0x7f); in handle_standard_request()
446 dev_dbg(mtu->dev, "set address to 0x%x\n", mtu->address); in handle_standard_request()
450 dev_conf |= DEV_ADDR(mtu->address); in handle_standard_request()
453 if (mtu->address) in handle_standard_request()
454 usb_gadget_set_state(&mtu->g, USB_STATE_ADDRESS); in handle_standard_request()
456 usb_gadget_set_state(&mtu->g, USB_STATE_DEFAULT); in handle_standard_request()
462 usb_gadget_set_state(&mtu->g, in handle_standard_request()
470 usb_gadget_set_state(&mtu->g, in handle_standard_request()
476 handled = ep0_handle_feature(mtu, setup, 0); in handle_standard_request()
479 handled = ep0_handle_feature(mtu, setup, 1); in handle_standard_request()
482 handled = ep0_get_status(mtu, setup); in handle_standard_request()
485 handled = ep0_set_sel(mtu, setup); in handle_standard_request()
499 static void ep0_rx_state(struct mtu3 *mtu) in ep0_rx_state() argument
503 void __iomem *mbase = mtu->mac_base; in ep0_rx_state()
508 dev_dbg(mtu->dev, "%s\n", __func__); in ep0_rx_state()
511 mreq = next_ep0_request(mtu); in ep0_rx_state()
525 ep0_read_fifo(mtu->ep0, buf, count); in ep0_rx_state()
529 maxp = mtu->g.ep0->maxpacket; in ep0_rx_state()
531 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in ep0_rx_state()
532 dev_dbg(mtu->dev, "ep0 state: %s\n", in ep0_rx_state()
533 decode_ep0_state(mtu)); in ep0_rx_state()
541 dev_dbg(mtu->dev, "%s: SENDSTALL\n", __func__); in ep0_rx_state()
548 ep0_req_giveback(mtu, req); in ep0_rx_state()
553 static void ep0_tx_state(struct mtu3 *mtu) in ep0_tx_state() argument
555 struct mtu3_request *mreq = next_ep0_request(mtu); in ep0_tx_state()
562 dev_dbg(mtu->dev, "%s\n", __func__); in ep0_tx_state()
567 maxp = mtu->g.ep0->maxpacket; in ep0_tx_state()
574 ep0_write_fifo(mtu->ep0, src, count); in ep0_tx_state()
576 dev_dbg(mtu->dev, "%s act=%d, len=%d, cnt=%d, maxp=%d zero=%d\n", in ep0_tx_state()
583 mtu->ep0_state = MU3D_EP0_STATE_TX_END; in ep0_tx_state()
586 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR) & EP0_W1C_BITS; in ep0_tx_state()
587 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr | EP0_TXPKTRDY); in ep0_tx_state()
589 dev_dbg(mtu->dev, "%s ep0csr=0x%x\n", __func__, in ep0_tx_state()
590 mtu3_readl(mtu->mac_base, U3D_EP0CSR)); in ep0_tx_state()
593 static void ep0_read_setup(struct mtu3 *mtu, struct usb_ctrlrequest *setup) in ep0_read_setup() argument
599 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR) & EP0_W1C_BITS; in ep0_read_setup()
600 count = mtu3_readl(mtu->mac_base, U3D_RXCOUNT0); in ep0_read_setup()
602 ep0_read_fifo(mtu->ep0, (u8 *)setup, count); in ep0_read_setup()
604 dev_dbg(mtu->dev, "SETUP req%02x.%02x v%04x i%04x l%04x\n", in ep0_read_setup()
610 mreq = next_ep0_request(mtu); in ep0_read_setup()
612 ep0_req_giveback(mtu, &mreq->request); in ep0_read_setup()
617 mtu3_writel(mtu->mac_base, U3D_EP0CSR, in ep0_read_setup()
619 mtu->ep0_state = MU3D_EP0_STATE_TX; in ep0_read_setup()
621 mtu3_writel(mtu->mac_base, U3D_EP0CSR, in ep0_read_setup()
623 mtu->ep0_state = MU3D_EP0_STATE_RX; in ep0_read_setup()
627 static int ep0_handle_setup(struct mtu3 *mtu) in ep0_handle_setup() argument
628 __releases(mtu->lock) in ep0_handle_setup()
629 __acquires(mtu->lock) in ep0_handle_setup()
633 void __iomem *mbase = mtu->mac_base; in ep0_handle_setup()
636 ep0_read_setup(mtu, &setup); in ep0_handle_setup()
639 handled = handle_standard_request(mtu, &setup); in ep0_handle_setup()
641 dev_dbg(mtu->dev, "handled %d, ep0_state: %s\n", in ep0_handle_setup()
642 handled, decode_ep0_state(mtu)); in ep0_handle_setup()
649 handled = forward_to_driver(mtu, &setup); in ep0_handle_setup()
652 dev_dbg(mtu->dev, "%s stall (%d)\n", __func__, handled); in ep0_handle_setup()
654 ep0_stall_set(mtu->ep0, true, in ep0_handle_setup()
661 if (mtu->test_mode) { in ep0_handle_setup()
665 mtu->delayed_status = true; in ep0_handle_setup()
673 mreq = next_ep0_request(mtu); in ep0_handle_setup()
675 ep0_req_giveback(mtu, &mreq->request); in ep0_handle_setup()
681 irqreturn_t mtu3_ep0_isr(struct mtu3 *mtu) in mtu3_ep0_isr() argument
683 void __iomem *mbase = mtu->mac_base; in mtu3_ep0_isr()
700 dev_dbg(mtu->dev, "%s csr=0x%x\n", __func__, csr); in mtu3_ep0_isr()
704 ep0_stall_set(mtu->ep0, false, 0); in mtu3_ep0_isr()
708 dev_dbg(mtu->dev, "ep0_state: %s\n", decode_ep0_state(mtu)); in mtu3_ep0_isr()
710 switch (mtu->ep0_state) { in mtu3_ep0_isr()
714 ep0_tx_state(mtu); in mtu3_ep0_isr()
721 ep0_rx_state(mtu); in mtu3_ep0_isr()
729 mreq = next_ep0_request(mtu); in mtu3_ep0_isr()
731 ep0_req_giveback(mtu, &mreq->request); in mtu3_ep0_isr()
733 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in mtu3_ep0_isr()
735 dev_dbg(mtu->dev, "ep0_state: %s\n", decode_ep0_state(mtu)); in mtu3_ep0_isr()
743 dev_err(mtu->dev, "SETUP packet len %d != 8 ?\n", len); in mtu3_ep0_isr()
747 ep0_handle_setup(mtu); in mtu3_ep0_isr()
752 ep0_stall_set(mtu->ep0, true, 0); in mtu3_ep0_isr()
776 struct mtu3 *mtu = mep->mtu; in ep0_queue() local
778 mreq->mtu = mtu; in ep0_queue()
782 dev_dbg(mtu->dev, "%s %s (ep0_state: %s), len#%d\n", __func__, in ep0_queue()
783 mep->name, decode_ep0_state(mtu), mreq->request.length); in ep0_queue()
785 switch (mtu->ep0_state) { in ep0_queue()
791 dev_err(mtu->dev, "%s, error in ep0 state %s\n", __func__, in ep0_queue()
792 decode_ep0_state(mtu)); in ep0_queue()
796 if (mtu->delayed_status) { in ep0_queue()
799 mtu->delayed_status = false; in ep0_queue()
800 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR) & EP0_W1C_BITS; in ep0_queue()
802 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr); in ep0_queue()
813 if (mtu->ep0_state == MU3D_EP0_STATE_TX) in ep0_queue()
814 ep0_tx_state(mtu); in ep0_queue()
824 struct mtu3 *mtu; in mtu3_ep0_queue() local
832 mtu = mep->mtu; in mtu3_ep0_queue()
835 spin_lock_irqsave(&mtu->lock, flags); in mtu3_ep0_queue()
837 spin_unlock_irqrestore(&mtu->lock, flags); in mtu3_ep0_queue()
850 struct mtu3 *mtu; in mtu3_ep0_halt() local
858 mtu = mep->mtu; in mtu3_ep0_halt()
860 dev_dbg(mtu->dev, "%s\n", __func__); in mtu3_ep0_halt()
862 spin_lock_irqsave(&mtu->lock, flags); in mtu3_ep0_halt()
869 switch (mtu->ep0_state) { in mtu3_ep0_halt()
878 ep0_stall_set(mtu->ep0, true, 0); in mtu3_ep0_halt()
881 dev_dbg(mtu->dev, "ep0 can't halt in state %s\n", in mtu3_ep0_halt()
882 decode_ep0_state(mtu)); in mtu3_ep0_halt()
887 spin_unlock_irqrestore(&mtu->lock, flags); in mtu3_ep0_halt()