usb: fix ->update_hub_device() vs hdev->maxchild
Commit d8521afe35
"usb: assign default peer ports for root hubs"
delayed marking a hub valid (set hdev->maxchild) until it had been fully
configured and to enable the publishing of valid hubs to be serialized
by usb_port_peer_mutex.
However, xhci_update_hub_device() in some cases depends on
hdev->maxchild already being set. Do the minimal fix and move it after
the setting of hdev->maxchild.
Cc: Mathias Nyman <mathias.nyman@linux.intel.com>
Reported-by: Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
Tested-by: Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
7171511eae
commit
e3d9558082
@@ -1526,18 +1526,6 @@ static int hub_configure(struct usb_hub *hub,
|
|||||||
dev_dbg(hub_dev, "%umA bus power budget for each child\n",
|
dev_dbg(hub_dev, "%umA bus power budget for each child\n",
|
||||||
hub->mA_per_port);
|
hub->mA_per_port);
|
||||||
|
|
||||||
/* Update the HCD's internal representation of this hub before khubd
|
|
||||||
* starts getting port status changes for devices under the hub.
|
|
||||||
*/
|
|
||||||
if (hcd->driver->update_hub_device) {
|
|
||||||
ret = hcd->driver->update_hub_device(hcd, hdev,
|
|
||||||
&hub->tt, GFP_KERNEL);
|
|
||||||
if (ret < 0) {
|
|
||||||
message = "can't update HCD hub info";
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = hub_hub_status(hub, &hubstatus, &hubchange);
|
ret = hub_hub_status(hub, &hubstatus, &hubchange);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
message = "can't get hub status";
|
message = "can't get hub status";
|
||||||
@@ -1593,6 +1581,18 @@ static int hub_configure(struct usb_hub *hub,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
/* Update the HCD's internal representation of this hub before khubd
|
||||||
|
* starts getting port status changes for devices under the hub.
|
||||||
|
*/
|
||||||
|
if (hcd->driver->update_hub_device) {
|
||||||
|
ret = hcd->driver->update_hub_device(hcd, hdev,
|
||||||
|
&hub->tt, GFP_KERNEL);
|
||||||
|
if (ret < 0) {
|
||||||
|
message = "can't update HCD hub info";
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
usb_hub_adjust_deviceremovable(hdev, hub->descriptor);
|
usb_hub_adjust_deviceremovable(hdev, hub->descriptor);
|
||||||
|
|
||||||
hub_activate(hub, HUB_INIT);
|
hub_activate(hub, HUB_INIT);
|
||||||
|
Reference in New Issue
Block a user