提交 219580e6 编写于 作者: M Michal Nazarewicz 提交者: Felipe Balbi

usb: f_fs: check quirk to pad epout buf size when not aligned to maxpacketsize

Check gadget.quirk_ep_out_aligned_size to decide if buffer size requires
to be aligned to maxpacketsize of an out endpoint.  ffs_epfile_io() needs
to pad epout buffer to match above condition if quirk is found.
Signed-off-by: NMichal Nazarewicz <mina86@mina86.com>
Signed-off-by: NDavid Cohen <david.a.cohen@linux.intel.com>
Signed-off-by: NFelipe Balbi <balbi@ti.com>
上级 7fa68034
master alk-4.19.24 alk-4.19.30 alk-4.19.34 alk-4.19.36 alk-4.19.43 alk-4.19.48 alk-4.19.57 ck-4.19.67 ck-4.19.81 ck-4.19.91 github/fork/deepanshu1422/fix-typo-in-comment github/fork/haosdent/fix-typo linux-next v4.19.91 v4.19.90 v4.19.89 v4.19.88 v4.19.87 v4.19.86 v4.19.85 v4.19.84 v4.19.83 v4.19.82 v4.19.81 v4.19.80 v4.19.79 v4.19.78 v4.19.77 v4.19.76 v4.19.75 v4.19.74 v4.19.73 v4.19.72 v4.19.71 v4.19.70 v4.19.69 v4.19.68 v4.19.67 v4.19.66 v4.19.65 v4.19.64 v4.19.63 v4.19.62 v4.19.61 v4.19.60 v4.19.59 v4.19.58 v4.19.57 v4.19.56 v4.19.55 v4.19.54 v4.19.53 v4.19.52 v4.19.51 v4.19.50 v4.19.49 v4.19.48 v4.19.47 v4.19.46 v4.19.45 v4.19.44 v4.19.43 v4.19.42 v4.19.41 v4.19.40 v4.19.39 v4.19.38 v4.19.37 v4.19.36 v4.19.35 v4.19.34 v4.19.33 v4.19.32 v4.19.31 v4.19.30 v4.19.29 v4.19.28 v4.19.27 v4.19.26 v4.19.25 v4.19.24 v4.19.23 v4.19.22 v4.19.21 v4.19.20 v4.19.19 v4.19.18 v4.19.17 v4.19.16 v4.19.15 v4.19.14 v4.19.13 v4.19.12 v4.19.11 v4.19.10 v4.19.9 v4.19.8 v4.19.7 v4.19.6 v4.19.5 v4.19.4 v4.19.3 v4.19.2 v4.19.1 v4.19 v4.19-rc8 v4.19-rc7 v4.19-rc6 v4.19-rc5 v4.19-rc4 v4.19-rc3 v4.19-rc2 v4.19-rc1 ck-release-21 ck-release-20 ck-release-19.2 ck-release-19.1 ck-release-19 ck-release-18 ck-release-17.2 ck-release-17.1 ck-release-17 ck-release-16 ck-release-15.1 ck-release-15 ck-release-14 ck-release-13.2 ck-release-13 ck-release-12 ck-release-11 ck-release-10 ck-release-9 ck-release-7 alk-release-15 alk-release-14 alk-release-13.2 alk-release-13 alk-release-12 alk-release-11 alk-release-10 alk-release-9 alk-release-7
无相关合并请求
...@@ -753,9 +753,10 @@ static ssize_t ffs_epfile_io(struct file *file, ...@@ -753,9 +753,10 @@ static ssize_t ffs_epfile_io(struct file *file,
char __user *buf, size_t len, int read) char __user *buf, size_t len, int read)
{ {
struct ffs_epfile *epfile = file->private_data; struct ffs_epfile *epfile = file->private_data;
struct usb_gadget *gadget = epfile->ffs->gadget;
struct ffs_ep *ep; struct ffs_ep *ep;
char *data = NULL; char *data = NULL;
ssize_t ret; ssize_t ret, data_len;
int halt; int halt;
/* Are we still active? */ /* Are we still active? */
...@@ -788,7 +789,13 @@ static ssize_t ffs_epfile_io(struct file *file, ...@@ -788,7 +789,13 @@ static ssize_t ffs_epfile_io(struct file *file,
/* Allocate & copy */ /* Allocate & copy */
if (!halt) { if (!halt) {
data = kmalloc(len, GFP_KERNEL); /*
* Controller may require buffer size to be aligned to
* maxpacketsize of an out endpoint.
*/
data_len = read ? usb_ep_align_maybe(gadget, ep->ep, len) : len;
data = kmalloc(data_len, GFP_KERNEL);
if (unlikely(!data)) if (unlikely(!data))
return -ENOMEM; return -ENOMEM;
...@@ -823,7 +830,7 @@ static ssize_t ffs_epfile_io(struct file *file, ...@@ -823,7 +830,7 @@ static ssize_t ffs_epfile_io(struct file *file,
req->context = &done; req->context = &done;
req->complete = ffs_epfile_io_complete; req->complete = ffs_epfile_io_complete;
req->buf = data; req->buf = data;
req->length = len; req->length = data_len;
ret = usb_ep_queue(ep->ep, req, GFP_ATOMIC); ret = usb_ep_queue(ep->ep, req, GFP_ATOMIC);
...@@ -835,9 +842,17 @@ static ssize_t ffs_epfile_io(struct file *file, ...@@ -835,9 +842,17 @@ static ssize_t ffs_epfile_io(struct file *file,
ret = -EINTR; ret = -EINTR;
usb_ep_dequeue(ep->ep, req); usb_ep_dequeue(ep->ep, req);
} else { } else {
/*
* XXX We may end up silently droping data here.
* Since data_len (i.e. req->length) may be bigger
* than len (after being rounded up to maxpacketsize),
* we may end up with more data then user space has
* space for.
*/
ret = ep->status; ret = ep->status;
if (read && ret > 0 && if (read && ret > 0 &&
unlikely(copy_to_user(buf, data, ret))) unlikely(copy_to_user(buf, data,
min_t(size_t, ret, len))))
ret = -EFAULT; ret = -EFAULT;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部