usbnet: Set link down initially for drivers that update link state

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>
This commit is contained in:
Ben Hutchings 2009-11-04 15:29:52 +00:00 committed by David S. Miller
parent 8cbd9623da
commit 37e8273cd3
5 changed files with 12 additions and 9 deletions

View file

@ -1327,7 +1327,7 @@ static const struct driver_info ax8817x_info = {
.status = asix_status, .status = asix_status,
.link_reset = ax88172_link_reset, .link_reset = ax88172_link_reset,
.reset = ax88172_link_reset, .reset = ax88172_link_reset,
.flags = FLAG_ETHER, .flags = FLAG_ETHER | FLAG_LINK_INTR,
.data = 0x00130103, .data = 0x00130103,
}; };
@ -1337,7 +1337,7 @@ static const struct driver_info dlink_dub_e100_info = {
.status = asix_status, .status = asix_status,
.link_reset = ax88172_link_reset, .link_reset = ax88172_link_reset,
.reset = ax88172_link_reset, .reset = ax88172_link_reset,
.flags = FLAG_ETHER, .flags = FLAG_ETHER | FLAG_LINK_INTR,
.data = 0x009f9d9f, .data = 0x009f9d9f,
}; };
@ -1347,7 +1347,7 @@ static const struct driver_info netgear_fa120_info = {
.status = asix_status, .status = asix_status,
.link_reset = ax88172_link_reset, .link_reset = ax88172_link_reset,
.reset = ax88172_link_reset, .reset = ax88172_link_reset,
.flags = FLAG_ETHER, .flags = FLAG_ETHER | FLAG_LINK_INTR,
.data = 0x00130103, .data = 0x00130103,
}; };
@ -1357,7 +1357,7 @@ static const struct driver_info hawking_uf200_info = {
.status = asix_status, .status = asix_status,
.link_reset = ax88172_link_reset, .link_reset = ax88172_link_reset,
.reset = ax88172_link_reset, .reset = ax88172_link_reset,
.flags = FLAG_ETHER, .flags = FLAG_ETHER | FLAG_LINK_INTR,
.data = 0x001f1d1f, .data = 0x001f1d1f,
}; };
@ -1367,7 +1367,7 @@ static const struct driver_info ax88772_info = {
.status = asix_status, .status = asix_status,
.link_reset = ax88772_link_reset, .link_reset = ax88772_link_reset,
.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, .rx_fixup = asix_rx_fixup,
.tx_fixup = asix_tx_fixup, .tx_fixup = asix_tx_fixup,
}; };
@ -1378,7 +1378,7 @@ static const struct driver_info ax88178_info = {
.status = asix_status, .status = asix_status,
.link_reset = ax88178_link_reset, .link_reset = ax88178_link_reset,
.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, .rx_fixup = asix_rx_fixup,
.tx_fixup = asix_tx_fixup, .tx_fixup = asix_tx_fixup,
}; };

View file

@ -413,7 +413,7 @@ static int cdc_bind(struct usbnet *dev, struct usb_interface *intf)
static const struct driver_info cdc_info = { static const struct driver_info cdc_info = {
.description = "CDC Ethernet Device", .description = "CDC Ethernet Device",
.flags = FLAG_ETHER, .flags = FLAG_ETHER | FLAG_LINK_INTR,
// .check_connect = cdc_check_connect, // .check_connect = cdc_check_connect,
.bind = cdc_bind, .bind = cdc_bind,
.unbind = usbnet_cdc_unbind, .unbind = usbnet_cdc_unbind,

View file

@ -611,7 +611,7 @@ static int dm9601_link_reset(struct usbnet *dev)
static const struct driver_info dm9601_info = { static const struct driver_info dm9601_info = {
.description = "Davicom DM9601 USB Ethernet", .description = "Davicom DM9601 USB Ethernet",
.flags = FLAG_ETHER, .flags = FLAG_ETHER | FLAG_LINK_INTR,
.bind = dm9601_bind, .bind = dm9601_bind,
.rx_fixup = dm9601_rx_fixup, .rx_fixup = dm9601_rx_fixup,
.tx_fixup = dm9601_tx_fixup, .tx_fixup = dm9601_tx_fixup,

View file

@ -1352,9 +1352,11 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
// ok, it's ready to go. // ok, it's ready to go.
usb_set_intfdata (udev, dev); usb_set_intfdata (udev, dev);
// start as if the link is up
netif_device_attach (net); netif_device_attach (net);
if (dev->driver_info->flags & FLAG_LINK_INTR)
netif_carrier_off(net);
return 0; return 0;
out3: out3:

View file

@ -92,6 +92,7 @@ struct driver_info {
#define FLAG_SEND_ZLP 0x0200 /* hw requires ZLPs are sent */ #define FLAG_SEND_ZLP 0x0200 /* hw requires ZLPs are sent */
#define FLAG_WWAN 0x0400 /* use "wwan%d" names */ #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 */ /* init device ... can sleep, or cause probe() failure */
int (*bind)(struct usbnet *, struct usb_interface *); int (*bind)(struct usbnet *, struct usb_interface *);