Re: [PATCH v7 03/10] mbimmodem: add support for MBIM extensions

Andres Salomon <[email protected]> Fri, 12 Dec 2025 02:32:36 -0500
Newsgroups dev.linux.lists.ofono
Message-ID <[email protected]>
On 11/28/25 12:36, Muhammad Asif wrote:
> With MBIMEx 3.0, arguments for activating GPRS changed. Update as
> needed.
> ---
>   drivers/mbimmodem/gprs-context.c | 64 +++++++++++++++++++++++++-------
>   drivers/mbimmodem/mbim.c         | 13 +++++++
>   drivers/mbimmodem/mbim.h         |  6 +++
>   drivers/mbimmodem/mbimmodem.h    |  1 +
>   drivers/mbimmodem/sim.c          | 31 +++++++++++++---
>   drivers/mbimmodem/util.c         |  1 -
>   plugins/mbim.c                   | 39 +++++++++++++++++++
>   7 files changed, 134 insertions(+), 21 deletions(-)
> 
[...]
> @@ -281,6 +281,29 @@ error:
>   	mbim_device_shutdown(md->device);
>   }
>   
> +static void mbim_device_mbimex_version_cb(struct mbim_message *message,
> +								void *user)
> +{
> +	struct ofono_modem *modem = user;
> +	uint16_t mbim_version, mbimex_version;
> +
> +	if (mbim_message_get_error(message) != 0) {
> +		/* Fallback to MBIM 1.0 with no extensions */
> +		mbim_version = (1 << 8) | 0;
> +		mbimex_version = (0 << 8) | 0;
> +		goto version_set;
> +	}
> +
> +	mbim_message_get_arguments(message, "qq",
> +		&mbim_version, &mbimex_version);

mbim_message_get_arguments() can fail, and the return value should be 
checked here; I'd rework it to something like this:

if (mbim_message_get_error(message) != 0 ||
!mbim_message_get_arguments(message, "qq", &mbim_version, 
&mbimex_version)) {
	/* fallback to MBIM 1.0 with no extensions */
	mbim_version = ...
	mbimex_version = ...
}

ofono_modem_set_integer(...);

> +
> +version_set:
> +	ofono_modem_set_integer(modem, "MBIMVersion",
> +		mbim_version);
> +	ofono_modem_set_integer(modem, "MBIMExVersion",
> +		mbimex_version);
> +}
> +
>   static void mbim_device_closed(void *user_data)
>   {
>   	struct ofono_modem *modem = user_data;
> @@ -298,6 +321,22 @@ static void mbim_device_ready(void *user_data)
>   	struct mbim_data *md = ofono_modem_get_data(modem);
>   	struct mbim_message *message;
>   
> +	/* Version is formatted as (major version) << 8 | (minor version) */
> +	static const uint16_t mbim_version = (1 << 8) | 0;
> +
> +	/* Always open with MBIMEx 3, devices not supporting it will fallback to MBIMEx 2 */
> +	static const uint16_t mbimex_version = (3 << 8) | 0;
> +
> +	message = mbim_message_new(mbim_ms_basic_connect_extensions,
> +					MBIM_CID_MS_BASIC_CONNECT_EXTENSIONS_VERSION,
> +					MBIM_COMMAND_TYPE_QUERY);
> +	mbim_message_set_arguments(message, "qq",
> +					mbim_version,
> +					mbimex_version);
> +
> +	mbim_device_send(md->device, 0, message,
> +				mbim_device_mbimex_version_cb, modem, NULL);
> +
>   	message = mbim_message_new(mbim_uuid_basic_connect,
>   					MBIM_CID_DEVICE_CAPS,
>   					MBIM_COMMAND_TYPE_QUERY);