]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - drivers/usb/gadget/f_thor.c
usb: gadget: f_thor: Free the allocated out request buffer
[people/ms/u-boot.git] / drivers / usb / gadget / f_thor.c
index 1fd41ff790dbdeab6ed69b76a8cc4cce51f310fa..cd4d9e659a39bb7b205a1898531194c71901c439 100644 (file)
@@ -17,7 +17,9 @@
 
 #include <errno.h>
 #include <common.h>
+#include <console.h>
 #include <malloc.h>
+#include <memalign.h>
 #include <version.h>
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
@@ -123,6 +125,9 @@ static int process_rqt_cmd(const struct rqt_box *rqt)
                send_rsp(rsp);
                g_dnl_unregister();
                dfu_free_entities();
+#ifdef CONFIG_THOR_RESET_OFF
+               return RESET_DONE;
+#endif
                run_command("reset", 0);
                break;
        case RQT_CMD_POWEROFF:
@@ -565,7 +570,7 @@ static void thor_tx_data(unsigned char *data, int len)
 
        dev->in_req->length = len;
 
-       debug("%s: dev->in_req->length:%d to_cpy:%d\n", __func__,
+       debug("%s: dev->in_req->length:%d to_cpy:%zd\n", __func__,
              dev->in_req->length, sizeof(data));
 
        status = usb_ep_queue(dev->in_ep, dev->in_req, 0);
@@ -728,6 +733,10 @@ int thor_handle(void)
 
                if (ret > 0) {
                        ret = process_data();
+#ifdef CONFIG_THOR_RESET_OFF
+                       if (ret == RESET_DONE)
+                               break;
+#endif
                        if (ret < 0)
                                return ret;
                } else {
@@ -768,7 +777,7 @@ static int thor_func_bind(struct usb_configuration *c, struct usb_function *f)
                goto fail;
        }
        dev->req->buf = memalign(CONFIG_SYS_CACHELINE_SIZE,
-                                gadget->ep0->maxpacket);
+                                THOR_PACKET_SIZE);
        if (!dev->req->buf) {
                status = -ENOMEM;
                goto fail;
@@ -806,6 +815,7 @@ static int thor_func_bind(struct usb_configuration *c, struct usb_function *f)
        }
 
        dev->in_ep = ep; /* Store IN EP for enabling @ setup */
+       ep->driver_data = dev;
 
        ep = usb_ep_autoconfig(gadget, &fs_out_desc);
        if (!ep) {
@@ -818,6 +828,7 @@ static int thor_func_bind(struct usb_configuration *c, struct usb_function *f)
                                fs_out_desc.bEndpointAddress;
 
        dev->out_ep = ep; /* Store OUT EP for enabling @ setup */
+       ep->driver_data = dev;
 
        ep = usb_ep_autoconfig(gadget, &fs_int_desc);
        if (!ep) {
@@ -826,6 +837,7 @@ static int thor_func_bind(struct usb_configuration *c, struct usb_function *f)
        }
 
        dev->int_ep = ep;
+       ep->driver_data = dev;
 
        if (gadget_is_dualspeed(gadget)) {
                hs_int_desc.bEndpointAddress =
@@ -879,6 +891,7 @@ static void thor_func_disable(struct usb_function *f)
        }
 
        if (dev->out_ep->driver_data) {
+               free(dev->out_req->buf);
                dev->out_req->buf = NULL;
                usb_ep_free_request(dev->out_ep, dev->out_req);
                usb_ep_disable(dev->out_ep);