aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget
diff options
context:
space:
mode:
authorNathan Sullivan <nathan.sullivan@ni.com>2014-07-07 09:50:14 -0500
committerFelipe Balbi <balbi@ti.com>2014-07-10 08:45:32 -0500
commitd82aa8aeb0eaa06bad80860a95ca5fdff84e8775 (patch)
tree5665b867813a66ea58db3be33d2e1a47435f9990 /drivers/usb/gadget
parentusb: dwc3: gadget: remove unnecessary 'start_new' variable (diff)
downloadlinux-dev-d82aa8aeb0eaa06bad80860a95ca5fdff84e8775.tar.xz
linux-dev-d82aa8aeb0eaa06bad80860a95ca5fdff84e8775.zip
usb: gadget: fix eem_wrap cloned skb logic
Even if the skb is cloned, we still need a ZLP or USB will stall. Signed-off-by: Nathan Sullivan <nathan.sullivan@ni.com> Acked-by: Brad Mouring <brad.mouring@ni.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r--drivers/usb/gadget/f_eem.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/drivers/usb/gadget/f_eem.c b/drivers/usb/gadget/f_eem.c
index d61c11d765d0..4d8b236ea608 100644
--- a/drivers/usb/gadget/f_eem.c
+++ b/drivers/usb/gadget/f_eem.c
@@ -355,20 +355,18 @@ static struct sk_buff *eem_wrap(struct gether *port, struct sk_buff *skb)
int padlen = 0;
u16 len = skb->len;
- if (!skb_cloned(skb)) {
- int headroom = skb_headroom(skb);
- int tailroom = skb_tailroom(skb);
+ int headroom = skb_headroom(skb);
+ int tailroom = skb_tailroom(skb);
- /* When (len + EEM_HLEN + ETH_FCS_LEN) % in->maxpacket) is 0,
- * stick two bytes of zero-length EEM packet on the end.
- */
- if (((len + EEM_HLEN + ETH_FCS_LEN) % in->maxpacket) == 0)
- padlen += 2;
+ /* When (len + EEM_HLEN + ETH_FCS_LEN) % in->maxpacket) is 0,
+ * stick two bytes of zero-length EEM packet on the end.
+ */
+ if (((len + EEM_HLEN + ETH_FCS_LEN) % in->maxpacket) == 0)
+ padlen += 2;
- if ((tailroom >= (ETH_FCS_LEN + padlen)) &&
- (headroom >= EEM_HLEN))
- goto done;
- }
+ if ((tailroom >= (ETH_FCS_LEN + padlen)) &&
+ (headroom >= EEM_HLEN) && !skb_cloned(skb))
+ goto done;
skb2 = skb_copy_expand(skb, EEM_HLEN, ETH_FCS_LEN + padlen, GFP_ATOMIC);
dev_kfree_skb_any(skb);