diff options
author | Franko Fang <fangxiaozhi@huawei.com> | 2013-04-03 13:11:56 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-04-03 13:35:05 +0200 |
commit | 41e706b241b6c1600f3351f95a70c28695bac0ba (patch) | |
tree | b3d427d7e4b61e40d00acf8b6b61004345bc4c67 | |
parent | 8400870b3ef87a094adbcada1c0fd6aa067b7595 (diff) |
huawei: flag modems which support NDISDUP
-rw-r--r-- | plugins/Makefile.am | 1 | ||||
-rw-r--r-- | plugins/huawei/77-mm-huawei_net_port_types.rules | 10 | ||||
-rw-r--r-- | plugins/huawei/mm-broadband-modem-huawei.c | 55 |
3 files changed, 31 insertions, 35 deletions
diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 2d52359e..0abc8b00 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -105,6 +105,7 @@ libmm_plugin_huawei_la_SOURCES = \ libmm_plugin_huawei_la_CPPFLAGS = $(PLUGIN_COMMON_COMPILER_FLAGS) libmm_plugin_huawei_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS) +udevrules_DATA += huawei/77-mm-huawei_net_port_types.rules # MBM libmm_plugin_mbm_la_SOURCES = \ diff --git a/plugins/huawei/77-mm-huawei_net_port_types.rules b/plugins/huawei/77-mm-huawei_net_port_types.rules new file mode 100644 index 00000000..0a60510d --- /dev/null +++ b/plugins/huawei/77-mm-huawei_net_port_types.rules @@ -0,0 +1,10 @@ +# do not edit this file, it will be overwritten on update +ACTION!="add|change", GOTO="mm_huawei_port_types_end" + +ENV{ID_VENDOR_ID}!="12d1", GOTO="mm_huawei_port_types_end" + +# Only the standard ECM or NCM port can support dial-up with AT NDISDUP through AT port +SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="02", ATTRS{bInterfaceSubClass}=="06",ATTRS{bInterfaceProtocol}=="00", ENV{ID_MM_HUAWEI_NDISDUP_SUPPORTED}="1" +SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="02", ATTRS{bInterfaceSubClass}=="0d",ATTRS{bInterfaceProtocol}=="00", ENV{ID_MM_HUAWEI_NDISDUP_SUPPORTED}="1" + +LABEL="mm_huawei_port_types_end" diff --git a/plugins/huawei/mm-broadband-modem-huawei.c b/plugins/huawei/mm-broadband-modem-huawei.c index c1a29b3e..905e41e3 100644 --- a/plugins/huawei/mm-broadband-modem-huawei.c +++ b/plugins/huawei/mm-broadband-modem-huawei.c @@ -25,6 +25,7 @@ #include <unistd.h> #include <ctype.h> #include <time.h> +#include <gudev/gudev.h> #include <ModemManager.h> #define _LIBMM_INSIDE_MM @@ -1339,18 +1340,6 @@ create_bearer_for_net_port (CreateBearerContext *ctx) } } -static void -ndisdup_check_ready (MMIfaceModem *self, - GAsyncResult *res, - CreateBearerContext *ctx) -{ - if (!mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, NULL)) - ctx->self->priv->ndisdup_support = NDISDUP_NOT_SUPPORTED; - else - ctx->self->priv->ndisdup_support = NDISDUP_SUPPORTED; - - create_bearer_for_net_port (ctx); -} static void huawei_modem_create_bearer (MMIfaceModem *self, @@ -1359,6 +1348,7 @@ huawei_modem_create_bearer (MMIfaceModem *self, gpointer user_data) { CreateBearerContext *ctx; + MMPort *port; ctx = g_slice_new0 (CreateBearerContext); ctx->self = g_object_ref (self); @@ -1368,30 +1358,25 @@ huawei_modem_create_bearer (MMIfaceModem *self, user_data, huawei_modem_create_bearer); - if (mm_base_modem_peek_best_data_port (MM_BASE_MODEM (self), MM_PORT_TYPE_NET)) { - /* If we get a 'net' port, check if driver is 'cdc_ether' or 'cdc_ncm' */ - const gchar **drivers; - guint i; - - drivers = mm_base_modem_get_drivers (MM_BASE_MODEM (self)); - for (i = 0; drivers[i]; i++) { - if (g_str_equal (drivers[i], "cdc_ether") || g_str_equal (drivers[i], "cdc_ncm")) { - /* If never checked yet, check NDISDUP support */ - if (ctx->self->priv->ndisdup_support == NDISDUP_SUPPORT_UNKNOWN) { - mm_dbg ("Checking ^NDISDUP support..."); - mm_base_modem_at_command (MM_BASE_MODEM (self), - "^NDISDUP?", - 3, - FALSE, - (GAsyncReadyCallback)ndisdup_check_ready, - ctx); - } else { - /* Already checked, create bearer */ - create_bearer_for_net_port (ctx); - } - return; - } + port = mm_base_modem_peek_best_data_port (MM_BASE_MODEM (self), MM_PORT_TYPE_NET); + if (port) { + GUdevDevice *net_port; + GUdevClient *client; + + client = g_udev_client_new (NULL); + net_port = (g_udev_client_query_by_subsystem_and_name ( + client, + "net", + mm_port_get_device (port))); + if (g_udev_device_get_property_as_boolean (net_port, "ID_MM_HUAWEI_NDISDUP_SUPPORTED")) { + mm_dbg ("This device can support ndisdup feature"); + ctx->self->priv->ndisdup_support = NDISDUP_SUPPORTED; + } else { + mm_dbg ("This device can not support ndisdup feature"); + ctx->self->priv->ndisdup_support = NDISDUP_NOT_SUPPORTED; } + create_bearer_for_net_port (ctx); + return; } mm_dbg ("Creating default bearer..."); |