Patch "r8152: fix rx issue for runtime suspend" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
r8152: fix rx issue for runtime suspend
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
r8152-fix-rx-issue-for-runtime-suspend.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Jan 12 21:37:26 CET 2017
From: hayeswang <[email protected]>
Date: Tue, 10 Jan 2017 17:04:07 +0800
Subject: r8152: fix rx issue for runtime suspend
From: hayeswang <[email protected]>
[ Upstream commit 75dc692eda114cb234a46cb11893a9c3ea520934 ]
Pause the rx and make sure the rx fifo is empty when the autosuspend occurs.
If the rx data comes when the driver is canceling the rx urb, the host controller would stop getting the data from the device and continue it after next rx urb is submitted. That is, one continuing data is split into two different urb buffers. That let the driver take the data as a rx descriptor, and unexpected behavior happens.
--- drivers/net/usb/r8152.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-)
drivers/net/usb/r8152.c +28 -3
@@ -3582,17 +3582,42 @@ static int rtl8152_rumtime_suspend(strucint ret =0 ;if (netif_running (netdev) &&test_bit (WORK_ENABLE , &tp->flags)) { +u32 rcr =0 ; +if (delay_autosuspend (tp)) { ret = -EBUSY ; goto out1; } +if (netif_carrier_ok (netdev)) { +u32 ocp_data; + + rcr =ocp_read_dword (tp,MCU_TYPE_PLA ,PLA_RCR ); + ocp_data = rcr & ~RCR_ACPT_ALL ; +ocp_write_dword (tp,MCU_TYPE_PLA ,PLA_RCR , ocp_data); +rxdy_gated_en (tp, true); + ocp_data =ocp_read_byte (tp,MCU_TYPE_PLA , +PLA_OOB_CTRL ); +if (!(ocp_data &RXFIFO_EMPTY )) { +rxdy_gated_en (tp, false); +ocp_write_dword (tp,MCU_TYPE_PLA ,PLA_RCR , rcr); + ret = -EBUSY ; + goto out1; + } + } +clear_bit (WORK_ENABLE , &tp->flags);usb_kill_urb (tp->intr_urb); -napi_disable (&tp->napi); -rtl_stop_rx (tp); + tp->rtl_ops.autosuspend_en (tp, true); -napi_enable (&tp->napi); + +if (netif_carrier_ok (netdev)) { +napi_disable (&tp->napi); +rtl_stop_rx (tp); +rxdy_gated_en (tp, false); +ocp_write_dword (tp,MCU_TYPE_PLA ,PLA_RCR , rcr); +napi_enable (&tp->napi); + } }set_bit (SELECTIVE_SUSPEND , &tp->flags);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/r8152-split-rtl8152_suspend-function.patch queue-4.9/r8152-fix-rx-issue-for-runtime-suspend.patch