• Kristian Evensen's avatar
    cdc_ether: Fix handling connection notification · d5c83d0d
    Kristian Evensen authored
    Commit bfe9b9d2 ("cdc_ether: Improve ZTE MF823/831/910 handling")
    introduced a work-around in usbnet_cdc_status() for devices that exported
    cdc carrier on twice on connect. Before the commit, this behavior caused
    the link state to be incorrect. It was assumed that all CDC Ethernet
    devices would either export this behavior, or send one off and then one on
    notification (which seems to be the default behavior).
    
    Unfortunately, it turns out multiple devices sends a connection
    notification multiple times per second (via an interrupt), even when
    connection state does not change. This has been observed with several
    different USB LAN dongles (at least), for example 13b1:0041 (Linksys).
    After bfe9b9d2, the link state has been set as down and then up for
    each notification. This has caused a flood of Netlink NEWLINK messages and
    syslog to be flooded with messages similar to:
    
    cdc_ether 2-1:2.0 eth1: kevent 12 may have been dropped
    
    This commit fixes the behavior by reverting usbnet_cdc_status() to how it
    was before bfe9b9d2. The work-around has been moved to a separate
    status-function which is only called when a known, affect device is
    detected.
    
    v1->v2:
    
    * Do not open-code netif_carrier_ok() (thanks Henning Schild).
    * Call netif_carrier_off() instead of usb_link_change(). This prevents
    calling schedule_work() twice without giving the work queue a chance to be
    processed (thanks Bjørn Mork).
    
    Fixes: bfe9b9d2 ("cdc_ether: Improve ZTE MF823/831/910 handling")
    Reported-by: default avatarHenning Schild <henning.schild@siemens.com>
    Signed-off-by: default avatarKristian Evensen <kristian.evensen@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    d5c83d0d
cdc_ether.c 23.7 KB