diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-02-07 11:53:13 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-02-24 20:47:57 +0100 |
commit | 1b35d74c157417e40877535eec757e5cd725564f (patch) | |
tree | e9e26fb80e9d7f3141d017dd84b6e41a7a4783f5 | |
parent | cc07d21410d707a3e3cf16c3fa187562dcdea58b (diff) |
kernel-device: add get_interface_number() method
We already have methods to query for interface specific attributes
like class/subclass/protocol, so add a new one for the interface
number, and make sure we use ATTRS{bInterfaceNumber} to load it
always, instead of assuming the ID_USB_INTERFACE_NUM property is set.
-rw-r--r-- | plugins/cinterion/mm-broadband-bearer-cinterion.c | 2 | ||||
-rw-r--r-- | plugins/huawei/mm-plugin-huawei.c | 22 | ||||
-rw-r--r-- | plugins/option/mm-plugin-option.c | 4 | ||||
-rw-r--r-- | plugins/telit/mm-common-telit.c | 6 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device-generic.c | 7 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device-udev.c | 10 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device.c | 8 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device.h | 2 |
8 files changed, 42 insertions, 19 deletions
diff --git a/plugins/cinterion/mm-broadband-bearer-cinterion.c b/plugins/cinterion/mm-broadband-bearer-cinterion.c index 464e75e9..4c59d567 100644 --- a/plugins/cinterion/mm-broadband-bearer-cinterion.c +++ b/plugins/cinterion/mm-broadband-bearer-cinterion.c @@ -63,7 +63,7 @@ get_usb_interface_config_index (MMPort *data, guint usb_iface_num; guint i; - usb_iface_num = mm_kernel_device_get_property_as_int_hex (mm_port_peek_kernel_device (data), "ID_USB_INTERFACE_NUM"); + usb_iface_num = (guint) mm_kernel_device_get_interface_number (mm_port_peek_kernel_device (data)); for (i = 0; i < G_N_ELEMENTS (usb_interface_configs); i++) { if (usb_interface_configs[i].usb_iface_num == usb_iface_num) diff --git a/plugins/huawei/mm-plugin-huawei.c b/plugins/huawei/mm-plugin-huawei.c index 4c5c39ed..07652ec7 100644 --- a/plugins/huawei/mm-plugin-huawei.c +++ b/plugins/huawei/mm-plugin-huawei.c @@ -56,7 +56,7 @@ MM_PLUGIN_DEFINE_MINOR_VERSION typedef struct { MMPortProbe *probe; - guint first_usbif; + gint first_usbif; guint timeout_id; gboolean custom_init_run; } FirstInterfaceContext; @@ -177,23 +177,23 @@ try_next_usbif (MMPortProbe *probe, MMDevice *device) { FirstInterfaceContext *fi_ctx; - GList *l; - guint closest; + GList *l; + gint closest; fi_ctx = g_object_get_data (G_OBJECT (device), TAG_FIRST_INTERFACE_CONTEXT); g_assert (fi_ctx != NULL); /* Look for the next closest one among the list of interfaces in the device, * and enable that one as being first */ - closest = G_MAXUINT; + closest = G_MAXINT; for (l = mm_device_peek_port_probe_list (device); l; l = g_list_next (l)) { MMPortProbe *iter = MM_PORT_PROBE (l->data); /* Only expect ttys for next probing attempt */ if (g_str_equal (mm_port_probe_get_port_subsys (iter), "tty")) { - guint usbif; + gint usbif; - usbif = mm_kernel_device_get_property_as_int_hex (mm_port_probe_peek_port (iter), "ID_USB_INTERFACE_NUM"); + usbif = mm_kernel_device_get_interface_number (mm_port_probe_peek_port (iter)); if (usbif == fi_ctx->first_usbif) { /* This is the one we just probed, which wasn't yet removed, so just skip it */ } else if (usbif > fi_ctx->first_usbif && @@ -203,7 +203,7 @@ try_next_usbif (MMPortProbe *probe, } } - if (closest == G_MAXUINT) { + if (closest == G_MAXINT) { /* No more ttys to try! Just return something */ closest = 0; mm_obj_dbg (probe, "no more ports to run initial probing"); @@ -359,9 +359,7 @@ huawei_custom_init (MMPortProbe *probe, g_task_set_task_data (task, ctx, (GDestroyNotify)huawei_custom_init_context_free); /* Custom init only to be run in the first interface */ - if (mm_kernel_device_get_property_as_int_hex (mm_port_probe_peek_port (probe), - "ID_USB_INTERFACE_NUM") != fi_ctx->first_usbif) { - + if (mm_kernel_device_get_interface_number (mm_port_probe_peek_port (probe)) != fi_ctx->first_usbif) { if (fi_ctx->custom_init_run) /* If custom init was run already, we can consider this as successfully run */ g_task_return_boolean (task, TRUE); @@ -391,8 +389,8 @@ static gint probe_cmp_by_usbif (MMPortProbe *a, MMPortProbe *b) { - return ((gint) mm_kernel_device_get_property_as_int_hex (mm_port_probe_peek_port (a), "ID_USB_INTERFACE_NUM") - - (gint) mm_kernel_device_get_property_as_int_hex (mm_port_probe_peek_port (b), "ID_USB_INTERFACE_NUM")); + return (mm_kernel_device_get_interface_number (mm_port_probe_peek_port (a)) - + mm_kernel_device_get_interface_number (mm_port_probe_peek_port (b))); } static guint diff --git a/plugins/option/mm-plugin-option.c b/plugins/option/mm-plugin-option.c index 3ba183ec..1f72325c 100644 --- a/plugins/option/mm-plugin-option.c +++ b/plugins/option/mm-plugin-option.c @@ -56,7 +56,7 @@ grab_port (MMPlugin *self, { MMPortSerialAtFlag pflags = MM_PORT_SERIAL_AT_FLAG_NONE; MMKernelDevice *port; - guint usbif; + gint usbif; /* The Option plugin cannot do anything with non-AT ports */ if (!mm_port_probe_is_at (probe)) { @@ -73,7 +73,7 @@ grab_port (MMPlugin *self, * the modem/data port, per mail with Option engineers. Only this port * will emit responses to dialing commands. */ - usbif = mm_kernel_device_get_property_as_int_hex (port, "ID_USB_INTERFACE_NUM"); + usbif = mm_kernel_device_get_interface_number (port); if (usbif == 0) pflags = MM_PORT_SERIAL_AT_FLAG_PRIMARY | MM_PORT_SERIAL_AT_FLAG_PPP; diff --git a/plugins/telit/mm-common-telit.c b/plugins/telit/mm-common-telit.c index f53f5b75..2e0b3801 100644 --- a/plugins/telit/mm-common-telit.c +++ b/plugins/telit/mm-common-telit.c @@ -59,7 +59,7 @@ telit_grab_port (MMPlugin *self, if (g_object_get_data (G_OBJECT (device), TAG_GETPORTCFG_SUPPORTED) != NULL) { guint usbif; - usbif = mm_kernel_device_get_property_as_int_hex (port, "ID_USB_INTERFACE_NUM"); + usbif = (guint) mm_kernel_device_get_interface_number (port); if (usbif == GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (device), TAG_TELIT_MODEM_PORT))) { mm_obj_dbg (self, "AT port '%s/%s' flagged as primary", mm_port_probe_get_port_subsys (probe), @@ -257,9 +257,7 @@ telit_custom_init_step (GTask *task) * is always linked to an AT port */ port = mm_port_probe_peek_port (probe); - if (!ctx->getportcfg_done && - g_strcmp0 (mm_kernel_device_get_property (port, "ID_USB_INTERFACE_NUM"), "00") == 0) { - + if (!ctx->getportcfg_done && mm_kernel_device_get_interface_number (port) == 0) { if (ctx->getportcfg_retries == 0) goto out; ctx->getportcfg_retries--; diff --git a/src/kerneldevice/mm-kernel-device-generic.c b/src/kerneldevice/mm-kernel-device-generic.c index b1a3bf97..d6798c6f 100644 --- a/src/kerneldevice/mm-kernel-device-generic.c +++ b/src/kerneldevice/mm-kernel-device-generic.c @@ -551,6 +551,12 @@ kernel_device_get_sysfs_path (MMKernelDevice *self) } static gint +kernel_device_get_interface_number (MMKernelDevice *self) +{ + return (gint) MM_KERNEL_DEVICE_GENERIC (self)->priv->interface_number; +} + +static gint kernel_device_get_interface_class (MMKernelDevice *self) { return (gint) MM_KERNEL_DEVICE_GENERIC (self)->priv->interface_class; @@ -1172,6 +1178,7 @@ mm_kernel_device_generic_class_init (MMKernelDeviceGenericClass *klass) kernel_device_class->get_physdev_subsystem = kernel_device_get_physdev_subsystem; kernel_device_class->get_physdev_manufacturer = kernel_device_get_physdev_manufacturer; kernel_device_class->get_physdev_product = kernel_device_get_physdev_product; + kernel_device_class->get_interface_number = kernel_device_get_interface_number; kernel_device_class->get_interface_class = kernel_device_get_interface_class; kernel_device_class->get_interface_subclass = kernel_device_get_interface_subclass; kernel_device_class->get_interface_protocol = kernel_device_get_interface_protocol; diff --git a/src/kerneldevice/mm-kernel-device-udev.c b/src/kerneldevice/mm-kernel-device-udev.c index f75104bd..237d7201 100644 --- a/src/kerneldevice/mm-kernel-device-udev.c +++ b/src/kerneldevice/mm-kernel-device-udev.c @@ -403,6 +403,15 @@ kernel_device_get_physdev_product (MMKernelDevice *_self) } static gint +kernel_device_get_interface_number (MMKernelDevice *_self) +{ + MMKernelDeviceUdev *self; + + self = MM_KERNEL_DEVICE_UDEV (_self); + return (self->priv->interface ? (gint) udev_device_get_sysfs_attr_as_hex (self->priv->interface, "bInterfaceNumber") : -1); +} + +static gint kernel_device_get_interface_class (MMKernelDevice *_self) { MMKernelDeviceUdev *self; @@ -743,6 +752,7 @@ mm_kernel_device_udev_class_init (MMKernelDeviceUdevClass *klass) kernel_device_class->get_physdev_subsystem = kernel_device_get_physdev_subsystem; kernel_device_class->get_physdev_manufacturer = kernel_device_get_physdev_manufacturer; kernel_device_class->get_physdev_product = kernel_device_get_physdev_product; + kernel_device_class->get_interface_number = kernel_device_get_interface_number; kernel_device_class->get_interface_class = kernel_device_get_interface_class; kernel_device_class->get_interface_subclass = kernel_device_get_interface_subclass; kernel_device_class->get_interface_protocol = kernel_device_get_interface_protocol; diff --git a/src/kerneldevice/mm-kernel-device.c b/src/kerneldevice/mm-kernel-device.c index 464a3800..86251bcd 100644 --- a/src/kerneldevice/mm-kernel-device.c +++ b/src/kerneldevice/mm-kernel-device.c @@ -126,6 +126,14 @@ mm_kernel_device_get_physdev_product (MMKernelDevice *self) } gint +mm_kernel_device_get_interface_number (MMKernelDevice *self) +{ + return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_number ? + MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_number (self) : + -1); +} + +gint mm_kernel_device_get_interface_class (MMKernelDevice *self) { return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_class ? diff --git a/src/kerneldevice/mm-kernel-device.h b/src/kerneldevice/mm-kernel-device.h index 45b270d5..f1d869be 100644 --- a/src/kerneldevice/mm-kernel-device.h +++ b/src/kerneldevice/mm-kernel-device.h @@ -41,6 +41,7 @@ struct _MMKernelDeviceClass { const gchar * (* get_driver) (MMKernelDevice *self); const gchar * (* get_sysfs_path) (MMKernelDevice *self); + gint (* get_interface_number) (MMKernelDevice *self); gint (* get_interface_class) (MMKernelDevice *self); gint (* get_interface_subclass) (MMKernelDevice *self); gint (* get_interface_protocol) (MMKernelDevice *self); @@ -74,6 +75,7 @@ const gchar *mm_kernel_device_get_name (MMKernelDevice *self); const gchar *mm_kernel_device_get_driver (MMKernelDevice *self); const gchar *mm_kernel_device_get_sysfs_path (MMKernelDevice *self); +gint mm_kernel_device_get_interface_number (MMKernelDevice *self); gint mm_kernel_device_get_interface_class (MMKernelDevice *self); gint mm_kernel_device_get_interface_subclass (MMKernelDevice *self); gint mm_kernel_device_get_interface_protocol (MMKernelDevice *self); |