mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH net-next 1/2] r8152: If inaccessible at resume time, issue a reset
@ 2024-05-20 20:41 Douglas Anderson
  2024-05-20 20:41 ` [PATCH net-next 2/2] r8152: Wake up the system if the we need " Douglas Anderson
  2024-05-21  9:13 ` [PATCH net-next 1/2] r8152: If inaccessible at resume time, issue " Paolo Abeni
  0 siblings, 2 replies; 3+ messages in thread
From: Douglas Anderson @ 2024-05-20 20:41 UTC (permalink / raw)
  To: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Hayes Wang
  Cc: danielgeorgem, Douglas Anderson, Andrew Lunn, Grant Grundler,
	Heiner Kallweit, linux-kernel, linux-usb, netdev

If we happened to get a USB transfer error during the transition to
suspend then the usb_queue_reset_device() that r8152_control_msg()
calls will get dropped on the floor. This is because
usb_lock_device_for_reset() (which usb_queue_reset_device() uses)
silently fails if it's called when a device is suspended or if too
much time passes.

Let's resolve this by resetting the device ourselves in r8152's
resume() function.

NOTE: due to timing, it's _possible_ that we could end up with two USB
resets: the one queued previously and the one called from the resume()
patch. This didn't happen in test cases I ran, though it's conceivably
possible. We can't easily know if this happened since
usb_queue_reset_device() can just silently drop the reset request. In
any case, it's not expected that this is a problem since the two
resets can't run at the same time (because of the device lock) and it
should be OK to reset the device twice. If somehow the double-reset
causes problems we could prevent resets from being queued up while
suspend is running.

Signed-off-by: Douglas Anderson <dianders@chromium.org>
---

 drivers/net/usb/r8152.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 19df1cd9f072..6a3f4b2114ee 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -8554,6 +8554,19 @@ static int rtl8152_system_resume(struct r8152 *tp)
 		usb_submit_urb(tp->intr_urb, GFP_NOIO);
 	}
 
+	/* If the device is RTL8152_INACCESSIBLE here then we should do a
+	 * reset. This is important because the usb_lock_device_for_reset()
+	 * that happens as a result of usb_queue_reset_device() will silently
+	 * fail if the device was suspended or if too much time passed.
+	 *
+	 * NOTE: The device is locked here so we can directly do the reset.
+	 * We don't need usb_lock_device_for_reset() because that's just a
+	 * wrapper over device_lock() and device_resume() (which calls us)
+	 * does that for us.
+	 */
+	if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
+		usb_reset_device(tp->udev);
+
 	return 0;
 }
 
-- 
2.45.0.rc1.225.g2a3ae87e7f-goog


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH net-next 2/2] r8152: Wake up the system if the we need a reset
  2024-05-20 20:41 [PATCH net-next 1/2] r8152: If inaccessible at resume time, issue a reset Douglas Anderson
@ 2024-05-20 20:41 ` Douglas Anderson
  2024-05-21  9:13 ` [PATCH net-next 1/2] r8152: If inaccessible at resume time, issue " Paolo Abeni
  1 sibling, 0 replies; 3+ messages in thread
From: Douglas Anderson @ 2024-05-20 20:41 UTC (permalink / raw)
  To: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Hayes Wang
  Cc: danielgeorgem, Douglas Anderson, Andrew Lunn, Grant Grundler,
	Heiner Kallweit, linux-kernel, linux-usb, netdev

If we get to the end of the r8152's suspend() routine and we find that
the USB device is INACCESSIBLE then it means that some of our
preparation for suspend didn't take place. We need a USB reset to get
ourselves back in a consistent state so we can try again and that
can't happen during system suspend. Call pm_wakeup_event() to wake the
system up in this case.

Signed-off-by: Douglas Anderson <dianders@chromium.org>
---

 drivers/net/usb/r8152.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 6a3f4b2114ee..09fe70bc45d4 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -8647,6 +8647,13 @@ static int rtl8152_system_suspend(struct r8152 *tp)
 		tasklet_enable(&tp->tx_tl);
 	}
 
+	/* If we're inaccessible here then some of the work that we did to
+	 * get the adapter ready for suspend didn't work. Queue up a wakeup
+	 * event so we can try again.
+	 */
+	if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
+		pm_wakeup_event(&tp->udev->dev, 0);
+
 	return 0;
 }
 
-- 
2.45.0.rc1.225.g2a3ae87e7f-goog


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH net-next 1/2] r8152: If inaccessible at resume time, issue a reset
  2024-05-20 20:41 [PATCH net-next 1/2] r8152: If inaccessible at resume time, issue a reset Douglas Anderson
  2024-05-20 20:41 ` [PATCH net-next 2/2] r8152: Wake up the system if the we need " Douglas Anderson
@ 2024-05-21  9:13 ` Paolo Abeni
  1 sibling, 0 replies; 3+ messages in thread
From: Paolo Abeni @ 2024-05-21  9:13 UTC (permalink / raw)
  To: Douglas Anderson, David S . Miller, Eric Dumazet, Jakub Kicinski,
	Hayes Wang
  Cc: danielgeorgem, Andrew Lunn, Grant Grundler, Heiner Kallweit,
	linux-kernel, linux-usb, netdev

On Mon, 2024-05-20 at 13:41 -0700, Douglas Anderson wrote:
> If we happened to get a USB transfer error during the transition to
> suspend then the usb_queue_reset_device() that r8152_control_msg()
> calls will get dropped on the floor. This is because
> usb_lock_device_for_reset() (which usb_queue_reset_device() uses)
> silently fails if it's called when a device is suspended or if too
> much time passes.
> 
> Let's resolve this by resetting the device ourselves in r8152's
> resume() function.
> 
> NOTE: due to timing, it's _possible_ that we could end up with two USB
> resets: the one queued previously and the one called from the resume()
> patch. This didn't happen in test cases I ran, though it's conceivably
> possible. We can't easily know if this happened since
> usb_queue_reset_device() can just silently drop the reset request. In
> any case, it's not expected that this is a problem since the two
> resets can't run at the same time (because of the device lock) and it
> should be OK to reset the device twice. If somehow the double-reset
> causes problems we could prevent resets from being queued up while
> suspend is running.
> 
> Signed-off-by: Douglas Anderson <dianders@chromium.org>

## Form letter - net-next-closed

The merge window for v6.10 has begun and we have already posted our
pull
request. Therefore net-next is closed for new drivers, features, code
refactoring and optimizations. We are currently accepting bug fixes
only.

Please repost when net-next reopens after May 26th.

RFC patches sent for review only are obviously welcome at any time.

See:
https://www.kernel.org/doc/html/next/process/maintainer-netdev.html#development-cycle


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-05-21  9:13 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-05-20 20:41 [PATCH net-next 1/2] r8152: If inaccessible at resume time, issue a reset Douglas Anderson
2024-05-20 20:41 ` [PATCH net-next 2/2] r8152: Wake up the system if the we need " Douglas Anderson
2024-05-21  9:13 ` [PATCH net-next 1/2] r8152: If inaccessible at resume time, issue " Paolo Abeni

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®