x86/speculation/mds: Fix documentation typo
[linux/fpc-iii.git] / drivers / usb / mtu3 / mtu3_gadget_ep0.c
blob7997cf5f06fc7aa0ade909d9440ee21afc090b18
1 /*
2 * mtu3_gadget_ep0.c - MediaTek USB3 DRD peripheral driver ep0 handling
4 * Copyright (c) 2016 MediaTek Inc.
6 * Author: Chunfeng.Yun <chunfeng.yun@mediatek.com>
8 * This software is licensed under the terms of the GNU General Public
9 * License version 2, as published by the Free Software Foundation, and
10 * may be copied, distributed, and modified under those terms.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
19 #include <linux/usb/composite.h>
21 #include "mtu3.h"
23 /* ep0 is always mtu3->in_eps[0] */
24 #define next_ep0_request(mtu) next_request((mtu)->ep0)
26 /* for high speed test mode; see USB 2.0 spec 7.1.20 */
27 static const u8 mtu3_test_packet[53] = {
28 /* implicit SYNC then DATA0 to start */
30 /* JKJKJKJK x9 */
31 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32 /* JJKKJJKK x8 */
33 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
34 /* JJJJKKKK x8 */
35 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
36 /* JJJJJJJKKKKKKK x8 */
37 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
38 /* JJJJJJJK x8 */
39 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd,
40 /* JKKKKKKK x10, JK */
41 0xfc, 0x7e, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0x7e,
42 /* implicit CRC16 then EOP to end */
45 static char *decode_ep0_state(struct mtu3 *mtu)
47 switch (mtu->ep0_state) {
48 case MU3D_EP0_STATE_SETUP:
49 return "SETUP";
50 case MU3D_EP0_STATE_TX:
51 return "IN";
52 case MU3D_EP0_STATE_RX:
53 return "OUT";
54 case MU3D_EP0_STATE_TX_END:
55 return "TX-END";
56 case MU3D_EP0_STATE_STALL:
57 return "STALL";
58 default:
59 return "??";
63 static void ep0_req_giveback(struct mtu3 *mtu, struct usb_request *req)
65 mtu3_req_complete(mtu->ep0, req, 0);
68 static int
69 forward_to_driver(struct mtu3 *mtu, const struct usb_ctrlrequest *setup)
70 __releases(mtu->lock)
71 __acquires(mtu->lock)
73 int ret;
75 if (!mtu->gadget_driver)
76 return -EOPNOTSUPP;
78 spin_unlock(&mtu->lock);
79 ret = mtu->gadget_driver->setup(&mtu->g, setup);
80 spin_lock(&mtu->lock);
82 dev_dbg(mtu->dev, "%s ret %d\n", __func__, ret);
83 return ret;
86 static void ep0_write_fifo(struct mtu3_ep *mep, const u8 *src, u16 len)
88 void __iomem *fifo = mep->mtu->mac_base + U3D_FIFO0;
89 u16 index = 0;
91 dev_dbg(mep->mtu->dev, "%s: ep%din, len=%d, buf=%p\n",
92 __func__, mep->epnum, len, src);
94 if (len >= 4) {
95 iowrite32_rep(fifo, src, len >> 2);
96 index = len & ~0x03;
98 if (len & 0x02) {
99 writew(*(u16 *)&src[index], fifo);
100 index += 2;
102 if (len & 0x01)
103 writeb(src[index], fifo);
106 static void ep0_read_fifo(struct mtu3_ep *mep, u8 *dst, u16 len)
108 void __iomem *fifo = mep->mtu->mac_base + U3D_FIFO0;
109 u32 value;
110 u16 index = 0;
112 dev_dbg(mep->mtu->dev, "%s: ep%dout len=%d buf=%p\n",
113 __func__, mep->epnum, len, dst);
115 if (len >= 4) {
116 ioread32_rep(fifo, dst, len >> 2);
117 index = len & ~0x03;
119 if (len & 0x3) {
120 value = readl(fifo);
121 memcpy(&dst[index], &value, len & 0x3);
126 static void ep0_load_test_packet(struct mtu3 *mtu)
129 * because the length of test packet is less than max packet of HS ep0,
130 * write it into fifo directly.
132 ep0_write_fifo(mtu->ep0, mtu3_test_packet, sizeof(mtu3_test_packet));
136 * A. send STALL for setup transfer without data stage:
137 * set SENDSTALL and SETUPPKTRDY at the same time;
138 * B. send STALL for other cases:
139 * set SENDSTALL only.
141 static void ep0_stall_set(struct mtu3_ep *mep0, bool set, u32 pktrdy)
143 struct mtu3 *mtu = mep0->mtu;
144 void __iomem *mbase = mtu->mac_base;
145 u32 csr;
147 /* EP0_SENTSTALL is W1C */
148 csr = mtu3_readl(mbase, U3D_EP0CSR) & EP0_W1C_BITS;
149 if (set)
150 csr |= EP0_SENDSTALL | pktrdy;
151 else
152 csr = (csr & ~EP0_SENDSTALL) | EP0_SENTSTALL;
153 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr);
155 mtu->delayed_status = false;
156 mtu->ep0_state = MU3D_EP0_STATE_SETUP;
158 dev_dbg(mtu->dev, "ep0: %s STALL, ep0_state: %s\n",
159 set ? "SEND" : "CLEAR", decode_ep0_state(mtu));
162 static int ep0_queue(struct mtu3_ep *mep0, struct mtu3_request *mreq);
164 static void ep0_dummy_complete(struct usb_ep *ep, struct usb_request *req)
167 static void ep0_set_sel_complete(struct usb_ep *ep, struct usb_request *req)
169 struct mtu3_request *mreq;
170 struct mtu3 *mtu;
171 struct usb_set_sel_req sel;
173 memcpy(&sel, req->buf, sizeof(sel));
175 mreq = to_mtu3_request(req);
176 mtu = mreq->mtu;
177 dev_dbg(mtu->dev, "u1sel:%d, u1pel:%d, u2sel:%d, u2pel:%d\n",
178 sel.u1_sel, sel.u1_pel, sel.u2_sel, sel.u2_pel);
181 /* queue data stage to handle 6 byte SET_SEL request */
182 static int ep0_set_sel(struct mtu3 *mtu, struct usb_ctrlrequest *setup)
184 int ret;
185 u16 length = le16_to_cpu(setup->wLength);
187 if (unlikely(length != 6)) {
188 dev_err(mtu->dev, "%s wrong wLength:%d\n",
189 __func__, length);
190 return -EINVAL;
193 mtu->ep0_req.mep = mtu->ep0;
194 mtu->ep0_req.request.length = 6;
195 mtu->ep0_req.request.buf = mtu->setup_buf;
196 mtu->ep0_req.request.complete = ep0_set_sel_complete;
197 ret = ep0_queue(mtu->ep0, &mtu->ep0_req);
199 return ret < 0 ? ret : 1;
202 static int
203 ep0_get_status(struct mtu3 *mtu, const struct usb_ctrlrequest *setup)
205 struct mtu3_ep *mep = NULL;
206 int handled = 1;
207 u8 result[2] = {0, 0};
208 u8 epnum = 0;
209 int is_in;
211 switch (setup->bRequestType & USB_RECIP_MASK) {
212 case USB_RECIP_DEVICE:
213 result[0] = mtu->is_self_powered << USB_DEVICE_SELF_POWERED;
214 result[0] |= mtu->may_wakeup << USB_DEVICE_REMOTE_WAKEUP;
215 /* superspeed only */
216 if (mtu->g.speed == USB_SPEED_SUPER) {
217 result[0] |= mtu->u1_enable << USB_DEV_STAT_U1_ENABLED;
218 result[0] |= mtu->u2_enable << USB_DEV_STAT_U2_ENABLED;
221 dev_dbg(mtu->dev, "%s result=%x, U1=%x, U2=%x\n", __func__,
222 result[0], mtu->u1_enable, mtu->u2_enable);
224 break;
225 case USB_RECIP_INTERFACE:
226 break;
227 case USB_RECIP_ENDPOINT:
228 epnum = (u8) le16_to_cpu(setup->wIndex);
229 is_in = epnum & USB_DIR_IN;
230 epnum &= USB_ENDPOINT_NUMBER_MASK;
232 if (epnum >= mtu->num_eps) {
233 handled = -EINVAL;
234 break;
236 if (!epnum)
237 break;
239 mep = (is_in ? mtu->in_eps : mtu->out_eps) + epnum;
240 if (!mep->desc) {
241 handled = -EINVAL;
242 break;
244 if (mep->flags & MTU3_EP_STALL)
245 result[0] |= 1 << USB_ENDPOINT_HALT;
247 break;
248 default:
249 /* class, vendor, etc ... delegate */
250 handled = 0;
251 break;
254 if (handled > 0) {
255 int ret;
257 /* prepare a data stage for GET_STATUS */
258 dev_dbg(mtu->dev, "get_status=%x\n", *(u16 *)result);
259 memcpy(mtu->setup_buf, result, sizeof(result));
260 mtu->ep0_req.mep = mtu->ep0;
261 mtu->ep0_req.request.length = 2;
262 mtu->ep0_req.request.buf = &mtu->setup_buf;
263 mtu->ep0_req.request.complete = ep0_dummy_complete;
264 ret = ep0_queue(mtu->ep0, &mtu->ep0_req);
265 if (ret < 0)
266 handled = ret;
268 return handled;
271 static int handle_test_mode(struct mtu3 *mtu, struct usb_ctrlrequest *setup)
273 void __iomem *mbase = mtu->mac_base;
274 int handled = 1;
276 switch (le16_to_cpu(setup->wIndex) >> 8) {
277 case TEST_J:
278 dev_dbg(mtu->dev, "TEST_J\n");
279 mtu->test_mode_nr = TEST_J_MODE;
280 break;
281 case TEST_K:
282 dev_dbg(mtu->dev, "TEST_K\n");
283 mtu->test_mode_nr = TEST_K_MODE;
284 break;
285 case TEST_SE0_NAK:
286 dev_dbg(mtu->dev, "TEST_SE0_NAK\n");
287 mtu->test_mode_nr = TEST_SE0_NAK_MODE;
288 break;
289 case TEST_PACKET:
290 dev_dbg(mtu->dev, "TEST_PACKET\n");
291 mtu->test_mode_nr = TEST_PACKET_MODE;
292 break;
293 default:
294 handled = -EINVAL;
295 goto out;
298 mtu->test_mode = true;
300 /* no TX completion interrupt, and need restart platform after test */
301 if (mtu->test_mode_nr == TEST_PACKET_MODE)
302 ep0_load_test_packet(mtu);
304 mtu3_writel(mbase, U3D_USB2_TEST_MODE, mtu->test_mode_nr);
306 mtu->ep0_state = MU3D_EP0_STATE_SETUP;
308 out:
309 return handled;
312 static int ep0_handle_feature_dev(struct mtu3 *mtu,
313 struct usb_ctrlrequest *setup, bool set)
315 void __iomem *mbase = mtu->mac_base;
316 int handled = -EINVAL;
317 u32 lpc;
319 switch (le16_to_cpu(setup->wValue)) {
320 case USB_DEVICE_REMOTE_WAKEUP:
321 mtu->may_wakeup = !!set;
322 handled = 1;
323 break;
324 case USB_DEVICE_TEST_MODE:
325 if (!set || (mtu->g.speed != USB_SPEED_HIGH) ||
326 (le16_to_cpu(setup->wIndex) & 0xff))
327 break;
329 handled = handle_test_mode(mtu, setup);
330 break;
331 case USB_DEVICE_U1_ENABLE:
332 if (mtu->g.speed != USB_SPEED_SUPER ||
333 mtu->g.state != USB_STATE_CONFIGURED)
334 break;
336 lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL);
337 if (set)
338 lpc |= SW_U1_REQUEST_ENABLE;
339 else
340 lpc &= ~SW_U1_REQUEST_ENABLE;
341 mtu3_writel(mbase, U3D_LINK_POWER_CONTROL, lpc);
343 mtu->u1_enable = !!set;
344 handled = 1;
345 break;
346 case USB_DEVICE_U2_ENABLE:
347 if (mtu->g.speed != USB_SPEED_SUPER ||
348 mtu->g.state != USB_STATE_CONFIGURED)
349 break;
351 lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL);
352 if (set)
353 lpc |= SW_U2_REQUEST_ENABLE;
354 else
355 lpc &= ~SW_U2_REQUEST_ENABLE;
356 mtu3_writel(mbase, U3D_LINK_POWER_CONTROL, lpc);
358 mtu->u2_enable = !!set;
359 handled = 1;
360 break;
361 default:
362 handled = -EINVAL;
363 break;
365 return handled;
368 static int ep0_handle_feature(struct mtu3 *mtu,
369 struct usb_ctrlrequest *setup, bool set)
371 struct mtu3_ep *mep;
372 int handled = -EINVAL;
373 int is_in;
374 u16 value;
375 u16 index;
376 u8 epnum;
378 value = le16_to_cpu(setup->wValue);
379 index = le16_to_cpu(setup->wIndex);
381 switch (setup->bRequestType & USB_RECIP_MASK) {
382 case USB_RECIP_DEVICE:
383 handled = ep0_handle_feature_dev(mtu, setup, set);
384 break;
385 case USB_RECIP_INTERFACE:
386 /* superspeed only */
387 if ((value == USB_INTRF_FUNC_SUSPEND)
388 && (mtu->g.speed == USB_SPEED_SUPER)) {
390 * forward the request because function drivers
391 * should handle it
393 handled = 0;
395 break;
396 case USB_RECIP_ENDPOINT:
397 epnum = index & USB_ENDPOINT_NUMBER_MASK;
398 if (epnum == 0 || epnum >= mtu->num_eps ||
399 value != USB_ENDPOINT_HALT)
400 break;
402 is_in = index & USB_DIR_IN;
403 mep = (is_in ? mtu->in_eps : mtu->out_eps) + epnum;
404 if (!mep->desc)
405 break;
407 handled = 1;
408 /* ignore request if endpoint is wedged */
409 if (mep->wedged)
410 break;
412 mtu3_ep_stall_set(mep, set);
413 break;
414 default:
415 /* class, vendor, etc ... delegate */
416 handled = 0;
417 break;
419 return handled;
423 * handle all control requests can be handled
424 * returns:
425 * negative errno - error happened
426 * zero - need delegate SETUP to gadget driver
427 * positive - already handled
429 static int handle_standard_request(struct mtu3 *mtu,
430 struct usb_ctrlrequest *setup)
432 void __iomem *mbase = mtu->mac_base;
433 enum usb_device_state state = mtu->g.state;
434 int handled = -EINVAL;
435 u32 dev_conf;
436 u16 value;
438 value = le16_to_cpu(setup->wValue);
440 /* the gadget driver handles everything except what we must handle */
441 switch (setup->bRequest) {
442 case USB_REQ_SET_ADDRESS:
443 /* change it after the status stage */
444 mtu->address = (u8) (value & 0x7f);
445 dev_dbg(mtu->dev, "set address to 0x%x\n", mtu->address);
447 dev_conf = mtu3_readl(mbase, U3D_DEVICE_CONF);
448 dev_conf &= ~DEV_ADDR_MSK;
449 dev_conf |= DEV_ADDR(mtu->address);
450 mtu3_writel(mbase, U3D_DEVICE_CONF, dev_conf);
452 if (mtu->address)
453 usb_gadget_set_state(&mtu->g, USB_STATE_ADDRESS);
454 else
455 usb_gadget_set_state(&mtu->g, USB_STATE_DEFAULT);
457 handled = 1;
458 break;
459 case USB_REQ_SET_CONFIGURATION:
460 if (state == USB_STATE_ADDRESS) {
461 usb_gadget_set_state(&mtu->g,
462 USB_STATE_CONFIGURED);
463 } else if (state == USB_STATE_CONFIGURED) {
465 * USB2 spec sec 9.4.7, if wValue is 0 then dev
466 * is moved to addressed state
468 if (!value)
469 usb_gadget_set_state(&mtu->g,
470 USB_STATE_ADDRESS);
472 handled = 0;
473 break;
474 case USB_REQ_CLEAR_FEATURE:
475 handled = ep0_handle_feature(mtu, setup, 0);
476 break;
477 case USB_REQ_SET_FEATURE:
478 handled = ep0_handle_feature(mtu, setup, 1);
479 break;
480 case USB_REQ_GET_STATUS:
481 handled = ep0_get_status(mtu, setup);
482 break;
483 case USB_REQ_SET_SEL:
484 handled = ep0_set_sel(mtu, setup);
485 break;
486 case USB_REQ_SET_ISOCH_DELAY:
487 handled = 1;
488 break;
489 default:
490 /* delegate SET_CONFIGURATION, etc */
491 handled = 0;
494 return handled;
497 /* receive an data packet (OUT) */
498 static void ep0_rx_state(struct mtu3 *mtu)
500 struct mtu3_request *mreq;
501 struct usb_request *req;
502 void __iomem *mbase = mtu->mac_base;
503 u32 maxp;
504 u32 csr;
505 u16 count = 0;
507 dev_dbg(mtu->dev, "%s\n", __func__);
509 csr = mtu3_readl(mbase, U3D_EP0CSR) & EP0_W1C_BITS;
510 mreq = next_ep0_request(mtu);
511 req = &mreq->request;
513 /* read packet and ack; or stall because of gadget driver bug */
514 if (req) {
515 void *buf = req->buf + req->actual;
516 unsigned int len = req->length - req->actual;
518 /* read the buffer */
519 count = mtu3_readl(mbase, U3D_RXCOUNT0);
520 if (count > len) {
521 req->status = -EOVERFLOW;
522 count = len;
524 ep0_read_fifo(mtu->ep0, buf, count);
525 req->actual += count;
526 csr |= EP0_RXPKTRDY;
528 maxp = mtu->g.ep0->maxpacket;
529 if (count < maxp || req->actual == req->length) {
530 mtu->ep0_state = MU3D_EP0_STATE_SETUP;
531 dev_dbg(mtu->dev, "ep0 state: %s\n",
532 decode_ep0_state(mtu));
534 csr |= EP0_DATAEND;
535 } else {
536 req = NULL;
538 } else {
539 csr |= EP0_RXPKTRDY | EP0_SENDSTALL;
540 dev_dbg(mtu->dev, "%s: SENDSTALL\n", __func__);
543 mtu3_writel(mbase, U3D_EP0CSR, csr);
545 /* give back the request if have received all data */
546 if (req)
547 ep0_req_giveback(mtu, req);
551 /* transmitting to the host (IN) */
552 static void ep0_tx_state(struct mtu3 *mtu)
554 struct mtu3_request *mreq = next_ep0_request(mtu);
555 struct usb_request *req;
556 u32 csr;
557 u8 *src;
558 u8 count;
559 u32 maxp;
561 dev_dbg(mtu->dev, "%s\n", __func__);
563 if (!mreq)
564 return;
566 maxp = mtu->g.ep0->maxpacket;
567 req = &mreq->request;
569 /* load the data */
570 src = (u8 *)req->buf + req->actual;
571 count = min(maxp, req->length - req->actual);
572 if (count)
573 ep0_write_fifo(mtu->ep0, src, count);
575 dev_dbg(mtu->dev, "%s act=%d, len=%d, cnt=%d, maxp=%d zero=%d\n",
576 __func__, req->actual, req->length, count, maxp, req->zero);
578 req->actual += count;
580 if ((count < maxp)
581 || ((req->actual == req->length) && !req->zero))
582 mtu->ep0_state = MU3D_EP0_STATE_TX_END;
584 /* send it out, triggering a "txpktrdy cleared" irq */
585 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR) & EP0_W1C_BITS;
586 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr | EP0_TXPKTRDY);
588 dev_dbg(mtu->dev, "%s ep0csr=0x%x\n", __func__,
589 mtu3_readl(mtu->mac_base, U3D_EP0CSR));
592 static void ep0_read_setup(struct mtu3 *mtu, struct usb_ctrlrequest *setup)
594 struct mtu3_request *mreq;
595 u32 count;
596 u32 csr;
598 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR) & EP0_W1C_BITS;
599 count = mtu3_readl(mtu->mac_base, U3D_RXCOUNT0);
601 ep0_read_fifo(mtu->ep0, (u8 *)setup, count);
603 dev_dbg(mtu->dev, "SETUP req%02x.%02x v%04x i%04x l%04x\n",
604 setup->bRequestType, setup->bRequest,
605 le16_to_cpu(setup->wValue), le16_to_cpu(setup->wIndex),
606 le16_to_cpu(setup->wLength));
608 /* clean up any leftover transfers */
609 mreq = next_ep0_request(mtu);
610 if (mreq)
611 ep0_req_giveback(mtu, &mreq->request);
613 if (le16_to_cpu(setup->wLength) == 0) {
614 ; /* no data stage, nothing to do */
615 } else if (setup->bRequestType & USB_DIR_IN) {
616 mtu3_writel(mtu->mac_base, U3D_EP0CSR,
617 csr | EP0_SETUPPKTRDY | EP0_DPHTX);
618 mtu->ep0_state = MU3D_EP0_STATE_TX;
619 } else {
620 mtu3_writel(mtu->mac_base, U3D_EP0CSR,
621 (csr | EP0_SETUPPKTRDY) & (~EP0_DPHTX));
622 mtu->ep0_state = MU3D_EP0_STATE_RX;
626 static int ep0_handle_setup(struct mtu3 *mtu)
627 __releases(mtu->lock)
628 __acquires(mtu->lock)
630 struct usb_ctrlrequest setup;
631 struct mtu3_request *mreq;
632 void __iomem *mbase = mtu->mac_base;
633 int handled = 0;
635 ep0_read_setup(mtu, &setup);
637 if ((setup.bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD)
638 handled = handle_standard_request(mtu, &setup);
640 dev_dbg(mtu->dev, "handled %d, ep0_state: %s\n",
641 handled, decode_ep0_state(mtu));
643 if (handled < 0)
644 goto stall;
645 else if (handled > 0)
646 goto finish;
648 handled = forward_to_driver(mtu, &setup);
649 if (handled < 0) {
650 stall:
651 dev_dbg(mtu->dev, "%s stall (%d)\n", __func__, handled);
653 ep0_stall_set(mtu->ep0, true,
654 le16_to_cpu(setup.wLength) ? 0 : EP0_SETUPPKTRDY);
656 return 0;
659 finish:
660 if (mtu->test_mode) {
661 ; /* nothing to do */
662 } else if (handled == USB_GADGET_DELAYED_STATUS) {
663 /* handle the delay STATUS phase till receive ep_queue on ep0 */
664 mtu->delayed_status = true;
665 } else if (le16_to_cpu(setup.wLength) == 0) { /* no data stage */
667 mtu3_writel(mbase, U3D_EP0CSR,
668 (mtu3_readl(mbase, U3D_EP0CSR) & EP0_W1C_BITS)
669 | EP0_SETUPPKTRDY | EP0_DATAEND);
671 /* complete zlp request directly */
672 mreq = next_ep0_request(mtu);
673 if (mreq && !mreq->request.length)
674 ep0_req_giveback(mtu, &mreq->request);
677 return 0;
680 irqreturn_t mtu3_ep0_isr(struct mtu3 *mtu)
682 void __iomem *mbase = mtu->mac_base;
683 struct mtu3_request *mreq;
684 u32 int_status;
685 irqreturn_t ret = IRQ_NONE;
686 u32 csr;
687 u32 len;
689 int_status = mtu3_readl(mbase, U3D_EPISR);
690 int_status &= mtu3_readl(mbase, U3D_EPIER);
691 mtu3_writel(mbase, U3D_EPISR, int_status); /* W1C */
693 /* only handle ep0's */
694 if (!(int_status & EP0ISR))
695 return IRQ_NONE;
697 csr = mtu3_readl(mbase, U3D_EP0CSR);
699 dev_dbg(mtu->dev, "%s csr=0x%x\n", __func__, csr);
701 /* we sent a stall.. need to clear it now.. */
702 if (csr & EP0_SENTSTALL) {
703 ep0_stall_set(mtu->ep0, false, 0);
704 csr = mtu3_readl(mbase, U3D_EP0CSR);
705 ret = IRQ_HANDLED;
707 dev_dbg(mtu->dev, "ep0_state: %s\n", decode_ep0_state(mtu));
709 switch (mtu->ep0_state) {
710 case MU3D_EP0_STATE_TX:
711 /* irq on clearing txpktrdy */
712 if ((csr & EP0_FIFOFULL) == 0) {
713 ep0_tx_state(mtu);
714 ret = IRQ_HANDLED;
716 break;
717 case MU3D_EP0_STATE_RX:
718 /* irq on set rxpktrdy */
719 if (csr & EP0_RXPKTRDY) {
720 ep0_rx_state(mtu);
721 ret = IRQ_HANDLED;
723 break;
724 case MU3D_EP0_STATE_TX_END:
725 mtu3_writel(mbase, U3D_EP0CSR,
726 (csr & EP0_W1C_BITS) | EP0_DATAEND);
728 mreq = next_ep0_request(mtu);
729 if (mreq)
730 ep0_req_giveback(mtu, &mreq->request);
732 mtu->ep0_state = MU3D_EP0_STATE_SETUP;
733 ret = IRQ_HANDLED;
734 dev_dbg(mtu->dev, "ep0_state: %s\n", decode_ep0_state(mtu));
735 break;
736 case MU3D_EP0_STATE_SETUP:
737 if (!(csr & EP0_SETUPPKTRDY))
738 break;
740 len = mtu3_readl(mbase, U3D_RXCOUNT0);
741 if (len != 8) {
742 dev_err(mtu->dev, "SETUP packet len %d != 8 ?\n", len);
743 break;
746 ep0_handle_setup(mtu);
747 ret = IRQ_HANDLED;
748 break;
749 default:
750 /* can't happen */
751 ep0_stall_set(mtu->ep0, true, 0);
752 WARN_ON(1);
753 break;
756 return ret;
760 static int mtu3_ep0_enable(struct usb_ep *ep,
761 const struct usb_endpoint_descriptor *desc)
763 /* always enabled */
764 return -EINVAL;
767 static int mtu3_ep0_disable(struct usb_ep *ep)
769 /* always enabled */
770 return -EINVAL;
773 static int ep0_queue(struct mtu3_ep *mep, struct mtu3_request *mreq)
775 struct mtu3 *mtu = mep->mtu;
777 mreq->mtu = mtu;
778 mreq->request.actual = 0;
779 mreq->request.status = -EINPROGRESS;
781 dev_dbg(mtu->dev, "%s %s (ep0_state: %s), len#%d\n", __func__,
782 mep->name, decode_ep0_state(mtu), mreq->request.length);
784 switch (mtu->ep0_state) {
785 case MU3D_EP0_STATE_SETUP:
786 case MU3D_EP0_STATE_RX: /* control-OUT data */
787 case MU3D_EP0_STATE_TX: /* control-IN data */
788 break;
789 default:
790 dev_err(mtu->dev, "%s, error in ep0 state %s\n", __func__,
791 decode_ep0_state(mtu));
792 return -EINVAL;
795 if (mtu->delayed_status) {
796 u32 csr;
798 mtu->delayed_status = false;
799 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR) & EP0_W1C_BITS;
800 csr |= EP0_SETUPPKTRDY | EP0_DATAEND;
801 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr);
802 /* needn't giveback the request for handling delay STATUS */
803 return 0;
806 if (!list_empty(&mep->req_list))
807 return -EBUSY;
809 list_add_tail(&mreq->list, &mep->req_list);
811 /* sequence #1, IN ... start writing the data */
812 if (mtu->ep0_state == MU3D_EP0_STATE_TX)
813 ep0_tx_state(mtu);
815 return 0;
818 static int mtu3_ep0_queue(struct usb_ep *ep,
819 struct usb_request *req, gfp_t gfp)
821 struct mtu3_ep *mep;
822 struct mtu3_request *mreq;
823 struct mtu3 *mtu;
824 unsigned long flags;
825 int ret = 0;
827 if (!ep || !req)
828 return -EINVAL;
830 mep = to_mtu3_ep(ep);
831 mtu = mep->mtu;
832 mreq = to_mtu3_request(req);
834 spin_lock_irqsave(&mtu->lock, flags);
835 ret = ep0_queue(mep, mreq);
836 spin_unlock_irqrestore(&mtu->lock, flags);
837 return ret;
840 static int mtu3_ep0_dequeue(struct usb_ep *ep, struct usb_request *req)
842 /* we just won't support this */
843 return -EINVAL;
846 static int mtu3_ep0_halt(struct usb_ep *ep, int value)
848 struct mtu3_ep *mep;
849 struct mtu3 *mtu;
850 unsigned long flags;
851 int ret = 0;
853 if (!ep || !value)
854 return -EINVAL;
856 mep = to_mtu3_ep(ep);
857 mtu = mep->mtu;
859 dev_dbg(mtu->dev, "%s\n", __func__);
861 spin_lock_irqsave(&mtu->lock, flags);
863 if (!list_empty(&mep->req_list)) {
864 ret = -EBUSY;
865 goto cleanup;
868 switch (mtu->ep0_state) {
870 * stalls are usually issued after parsing SETUP packet, either
871 * directly in irq context from setup() or else later.
873 case MU3D_EP0_STATE_TX:
874 case MU3D_EP0_STATE_TX_END:
875 case MU3D_EP0_STATE_RX:
876 case MU3D_EP0_STATE_SETUP:
877 ep0_stall_set(mtu->ep0, true, 0);
878 break;
879 default:
880 dev_dbg(mtu->dev, "ep0 can't halt in state %s\n",
881 decode_ep0_state(mtu));
882 ret = -EINVAL;
885 cleanup:
886 spin_unlock_irqrestore(&mtu->lock, flags);
887 return ret;
890 const struct usb_ep_ops mtu3_ep0_ops = {
891 .enable = mtu3_ep0_enable,
892 .disable = mtu3_ep0_disable,
893 .alloc_request = mtu3_alloc_request,
894 .free_request = mtu3_free_request,
895 .queue = mtu3_ep0_queue,
896 .dequeue = mtu3_ep0_dequeue,
897 .set_halt = mtu3_ep0_halt,