* [PATCH] usb: hub: Fix locking issues with address0_mutex
@ 2021-11-23 10:16 Mathias Nyman
0 siblings, 0 replies; 3+ messages in thread
From: Mathias Nyman @ 2021-11-23 10:16 UTC (permalink / raw)
To: gregkh
Cc: m.szyprowski, stern, kishon, hdegoede, chris.chiu, linux-usb,
Mathias Nyman, stable
Fix the circular lock dependency and unbalanced unlock of addess0_mutex
introduced when fixing an address0_mutex enumeration retry race in commit
ae6dc22d2d1 ("usb: hub: Fix usb enumeration issue due to address0 race")
Make sure locking order between port_dev->status_lock and address0_mutex
is correct, and that address0_mutex is not unlocked in hub_port_connect
"done:" codepath which may be reached without locking address0_mutex
Fixes: 6ae6dc22d2d1 ("usb: hub: Fix usb enumeration issue due to address0 race")
Cc: <stable@vger.kernel.org>
Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Acked-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
---
drivers/usb/core/hub.c | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 9f0d1af8be6f..e907dfa0ca6d 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -5190,6 +5190,7 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
struct usb_port *port_dev = hub->ports[port1 - 1];
struct usb_device *udev = port_dev->child;
static int unreliable_port = -1;
+ bool retry_locked;
/* Disconnect any existing devices under this port */
if (udev) {
@@ -5246,10 +5247,10 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
status = 0;
- mutex_lock(hcd->address0_mutex);
-
for (i = 0; i < PORT_INIT_TRIES; i++) {
-
+ usb_lock_port(port_dev);
+ mutex_lock(hcd->address0_mutex);
+ retry_locked = true;
/* reallocate for each attempt, since references
* to the previous one can escape in various ways
*/
@@ -5257,6 +5258,8 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
if (!udev) {
dev_err(&port_dev->dev,
"couldn't allocate usb_device\n");
+ mutex_unlock(hcd->address0_mutex);
+ usb_unlock_port(port_dev);
goto done;
}
@@ -5278,13 +5281,13 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
}
/* reset (non-USB 3.0 devices) and get descriptor */
- usb_lock_port(port_dev);
status = hub_port_init(hub, udev, port1, i);
- usb_unlock_port(port_dev);
if (status < 0)
goto loop;
mutex_unlock(hcd->address0_mutex);
+ usb_unlock_port(port_dev);
+ retry_locked = false;
if (udev->quirks & USB_QUIRK_DELAY_INIT)
msleep(2000);
@@ -5374,11 +5377,14 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
loop_disable:
hub_port_disable(hub, port1, 1);
- mutex_lock(hcd->address0_mutex);
loop:
usb_ep0_reinit(udev);
release_devnum(udev);
hub_free_dev(udev);
+ if (retry_locked) {
+ mutex_unlock(hcd->address0_mutex);
+ usb_unlock_port(port_dev);
+ }
usb_put_dev(udev);
if ((status == -ENOTCONN) || (status == -ENOTSUPP))
break;
@@ -5401,8 +5407,6 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
}
done:
- mutex_unlock(hcd->address0_mutex);
-
hub_port_disable(hub, port1, 1);
if (hcd->driver->relinquish_port && !hub->hdev->parent) {
if (status != -ENOTCONN && status != -ENODEV)
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] usb: hub: Fix locking issues with address0_mutex
@ 2021-11-23 19:56 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-11-23 19:56 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 22125 bytes --]
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20211123101656.1113518-1-mathias.nyman@linux.intel.com>
References: <20211123101656.1113518-1-mathias.nyman@linux.intel.com>
TO: Mathias Nyman <mathias.nyman@linux.intel.com>
Hi Mathias,
I love your patch! Perhaps something to improve:
[auto build test WARNING on next-20211123]
[cannot apply to usb/usb-testing v5.16-rc2 v5.16-rc1 v5.15 v5.16-rc2]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Mathias-Nyman/usb-hub-Fix-locking-issues-with-address0_mutex/20211123-181633
base: aacdecce8147c20b01f865b4e214bb8dbe8c4af1
:::::: branch date: 10 hours ago
:::::: commit date: 10 hours ago
config: x86_64-randconfig-c002-20211123 (https://download.01.org/0day-ci/archive/20211124/202111240336.DQZAobmU-lkp(a)intel.com/config.gz)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Julia Lawall <julia.lawall@lip6.fr>
cocci warnings: (new ones prefixed by >>)
>> drivers/usb/core/hub.c:5250:2-12: second lock on line 5250
vim +5250 drivers/usb/core/hub.c
a4f55d8b8c146f David Heinzelmann 2019-10-09 5179
af376a461cf075 Dan Williams 2014-05-20 5180 static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
af376a461cf075 Dan Williams 2014-05-20 5181 u16 portchange)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5182 {
94c43b9897abf4 Alan Stern 2017-08-01 5183 int status = -ENODEV;
94c43b9897abf4 Alan Stern 2017-08-01 5184 int i;
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5185 unsigned unit_load;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5186 struct usb_device *hdev = hub->hdev;
90da096ee46b68 Balaji Rao 2007-11-22 5187 struct usb_hcd *hcd = bus_to_hcd(hdev->bus);
d99f6b41308779 Dan Williams 2014-05-20 5188 struct usb_port *port_dev = hub->ports[port1 - 1];
af376a461cf075 Dan Williams 2014-05-20 5189 struct usb_device *udev = port_dev->child;
5ee0f803cc3a07 Oliver Neukum 2014-07-14 5190 static int unreliable_port = -1;
0e162125abbf80 Mathias Nyman 2021-11-23 5191 bool retry_locked;
8808f00c7adfc8 Alan Stern 2008-04-28 5192
24618b0cd42f93 Alan Stern 2008-04-28 5193 /* Disconnect any existing devices under this port */
b76baa8154335a Peter Chen 2012-11-09 5194 if (udev) {
b2108f1e519e98 Peter Chen 2014-11-04 5195 if (hcd->usb_phy && !hdev->parent)
3d46e73dfdb840 Antoine Tenart 2014-09-24 5196 usb_phy_notify_disconnect(hcd->usb_phy, udev->speed);
d99f6b41308779 Dan Williams 2014-05-20 5197 usb_disconnect(&port_dev->child);
b76baa8154335a Peter Chen 2012-11-09 5198 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5199
253e05724f9230 Alan Stern 2009-10-27 5200 /* We can forget about a "removed" device when there's a physical
253e05724f9230 Alan Stern 2009-10-27 5201 * disconnect or the connect status changes.
253e05724f9230 Alan Stern 2009-10-27 5202 */
253e05724f9230 Alan Stern 2009-10-27 5203 if (!(portstatus & USB_PORT_STAT_CONNECTION) ||
253e05724f9230 Alan Stern 2009-10-27 5204 (portchange & USB_PORT_STAT_C_CONNECTION))
253e05724f9230 Alan Stern 2009-10-27 5205 clear_bit(port1, hub->removed_bits);
253e05724f9230 Alan Stern 2009-10-27 5206
5257d97a219e17 Alan Stern 2008-09-22 5207 if (portchange & (USB_PORT_STAT_C_CONNECTION |
5257d97a219e17 Alan Stern 2008-09-22 5208 USB_PORT_STAT_C_ENABLE)) {
ad493e5e580546 Lan Tianyu 2013-01-23 5209 status = hub_port_debounce_be_stable(hub, port1);
5257d97a219e17 Alan Stern 2008-09-22 5210 if (status < 0) {
5ee0f803cc3a07 Oliver Neukum 2014-07-14 5211 if (status != -ENODEV &&
5ee0f803cc3a07 Oliver Neukum 2014-07-14 5212 port1 != unreliable_port &&
5ee0f803cc3a07 Oliver Neukum 2014-07-14 5213 printk_ratelimit())
dd5f5006d10355 Takashi Iwai 2014-08-19 5214 dev_err(&port_dev->dev, "connect-debounce failed\n");
5257d97a219e17 Alan Stern 2008-09-22 5215 portstatus &= ~USB_PORT_STAT_CONNECTION;
5ee0f803cc3a07 Oliver Neukum 2014-07-14 5216 unreliable_port = port1;
5257d97a219e17 Alan Stern 2008-09-22 5217 } else {
5257d97a219e17 Alan Stern 2008-09-22 5218 portstatus = status;
5257d97a219e17 Alan Stern 2008-09-22 5219 }
5257d97a219e17 Alan Stern 2008-09-22 5220 }
5257d97a219e17 Alan Stern 2008-09-22 5221
253e05724f9230 Alan Stern 2009-10-27 5222 /* Return now if debouncing failed or nothing is connected or
253e05724f9230 Alan Stern 2009-10-27 5223 * the device was "removed".
253e05724f9230 Alan Stern 2009-10-27 5224 */
253e05724f9230 Alan Stern 2009-10-27 5225 if (!(portstatus & USB_PORT_STAT_CONNECTION) ||
253e05724f9230 Alan Stern 2009-10-27 5226 test_bit(port1, hub->removed_bits)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5227
fbaecff06a7db4 Deepak Das 2015-01-21 5228 /*
fbaecff06a7db4 Deepak Das 2015-01-21 5229 * maybe switch power back on (e.g. root hub was reset)
fbaecff06a7db4 Deepak Das 2015-01-21 5230 * but only if the port isn't owned by someone else.
fbaecff06a7db4 Deepak Das 2015-01-21 5231 */
9262c19d14c433 Dan Williams 2014-05-20 5232 if (hub_is_port_power_switchable(hub)
fbaecff06a7db4 Deepak Das 2015-01-21 5233 && !port_is_power_on(hub, portstatus)
fbaecff06a7db4 Deepak Das 2015-01-21 5234 && !port_dev->port_owner)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5235 set_port_feature(hdev, port1, USB_PORT_FEAT_POWER);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5236
^1da177e4c3f41 Linus Torvalds 2005-04-16 5237 if (portstatus & USB_PORT_STAT_ENABLE)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5238 goto done;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5239 return;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5240 }
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5241 if (hub_is_superspeed(hub->hdev))
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5242 unit_load = 150;
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5243 else
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5244 unit_load = 100;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5245
e9e88fb7bca9f5 Alan Stern 2013-03-27 5246 status = 0;
6ae6dc22d2d1ce Mathias Nyman 2021-11-16 5247
19502e6911e4ef Alan Stern 2020-09-28 5248 for (i = 0; i < PORT_INIT_TRIES; i++) {
0e162125abbf80 Mathias Nyman 2021-11-23 5249 usb_lock_port(port_dev);
0e162125abbf80 Mathias Nyman 2021-11-23 @5250 mutex_lock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman 2021-11-23 5251 retry_locked = true;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5252 /* reallocate for each attempt, since references
^1da177e4c3f41 Linus Torvalds 2005-04-16 5253 * to the previous one can escape in various ways
^1da177e4c3f41 Linus Torvalds 2005-04-16 5254 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5255 udev = usb_alloc_dev(hdev, hdev->bus, port1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5256 if (!udev) {
d99f6b41308779 Dan Williams 2014-05-20 5257 dev_err(&port_dev->dev,
d99f6b41308779 Dan Williams 2014-05-20 5258 "couldn't allocate usb_device\n");
0e162125abbf80 Mathias Nyman 2021-11-23 5259 mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman 2021-11-23 5260 usb_unlock_port(port_dev);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5261 goto done;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5262 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5263
^1da177e4c3f41 Linus Torvalds 2005-04-16 5264 usb_set_device_state(udev, USB_STATE_POWERED);
55c527187c9d78 Alan Stern 2005-11-23 5265 udev->bus_mA = hub->mA_per_port;
b6956ffa595db9 Alan Stern 2006-08-30 5266 udev->level = hdev->level + 1;
8af548dc8e36f8 Inaky Perez-Gonzalez 2008-04-08 5267 udev->wusb = hub_is_wusb(hub);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5268
8a1b2725a60d32 Mathias Nyman 2015-12-10 5269 /* Devices connected to SuperSpeed hubs are USB 3.0 or later */
131dec344d5e41 Sarah Sharp 2010-12-06 5270 if (hub_is_superspeed(hub->hdev))
e7b7717247f61e Sarah Sharp 2009-04-27 5271 udev->speed = USB_SPEED_SUPER;
e7b7717247f61e Sarah Sharp 2009-04-27 5272 else
e7b7717247f61e Sarah Sharp 2009-04-27 5273 udev->speed = USB_SPEED_UNKNOWN;
e7b7717247f61e Sarah Sharp 2009-04-27 5274
3b29b68b162778 Alan Stern 2011-02-22 5275 choose_devnum(udev);
c6515272b85874 Sarah Sharp 2009-04-27 5276 if (udev->devnum <= 0) {
c6515272b85874 Sarah Sharp 2009-04-27 5277 status = -ENOTCONN; /* Don't retry */
c6515272b85874 Sarah Sharp 2009-04-27 5278 goto loop;
c6515272b85874 Sarah Sharp 2009-04-27 5279 }
c6515272b85874 Sarah Sharp 2009-04-27 5280
e7b7717247f61e Sarah Sharp 2009-04-27 5281 /* reset (non-USB 3.0 devices) and get descriptor */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5282 status = hub_port_init(hub, udev, port1, i);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5283 if (status < 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5284 goto loop;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5285
6ae6dc22d2d1ce Mathias Nyman 2021-11-16 5286 mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman 2021-11-23 5287 usb_unlock_port(port_dev);
0e162125abbf80 Mathias Nyman 2021-11-23 5288 retry_locked = false;
6ae6dc22d2d1ce Mathias Nyman 2021-11-16 5289
93362a875fc698 Phil Dibowitz 2010-07-22 5290 if (udev->quirks & USB_QUIRK_DELAY_INIT)
b2a542bbb3081d Dmitry Fleytman 2017-09-05 5291 msleep(2000);
93362a875fc698 Phil Dibowitz 2010-07-22 5292
^1da177e4c3f41 Linus Torvalds 2005-04-16 5293 /* consecutive bus-powered hubs aren't reliable; they can
^1da177e4c3f41 Linus Torvalds 2005-04-16 5294 * violate the voltage drop budget. if the new child has
^1da177e4c3f41 Linus Torvalds 2005-04-16 5295 * a "powered" LED, users should notice we didn't enable it
^1da177e4c3f41 Linus Torvalds 2005-04-16 5296 * (without reading syslog), even without per-port LEDs
^1da177e4c3f41 Linus Torvalds 2005-04-16 5297 * on the parent.
^1da177e4c3f41 Linus Torvalds 2005-04-16 5298 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5299 if (udev->descriptor.bDeviceClass == USB_CLASS_HUB
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5300 && udev->bus_mA <= unit_load) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5301 u16 devstat;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5302
d9e1e1484ade39 Felipe Balbi 2017-11-02 5303 status = usb_get_std_status(udev, USB_RECIP_DEVICE, 0,
^1da177e4c3f41 Linus Torvalds 2005-04-16 5304 &devstat);
15b7336e02d998 Alan Stern 2013-07-30 5305 if (status) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5306 dev_dbg(&udev->dev, "get status %d ?\n", status);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5307 goto loop_disable;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5308 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5309 if ((devstat & (1 << USB_DEVICE_SELF_POWERED)) == 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5310 dev_err(&udev->dev,
^1da177e4c3f41 Linus Torvalds 2005-04-16 5311 "can't connect bus-powered hub "
^1da177e4c3f41 Linus Torvalds 2005-04-16 5312 "to this port\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 5313 if (hub->has_indicators) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5314 hub->indicator[port1-1] =
^1da177e4c3f41 Linus Torvalds 2005-04-16 5315 INDICATOR_AMBER_BLINK;
22f6a0f0e3549b Shaibal Dutta 2014-02-01 5316 queue_delayed_work(
22f6a0f0e3549b Shaibal Dutta 2014-02-01 5317 system_power_efficient_wq,
22f6a0f0e3549b Shaibal Dutta 2014-02-01 5318 &hub->leds, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5319 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5320 status = -ENOTCONN; /* Don't retry */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5321 goto loop_disable;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5322 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5323 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5324
^1da177e4c3f41 Linus Torvalds 2005-04-16 5325 /* check for devices running slower than they could */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5326 if (le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0200
^1da177e4c3f41 Linus Torvalds 2005-04-16 5327 && udev->speed == USB_SPEED_FULL
^1da177e4c3f41 Linus Torvalds 2005-04-16 5328 && highspeed_hubs != 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5329 check_highspeed(hub, udev, port1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5330
fa286188ce0fce Greg Kroah-Hartman 2012-05-14 5331 /* Store the parent's children[] pointer. At this point
^1da177e4c3f41 Linus Torvalds 2005-04-16 5332 * udev becomes globally accessible, although presumably
^1da177e4c3f41 Linus Torvalds 2005-04-16 5333 * no one will look at it until hdev is unlocked.
^1da177e4c3f41 Linus Torvalds 2005-04-16 5334 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5335 status = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5336
d8521afe35862f Dan Williams 2014-05-20 5337 mutex_lock(&usb_port_peer_mutex);
d8521afe35862f Dan Williams 2014-05-20 5338
^1da177e4c3f41 Linus Torvalds 2005-04-16 5339 /* We mustn't add new devices if the parent hub has
^1da177e4c3f41 Linus Torvalds 2005-04-16 5340 * been disconnected; we would race with the
^1da177e4c3f41 Linus Torvalds 2005-04-16 5341 * recursively_mark_NOTATTACHED() routine.
^1da177e4c3f41 Linus Torvalds 2005-04-16 5342 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5343 spin_lock_irq(&device_state_lock);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5344 if (hdev->state == USB_STATE_NOTATTACHED)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5345 status = -ENOTCONN;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5346 else
d99f6b41308779 Dan Williams 2014-05-20 5347 port_dev->child = udev;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5348 spin_unlock_irq(&device_state_lock);
d8521afe35862f Dan Williams 2014-05-20 5349 mutex_unlock(&usb_port_peer_mutex);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5350
^1da177e4c3f41 Linus Torvalds 2005-04-16 5351 /* Run it through the hoops (find a driver, etc) */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5352 if (!status) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5353 status = usb_new_device(udev);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5354 if (status) {
d8521afe35862f Dan Williams 2014-05-20 5355 mutex_lock(&usb_port_peer_mutex);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5356 spin_lock_irq(&device_state_lock);
d99f6b41308779 Dan Williams 2014-05-20 5357 port_dev->child = NULL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5358 spin_unlock_irq(&device_state_lock);
d8521afe35862f Dan Williams 2014-05-20 5359 mutex_unlock(&usb_port_peer_mutex);
01ed67dc70834d Tony Zheng 2014-10-17 5360 } else {
01ed67dc70834d Tony Zheng 2014-10-17 5361 if (hcd->usb_phy && !hdev->parent)
01ed67dc70834d Tony Zheng 2014-10-17 5362 usb_phy_notify_connect(hcd->usb_phy,
01ed67dc70834d Tony Zheng 2014-10-17 5363 udev->speed);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5364 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5365 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5366
^1da177e4c3f41 Linus Torvalds 2005-04-16 5367 if (status)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5368 goto loop_disable;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5369
^1da177e4c3f41 Linus Torvalds 2005-04-16 5370 status = hub_power_remaining(hub);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5371 if (status)
d99f6b41308779 Dan Williams 2014-05-20 5372 dev_dbg(hub->intfdev, "%dmA power budget left\n", status);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5373
^1da177e4c3f41 Linus Torvalds 2005-04-16 5374 return;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5375
^1da177e4c3f41 Linus Torvalds 2005-04-16 5376 loop_disable:
^1da177e4c3f41 Linus Torvalds 2005-04-16 5377 hub_port_disable(hub, port1, 1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5378 loop:
fc721f5194dc98 Inaky Perez-Gonzalez 2008-04-08 5379 usb_ep0_reinit(udev);
3b29b68b162778 Alan Stern 2011-02-22 5380 release_devnum(udev);
f7410ced7f931b Herbert Xu 2010-01-10 5381 hub_free_dev(udev);
0e162125abbf80 Mathias Nyman 2021-11-23 5382 if (retry_locked) {
0e162125abbf80 Mathias Nyman 2021-11-23 5383 mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman 2021-11-23 5384 usb_unlock_port(port_dev);
0e162125abbf80 Mathias Nyman 2021-11-23 5385 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5386 usb_put_dev(udev);
ffcdc18d64d73e Vikram Pandita 2007-05-25 5387 if ((status == -ENOTCONN) || (status == -ENOTSUPP))
^1da177e4c3f41 Linus Torvalds 2005-04-16 5388 break;
973593a960ddac Mike Looijmans 2017-11-09 5389
973593a960ddac Mike Looijmans 2017-11-09 5390 /* When halfway through our retry count, power-cycle the port */
19502e6911e4ef Alan Stern 2020-09-28 5391 if (i == (PORT_INIT_TRIES - 1) / 2) {
973593a960ddac Mike Looijmans 2017-11-09 5392 dev_info(&port_dev->dev, "attempt power cycle\n");
973593a960ddac Mike Looijmans 2017-11-09 5393 usb_hub_set_port_power(hdev, hub, port1, false);
973593a960ddac Mike Looijmans 2017-11-09 5394 msleep(2 * hub_power_on_good_delay(hub));
973593a960ddac Mike Looijmans 2017-11-09 5395 usb_hub_set_port_power(hdev, hub, port1, true);
973593a960ddac Mike Looijmans 2017-11-09 5396 msleep(hub_power_on_good_delay(hub));
973593a960ddac Mike Looijmans 2017-11-09 5397 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5398 }
3a31155cfff093 Alan Stern 2008-05-20 5399 if (hub->hdev->parent ||
3a31155cfff093 Alan Stern 2008-05-20 5400 !hcd->driver->port_handed_over ||
e9e88fb7bca9f5 Alan Stern 2013-03-27 5401 !(hcd->driver->port_handed_over)(hcd, port1)) {
e9e88fb7bca9f5 Alan Stern 2013-03-27 5402 if (status != -ENOTCONN && status != -ENODEV)
d99f6b41308779 Dan Williams 2014-05-20 5403 dev_err(&port_dev->dev,
d99f6b41308779 Dan Williams 2014-05-20 5404 "unable to enumerate USB device\n");
e9e88fb7bca9f5 Alan Stern 2013-03-27 5405 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5406
^1da177e4c3f41 Linus Torvalds 2005-04-16 5407 done:
^1da177e4c3f41 Linus Torvalds 2005-04-16 5408 hub_port_disable(hub, port1, 1);
94c43b9897abf4 Alan Stern 2017-08-01 5409 if (hcd->driver->relinquish_port && !hub->hdev->parent) {
94c43b9897abf4 Alan Stern 2017-08-01 5410 if (status != -ENOTCONN && status != -ENODEV)
90da096ee46b68 Balaji Rao 2007-11-22 5411 hcd->driver->relinquish_port(hcd, port1);
94c43b9897abf4 Alan Stern 2017-08-01 5412 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5413 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5414
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] usb: hub: Fix locking issues with address0_mutex
@ 2021-12-30 6:33 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-12-30 6:33 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 22120 bytes --]
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20211123101656.1113518-1-mathias.nyman@linux.intel.com>
References: <20211123101656.1113518-1-mathias.nyman@linux.intel.com>
TO: Mathias Nyman <mathias.nyman@linux.intel.com>
Hi Mathias,
I love your patch! Perhaps something to improve:
[auto build test WARNING on next-20211123]
[cannot apply to usb/usb-testing v5.16-rc2 v5.16-rc1 v5.15 v5.16-rc7]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Mathias-Nyman/usb-hub-Fix-locking-issues-with-address0_mutex/20211123-181633
base: aacdecce8147c20b01f865b4e214bb8dbe8c4af1
:::::: branch date: 5 weeks ago
:::::: commit date: 5 weeks ago
config: x86_64-randconfig-c002-20211123 (https://download.01.org/0day-ci/archive/20211230/202112301433.c5uiNFlK-lkp(a)intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Julia Lawall <julia.lawall@lip6.fr>
cocci warnings: (new ones prefixed by >>)
>> drivers/usb/core/hub.c:5250:2-12: second lock on line 5250
vim +5250 drivers/usb/core/hub.c
a4f55d8b8c146f David Heinzelmann 2019-10-09 5179
af376a461cf075 Dan Williams 2014-05-20 5180 static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
af376a461cf075 Dan Williams 2014-05-20 5181 u16 portchange)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5182 {
94c43b9897abf4 Alan Stern 2017-08-01 5183 int status = -ENODEV;
94c43b9897abf4 Alan Stern 2017-08-01 5184 int i;
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5185 unsigned unit_load;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5186 struct usb_device *hdev = hub->hdev;
90da096ee46b68 Balaji Rao 2007-11-22 5187 struct usb_hcd *hcd = bus_to_hcd(hdev->bus);
d99f6b41308779 Dan Williams 2014-05-20 5188 struct usb_port *port_dev = hub->ports[port1 - 1];
af376a461cf075 Dan Williams 2014-05-20 5189 struct usb_device *udev = port_dev->child;
5ee0f803cc3a07 Oliver Neukum 2014-07-14 5190 static int unreliable_port = -1;
0e162125abbf80 Mathias Nyman 2021-11-23 5191 bool retry_locked;
8808f00c7adfc8 Alan Stern 2008-04-28 5192
24618b0cd42f93 Alan Stern 2008-04-28 5193 /* Disconnect any existing devices under this port */
b76baa8154335a Peter Chen 2012-11-09 5194 if (udev) {
b2108f1e519e98 Peter Chen 2014-11-04 5195 if (hcd->usb_phy && !hdev->parent)
3d46e73dfdb840 Antoine Tenart 2014-09-24 5196 usb_phy_notify_disconnect(hcd->usb_phy, udev->speed);
d99f6b41308779 Dan Williams 2014-05-20 5197 usb_disconnect(&port_dev->child);
b76baa8154335a Peter Chen 2012-11-09 5198 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5199
253e05724f9230 Alan Stern 2009-10-27 5200 /* We can forget about a "removed" device when there's a physical
253e05724f9230 Alan Stern 2009-10-27 5201 * disconnect or the connect status changes.
253e05724f9230 Alan Stern 2009-10-27 5202 */
253e05724f9230 Alan Stern 2009-10-27 5203 if (!(portstatus & USB_PORT_STAT_CONNECTION) ||
253e05724f9230 Alan Stern 2009-10-27 5204 (portchange & USB_PORT_STAT_C_CONNECTION))
253e05724f9230 Alan Stern 2009-10-27 5205 clear_bit(port1, hub->removed_bits);
253e05724f9230 Alan Stern 2009-10-27 5206
5257d97a219e17 Alan Stern 2008-09-22 5207 if (portchange & (USB_PORT_STAT_C_CONNECTION |
5257d97a219e17 Alan Stern 2008-09-22 5208 USB_PORT_STAT_C_ENABLE)) {
ad493e5e580546 Lan Tianyu 2013-01-23 5209 status = hub_port_debounce_be_stable(hub, port1);
5257d97a219e17 Alan Stern 2008-09-22 5210 if (status < 0) {
5ee0f803cc3a07 Oliver Neukum 2014-07-14 5211 if (status != -ENODEV &&
5ee0f803cc3a07 Oliver Neukum 2014-07-14 5212 port1 != unreliable_port &&
5ee0f803cc3a07 Oliver Neukum 2014-07-14 5213 printk_ratelimit())
dd5f5006d10355 Takashi Iwai 2014-08-19 5214 dev_err(&port_dev->dev, "connect-debounce failed\n");
5257d97a219e17 Alan Stern 2008-09-22 5215 portstatus &= ~USB_PORT_STAT_CONNECTION;
5ee0f803cc3a07 Oliver Neukum 2014-07-14 5216 unreliable_port = port1;
5257d97a219e17 Alan Stern 2008-09-22 5217 } else {
5257d97a219e17 Alan Stern 2008-09-22 5218 portstatus = status;
5257d97a219e17 Alan Stern 2008-09-22 5219 }
5257d97a219e17 Alan Stern 2008-09-22 5220 }
5257d97a219e17 Alan Stern 2008-09-22 5221
253e05724f9230 Alan Stern 2009-10-27 5222 /* Return now if debouncing failed or nothing is connected or
253e05724f9230 Alan Stern 2009-10-27 5223 * the device was "removed".
253e05724f9230 Alan Stern 2009-10-27 5224 */
253e05724f9230 Alan Stern 2009-10-27 5225 if (!(portstatus & USB_PORT_STAT_CONNECTION) ||
253e05724f9230 Alan Stern 2009-10-27 5226 test_bit(port1, hub->removed_bits)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5227
fbaecff06a7db4 Deepak Das 2015-01-21 5228 /*
fbaecff06a7db4 Deepak Das 2015-01-21 5229 * maybe switch power back on (e.g. root hub was reset)
fbaecff06a7db4 Deepak Das 2015-01-21 5230 * but only if the port isn't owned by someone else.
fbaecff06a7db4 Deepak Das 2015-01-21 5231 */
9262c19d14c433 Dan Williams 2014-05-20 5232 if (hub_is_port_power_switchable(hub)
fbaecff06a7db4 Deepak Das 2015-01-21 5233 && !port_is_power_on(hub, portstatus)
fbaecff06a7db4 Deepak Das 2015-01-21 5234 && !port_dev->port_owner)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5235 set_port_feature(hdev, port1, USB_PORT_FEAT_POWER);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5236
^1da177e4c3f41 Linus Torvalds 2005-04-16 5237 if (portstatus & USB_PORT_STAT_ENABLE)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5238 goto done;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5239 return;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5240 }
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5241 if (hub_is_superspeed(hub->hdev))
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5242 unit_load = 150;
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5243 else
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5244 unit_load = 100;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5245
e9e88fb7bca9f5 Alan Stern 2013-03-27 5246 status = 0;
6ae6dc22d2d1ce Mathias Nyman 2021-11-16 5247
19502e6911e4ef Alan Stern 2020-09-28 5248 for (i = 0; i < PORT_INIT_TRIES; i++) {
0e162125abbf80 Mathias Nyman 2021-11-23 5249 usb_lock_port(port_dev);
0e162125abbf80 Mathias Nyman 2021-11-23 @5250 mutex_lock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman 2021-11-23 5251 retry_locked = true;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5252 /* reallocate for each attempt, since references
^1da177e4c3f41 Linus Torvalds 2005-04-16 5253 * to the previous one can escape in various ways
^1da177e4c3f41 Linus Torvalds 2005-04-16 5254 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5255 udev = usb_alloc_dev(hdev, hdev->bus, port1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5256 if (!udev) {
d99f6b41308779 Dan Williams 2014-05-20 5257 dev_err(&port_dev->dev,
d99f6b41308779 Dan Williams 2014-05-20 5258 "couldn't allocate usb_device\n");
0e162125abbf80 Mathias Nyman 2021-11-23 5259 mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman 2021-11-23 5260 usb_unlock_port(port_dev);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5261 goto done;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5262 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5263
^1da177e4c3f41 Linus Torvalds 2005-04-16 5264 usb_set_device_state(udev, USB_STATE_POWERED);
55c527187c9d78 Alan Stern 2005-11-23 5265 udev->bus_mA = hub->mA_per_port;
b6956ffa595db9 Alan Stern 2006-08-30 5266 udev->level = hdev->level + 1;
8af548dc8e36f8 Inaky Perez-Gonzalez 2008-04-08 5267 udev->wusb = hub_is_wusb(hub);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5268
8a1b2725a60d32 Mathias Nyman 2015-12-10 5269 /* Devices connected to SuperSpeed hubs are USB 3.0 or later */
131dec344d5e41 Sarah Sharp 2010-12-06 5270 if (hub_is_superspeed(hub->hdev))
e7b7717247f61e Sarah Sharp 2009-04-27 5271 udev->speed = USB_SPEED_SUPER;
e7b7717247f61e Sarah Sharp 2009-04-27 5272 else
e7b7717247f61e Sarah Sharp 2009-04-27 5273 udev->speed = USB_SPEED_UNKNOWN;
e7b7717247f61e Sarah Sharp 2009-04-27 5274
3b29b68b162778 Alan Stern 2011-02-22 5275 choose_devnum(udev);
c6515272b85874 Sarah Sharp 2009-04-27 5276 if (udev->devnum <= 0) {
c6515272b85874 Sarah Sharp 2009-04-27 5277 status = -ENOTCONN; /* Don't retry */
c6515272b85874 Sarah Sharp 2009-04-27 5278 goto loop;
c6515272b85874 Sarah Sharp 2009-04-27 5279 }
c6515272b85874 Sarah Sharp 2009-04-27 5280
e7b7717247f61e Sarah Sharp 2009-04-27 5281 /* reset (non-USB 3.0 devices) and get descriptor */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5282 status = hub_port_init(hub, udev, port1, i);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5283 if (status < 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5284 goto loop;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5285
6ae6dc22d2d1ce Mathias Nyman 2021-11-16 5286 mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman 2021-11-23 5287 usb_unlock_port(port_dev);
0e162125abbf80 Mathias Nyman 2021-11-23 5288 retry_locked = false;
6ae6dc22d2d1ce Mathias Nyman 2021-11-16 5289
93362a875fc698 Phil Dibowitz 2010-07-22 5290 if (udev->quirks & USB_QUIRK_DELAY_INIT)
b2a542bbb3081d Dmitry Fleytman 2017-09-05 5291 msleep(2000);
93362a875fc698 Phil Dibowitz 2010-07-22 5292
^1da177e4c3f41 Linus Torvalds 2005-04-16 5293 /* consecutive bus-powered hubs aren't reliable; they can
^1da177e4c3f41 Linus Torvalds 2005-04-16 5294 * violate the voltage drop budget. if the new child has
^1da177e4c3f41 Linus Torvalds 2005-04-16 5295 * a "powered" LED, users should notice we didn't enable it
^1da177e4c3f41 Linus Torvalds 2005-04-16 5296 * (without reading syslog), even without per-port LEDs
^1da177e4c3f41 Linus Torvalds 2005-04-16 5297 * on the parent.
^1da177e4c3f41 Linus Torvalds 2005-04-16 5298 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5299 if (udev->descriptor.bDeviceClass == USB_CLASS_HUB
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18 5300 && udev->bus_mA <= unit_load) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5301 u16 devstat;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5302
d9e1e1484ade39 Felipe Balbi 2017-11-02 5303 status = usb_get_std_status(udev, USB_RECIP_DEVICE, 0,
^1da177e4c3f41 Linus Torvalds 2005-04-16 5304 &devstat);
15b7336e02d998 Alan Stern 2013-07-30 5305 if (status) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5306 dev_dbg(&udev->dev, "get status %d ?\n", status);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5307 goto loop_disable;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5308 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5309 if ((devstat & (1 << USB_DEVICE_SELF_POWERED)) == 0) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5310 dev_err(&udev->dev,
^1da177e4c3f41 Linus Torvalds 2005-04-16 5311 "can't connect bus-powered hub "
^1da177e4c3f41 Linus Torvalds 2005-04-16 5312 "to this port\n");
^1da177e4c3f41 Linus Torvalds 2005-04-16 5313 if (hub->has_indicators) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5314 hub->indicator[port1-1] =
^1da177e4c3f41 Linus Torvalds 2005-04-16 5315 INDICATOR_AMBER_BLINK;
22f6a0f0e3549b Shaibal Dutta 2014-02-01 5316 queue_delayed_work(
22f6a0f0e3549b Shaibal Dutta 2014-02-01 5317 system_power_efficient_wq,
22f6a0f0e3549b Shaibal Dutta 2014-02-01 5318 &hub->leds, 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5319 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5320 status = -ENOTCONN; /* Don't retry */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5321 goto loop_disable;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5322 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5323 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5324
^1da177e4c3f41 Linus Torvalds 2005-04-16 5325 /* check for devices running slower than they could */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5326 if (le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0200
^1da177e4c3f41 Linus Torvalds 2005-04-16 5327 && udev->speed == USB_SPEED_FULL
^1da177e4c3f41 Linus Torvalds 2005-04-16 5328 && highspeed_hubs != 0)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5329 check_highspeed(hub, udev, port1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5330
fa286188ce0fce Greg Kroah-Hartman 2012-05-14 5331 /* Store the parent's children[] pointer. At this point
^1da177e4c3f41 Linus Torvalds 2005-04-16 5332 * udev becomes globally accessible, although presumably
^1da177e4c3f41 Linus Torvalds 2005-04-16 5333 * no one will look at it until hdev is unlocked.
^1da177e4c3f41 Linus Torvalds 2005-04-16 5334 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5335 status = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5336
d8521afe35862f Dan Williams 2014-05-20 5337 mutex_lock(&usb_port_peer_mutex);
d8521afe35862f Dan Williams 2014-05-20 5338
^1da177e4c3f41 Linus Torvalds 2005-04-16 5339 /* We mustn't add new devices if the parent hub has
^1da177e4c3f41 Linus Torvalds 2005-04-16 5340 * been disconnected; we would race with the
^1da177e4c3f41 Linus Torvalds 2005-04-16 5341 * recursively_mark_NOTATTACHED() routine.
^1da177e4c3f41 Linus Torvalds 2005-04-16 5342 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5343 spin_lock_irq(&device_state_lock);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5344 if (hdev->state == USB_STATE_NOTATTACHED)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5345 status = -ENOTCONN;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5346 else
d99f6b41308779 Dan Williams 2014-05-20 5347 port_dev->child = udev;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5348 spin_unlock_irq(&device_state_lock);
d8521afe35862f Dan Williams 2014-05-20 5349 mutex_unlock(&usb_port_peer_mutex);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5350
^1da177e4c3f41 Linus Torvalds 2005-04-16 5351 /* Run it through the hoops (find a driver, etc) */
^1da177e4c3f41 Linus Torvalds 2005-04-16 5352 if (!status) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 5353 status = usb_new_device(udev);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5354 if (status) {
d8521afe35862f Dan Williams 2014-05-20 5355 mutex_lock(&usb_port_peer_mutex);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5356 spin_lock_irq(&device_state_lock);
d99f6b41308779 Dan Williams 2014-05-20 5357 port_dev->child = NULL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5358 spin_unlock_irq(&device_state_lock);
d8521afe35862f Dan Williams 2014-05-20 5359 mutex_unlock(&usb_port_peer_mutex);
01ed67dc70834d Tony Zheng 2014-10-17 5360 } else {
01ed67dc70834d Tony Zheng 2014-10-17 5361 if (hcd->usb_phy && !hdev->parent)
01ed67dc70834d Tony Zheng 2014-10-17 5362 usb_phy_notify_connect(hcd->usb_phy,
01ed67dc70834d Tony Zheng 2014-10-17 5363 udev->speed);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5364 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5365 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5366
^1da177e4c3f41 Linus Torvalds 2005-04-16 5367 if (status)
^1da177e4c3f41 Linus Torvalds 2005-04-16 5368 goto loop_disable;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5369
^1da177e4c3f41 Linus Torvalds 2005-04-16 5370 status = hub_power_remaining(hub);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5371 if (status)
d99f6b41308779 Dan Williams 2014-05-20 5372 dev_dbg(hub->intfdev, "%dmA power budget left\n", status);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5373
^1da177e4c3f41 Linus Torvalds 2005-04-16 5374 return;
^1da177e4c3f41 Linus Torvalds 2005-04-16 5375
^1da177e4c3f41 Linus Torvalds 2005-04-16 5376 loop_disable:
^1da177e4c3f41 Linus Torvalds 2005-04-16 5377 hub_port_disable(hub, port1, 1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 5378 loop:
fc721f5194dc98 Inaky Perez-Gonzalez 2008-04-08 5379 usb_ep0_reinit(udev);
3b29b68b162778 Alan Stern 2011-02-22 5380 release_devnum(udev);
f7410ced7f931b Herbert Xu 2010-01-10 5381 hub_free_dev(udev);
0e162125abbf80 Mathias Nyman 2021-11-23 5382 if (retry_locked) {
0e162125abbf80 Mathias Nyman 2021-11-23 5383 mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman 2021-11-23 5384 usb_unlock_port(port_dev);
0e162125abbf80 Mathias Nyman 2021-11-23 5385 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5386 usb_put_dev(udev);
ffcdc18d64d73e Vikram Pandita 2007-05-25 5387 if ((status == -ENOTCONN) || (status == -ENOTSUPP))
^1da177e4c3f41 Linus Torvalds 2005-04-16 5388 break;
973593a960ddac Mike Looijmans 2017-11-09 5389
973593a960ddac Mike Looijmans 2017-11-09 5390 /* When halfway through our retry count, power-cycle the port */
19502e6911e4ef Alan Stern 2020-09-28 5391 if (i == (PORT_INIT_TRIES - 1) / 2) {
973593a960ddac Mike Looijmans 2017-11-09 5392 dev_info(&port_dev->dev, "attempt power cycle\n");
973593a960ddac Mike Looijmans 2017-11-09 5393 usb_hub_set_port_power(hdev, hub, port1, false);
973593a960ddac Mike Looijmans 2017-11-09 5394 msleep(2 * hub_power_on_good_delay(hub));
973593a960ddac Mike Looijmans 2017-11-09 5395 usb_hub_set_port_power(hdev, hub, port1, true);
973593a960ddac Mike Looijmans 2017-11-09 5396 msleep(hub_power_on_good_delay(hub));
973593a960ddac Mike Looijmans 2017-11-09 5397 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5398 }
3a31155cfff093 Alan Stern 2008-05-20 5399 if (hub->hdev->parent ||
3a31155cfff093 Alan Stern 2008-05-20 5400 !hcd->driver->port_handed_over ||
e9e88fb7bca9f5 Alan Stern 2013-03-27 5401 !(hcd->driver->port_handed_over)(hcd, port1)) {
e9e88fb7bca9f5 Alan Stern 2013-03-27 5402 if (status != -ENOTCONN && status != -ENODEV)
d99f6b41308779 Dan Williams 2014-05-20 5403 dev_err(&port_dev->dev,
d99f6b41308779 Dan Williams 2014-05-20 5404 "unable to enumerate USB device\n");
e9e88fb7bca9f5 Alan Stern 2013-03-27 5405 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5406
^1da177e4c3f41 Linus Torvalds 2005-04-16 5407 done:
^1da177e4c3f41 Linus Torvalds 2005-04-16 5408 hub_port_disable(hub, port1, 1);
94c43b9897abf4 Alan Stern 2017-08-01 5409 if (hcd->driver->relinquish_port && !hub->hdev->parent) {
94c43b9897abf4 Alan Stern 2017-08-01 5410 if (status != -ENOTCONN && status != -ENODEV)
90da096ee46b68 Balaji Rao 2007-11-22 5411 hcd->driver->relinquish_port(hcd, port1);
94c43b9897abf4 Alan Stern 2017-08-01 5412 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5413 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 5414
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-12-30 6:33 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-12-30 6:33 [PATCH] usb: hub: Fix locking issues with address0_mutex kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2021-11-23 19:56 kernel test robot
2021-11-23 10:16 Mathias Nyman
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.