Re: [PATCH v4 2/6] mbimmodem: add support for MBIM extensions * With MBIMEx 3.0, arguments for activating GPRS changed. Update as needed.

Muhammad <[email protected]> Tue, 6 May 2025 16:15:45 +0500
Newsgroups dev.linux.lists.ofono
Message-ID <[email protected]>
Hi Denis,

On 5/5/25 21:06, Denis Kenzior wrote:
>> @@ -253,6 +258,11 @@ struct mbim_device {
>>       struct message_assembly *assembly;
>>       struct l_idle *close_io;
>>   +    uint8_t mbim_version_major;
>> +    uint8_t mbim_version_minor;
>> +    uint8_t mbimex_version_major;
>> +    uint8_t mbimex_version_minor;
>> +
>
> In the current design, mbim_device doesn't really manage such state.  
> This belongs in plugins/mbim.c instead.
I will move this to the plugins part.
>>       bool is_ready : 1;
>>       bool in_notify : 1;
>>   };
>> @@ -875,6 +885,22 @@ static bool close_read_handler(struct l_io *io, 
>> void *user_data)
>>       return true;
>>   }
>>   +static void parse_mbim_version(struct mbim_message *message, void 
>> *user_data)
>> +{
>> +    struct mbim_device *device = user_data;
>> +    uint16_t mbim_version = 0, mbimex_version = 0;
>> +
>> +    if (mbim_message_get_error(message) != 0)
>> +        return;
>> +
>> +    mbim_message_get_arguments(message, "qq", &mbim_version, 
>> &mbimex_version);
>> +
>> +    device->mbim_version_major = mbim_version >> 8;
>> +    device->mbim_version_minor = mbim_version & 0xFF;
>> +    device->mbimex_version_major = mbimex_version >> 8;
>> +    device->mbimex_version_minor = mbimex_version & 0xFF;
>> +}
>> +
>
> The version should be obtained similar to how capabilities are obtained.
>
>>   struct mbim_device *mbim_device_new(int fd, uint32_t max_segment_size)
>>   {
>>       struct mbim_device *device;
>> @@ -1035,6 +1061,35 @@ bool mbim_device_set_ready_handler(struct 
>> mbim_device *device,
>>       return true;
>>   }
>>   +void mbim_device_get_version(struct mbim_device *device)
>> +{
>> +    // Version is formatted as (major version) << 8 | (minor version)
>> +    const int mbim_version = 1 << 8 | 0;
>
> nit: static const?
>
>> +
>> +    // Always open with MBIMEx 3, devices not supporting it will 
>> fallback to MBIMEx 2
>> +    const int mbimex_version = 3 << 8 | 0;
>
> nit: ditto, also please use C style comments
>
>> +
>> +    struct mbim_message *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);
>> +
>> +    // For some reason, sending a message will return an error code, 
>> even if valid
>> +    mbim_device_send(device, 0, message,
>> +                        parse_mbim_version, device, NULL);
>
> Hmm, this is suspicious.  mbim_device_send should never fail, unless 
> the device isn't open.
>
>> +}
>> +
>> +bool mbim_device_check_mbimex_version(struct mbim_device *device,
>> +                    int version_major, int version_minor)
>
> The naming needs some work?  Perhaps 
> mbim_device_mbimex_version_at_least()? However, since mbim_device 
> doesn't really manage this part, consider using a modem property 
> instead?  Or pass the mbimex version to the atom driver directly.  See 
> for example how QMI drivers do this with the new 'probev' driver method.
>
>> +{
>> +    return (device->mbimex_version_major > version_major) ||
>> +            ((device->mbimex_version_major == version_major) &&
>> +            (device->mbimex_version_minor >= version_minor));
>> +}
>> +
>>   uint32_t mbim_device_send(struct mbim_device *device, uint32_t gid,
>>                   struct mbim_message *message,
>>                   mbim_device_reply_func_t function,

I will move the version into a modem property.

- Muhammad