* [PATCH] qmi: radio-settings: Do not unconditionally try to enable unsupported modes
@ 2024-12-07 17:20 Ivaylo Dimitrov
2024-12-11 5:13 ` Denis Kenzior
0 siblings, 1 reply; 5+ messages in thread
From: Ivaylo Dimitrov @ 2024-12-07 17:20 UTC (permalink / raw)
To: ofono; +Cc: denkenz, absicsz, merlijn, Ivaylo Dimitrov
At least the modem in Motorola Droid 4 errors out if anything else but GSM
and UMTS bits are set when selecting preferred mode. That happens if 'any'
mode is set.
Fix that by querying supported modes and passing only those for 'any' mode.
---
drivers/qmimodem/radio-settings.c | 97 +++++++++++++++++++++++++++++--
drivers/qmimodem/util.h | 19 +++---
2 files changed, 104 insertions(+), 12 deletions(-)
diff --git a/drivers/qmimodem/radio-settings.c b/drivers/qmimodem/radio-settings.c
index cf0b747e..b62a87d0 100644
--- a/drivers/qmimodem/radio-settings.c
+++ b/drivers/qmimodem/radio-settings.c
@@ -21,6 +21,12 @@
struct settings_data {
struct qmi_service *nas;
struct qmi_service *dms;
+ unsigned int rat_mode_any;
+};
+
+struct rat_mode_any_data {
+ struct cb_data cbd;
+ unsigned int mode;
};
static void get_system_selection_pref_cb(struct qmi_result *result,
@@ -92,20 +98,20 @@ static void set_system_selection_pref_cb(struct qmi_result *result,
CALLBACK_WITH_SUCCESS(cb, cbd->data);
}
-static void qmi_set_rat_mode(struct ofono_radio_settings *rs, unsigned int mode,
+static void _set_rat_mode(struct ofono_radio_settings *rs, unsigned int mode,
ofono_radio_settings_rat_mode_set_cb_t cb,
void *user_data)
{
struct settings_data *data = ofono_radio_settings_get_data(rs);
struct cb_data *cbd = cb_data_new(cb, user_data);
- uint16_t pref = QMI_NAS_RAT_MODE_PREF_ANY;
+ uint16_t pref = 0;
struct qmi_param *param;
DBG("");
switch (mode) {
case OFONO_RADIO_ACCESS_MODE_ANY:
- pref = QMI_NAS_RAT_MODE_PREF_ANY;
+ pref = data->rat_mode_any;
break;
case OFONO_RADIO_ACCESS_MODE_GSM:
pref = QMI_NAS_RAT_MODE_PREF_GSM;
@@ -136,14 +142,91 @@ static void qmi_set_rat_mode(struct ofono_radio_settings *rs, unsigned int mode,
l_free(cbd);
}
+static void get_rat_mode_any_cb(struct qmi_result *result, void *user_data)
+{
+ struct rat_mode_any_data *data = user_data;
+ struct cb_data *cbd = &data->cbd;
+ struct ofono_radio_settings *rs = cbd->user;
+ struct settings_data *rsd = ofono_radio_settings_get_data(rs);
+ const struct qmi_dms_device_caps *caps;
+ uint16_t len;
+ uint8_t i;
+
+ DBG("");
+
+ if (qmi_result_set_error(result, NULL))
+ goto error;
+
+ caps = qmi_result_get(result, QMI_DMS_RESULT_DEVICE_CAPS, &len);
+ if (!caps)
+ goto error;
+
+ for (i = 0; i < caps->radio_if_count; i++) {
+ switch (caps->radio_if[i]) {
+ case QMI_DMS_RADIO_IF_GSM:
+ rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_GSM;
+ break;
+ case QMI_DMS_RADIO_IF_UMTS:
+ rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_UMTS;
+ break;
+ case QMI_DMS_RADIO_IF_LTE:
+ rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_LTE;
+ break;
+ }
+ }
+
+error:
+ /* last resort */
+ if (rsd->rat_mode_any == 0)
+ rsd->rat_mode_any = QMI_NAS_RAT_MODE_PREF_ANY;
+
+ _set_rat_mode(rs, data->mode, cbd->cb, cbd->data);
+}
+
+static bool get_rat_mode_any(struct ofono_radio_settings *rs, unsigned int mode,
+ ofono_radio_settings_rat_mode_set_cb_t cb,
+ void *user_data)
+{
+ struct settings_data *rsd = ofono_radio_settings_get_data(rs);
+ struct rat_mode_any_data *data = l_new(struct rat_mode_any_data, 1);
+ struct cb_data *cbd = cb_data_init(&data->cbd, cb, user_data);
+
+ if (!rsd->dms)
+ goto error;
+
+ cbd->user = rs;
+ data->mode = mode;
+
+ if (qmi_service_send(rsd->dms, QMI_DMS_GET_CAPS, NULL,
+ get_rat_mode_any_cb, data, l_free) > 0)
+ return true;
+
+error:
+ l_free(data);
+ rsd->rat_mode_any = QMI_NAS_RAT_MODE_PREF_ANY;
+ return false;
+}
+
+static void qmi_set_rat_mode(struct ofono_radio_settings *rs, unsigned int mode,
+ ofono_radio_settings_rat_mode_set_cb_t cb,
+ void *user_data)
+{
+ struct settings_data *rsd = ofono_radio_settings_get_data(rs);
+
+ if (rsd->rat_mode_any || !get_rat_mode_any(rs, mode, cb, user_data))
+ _set_rat_mode(rs, mode, cb, user_data);
+}
+
static void get_caps_cb(struct qmi_result *result, void *user_data)
{
struct cb_data *cbd = user_data;
+ struct ofono_radio_settings *rs = cbd->user;
+ struct settings_data *rsd = ofono_radio_settings_get_data(rs);
ofono_radio_settings_available_rats_query_cb_t cb = cbd->cb;
const struct qmi_dms_device_caps *caps;
- unsigned int available_rats;
uint16_t len;
uint8_t i;
+ unsigned int available_rats;
DBG("");
@@ -155,16 +238,20 @@ static void get_caps_cb(struct qmi_result *result, void *user_data)
goto error;
available_rats = 0;
+
for (i = 0; i < caps->radio_if_count; i++) {
switch (caps->radio_if[i]) {
case QMI_DMS_RADIO_IF_GSM:
available_rats |= OFONO_RADIO_ACCESS_MODE_GSM;
+ rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_GSM;
break;
case QMI_DMS_RADIO_IF_UMTS:
available_rats |= OFONO_RADIO_ACCESS_MODE_UMTS;
+ rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_UMTS;
break;
case QMI_DMS_RADIO_IF_LTE:
available_rats |= OFONO_RADIO_ACCESS_MODE_LTE;
+ rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_LTE;
break;
}
}
@@ -187,6 +274,8 @@ static void qmi_query_available_rats(struct ofono_radio_settings *rs,
if (!rsd->dms)
goto error;
+ cbd->user = rs;
+
if (qmi_service_send(rsd->dms, QMI_DMS_GET_CAPS, NULL,
get_caps_cb, cbd, l_free) > 0)
return;
diff --git a/drivers/qmimodem/util.h b/drivers/qmimodem/util.h
index 58bf4f98..14d4d865 100644
--- a/drivers/qmimodem/util.h
+++ b/drivers/qmimodem/util.h
@@ -14,17 +14,20 @@ struct cb_data {
int ref;
};
-static inline struct cb_data *cb_data_new(void *cb, void *data)
+static inline struct cb_data *cb_data_init(struct cb_data *cbd, void *cb,
+ void *data)
{
- struct cb_data *ret;
+ cbd->cb = cb;
+ cbd->data = data;
+ cbd->user = NULL;
+ cbd->ref = 1;
- ret = l_new(struct cb_data, 1);
- ret->cb = cb;
- ret->data = data;
- ret->user = NULL;
- ret->ref = 1;
+ return cbd;
+}
- return ret;
+static inline struct cb_data *cb_data_new(void *cb, void *data)
+{
+ return cb_data_init(l_new(struct cb_data, 1), cb, data);
}
static inline struct cb_data *cb_data_ref(struct cb_data *cbd)
--
2.25.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] qmi: radio-settings: Do not unconditionally try to enable unsupported modes
2024-12-07 17:20 [PATCH] qmi: radio-settings: Do not unconditionally try to enable unsupported modes Ivaylo Dimitrov
@ 2024-12-11 5:13 ` Denis Kenzior
2024-12-11 13:54 ` Ivaylo Dimitrov
2024-12-11 15:16 ` [PATCH v2] " Ivaylo Dimitrov
0 siblings, 2 replies; 5+ messages in thread
From: Denis Kenzior @ 2024-12-11 5:13 UTC (permalink / raw)
To: Ivaylo Dimitrov, ofono; +Cc: absicsz, merlijn
Hi Ivo,
On 12/7/24 11:20 AM, Ivaylo Dimitrov wrote:
> At least the modem in Motorola Droid 4 errors out if anything else but GSM
> and UMTS bits are set when selecting preferred mode. That happens if 'any'
> mode is set.
>
> Fix that by querying supported modes and passing only those for 'any' mode.
> ---
> drivers/qmimodem/radio-settings.c | 97 +++++++++++++++++++++++++++++--
> drivers/qmimodem/util.h | 19 +++---
> 2 files changed, 104 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/qmimodem/radio-settings.c b/drivers/qmimodem/radio-settings.c
> index cf0b747e..b62a87d0 100644
> --- a/drivers/qmimodem/radio-settings.c
> +++ b/drivers/qmimodem/radio-settings.c
<snip>
> @@ -136,14 +142,91 @@ static void qmi_set_rat_mode(struct ofono_radio_settings *rs, unsigned int mode,
> l_free(cbd);
> }
>
> +static void get_rat_mode_any_cb(struct qmi_result *result, void *user_data)
> +{
> + struct rat_mode_any_data *data = user_data;
> + struct cb_data *cbd = &data->cbd;
> + struct ofono_radio_settings *rs = cbd->user;
> + struct settings_data *rsd = ofono_radio_settings_get_data(rs);
> + const struct qmi_dms_device_caps *caps;
> + uint16_t len;
> + uint8_t i;
> +
> + DBG("");
> +
> + if (qmi_result_set_error(result, NULL))
> + goto error;
> +
> + caps = qmi_result_get(result, QMI_DMS_RESULT_DEVICE_CAPS, &len);
> + if (!caps)
> + goto error;
> +
> + for (i = 0; i < caps->radio_if_count; i++) {
> + switch (caps->radio_if[i]) {
> + case QMI_DMS_RADIO_IF_GSM:
> + rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_GSM;
> + break;
> + case QMI_DMS_RADIO_IF_UMTS:
> + rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_UMTS;
> + break;
> + case QMI_DMS_RADIO_IF_LTE:
> + rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_LTE;
> + break;
> + }
> + }
This looks like copy-paste of get_caps_cb. Lets avoid that by invoking
QMI_DMS_GET_CAPS during probe(). See below.
> +
> +error:
> + /* last resort */
> + if (rsd->rat_mode_any == 0)
> + rsd->rat_mode_any = QMI_NAS_RAT_MODE_PREF_ANY;
> +
> + _set_rat_mode(rs, data->mode, cbd->cb, cbd->data);
> +}
> +
> +static bool get_rat_mode_any(struct ofono_radio_settings *rs, unsigned int mode,
> + ofono_radio_settings_rat_mode_set_cb_t cb,
> + void *user_data)
> +{
> + struct settings_data *rsd = ofono_radio_settings_get_data(rs);
> + struct rat_mode_any_data *data = l_new(struct rat_mode_any_data, 1);
> + struct cb_data *cbd = cb_data_init(&data->cbd, cb, user_data);
> +
> + if (!rsd->dms)
> + goto error;
> +
> + cbd->user = rs;
> + data->mode = mode;
> +
> + if (qmi_service_send(rsd->dms, QMI_DMS_GET_CAPS, NULL,
> + get_rat_mode_any_cb, data, l_free) > 0)
> + return true;
> +
> +error:
> + l_free(data);
> + rsd->rat_mode_any = QMI_NAS_RAT_MODE_PREF_ANY;
> + return false;
> +}
> +
> +static void qmi_set_rat_mode(struct ofono_radio_settings *rs, unsigned int mode,
> + ofono_radio_settings_rat_mode_set_cb_t cb,
> + void *user_data)
> +{
> + struct settings_data *rsd = ofono_radio_settings_get_data(rs);
> +
> + if (rsd->rat_mode_any || !get_rat_mode_any(rs, mode, cb, user_data))
So your intent here is to query the radio capabilities first if they haven't
been queried before? If so, then the typical pattern is to do this during
probe(), before calling ofono_radio_settings_register(). See qmimodem/lte.c for
an example.
> + _set_rat_mode(rs, mode, cb, user_data);
> +}
> +
> static void get_caps_cb(struct qmi_result *result, void *user_data)
> {
> struct cb_data *cbd = user_data;
> + struct ofono_radio_settings *rs = cbd->user;
> + struct settings_data *rsd = ofono_radio_settings_get_data(rs);
> ofono_radio_settings_available_rats_query_cb_t cb = cbd->cb;
> const struct qmi_dms_device_caps *caps;
> - unsigned int available_rats;
> uint16_t len;
> uint8_t i;
> + unsigned int available_rats;
Why is 'available_rats' being moved?
>
> DBG("");
>
> @@ -155,16 +238,20 @@ static void get_caps_cb(struct qmi_result *result, void *user_data)
> goto error;
>
> available_rats = 0;
> +
> for (i = 0; i < caps->radio_if_count; i++) {
> switch (caps->radio_if[i]) {
> case QMI_DMS_RADIO_IF_GSM:
> available_rats |= OFONO_RADIO_ACCESS_MODE_GSM;
> + rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_GSM;
> break;
> case QMI_DMS_RADIO_IF_UMTS:
> available_rats |= OFONO_RADIO_ACCESS_MODE_UMTS;
> + rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_UMTS;
> break;
> case QMI_DMS_RADIO_IF_LTE:
> available_rats |= OFONO_RADIO_ACCESS_MODE_LTE;
> + rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_LTE;
> break;
> }
> }
Wouldn't it be easier to simply do
rsd->rat_mode_any = available_rats?
> diff --git a/drivers/qmimodem/util.h b/drivers/qmimodem/util.h
> index 58bf4f98..14d4d865 100644
> --- a/drivers/qmimodem/util.h
> +++ b/drivers/qmimodem/util.h
> @@ -14,17 +14,20 @@ struct cb_data {
> int ref;
> };
>
> -static inline struct cb_data *cb_data_new(void *cb, void *data)
> +static inline struct cb_data *cb_data_init(struct cb_data *cbd, void *cb,
> + void *data)
> {
> - struct cb_data *ret;
> + cbd->cb = cb;
> + cbd->data = data;
> + cbd->user = NULL;
> + cbd->ref = 1;
>
> - ret = l_new(struct cb_data, 1);
> - ret->cb = cb;
> - ret->data = data;
> - ret->user = NULL;
> - ret->ref = 1;
> + return cbd;
> +}
>
> - return ret;
> +static inline struct cb_data *cb_data_new(void *cb, void *data)
> +{
> + return cb_data_init(l_new(struct cb_data, 1), cb, data);
> }
>
> static inline struct cb_data *cb_data_ref(struct cb_data *cbd)
You likely don't need any of this...
Regards,
-Denis
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] qmi: radio-settings: Do not unconditionally try to enable unsupported modes
2024-12-11 5:13 ` Denis Kenzior
@ 2024-12-11 13:54 ` Ivaylo Dimitrov
2024-12-11 15:16 ` [PATCH v2] " Ivaylo Dimitrov
1 sibling, 0 replies; 5+ messages in thread
From: Ivaylo Dimitrov @ 2024-12-11 13:54 UTC (permalink / raw)
To: Denis Kenzior, ofono; +Cc: absicsz, merlijn
Hi Denis,
On 11.12.24 г. 7:13 ч., Denis Kenzior wrote:
>
> This looks like copy-paste of get_caps_cb. Lets avoid that by invoking
> QMI_DMS_GET_CAPS during probe(). See below.
>
I was looking into doing it during probe, somehow missed
OFONO_ATOM_DRIVER_FLAG_REGISTER_ON_PROBE flag. Now I see.
...
+ if (rsd->rat_mode_any || !get_rat_mode_any(rs, mode, cb, user_data))
>
> So your intent here is to query the radio capabilities first if they
> haven't been queried before? If so, then the typical pattern is to do
> this during probe(), before calling ofono_radio_settings_register().
> See qmimodem/lte.c for an example.
>
Exactly(the intent), but will do it like in lte.c
...
>> available_rats = 0;
>> +
>> for (i = 0; i < caps->radio_if_count; i++) {
>> switch (caps->radio_if[i]) {
>> case QMI_DMS_RADIO_IF_GSM:
>> available_rats |= OFONO_RADIO_ACCESS_MODE_GSM;
>> + rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_GSM;
>> break;
>> case QMI_DMS_RADIO_IF_UMTS:
>> available_rats |= OFONO_RADIO_ACCESS_MODE_UMTS;
>> + rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_UMTS;
>> break;
>> case QMI_DMS_RADIO_IF_LTE:
>> available_rats |= OFONO_RADIO_ACCESS_MODE_LTE;
>> + rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_LTE;
>> break;
>> }
>> }
>
> Wouldn't it be easier to simply do
> rsd->rat_mode_any = available_rats?
>
No, because available_rats are of type OFONO_RADIO_ACCESS_TYPE_XXX,
while rat_mode_any is of type QMI_NAS_RAT_MODE_PREF_XXX
Will send v2 with the above issues fixed.
Regards,
Ivo
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2] qmi: radio-settings: Do not unconditionally try to enable unsupported modes
2024-12-11 5:13 ` Denis Kenzior
2024-12-11 13:54 ` Ivaylo Dimitrov
@ 2024-12-11 15:16 ` Ivaylo Dimitrov
2024-12-11 15:30 ` patchwork-bot+ofono
1 sibling, 1 reply; 5+ messages in thread
From: Ivaylo Dimitrov @ 2024-12-11 15:16 UTC (permalink / raw)
To: ofono; +Cc: denkenz, absicsz, merlijn, Ivaylo Dimitrov
At least the modem in Motorola Droid 4 errors out if anything else but GSM
and UMTS bits are set when selecting preferred mode. That happens if 'any'
mode is set.
Fix that by querying supported modes and passing only those for 'any' mode.
---
drivers/qmimodem/radio-settings.c | 111 +++++++++++++++++++++---------
1 file changed, 77 insertions(+), 34 deletions(-)
diff --git a/drivers/qmimodem/radio-settings.c b/drivers/qmimodem/radio-settings.c
index cf0b747e..0a1d5622 100644
--- a/drivers/qmimodem/radio-settings.c
+++ b/drivers/qmimodem/radio-settings.c
@@ -21,6 +21,7 @@
struct settings_data {
struct qmi_service *nas;
struct qmi_service *dms;
+ unsigned int rat_mode_any;
};
static void get_system_selection_pref_cb(struct qmi_result *result,
@@ -98,27 +99,22 @@ static void qmi_set_rat_mode(struct ofono_radio_settings *rs, unsigned int mode,
{
struct settings_data *data = ofono_radio_settings_get_data(rs);
struct cb_data *cbd = cb_data_new(cb, user_data);
- uint16_t pref = QMI_NAS_RAT_MODE_PREF_ANY;
+ uint16_t pref = 0;
struct qmi_param *param;
DBG("");
- switch (mode) {
- case OFONO_RADIO_ACCESS_MODE_ANY:
- pref = QMI_NAS_RAT_MODE_PREF_ANY;
- break;
- case OFONO_RADIO_ACCESS_MODE_GSM:
- pref = QMI_NAS_RAT_MODE_PREF_GSM;
- break;
- case OFONO_RADIO_ACCESS_MODE_UMTS:
- pref = QMI_NAS_RAT_MODE_PREF_UMTS;
- break;
- case OFONO_RADIO_ACCESS_MODE_LTE:
- pref = QMI_NAS_RAT_MODE_PREF_LTE;
- break;
- case OFONO_RADIO_ACCESS_MODE_LTE|OFONO_RADIO_ACCESS_MODE_GSM:
- pref = QMI_NAS_RAT_MODE_PREF_LTE|QMI_NAS_RAT_MODE_PREF_GSM;
- break;
+ if (mode == OFONO_RADIO_ACCESS_MODE_ANY)
+ pref = data->rat_mode_any;
+ else {
+ if (mode & OFONO_RADIO_ACCESS_MODE_GSM)
+ pref |= QMI_NAS_RAT_MODE_PREF_GSM;
+
+ if (mode & OFONO_RADIO_ACCESS_MODE_UMTS)
+ pref |= QMI_NAS_RAT_MODE_PREF_UMTS;
+
+ if (mode & OFONO_RADIO_ACCESS_MODE_LTE)
+ pref |= QMI_NAS_RAT_MODE_PREF_LTE;
}
param = qmi_param_new();
@@ -136,40 +132,53 @@ static void qmi_set_rat_mode(struct ofono_radio_settings *rs, unsigned int mode,
l_free(cbd);
}
-static void get_caps_cb(struct qmi_result *result, void *user_data)
+static unsigned int _update_available_rats(struct settings_data *rsd,
+ const struct qmi_dms_device_caps *caps)
{
- struct cb_data *cbd = user_data;
- ofono_radio_settings_available_rats_query_cb_t cb = cbd->cb;
- const struct qmi_dms_device_caps *caps;
- unsigned int available_rats;
- uint16_t len;
+ unsigned int available_rats = 0;
uint8_t i;
- DBG("");
-
- if (qmi_result_set_error(result, NULL))
- goto error;
+ rsd->rat_mode_any = 0;
- caps = qmi_result_get(result, QMI_DMS_RESULT_DEVICE_CAPS, &len);
- if (!caps)
- goto error;
-
- available_rats = 0;
for (i = 0; i < caps->radio_if_count; i++) {
switch (caps->radio_if[i]) {
case QMI_DMS_RADIO_IF_GSM:
available_rats |= OFONO_RADIO_ACCESS_MODE_GSM;
+ rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_GSM;
break;
case QMI_DMS_RADIO_IF_UMTS:
+ rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_UMTS;
available_rats |= OFONO_RADIO_ACCESS_MODE_UMTS;
break;
case QMI_DMS_RADIO_IF_LTE:
available_rats |= OFONO_RADIO_ACCESS_MODE_LTE;
+ rsd->rat_mode_any |= QMI_NAS_RAT_MODE_PREF_LTE;
break;
}
}
- CALLBACK_WITH_SUCCESS(cb, available_rats, cbd->data);
+ return available_rats;
+}
+
+static void get_caps_cb(struct qmi_result *result, void *user_data)
+{
+ struct cb_data *cbd = user_data;
+ struct ofono_radio_settings *rs = cbd->user;
+ struct settings_data *rsd = ofono_radio_settings_get_data(rs);
+ ofono_radio_settings_available_rats_query_cb_t cb = cbd->cb;
+ const struct qmi_dms_device_caps *caps;
+ uint16_t len;
+
+ DBG("");
+
+ if (qmi_result_set_error(result, NULL))
+ goto error;
+
+ caps = qmi_result_get(result, QMI_DMS_RESULT_DEVICE_CAPS, &len);
+ if (!caps)
+ goto error;
+
+ CALLBACK_WITH_SUCCESS(cb, _update_available_rats(rsd, caps), cbd->data);
return;
@@ -187,6 +196,8 @@ static void qmi_query_available_rats(struct ofono_radio_settings *rs,
if (!rsd->dms)
goto error;
+ cbd->user = rs;
+
if (qmi_service_send(rsd->dms, QMI_DMS_GET_CAPS, NULL,
get_caps_cb, cbd, l_free) > 0)
return;
@@ -196,6 +207,32 @@ error:
CALLBACK_WITH_FAILURE(cb, -1, data);
}
+static void get_rat_mode_any_cb(struct qmi_result *result, void *user_data)
+{
+ struct ofono_radio_settings *rs = user_data;
+ struct settings_data *rsd = ofono_radio_settings_get_data(rs);
+ const struct qmi_dms_device_caps *caps;
+ uint16_t len;
+
+ DBG("");
+
+ if (qmi_result_set_error(result, NULL))
+ goto error;
+
+ caps = qmi_result_get(result, QMI_DMS_RESULT_DEVICE_CAPS, &len);
+ if (!caps)
+ goto error;
+
+ _update_available_rats(rsd, caps);
+ ofono_radio_settings_register(rs);
+
+ return;
+
+error:
+ ofono_error("Failed to get RAT modes");
+ ofono_radio_settings_remove(rs);
+}
+
static int qmi_radio_settings_probev(struct ofono_radio_settings *rs,
unsigned int vendor, va_list args)
{
@@ -205,6 +242,13 @@ static int qmi_radio_settings_probev(struct ofono_radio_settings *rs,
DBG("");
+ if (!qmi_service_send(dms, QMI_DMS_GET_CAPS, NULL,
+ get_rat_mode_any_cb, rs, NULL)) {
+ qmi_service_free(dms);
+ qmi_service_free(nas);
+ return -EIO;
+ }
+
data = l_new(struct settings_data, 1);
data->dms = dms;
data->nas = nas;
@@ -229,7 +273,6 @@ static void qmi_radio_settings_remove(struct ofono_radio_settings *rs)
}
static const struct ofono_radio_settings_driver driver = {
- .flags = OFONO_ATOM_DRIVER_FLAG_REGISTER_ON_PROBE,
.probev = qmi_radio_settings_probev,
.remove = qmi_radio_settings_remove,
.set_rat_mode = qmi_set_rat_mode,
--
2.25.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2] qmi: radio-settings: Do not unconditionally try to enable unsupported modes
2024-12-11 15:16 ` [PATCH v2] " Ivaylo Dimitrov
@ 2024-12-11 15:30 ` patchwork-bot+ofono
0 siblings, 0 replies; 5+ messages in thread
From: patchwork-bot+ofono @ 2024-12-11 15:30 UTC (permalink / raw)
To: Ivaylo Dimitrov; +Cc: ofono, denkenz, absicsz, merlijn
Hello:
This patch was applied to ofono.git (master)
by Denis Kenzior <denkenz@gmail.com>:
On Wed, 11 Dec 2024 17:16:33 +0200 you wrote:
> At least the modem in Motorola Droid 4 errors out if anything else but GSM
> and UMTS bits are set when selecting preferred mode. That happens if 'any'
> mode is set.
>
> Fix that by querying supported modes and passing only those for 'any' mode.
> ---
> drivers/qmimodem/radio-settings.c | 111 +++++++++++++++++++++---------
> 1 file changed, 77 insertions(+), 34 deletions(-)
Here is the summary with links:
- [v2] qmi: radio-settings: Do not unconditionally try to enable unsupported modes
https://git.kernel.org/pub/scm/network/ofono/ofono.git/?id=b1f810f218a5
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-12-11 15:30 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-07 17:20 [PATCH] qmi: radio-settings: Do not unconditionally try to enable unsupported modes Ivaylo Dimitrov
2024-12-11 5:13 ` Denis Kenzior
2024-12-11 13:54 ` Ivaylo Dimitrov
2024-12-11 15:16 ` [PATCH v2] " Ivaylo Dimitrov
2024-12-11 15:30 ` patchwork-bot+ofono
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.