manager: split modem_suspend() into _pre() and _post() functions

This way we can make sure the AT commands are executed only once 
ModemManager has released the modem, preventing any race condition.
This commit is contained in:
Arnaud Ferraris
2020-12-11 11:56:14 +01:00
parent 8d31e39e89
commit ff9b26b831
4 changed files with 13 additions and 5 deletions

View File

@@ -135,14 +135,20 @@ error:
manager->modem_state = EG25_STATE_RESETTING; manager->modem_state = EG25_STATE_RESETTING;
} }
void modem_suspend(struct EG25Manager *manager) void modem_suspend_pre(struct EG25Manager *manager)
{ {
manager->modem_state = EG25_STATE_SUSPENDING;
gpio_sequence_suspend(manager); gpio_sequence_suspend(manager);
}
void modem_suspend_post(struct EG25Manager *manager)
{
at_sequence_suspend(manager); at_sequence_suspend(manager);
} }
void modem_resume_pre(struct EG25Manager *manager) void modem_resume_pre(struct EG25Manager *manager)
{ {
manager->modem_state = EG25_STATE_RESUMING;
gpio_sequence_resume(manager); gpio_sequence_resume(manager);
} }

View File

@@ -51,7 +51,8 @@ struct EG25Manager {
void modem_configure(struct EG25Manager *data); void modem_configure(struct EG25Manager *data);
void modem_reset(struct EG25Manager *data); void modem_reset(struct EG25Manager *data);
void modem_suspend(struct EG25Manager *data); void modem_suspend_pre(struct EG25Manager *data);
void modem_suspend_post(struct EG25Manager *data);
void modem_resume_pre(struct EG25Manager *data); void modem_resume_pre(struct EG25Manager *data);
void modem_resume_post(struct EG25Manager *data); void modem_resume_post(struct EG25Manager *data);
void modem_update_state(struct EG25Manager *data, MMModemState state); void modem_update_state(struct EG25Manager *data, MMModemState state);

View File

@@ -132,6 +132,9 @@ static void object_removed_cb(struct EG25Manager *manager, GDBusObject *object)
path = g_dbus_object_get_object_path(object); path = g_dbus_object_get_object_path(object);
g_message("ModemManager object `%s' removed", path); g_message("ModemManager object `%s' removed", path);
if (manager->modem_state == EG25_STATE_SUSPENDING)
modem_suspend_post(manager);
manager->mm_modem = NULL; manager->mm_modem = NULL;
if (manager->modem_usb_id) { if (manager->modem_usb_id) {
g_free(manager->modem_usb_id); g_free(manager->modem_usb_id);

View File

@@ -92,13 +92,11 @@ static void signal_cb(GDBusProxy *proxy,
if (is_about_to_suspend) { if (is_about_to_suspend) {
g_message("system is about to suspend"); g_message("system is about to suspend");
manager->modem_state = EG25_STATE_SUSPENDING; modem_suspend_pre(manager);
modem_suspend(manager);
} else { } else {
g_message("system is resuming"); g_message("system is resuming");
take_inhibitor(manager); take_inhibitor(manager);
modem_resume_pre(manager); modem_resume_pre(manager);
manager->modem_state = EG25_STATE_RESUMING;
manager->suspend_source = g_timeout_add_seconds(8, G_SOURCE_FUNC(check_modem_resume), manager); manager->suspend_source = g_timeout_add_seconds(8, G_SOURCE_FUNC(check_modem_resume), manager);
} }
} }