From 21bc151dc3d3c08950edf5dc87bef80d5d572672 Mon Sep 17 00:00:00 2001 From: Ondrej Zary Date: Thu, 11 Oct 2012 22:51:41 +0000 Subject: [PATCH] --- yaml --- r: 334031 b: refs/heads/master c: dabdaf0caa3af520dbc1df87b2fb4e77224037bd h: refs/heads/master i: 334029: 181e98299421af3385f58b6017644f092d3f08fb 334027: 937b30fb8868938dfbb6f54c3b1f5a46d225c120 334023: dbee52fac1294909f03676396d5df0388636a3cd 334015: 5d939922c2ca9427129ac085c2716a013273ce58 v: v3 --- [refs] | 2 +- trunk/drivers/net/usb/mcs7830.c | 30 +++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index a90f8459b783..c8c43876cb42 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 93ac0ef016a1b223d23fbb5e0397cab75a8f7d34 +refs/heads/master: dabdaf0caa3af520dbc1df87b2fb4e77224037bd diff --git a/trunk/drivers/net/usb/mcs7830.c b/trunk/drivers/net/usb/mcs7830.c index 03c2d8d653df..cc7e72010ac3 100644 --- a/trunk/drivers/net/usb/mcs7830.c +++ b/trunk/drivers/net/usb/mcs7830.c @@ -117,6 +117,7 @@ enum { struct mcs7830_data { u8 multi_filter[8]; u8 config; + u8 link_counter; }; static const char driver_name[] = "MOSCHIP usb-ethernet driver"; @@ -632,20 +633,31 @@ static int mcs7830_rx_fixup(struct usbnet *dev, struct sk_buff *skb) static void mcs7830_status(struct usbnet *dev, struct urb *urb) { u8 *buf = urb->transfer_buffer; - bool link; + bool link, link_changed; + struct mcs7830_data *data = mcs7830_get_data(dev); if (urb->actual_length < 16) return; link = !(buf[1] & 0x20); - if (netif_carrier_ok(dev->net) != link) { - if (link) { - netif_carrier_on(dev->net); - usbnet_defer_kevent(dev, EVENT_LINK_RESET); - } else - netif_carrier_off(dev->net); - netdev_dbg(dev->net, "Link Status is: %d\n", link); - } + link_changed = netif_carrier_ok(dev->net) != link; + if (link_changed) { + data->link_counter++; + /* + track link state 20 times to guard against erroneous + link state changes reported sometimes by the chip + */ + if (data->link_counter > 20) { + data->link_counter = 0; + if (link) { + netif_carrier_on(dev->net); + usbnet_defer_kevent(dev, EVENT_LINK_RESET); + } else + netif_carrier_off(dev->net); + netdev_dbg(dev->net, "Link Status is: %d\n", link); + } + } else + data->link_counter = 0; } static const struct driver_info moschip_info = {