]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/usb/usbnet.c
rndis_host: Split up rndis_host.c
[linux-2.6-omap-h63xx.git] / drivers / net / usb / usbnet.c
index a12f576391cf3150d2716b040e6bc06d1eb93844..a2a2d5e2c72ef40125ef856c94da38ee9ae885b3 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);
@@ -588,6 +590,7 @@ static int usbnet_stop (struct net_device *net)
        dev->flags = 0;
        del_timer_sync (&dev->delay);
        tasklet_kill (&dev->bh);
+       usb_autopm_put_interface(dev->intf);
 
        return 0;
 }
@@ -601,9 +604,19 @@ static int usbnet_stop (struct net_device *net)
 static int usbnet_open (struct net_device *net)
 {
        struct usbnet           *dev = netdev_priv(net);
-       int                     retval = 0;
+       int                     retval;
        struct driver_info      *info = dev->driver_info;
 
+       if ((retval = usb_autopm_get_interface(dev->intf)) < 0) {
+               if (netif_msg_ifup (dev))
+                       devinfo (dev,
+                               "resumption fail (%d) usbnet usb-%s-%s, %s",
+                               retval,
+                               dev->udev->bus->bus_name, dev->udev->devpath,
+                       info->description);
+               goto done_nopm;
+       }
+
        // put into "known safe" state
        if (info->reset && (retval = info->reset (dev)) < 0) {
                if (netif_msg_ifup (dev))
@@ -657,7 +670,10 @@ static int usbnet_open (struct net_device *net)
 
        // delay posting reads until we're fully open
        tasklet_schedule (&dev->bh);
+       return retval;
 done:
+       usb_autopm_put_interface(dev->intf);
+done_nopm:
        return retval;
 }
 
@@ -667,9 +683,6 @@ done:
  * they'll probably want to use this base set.
  */
 
-#if defined(CONFIG_MII) || defined(CONFIG_MII_MODULE)
-#define HAVE_MII
-
 int usbnet_get_settings (struct net_device *net, struct ethtool_cmd *cmd)
 {
        struct usbnet *dev = netdev_priv(net);
@@ -728,8 +741,6 @@ int usbnet_nway_reset(struct net_device *net)
 }
 EXPORT_SYMBOL_GPL(usbnet_nway_reset);
 
-#endif /* HAVE_MII */
-
 void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info)
 {
        struct usbnet *dev = netdev_priv(net);
@@ -760,12 +771,10 @@ EXPORT_SYMBOL_GPL(usbnet_set_msglevel);
 
 /* drivers may override default ethtool_ops in their bind() routine */
 static struct ethtool_ops usbnet_ethtool_ops = {
-#ifdef HAVE_MII
        .get_settings           = usbnet_get_settings,
        .set_settings           = usbnet_set_settings,
        .get_link               = usbnet_get_link,
        .nway_reset             = usbnet_nway_reset,
-#endif
        .get_drvinfo            = usbnet_get_drvinfo,
        .get_msglevel           = usbnet_get_msglevel,
        .set_msglevel           = usbnet_set_msglevel,
@@ -1011,16 +1020,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);
                }
        }
@@ -1118,6 +1127,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
        struct usb_device               *xdev;
        int                             status;
        const char                      *name;
+       DECLARE_MAC_BUF(mac);
 
        name = udev->dev.driver->name;
        info = (struct driver_info *) prod->driver_info;
@@ -1141,6 +1151,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 
        dev = netdev_priv(net);
        dev->udev = xdev;
+       dev->intf = udev;
        dev->driver_info = info;
        dev->driver_name = name;
        dev->msg_enable = netif_msg_init (msg_level, NETIF_MSG_DRV
@@ -1156,7 +1167,6 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
        init_timer (&dev->delay);
        mutex_init (&dev->phy_mutex);
 
-       SET_MODULE_OWNER (net);
        dev->net = net;
        strcpy (net->name, "usb%d");
        memcpy (net->dev_addr, node_id, sizeof node_id);
@@ -1194,6 +1204,9 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
                if ((dev->driver_info->flags & FLAG_ETHER) != 0
                                && (net->dev_addr [0] & 0x02) == 0)
                        strcpy (net->name, "eth%d");
+               /* WLAN devices should always be named "wlan%d" */
+               if ((dev->driver_info->flags & FLAG_WLAN) != 0)
+                       strcpy(net->name, "wlan%d");
 
                /* maybe the remote can't receive an Ethernet MTU */
                if (net->mtu > (dev->hard_mtu - net->hard_header_len))
@@ -1211,7 +1224,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;
@@ -1225,14 +1238,11 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
        if (status)
                goto out3;
        if (netif_msg_probe (dev))
-               devinfo (dev, "register '%s' at usb-%s-%s, %s, "
-                               "%02x:%02x:%02x:%02x:%02x:%02x",
+               devinfo (dev, "register '%s' at usb-%s-%s, %s, %s",
                        udev->dev.driver->name,
                        xdev->bus->bus_name, xdev->devpath,
                        dev->driver_info->description,
-                       net->dev_addr [0], net->dev_addr [1],
-                       net->dev_addr [2], net->dev_addr [3],
-                       net->dev_addr [4], net->dev_addr [5]);
+                       print_mac(mac, net->dev_addr));
 
        // ok, it's ready to go.
        usb_set_intfdata (udev, dev);
@@ -1265,12 +1275,18 @@ int usbnet_suspend (struct usb_interface *intf, pm_message_t message)
        struct usbnet           *dev = usb_get_intfdata(intf);
 
        if (!dev->suspend_count++) {
-               /* accelerate emptying of the rx and queues, to avoid
+               /*
+                * accelerate emptying of the rx and queues, to avoid
                 * having everything error out.
                 */
                netif_device_detach (dev->net);
                (void) unlink_urbs (dev, &dev->rxq);
                (void) unlink_urbs (dev, &dev->txq);
+               /*
+                * reattach so runtime management can use and
+                * wake the device
+                */
+               netif_device_attach (dev->net);
        }
        return 0;
 }
@@ -1280,10 +1296,9 @@ int usbnet_resume (struct usb_interface *intf)
 {
        struct usbnet           *dev = usb_get_intfdata(intf);
 
-       if (!--dev->suspend_count) {
-               netif_device_attach (dev->net);
+       if (!--dev->suspend_count)
                tasklet_schedule (&dev->bh);
-       }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(usbnet_resume);