Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 150687b8 authored by Mark Salyzyn's avatar Mark Salyzyn
Browse files

init: failed to set sys.usb.controller



With GKI we find in certain situations the timing of the drivers
loading is delayed as compared to a monolithic kernel.  This
introduces a race where during second stage init, the attributes
inside /sys/class/udc/ might not be set by the time
SetUsbController() is called.

To address this, we also call SetUsbController() until the property
sys.usb.controller is set at the bottom of the event loop.

Signed-off-by: default avatarMark Salyzyn <salyzyn@google.com>
Bug: 151950334
Test: make sure user space fastbootd comes up reliably for a GKI kernel
Change-Id: Iececd8ffa3e6641554d215d622d8dab72d85d34d
parent 5133bbfd
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -537,7 +537,9 @@ static Result<void> queue_property_triggers_action(const BuiltinArguments& args)
// Set the UDC controller for the ConfigFS USB Gadgets.
// Read the UDC controller in use from "/sys/class/udc".
// In case of multiple UDC controllers select the first one.
static void set_usb_controller() {
static void SetUsbController() {
    static auto controller_set = false;
    if (controller_set) return;
    std::unique_ptr<DIR, decltype(&closedir)>dir(opendir("/sys/class/udc"), closedir);
    if (!dir) return;

@@ -546,6 +548,7 @@ static void set_usb_controller() {
        if (dp->d_name[0] == '.') continue;

        SetProperty("sys.usb.controller", dp->d_name);
        controller_set = true;
        break;
    }
}
@@ -800,7 +803,7 @@ int SecondStageMain(int argc, char** argv) {
    fs_mgr_vendor_overlay_mount_all();
    export_oem_lock_status();
    MountHandler mount_handler(&epoll);
    set_usb_controller();
    SetUsbController();

    const BuiltinFunctionMap& function_map = GetBuiltinFunctionMap();
    Action::set_function_map(&function_map);
@@ -910,6 +913,7 @@ int SecondStageMain(int argc, char** argv) {
        }
        if (!IsShuttingDown()) {
            HandleControlMessages();
            SetUsbController();
        }
    }