Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Jul 2019 11:50:31 +0200
From:      Hans Petter Selasky <hps@selasky.org>
To:        sgk@troutmask.apl.washington.edu
Cc:        Ian Lepore <ian@freebsd.org>, freebsd-current@freebsd.org, takawata@freebsd.org
Subject:   Re: Someone broke USB
Message-ID:  <602f5c9b-e15e-d08f-f388-47fc0a560803@selasky.org>
In-Reply-To: <20190707222555.GA55146@troutmask.apl.washington.edu>
References:  <20190706231453.GA46470@troutmask.apl.washington.edu> <20190707080510.GA48223@troutmask.apl.washington.edu> <ff363616-37e2-8a90-7b3a-9eb18c51ba82@selasky.org> <20190707165429.GA50543@troutmask.apl.washington.edu> <025dfdc1-b2d2-ef88-c2d6-32d8f3620a9d@selasky.org> <99a61cc8-495f-a333-b4bc-46fc929bae37@selasky.org> <20190707185818.GA51398@troutmask.apl.washington.edu> <20ee6a81-d513-8332-8e47-6676dbb9a159@selasky.org> <20190707203635.GA53065@troutmask.apl.washington.edu> <2ccb6b71-022d-5b66-3ba9-007e2647b3e2@selasky.org> <20190707222555.GA55146@troutmask.apl.washington.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------4A9CCB06FD1A9D94EA21755E
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit

Hi Steve,

Can you test this patch?

I made a slight variant which delay the explore threads instead of the 
main thread running all the sysinits.

--HPS

--------------4A9CCB06FD1A9D94EA21755E
Content-Type: text/x-patch;
 name="usb_delay.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="usb_delay.diff"

Index: sys/dev/usb/controller/usb_controller.c
===================================================================
--- sys/dev/usb/controller/usb_controller.c	(revision 349802)
+++ sys/dev/usb/controller/usb_controller.c	(working copy)
@@ -105,6 +105,10 @@
 SYSCTL_INT(_hw_usb, OID_AUTO, no_shutdown_wait, CTLFLAG_RWTUN,
     &usb_no_shutdown_wait, 0, "No USB device waiting at system shutdown.");
 
+static int usb_explore_wait = 250;
+SYSCTL_INT(_hw_usb, OID_AUTO, explore_wait, CTLFLAG_RWTUN,
+    &usb_explore_wait, 0, "Delay in milliseconds between initial root HUB explore.");
+
 static devclass_t usb_devclass;
 
 static device_method_t usb_methods[] = {
@@ -373,6 +377,13 @@
 	if (bus->no_explore != 0)
 		return;
 
+	if (bus->explore_delay == 0) {
+		int ms = device_get_unit(bus->bdev) * usb_explore_wait;
+		bus->explore_delay = 1;
+		if (ms != 0)
+			usb_pause_mtx(&bus->bus_mtx, howmany(ms * hz, 1000));
+	}
+
 	if (udev != NULL) {
 		USB_BUS_UNLOCK(bus);
 		uhub_explore_handle_re_enumerate(udev);
Index: sys/dev/usb/usb_bus.h
===================================================================
--- sys/dev/usb/usb_bus.h	(revision 349802)
+++ sys/dev/usb/usb_bus.h	(working copy)
@@ -131,6 +131,7 @@
 	uint8_t	do_probe;		/* set if USB should be re-probed */
 	uint8_t no_explore;		/* don't explore USB ports */
 	uint8_t dma_bits;		/* number of DMA address lines */
+	uint8_t explore_delay;		/* set if USB explore did initial delay */
 };
 
 #endif					/* _USB_BUS_H_ */

--------------4A9CCB06FD1A9D94EA21755E--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?602f5c9b-e15e-d08f-f388-47fc0a560803>