diff options
author | Nathan Sullivan <nathan.sullivan@ni.com> | 2014-07-07 16:50:14 +0200 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2014-07-10 15:45:32 +0200 |
commit | d82aa8aeb0eaa06bad80860a95ca5fdff84e8775 (patch) | |
tree | 5665b867813a66ea58db3be33d2e1a47435f9990 | |
parent | usb: dwc3: gadget: remove unnecessary 'start_new' variable (diff) | |
download | linux-d82aa8aeb0eaa06bad80860a95ca5fdff84e8775.tar.xz linux-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>
-rw-r--r-- | drivers/usb/gadget/f_eem.c | 22 |
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); |