From e5d7296470aa81f290b25daa0baabf98f2c77488 Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Thu, 3 Dec 2009 23:52:48 +0000 Subject: [PATCH] usbnet: Set link down initially for drivers that update link state (Closes: #444043) svn path=/dists/trunk/linux-2.6/; revision=14722 --- debian/changelog | 2 + ...wn-initially-for-drivers-that-update.patch | 112 ++++++++++++++++++ debian/patches/series/base | 1 + 3 files changed, 115 insertions(+) create mode 100644 debian/patches/bugfix/all/usbnet-link-down-initially-for-drivers-that-update.patch diff --git a/debian/changelog b/debian/changelog index c0f3de860..36906ae73 100644 --- a/debian/changelog +++ b/debian/changelog @@ -33,6 +33,8 @@ linux-2.6 (2.6.32-1) UNRELEASED; urgency=low * atl1e: Remove broken implementation of TSO for TCP/IPv6 (Closes: #558426) and allow other hardware offloads to be disabled in case they are also buggy + * usbnet: Set link down initially for drivers that update link state + (Closes: #444043) [ dann frazier ] * mac80211 (CVE-2009-4026, CVE-2009-4027): diff --git a/debian/patches/bugfix/all/usbnet-link-down-initially-for-drivers-that-update.patch b/debian/patches/bugfix/all/usbnet-link-down-initially-for-drivers-that-update.patch new file mode 100644 index 000000000..802fd108e --- /dev/null +++ b/debian/patches/bugfix/all/usbnet-link-down-initially-for-drivers-that-update.patch @@ -0,0 +1,112 @@ +From: Ben Hutchings +Subject: [PATCH] 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 + +--- a/drivers/net/usb/asix.c ++++ b/drivers/net/usb/asix.c +@@ -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, + }; +--- a/drivers/net/usb/cdc_ether.c ++++ b/drivers/net/usb/cdc_ether.c +@@ -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, +--- a/drivers/net/usb/dm9601.c ++++ b/drivers/net/usb/dm9601.c +@@ -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, +--- a/drivers/net/usb/usbnet.c ++++ b/drivers/net/usb/usbnet.c +@@ -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: +--- a/include/linux/usb/usbnet.h ++++ b/include/linux/usb/usbnet.h +@@ -92,6 +92,7 @@ struct driver_info { + #define FLAG_AVOID_UNLINK_URBS 0x0100 /* don't unlink urbs at usbnet_stop() */ + #define FLAG_SEND_ZLP 0x0200 /* hw requires ZLPs are sent */ + ++#define FLAG_LINK_INTR 0x0800 /* updates link (carrier) status */ + + /* init device ... can sleep, or cause probe() failure */ + int (*bind)(struct usbnet *, struct usb_interface *); diff --git a/debian/patches/series/base b/debian/patches/series/base index 32650d08a..b8c506701 100644 --- a/debian/patches/series/base +++ b/debian/patches/series/base @@ -80,3 +80,4 @@ + bugfix/all/atl1e-remove-broken-tsov6.patch + features/all/atl1e-allow-offload-disable.patch ++ bugfix/all/usbnet-link-down-initially-for-drivers-that-update.patch