Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1607375 > unrolled thread

[PATCH net] r8152: prevent the driver from transmitting packets with carrier off

Started byHayes Wang <hayeswang@realtek.com>
First post2017-03-23 12:20 +0100
Last post2017-03-24 20:40 +0100
Articles 2 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH net] r8152: prevent the driver from transmitting packets with carrier off Hayes Wang <hayeswang@realtek.com> - 2017-03-23 12:20 +0100
    Re: [PATCH net] r8152: prevent the driver from transmitting  packets with carrier off David Miller <davem@davemloft.net> - 2017-03-24 20:40 +0100

#1607375 — [PATCH net] r8152: prevent the driver from transmitting packets with carrier off

FromHayes Wang <hayeswang@realtek.com>
Date2017-03-23 12:20 +0100
Subject[PATCH net] r8152: prevent the driver from transmitting packets with carrier off
Message-ID<to8WB-1rG-3@gated-at.bofh.it>
The linking status may be changed when autosuspend. And, after
autoresume, the driver may try to transmit packets when the device
is carrier off, because the interrupt transfer doesn't update the
linking status, yet. And, if the device is in ALDPS mode, the device
would stop working.

The another similar case is
 1. unplug the cable.
 2. interrupt transfer queue a work_queue for linking change.
 3. device enters the ALDPS mode.
 4. a tx occurs before the work_queue is called.

Signed-off-by: Hayes Wang <hayeswang@realtek.com>
---
 drivers/net/usb/r8152.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 0b1b918..c34df33 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -1294,6 +1294,7 @@ static void intr_callback(struct urb *urb)
 		}
 	} else {
 		if (netif_carrier_ok(tp->netdev)) {
+			netif_stop_queue(tp->netdev);
 			set_bit(RTL8152_LINK_CHG, &tp->flags);
 			schedule_delayed_work(&tp->schedule, 0);
 		}
@@ -3169,6 +3170,9 @@ static void set_carrier(struct r8152 *tp)
 			napi_enable(&tp->napi);
 			netif_wake_queue(netdev);
 			netif_info(tp, link, netdev, "carrier on\n");
+		} else if (netif_queue_stopped(netdev) &&
+			   skb_queue_len(&tp->tx_queue) < tp->tx_qlen) {
+			netif_wake_queue(netdev);
 		}
 	} else {
 		if (netif_carrier_ok(netdev)) {
@@ -3702,8 +3706,18 @@ static int rtl8152_resume(struct usb_interface *intf)
 			tp->rtl_ops.autosuspend_en(tp, false);
 			napi_disable(&tp->napi);
 			set_bit(WORK_ENABLE, &tp->flags);
-			if (netif_carrier_ok(tp->netdev))
-				rtl_start_rx(tp);
+
+			if (netif_carrier_ok(tp->netdev)) {
+				if (rtl8152_get_speed(tp) & LINK_STATUS) {
+					rtl_start_rx(tp);
+				} else {
+					netif_carrier_off(tp->netdev);
+					tp->rtl_ops.disable(tp);
+					netif_info(tp, link, tp->netdev,
+						   "linking down\n");
+				}
+			}
+
 			napi_enable(&tp->napi);
 			clear_bit(SELECTIVE_SUSPEND, &tp->flags);
 			smp_mb__after_atomic();
-- 
2.7.4

[toc] | [next] | [standalone]


#1608934 — Re: [PATCH net] r8152: prevent the driver from transmitting packets with carrier off

FromDavid Miller <davem@davemloft.net>
Date2017-03-24 20:40 +0100
SubjectRe: [PATCH net] r8152: prevent the driver from transmitting packets with carrier off
Message-ID<toDe3-6aU-29@gated-at.bofh.it>
In reply to#1607375
From: Hayes Wang <hayeswang@realtek.com>
Date: Thu, 23 Mar 2017 19:14:19 +0800

> The linking status may be changed when autosuspend. And, after
> autoresume, the driver may try to transmit packets when the device
> is carrier off, because the interrupt transfer doesn't update the
> linking status, yet. And, if the device is in ALDPS mode, the device
> would stop working.
> 
> The another similar case is
>  1. unplug the cable.
>  2. interrupt transfer queue a work_queue for linking change.
>  3. device enters the ALDPS mode.
>  4. a tx occurs before the work_queue is called.
> 
> Signed-off-by: Hayes Wang <hayeswang@realtek.com>

Applied.

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web