From 3b2cb9cd1adb2d3a6815f415aee86c38c996ad27 Mon Sep 17 00:00:00 2001 From: Simo Piiroinen Date: Tue, 13 Nov 2018 13:45:07 +0200 Subject: [PATCH] [worker] Fallback to undefined on cable disconnect. Fixes JB#43781 Cable disconnect during mode transition is handled via the code same path as errors in mode setting actions - which leads to usb-moded declaring charging mode despite not having any usb connection. Check the latest requested usb mode on failures and use it to choose between charging and undefined fallback modes. Signed-off-by: Simo Piiroinen --- src/usb_moded-worker.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/usb_moded-worker.c b/src/usb_moded-worker.c index bf2c4ae..49068a3 100644 --- a/src/usb_moded-worker.c +++ b/src/usb_moded-worker.c @@ -574,7 +574,20 @@ worker_switch_to_mode(const char *mode) worker_set_usb_mode_data(NULL); } - override = MODE_CHARGING; + /* From usb configuration point of view MODE_UNDEFINED and + * MODE_CHARGING are the same, but for the purposes of exposing + * a sane state over D-Bus we need to differentiate between + * "failure to set mode" and "aborting mode setting due to cable + * disconnect" by inspecting whether target mode has been + * switched to undefined. + */ + WORKER_LOCKED_ENTER; + const char *requested = worker_get_requested_mode_locked(); + if( !g_strcmp0(requested, MODE_UNDEFINED) ) + override = MODE_UNDEFINED; + else + override = MODE_CHARGING; + WORKER_LOCKED_LEAVE; log_warning("mode setting failed, try %s", override); CHARGE: @@ -597,8 +610,9 @@ worker_switch_to_mode(const char *mode) WORKER_LOCKED_ENTER; if( override ) { - worker_set_activated_mode_locked(override); worker_set_requested_mode_locked(override); + override = common_map_mode_to_hardware(override); + worker_set_activated_mode_locked(override); } else { worker_set_activated_mode_locked(mode);