Merge branch 'r8152-fixes'
Hayes Wang says: ==================== r8152: device reset v3: For patch #2, remove cancel_delayed_work(). v2: For patch #1, remove usb_autopm_get_interface(), usb_autopm_put_interface(), and the checking of intf->condition. For patch #2, replace the original method with usb_queue_reset_device() to reset the device. v1: Although the driver works normally, we find the device may get all 0xff data when transmitting packets on certain platforms. It would break the device and no packet could be transmitted. The reset is necessary to recover the hw for this situation. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
990c9b3472
|
@ -27,7 +27,7 @@
|
|||
#include <linux/usb/cdc.h>
|
||||
|
||||
/* Version Information */
|
||||
#define DRIVER_VERSION "v1.08.0 (2015/01/13)"
|
||||
#define DRIVER_VERSION "v1.08.1 (2015/07/28)"
|
||||
#define DRIVER_AUTHOR "Realtek linux nic maintainers <nic_swsd@realtek.com>"
|
||||
#define DRIVER_DESC "Realtek RTL8152/RTL8153 Based USB Ethernet Adapters"
|
||||
#define MODULENAME "r8152"
|
||||
|
@ -1902,11 +1902,10 @@ static void rtl_drop_queued_tx(struct r8152 *tp)
|
|||
static void rtl8152_tx_timeout(struct net_device *netdev)
|
||||
{
|
||||
struct r8152 *tp = netdev_priv(netdev);
|
||||
int i;
|
||||
|
||||
netif_warn(tp, tx_err, netdev, "Tx timeout\n");
|
||||
for (i = 0; i < RTL8152_MAX_TX; i++)
|
||||
usb_unlink_urb(tp->tx_info[i].urb);
|
||||
|
||||
usb_queue_reset_device(tp->intf);
|
||||
}
|
||||
|
||||
static void rtl8152_set_rx_mode(struct net_device *netdev)
|
||||
|
@ -3342,6 +3341,58 @@ static void r8153_init(struct r8152 *tp)
|
|||
r8153_u2p3en(tp, true);
|
||||
}
|
||||
|
||||
static int rtl8152_pre_reset(struct usb_interface *intf)
|
||||
{
|
||||
struct r8152 *tp = usb_get_intfdata(intf);
|
||||
struct net_device *netdev;
|
||||
|
||||
if (!tp)
|
||||
return 0;
|
||||
|
||||
netdev = tp->netdev;
|
||||
if (!netif_running(netdev))
|
||||
return 0;
|
||||
|
||||
napi_disable(&tp->napi);
|
||||
clear_bit(WORK_ENABLE, &tp->flags);
|
||||
usb_kill_urb(tp->intr_urb);
|
||||
cancel_delayed_work_sync(&tp->schedule);
|
||||
if (netif_carrier_ok(netdev)) {
|
||||
netif_stop_queue(netdev);
|
||||
mutex_lock(&tp->control);
|
||||
tp->rtl_ops.disable(tp);
|
||||
mutex_unlock(&tp->control);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtl8152_post_reset(struct usb_interface *intf)
|
||||
{
|
||||
struct r8152 *tp = usb_get_intfdata(intf);
|
||||
struct net_device *netdev;
|
||||
|
||||
if (!tp)
|
||||
return 0;
|
||||
|
||||
netdev = tp->netdev;
|
||||
if (!netif_running(netdev))
|
||||
return 0;
|
||||
|
||||
set_bit(WORK_ENABLE, &tp->flags);
|
||||
if (netif_carrier_ok(netdev)) {
|
||||
mutex_lock(&tp->control);
|
||||
tp->rtl_ops.enable(tp);
|
||||
rtl8152_set_rx_mode(netdev);
|
||||
mutex_unlock(&tp->control);
|
||||
netif_wake_queue(netdev);
|
||||
}
|
||||
|
||||
napi_enable(&tp->napi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
{
|
||||
struct r8152 *tp = usb_get_intfdata(intf);
|
||||
|
@ -4164,6 +4215,8 @@ static struct usb_driver rtl8152_driver = {
|
|||
.suspend = rtl8152_suspend,
|
||||
.resume = rtl8152_resume,
|
||||
.reset_resume = rtl8152_resume,
|
||||
.pre_reset = rtl8152_pre_reset,
|
||||
.post_reset = rtl8152_post_reset,
|
||||
.supports_autosuspend = 1,
|
||||
.disable_hub_initiated_lpm = 1,
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче