Commit Graph

68 Commits

Author SHA1 Message Date
Aleksander Morgado
eb01914bd0 ublox: implement custom ICCID loading
Use AT+CCID to query the SIM ICCID, and fallback to parent's +CRSM
based method otherwise.
2018-09-12 17:17:36 +00:00
Aleksander Morgado
d134402efc ublox: always send user/pass strings, even if no authentication requested
The TOBY-L2 allowed to skup the user/pass string fields when no
authentication was requested, but according to the AT command
reference, all the remaining u-blox modules do require these two
fields given always (e.g. just as empty strings).

As per this sequence in a TOBY-L4:

 (ttyACM2): --> 'AT+UAUTHREQ=?<CR>'
 (ttyACM2): <-- '<CR><LF>+UAUTHREQ: (1-4),(0-2),,<CR><LF><CR><LF>OK<CR><LF>'
 (ttyACM2): --> 'AT+UAUTHREQ=1,0<CR>'
 (ttyACM2): <-- '<CR><LF>+CME ERROR: 4<CR><LF>'

It should have been: AT+UAUTHREQ=1,0,"",""
2018-07-10 19:45:05 +00:00
Aleksander Morgado
c07382a486 udev: add tags also on bind action
When a new USB device is hotplugged, e.g. a USB<->RS232 converter that
exposes a single ttyUSB0, these udev events happen:

  add  /devices/pci0000:00/0000:00:14.0/usb2/2-1 (usb/usb-device)
  add  /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0 (usb/usb-interface)
  add  /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0/ttyUSB0 (usb-serial)
  add  /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0/ttyUSB0/tty/ttyUSB0 (tty)
  bind /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0/ttyUSB0 (usb-serial)
  bind /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0 (usb/usb-interface)
  bind /devices/pci0000:00/0000:00:14.0/usb2/2-1 (usb/usb-device)

Our udev rules in MM only added tags in the 'add' events, and it looks
like the only ones 'persistent' after this sequence are those of the
last event happening on the specific path.

This meant that all TTY subsystem rules (e.g. ID_MM_CANDIDATE) would
be stored for later check (e.g. if ModemManager is started after these
rules have been applied), which was ok. "udevadm info -p ..." would
show these tags correctly always.

But this also meant that the 'bind' udev event happening for the USB
device didn't get any of our device-specific tags, and so we would be
missing them (e.g. ID_MM_DEVICE_MANUAL_SCAN_ONLY) if MM is started
after the last event has happened. "udevadm info -p ..." would
not show these tags.

Modify all our rules to also run at the 'bind' events.

See, for context:
  https://github.com/systemd/systemd/issues/8221
2018-06-02 16:54:37 +02:00
Aleksander Morgado
4bc7d6862d u-blox: wait 20s before probing TOBY-L200 ports
https://bugs.freedesktop.org/show_bug.cgi?id=106623
2018-06-02 16:51:07 +02:00
Aleksander Morgado
3e469e7b80 u-blox: don't run quick AT procedure if READY_DELAY not configured
The quick AT probe procedure is only meaningful to avoid waiting the
+READY URC delay. If there is no such delay configured, we shouldn't
run the quick AT probe (as a failure in the AT probe may also
trigger a +READY URC delay).

Just read the udev tag value early and complete the task if the delay
is not configured.
2018-05-08 09:51:19 +02:00
Matthew Starr
1a56b97061 ublox: use ID_MM_UBLOX_PORT_READY_DELAY udev flag as init delay
Added reading the ID_MM_UBLOX_PORT_READY_DELAY udev flag value and using
it as an init delay when a value is set.

The 20 second delay for the TOBY-L4 +READ URC has been reimplemented
using the new ID_MM_UBLOX_PORT_READY_DELAY udev value.
2018-05-08 09:43:15 +02:00
Matthew Starr
4895577597 u-blox: ignore non-AT ttyACM interfaces
For the TOBY-R2, LISA-R2, and LARA-R2, the only valid AT ports are
ttyACM0, ttyACM1, and ttyACM2.  All other ttyACM ports cause MM to
wait 20-30 seconds probing the port on startup.

Ignoring the non-AT ttyACM ports allows MM to not wait 20-30 seconds
probing and therefore startup much faster with these modems.
2018-04-30 18:29:39 +02:00
Lubomir Rintel
b39dd2ec05 all: drop unused variables
Keeps build with GCC 8 happy.

mm-base-call.c:758:18: warning: variable 'response' set but not used [-Wunused-but-set-variable]
mm-base-call.c:822:18: warning: variable 'response' set but not used [-Wunused-but-set-variable]
mm-base-sms.c:908:18: warning: variable 'response' set but not used [-Wunused-but-set-variable]
mm-sms-list.c:331:25: warning: variable 'ctx' set but not used [-Wunused-but-set-variable]
mm-iface-modem-messaging.c:1210:21: warning: variable 'storage_ctx' set but not used [-Wunused-but-set-variable]
huawei/mm-plugin-huawei.c:183:18: warning: variable 'response' set but not used [-Wunused-but-set-variable]
ublox/mm-plugin-ublox.c:161:24: warning: variable 'response' set but not used [-Wunused-but-set-variable]
ublox/mm-plugin-ublox.c:159:24: warning: variable 'ctx' set but not used [-Wunused-but-set-variable]
icera/mm-modem-helpers-icera.c:218:25: warning: variable 'first_free' set but not used [-Wunused-but-set-variable]
novatel/mm-common-novatel.c:50:18: warning: variable 'response' set but not used [-Wunused-but-set-variable]
2018-04-24 18:11:15 +02:00
Aleksander Morgado
7e94928301 ublox: fix 'any' mode building
The 'any' mode refers to the mode which includes most access
technologies and where none of them is preferred.

Fix the logic so that all combinations with one technology preferred
over the others are ignored, instead of the other way around.

Fixes assertion with the 4G-only LARA R204.

    ModemManager[424]: <debug> [-192499452.090358] (ttyACM0): --> 'AT+URAT=?<CR>'
    ModemManager[424]: <debug> [-192499452.092150] (ttyACM0): <-- '<CR><LF>+URAT: (3)<CR><LF><CR><LF>OK<CR><LF>'
    **
    ERROR:ublox/mm-modem-helpers-ublox.c:817:mm_ublox_get_modem_mode_any: assertion failed: (any != MM_MODEM_MODE_NONE)

Reported-by: Matthew Starr <mstarr@hedonline.com>
2018-04-03 15:58:49 +02:00
Aleksander Morgado
3a7d4b1200 ublox: ignore ttyACM0 in the TOBY-L4
We used ttyACM0 as secondary port until now, just because we had an
extra AT capable TTY around in addition to the main control ttyACM2
port.

Turns out, using this ttyACM0 may actually break the connection setup
in the wwan interface in a bad way (e.g. not allowing DHCP setup).

The suggestion from u-blox and Intel is to fully ignore ttyACM0; and
given that we no longer need any primary/secondary port logic, we just
remove all the associated udev tags.
2018-03-09 18:42:51 +01:00
Aleksander Morgado
357b186134 ublox: ignore +PBREADY URCs
We don't want them to get in the way of our initialization phase:

    /org/freedesktop/ModemManager1/Modem/0 (device id 'c49ed59c4a411e923307330d3e1d82582cbfac37')
     -------------------------
     Hardware | manufacturer: 'u-blox'
              | model: 'unknown'
              | revision: 'TOBY-L4906
              | +PBREADY
              | 40.19_ENG0003'
              | H/W revision: 'unknown'
              | supported: 'gsm-umts, lte'
              | current: 'gsm-umts, lte'
2018-02-06 13:40:21 +01:00
Aleksander Morgado
30ea91e353 ublox: wait for READY URCs during port probing
The AT control TTYs in the u-blox modems may take some time to be
usable. In order to handle this issue, we configured some longer
timeouts during AT probing, but that may not be always enough.

The u-blox TTYs will report readiness via a "+AT: READY" URC, which
we can use during custom initialization to decide right away that the
port is AT. We use up to 20s as that is close to the worst case seen
during experimentation, happening after the module undergoes a full
NVM reset. If the timeout is reached without receiving the URC, we
still run standard AT probing afterwards. This new logic just tries
to make it sure we don't do any probing before the module is ready to
accept it.

If the module hasn't been hotplugged (i.e. it was already there when
ModemManager started) we do a quick first AT probing and if that fails
we run the "+AT: READY" URC wait as if it was hotplugged.
2018-01-04 10:09:24 +01:00
Aleksander Morgado
bda7b9a74a ublox: plug memleak when parsing UAUTHREQ test 2017-09-26 13:45:17 +02:00
Aleksander Morgado
3bfbb59beb ublox: check which auth methods are supported
Don't assume the 'auto' auth method is supported for APN
authentication, query the modem first:

    checking supported authentication methods...
    (ttyACM2): --> 'AT+UAUTHREQ=?<CR>'
    (ttyACM2): <-- '<CR><LF>+UAUTHREQ: (1-4),(0-2),,<CR><LF>'
    (ttyACM2): <-- '<CR><LF>OK<CR><LF>'

    Using automatic authentication method

    setting up authentication preferences in PDP context #2...
    (ttyACM2): --> 'AT+UAUTHREQ=2,1,"vodafone","vodafone"<CR>'
    (ttyACM2): <-- '<CR><LF>OK<CR><LF>'
2017-09-15 10:31:21 -07:00
Aleksander Morgado
b774e58dd0 ublox: new +UAUTHREQ=? tester 2017-09-15 10:31:21 -07:00
Aleksander Morgado
acda0d69f1 ublox: if authentication not required, ignore +UAUTHREQ=0 errors
Just go on with the connection attempt.
2017-09-15 10:31:21 -07:00
Aleksander Morgado
0239e8769b ublox: try to use AT+UACT=X to set current bands 2017-09-15 10:31:21 -07:00
Aleksander Morgado
91f4ea5689 ublox: try to use AT+UACT? to query current bands 2017-09-15 10:31:21 -07:00
Aleksander Morgado
2d0b7b4ae0 ublox: try to use AT+UACT=? to query supported bands 2017-09-15 10:31:21 -07:00
Aleksander Morgado
a0768a13f6 ublox: new AT+UACT=X command builder 2017-09-15 10:31:21 -07:00
Aleksander Morgado
826c5ad74a ublox: new AT+UACT=? test parser 2017-09-15 10:31:21 -07:00
Aleksander Morgado
dbb8f7235d ublox: new AT+UACT? response parser 2017-09-15 10:31:21 -07:00
Aleksander Morgado
56e7112712 ublox,tests: define common method to compare bands 2017-09-15 10:31:21 -07:00
Aleksander Morgado
ce203a1f74 ublox: define port type hints for the TOBY-L4
The TOBY-L4 exposes multiple TTY ports, but each of them has different
purposes:

The TTY at interface #2 is a fully capable AT port but shouldn't be
used to start connections, so we flag it as secondary.

The TTY at interface #4 is a non-AT debug port, so we explicitly
ignore it to make probing faster.

The TTY at interface #6 is the fully capable AT port that must be used
as primary port.

The TTY at interface #8 is an AT-capable port but dedicated to FOTA
update operations.
2017-09-15 10:31:21 -07:00
Aleksander Morgado
9a1c4f626d ublox: fallback to router mode if networking mode unknown
The TOBY-L4 doesn't support querying the current networking mode in
use via the AT+UBMCONF command, so we will just fallback to
MM_UBLOX_NETWORKING_MODE_ROUTER if that happens, as this is the mode
which requires less configuration commands from our side.
2017-09-15 10:31:21 -07:00
Aleksander Morgado
3dc3b52e77 ublox: allow creating u-blox bearers if MM_UBLOX_USB_PROFILE_UNKNOWN
The TOBY-L4 doesn't support querying the current USB profile in use
via the AT+UUSBCONF command, so the loaded profile will always be set
as MM_UBLOX_USB_PROFILE_UNKNOWN.

