Message ID | 20241008091038.1567406-2-sean@geanix.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [1/3] drivers: simcommodem: create rat to radio_access_mode function | expand |
Hi Sean, On 10/8/24 4:10 AM, Sean Nyekjaer wrote: > --- > Should we default to gsm, umts + lte if the call fails? > > drivers/simcommodem/radio-settings.c | 53 +++++++++++++++++++++++++--- > 1 file changed, 49 insertions(+), 4 deletions(-) > > diff --git a/drivers/simcommodem/radio-settings.c b/drivers/simcommodem/radio-settings.c > index 2a9dbaa2..2bb0d148 100644 > --- a/drivers/simcommodem/radio-settings.c > +++ b/drivers/simcommodem/radio-settings.c > @@ -97,6 +97,46 @@ error: > CALLBACK_WITH_FAILURE(cb, -1, cbd->data); > } > > +static void cnmp_rat_support_cb(gboolean ok, GAtResult *result, gpointer user_data) > +{ > + struct cb_data *cbd = user_data; > + ofono_radio_settings_rat_mode_query_cb_t cb = cbd->cb; > + struct ofono_error error; > + int index; > + GAtResultIter iter; > + unsigned int available_rats = 0; > + > + DBG("ok %d", ok); > + > + decode_at_error(&error, g_at_result_final_response(result)); > + > + if (!ok) { > + goto error; > + } No {} if not needed please > + > + g_at_result_iter_init(&iter, result); > + > + while (g_at_result_iter_next(&iter, "+CNMP:")) { > + if (!g_at_result_iter_open_list(&iter)) > + break; doc/coding-style.txt item M1 > + while (1) { > + if (!g_at_result_iter_next_number(&iter, &index)) > + break; > + available_rats |= r_mode_to_radio_access_mode(index); as above > + > + } > + } > + > + DBG("available_rats %d", available_rats); > + > + cb(&error, available_rats, cbd->data); > + > + return; > + > +error: > + CALLBACK_WITH_FAILURE(cb, -1, cbd->data); > +} > + > static void simcom_query_rat_mode(struct ofono_radio_settings *rs, > ofono_radio_settings_rat_mode_query_cb_t cb, > void *data) > @@ -169,11 +209,16 @@ static void simcom_query_available_rats(struct ofono_radio_settings *rs, > ofono_radio_settings_available_rats_query_cb_t cb, > void *data) > { > - unsigned int available_rats = OFONO_RADIO_ACCESS_MODE_GSM > - | OFONO_RADIO_ACCESS_MODE_UMTS > - | OFONO_RADIO_ACCESS_MODE_LTE; > + struct radio_settings_data *rsd = ofono_radio_settings_get_data(rs); > + struct cb_data *cbd = cb_data_new(cb, data); > + > + DBG(""); > > - CALLBACK_WITH_SUCCESS(cb, available_rats, data); > + if (g_at_chat_send(rsd->chat, "AT+CNMP=?", cnmp_prefix, > + cnmp_rat_support_cb, cbd, g_free) == 0) { > + CALLBACK_WITH_FAILURE(cb, -1, data); > + g_free(cbd); > + } > } > > static void cnmp_support_cb(gboolean ok, GAtResult *result, gpointer user_data) Regards, -Denis
diff --git a/drivers/simcommodem/radio-settings.c b/drivers/simcommodem/radio-settings.c index 2a9dbaa2..2bb0d148 100644 --- a/drivers/simcommodem/radio-settings.c +++ b/drivers/simcommodem/radio-settings.c @@ -97,6 +97,46 @@ error: CALLBACK_WITH_FAILURE(cb, -1, cbd->data); } +static void cnmp_rat_support_cb(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct cb_data *cbd = user_data; + ofono_radio_settings_rat_mode_query_cb_t cb = cbd->cb; + struct ofono_error error; + int index; + GAtResultIter iter; + unsigned int available_rats = 0; + + DBG("ok %d", ok); + + decode_at_error(&error, g_at_result_final_response(result)); + + if (!ok) { + goto error; + } + + g_at_result_iter_init(&iter, result); + + while (g_at_result_iter_next(&iter, "+CNMP:")) { + if (!g_at_result_iter_open_list(&iter)) + break; + while (1) { + if (!g_at_result_iter_next_number(&iter, &index)) + break; + available_rats |= r_mode_to_radio_access_mode(index); + + } + } + + DBG("available_rats %d", available_rats); + + cb(&error, available_rats, cbd->data); + + return; + +error: + CALLBACK_WITH_FAILURE(cb, -1, cbd->data); +} + static void simcom_query_rat_mode(struct ofono_radio_settings *rs, ofono_radio_settings_rat_mode_query_cb_t cb, void *data) @@ -169,11 +209,16 @@ static void simcom_query_available_rats(struct ofono_radio_settings *rs, ofono_radio_settings_available_rats_query_cb_t cb, void *data) { - unsigned int available_rats = OFONO_RADIO_ACCESS_MODE_GSM - | OFONO_RADIO_ACCESS_MODE_UMTS - | OFONO_RADIO_ACCESS_MODE_LTE; + struct radio_settings_data *rsd = ofono_radio_settings_get_data(rs); + struct cb_data *cbd = cb_data_new(cb, data); + + DBG(""); - CALLBACK_WITH_SUCCESS(cb, available_rats, data); + if (g_at_chat_send(rsd->chat, "AT+CNMP=?", cnmp_prefix, + cnmp_rat_support_cb, cbd, g_free) == 0) { + CALLBACK_WITH_FAILURE(cb, -1, data); + g_free(cbd); + } } static void cnmp_support_cb(gboolean ok, GAtResult *result, gpointer user_data)