Commit Graph
1937 Commits
Author SHA1 Message Date
Aleksander Morgado 5fe69d0ebb at-serial-port: plug memleak 2013-02-19 13:17:57 +01:00
Aleksander Morgado f9583cb530 core: update logging levels of several messages
'info' log level, the default if none specified, included too many logs which
aren't that useful, to try to minimize the noise we produce by default.
2013-02-19 13:13:57 +01:00
Aleksander Morgado 37ddfe202e plugin-manager: log time required for device probing 2013-02-19 12:52:01 +01:00
Aleksander Morgado ed2b32c682 plugin-manager: if minimum time consumed and all deferred tasks, abort probing
For the case where we just get a device with all net ports (i.e. all deferred
until result suggested), just abort the probing if the minimum probing time is
consumed.
2013-02-19 12:45:10 +01:00
Aleksander Morgado 1a11af0f86 broadband-bearer: fallback to primary AT port if no data AT port available
Spotted by Dan Williams <dcbw@redhat.com> with his ADU960S.
2013-02-19 09:50:52 +01:00
Aleksander Morgado d593116d68 base-modem: don't run port init sequence if we're just sending a command
This may happen when sending commands to the modem while in non-enabled state,
like when sending the PIN. In this case, just send the command, don't fully
initialize the port with the initialization sequence.
2013-02-18 16:06:18 +01:00
Aleksander Morgado 7a58647af7 broadband-bearer: fully reopen data port before flashing
When disconnecting the data port, first fully close and reopen the port before
flashing. This helps with some modems where the flashing mechanism doesn't
fully work, like this ZTE modem:

    Before:
    [1360325270.357678] [mm-bearer.c:690] mm_bearer_disconnect(): Disconnecting bearer '/org/freedesktop/ModemManager1/Bearer/0'
    [1360325270.357796] [mm-iface-modem.c:1198] mm_iface_modem_update_state(): Modem /org/freedesktop/ModemManager1/Modem/1: state changed (connected -> disconnecting)
    [1360325270.358503] [mm-broadband-bearer.c:1539] disconnect_3gpp(): Sending PDP context deactivation in secondary port...
    [1360325270.358549] [mm-serial-port.c:927] mm_serial_port_open(): (ttyUSB4) device open count is 2 (open)
    [1360325270.358633] [mm-at-serial-port.c:392] debug_log(): (ttyUSB4): --> 'AT+CGACT=0,2<CR>'
    [1360325270.375131] [mm-at-serial-port.c:392] debug_log(): (ttyUSB4): <-- '<CR><LF>OK<CR><LF>'
    [1360325270.375251] [mm-serial-port.c:967] mm_serial_port_close(): (ttyUSB7) device open count is 1 (close)
    [1360325270.375282] [mm-serial-port.c:927] mm_serial_port_open(): (ttyUSB7) device open count is 2 (open)
    [1360325270.375300] [mm-broadband-bearer.c:1497] cgact_secondary_ready(): Flash primary port...
    [1360325270.375833] [mm-serial-port.c:967] mm_serial_port_close(): (ttyUSB4) device open count is 1 (close)
    [1360325271.377539] [mm-broadband-bearer.c:1455] primary_flash_3gpp_ready(): PDP disconnection already sent in secondary port
    [1360325271.377634] [mm-serial-port.c:967] mm_serial_port_close(): (ttyUSB7) device open count is 1 (close)
    [1360325271.377680] [mm-port.c:149] mm_port_set_connected(): (ttyUSB7): port now disconnected
    [1360325271.377721] [mm-bearer.c:623] disconnect_ready(): Disconnected bearer '/org/freedesktop/ModemManager1/Bearer/0'
    [1360325286.415396] [mm-serial-port.c:927] mm_serial_port_open(): (ttyUSB7) device open count is 2 (open)
    [1360325286.415510] [mm-at-serial-port.c:392] debug_log(): (ttyUSB7): --> 'AT+ZPAS?<CR>'
    [1360325287.400589] [mm-broadband-modem.c:1717] modem_load_signal_quality(): loading signal quality...
    [1360325287.400679] [mm-serial-port.c:927] mm_serial_port_open(): (ttyUSB7) device open count is 3 (open)
    [1360325289.401873] [mm-iface-modem.c:762] access_technologies_check_ready(): Couldn't refresh access technologies: 'Serial command timed out'
    [1360325289.401940] [mm-serial-port.c:967] mm_serial_port_close(): (ttyUSB7) device open count is 2 (close)
    [1360325289.401998] [mm-at-serial-port.c:392] debug_log(): (ttyUSB7): --> 'AT+CIND?<CR>'
    [1360325292.403162] [mm-serial-port.c:927] mm_serial_port_open(): (ttyUSB7) device open count is 3 (open)
    [1360325292.403247] [mm-serial-port.c:967] mm_serial_port_close(): (ttyUSB7) device open count is 2 (close
    ...

    After:
    [1360326617.604527] [mm-bearer.c:690] mm_bearer_disconnect(): Disconnecting bearer '/org/freedesktop/ModemManager1/Bearer/0'
    [1360326617.604622] [mm-iface-modem.c:1198] mm_iface_modem_update_state(): Modem /org/freedesktop/ModemManager1/Modem/0: state changed (connected -> disconnecting)
    [1360326617.605006] [mm-broadband-bearer.c:1535] disconnect_3gpp(): Sending PDP context deactivation in secondary port...
    [1360326617.605034] [mm-serial-port.c:929] mm_serial_port_open(): (ttyUSB4) device open count is 2 (open)
    [1360326617.605088] [mm-at-serial-port.c:392] debug_log(): (ttyUSB4): --> 'AT+CGACT=0,2<CR>'
    [1360326617.620075] [mm-at-serial-port.c:392] debug_log(): (ttyUSB4): <-- '<CR><LF>OK<CR><LF>'
    [1360326617.620206] [mm-broadband-bearer.c:1493] cgact_secondary_ready(): Flash primary port...
    [1360326617.620241] [mm-serial-port.c:1334] mm_serial_port_flash(): (ttyUSB7) reopening before flash (2)
    [1360326617.620265] [mm-serial-port.c:969] mm_serial_port_close(): (ttyUSB7) device open count is 1 (close)
    [1360326617.620286] [mm-serial-port.c:969] mm_serial_port_close(): (ttyUSB7) device open count is 0 (close)
    [1360326617.620320] [mm-serial-port.c:985] mm_serial_port_close(): (ttyUSB7) closing serial port...
    [1360326617.620356] [mm-port.c:149] mm_port_set_connected(): (ttyUSB7): port now disconnected
    [1360326617.621355] [mm-serial-port.c:1017] mm_serial_port_close(): (ttyUSB7) serial port closed
    [1360326617.621403] [mm-serial-port.c:860] mm_serial_port_open(): (ttyUSB7) opening serial port...
    [1360326617.622836] [mm-serial-port.c:417] real_config_fd(): (ttyUSB7): port attributes not fully set
2013-02-18 15:41:26 +01:00
Aleksander Morgado 553bebe825 serial-port: new method to reopen a port
We will fully close the port and the re-open it again keeping the same
open_count that we had before.
2013-02-18 15:41:26 +01:00
Aleksander Morgado f8e3a8adb9 broadband-bearer: try to run CGACT first on the primary port
It may happen that the primary port is not the data port; if so, try with the
primary port first, and otherwise fallback to the secondary port.
2013-02-18 15:41:26 +01:00
Aleksander Morgado 92f0c579c4 broadband-bearer: update disconnection logic
We were maintaining the port we used for dialling (the data port) open during
the connection, as specified by the CDMA or 3GPP specific logic. We'll now close
that open count reference ourselves within the CDMA or 3GPP disconnection logic
itself.
2013-02-18 15:41:26 +01:00
Aleksander Morgado b6402a4e21 bearer,3gpp: dial operation specifies which data port to use
Instead of deciding in advance which data port to use, we let the dialling
operation gather it. For the generic dialling logic, ATD-based, always an
'AT' port will be used as data port, even if we grabbed a 'net' port. Those
plugins that can work with 'net' ports will grab the specific 'net' port
themselves.
2013-02-18 15:41:26 +01:00
Aleksander Morgado 15d34d56fd bearer: new helper 'MMBearerConnectResult' type
Instead of returning 3 variables in connect_finish(), return a single reference
counted struct. This simplifies how the result is built and passed within a
GSimpleAsyncResult to each _finish() method.

This also simplifies the dialling step in the 3GPP connection sequence, as we
can use the same new type.
2013-02-18 15:41:26 +01:00
Aleksander Morgado 1746949277 ports: add port initialization sequences instead of iface-modem's modem_init()
Instead of a custom modem_init() step in the 'Modem' interface, just add a
sequence of port initialization commands in each port.

While enabling for the first time a non-hotplugged modem, we will issue the
port initialization commands only after having run the enabling_modem_init()
step (i.e. after ATZ usually).
2013-02-18 13:47:35 +01:00
Aleksander Morgado be37f41f06 at-serial-port: new properties to define and manage a set of init commands
We are now able to specify a list of AT commands to be run whenever the port is
opened for the first time (i.e. open_count from 0 to 1). These commands are
to be treated as a 'port initialization' sequence, where port-configuration
specific AT commands are defined (e.g. ATE0).
2013-02-18 13:47:35 +01:00
Aleksander Morgado 30639606d3 broadband-modem: new step during 'enabling_started' to initialize the modem
We previously had the modem initialization command merged with some other port
setup commands in the 'modem_init' step of the 'Modem' interface. Instead of
doing this, we now split the logic into two separate steps:

A first 'enabling_modem_init' modem initialization step is to be run just after
the ports have been opened, but only during the first enabling operation, and
only if the modem was not hotplugged. A hotplugged modem is assumed to be
properly initialized already, so no need to ATZ-it. Also, we will now wait 500ms
by default after the modem initialization command has been sent, to let it
settle down.

The second 'modem_init' step will be run during the 'Modem' interface
initialization, and it currently only holds specific setup of the primary and
secondary serial ports. We'll be modifying this logic a bit in the next commits,
so no big deal to have that step name unchanged.
2013-02-18 13:47:34 +01:00
Dan Williams 263be58465 serial-port: don't steal data from PPP when connected
There was a race where if PPP was slow to start, MM could read the
first bits of PPP from the port, which MM shouldn't really do.  So
if the port is connected, remove our GIOChannel watch and let pppd
handle all the data.  When the port is disconnected, re-attach our
watch and start reading from the port again.

This may make it harder to detect spurious disconnects if for example
pppd drops the connection and the thing controlling PPP (eg,
NetworkManager or something else) doesn't tell us about that event
by disconnecting the bearer.  This is arguably programmer error though.

See the logs in https://bugzilla.gnome.org/show_bug.cgi?id=624956#c10
for an example of this:

DEBUG: <1280300196.929489> (ttyACM0): <-- '<CR><LF>CONNECT<CR><LF>'
DEBUG: <1280300196.929761> (ttyACM0): port now connected
DEBUG: <1280300196.929853> Modem /org/freedesktop/ModemManager/Modems/0: state changed (connecting -> connected)
DEBUG: <1280300196.929954> (ttyACM0): simple connect state 6
DEBUG: <1280300196.933432> (ttyACM0): <-- '~\-1}#\-64!}!} } }2}#}$\-64#}!}$}%\-36}"}&} }*} } g}%~'
2013-02-15 13:43:50 -06:00
Dan Williams 5280364c4b Revert "serial-port: don't steal data from PPP when connected"
This reverts commit 625e1c4884.

By simply returning when data is available, no data gets cleared
from the file descriptor and data_available() keeps getting
rescheduled, leading to a busy-loop.  This is the wrong approach,
we should be removing the GIOChannel watch instead.
2013-02-15 13:43:49 -06:00
Ben Chan 85b67ed8d9 modem: use +CEREG to determine EPS network registration status
This patch adds the support for solicited/unsolicited EPS network
registration status via AT+CEREG, which is configurable via the
'iface-modem-3gpp-eps-network-supported' property of the
MMIfaceModem3gpp interface and is disabled by default.
2013-02-15 08:53:45 +01:00
Dan Williams 594adc38ff broadband-modem: don't try QCDM access technology checks for non-QCDM 3GPP devices
Result handling code mistakenly ran for these devices, when it shouldn't.
2013-02-14 14:52:23 -06:00
Aleksander Morgado 29c0560a9a broadband-modem-qmi: don't try to load access technologies using QCDM 2013-02-14 17:43:54 +01:00
Aleksander Morgado 914cda5de3 bearer-qmi: wait longer for the 'Stop Network' reply
The 'Stop Network' reply may really take more than 10s to arrive; so let's wait
some more time, 30s, before falling back.
2013-02-14 10:47:14 +01:00
Dan Williams 2d700043ab core: use g_unix_signal_add() for more reliable Unix signal handling
There were a few problems with MM's existing signal handling, first
of which was that calling g_main_loop_quit() from a signal handler
only works 50% of the time due to severe restrictions on what you
can do from the handler.  This caused INT or TERM to sometimes be
ignored by MM.

Instead, use the glib signal functions which ensure that the handler
is run in the right context, where we can do anything we want.
2013-02-12 15:48:39 -06:00
Dan Williams 625e1c4884 serial-port: don't steal data from PPP when connected
There was a race where if PPP was slow to start, MM could read the
first bits of PPP from the port, which MM shouldn't really do.  So
if the port is connected, don't read any data and let pppd do its
thing.

See the logs in https://bugzilla.gnome.org/show_bug.cgi?id=624956#c10
for an example of this:

DEBUG: <1280300196.929489> (ttyACM0): <-- '<CR><LF>CONNECT<CR><LF>'
DEBUG: <1280300196.929761> (ttyACM0): port now connected
DEBUG: <1280300196.929853> Modem /org/freedesktop/ModemManager/Modems/0: state changed (connecting -> connected)
DEBUG: <1280300196.929954> (ttyACM0): simple connect state 6
DEBUG: <1280300196.933432> (ttyACM0): <-- '~\-1}#\-64!}!} } }2}#}$\-64#}!}$}%\-36}"}&} }*} } g}%~'
2013-02-12 15:26:21 -06:00
Dan Williams 18436a8f77 iface-modem-messaging: fix INSTANCE_CAST() vs. GET_INTERFACE() confusion
Yeah, GObject is pretty obscure here.  But to get the implementation's
override function, we want GET_INTERFACE, otherwise we're looking at
some random memory location that's sometimes NULL.  And then we crash.
2013-02-06 15:50:22 -06:00
Dan Williams dcbb6dc811 iface-modem-cdma: fix handling of HDR registration state
hybrid mode is the first parameter, not the third.  Caused EVDO
to look like it wasn't registered.
2013-02-06 11:57:00 -06:00
Dan Williams 8070627011 trivial: add debugging to generic QCDM registration parsing 2013-02-06 11:57:00 -06:00
Dan Williams b9d0a3275f trivial: debug print CDMA1x State results 2013-02-06 11:57:00 -06:00
Ben Chan 24b28d1a72 iface-modem: add a missing step increment in interface_initialization_step 2013-01-30 23:11:51 +01:00
Ben Chan c204a8ce4e iface-modem: rearrange initialization steps
This patch rearranges the initialization steps in MMIfaceModem such that
the following SIM related operations happen at the end of the
initialization:
    - INITIALIZATION_STEP_UNLOCK_REQUIRED
    - INITIALIZATION_STEP_SIM
    - INITIALIZATION_STEP_OWN_NUMBERS

The rationale of this change is that the SIM interface of some modems
may require some time to initialize before it responds to SIM related
AT commands. By rearranging the initialization steps to execute non-SIM
related AT commands first, some of the latency for the SIM
initialization can be absorbed.
2013-01-24 13:37:52 +01:00
Ben Chan 69aff6183a iface-modem: fix invalid modem state consolidation
ModemManager has a bogus modem state transition from 'enabling' to 'disabled':

ModemManager[26214]: <info>  Modem fully enabled...
ModemManager[26214]: <info>  Modem /org/freedesktop/ModemManager1/Modem/2: state changed (enabling -> disabled)

The root cause seems to be the following:

get_current_consolidated_state() in MMIfaceModem returns
MM_MODEM_STATE_DISABLED as the default fallback value. When
mm_iface_modem_update_state() is invoked to transition the modem state from
MM_MODEM_STATE_ENABLING to MM_MODEM_STATE_ENABLED, the following code can
potentially cause the final state to be MM_MODEM_STATE_DISABLED instead.

     /* Enabled may really be searching or registered */
     if (new_state == MM_MODEM_STATE_ENABLED)
         new_state = get_current_consolidated_state (self);

https://code.google.com/p/chromium-os/issues/detail?id=38173
2013-01-24 09:08:44 +01:00
Aleksander Morgado 9d5794e9e4 iface-modem: print power state as string
Thanks to Marius B. Kotsbak <marius@kotsbak.com> for reporting.
2013-01-21 10:33:49 +01:00
Ben Chan 1cf8ccbdd5 iface-modem: schedule signal quality check more often initially
This patch modifies MMIfaceModem to schedule the periodic signal quality
check with a period of 3s instead of 30s (up to 5 periods) initially
until a non-zero signal quality value is obtained and then switch back
to the 30s period.
2013-01-18 11:28:08 +01:00
Ben Chan e75dba639f core: add 'hotplugged' flag to indicate if modem is newly plugged in
This patch adds a 'hotplugged' flag to MMBaseModem to indicate if a
modem is newly plugged in. A plugin can use this information to
determine if, for example, the modem needs to be soft reset using the
ATZ command.

Dan Williams <dcbw@redhat.com> contributed the idea of implementation.
2013-01-18 11:27:51 +01:00
Dan Williams fdad4d636d broadband-modem: guess CDMA access technologies from registration state
Setting access technologies from registration state as part of the
registration checking in the CDMA Interface code fights with
custom implementations in each modem subclass, which causes the
access technologies to ping-pong between more specific (custom
implementation) and less specific (generated from registration state
during registration checking).  If the modem class has more
specific access technology knowledge, we should use that and not
override it on the next registration state poll.

So instead, implement the generic access technology update from
registration state in the broadband modem base class'
load_access_technologies() hook.  Thus, modem classes with more
specific checking (which override MMBroadbandModem's implementation)
will never fight with generic checking, while modems that don't
(and thus actually need the generic checking) still get some basic
access technology handling.
2013-01-14 13:50:27 -06:00
Dan Williams edeb75b028 broadband-modem: implement generic QCDM access technology checks
For modems that don't implement vendor-specific access technology
checks, try to get the access technology via QCDM if the modem has
a QCDM port.
2013-01-14 13:50:27 -06:00
Dan Williams f71852c5b9 iface-modem-cdma: get CDMA1x Serving System during QCDM registration
We want the SID/NID even when AT Serving System checks are disabled,
otherwise the SID/NID don't get filled at all.  QCDM doesn't need the
SID/NID to determine registration, so the values are informational
only and don't affect registration state.  But we still want to
export them via the API.
2013-01-14 13:50:27 -06:00
Dan Williams fe7438973a trivial: fix comment 2013-01-14 13:50:27 -06:00
Dan Williams 01e8e0574f broadband-modem: more compatible CSQ parsing
Some devices (usually CDMA modems like the Sierra MC5725 and others)
don't prefix their +CSQ replies with +CSQ.  So don't require that.
The scanf() should ensure the reply is valid even without the +CSQ.
2013-01-14 13:50:26 -06:00
Dan Williams f95274e735 broadband-modem: load own numbers with QCDM too
Not many CDMA/EVDO-only modems support CNUM since it's not a
standard IS707/856 AT command, so for those that don't
support it and have a QCDM port, try grabbing the number from
NV memory.
2013-01-14 13:50:26 -06:00
Aleksander Morgado 8403a48b31 plugin-manager: new debug logs to help track probing issues 2013-01-11 12:20:57 +01:00
Aleksander Morgado eec5d00a97 core,plugins: remove initial power down sequence
We no longer power down the modem during initialization, so remove that
implementation.
2013-01-11 10:05:46 +01:00
Aleksander Morgado 952d96234b broadband-modem: implement custom power state loading 2013-01-11 10:05:45 +01:00
Aleksander Morgado 696b879b6d broadband-modem-qmi: implement custom power state loading 2013-01-11 10:05:45 +01:00
Aleksander Morgado e55b543d38 iface-modem: implement power mode loading and setting 2013-01-11 10:05:45 +01:00
Dan Williams f50aa47fb2 sim-qmi: fix trivial GError literal issues/format string warnings 2013-01-10 10:09:35 -06:00
Aleksander Morgado 763e207e9c blacklist: ignore all devices from VID 0x0617
No modems from the Swiss Federal Institute of Technology.

https://bugzilla.gnome.org/show_bug.cgi?id=691384
2013-01-09 10:05:15 +01:00
Aleksander Morgado dc7aa25f0a sim-qmi: translate common SIM-related QMI errors into ME errors
Upper layers expect Mobile Equipment errors, so try to translate known QMI
protocol errors.
2013-01-08 18:40:48 +01:00
Aleksander Morgado 1372933345 iface-modem,sim: improve lock info update logic
The logic to handle the lock information (current lock and unlock retry count)
wasn't handling all possible cases properly, e.g.:

 * When PIN is incorrectly entered too many times, a SIM-PUK error may happen.
   In this case we need to directly assume SIM-PUK is the current lock (some
   modems, like Option HSO ones, would incorrectly reply SIM-PIN if CPIN? asked
   just after the SIM-PUK error).

 * After every operation acting in SIM locks, we need to update the current
   unlock retry count.

This change tries to cover those cases, by:

 * The logic to check current lock is extended to also load the unlock retry
   count when needed.

 * Whenever a SIM-PUK error happens in the SIM operations, we directly assume
   that SIM-PUK is required, without re-asking CPIN?.

 * The overall logic of lock checking is now handled by a state machine, which
   is much easier to understand.
2013-01-08 18:40:47 +01:00
Aleksander Morgado 959bb9d2ff broadband-modem: launch the Firmware interface even on fatal errors
Even when there is a fatal error during initialization (e.g. missing PIN in a
3GPP modem), we should allow operations on the Firmware interface.
2013-01-07 22:25:46 +01:00
Ben Chan e939221975 iface-modem, novatel-lte: disable network scan in LTE mode 2013-01-04 12:10:51 +01:00