usbnet: Set link down initially for drivers that update link state
authorBen Hutchings <ben@decadent.org.uk>
Wed, 4 Nov 2009 15:29:52 +0000 (15:29 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 Nov 2009 04:54:40 +0000 (20:54 -0800)
Some usbnet drivers update link state while others do not due to
hardware limitations.  Add a flag to distinguish those that do, and
set the link down initially for their devices.

This is intended to fix this bug: http://bugs.debian.org/444043

Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/asix.c
drivers/net/usb/cdc_ether.c
drivers/net/usb/dm9601.c
drivers/net/usb/usbnet.c
include/linux/usb/usbnet.h

index 6ce7f77..1bef39a 100644 (file)
@@ -1327,7 +1327,7 @@ static const struct driver_info ax8817x_info = {
        .status = asix_status,
        .link_reset = ax88172_link_reset,
        .reset = ax88172_link_reset,
-       .flags =  FLAG_ETHER,
+       .flags =  FLAG_ETHER | FLAG_LINK_INTR,
        .data = 0x00130103,
 };
 
@@ -1337,7 +1337,7 @@ static const struct driver_info dlink_dub_e100_info = {
        .status = asix_status,
        .link_reset = ax88172_link_reset,
        .reset = ax88172_link_reset,
-       .flags =  FLAG_ETHER,
+       .flags =  FLAG_ETHER | FLAG_LINK_INTR,
        .data = 0x009f9d9f,
 };
 
@@ -1347,7 +1347,7 @@ static const struct driver_info netgear_fa120_info = {
        .status = asix_status,
        .link_reset = ax88172_link_reset,
        .reset = ax88172_link_reset,
-       .flags =  FLAG_ETHER,
+       .flags =  FLAG_ETHER | FLAG_LINK_INTR,
        .data = 0x00130103,
 };
 
@@ -1357,7 +1357,7 @@ static const struct driver_info hawking_uf200_info = {
        .status = asix_status,
        .link_reset = ax88172_link_reset,
        .reset = ax88172_link_reset,
-       .flags =  FLAG_ETHER,
+       .flags =  FLAG_ETHER | FLAG_LINK_INTR,
        .data = 0x001f1d1f,
 };
 
@@ -1367,7 +1367,7 @@ static const struct driver_info ax88772_info = {
        .status = asix_status,
        .link_reset = ax88772_link_reset,
        .reset = ax88772_link_reset,
-       .flags = FLAG_ETHER | FLAG_FRAMING_AX,
+       .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR,
        .rx_fixup = asix_rx_fixup,
        .tx_fixup = asix_tx_fixup,
 };
@@ -1378,7 +1378,7 @@ static const struct driver_info ax88178_info = {
        .status = asix_status,
        .link_reset = ax88178_link_reset,
        .reset = ax88178_link_reset,
-       .flags = FLAG_ETHER | FLAG_FRAMING_AX,
+       .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR,
        .rx_fixup = asix_rx_fixup,
        .tx_fixup = asix_tx_fixup,
 };
index 71d7ff3..7ec24c9 100644 (file)
@@ -413,7 +413,7 @@ static int cdc_bind(struct usbnet *dev, struct usb_interface *intf)
 
 static const struct driver_info        cdc_info = {
        .description =  "CDC Ethernet Device",
-       .flags =        FLAG_ETHER,
+       .flags =        FLAG_ETHER | FLAG_LINK_INTR,
        // .check_connect = cdc_check_connect,
        .bind =         cdc_bind,
        .unbind =       usbnet_cdc_unbind,
index a2b30a1..3d406f9 100644 (file)
@@ -611,7 +611,7 @@ static int dm9601_link_reset(struct usbnet *dev)
 
 static const struct driver_info dm9601_info = {
        .description    = "Davicom DM9601 USB Ethernet",
-       .flags          = FLAG_ETHER,
+       .flags          = FLAG_ETHER | FLAG_LINK_INTR,
        .bind           = dm9601_bind,
        .rx_fixup       = dm9601_rx_fixup,
        .tx_fixup       = dm9601_tx_fixup,
index 378da8c..04f3f28 100644 (file)
@@ -1352,9 +1352,11 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
        // ok, it's ready to go.
        usb_set_intfdata (udev, dev);
 
-       // start as if the link is up
        netif_device_attach (net);
 
+       if (dev->driver_info->flags & FLAG_LINK_INTR)
+               netif_carrier_off(net);
+
        return 0;
 
 out3:
index 86c31b7..8c84881 100644 (file)
@@ -92,6 +92,7 @@ struct driver_info {
 #define FLAG_SEND_ZLP  0x0200          /* hw requires ZLPs are sent */
 #define FLAG_WWAN      0x0400          /* use "wwan%d" names */
 
+#define FLAG_LINK_INTR 0x0800          /* updates link (carrier) status */
 
        /* init device ... can sleep, or cause probe() failure */
        int     (*bind)(struct usbnet *, struct usb_interface *);