]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/usb/usbnet.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
[linux-2.6-omap-h63xx.git] / drivers / net / usb / usbnet.c
index 5b16d9a1269a2851e3f8982b23f835c256044ba7..37bf4f2c0a44c07204dcdc991cecee505462dcf1 100644 (file)
@@ -192,7 +192,7 @@ static int init_status (struct usbnet *dev, struct usb_interface *intf)
                                usb_pipeendpoint(pipe), maxp, period);
                }
        }
-       return  0;
+       return 0;
 }
 
 /* Passes this packet up the stack, updating its accounting.
@@ -326,7 +326,7 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
        if (netif_running (dev->net)
                        && netif_device_present (dev->net)
                        && !test_bit (EVENT_RX_HALT, &dev->flags)) {
-               switch (retval = usb_submit_urb (urb, GFP_ATOMIC)){
+               switch (retval = usb_submit_urb (urb, GFP_ATOMIC)) {
                case -EPIPE:
                        usbnet_defer_kevent (dev, EVENT_RX_HALT);
                        break;
@@ -393,8 +393,8 @@ static void rx_complete (struct urb *urb)
        entry->urb = NULL;
 
        switch (urb_status) {
-           // success
-           case 0:
+       /* success */
+       case 0:
                if (skb->len < dev->net->hard_header_len) {
                        entry->state = rx_cleanup;
                        dev->stats.rx_errors++;
@@ -404,28 +404,30 @@ static void rx_complete (struct urb *urb)
                }
                break;
 
-           // stalls need manual reset. this is rare ... except that
-           // when going through USB 2.0 TTs, unplug appears this way.
-           // we avoid the highspeed version of the ETIMEOUT/EILSEQ
-           // storm, recovering as needed.
-           case -EPIPE:
+       /* stalls need manual reset. this is rare ... except that
+        * when going through USB 2.0 TTs, unplug appears this way.
+        * we avoid the highspeed version of the ETIMEOUT/EILSEQ
+        * storm, recovering as needed.
+        */
+       case -EPIPE:
                dev->stats.rx_errors++;
                usbnet_defer_kevent (dev, EVENT_RX_HALT);
                // FALLTHROUGH
 
-           // software-driven interface shutdown
-           case -ECONNRESET:           // async unlink
-           case -ESHUTDOWN:            // hardware gone
+       /* software-driven interface shutdown */
+       case -ECONNRESET:               /* async unlink */
+       case -ESHUTDOWN:                /* hardware gone */
                if (netif_msg_ifdown (dev))
                        devdbg (dev, "rx shutdown, code %d", urb_status);
                goto block;
 
-           // we get controller i/o faults during khubd disconnect() delays.
-           // throttle down resubmits, to avoid log floods; just temporarily,
-           // so we still recover when the fault isn't a khubd delay.
-           case -EPROTO:
-           case -ETIME:
-           case -EILSEQ:
+       /* we get controller i/o faults during khubd disconnect() delays.
+        * throttle down resubmits, to avoid log floods; just temporarily,
+        * so we still recover when the fault isn't a khubd delay.
+        */
+       case -EPROTO:
+       case -ETIME:
+       case -EILSEQ:
                dev->stats.rx_errors++;
                if (!timer_pending (&dev->delay)) {
                        mod_timer (&dev->delay, jiffies + THROTTLE_JIFFIES);
@@ -438,12 +440,12 @@ block:
                urb = NULL;
                break;
 
-           // data overrun ... flush fifo?
-           case -EOVERFLOW:
+       /* data overrun ... flush fifo? */
+       case -EOVERFLOW:
                dev->stats.rx_over_errors++;
                // FALLTHROUGH
 
-           default:
+       default:
                entry->state = rx_cleanup;
                dev->stats.rx_errors++;
                if (netif_msg_rx_err (dev))
@@ -471,22 +473,22 @@ static void intr_complete (struct urb *urb)
        int             status = urb->status;
 
        switch (status) {
-           /* success */
-           case 0:
+       /* success */
+       case 0:
                dev->driver_info->status(dev, urb);
                break;
 
-           /* software-driven interface shutdown */
-           case -ENOENT:               // urb killed
-           case -ESHUTDOWN:            // hardware gone
+       /* software-driven interface shutdown */
+       case -ENOENT:           /* urb killed */
+       case -ESHUTDOWN:        /* hardware gone */
                if (netif_msg_ifdown (dev))
                        devdbg (dev, "intr shutdown, code %d", status);
                return;
 
-           /* NOTE:  not throttling like RX/TX, since this endpoint
-            * already polls infrequently
-            */
-           default:
+       /* NOTE:  not throttling like RX/TX, since this endpoint
+        * already polls infrequently
+        */
+       default:
                devdbg (dev, "intr status %d", status);
                break;
        }
@@ -569,9 +571,9 @@ static int usbnet_stop (struct net_device *net)
        temp = unlink_urbs (dev, &dev->txq) + unlink_urbs (dev, &dev->rxq);
 
        // maybe wait for deletions to finish.
-       while (!skb_queue_empty(&dev->rxq) &&
-              !skb_queue_empty(&dev->txq) &&
-              !skb_queue_empty(&dev->done)) {
+       while (!skb_queue_empty(&dev->rxq)
+                       && !skb_queue_empty(&dev->txq)
+                       && !skb_queue_empty(&dev->done)) {
                msleep(UNLINK_TIMEOUT_MS);
                if (netif_msg_ifdown (dev))
                        devdbg (dev, "waited for %d urb completions", temp);
@@ -953,11 +955,14 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)
        /* don't assume the hardware handles USB_ZERO_PACKET
         * NOTE:  strictly conforming cdc-ether devices should expect
         * the ZLP here, but ignore the one-byte packet.
-        *
-        * FIXME zero that byte, if it doesn't require a new skb.
         */
-       if ((length % dev->maxpacket) == 0)
+       if ((length % dev->maxpacket) == 0) {
                urb->transfer_buffer_length++;
+               if (skb_tailroom(skb)) {
+                       skb->data[skb->len] = 0;
+                       __skb_put(skb, 1);
+               }
+       }
 
        spin_lock_irqsave (&dev->txq.lock, flags);
 
@@ -1008,16 +1013,16 @@ static void usbnet_bh (unsigned long param)
        while ((skb = skb_dequeue (&dev->done))) {
                entry = (struct skb_data *) skb->cb;
                switch (entry->state) {
-                   case rx_done:
+               case rx_done:
                        entry->state = rx_cleanup;
                        rx_process (dev, skb);
                        continue;
-                   case tx_done:
-                   case rx_cleanup:
+               case tx_done:
+               case rx_cleanup:
                        usb_free_urb (entry->urb);
                        dev_kfree_skb (skb);
                        continue;
-                   default:
+               default:
                        devdbg (dev, "bogus skb state %d", entry->state);
                }
        }
@@ -1208,7 +1213,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
                        status = 0;
 
        }
-       if (status == 0 && dev->status)
+       if (status >= 0 && dev->status)
                status = init_status (dev, udev);
        if (status < 0)
                goto out3;