Here are logs for SIM insertion: 2017-07-11T10:27:30.292312-07:00 INFO ModemManager[3598]: <debug> Received notification (service 'basic-connect', command 'subscriber-ready-status') 2017-07-11T10:27:30.292411-07:00 INFO ModemManager[3598]: <debug> Releasing SIM hot swap ports context 2017-07-11T10:27:30.292490-07:00 INFO ModemManager[3598]: <debug> (ttyACM0) device open count is 0 (close) 2017-07-11T10:27:30.292571-07:00 INFO ModemManager[3598]: <debug> (ttyACM0) closing serial port... 2017-07-11T10:27:30.298906-07:00 INFO ModemManager[3598]: <debug> (ttyACM0) serial port closed 2017-07-11T10:27:30.298970-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) device open count is 0 (close) 2017-07-11T10:27:30.299018-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) closing serial port... 2017-07-11T10:27:30.303705-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) serial port closed 2017-07-11T10:27:30.304335-07:00 INFO ModemManager[3598]: <debug> [device /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1] unexported modem from path '/org/freedesktop/ModemManager1/Modem/0' 2017-07-11T10:27:30.304962-07:00 INFO ModemManager[3598]: <debug> (ttyACM0) forced to close port 2017-07-11T10:27:30.306039-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) forced to close port 2017-07-11T10:27:30.306255-07:00 INFO ModemManager[3598]: <info> [device /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1] creating modem with plugin 'Generic' and '7' ports 2017-07-11T10:27:30.306381-07:00 INFO ModemManager[3598]: <debug> MBIM-powered generic modem found...
after which the modem initializes as you would expect with the SIM inserted, and connects to the network. When a SIM is removed: 2017-07-11T10:27:52.809700-07:00 INFO ModemManager[3598]: <debug> Received notification (service 'basic-connect', command 'subscriber-ready-status') 2017-07-11T10:27:52.809813-07:00 INFO ModemManager[3598]: <debug> Releasing SIM hot swap ports context 2017-07-11T10:27:52.809895-07:00 INFO ModemManager[3598]: <debug> (ttyACM0) device open count is 1 (close) 2017-07-11T10:27:52.809970-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) device open count is 1 (close) 2017-07-11T10:27:52.810267-07:00 INFO ModemManager[3598]: <info> Modem /org/freedesktop/ModemManager1/Modem/1: state changed (connected -> disabling) 2017-07-11T10:27:52.811251-07:00 INFO ModemManager[3598]: <debug> Disconnecting bearer '/org/freedesktop/ModemManager1/Bearer/0' 2017-07-11T10:27:52.811345-07:00 INFO ModemManager[3598]: <debug> Launching disconnection on data port (net/wwan0) [...] 2017-07-11T10:27:53.153117-07:00 INFO ModemManager[3598]: <info> Modem /org/freedesktop/ModemManager1/Modem/1: 3GPP Registration state changed (home -> unknown) 2017-07-11T10:27:53.153377-07:00 INFO ModemManager[3598]: <debug> Bearer not allowed to connect, not registered in 3GPP network 2017-07-11T10:27:53.153476-07:00 INFO ModemManager[3598]: <debug> Modem /org/freedesktop/ModemManager1/Modem/1: access technology changed (hsdpa, hsupa -> unknown) 2017-07-11T10:27:53.153980-07:00 INFO ModemManager[3598]: <debug> (ttyACM0) device open count is 0 (close) 2017-07-11T10:27:53.154071-07:00 INFO ModemManager[3598]: <debug> (ttyACM0) closing serial port... 2017-07-11T10:27:53.157973-07:00 INFO ModemManager[3598]: <debug> (ttyACM0) serial port closed 2017-07-11T10:27:53.158010-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) device open count is 0 (close) 2017-07-11T10:27:53.158039-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) closing serial port... 2017-07-11T10:27:53.160734-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) serial port closed 2017-07-11T10:27:53.160801-07:00 INFO ModemManager[3598]: <info> Modem /org/freedesktop/ModemManager1/Modem/1: state changed (disabling -> disabled) 2017-07-11T10:27:53.160926-07:00 INFO ModemManager[3598]: <info> Simple connect state (3/8): Enable 2017-07-11T10:27:53.161566-07:00 INFO ModemManager[3598]: <debug> Removing from DBus bearer at '/org/freedesktop/ModemManager1/Bearer/0' 2017-07-11T10:27:53.161627-07:00 INFO ModemManager[3598]: <debug> [device /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1] unexported modem from path '/org/freedesktop/ModemManager1/Modem/1' 2017-07-11T10:27:53.162223-07:00 INFO ModemManager[3598]: <debug> (ttyACM0) forced to close port 2017-07-11T10:27:53.162280-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) forced to close port 2017-07-11T10:27:53.162320-07:00 INFO ModemManager[3598]: <info> [device /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1] creating modem with plugin 'Generic' and '7' ports 2017-07-11T10:27:53.162352-07:00 INFO ModemManager[3598]: <debug> MBIM-powered generic modem found... [...] 2017-07-11T10:28:02.208920-07:00 INFO ModemManager[3598]: <debug> Couldn't check if unlock required: 'SIM not inserted' 2017-07-11T10:28:02.209405-07:00 INFO ModemManager[3598]: <info> Modem: state changed (unknown -> failed) 2017-07-11T10:28:02.210080-07:00 WARNING ModemManager[3598]: <warn> Modem couldn't be initialized: Couldn't check unlock status: SIM not inserted 2017-07-11T10:28:02.210410-07:00 INFO ModemManager[3598]: <debug> Couldn't initialize interface: 'Firmware interface not available' 2017-07-11T10:28:02.210715-07:00 INFO ModemManager[3598]: <debug> Creating ports context for SIM hot swap 2017-07-11T10:28:02.210822-07:00 INFO ModemManager[3598]: <debug> (ttyACM0) device open count is 2 (open) 2017-07-11T10:28:02.210901-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) opening serial port... 2017-07-11T10:28:02.212760-07:00 INFO ModemManager[3598]: <debug> (ttyACM2): setting up baudrate: 57600 2017-07-11T10:28:02.213030-07:00 INFO ModemManager[3598]: <debug> (ttyACM2) device open count is 1 (open) 2017-07-11T10:28:02.213124-07:00 INFO ModemManager[3598]: <debug> (ttyACM2): running init sequence... 2017-07-11T10:28:02.213300-07:00 INFO ModemManager[3598]: <info> SIM is missing, but the modem supports SIM hot swap. Waiting for SIM... This shows the modem is brought up in the failed state, so we export the right set of interfaces. On Tue, Jul 11, 2017 at 2:35 AM, Aleksander Morgado <aleksan...@aleksander.es> wrote: > Hey Eric, > > Looks very good to me, just some minor coding style issues, see below. > Also, I wouldn't mind debug logs when inserting the sim and removing > the sim, for future reference. > > On Tue, Jul 11, 2017 at 3:09 AM, Eric Caruso <ejcar...@chromium.org> wrote: >> If an MBIM modem supports unsolicited notifications for >> subscriber ready status, we can use it to detect when SIM cards >> have been removed and reinserted. Upon detection we should re- >> probe the modem so that we can configure it for the new SIM. >> --- >> src/mm-broadband-modem-mbim.c | 94 >> +++++++++++++++++++++++++++++++++++++++++-- >> 1 file changed, 91 insertions(+), 3 deletions(-) >> >> diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c >> index 0d1126d4..422f8ee4 100644 >> --- a/src/mm-broadband-modem-mbim.c >> +++ b/src/mm-broadband-modem-mbim.c >> @@ -88,6 +88,10 @@ struct _MMBroadbandModemMbimPrivate { >> /* Access technology updates */ >> MbimDataClass available_data_classes; >> MbimDataClass highest_available_data_class; >> + >> + /* For checking whether the SIM has been hot swapped */ >> + gboolean sim_hot_swap_on; >> + MbimSubscriberReadyState last_ready_state; >> }; >> >> >> /*****************************************************************************/ >> @@ -627,6 +631,8 @@ unlock_required_subscriber_ready_state_ready (MbimDevice >> *device, >> } >> } >> >> + ctx->self->priv->last_ready_state = ready_state; >> + >> /* Fatal errors are reported right away */ >> if (error) { >> g_simple_async_result_take_error (ctx->result, error); >> @@ -2041,8 +2047,15 @@ basic_connect_notification_subscriber_ready_status >> (MMBroadbandModemMbim *self, >> if (ready_state == MBIM_SUBSCRIBER_READY_STATE_INITIALIZED) >> mm_iface_modem_update_own_numbers (MM_IFACE_MODEM (self), >> telephone_numbers); >> >> - /* TODO: handle SIM removal using >> MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED */ >> + if ((self->priv->last_ready_state != >> MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED && >> + ready_state == MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED) || >> + (self->priv->last_ready_state == >> MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED && >> + ready_state != >> MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED)) { >> + /* SIM has been removed or reinserted, re-probe to ensure correct >> interfaces are exposed */ >> + mm_broadband_modem_update_sim_hot_swap_detected (MM_BROADBAND_MODEM >> (self)); >> + } >> >> + self->priv->last_ready_state = ready_state; >> g_strfreev (telephone_numbers); >> } >> >> @@ -2340,7 +2353,8 @@ cleanup_unsolicited_events_3gpp (MMIfaceModem3gpp >> *self, >> { >> MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags &= >> ~PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY; >> MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags &= >> ~PROCESS_NOTIFICATION_FLAG_CONNECT; >> - MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags &= >> ~PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO; >> + if (!MM_BROADBAND_MODEM_MBIM (self)->priv->sim_hot_swap_on) >> + MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags &= >> ~PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO; >> MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags &= >> ~PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE; >> common_setup_cleanup_unsolicited_events (MM_BROADBAND_MODEM_MBIM >> (self), FALSE, callback, user_data); >> } >> @@ -2526,6 +2540,74 @@ modem_3gpp_enable_unsolicited_registration_events >> (MMIfaceModem3gpp *self, >> } >> >> >> /*****************************************************************************/ >> +/* Setup SIM hot swap */ >> + >> +static gboolean >> +modem_setup_sim_hot_swap_finish (MMIfaceModem *self, >> + GAsyncResult *res, >> + GError **error) >> +{ >> + return g_task_propagate_boolean (G_TASK (res), error); >> +} >> + >> +static void >> +enable_subscriber_info_unsolicited_events_ready (MMIfaceModem *self, > > common_enable_disable_unsolicited_events() receives a > MMBroadbandModemMbim self pointer, and so the callback passed should > have that as first argument. This will avoid the explicit cast when > calling finish(). > >> + GAsyncResult *res, >> + GTask* task) > > The asterisk should be attached to the variable name above. > >> +{ >> + GError *error = NULL; >> + >> + if (!common_enable_disable_unsolicited_events_finish >> (MM_BROADBAND_MODEM_MBIM (self), res, &error)) { >> + mm_dbg ("Failed to enable subscriber info events: %s", >> error->message); >> + MM_BROADBAND_MODEM_MBIM (self)->priv->sim_hot_swap_on = FALSE; >> + g_task_return_error (task, error); >> + g_object_unref (task); >> + return; >> + } >> + >> + g_task_return_boolean (task, TRUE); >> + g_object_unref (task); >> +} >> + >> +static void >> +setup_subscriber_info_unsolicited_events_ready (MMIfaceModem *self, > > common_setup_cleanup_unsolicited_events() receives a > MMBroadbandModemMbim self pointer, and so the callback passed should > have that as first argument. This will avoid the explicit cast when > calling finish() and also all the other casts you have in the method. > >> + GAsyncResult *res, >> + GTask *task) >> +{ >> + GError *error = NULL; >> + >> + if (!common_setup_cleanup_unsolicited_events_finish >> (MM_BROADBAND_MODEM_MBIM (self), res, &error)) { >> + mm_dbg ("Failed to set up subscriber info events: %s", >> error->message); >> + MM_BROADBAND_MODEM_MBIM (self)->priv->sim_hot_swap_on = FALSE; >> + g_task_return_error (task, error); >> + g_object_unref (task); >> + return; >> + } >> + >> + MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags |= >> PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO; >> + common_enable_disable_unsolicited_events (MM_BROADBAND_MODEM_MBIM >> (self), >> + >> (GAsyncReadyCallback)enable_subscriber_info_unsolicited_events_ready, >> + task); >> +} >> + >> +static void >> +modem_setup_sim_hot_swap (MMIfaceModem *self, >> + GAsyncReadyCallback callback, >> + gpointer user_data) >> +{ >> + GTask *task; >> + >> + task = g_task_new (self, NULL, callback, user_data); >> + >> + MM_BROADBAND_MODEM_MBIM (self)->priv->sim_hot_swap_on = TRUE; >> + MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags |= >> PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO; >> + common_setup_cleanup_unsolicited_events (MM_BROADBAND_MODEM_MBIM (self), >> + TRUE, >> + >> (GAsyncReadyCallback)setup_subscriber_info_unsolicited_events_ready, >> + task); >> +} >> + >> +/*****************************************************************************/ >> /* Enable/Disable unsolicited events (3GPP interface) */ >> >> static gboolean >> @@ -2543,7 +2625,8 @@ modem_3gpp_disable_unsolicited_events >> (MMIfaceModem3gpp *self, >> { >> MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= >> ~PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY; >> MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= >> ~PROCESS_NOTIFICATION_FLAG_CONNECT; >> - MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= >> ~PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO; >> + if (!MM_BROADBAND_MODEM_MBIM (self)->priv->sim_hot_swap_on) >> + MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= >> ~PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO; >> MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= >> ~PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE; >> common_enable_disable_unsolicited_events (MM_BROADBAND_MODEM_MBIM >> (self), callback, user_data); >> } >> @@ -3165,6 +3248,7 @@ mm_broadband_modem_mbim_new (const gchar *device, >> MM_BASE_MODEM_PLUGIN, plugin, >> MM_BASE_MODEM_VENDOR_ID, vendor_id, >> MM_BASE_MODEM_PRODUCT_ID, product_id, >> + MM_IFACE_MODEM_SIM_HOT_SWAP_SUPPORTED, TRUE, >> NULL); >> } >> >> @@ -3251,6 +3335,10 @@ iface_modem_init (MMIfaceModem *iface) >> /* Create MBIM-specific bearer */ >> iface->create_bearer = modem_create_bearer; >> iface->create_bearer_finish = modem_create_bearer_finish; >> + >> + /* SIM hot swapping */ >> + iface->setup_sim_hot_swap = modem_setup_sim_hot_swap; >> + iface->setup_sim_hot_swap_finish = modem_setup_sim_hot_swap_finish; >> } >> >> static void >> -- >> 2.12.2 >> >> _______________________________________________ >> ModemManager-devel mailing list >> ModemManager-devel@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel > > > > -- > Aleksander > https://aleksander.es _______________________________________________ ModemManager-devel mailing list ModemManager-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel