usb: dwc2: gadget: don't embed ep0 buffers
authorMian Yousaf Kaukab <yousaf.kaukab@intel.com>
Fri, 9 Jan 2015 12:38:44 +0000 (13:38 +0100)
committerFelipe Balbi <balbi@ti.com>
Mon, 12 Jan 2015 21:32:44 +0000 (15:32 -0600)
When using DMA, data of the previous setup packet can be read back
from cache because ep0 and ctrl buffers are embedded in struct s3c_hsotg.
Allocate buffers instead of embedding them.

Tested-by: Robert Baldyga <r.baldyga@samsung.com>
Acked-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Mian Yousaf Kaukab <yousaf.kaukab@intel.com>
Reviewed-by: Robert Baldyga <r.baldyga@samsung.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/dwc2/core.h
drivers/usb/dwc2/gadget.c

index 0d2ee29..7db83d0 100644 (file)
@@ -434,6 +434,9 @@ struct dwc2_hw_params {
        u32 snpsid;
 };
 
+/* Size of control and EP0 buffers */
+#define DWC2_CTRL_BUFF_SIZE 8
+
 /**
  * struct dwc2_hsotg - Holds the state of the driver, including the non-periodic
  * and periodic schedules
@@ -684,8 +687,8 @@ struct dwc2_hsotg {
 
        struct usb_request *ep0_reply;
        struct usb_request *ctrl_req;
-       u8 ep0_buff[8];
-       u8 ctrl_buff[8];
+       void *ep0_buff;
+       void *ctrl_buff;
 
        struct usb_gadget gadget;
        unsigned int enabled:1;
index 45afbf8..35d346f 100644 (file)
@@ -3486,6 +3486,22 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
        s3c_hsotg_hw_cfg(hsotg);
        s3c_hsotg_init(hsotg);
 
+       hsotg->ctrl_buff = devm_kzalloc(hsotg->dev,
+                       DWC2_CTRL_BUFF_SIZE, GFP_KERNEL);
+       if (!hsotg->ctrl_buff) {
+               dev_err(dev, "failed to allocate ctrl request buff\n");
+               ret = -ENOMEM;
+               goto err_supplies;
+       }
+
+       hsotg->ep0_buff = devm_kzalloc(hsotg->dev,
+                       DWC2_CTRL_BUFF_SIZE, GFP_KERNEL);
+       if (!hsotg->ep0_buff) {
+               dev_err(dev, "failed to allocate ctrl reply buff\n");
+               ret = -ENOMEM;
+               goto err_supplies;
+       }
+
        ret = devm_request_irq(hsotg->dev, irq, s3c_hsotg_irq, IRQF_SHARED,
                                dev_name(hsotg->dev), hsotg);
        if (ret < 0) {