In this case, we will anyway allow creating a u-blox specific bearer,
as long as a network interface has also been found in the modem.
2017-09-15 10:31:21 -07:00
Aleksander Morgado
55316cabd4 ublox: update frequency bands support
Updated to use the non-deprecated MMModemBand values.
2017-09-07 10:55:17 +02:00
Aleksander Morgado
a29610f25d plugin,port-probe: always cast SEND_DELAY value to guint64
Program received signal SIGSEGV, Segmentation fault.
    strchr () at ../sysdeps/arm/armv6/strchr.S:28
    28    ../sysdeps/arm/armv6/strchr.S: No such file or directory.
    (gdb) bt
    #0  strchr () at ../sysdeps/arm/armv6/strchr.S:28
    #1  0x76b121c8 in g_param_spec_pool_lookup () from ~/buildroot/output/staging/lib/libgobject-2.0.so.0
    #2  0x76b0cf44 in g_object_new_valist () from ~/buildroot/output/staging/lib/libgobject-2.0.so.0
    #3  0x76b0d39c in g_object_new () from ~/buildroot/output/staging/lib/libgobject-2.0.so.0
    #4  0x75f75e40 in mm_plugin_create () at ublox/mm-plugin-ublox.c:99
    #5  0x00031550 in load_plugin (path=0xe9b68 "/usr/lib/ModemManager/libmm-plugin-ublox.so") at mm-plugin-manager.c:1521
    #6  load_plugins (error=0x7efffa68, self=0xdc4f0) at mm-plugin-manager.c:1574
    #7  initable_init (initable=<optimized out>, cancellable=<optimized out>, error=0x7efffa68) at mm-plugin-manager.c:1679
    #8  0x76b9b278 in g_initable_new_valist () from ~/buildroot/output/staging/lib/libgio-2.0.so.0
    #9  0x76b9b2e0 in g_initable_new () from ~/buildroot/output/staging/lib/libgio-2.0.so.0
    #10 0x000324d0 in mm_plugin_manager_new (plugin_dir=0xe9c40 "/usr/lib/ModemManager", error=error@entry=0x7efffa68) at mm-plugin-manager.c:1620
    #11 0x0002da08 in initable_init (initable=0xddb40, cancellable=<optimized out>, error=0x7efffa68) at mm-base-manager.c:1113
    #12 0x76b9b278 in g_initable_new_valist () from ~/buildroot/output/staging/lib/libgio-2.0.so.0
    #13 0x76b9b2e0 in g_initable_new () from ~/buildroot/output/staging/lib/libgio-2.0.so.0
    #14 0x0002e81c in mm_base_manager_new (connection=connection@entry=0xe1070, plugin_dir=plugin_dir@entry=0x9efb0 "/usr/lib/ModemManager",
        auto_scan=auto_scan@entry=1, initial_kernel_events=initial_kernel_events@entry=0x0, enable_test=0, error=0x7efffa68, error@entry=0x7efffa60)
        at mm-base-manager.c:957
    #15 0x0002b6ec in bus_acquired_cb (connection=0xe1070, name=<optimized out>, user_data=<optimized out>) at main.c:87
    #16 0x76c26864 in connection_get_cb () from ~/buildroot/output/staging/lib/libgio-2.0.so.0
    #17 0x76bc76cc in g_task_return_now () from ~/buildroot/output/staging/lib/libgio-2.0.so.0
    #18 0x76bc7d50 in g_task_return () from
    ~/buildroot/output/staging/lib/libgio-2.0.so.0

See similar bug in GStreamer:
https://bugzilla.gnome.org/show_bug.cgi?id=740191
2017-09-05 20:16:18 +02:00
Ben Chan
5accaf504f ublox: remove unused variable 2017-08-03 12:19:37 +02:00
Ben Chan
4e99ca7fd5 ublox: fix memory leaks in unit tests 2017-07-12 11:01:27 +02:00
Ben Chan
989ade7b8c enums: replace Roman numeral suffixes in MM_MODEM_BAND_EUTRAN_*
3GPP TS 36.101 Table 5.5-1 refers the E-UTRA operating bands as 1, 2, 3,
..., etc.
2017-06-28 18:21:25 +02:00
Aleksander Morgado
b874fba0e6 ublox: use send-delay=0 by default
Looks like the u-blox SARA-U260 requires this, see:
https://lists.freedesktop.org/archives/modemmanager-devel/2017-May/004670.html
2017-05-30 17:18:38 +02:00
Aleksander Morgado
d41d717112 ublox: align property values in g_object_new() 2017-05-10 14:36:28 +02:00
Javier Viguera
1ab98b9e8c ublox: support modems connected to serial port
Add the vendor string, so it can be probed via AT commands. This allows
to support modems that are connected to a serial port.

