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.
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
@@ -1079,12 +1058,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)
|
||||
{
|
||||
@@ -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,
|
||||
|
||||
+25
-70
@@ -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)
|
||||
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;
|
||||
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;
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
if (device)
|
||||
g_object_unref (device);
|
||||
g_object_unref (client);
|
||||
return !!port;
|
||||
|
||||
static void
|
||||
ports_organized (MMGenericGsm *gsm, MMAtSerialPort *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 (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;
|
||||
|
||||
@@ -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,22 +278,14 @@ 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
@@ -196,12 +176,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;
|
||||
}
|
||||
|
||||
+32
-45
@@ -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;
|
||||
|
||||
@@ -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,45 +44,22 @@ 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,
|
||||
|
||||
@@ -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;
|
||||
MMModemNovatelGsm *self = MM_MODEM_NOVATEL_GSM (gsm);
|
||||
MMModemNovatelGsmPrivate *priv = MM_MODEM_NOVATEL_GSM_GET_PRIVATE (self);
|
||||
|
||||
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)) {
|
||||
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;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -314,12 +305,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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
+11
-20
@@ -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;
|
||||
GRegex *regex;
|
||||
|
||||
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;
|
||||
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);
|
||||
|
||||
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;
|
||||
|
||||
@@ -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)
|
||||
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 (!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)) {
|
||||
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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
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;
|
||||
GRegex *regex;
|
||||
|
||||
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;
|
||||
if (MM_IS_AT_SERIAL_PORT (port)) {
|
||||
g_object_set (G_OBJECT (port), MM_PORT_CARRIER_DETECT, FALSE, NULL);
|
||||
|
||||
port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error);
|
||||
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);
|
||||
|
||||
if (port) {
|
||||
if (MM_IS_AT_SERIAL_PORT (port)) {
|
||||
GRegex *regex;
|
||||
|
||||
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);
|
||||
|
||||
/* 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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
@@ -1141,12 +1122,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)
|
||||
{
|
||||
@@ -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;
|
||||
|
||||
+12
-29
@@ -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)
|
||||
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)) {
|
||||
GRegex *regex;
|
||||
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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+23
-3
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+56
-33
@@ -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;
|
||||
MMPlugin *plugin = mm_plugin_base_supports_task_get_plugin (task);
|
||||
|
||||
/* Get the USB interface number of the PCUI port */
|
||||
p = strstr (response->str, "PCUI:");
|
||||
if (p)
|
||||
i = atoi (p + strlen ("PCUI:"));
|
||||
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);
|
||||
|
||||
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));
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+13
-13
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+13
-13
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user