usb: gadget: fix eem_wrap cloned skb logic
authorNathan Sullivan <nathan.sullivan@ni.com>
Mon, 7 Jul 2014 14:50:14 +0000 (09:50 -0500)
committerFelipe Balbi <balbi@ti.com>
Thu, 10 Jul 2014 13:45:32 +0000 (08:45 -0500)
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>
drivers/usb/gadget/f_eem.c

index d61c11d765d0a92b9e9e79270e9de4b3cb474ca3..4d8b236ea60865c9fb85c013b416ea0a7f9476b6 100644 (file)
@@ -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);