Re: [PATCH net 2/2] r8152: reset device when tx timeout

2015-07-28 Thread Oliver Neukum
On Tue, 2015-07-28 at 15:36 +0800, Hayes Wang wrote:
 The device reset is necessary if the hw becomes abnormal and stops
 transmitting packets.

You are not the first one to face this problem. Hence there
is a helper:

 * usb_queue_reset_device - Reset a USB device from an atomic context
 * @iface: USB interface belonging to the device to reset
 *
 * This function can be used to reset a USB device from an atomic
 * context, where usb_reset_device() won't work (as it blocks).

Please use it if you can. Your version for example is buggy.
It will oops if you unplug the device while a reset is scheduled.

Regards
Oliver


--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH net 2/2] r8152: reset device when tx timeout

2015-07-28 Thread Hayes Wang
Oliver Neukum [mailto:oneu...@suse.com]
 Sent: Tuesday, July 28, 2015 4:57 PM
[...]
  * usb_queue_reset_device - Reset a USB device from an atomic context
  * @iface: USB interface belonging to the device to reset
  *
  * This function can be used to reset a USB device from an atomic
  * context, where usb_reset_device() won't work (as it blocks).
 
 Please use it if you can. Your version for example is buggy.
 It will oops if you unplug the device while a reset is scheduled.

Thanks for your suggestion. I would replace it. 

Best Regards,
Hayes

N�r��yb�X��ǧv�^�)޺{.n�+���z�^�)w*jg����ݢj/���z�ޖ��2�ޙ�)ߡ�a�����G���h��j:+v���w��٥

[PATCH net 2/2] r8152: reset device when tx timeout

2015-07-28 Thread Hayes Wang
The device reset is necessary if the hw becomes abnormal and stops
transmitting packets.

Signed-off-by: Hayes Wang hayesw...@realtek.com
---
 drivers/net/usb/r8152.c | 22 ++
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index a6caa60..9bf6e0c 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -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_s...@realtek.com
 #define DRIVER_DESC Realtek RTL8152/RTL8153 Based USB Ethernet Adapters
 #define MODULENAME r8152
@@ -591,6 +591,7 @@ struct r8152 {
struct sk_buff_head tx_queue, rx_queue;
spinlock_t rx_lock, tx_lock;
struct delayed_work schedule;
+   struct delayed_work work_reset;
struct mii_if_info mii;
struct mutex control;   /* use for hw setting */
 
@@ -1902,11 +1903,11 @@ 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);
+
+   schedule_delayed_work(tp-work_reset, 0);
+   cancel_delayed_work(tp-schedule);
 }
 
 static void rtl8152_set_rx_mode(struct net_device *netdev)
@@ -3408,6 +3409,18 @@ static int rtl8152_post_reset(struct usb_interface *intf)
return ret;
 }
 
+static void rtl_hw_reset(struct work_struct *work)
+{
+   struct r8152 *tp = container_of(work, struct r8152, work_reset.work);
+
+   netif_info(tp, drv, tp-netdev, usb reset device\n);
+
+   if (test_bit(RTL8152_UNPLUG, tp-flags))
+   return;
+
+   usb_reset_device(tp-udev);
+}
+
 static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message)
 {
struct r8152 *tp = usb_get_intfdata(intf);
@@ -4102,6 +4115,7 @@ static int rtl8152_probe(struct usb_interface *intf,
 
mutex_init(tp-control);
INIT_DELAYED_WORK(tp-schedule, rtl_work_func_t);
+   INIT_DELAYED_WORK(tp-work_reset, rtl_hw_reset);
 
netdev-netdev_ops = rtl8152_netdev_ops;
netdev-watchdog_timeo = RTL8152_TX_TIMEOUT;
-- 
2.4.2

--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html