Signed-off-by: Javier Viguera <javier.viguera@digi.com>
2017-05-10 14:35:28 +02:00
Ben Chan
254f2e3412 plugins: remove explicit GDestroyNotify cast on g_free / g_object_unref
g_free and g_object_unref are in form of  `void (*)(gpointer)`, which
matches the GDestroyNotify signature. An explicit GDestroyNotify cast on
g_free and g_object_unref is thus not needed.
2017-03-29 10:22:18 +02:00
Ben Chan
31655bb5a5 glib: remove invocations of g_type_init()
g_type_init() has been deprecated (and also marked with the attribute
'deprecated') since glib 2.36 as the type system is automatically
initialized. Since the minimum version of glib required by ModemManager
is 2.36, calling g_type_init() isn't necessarily in the ModemManager
code.
2017-02-03 10:05:14 +01:00
Ben Chan
c8ec731043 ublox: fix uninitialized variable issue
This patch fixes an uninitialized variable issue in
mm_ublox_parse_ugcntrd_response_for_cid(), which uses an uninitialized
`match_info' when `in_cid' is invalid.
2017-01-24 11:07:51 +01:00
Aleksander Morgado
e3e803998c ublox: add README explaining all details of the plugin 2016-10-12 13:24:10 +02:00
Aleksander Morgado
38bf567536 ublox: longer timeout needed for AT probing
When the device is reset, it needs some time before the newly exposed TTYs are
able to reply to our AT commands. We increase the default timeout of the AT
probing commands in order to cope with that, or we'll end up with TTYs of
'unknown' type that aren't used for anything.
2016-10-12 13:24:09 +02:00
Aleksander Morgado
e64b964e8e ublox: implement connection statistics loading
The implementation uses +UGCNTRD=? to query whether the per-PDP context
statistics are supported by the device, and if they are, +UGCNTRD is used to
query them.

We only process the statistics for the specific CID we're using.
2016-10-12 13:24:09 +02:00
Aleksander Morgado
e6e53467ee ublox: new +UGCNTRD? response parser
The parser returns only the results for the CID being specified as input. This
is so that we can just query the statistics of the CID currently in use by the
bearer.
2016-10-12 13:24:09 +02:00
Aleksander Morgado
79aebb9ba4 ublox: implement current bands setting
Reuse the logic and context used to update current modes, as we need the same
steps (check current power state, go into low power, config update, and recover
previous power state).
2016-10-12 13:24:09 +02:00
Aleksander Morgado
1c69a847ae ublox: new +UBANDSEL=X command builder 2016-10-12 13:24:09 +02:00
Aleksander Morgado
c165f24514 ublox: implement current bands loading 2016-10-12 13:24:09 +02:00
Aleksander Morgado
09c9ca5749 ublox: new +UBANDSEL? response parser 2016-10-12 13:24:09 +02:00
Aleksander Morgado
4632836d40 ublox: implement supported bands loading 2016-10-12 13:24:09 +02:00
Aleksander Morgado
ca1b9cb686 ublox: use +UAUTHREQ to setup PDP context authentication 2016-10-12 13:24:08 +02:00
Aleksander Morgado
4c02fba819 ublox: implement PIN retry count loading 2016-10-12 13:24:08 +02:00
Aleksander Morgado
29517c99ba ublox: new +UPINCNT response parser 2016-10-12 13:24:08 +02:00
Aleksander Morgado
a561f6edf0 ublox: use +CEREG if LTE supported 2016-10-12 11:29:52 +02:00