forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/usb/mtu3/mtu3_gadget.c
....@@ -8,43 +8,38 @@
88 */
99
1010 #include "mtu3.h"
11
+#include "mtu3_trace.h"
1112
1213 void mtu3_req_complete(struct mtu3_ep *mep,
1314 struct usb_request *req, int status)
1415 __releases(mep->mtu->lock)
1516 __acquires(mep->mtu->lock)
1617 {
17
- struct mtu3_request *mreq;
18
- struct mtu3 *mtu;
19
- int busy = mep->busy;
18
+ struct mtu3_request *mreq = to_mtu3_request(req);
19
+ struct mtu3 *mtu = mreq->mtu;
2020
21
- mreq = to_mtu3_request(req);
2221 list_del(&mreq->list);
23
- if (mreq->request.status == -EINPROGRESS)
24
- mreq->request.status = status;
22
+ if (req->status == -EINPROGRESS)
23
+ req->status = status;
2524
26
- mtu = mreq->mtu;
27
- mep->busy = 1;
25
+ trace_mtu3_req_complete(mreq);
2826 spin_unlock(&mtu->lock);
2927
3028 /* ep0 makes use of PIO, needn't unmap it */
3129 if (mep->epnum)
3230 usb_gadget_unmap_request(&mtu->g, req, mep->is_in);
3331
34
- dev_dbg(mtu->dev, "%s complete req: %p, sts %d, %d/%d\n", mep->name,
35
- req, req->status, mreq->request.actual, mreq->request.length);
32
+ dev_dbg(mtu->dev, "%s complete req: %p, sts %d, %d/%d\n",
33
+ mep->name, req, req->status, req->actual, req->length);
3634
37
- usb_gadget_giveback_request(&mep->ep, &mreq->request);
38
-
35
+ usb_gadget_giveback_request(&mep->ep, req);
3936 spin_lock(&mtu->lock);
40
- mep->busy = busy;
4137 }
4238
4339 static void nuke(struct mtu3_ep *mep, const int status)
4440 {
4541 struct mtu3_request *mreq = NULL;
4642
47
- mep->busy = 1;
4843 if (list_empty(&mep->req_list))
4944 return;
5045
....@@ -197,15 +192,14 @@
197192 if (ret)
198193 goto error;
199194
200
- mep->busy = 0;
201
- mep->wedged = 0;
202
- mep->flags |= MTU3_EP_ENABLED;
195
+ mep->flags = MTU3_EP_ENABLED;
203196 mtu->active_ep++;
204197
205198 error:
206199 spin_unlock_irqrestore(&mtu->lock, flags);
207200
208201 dev_dbg(mtu->dev, "%s active_ep=%d\n", __func__, mtu->active_ep);
202
+ trace_mtu3_gadget_ep_enable(mep);
209203
210204 return ret;
211205 }
....@@ -217,6 +211,7 @@
217211 unsigned long flags;
218212
219213 dev_dbg(mtu->dev, "%s %s\n", __func__, mep->name);
214
+ trace_mtu3_gadget_ep_disable(mep);
220215
221216 if (!(mep->flags & MTU3_EP_ENABLED)) {
222217 dev_warn(mtu->dev, "%s is already disabled\n", mep->name);
....@@ -225,7 +220,7 @@
225220
226221 spin_lock_irqsave(&mtu->lock, flags);
227222 mtu3_ep_disable(mep);
228
- mep->flags &= ~MTU3_EP_ENABLED;
223
+ mep->flags = 0;
229224 mtu->active_ep--;
230225 spin_unlock_irqrestore(&(mtu->lock), flags);
231226
....@@ -247,34 +242,31 @@
247242 mreq->request.dma = DMA_ADDR_INVALID;
248243 mreq->epnum = mep->epnum;
249244 mreq->mep = mep;
245
+ INIT_LIST_HEAD(&mreq->list);
246
+ trace_mtu3_alloc_request(mreq);
250247
251248 return &mreq->request;
252249 }
253250
254251 void mtu3_free_request(struct usb_ep *ep, struct usb_request *req)
255252 {
256
- kfree(to_mtu3_request(req));
253
+ struct mtu3_request *mreq = to_mtu3_request(req);
254
+
255
+ trace_mtu3_free_request(mreq);
256
+ kfree(mreq);
257257 }
258258
259259 static int mtu3_gadget_queue(struct usb_ep *ep,
260260 struct usb_request *req, gfp_t gfp_flags)
261261 {
262
- struct mtu3_ep *mep;
263
- struct mtu3_request *mreq;
264
- struct mtu3 *mtu;
262
+ struct mtu3_ep *mep = to_mtu3_ep(ep);
263
+ struct mtu3_request *mreq = to_mtu3_request(req);
264
+ struct mtu3 *mtu = mep->mtu;
265265 unsigned long flags;
266266 int ret = 0;
267267
268
- if (!ep || !req)
269
- return -EINVAL;
270
-
271268 if (!req->buf)
272269 return -ENODATA;
273
-
274
- mep = to_mtu3_ep(ep);
275
- mtu = mep->mtu;
276
- mreq = to_mtu3_request(req);
277
- mreq->mtu = mtu;
278270
279271 if (mreq->mep != mep)
280272 return -EINVAL;
....@@ -283,10 +275,12 @@
283275 __func__, mep->is_in ? "TX" : "RX", mreq->epnum, ep->name,
284276 mreq, ep->maxpacket, mreq->request.length);
285277
286
- if (req->length > GPD_BUF_SIZE) {
278
+ if (req->length > GPD_BUF_SIZE ||
279
+ (mtu->gen2cp && req->length > GPD_BUF_SIZE_EL)) {
287280 dev_warn(mtu->dev,
288281 "req length > supported MAX:%d requested:%d\n",
289
- GPD_BUF_SIZE, req->length);
282
+ mtu->gen2cp ? GPD_BUF_SIZE_EL : GPD_BUF_SIZE,
283
+ req->length);
290284 return -EOPNOTSUPP;
291285 }
292286
....@@ -297,6 +291,7 @@
297291 return -ESHUTDOWN;
298292 }
299293
294
+ mreq->mtu = mtu;
300295 mreq->request.actual = 0;
301296 mreq->request.status = -EINPROGRESS;
302297
....@@ -319,6 +314,7 @@
319314
320315 error:
321316 spin_unlock_irqrestore(&mtu->lock, flags);
317
+ trace_mtu3_gadget_queue(mreq);
322318
323319 return ret;
324320 }
....@@ -328,14 +324,15 @@
328324 struct mtu3_ep *mep = to_mtu3_ep(ep);
329325 struct mtu3_request *mreq = to_mtu3_request(req);
330326 struct mtu3_request *r;
327
+ struct mtu3 *mtu = mep->mtu;
331328 unsigned long flags;
332329 int ret = 0;
333
- struct mtu3 *mtu = mep->mtu;
334330
335
- if (!ep || !req || mreq->mep != mep)
331
+ if (mreq->mep != mep)
336332 return -EINVAL;
337333
338334 dev_dbg(mtu->dev, "%s : req=%p\n", __func__, req);
335
+ trace_mtu3_gadget_dequeue(mreq);
339336
340337 spin_lock_irqsave(&mtu->lock, flags);
341338
....@@ -371,9 +368,6 @@
371368 unsigned long flags;
372369 int ret = 0;
373370
374
- if (!ep)
375
- return -EINVAL;
376
-
377371 dev_dbg(mtu->dev, "%s : %s...", __func__, ep->name);
378372
379373 spin_lock_irqsave(&mtu->lock, flags);
....@@ -397,7 +391,7 @@
397391 goto done;
398392 }
399393 } else {
400
- mep->wedged = 0;
394
+ mep->flags &= ~MTU3_EP_WEDGE;
401395 }
402396
403397 dev_dbg(mtu->dev, "%s %s stall\n", ep->name, value ? "set" : "clear");
....@@ -406,6 +400,7 @@
406400
407401 done:
408402 spin_unlock_irqrestore(&mtu->lock, flags);
403
+ trace_mtu3_gadget_ep_set_halt(mep);
409404
410405 return ret;
411406 }
....@@ -415,10 +410,7 @@
415410 {
416411 struct mtu3_ep *mep = to_mtu3_ep(ep);
417412
418
- if (!ep)
419
- return -EINVAL;
420
-
421
- mep->wedged = 1;
413
+ mep->flags |= MTU3_EP_WEDGE;
422414
423415 return usb_ep_set_halt(ep);
424416 }
....@@ -582,6 +574,19 @@
582574 return 0;
583575 }
584576
577
+static void
578
+mtu3_gadget_set_speed(struct usb_gadget *g, enum usb_device_speed speed)
579
+{
580
+ struct mtu3 *mtu = gadget_to_mtu3(g);
581
+ unsigned long flags;
582
+
583
+ dev_dbg(mtu->dev, "%s %s\n", __func__, usb_speed_string(speed));
584
+
585
+ spin_lock_irqsave(&mtu->lock, flags);
586
+ mtu3_set_speed(mtu, speed);
587
+ spin_unlock_irqrestore(&mtu->lock, flags);
588
+}
589
+
585590 static const struct usb_gadget_ops mtu3_gadget_ops = {
586591 .get_frame = mtu3_gadget_get_frame,
587592 .wakeup = mtu3_gadget_wakeup,
....@@ -589,6 +594,7 @@
589594 .pullup = mtu3_gadget_pullup,
590595 .udc_start = mtu3_gadget_start,
591596 .udc_stop = mtu3_gadget_stop,
597
+ .udc_set_speed = mtu3_gadget_set_speed,
592598 };
593599
594600 static void mtu3_state_reset(struct mtu3 *mtu)
....@@ -664,8 +670,6 @@
664670
665671 int mtu3_gadget_setup(struct mtu3 *mtu)
666672 {
667
- int ret;
668
-
669673 mtu->g.ops = &mtu3_gadget_ops;
670674 mtu->g.max_speed = mtu->max_speed;
671675 mtu->g.speed = USB_SPEED_UNKNOWN;
....@@ -676,11 +680,7 @@
676680
677681 mtu3_gadget_init_eps(mtu);
678682
679
- ret = usb_add_gadget_udc(mtu->dev, &mtu->g);
680
- if (ret)
681
- dev_err(mtu->dev, "failed to register udc\n");
682
-
683
- return ret;
683
+ return usb_add_gadget_udc(mtu->dev, &mtu->g);
684684 }
685685
686686 void mtu3_gadget_cleanup(struct mtu3 *mtu)