diff options
author | Dan Williams <dcbw@redhat.com> | 2012-02-01 01:43:54 -0600 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2012-02-28 10:06:04 -0600 |
commit | 4dad94d5004f325e25dc3b09d87585eab38d4c3f (patch) | |
tree | 38a5bb148952c333e18bfbd959e27573ab3364d9 /plugins | |
parent | 36ee1b9c76a681b44516852372944b82c7616892 (diff) |
core: rework port grabbing and organization
Make port roles more flexible. We have modems that do PPP
on interfaces other than the primary interface, and that
wasn't possible with the old code. So clean up all that
logic and move the port organization code into the core
so we can reduce code in the plugins.
In the new world order, the plugins say whether the port
is a QCDM port, an AT port, or ignored. If it's an AT
port the plugins get to tag it as primary, secondary, or
PPP, or any combination of the 3. This allows for modems
where PPP should really be done on the secondary port
(Huawei E220, Sierra devices) so that the primary port
stays open for command and status.
Modem subclasses no longer get asked to handle port grabbing
themselves. Instead, that's now done by the generic classes
(MMGenericCdma and MMGenericGsm) and the plugins are notified
when a port is grabbed so they can add unsolicited response
handlers for it. After all ports are grabbed by the generic
classes, they get "organized", which assigns various ports
to the roles of PRIMARY, SECONDARY, DATA, and QCDM based
on specific rules and hints that the plugin provided (which
are expressed as MMAtPortFlags). The plugins then have
a chance to perform fixups on the primary port if they choose.
The plugin code is responsible for determining the port
hints (ie MMAtPortFlags) at probe time, instead of having
a combination of the plugin and the modem class do the
job. This simplifies things greatly for the plugins at
the expense of more complicated logic in the core.
Diffstat (limited to 'plugins')
37 files changed, 458 insertions, 696 deletions
diff --git a/plugins/mm-modem-anydata-cdma.c b/plugins/mm-modem-anydata-cdma.c index d26d3ec0..5f2277fb 100644 --- a/plugins/mm-modem-anydata-cdma.c +++ b/plugins/mm-modem-anydata-cdma.c @@ -307,19 +307,15 @@ reset (MMModem *modem, mm_callback_info_schedule (info); } -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) +static void +port_grabbed (MMGenericCdma *cdma, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) { - MMPort *port = NULL; GRegex *regex; - port = mm_generic_cdma_grab_port (MM_GENERIC_CDMA (modem), subsys, name, suggested_type, user_data, error); - if (port && MM_IS_AT_SERIAL_PORT (port)) { + if (MM_IS_AT_SERIAL_PORT (port)) { /* Data state notifications */ /* Data call has connected */ @@ -337,7 +333,7 @@ grab_port (MMModem *modem, mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL); g_regex_unref (regex); - /* Abnomral state notifications + /* Abnormal state notifications * * FIXME: set 1X/EVDO registration state to UNKNOWN when these * notifications are received? @@ -358,8 +354,6 @@ grab_port (MMModem *modem, mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL); g_regex_unref (regex); } - - return !!port; } /*****************************************************************************/ @@ -367,7 +361,6 @@ grab_port (MMModem *modem, static void modem_init (MMModem *modem_class) { - modem_class->grab_port = grab_port; modem_class->reset = reset; } @@ -384,6 +377,7 @@ mm_modem_anydata_cdma_class_init (MMModemAnydataCdmaClass *klass) mm_modem_anydata_cdma_parent_class = g_type_class_peek_parent (klass); cdma_class->query_registration_state = query_registration_state; + cdma_class->port_grabbed = port_grabbed; #if 0 /* FIXME: maybe use AT*SLEEP=0/1 to disable/enable slotted mode for powersave */ diff --git a/plugins/mm-modem-cinterion-gsm.c b/plugins/mm-modem-cinterion-gsm.c index 97afb9f5..9220539f 100644 --- a/plugins/mm-modem-cinterion-gsm.c +++ b/plugins/mm-modem-cinterion-gsm.c @@ -28,11 +28,9 @@ #include "mm-serial-parsers.h" #include "mm-log.h" -static void modem_init (MMModem *modem_class); static void modem_gsm_network_init (MMModemGsmNetwork *gsm_network_class); G_DEFINE_TYPE_EXTENDED (MMModemCinterionGsm, mm_modem_cinterion_gsm, MM_TYPE_GENERIC_GSM, 0, - G_IMPLEMENT_INTERFACE (MM_TYPE_MODEM, modem_init) G_IMPLEMENT_INTERFACE (MM_TYPE_MODEM_GSM_NETWORK, modem_gsm_network_init)) /* Mask of all bands supported in 2G devices */ @@ -138,35 +136,16 @@ mm_modem_cinterion_gsm_new (const char *device, NULL)); } -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) { - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - MMPort *port = NULL; - - if (suggested_type == MM_PORT_TYPE_UNKNOWN) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } else - ptype = suggested_type; - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - if (port && MM_IS_AT_SERIAL_PORT (port)) { + if (MM_IS_AT_SERIAL_PORT (port)) { /* Set RTS/CTS flow control by default */ - g_object_set (G_OBJECT (port), - MM_SERIAL_PORT_RTS_CTS, TRUE, - NULL); + g_object_set (G_OBJECT (port), MM_SERIAL_PORT_RTS_CTS, TRUE, NULL); } - - return !!port; } static void @@ -1080,12 +1059,6 @@ finalize (GObject *object) /*****************************************************************************/ static void -modem_init (MMModem *modem_class) -{ - modem_class->grab_port = grab_port; -} - -static void modem_gsm_network_init (MMModemGsmNetwork *network_class) { network_class->set_band = set_band; @@ -1118,6 +1091,7 @@ mm_modem_cinterion_gsm_class_init (MMModemCinterionGsmClass *klass) object_class->finalize = finalize; object_class->get_property = get_property; object_class->set_property = set_property; + gsm_class->port_grabbed = port_grabbed; g_object_class_override_property (object_class, MM_GENERIC_GSM_PROP_FLOW_CONTROL_CMD, diff --git a/plugins/mm-modem-hso.c b/plugins/mm-modem-hso.c index e3d4dce7..acb9d849 100644 --- a/plugins/mm-modem-hso.c +++ b/plugins/mm-modem-hso.c @@ -151,7 +151,7 @@ _internal_hso_modem_authenticate (MMModemHso *self, MMCallbackInfo *info) gint cid; char *command; - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); cid = hso_get_cid (self); @@ -291,7 +291,7 @@ hso_call_control (MMModemHso *self, mm_callback_info_set_data (info, IGNORE_ERRORS_TAG, GUINT_TO_POINTER (ignore_errors), NULL); command = g_strdup_printf ("AT_OWANCALL=%d,%d,1", hso_get_cid (self), activate ? 1 : 0); - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, command, 3, hso_call_control_done, info); g_free (command); @@ -567,7 +567,7 @@ get_ip4_config (MMModem *modem, info = mm_callback_info_new_full (modem, ip4_config_invoke, G_CALLBACK (callback), user_data); command = g_strdup_printf ("AT_OWANDATA=%d", hso_get_cid (MM_MODEM_HSO (modem))); - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, command, 3, get_ip4_config_done, info); g_free (command); @@ -603,7 +603,7 @@ do_disconnect (MMGenericGsm *gsm, info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data); - primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); command = g_strdup_printf ("AT_OWANCALL=%d,0,0", cid); @@ -724,80 +724,34 @@ get_access_technology (MMGenericGsm *gsm, /*****************************************************************************/ -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) -{ - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - const char *sys[] = { "tty", "net", NULL }; - GUdevClient *client; - GUdevDevice *device = NULL; - MMPort *port = NULL; - const char *sysfs_path; - - client = g_udev_client_new (sys); - if (!client) { - g_set_error (error, 0, 0, "Could not get udev client."); - return FALSE; - } - - device = g_udev_client_query_by_subsystem_and_name (client, subsys, name); - if (!device) { - g_set_error (error, 0, 0, "Could not get udev device."); - goto out; - } - - sysfs_path = g_udev_device_get_sysfs_path (device); - if (!sysfs_path) { - g_set_error (error, 0, 0, "Could not get udev device sysfs path."); - goto out; - } - - if (!strcmp (subsys, "tty")) { - char *hsotype_path; - char *contents = NULL; - - hsotype_path = g_build_filename (sysfs_path, "hsotype", NULL); - if (g_file_get_contents (hsotype_path, &contents, NULL, NULL)) { - if (g_str_has_prefix (contents, "Control")) - ptype = MM_PORT_TYPE_PRIMARY; - else if (g_str_has_prefix (contents, "Application") || g_str_has_prefix (contents, "Application2")) - ptype = MM_PORT_TYPE_SECONDARY; - g_free (contents); - } - g_free (hsotype_path); - } - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - if (!port) - goto out; +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) +{ + GRegex *regex; if (MM_IS_AT_SERIAL_PORT (port)) { g_object_set (G_OBJECT (port), MM_SERIAL_PORT_SEND_DELAY, (guint64) 0, NULL); - if (ptype == MM_PORT_TYPE_PRIMARY) { - GRegex *regex; - regex = g_regex_new ("_OWANCALL: (\\d),\\s*(\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, connection_enabled, modem, NULL); - g_regex_unref (regex); + regex = g_regex_new ("\\r\\n\\+PACSP0\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL); + g_regex_unref (regex); - regex = g_regex_new ("\\r\\n\\+PACSP0\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL); - g_regex_unref (regex); - } option_register_unsolicted_handlers (gsm, MM_AT_SERIAL_PORT (port)); } +} + + +static void +ports_organized (MMGenericGsm *gsm, MMAtSerialPort *primary) +{ + GRegex *regex; -out: - if (device) - g_object_unref (device); - g_object_unref (client); - return !!port; + regex = g_regex_new ("_OWANCALL: (\\d),\\s*(\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (primary, regex, connection_enabled, gsm, NULL); + g_regex_unref (regex); } /*****************************************************************************/ @@ -819,7 +773,6 @@ modem_init (MMModem *modem_class) modem_class->disable = disable; modem_class->connect = do_connect; modem_class->get_ip4_config = get_ip4_config; - modem_class->grab_port = grab_port; } static void @@ -848,6 +801,8 @@ mm_modem_hso_class_init (MMModemHsoClass *klass) /* Virtual methods */ object_class->finalize = finalize; + gsm_class->port_grabbed = port_grabbed; + gsm_class->ports_organized = ports_organized; gsm_class->do_disconnect = do_disconnect; gsm_class->do_enable_power_up_done = real_do_enable_power_up_done; gsm_class->set_allowed_mode = set_allowed_mode; diff --git a/plugins/mm-modem-huawei-cdma.c b/plugins/mm-modem-huawei-cdma.c index b24ec64b..bdf9898e 100644 --- a/plugins/mm-modem-huawei-cdma.c +++ b/plugins/mm-modem-huawei-cdma.c @@ -29,10 +29,7 @@ #include "mm-serial-parsers.h" #include "mm-log.h" -static void modem_init (MMModem *modem_class); - -G_DEFINE_TYPE_EXTENDED (MMModemHuaweiCdma, mm_modem_huawei_cdma, MM_TYPE_GENERIC_CDMA, 0, - G_IMPLEMENT_INTERFACE (MM_TYPE_MODEM, modem_init)) +G_DEFINE_TYPE (MMModemHuaweiCdma, mm_modem_huawei_cdma, MM_TYPE_GENERIC_CDMA) MMModem * @@ -256,29 +253,24 @@ query_registration_state (MMGenericCdma *cdma, /*****************************************************************************/ -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) +static void +port_grabbed (MMGenericCdma *cdma, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) { - MMPort *port = NULL; GRegex *regex; + gboolean evdo0 = FALSE, evdoA = FALSE; - port = mm_generic_cdma_grab_port (MM_GENERIC_CDMA (modem), subsys, name, suggested_type, user_data, error); - if (port && MM_IS_AT_SERIAL_PORT (port)) { - gboolean evdo0 = FALSE, evdoA = FALSE; - + if (MM_IS_AT_SERIAL_PORT (port)) { g_object_set (G_OBJECT (port), MM_PORT_CARRIER_DETECT, FALSE, NULL); /* 1x signal level */ regex = g_regex_new ("\\r\\n\\^RSSILVL:(\\d+)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_1x_quality_change, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_1x_quality_change, cdma, NULL); g_regex_unref (regex); - g_object_get (G_OBJECT (modem), + g_object_get (G_OBJECT (cdma), MM_GENERIC_CDMA_EVDO_REV0, &evdo0, MM_GENERIC_CDMA_EVDO_REVA, &evdoA, NULL); @@ -286,23 +278,15 @@ grab_port (MMModem *modem, if (evdo0 || evdoA) { /* EVDO signal level */ regex = g_regex_new ("\\r\\n\\^HRSSILVL:(\\d+)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_evdo_quality_change, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_evdo_quality_change, cdma, NULL); g_regex_unref (regex); } } - - return !!port; } /*****************************************************************************/ static void -modem_init (MMModem *modem_class) -{ - modem_class->grab_port = grab_port; -} - -static void mm_modem_huawei_cdma_init (MMModemHuaweiCdma *self) { } @@ -314,6 +298,7 @@ mm_modem_huawei_cdma_class_init (MMModemHuaweiCdmaClass *klass) mm_modem_huawei_cdma_parent_class = g_type_class_peek_parent (klass); + cdma_class->port_grabbed = port_grabbed; cdma_class->query_registration_state = query_registration_state; } diff --git a/plugins/mm-modem-huawei-gsm.c b/plugins/mm-modem-huawei-gsm.c index ad392218..eea0629c 100644 --- a/plugins/mm-modem-huawei-gsm.c +++ b/plugins/mm-modem-huawei-gsm.c @@ -726,9 +726,10 @@ do_enable_power_up_done (MMGenericGsm *gsm, MMAtSerialPort *primary; /* Enable unsolicited result codes */ - primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); + mm_at_serial_port_queue_command (primary, "^PORTSEL=0", 5, NULL, NULL); mm_at_serial_port_queue_command (primary, "^CURC=1", 5, NULL, NULL); } @@ -783,7 +784,7 @@ disable (MMModem *modem, (GCallback)callback, user_data); - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* Turn off unsolicited responses */ @@ -792,77 +793,33 @@ disable (MMModem *modem, /*****************************************************************************/ -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) -{ - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - const char *sys[] = { "tty", NULL }; - GUdevClient *client; - GUdevDevice *device = NULL; - MMPort *port = NULL; - int usbif; - - client = g_udev_client_new (sys); - if (!client) { - g_set_error (error, 0, 0, "Could not get udev client."); - return FALSE; - } - - device = g_udev_client_query_by_subsystem_and_name (client, subsys, name); - if (!device) { - g_set_error (error, 0, 0, "Could not get udev device."); - goto out; - } - - usbif = g_udev_device_get_property_as_int (device, "ID_USB_INTERFACE_NUM"); - if (usbif < 0) { - g_set_error (error, 0, 0, "Could not get USB device interface number."); - goto out; - } - - if (usbif == 0) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - } else if (suggested_type == MM_PORT_TYPE_SECONDARY) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - - if (port && MM_IS_AT_SERIAL_PORT (port)) { - GRegex *regex; +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) +{ + GRegex *regex; + if (MM_IS_AT_SERIAL_PORT (port)) { g_object_set (G_OBJECT (port), MM_PORT_CARRIER_DETECT, FALSE, NULL); regex = g_regex_new ("\\r\\n\\^RSSI:(\\d+)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_signal_quality_change, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_signal_quality_change, gsm, NULL); g_regex_unref (regex); regex = g_regex_new ("\\r\\n\\^MODE:(\\d),(\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_mode_change, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_mode_change, gsm, NULL); g_regex_unref (regex); regex = g_regex_new ("\\r\\n\\^DSFLOWRPT:(.+)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_status_change, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_status_change, gsm, NULL); g_regex_unref (regex); regex = g_regex_new ("\\r\\n\\^BOOT:.+\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, gsm, NULL); g_regex_unref (regex); } - -out: - if (device) - g_object_unref (device); - g_object_unref (client); - return !!port; } /* Encode to packed GSM - this is what Huawei supports on all known models */ @@ -919,7 +876,6 @@ ussd_decode (MMModemGsmUssd *self, const char* reply, guint scheme) static void modem_init (MMModem *modem_class) { - modem_class->grab_port = grab_port; modem_class->disable = disable; } @@ -957,6 +913,7 @@ mm_modem_huawei_gsm_class_init (MMModemHuaweiGsmClass *klass) mm_modem_huawei_gsm_parent_class = g_type_class_peek_parent (klass); g_type_class_add_private (object_class, sizeof (MMModemHuaweiGsmPrivate)); + gsm_class->port_grabbed = port_grabbed; gsm_class->set_allowed_mode = set_allowed_mode; gsm_class->get_allowed_mode = get_allowed_mode; gsm_class->get_access_technology = get_access_technology; diff --git a/plugins/mm-modem-icera.c b/plugins/mm-modem-icera.c index 8dd75da4..915447ef 100644 --- a/plugins/mm-modem-icera.c +++ b/plugins/mm-modem-icera.c @@ -325,7 +325,7 @@ mm_modem_icera_do_disconnect (MMGenericGsm *gsm, info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data); - primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); command = g_strdup_printf ("%%IPDPACT=%d,0", cid); @@ -445,7 +445,7 @@ connection_enabled (MMAtSerialPort *port, break; case 3: /* Call setup failure? */ - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM(self), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM(self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* Get additional error details */ mm_at_serial_port_queue_command (primary, "AT%IER?", 3, @@ -481,7 +481,7 @@ icera_call_control (MMModemIcera *self, char *command; MMAtSerialPort *primary; - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); command = g_strdup_printf ("%%IPDPACT=%d,%d", _get_cid (self), activate ? 1 : 0); @@ -600,7 +600,7 @@ mm_modem_icera_do_connect (MMModemIcera *self, info = mm_callback_info_new (modem, callback, user_data); - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); cid = _get_cid (self); @@ -721,7 +721,7 @@ mm_modem_icera_get_ip4_config (MMModemIcera *self, G_CALLBACK (callback), user_data); - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); command = g_strdup_printf ("%%IPDPADDR=%d", _get_cid (self)); @@ -814,7 +814,7 @@ mm_modem_icera_get_local_timestamp (MMModemIcera *self, info = mm_callback_info_icera_timestamp_new (self, callback, user_data); - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, "*TLTS", 3, get_local_timestamp_done, info); @@ -876,7 +876,7 @@ mm_modem_icera_change_unsolicited_messages (MMModemIcera *self, gboolean enabled { MMAtSerialPort *primary; - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, enabled ? "%NWSTATE=1" : "%NWSTATE=0", 3, NULL, NULL); diff --git a/plugins/mm-modem-linktop.c b/plugins/mm-modem-linktop.c index cfe0c0de..a263dd0a 100644 --- a/plugins/mm-modem-linktop.c +++ b/plugins/mm-modem-linktop.c @@ -26,10 +26,7 @@ #define LINKTOP_NETWORK_MODE_2G 5 #define LINKTOP_NETWORK_MODE_3G 6 -static void modem_init (MMModem *modem_class); - -G_DEFINE_TYPE_EXTENDED (MMModemLinktop, mm_modem_linktop, MM_TYPE_GENERIC_GSM, 0, - G_IMPLEMENT_INTERFACE (MM_TYPE_MODEM, modem_init)) +G_DEFINE_TYPE (MMModemLinktop, mm_modem_linktop, MM_TYPE_GENERIC_GSM) MMModem * @@ -52,35 +49,18 @@ mm_modem_linktop_new (const char *device, NULL)); } -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) { - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - MMPort *port = NULL; - - if (suggested_type == MM_PORT_TYPE_UNKNOWN) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } else - ptype = suggested_type; - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - if (port && MM_IS_AT_SERIAL_PORT (port)) { + if (MM_IS_AT_SERIAL_PORT (port)) { mm_at_serial_port_set_response_parser (MM_AT_SERIAL_PORT (port), mm_serial_parser_v1_e1_parse, mm_serial_parser_v1_e1_new (), mm_serial_parser_v1_e1_destroy); } - - return !!port; } static int @@ -197,12 +177,6 @@ get_allowed_mode (MMGenericGsm *gsm, /*****************************************************************************/ static void -modem_init (MMModem *modem_class) -{ - modem_class->grab_port = grab_port; -} - -static void mm_modem_linktop_init (MMModemLinktop *self) { } @@ -212,6 +186,7 @@ mm_modem_linktop_class_init (MMModemLinktopClass *klass) { MMGenericGsmClass *gsm_class = MM_GENERIC_GSM_CLASS (klass); + gsm_class->port_grabbed = port_grabbed; gsm_class->get_allowed_mode = get_allowed_mode; gsm_class->set_allowed_mode = set_allowed_mode; } diff --git a/plugins/mm-modem-mbm.c b/plugins/mm-modem-mbm.c index 65283e47..07fd389a 100644 --- a/plugins/mm-modem-mbm.c +++ b/plugins/mm-modem-mbm.c @@ -473,7 +473,7 @@ do_enable (MMGenericGsm *self, MMModemFn callback, gpointer user_data) info = mm_callback_info_new (MM_MODEM (self), callback, user_data); - primary = mm_generic_gsm_get_at_port (self, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (self, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); if (priv->have_emrdy) { @@ -530,7 +530,7 @@ disable (MMModem *modem, (GCallback)callback, user_data); - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* Turn off unsolicited responses */ @@ -562,7 +562,7 @@ do_disconnect (MMGenericGsm *gsm, { MMAtSerialPort *primary; - primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, "*ENAP=0", 3, NULL, NULL); @@ -756,7 +756,7 @@ enap_poll (gpointer user_data) MMCallbackInfo *info = (MMCallbackInfo *) user_data; MMAtSerialPort *port; - port = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (info->modem), MM_PORT_TYPE_PRIMARY); + port = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (info->modem), MM_AT_PORT_FLAG_PRIMARY); g_assert (port); mm_at_serial_port_queue_command (port, "AT*ENAP?", 3, enap_poll_response, user_data); @@ -818,7 +818,7 @@ mbm_modem_authenticate (MMModemMbm *self, { MMAtSerialPort *primary; - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); if (username || password) { @@ -944,32 +944,15 @@ mbm_get_unlock_retries (MMModemGsmCard *modem, /*****************************************************************************/ -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) { - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - MMPort *port = NULL; - - if (!strcmp (subsys, "tty")) { - if (suggested_type == MM_PORT_TYPE_UNKNOWN) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } else - ptype = suggested_type; - } - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - if (port && MM_IS_AT_SERIAL_PORT (port)) { - GRegex *regex; + GRegex *regex; + if (MM_IS_AT_SERIAL_PORT (port)) { /* The Ericsson modems always have a free AT command port, so we * don't need to flash the ports when disconnecting to get back to * command mode. F5521gw R2A07 resets port properties like echo when @@ -977,23 +960,12 @@ grab_port (MMModem *modem, */ g_object_set (G_OBJECT (port), MM_SERIAL_PORT_FLASH_OK, FALSE, NULL); - if (ptype == MM_PORT_TYPE_PRIMARY) { - regex = g_regex_new ("\\r\\n\\*E2NAP: (\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_e2nap_received, modem, NULL); - g_regex_unref (regex); - - /* Catch the extended error status bit of the command too */ - regex = g_regex_new ("\\r\\n\\*E2NAP: (\\d),.*\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_e2nap_received, modem, NULL); - g_regex_unref (regex); - } - regex = g_regex_new ("\\r\\n\\*EMRDY: \\d\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_emrdy_received, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_emrdy_received, gsm, NULL); g_regex_unref (regex); regex = g_regex_new ("\\r\\n\\+PACSP(\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_pacsp_received, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_pacsp_received, gsm, NULL); g_regex_unref (regex); /* also consume unsolicited mbm messages we are not interested in them - see LP: #416418 */ @@ -1006,11 +978,25 @@ grab_port (MMModem *modem, g_regex_unref (regex); regex = g_regex_new ("\\r\\n\\*ERINFO:\\s*(\\d),(\\d),(\\d).*\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_erinfo_received, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, mbm_erinfo_received, gsm, NULL); g_regex_unref (regex); } +} - return TRUE; +static void +ports_organized (MMGenericGsm *gsm, MMAtSerialPort *primary) +{ + GRegex *regex; + + /* Only listen on the primary port for connect status responses */ + regex = g_regex_new ("\\r\\n\\*E2NAP: (\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (primary, regex, mbm_e2nap_received, gsm, NULL); + g_regex_unref (regex); + + /* Catch the extended error status bit of the command too */ + regex = g_regex_new ("\\r\\n\\*E2NAP: (\\d),.*\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (primary, regex, mbm_e2nap_received, gsm, NULL); + g_regex_unref (regex); } /*****************************************************************************/ @@ -1036,7 +1022,6 @@ modem_simple_init (MMModemSimple *class) static void modem_init (MMModem *modem_class) { - modem_class->grab_port = grab_port; modem_class->disable = disable; modem_class->connect = do_connect; modem_class->reset = reset; @@ -1073,6 +1058,8 @@ mm_modem_mbm_class_init (MMModemMbmClass *klass) /* Virtual methods */ object_class->finalize = finalize; + gsm_class->port_grabbed = port_grabbed; + gsm_class->ports_organized = ports_organized; gsm_class->do_enable = do_enable; gsm_class->do_disconnect = do_disconnect; gsm_class->get_allowed_mode = get_allowed_mode; diff --git a/plugins/mm-modem-nokia.c b/plugins/mm-modem-nokia.c index 9476f615..e4f2317a 100644 --- a/plugins/mm-modem-nokia.c +++ b/plugins/mm-modem-nokia.c @@ -21,10 +21,7 @@ #include "mm-modem-nokia.h" #include "mm-serial-parsers.h" -static void modem_init (MMModem *modem_class); - -G_DEFINE_TYPE_EXTENDED (MMModemNokia, mm_modem_nokia, MM_TYPE_GENERIC_GSM, 0, - G_IMPLEMENT_INTERFACE (MM_TYPE_MODEM, modem_init)) +G_DEFINE_TYPE (MMModemNokia, mm_modem_nokia, MM_TYPE_GENERIC_GSM) MMModem * @@ -47,46 +44,23 @@ mm_modem_nokia_new (const char *device, NULL)); } -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) { - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - MMPort *port = NULL; - - if (suggested_type == MM_PORT_TYPE_UNKNOWN) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } else - ptype = suggested_type; - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - if (port && MM_IS_AT_SERIAL_PORT (port)) { + if (MM_IS_AT_SERIAL_PORT (port)) { mm_at_serial_port_set_response_parser (MM_AT_SERIAL_PORT (port), mm_serial_parser_v1_e1_parse, mm_serial_parser_v1_e1_new (), mm_serial_parser_v1_e1_destroy); } - - return !!port; } /*****************************************************************************/ static void -modem_init (MMModem *modem_class) -{ - modem_class->grab_port = grab_port; -} - -static void mm_modem_nokia_init (MMModemNokia *self) { } @@ -134,11 +108,13 @@ static void mm_modem_nokia_class_init (MMModemNokiaClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + MMGenericGsmClass *gsm_class = MM_GENERIC_GSM_CLASS (klass); mm_modem_nokia_parent_class = g_type_class_peek_parent (klass); object_class->get_property = get_property; object_class->set_property = set_property; + gsm_class->port_grabbed = port_grabbed; g_object_class_override_property (object_class, MM_GENERIC_GSM_PROP_INIT_CMD, diff --git a/plugins/mm-modem-novatel-gsm.c b/plugins/mm-modem-novatel-gsm.c index 05eb8e15..70d31cad 100644 --- a/plugins/mm-modem-novatel-gsm.c +++ b/plugins/mm-modem-novatel-gsm.c @@ -24,10 +24,13 @@ #include "mm-callback-info.h" #include "mm-modem-helpers.h" -static void modem_init (MMModem *modem_class); +G_DEFINE_TYPE (MMModemNovatelGsm, mm_modem_novatel_gsm, MM_TYPE_GENERIC_GSM) -G_DEFINE_TYPE_EXTENDED (MMModemNovatelGsm, mm_modem_novatel_gsm, MM_TYPE_GENERIC_GSM, 0, - G_IMPLEMENT_INTERFACE (MM_TYPE_MODEM, modem_init)) +#define MM_MODEM_NOVATEL_GSM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_MODEM_NOVATEL_GSM, MMModemNovatelGsmPrivate)) + +typedef struct { + gboolean dmat_sent; +} MMModemNovatelGsmPrivate; MMModem * @@ -78,34 +81,22 @@ dmat_callback (MMAtSerialPort *port, mm_serial_port_close (MM_SERIAL_PORT (port)); } -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) { - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - MMPort *port = NULL; - - if (suggested_type == MM_PORT_TYPE_UNKNOWN) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } else - ptype = suggested_type; - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - if (port && MM_IS_AT_SERIAL_PORT (port) && (ptype == MM_PORT_TYPE_PRIMARY)) { + MMModemNovatelGsm *self = MM_MODEM_NOVATEL_GSM (gsm); + MMModemNovatelGsmPrivate *priv = MM_MODEM_NOVATEL_GSM_GET_PRIVATE (self); + + if (MM_IS_AT_SERIAL_PORT (port) && !priv->dmat_sent) { /* Flip secondary ports to AT mode */ - if (mm_serial_port_open (MM_SERIAL_PORT (port), NULL)) + if (mm_serial_port_open (MM_SERIAL_PORT (port), NULL)) { mm_at_serial_port_queue_command (MM_AT_SERIAL_PORT (port), "$NWDMAT=1", 2, dmat_callback, NULL); + priv->dmat_sent = TRUE; + } } - - return !!port; } /*****************************************************************************/ @@ -315,12 +306,6 @@ get_access_technology (MMGenericGsm *modem, /*****************************************************************************/ static void -modem_init (MMModem *modem_class) -{ - modem_class->grab_port = grab_port; -} - -static void mm_modem_novatel_gsm_init (MMModemNovatelGsm *self) { } @@ -360,10 +345,12 @@ mm_modem_novatel_gsm_class_init (MMModemNovatelGsmClass *klass) MMGenericGsmClass *gsm_class = MM_GENERIC_GSM_CLASS (klass); mm_modem_novatel_gsm_parent_class = g_type_class_peek_parent (klass); + g_type_class_add_private (object_class, sizeof (MMModemNovatelGsmPrivate)); object_class->get_property = get_property; object_class->set_property = set_property; + gsm_class->port_grabbed = port_grabbed; gsm_class->set_allowed_mode = set_allowed_mode; gsm_class->get_allowed_mode = get_allowed_mode; gsm_class->get_access_technology = get_access_technology; diff --git a/plugins/mm-modem-option-utils.c b/plugins/mm-modem-option-utils.c index 2316ee41..c4c39b27 100644 --- a/plugins/mm-modem-option-utils.c +++ b/plugins/mm-modem-option-utils.c @@ -430,7 +430,7 @@ option_change_unsolicited_messages (MMGenericGsm *modem, mm_callback_info_chain_start (info, 4); } - primary = mm_generic_gsm_get_at_port (modem, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (modem, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, enabled ? "_OSSYS=1" : "_OSSYS=0", 3, unsolicited_msg_done, info); diff --git a/plugins/mm-modem-option.c b/plugins/mm-modem-option.c index b15e7045..1b0d3631 100644 --- a/plugins/mm-modem-option.c +++ b/plugins/mm-modem-option.c @@ -179,30 +179,21 @@ disable (MMModem *modem, option_change_unsolicited_messages (MM_GENERIC_GSM (modem), FALSE, unsolicited_disable_done, info); } -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) { - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPort *port = NULL; - - port = mm_generic_gsm_grab_port (gsm, subsys, name, suggested_type, error); - if (port && MM_IS_AT_SERIAL_PORT (port)) { - if (mm_port_get_port_type (port) == MM_PORT_TYPE_PRIMARY) { - GRegex *regex; - - regex = g_regex_new ("\\r\\n\\+PACSP0\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL); - g_regex_unref (regex); - } + GRegex *regex; + + if (MM_IS_AT_SERIAL_PORT (port)) { + regex = g_regex_new ("\\r\\n\\+PACSP0\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL); + g_regex_unref (regex); + option_register_unsolicted_handlers (gsm, MM_AT_SERIAL_PORT (port)); } - - return !!port; } /*****************************************************************************/ @@ -211,7 +202,6 @@ static void modem_init (MMModem *modem_class) { modem_class->disable = disable; - modem_class->grab_port = grab_port; } static void @@ -238,6 +228,7 @@ mm_modem_option_class_init (MMModemOptionClass *klass) g_type_class_add_private (object_class, sizeof (MMModemOptionPrivate)); object_class->dispose = dispose; + gsm_class->port_grabbed = port_grabbed; gsm_class->do_enable_power_up_done = real_do_enable_power_up_done; gsm_class->set_allowed_mode = set_allowed_mode; gsm_class->get_allowed_mode = get_allowed_mode; diff --git a/plugins/mm-modem-samsung-gsm.c b/plugins/mm-modem-samsung-gsm.c index 192a35b6..9162f213 100755 --- a/plugins/mm-modem-samsung-gsm.c +++ b/plugins/mm-modem-samsung-gsm.c @@ -428,7 +428,7 @@ disable (MMModem *modem, (GCallback)callback, user_data); - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* @@ -533,7 +533,7 @@ do_enable (MMGenericGsm *modem, MMModemFn callback, gpointer user_data) info = mm_callback_info_new (MM_MODEM (modem), callback, user_data); - primary = mm_generic_gsm_get_at_port (modem, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (modem, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, "Z", 3, init_reset_done, info); } @@ -580,30 +580,13 @@ simple_connect (MMModemSimple *simple, parent_iface->connect (MM_MODEM_SIMPLE (simple), properties, callback, info); } -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) -{ - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - MMPort *port = NULL; - - if (suggested_type == MM_PORT_TYPE_UNKNOWN) { - if (!strcmp (subsys, "tty")) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } - } else - ptype = suggested_type; - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - if (port && MM_IS_AT_SERIAL_PORT (port)) { +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) +{ + if (MM_IS_AT_SERIAL_PORT (port)) { g_object_set (port, MM_PORT_CARRIER_DETECT, FALSE, MM_SERIAL_PORT_SEND_DELAY, (guint64) 0, @@ -612,8 +595,6 @@ grab_port (MMModem *modem, /* Add Icera-specific handlers */ mm_modem_icera_register_unsolicted_handlers (MM_MODEM_ICERA (gsm), MM_AT_SERIAL_PORT (port)); } - - return !!port; } static void @@ -669,7 +650,6 @@ modem_init (MMModem *modem_class) modem_class->disable = disable; modem_class->connect = do_connect; modem_class->get_ip4_config = get_ip4_config; - modem_class->grab_port = grab_port; } static void @@ -728,7 +708,6 @@ mm_modem_samsung_gsm_class_init (MMModemSamsungGsmClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - MMGenericGsmClass *gsm_class = MM_GENERIC_GSM_CLASS (klass); mm_modem_samsung_gsm_parent_class = g_type_class_peek_parent (klass); @@ -737,9 +716,9 @@ mm_modem_samsung_gsm_class_init (MMModemSamsungGsmClass *klass) object_class->dispose = dispose; + gsm_class->port_grabbed = port_grabbed; gsm_class->do_disconnect = do_disconnect; gsm_class->do_enable = do_enable; - gsm_class->set_allowed_mode = set_allowed_mode; gsm_class->get_allowed_mode = get_allowed_mode; gsm_class->get_access_technology = get_access_technology; diff --git a/plugins/mm-modem-sierra-cdma.c b/plugins/mm-modem-sierra-cdma.c index faf36757..eccb3529 100644 --- a/plugins/mm-modem-sierra-cdma.c +++ b/plugins/mm-modem-sierra-cdma.c @@ -370,7 +370,7 @@ post_enable (MMGenericCdma *cdma, info = mm_callback_info_new (MM_MODEM (cdma), callback, user_data); - primary = mm_generic_cdma_get_at_port (cdma, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_cdma_get_at_port (cdma, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, "!pcstate=1", 5, pcstate_done, info); @@ -386,7 +386,7 @@ post_disable (MMGenericCdma *cdma, info = mm_callback_info_new (MM_MODEM (cdma), callback, user_data); - primary = mm_generic_cdma_get_at_port (cdma, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_cdma_get_at_port (cdma, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, "!pcstate=0", 5, pcstate_done, info); diff --git a/plugins/mm-modem-sierra-gsm.c b/plugins/mm-modem-sierra-gsm.c index 1a9b7351..9247eaed 100644 --- a/plugins/mm-modem-sierra-gsm.c +++ b/plugins/mm-modem-sierra-gsm.c @@ -163,7 +163,7 @@ get_allowed_mode (MMGenericGsm *gsm, info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data); /* Sierra secondary ports don't have full AT command interpreters */ - primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY); if (!primary || mm_port_get_connected (MM_PORT (primary))) { g_set_error_literal (&info->error, MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED, "Cannot perform this operation while connected"); @@ -213,7 +213,7 @@ set_allowed_mode (MMGenericGsm *gsm, info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data); /* Sierra secondary ports don't have full AT command interpreters */ - primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY); if (!primary || mm_port_get_connected (MM_PORT (primary))) { g_set_error_literal (&info->error, MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED, "Cannot perform this operation while connected"); @@ -433,6 +433,7 @@ real_do_enable_power_up_done (MMGenericGsm *gsm, MMCallbackInfo *info) { MMModemSierraGsmPrivate *priv = MM_MODEM_SIERRA_GSM_GET_PRIVATE (gsm); + char *driver = NULL; if (error) { /* Chain up to parent */ @@ -440,11 +441,17 @@ real_do_enable_power_up_done (MMGenericGsm *gsm, return; } - /* Some Sierra devices return OK on +CFUN=1 right away but need some time - * to finish initialization. + /* Old Sierra devices (like the PCMCIA-based 860) return OK on +CFUN=1 right + * away but need some time to finish initialization. Anything driven by + * 'sierra' is new enough to need no delay. */ - g_warn_if_fail (priv->enable_wait_id == 0); - priv->enable_wait_id = g_timeout_add_seconds (10, sierra_enabled, info); + g_object_get (G_OBJECT (gsm), MM_MODEM_DRIVER, &driver, NULL); + if (g_strcmp0 (driver, "sierra") == 0) + sierra_enabled (info); + else { + g_warn_if_fail (priv->enable_wait_id == 0); + priv->enable_wait_id = g_timeout_add_seconds (10, sierra_enabled, info); + } } static void @@ -497,7 +504,7 @@ do_enable_power_up_check_needed (MMGenericGsm *self, info = mm_callback_info_uint_new (MM_MODEM (self), callback, user_data); /* Get port */ - primary = mm_generic_gsm_get_at_port (self, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (self, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* Get current functionality status */ @@ -505,47 +512,27 @@ do_enable_power_up_check_needed (MMGenericGsm *self, mm_at_serial_port_queue_command (primary, "+CFUN?", 3, get_current_functionality_status_cb, info); } -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) -{ - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - MMPort *port; - - if (suggested_type == MM_PORT_TYPE_UNKNOWN) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } else - ptype = suggested_type; - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - - if (port) { - if (MM_IS_AT_SERIAL_PORT (port)) { - GRegex *regex; +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) +{ + GRegex *regex; - g_object_set (G_OBJECT (port), MM_PORT_CARRIER_DETECT, FALSE, NULL); + if (MM_IS_AT_SERIAL_PORT (port)) { + g_object_set (G_OBJECT (port), MM_PORT_CARRIER_DETECT, FALSE, NULL); - regex = g_regex_new ("\\r\\n\\+PACSP0\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL); - g_regex_unref (regex); + regex = g_regex_new ("\\r\\n\\+PACSP0\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL); + g_regex_unref (regex); - /* Add Icera-specific handlers */ - mm_modem_icera_register_unsolicted_handlers (MM_MODEM_ICERA (gsm), MM_AT_SERIAL_PORT (port)); - } else if (mm_port_get_subsys (port) == MM_PORT_SUBSYS_NET) { - MM_MODEM_SIERRA_GSM_GET_PRIVATE (gsm)->has_net = TRUE; - g_object_set (G_OBJECT (gsm), MM_MODEM_IP_METHOD, MM_MODEM_IP_METHOD_DHCP, NULL); - } + /* Add Icera-specific handlers */ + mm_modem_icera_register_unsolicted_handlers (MM_MODEM_ICERA (gsm), MM_AT_SERIAL_PORT (port)); + } else if (mm_port_get_subsys (port) == MM_PORT_SUBSYS_NET) { + MM_MODEM_SIERRA_GSM_GET_PRIVATE (gsm)->has_net = TRUE; + g_object_set (G_OBJECT (gsm), MM_MODEM_IP_METHOD, MM_MODEM_IP_METHOD_DHCP, NULL); } - - return !!port; } static void @@ -740,7 +727,7 @@ do_disconnect (MMGenericGsm *gsm, MMAtSerialPort *primary; char *command; - primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* If we have a net interface, deactivate it */ @@ -801,7 +788,7 @@ do_disable (MMModem *modem, (GCallback)callback, user_data); - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* Turn off unsolicited responses */ @@ -872,7 +859,6 @@ get_icera_private (MMModemIcera *icera) static void modem_init (MMModem *modem_class) { - modem_class->grab_port = grab_port; modem_class->connect = do_connect; modem_class->disable = do_disable; modem_class->get_ip4_config = get_ip4_config; @@ -919,6 +905,7 @@ mm_modem_sierra_gsm_class_init (MMModemSierraGsmClass *klass) g_type_class_add_private (object_class, sizeof (MMModemSierraGsmPrivate)); object_class->dispose = dispose; + gsm_class->port_grabbed = port_grabbed; gsm_class->do_enable_power_up_check_needed = do_enable_power_up_check_needed; gsm_class->do_enable_power_up_done = real_do_enable_power_up_done; gsm_class->set_allowed_mode = set_allowed_mode; diff --git a/plugins/mm-modem-simtech-gsm.c b/plugins/mm-modem-simtech-gsm.c index 18df9c42..5b442d77 100644 --- a/plugins/mm-modem-simtech-gsm.c +++ b/plugins/mm-modem-simtech-gsm.c @@ -383,7 +383,7 @@ real_do_enable_power_up_done (MMGenericGsm *gsm, MMAtSerialPort *primary; /* Enable unsolicited result codes */ - primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* Autoreport access technology changes */ @@ -444,44 +444,26 @@ disable (MMModem *modem, (GCallback)callback, user_data); - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* Turn off unsolicited responses */ mm_at_serial_port_queue_command (primary, "+CNSMOD=0;+AUTOCSQ=0", 5, disable_unsolicited_done, info); } -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) { - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - MMPort *port; - - if (suggested_type == MM_PORT_TYPE_UNKNOWN) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } else - ptype = suggested_type; - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - - if (port && MM_IS_AT_SERIAL_PORT (port)) { - GRegex *regex; + GRegex *regex; + if (MM_IS_AT_SERIAL_PORT (port)) { regex = g_regex_new ("\\r\\n\\+CNSMOD:\\s*(\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_act_change, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, handle_act_change, gsm, NULL); g_regex_unref (regex); } - - return !!port; } /*****************************************************************************/ @@ -490,7 +472,6 @@ static void modem_init (MMModem *modem_class) { modem_class->disable = disable; - modem_class->grab_port = grab_port; } static void @@ -505,6 +486,7 @@ mm_modem_simtech_gsm_class_init (MMModemSimtechGsmClass *klass) mm_modem_simtech_gsm_parent_class = g_type_class_peek_parent (klass); + gsm_class->port_grabbed = port_grabbed; gsm_class->do_enable_power_up_done = real_do_enable_power_up_done; gsm_class->set_allowed_mode = set_allowed_mode; gsm_class->get_allowed_mode = get_allowed_mode; diff --git a/plugins/mm-modem-wavecom-gsm.c b/plugins/mm-modem-wavecom-gsm.c index cba5288b..8b65426e 100644 --- a/plugins/mm-modem-wavecom-gsm.c +++ b/plugins/mm-modem-wavecom-gsm.c @@ -27,11 +27,9 @@ #include "mm-serial-parsers.h" #include "mm-log.h" -static void modem_init (MMModem *modem_class); static void modem_gsm_network_init (MMModemGsmNetwork *gsm_network_class); G_DEFINE_TYPE_EXTENDED (MMModemWavecomGsm, mm_modem_wavecom_gsm, MM_TYPE_GENERIC_GSM, 0, - G_IMPLEMENT_INTERFACE (MM_TYPE_MODEM, modem_init) G_IMPLEMENT_INTERFACE (MM_TYPE_MODEM_GSM_NETWORK, modem_gsm_network_init)) /* Bit flags for mobile station classes supported by the modem */ @@ -159,31 +157,16 @@ wavecom_ms_class_to_str (WavecomMSClass class) } } -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) { - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - MMPort *port = NULL; - - if (suggested_type == MM_PORT_TYPE_UNKNOWN) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } else - ptype = suggested_type; - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - if (port && MM_IS_AT_SERIAL_PORT (port)) { - gpointer parser; - GRegex *regex; + gpointer parser; + GRegex *regex; + if (MM_IS_AT_SERIAL_PORT (port)) { parser = mm_serial_parser_v1_new (); /* AT+CPIN? replies will never have an OK appended */ @@ -198,8 +181,6 @@ grab_port (MMModem *modem, parser, mm_serial_parser_v1_destroy); } - - return !!port; } static void @@ -1131,7 +1112,7 @@ do_enable_power_up_check_needed (MMGenericGsm *self, info = mm_callback_info_uint_new (MM_MODEM (self), callback, user_data); /* Get port */ - primary = mm_generic_gsm_get_at_port (self, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (self, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* Get current functionality status */ @@ -1142,12 +1123,6 @@ do_enable_power_up_check_needed (MMGenericGsm *self, /*****************************************************************************/ static void -modem_init (MMModem *modem_class) -{ - modem_class->grab_port = grab_port; -} - -static void modem_gsm_network_init (MMModemGsmNetwork *network_class) { network_class->set_band = set_band; @@ -1189,6 +1164,7 @@ mm_modem_wavecom_gsm_class_init (MMModemWavecomGsmClass *klass) MM_GENERIC_GSM_PROP_POWER_DOWN_CMD, MM_GENERIC_GSM_POWER_DOWN_CMD); + gsm_class->port_grabbed = port_grabbed; gsm_class->do_enable_power_up_check_needed = do_enable_power_up_check_needed; gsm_class->do_enable_power_up_done = do_enable_power_up_done; gsm_class->set_allowed_mode = set_allowed_mode; diff --git a/plugins/mm-modem-zte.c b/plugins/mm-modem-zte.c index 88ef7344..1a473f0b 100644 --- a/plugins/mm-modem-zte.c +++ b/plugins/mm-modem-zte.c @@ -352,7 +352,7 @@ cpms_timeout_cb (gpointer user_data) if (modem) { MM_MODEM_ZTE_GET_PRIVATE (modem)->cpms_timeout = 0; - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, "+CPMS?", 10, cpms_try_done, info); } @@ -495,7 +495,7 @@ do_enable (MMGenericGsm *modem, MMModemFn callback, gpointer user_data) priv->init_retried = FALSE; - primary = mm_generic_gsm_get_at_port (modem, MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (modem, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); info = mm_callback_info_new (MM_MODEM (modem), callback, user_data); @@ -552,7 +552,7 @@ disable (MMModem *modem, priv->init_retried = FALSE; - primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* Turn off unsolicited responses */ @@ -620,30 +620,15 @@ simple_connect (MMModemSimple *simple, /*****************************************************************************/ -static gboolean -grab_port (MMModem *modem, - const char *subsys, - const char *name, - MMPortType suggested_type, - gpointer user_data, - GError **error) -{ - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); - MMPortType ptype = MM_PORT_TYPE_IGNORED; - MMPort *port = NULL; - - if (suggested_type == MM_PORT_TYPE_UNKNOWN) { - if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY)) - ptype = MM_PORT_TYPE_PRIMARY; - else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY)) - ptype = MM_PORT_TYPE_SECONDARY; - } else - ptype = suggested_type; - - port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error); - if (port && MM_IS_AT_SERIAL_PORT (port)) { - GRegex *regex; +static void +port_grabbed (MMGenericGsm *gsm, + MMPort *port, + MMAtPortFlags pflags, + gpointer user_data) +{ + GRegex *regex; + if (MM_IS_AT_SERIAL_PORT (port)) { g_object_set (port, MM_PORT_CARRIER_DETECT, FALSE, NULL); regex = g_regex_new ("\\r\\n\\+ZUSIMR:(.*)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); @@ -657,7 +642,7 @@ grab_port (MMModem *modem, /* Current network and service domain */ regex = g_regex_new ("\\r\\n\\+ZPASR:\\s*(.*)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); - mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, zte_access_tech_changed, modem, NULL); + mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, zte_access_tech_changed, gsm, NULL); g_regex_unref (regex); /* SIM request to Build Main Menu */ @@ -673,8 +658,6 @@ grab_port (MMModem *modem, /* Add Icera-specific handlers */ mm_modem_icera_register_unsolicted_handlers (MM_MODEM_ICERA (gsm), MM_AT_SERIAL_PORT (port)); } - - return !!port; } /*****************************************************************************/ @@ -706,7 +689,6 @@ modem_init (MMModem *modem_class) modem_class->disable = disable; modem_class->connect = do_connect; modem_class->get_ip4_config = get_ip4_config; - modem_class->grab_port = grab_port; } static void @@ -760,6 +742,7 @@ mm_modem_zte_class_init (MMModemZteClass *klass) g_type_class_add_private (object_class, sizeof (MMModemZtePrivate)); object_class->dispose = dispose; + gsm_class->port_grabbed = port_grabbed; gsm_class->do_enable = do_enable; gsm_class->do_disconnect = do_disconnect; gsm_class->set_allowed_mode = set_allowed_mode; diff --git a/plugins/mm-plugin-anydata.c b/plugins/mm-plugin-anydata.c index 90f05de0..8c701927 100644 --- a/plugins/mm-plugin-anydata.c +++ b/plugins/mm-plugin-anydata.c @@ -114,6 +114,7 @@ grab_port (MMPluginBase *base, const char *name, *subsys, *devfile, *sysfs_path; guint32 caps; guint16 vendor = 0, product = 0; + MMPortType ptype; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -138,6 +139,7 @@ grab_port (MMPluginBase *base, return NULL; } + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if (caps & CAP_CDMA) { @@ -151,19 +153,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { - MMPortType ptype = MM_PORT_TYPE_UNKNOWN; - - if (caps & MM_PLUGIN_BASE_PORT_CAP_QCDM) - ptype = MM_PORT_TYPE_QCDM; - modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-cinterion.c b/plugins/mm-plugin-cinterion.c index 5c14722f..9d0fb529 100644 --- a/plugins/mm-plugin-cinterion.c +++ b/plugins/mm-plugin-cinterion.c @@ -166,6 +166,7 @@ grab_port (MMPluginBase *base, guint32 caps; guint16 vendor = 0x1e2d; guint16 product = 0; + MMPortType ptype; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -178,6 +179,7 @@ grab_port (MMPluginBase *base, mm_plugin_base_get_device_ids (base, subsys, name, NULL, &product); caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { @@ -189,14 +191,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-generic.c b/plugins/mm-plugin-generic.c index 54726202..46b9824a 100644 --- a/plugins/mm-plugin-generic.c +++ b/plugins/mm-plugin-generic.c @@ -117,6 +117,7 @@ grab_port (MMPluginBase *base, const char *name, *subsys, *devfile, *sysfs_path, *driver; guint32 caps; guint16 vendor = 0, product = 0; + MMPortType ptype; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -144,6 +145,7 @@ grab_port (MMPluginBase *base, } caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if (caps & CAP_CDMA) { @@ -163,19 +165,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { - MMPortType ptype = MM_PORT_TYPE_UNKNOWN; - - if (caps & MM_PLUGIN_BASE_PORT_CAP_QCDM) - ptype = MM_PORT_TYPE_QCDM; - modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-gobi.c b/plugins/mm-plugin-gobi.c index 402f6b19..997c3836 100644 --- a/plugins/mm-plugin-gobi.c +++ b/plugins/mm-plugin-gobi.c @@ -50,6 +50,8 @@ get_level_for_capabilities (guint32 capabilities) return 10; if (capabilities & CAP_CDMA) return 10; + if (capabilities & MM_PLUGIN_BASE_PORT_CAP_QCDM) + return 10; return 0; } @@ -110,6 +112,7 @@ grab_port (MMPluginBase *base, const char *name, *subsys, *sysfs_path; guint32 caps; guint16 vendor = 0, product = 0; + MMPortType ptype; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -123,6 +126,7 @@ grab_port (MMPluginBase *base, } caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { @@ -142,14 +146,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-hso.c b/plugins/mm-plugin-hso.c index 60d9863b..2b1a64c2 100644 --- a/plugins/mm-plugin-hso.c +++ b/plugins/mm-plugin-hso.c @@ -109,6 +109,8 @@ grab_port (MMPluginBase *base, char *devfile; guint32 caps; guint16 vendor = 0, product = 0; + MMPortType ptype; + MMAtPortFlags pflags = MM_AT_PORT_FLAG_NONE; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -140,11 +142,29 @@ grab_port (MMPluginBase *base, } } + sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); + + /* Detect port types */ + if (!strcmp (subsys, "tty")) { + char *hsotype_path; + char *contents = NULL; + + hsotype_path = g_build_filename (sysfs_path, "hsotype", NULL); + if (g_file_get_contents (hsotype_path, &contents, NULL, NULL)) { + if (g_str_has_prefix (contents, "Control")) + pflags = MM_AT_PORT_FLAG_PRIMARY; + else if (g_str_has_prefix (contents, "Application") || g_str_has_prefix (contents, "Application2")) + pflags = MM_AT_PORT_FLAG_SECONDARY; /* secondary */ + g_free (contents); + } + g_free (hsotype_path); + } + caps = mm_plugin_base_supports_task_get_probed_capabilities (task); if (!(caps & MM_PLUGIN_BASE_PORT_CAP_GSM) && strcmp (subsys, "net")) goto out; - sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); if (!existing) { modem = mm_modem_hso_new (sysfs_path, mm_plugin_base_supports_task_get_driver (task), @@ -152,14 +172,14 @@ grab_port (MMPluginBase *base, vendor, product); if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) { g_object_unref (modem); return NULL; } } } else { modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-huawei.c b/plugins/mm-plugin-huawei.c index e6c02d47..7eebc330 100644 --- a/plugins/mm-plugin-huawei.c +++ b/plugins/mm-plugin-huawei.c @@ -17,6 +17,7 @@ #include <string.h> #include <stdlib.h> #include <gmodule.h> +#include <errno.h> #define G_UDEV_API_IS_SUBJECT_TO_CHANGE #include <gudev/gudev.h> @@ -47,6 +48,9 @@ mm_plugin_create (void) /*****************************************************************************/ #define TAG_HUAWEI_PCUI_PORT "huawei-pcui-port" +#define TAG_HUAWEI_MODEM_PORT "huawei-modem-port" +#define TAG_HUAWEI_DIAG_PORT "huawei-diag-port" +#define TAG_GETPORTMODE_SUPPORTED "getportmode-supported" #define CAP_CDMA (MM_PLUGIN_BASE_PORT_CAP_IS707_A | \ MM_PLUGIN_BASE_PORT_CAP_IS707_P | \ @@ -74,6 +78,23 @@ probe_result (MMPluginBase *base, mm_plugin_base_supports_task_complete (task, get_level_for_capabilities (capabilities)); } +static void +cache_port_mode (MMPlugin *plugin, const char *reply, const char *type, const char *tag) +{ + char *p; + long i; + + /* Get the USB interface number of the PCUI port */ + p = strstr (reply, type); + if (p) { + errno = 0; + /* shift by 1 so NULL return from g_object_get_data() means no tag */ + i = 1 + strtol (p + strlen (type), NULL, 10); + if (i > 0 && i < 256 && errno == 0) + g_object_set_data (G_OBJECT (plugin), tag, GINT_TO_POINTER ((int) i)); + } +} + static gboolean getportmode_response_cb (MMPluginBaseSupportsTask *task, GString *response, @@ -90,21 +111,13 @@ getportmode_response_cb (MMPluginBaseSupportsTask *task, if (g_error_matches (error, MM_MOBILE_ERROR, MM_MOBILE_ERROR_UNKNOWN) == FALSE) return tries <= 4 ? TRUE : FALSE; } else { - MMPlugin *plugin; - char *p; - int i = 0; - - /* Get the USB interface number of the PCUI port */ - p = strstr (response->str, "PCUI:"); - if (p) - i = atoi (p + strlen ("PCUI:")); - - if (i) { - /* Save they PCUI port number for later */ - plugin = mm_plugin_base_supports_task_get_plugin (task); - g_assert (plugin); - g_object_set_data (G_OBJECT (plugin), TAG_HUAWEI_PCUI_PORT, GINT_TO_POINTER (i)); - } + MMPlugin *plugin = mm_plugin_base_supports_task_get_plugin (task); + + cache_port_mode (plugin, response->str, "PCUI:", TAG_HUAWEI_PCUI_PORT); + cache_port_mode (plugin, response->str, "MDM:", TAG_HUAWEI_MODEM_PORT); + cache_port_mode (plugin, response->str, "DIAG:", TAG_HUAWEI_DIAG_PORT); + + g_object_set_data (G_OBJECT (plugin), TAG_GETPORTMODE_SUPPORTED, GUINT_TO_POINTER (1)); } /* No error or if ^GETPORTMODE is not supported, assume success */ @@ -221,6 +234,9 @@ grab_port (MMPluginBase *base, const char *name, *subsys, *devfile, *sysfs_path; guint32 caps; guint16 vendor = 0, product = 0; + MMPortType ptype; + int usbif; + MMAtPortFlags pflags = MM_AT_PORT_FLAG_NONE; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -239,7 +255,32 @@ grab_port (MMPluginBase *base, return NULL; } + usbif = g_udev_device_get_property_as_int (port, "ID_USB_INTERFACE_NUM"); + if (usbif < 0) { + g_set_error (error, 0, 0, "Could not get USB device interface number."); + return NULL; + } + caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); + + if (usbif + 1 == GPOINTER_TO_INT (g_object_get_data (G_OBJECT (base), TAG_HUAWEI_PCUI_PORT))) + pflags = MM_AT_PORT_FLAG_PRIMARY; + else if (usbif + 1 == GPOINTER_TO_INT (g_object_get_data (G_OBJECT (base), TAG_HUAWEI_MODEM_PORT))) + pflags = MM_AT_PORT_FLAG_PPP; + else if (!g_object_get_data (G_OBJECT (base), TAG_GETPORTMODE_SUPPORTED)) { + /* If GETPORTMODE is not supported, we assume usbif 0 is the modem port */ + if ((usbif == 0) && (ptype == MM_PORT_TYPE_AT)) { + pflags = MM_AT_PORT_FLAG_PPP; + + /* For CDMA modems we assume usbif0 is both primary and PPP, since + * they don't have problems with talking on secondary ports. + */ + if (caps & CAP_CDMA) + pflags |= MM_AT_PORT_FLAG_PRIMARY; + } + } + sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { @@ -259,32 +300,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) { g_object_unref (modem); return NULL; } } } else { - MMPortType ptype = MM_PORT_TYPE_UNKNOWN; - int pcui_usbif, port_usbif; - - /* Any additional AT ports can be secondary ports, but we want to ensure - * that the "pcui" port found from ^GETPORTMODE above is always set as - * a secondary port too. - */ - - port_usbif = g_udev_device_get_property_as_int (port, "ID_USB_INTERFACE_NUM"); - pcui_usbif = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (base), TAG_HUAWEI_PCUI_PORT)); - - if ( (port_usbif == pcui_usbif) - || (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) - || (caps & CAP_CDMA)) - ptype = MM_PORT_TYPE_SECONDARY; - else if (caps & MM_PLUGIN_BASE_PORT_CAP_QCDM) - ptype = MM_PORT_TYPE_QCDM; - modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-linktop.c b/plugins/mm-plugin-linktop.c index 0421dfd6..874e355a 100644 --- a/plugins/mm-plugin-linktop.c +++ b/plugins/mm-plugin-linktop.c @@ -105,6 +105,7 @@ grab_port (MMPluginBase *base, const char *name, *subsys, *devfile, *sysfs_path; guint32 caps; guint16 vendor = 0, product = 0; + MMPortType ptype; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -124,6 +125,7 @@ grab_port (MMPluginBase *base, } caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { @@ -135,14 +137,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-longcheer.c b/plugins/mm-plugin-longcheer.c index 1570cf4b..5a93d468 100644 --- a/plugins/mm-plugin-longcheer.c +++ b/plugins/mm-plugin-longcheer.c @@ -173,7 +173,8 @@ grab_port (MMPluginBase *base, MMModem *modem = NULL; const char *name, *subsys, *sysfs_path; guint32 caps; - MMPortType ptype = MM_PORT_TYPE_UNKNOWN; + MMPortType ptype; + MMAtPortFlags pflags = MM_AT_PORT_FLAG_NONE; guint16 vendor = 0, product = 0; port = mm_plugin_base_supports_task_get_port (task); @@ -184,15 +185,18 @@ grab_port (MMPluginBase *base, * what the Windows .INF files say the port layout should be. */ if (g_udev_device_get_property_as_boolean (port, "ID_MM_LONGCHEER_PORT_TYPE_MODEM")) - ptype = MM_PORT_TYPE_PRIMARY; + pflags = MM_AT_PORT_FLAG_PRIMARY; else if (g_udev_device_get_property_as_boolean (port, "ID_MM_LONGCHEER_PORT_TYPE_AUX")) - ptype = MM_PORT_TYPE_SECONDARY; + pflags = MM_AT_PORT_FLAG_SECONDARY; - /* If the device was tagged by the udev rules, then ignore any other ports - * to guard against race conditions if a device just happens to show up - * with more than two AT-capable ports. + caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); + + /* If the port was tagged by the udev rules but isn't a primary or secondary, + * then ignore it to guard against race conditions if a device just happens + * to show up with more than two AT-capable ports. */ - if ( (ptype == MM_PORT_TYPE_UNKNOWN) + if ( (pflags == MM_AT_PORT_FLAG_NONE) && g_udev_device_get_property_as_boolean (port, "ID_MM_LONGCHEER_TAGGED")) ptype = MM_PORT_TYPE_IGNORED; @@ -204,7 +208,6 @@ grab_port (MMPluginBase *base, return NULL; } - caps = mm_plugin_base_supports_task_get_probed_capabilities (task); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { @@ -224,17 +227,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { - if (caps & MM_PLUGIN_BASE_PORT_CAP_QCDM) - ptype = MM_PORT_TYPE_QCDM; - modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-mbm.c b/plugins/mm-plugin-mbm.c index 20ee99e9..b6da50bb 100644 --- a/plugins/mm-plugin-mbm.c +++ b/plugins/mm-plugin-mbm.c @@ -136,6 +136,7 @@ grab_port (MMPluginBase *base, const char *name, *subsys, *sysfs_path; guint32 caps; guint16 vendor = 0, product = 0; + MMPortType ptype; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -153,6 +154,7 @@ grab_port (MMPluginBase *base, } sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); if (!existing) { modem = mm_modem_mbm_new (sysfs_path, mm_plugin_base_supports_task_get_driver (task), @@ -160,14 +162,14 @@ grab_port (MMPluginBase *base, vendor, product); if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) { g_object_unref (modem); return NULL; } } } else { modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-moto-c.c b/plugins/mm-plugin-moto-c.c index 265630c0..e8cfe0e3 100644 --- a/plugins/mm-plugin-moto-c.c +++ b/plugins/mm-plugin-moto-c.c @@ -109,6 +109,8 @@ grab_port (MMPluginBase *base, MMModem *modem = NULL; const char *name, *subsys, *devfile, *sysfs_path; guint16 vendor = 0, product = 0; + guint32 caps; + MMPortType ptype; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -127,6 +129,8 @@ grab_port (MMPluginBase *base, return NULL; } + caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { modem = mm_modem_moto_c_gsm_new (sysfs_path, @@ -136,14 +140,14 @@ grab_port (MMPluginBase *base, product); if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) { g_object_unref (modem); return NULL; } } } else { modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-nokia.c b/plugins/mm-plugin-nokia.c index 8cfa9936..493400ca 100644 --- a/plugins/mm-plugin-nokia.c +++ b/plugins/mm-plugin-nokia.c @@ -135,7 +135,8 @@ grab_port (MMPluginBase *base, const char *name, *subsys, *devfile, *sysfs_path; guint32 caps; guint16 vendor = 0, product = 0; - MMPortType ptype = MM_PORT_TYPE_UNKNOWN; + MMPortType ptype; + MMAtPortFlags pflags = MM_AT_PORT_FLAG_NONE; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -156,12 +157,13 @@ grab_port (MMPluginBase *base, /* Look for port type hints */ if (g_udev_device_get_property_as_boolean (port, "ID_MM_NOKIA_PORT_TYPE_MODEM")) - ptype = MM_PORT_TYPE_PRIMARY; + pflags = MM_AT_PORT_FLAG_PRIMARY; else if (g_udev_device_get_property_as_boolean (port, "ID_MM_NOKIA_PORT_TYPE_AUX")) - ptype = MM_PORT_TYPE_SECONDARY; + pflags = MM_AT_PORT_FLAG_SECONDARY; caps = mm_plugin_base_supports_task_get_probed_capabilities (task); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { modem = mm_modem_nokia_new (sysfs_path, @@ -180,14 +182,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-novatel.c b/plugins/mm-plugin-novatel.c index 3b2b780f..7c10f3e0 100644 --- a/plugins/mm-plugin-novatel.c +++ b/plugins/mm-plugin-novatel.c @@ -119,6 +119,7 @@ grab_port (MMPluginBase *base, const char *name, *subsys, *devfile, *sysfs_path; guint32 caps; guint16 vendor = 0, product = 0; + MMPortType ptype; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -139,6 +140,7 @@ grab_port (MMPluginBase *base, caps = mm_plugin_base_supports_task_get_probed_capabilities (task); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { modem = mm_modem_novatel_gsm_new (sysfs_path, @@ -157,19 +159,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { - MMPortType ptype = MM_PORT_TYPE_UNKNOWN; - - if (caps & MM_PLUGIN_BASE_PORT_CAP_QCDM) - ptype = MM_PORT_TYPE_QCDM; - modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-option.c b/plugins/mm-plugin-option.c index 8c16879a..0f90a4e7 100644 --- a/plugins/mm-plugin-option.c +++ b/plugins/mm-plugin-option.c @@ -110,7 +110,8 @@ grab_port (MMPluginBase *base, const char *name, *subsys, *devfile, *sysfs_path; guint32 caps; int usbif; - MMPortType ptype = MM_PORT_TYPE_SECONDARY; + MMPortType ptype; + MMAtPortFlags pflags = MM_AT_PORT_FLAG_NONE; guint16 vendor = 0, product = 0; port = mm_plugin_base_supports_task_get_port (task); @@ -122,9 +123,6 @@ grab_port (MMPluginBase *base, return NULL; } - subsys = g_udev_device_get_subsystem (port); - name = g_udev_device_get_name (port); - /* This is the MM equivalent of NM commit 9d7f5b3d084eee2ccfff721c4beca3e3f34bdc50; * Genuine Option NV devices are always supposed to use USB interface 0 as * the modem/data port, per mail with Option engineers. Only this port @@ -132,8 +130,10 @@ grab_port (MMPluginBase *base, */ usbif = g_udev_device_get_property_as_int (port, "ID_USB_INTERFACE_NUM"); if (usbif == 0) - ptype = MM_PORT_TYPE_PRIMARY; + pflags = MM_AT_PORT_FLAG_PRIMARY | MM_AT_PORT_FLAG_PPP; + subsys = g_udev_device_get_subsystem (port); + name = g_udev_device_get_name (port); if (!mm_plugin_base_get_device_ids (base, subsys, name, &vendor, &product)) { g_set_error (error, 0, 0, "Could not get modem product ID."); return NULL; @@ -141,6 +141,7 @@ grab_port (MMPluginBase *base, caps = mm_plugin_base_supports_task_get_probed_capabilities (task); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { modem = mm_modem_option_new (sysfs_path, @@ -151,17 +152,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { - if (caps & MM_PLUGIN_BASE_PORT_CAP_QCDM) - ptype = MM_PORT_TYPE_QCDM; - modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-samsung.c b/plugins/mm-plugin-samsung.c index 9ea2051e..6c39cded 100755 --- a/plugins/mm-plugin-samsung.c +++ b/plugins/mm-plugin-samsung.c @@ -110,6 +110,7 @@ grab_port (MMPluginBase *base, MMModem *modem = NULL; guint32 caps; const char *name, *subsys, *sysfs_path; + MMPortType ptype; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -123,6 +124,7 @@ grab_port (MMPluginBase *base, return NULL; } + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { modem = mm_modem_samsung_gsm_new (sysfs_path, @@ -130,14 +132,14 @@ grab_port (MMPluginBase *base, mm_plugin_get_name (MM_PLUGIN (base))); if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) { g_object_unref (modem); return NULL; } } } else { modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-sierra.c b/plugins/mm-plugin-sierra.c index 9f786b74..4565c68e 100644 --- a/plugins/mm-plugin-sierra.c +++ b/plugins/mm-plugin-sierra.c @@ -35,7 +35,8 @@ mm_plugin_create (void) /*****************************************************************************/ -#define TAG_SIERRA_SECONDARY_PORT "sierra-secondary-port" +#define TAG_SIERRA_APP1_PORT "sierra-app1-port" +#define TAG_SIERRA_APP_PPP_OK "sierra-app-ppp-ok" #define CAP_CDMA (MM_PLUGIN_BASE_PORT_CAP_IS707_A | \ MM_PLUGIN_BASE_PORT_CAP_IS707_P | \ @@ -64,8 +65,16 @@ handle_probe_response (MMPluginBase *self, return; } - if (strstr (response, "APP1") || strstr (response, "APP2") || strstr (response, "APP3")) { - g_object_set_data (G_OBJECT (task), TAG_SIERRA_SECONDARY_PORT, GUINT_TO_POINTER (TRUE)); + if (strstr (response, "APP1")) { + g_object_set_data (G_OBJECT (task), TAG_SIERRA_APP1_PORT, GUINT_TO_POINTER (TRUE)); + + /* 885 can handle PPP on the APP ports, leaving the primary port open + * for command and status while connected. Older modems (ie 8775) say + * they can but fail during PPP. + */ + if (strstr (response, "C885")) + g_object_set_data (G_OBJECT (task), TAG_SIERRA_APP_PPP_OK, GUINT_TO_POINTER (TRUE)); + mm_plugin_base_supports_task_complete (task, 10); return; } @@ -141,8 +150,9 @@ grab_port (MMPluginBase *base, MMModem *modem = NULL; const char *name, *subsys, *sysfs_path; guint32 caps; - MMPortType ptype = MM_PORT_TYPE_UNKNOWN; + MMPortType ptype; guint16 vendor = 0, product = 0; + MMAtPortFlags pflags = MM_AT_PORT_FLAG_NONE; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -150,16 +160,29 @@ grab_port (MMPluginBase *base, subsys = g_udev_device_get_subsystem (port); name = g_udev_device_get_name (port); + caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); + /* Is it a GSM secondary port? */ - if (g_object_get_data (G_OBJECT (task), TAG_SIERRA_SECONDARY_PORT)) - ptype = MM_PORT_TYPE_SECONDARY; + if (g_object_get_data (G_OBJECT (task), TAG_SIERRA_APP1_PORT)) { + if (g_object_get_data (G_OBJECT (task), TAG_SIERRA_APP_PPP_OK)) + pflags = MM_AT_PORT_FLAG_PPP; + else + pflags = MM_AT_PORT_FLAG_SECONDARY; + + /* Secondary ports may not be tagged as AT since they only speak a + * limited command set. But we know they're AT if they are tagged + * as secondary ports. + */ + ptype = MM_PORT_TYPE_AT; + } else if (ptype == MM_PORT_TYPE_AT) + pflags = MM_AT_PORT_FLAG_PRIMARY; if (!mm_plugin_base_get_device_ids (base, subsys, name, &vendor, &product)) { g_set_error (error, 0, 0, "Could not get modem product ID."); return NULL; } - caps = mm_plugin_base_supports_task_get_probed_capabilities (task); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if ((caps & MM_PLUGIN_BASE_PORT_CAP_GSM) || (ptype != MM_PORT_TYPE_UNKNOWN)) { @@ -179,7 +202,7 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) { g_object_unref (modem); return NULL; } @@ -195,7 +218,7 @@ grab_port (MMPluginBase *base, return modem; modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-simtech.c b/plugins/mm-plugin-simtech.c index 76ab33d2..1eb28229 100644 --- a/plugins/mm-plugin-simtech.c +++ b/plugins/mm-plugin-simtech.c @@ -116,8 +116,9 @@ grab_port (MMPluginBase *base, MMModem *modem = NULL; const char *name, *subsys, *sysfs_path; guint32 caps; - MMPortType ptype = MM_PORT_TYPE_UNKNOWN; + MMPortType ptype; guint16 vendor = 0, product = 0; + MMAtPortFlags pflags = MM_AT_PORT_FLAG_NONE; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -127,15 +128,18 @@ grab_port (MMPluginBase *base, * what the Windows .INF files say the port layout should be. */ if (g_udev_device_get_property_as_boolean (port, "ID_MM_SIMTECH_PORT_TYPE_MODEM")) - ptype = MM_PORT_TYPE_PRIMARY; + pflags = MM_AT_PORT_FLAG_PRIMARY; else if (g_udev_device_get_property_as_boolean (port, "ID_MM_SIMTECH_PORT_TYPE_AUX")) - ptype = MM_PORT_TYPE_SECONDARY; + pflags = MM_AT_PORT_FLAG_SECONDARY; - /* If the device was tagged by the udev rules, then ignore any other ports - * to guard against race conditions if a device just happens to show up - * with more than two AT-capable ports. + caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); + + /* If the port was tagged by the udev rules but isn't a primary or secondary, + * then ignore it to guard against race conditions if a device just happens + * to show up with more than two AT-capable ports. */ - if ( (ptype == MM_PORT_TYPE_UNKNOWN) + if ( (pflags == MM_AT_PORT_FLAG_NONE) && g_udev_device_get_property_as_boolean (port, "ID_MM_SIMTECH_TAGGED")) ptype = MM_PORT_TYPE_IGNORED; @@ -147,7 +151,6 @@ grab_port (MMPluginBase *base, return NULL; } - caps = mm_plugin_base_supports_task_get_probed_capabilities (task); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { @@ -167,17 +170,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { - if (caps & MM_PLUGIN_BASE_PORT_CAP_QCDM) - ptype = MM_PORT_TYPE_QCDM; - modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-wavecom.c b/plugins/mm-plugin-wavecom.c index f17aa988..3bd82cbd 100644 --- a/plugins/mm-plugin-wavecom.c +++ b/plugins/mm-plugin-wavecom.c @@ -110,6 +110,7 @@ grab_port (MMPluginBase *base, const char *name, *subsys, *sysfs_path; guint32 caps; guint16 vendor = 0, product = 0; + MMPortType ptype; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -123,6 +124,7 @@ grab_port (MMPluginBase *base, } caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { @@ -134,14 +136,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, MM_PORT_TYPE_UNKNOWN, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, MM_AT_PORT_FLAG_NONE, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-x22x.c b/plugins/mm-plugin-x22x.c index 10a1b4c8..dfac6649 100644 --- a/plugins/mm-plugin-x22x.c +++ b/plugins/mm-plugin-x22x.c @@ -168,8 +168,9 @@ grab_port (MMPluginBase *base, MMModem *modem = NULL; const char *name, *subsys, *sysfs_path; guint32 caps; - MMPortType ptype = MM_PORT_TYPE_UNKNOWN; + MMPortType ptype; guint16 vendor = 0, product = 0; + MMAtPortFlags pflags = MM_AT_PORT_FLAG_NONE; port = mm_plugin_base_supports_task_get_port (task); g_assert (port); @@ -179,15 +180,18 @@ grab_port (MMPluginBase *base, * what the Windows .INF files say the port layout should be. */ if (g_udev_device_get_property_as_boolean (port, "ID_MM_X22X_PORT_TYPE_MODEM")) - ptype = MM_PORT_TYPE_PRIMARY; + pflags = MM_AT_PORT_FLAG_PRIMARY; else if (g_udev_device_get_property_as_boolean (port, "ID_MM_X22X_PORT_TYPE_AUX")) - ptype = MM_PORT_TYPE_SECONDARY; + pflags = MM_AT_PORT_FLAG_SECONDARY; - /* If the device was tagged by the udev rules, then ignore any other ports - * to guard against race conditions if a device just happens to show up - * with more than two AT-capable ports. + caps = mm_plugin_base_supports_task_get_probed_capabilities (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); + + /* If the port was tagged by the udev rules but isn't a primary or secondary, + * then ignore it to guard against race conditions if a device just happens + * to show up with more than two AT-capable ports. */ - if ( (ptype == MM_PORT_TYPE_UNKNOWN) + if ( (pflags == MM_AT_PORT_FLAG_NONE) && g_udev_device_get_property_as_boolean (port, "ID_MM_X22X_TAGGED")) ptype = MM_PORT_TYPE_IGNORED; @@ -199,7 +203,6 @@ grab_port (MMPluginBase *base, return NULL; } - caps = mm_plugin_base_supports_task_get_probed_capabilities (task); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { @@ -211,17 +214,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps)) { - if (caps & MM_PLUGIN_BASE_PORT_CAP_QCDM) - ptype = MM_PORT_TYPE_QCDM; - modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) return NULL; } diff --git a/plugins/mm-plugin-zte.c b/plugins/mm-plugin-zte.c index 6329c3ab..3db4936d 100644 --- a/plugins/mm-plugin-zte.c +++ b/plugins/mm-plugin-zte.c @@ -156,7 +156,8 @@ grab_port (MMPluginBase *base, MMModem *modem = NULL; const char *name, *subsys, *sysfs_path; guint32 caps; - MMPortType ptype = MM_PORT_TYPE_UNKNOWN; + MMPortType ptype; + MMAtPortFlags pflags = MM_AT_PORT_FLAG_NONE; guint16 vendor = 0, product = 0; port = mm_plugin_base_supports_task_get_port (task); @@ -164,9 +165,9 @@ grab_port (MMPluginBase *base, /* Look for port type hints */ if (g_udev_device_get_property_as_boolean (port, "ID_MM_ZTE_PORT_TYPE_MODEM")) - ptype = MM_PORT_TYPE_PRIMARY; + pflags = MM_AT_PORT_FLAG_PRIMARY; else if (g_udev_device_get_property_as_boolean (port, "ID_MM_ZTE_PORT_TYPE_AUX")) - ptype = MM_PORT_TYPE_SECONDARY; + pflags = MM_AT_PORT_FLAG_SECONDARY; subsys = g_udev_device_get_subsystem (port); name = g_udev_device_get_name (port); @@ -178,6 +179,7 @@ grab_port (MMPluginBase *base, caps = mm_plugin_base_supports_task_get_probed_capabilities (task); sysfs_path = mm_plugin_base_supports_task_get_physdev_path (task); + ptype = mm_plugin_base_probed_capabilities_to_port_type (caps); if (!existing) { if (caps & MM_PLUGIN_BASE_PORT_CAP_GSM) { modem = mm_modem_zte_new (sysfs_path, @@ -196,17 +198,14 @@ grab_port (MMPluginBase *base, } if (modem) { - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) { + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) { g_object_unref (modem); return NULL; } } } else if (get_level_for_capabilities (caps) || (!strcmp (subsys, "net"))) { - if (caps & MM_PLUGIN_BASE_PORT_CAP_QCDM) - ptype = MM_PORT_TYPE_QCDM; - modem = existing; - if (!mm_modem_grab_port (modem, subsys, name, ptype, NULL, error)) + if (!mm_modem_grab_port (modem, subsys, name, ptype, pflags, NULL, error)) return NULL; } |