Commit 79940cf8 authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

greybus: es1: fix DMA-buffer on stack

A stack-allocated buffer is not generally DMA-able and must not be used
for USB control transfers.

Note that the memset and extra buffer byte were redundant as no more
than the bytes actually transferred was ever added to the fifo.
Signed-off-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
Reviewed-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent b7744b7f
...@@ -454,14 +454,13 @@ static void cport_out_callback(struct urb *urb) ...@@ -454,14 +454,13 @@ static void cport_out_callback(struct urb *urb)
free_urb(es1, urb); free_urb(es1, urb);
} }
static void apb1_log_get(struct es1_ap_dev *es1) #define APB1_LOG_MSG_SIZE 64
static void apb1_log_get(struct es1_ap_dev *es1, char *buf)
{ {
char buf[65];
int retval; int retval;
/* SVC messages go down our control pipe */ /* SVC messages go down our control pipe */
do { do {
memset(buf, 0, 65);
retval = usb_control_msg(es1->usb_dev, retval = usb_control_msg(es1->usb_dev,
usb_rcvctrlpipe(es1->usb_dev, usb_rcvctrlpipe(es1->usb_dev,
es1->control_endpoint), es1->control_endpoint),
...@@ -469,7 +468,7 @@ static void apb1_log_get(struct es1_ap_dev *es1) ...@@ -469,7 +468,7 @@ static void apb1_log_get(struct es1_ap_dev *es1)
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
0x00, 0x00, 0x00, 0x00,
buf, buf,
64, APB1_LOG_MSG_SIZE,
ES1_TIMEOUT); ES1_TIMEOUT);
if (retval > 0) if (retval > 0)
kfifo_in(&apb1_log_fifo, buf, retval); kfifo_in(&apb1_log_fifo, buf, retval);
...@@ -478,10 +477,20 @@ static void apb1_log_get(struct es1_ap_dev *es1) ...@@ -478,10 +477,20 @@ static void apb1_log_get(struct es1_ap_dev *es1)
static int apb1_log_poll(void *data) static int apb1_log_poll(void *data)
{ {
struct es1_ap_dev *es1 = data;
char *buf;
buf = kmalloc(APB1_LOG_MSG_SIZE, GFP_KERNEL);
if (!buf)
return -ENOMEM;
while (!kthread_should_stop()) { while (!kthread_should_stop()) {
msleep(1000); msleep(1000);
apb1_log_get((struct es1_ap_dev *)data); apb1_log_get(es1, buf);
} }
kfree(buf);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment