]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/usb/gadget/u_ether.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / usb / gadget / u_ether.c
index fbe86ca95802b93d68ace2718280a4aeb8b533c2..1eda968b5644249ac3a882c2c9756d573df63ffa 100644 (file)
@@ -240,6 +240,9 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
        size += out->maxpacket - 1;
        size -= size % out->maxpacket;
 
+       if (dev->port_usb->is_fixed)
+               size = max(size, dev->port_usb->fixed_out_len);
+
        skb = alloc_skb(size + NET_IP_ALIGN, gfp_flags);
        if (skb == NULL) {
                DBG(dev, "no rx skb\n");
@@ -578,12 +581,19 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb,
        req->context = skb;
        req->complete = tx_complete;
 
+       /* NCM requires no zlp if transfer is dwNtbInMaxSize */
+       if (dev->port_usb->is_fixed &&
+           length == dev->port_usb->fixed_in_len &&
+           (length % in->maxpacket) == 0)
+               req->zero = 0;
+       else
+               req->zero = 1;
+
        /* use zlp framing on tx for strict CDC-Ether conformance,
         * though any robust network rx path ignores extra padding.
         * and some hardware doesn't like to write zlps.
         */
-       req->zero = 1;
-       if (!dev->zlp && (length % in->maxpacket) == 0)
+       if (req->zero && !dev->zlp && (length % in->maxpacket) == 0)
                length++;
 
        req->length = length;
@@ -829,11 +839,9 @@ void gether_cleanup(void)
                return;
 
        unregister_netdev(the_dev->net);
+       flush_work_sync(&the_dev->work);
        free_netdev(the_dev->net);
 
-       /* assuming we used keventd, it must quiesce too */
-       flush_scheduled_work();
-
        the_dev = NULL;
 }