Commit Graph

123 Commits

Author SHA1 Message Date
Jonas Bonn ea7691f04b qmi: use shared services
Apparently it's not legal to create a QMI service multiple times for
a device.  I've been testing with a Quectel EC21 and here it works fine
to do so, but the general case would require "shared" services across
atoms.

This patch switches the users of the NAS and WDS services over to using
a "shared" service instead of each instatiating their own instance.
2017-05-01 12:07:41 -05:00
Jonas Bonn 81cb808daf qmi: watch packet status for spontaneous disconnection only
There are three principal ways for a context to become disconnected:

i)  deactivate_primary() is called
ii)  the network registration is lost and the context is cleaned up
via _detach_shutdown() (via release_all_contexts())
iii) the network decides to disconnect the context

We need to watch the packet status in order to detect case iii).  For
case i) and ii), stop_net will be called, the pkt_handle will be
cleared, and subsequent packet status notifications be ignored.

This patch makes it so that the packet status "disconnected" event
is only propagated when the pkt_handle has not been cleared, indicating
an unrequested disconnection.

This should fix a race reported by Christophe Ronco whereby the packet
status disconnect notification is called between activate_primary
(start_net) and it's callback (start_net_cb).
2017-05-01 12:05:54 -05:00
Jonas Bonn d6704223d8 qmi: move rat_to_tech() into own module
We want to use this function from multiple atoms so this patch moves
it out to its own module for NAS-related helper functions.
2017-04-18 09:48:04 -05:00
Jonas Bonn c0273f9d85 qmi: add missing header inclusion 2017-04-18 09:47:39 -05:00
Jonas Bonn 27b527c4f9 qim: use named status value 2017-04-17 12:11:40 -05:00
Jonas Bonn 949f968676 qmi: implement detach_shutdown method
The detach_shutdown method is invoked to unconditionally release
an active context.  For QMI, this is equivalent to a call to
deactivate_primary.

This patch makes the callback to deactivate_primary optional and
implements detach_shutdown to simply call it.  When there is no
callback, the stop_net callback notifies ofono about the context
release via an asynchronous ofono_gprs_context_deactivated() call.
2017-04-17 12:09:48 -05:00
Jonas Bonn f0f5a19af5 qmi: free cb_data on error
...and move allocation of structure up to variable declarations to
match the pattern used elsewhere in the code.
2017-04-17 12:07:43 -05:00
Jonas Bonn 91b89f472f qmi: read_settings needs to call start network
For LTE networks, a default bearer is automatically activated when
the modem registers to the network.  QMI modems, however, do not
automatically enable the network interface just because the bearer
exists; a call to "start network" needs to be made in order to
get the packet handle before get_settings will return any data and
the network interface can be configured.

This patch makes read_settings call "start network" in order to
enable the interface for the default bearer.  No new bearer will
be created with this call and the settings for the bearer will come
from the default profile, irregardless of what parameters are passed
to the "start network" method.
2017-04-14 17:54:29 -05:00
Jonas Bonn ad39b9003b qmi: fix typo 2017-04-14 16:49:31 -05:00
Jonas Bonn 71372ba0b3 qmi: duplicate callback data correctly 2017-04-14 16:44:05 -05:00
Denis Kenzior 7a2e198fd7 qmi: Use destroy callback for context activate 2017-04-11 12:01:15 -05:00
Denis Kenzior f29a316c91 qmi: Use destroy callback for context deactivate
This ensures that cbd will be freed even if the device is hot-unplugged.
Also, this fixes a memory leak on the failure path inside stop_net_cb
2017-04-11 12:01:06 -05:00
Jonas Bonn ef9af151ee qmi: implement read_settings for automatic contexts
For LTE, a context is created automatically when the modem registers
to the network.  The read_settings function is called for these
automatic contexts to get their configuration.
2017-04-11 11:45:41 -05:00
Jonas Bonn 475b789f3d qmi: retrieve GPRS context parameters
The GPRS context needs to be configured with connection parameters when
the bearer has been established.  This was only partially implemented, so
this patch adds additional parameters to those passed to the context.
2017-04-11 11:43:16 -05:00
Jonas Bonn 55bd639ae1 qmi: add WDS parameter definition 2017-04-11 11:22:29 -05:00
Jonas Bonn a0b3a8e0b8 qmi: NAS definitions adjustment
Calling the ps_state/cs_state alternatives *ATTACH_STATUS* was confusing
because there is also a status field in the *serving_system structure.
This patch does a minor rename and adds the appropriate definitions for
the status field.
2017-04-11 10:22:57 -05:00
Denis Kenzior 829fc23137 qmi: Fix qmi_device_shutdown
qmi_device_shutdown allocated a new orphaned data structure and kicked
off a timeout to wait for the shutdown to complete.  The logic was quite
racy, but the main issue was that the timeouts could not be canceled
when the underlying qmi_device object was destroyed.  This resulted in
crashes.

This patch switches to first-past-the-gate mechanism.  Since only the
modem driver should be issuing a qmi_device_shutdown call, this should
not be a limitation.  The shutdown source is then tracked on the
qmi_device object itself and is canceled when the qmi_device object is
freed.

As an added bonus, the shutdown_destroy callback should now actually
function.  Before it was simply never called.
2017-04-04 10:24:13 -05:00
Denis Kenzior 2701dd8919 qmi: Optimize structure allocations
struct discovery was allocated for every discovery procedure that was
kicked off, which itself allocated a structure.  This patch uses a
class/subclass concept to only allocate a single structure per discovery
procedure.
2017-04-03 12:56:26 -05:00
Jonas Bonn 1e39a9d26d qmi: fix bad lookup and double free
This function was never removing discovery instances because it was looking
them up in the wrong list.  This led to some strangeness with the discovery
callbacks being invoked after the "failure" timeout of 5 seconds and
consequent failures with everything getting out of sync.

With this patch we fix the lookup to use the correct queue.  There's also
a double-free in the function that was never being hit before because the
lookups never succeeded; fix that as well.

With this, service discovery and creation work as expected when testing with
an EC21.
2017-04-03 09:23:53 -05:00
Jonas Bonn 529afeb67f qmi: add service ID's 2017-04-03 09:23:53 -05:00
Denis Kenzior 4c46605f6b qmi: track discovery tasks so clean up is possible
There are various device & service discovery tasks that are initiated
based on a qmi_device object.  qmi_device object does not currently
keep track of these tasks.  Unfortunately the qmi_device object can
go away at any time, and these tasks can become orphaned.

The result of this can lead to crashes.  E.g. a discovery task timeout fires
after the qmi_device object has been destroyed.  Since the object is no
longer valid, any accesses to it will likely result in a SEGFAULT.

This patch attempts to track all discovery tasks on the qmi_device
object itself, so that they can be cleaned up properly.  This patch does
not handle the qmi_device_shutdown functionality.
2017-03-28 14:21:07 -05:00
Jonas Bonn f3911b1669 qmimodem: add WDA service string 2017-03-25 16:01:21 -05:00
Jonas Bonn c548fe2eb5 qmimodem: fix typo 2017-03-25 16:01:06 -05:00
Lukasz Nowak 078582d567 qmimodem: detect utf-8 string as operator name
Telit QMI modems can return non-utf-8 characters in plmn-desc.
Observed with LE910-SVG and Verizon. When that happens, libdbus
will abort ofono.
If non-utf-8 characters are detected, use mccmnc string.
2017-03-23 10:26:30 -05:00
Lukasz Nowak 4219fcf7bc qmimodem: read ss_info at probe time
LTE modems (observed with Telit LE910 V1) can power on
already registered to a network. In that case, the SS_INFO
change notification will never arrive, and the gprs driver
will never be marked as attached.

To avoid this situation, read SS_INFO at probe time, and if
registered, mark the gprs driver as attached.
2017-03-23 10:25:23 -05:00
Denis Kenzior 8559a29d77 qmimodem: Fix warning
This was introduced by the previous patch:
drivers/qmimodem/devinfo.c: In function ‘get_ids_cb’:
drivers/qmimodem/devinfo.c:129:14: error: implicit declaration of function ‘strcmp’ [-Werror=implicit-function-declaration]
  if (!str || strcmp(str, "0") == 0) {
2017-03-23 10:24:34 -05:00
Lukasz Nowak a2a8e71db2 qmimodem: telit LE910 V1 - fix ESN string
Telit QMI modems report "0", rather than a NULL string,
if ESN is not available.
2017-03-23 10:23:50 -05:00
Christophe Ronco 89c92e7277 qmimodem: fix sim file reading on MC7304
Command read_file_info on MC7304 always fails.
Using qmicli or AT command, I am able to read file info.
Qmicli command is:
qmicli -d /dev/cdc-wdm0 --uim-get-file-attributes=0x3f00,0x7fff,0x6fad
[(null)] Successfully got file '/dev/cdc-wdm0' attributes from the UIM:
Card result:
        SW1: '0x90'
        SW2: '0x00'
File attributes:
        File size: 4
        File ID: 28589
        File type: transparent
        Record size: 0
        Record count: 0
        Read security attributes: (always) (null)
        Write security attributes: (single) adm
        Increase security attributes: (always) (null)
        Deactivate security attributes: (single) adm
        Activate security attributes: (single) adm
        Raw:    62:17:82:02:41:21:83:02:6F:AD:8A:01:05:8B:...

After a check of parameters sent by qmimodem driver and qmicli,
the only difference is on parameter "Session Information".
Session type sent by qmimodem driver is 'Card on slot 1'.
Session type sent by qmicli command is 'primary-gw-provisioning'.
Changing session type in qmimodem driver fixed problem (on this modem).

Comparing with what is done by qmili command
2017-02-17 11:16:54 -06:00
Christophe Ronco cf3835f0f3 qmimodem: change kernel driver data format if needed
During gprs-context driver probe function, check kernel device driver
data format and modem low level data format.
If they are different, align kernel device driver data format on
modem low level data format.
If an error occurs during this process, continue probing without error.
This is inspired by what is done in qmicli and qmi-network (package
libqmi).
2017-02-02 11:48:38 -06:00
Denis Kenzior 0fbc802845 qmi: Fix typo 2017-02-02 11:41:36 -06:00
Christophe Ronco 8dffd365a2 qmimodem: get/set kernel device driver data format
Add a way to get and set data format expected by kernel device driver.
This is inspired by what is done in qmicli (package libqmi).
It does not use QMI protocol but a sysfs exported by kernel driver.
To use this feature, kernel version must be equal or more than 4.5.
2017-02-02 11:41:27 -06:00
Piotr Haber 50f1dfcb24 qmimodem: send authentication credentials
Pass authentication method, user and password
to QMI WDS service.
2017-01-26 09:21:07 -06:00
Christophe Ronco d6866f2f90 qmimodem: query_passwd_state can be retried
Retry command QMI_UIM_GET_CARD_STATUS during query_passwd_state if a
temporary error status has been detected.
This happens with a MC7430 modem when query_passwd_state is called just
after PIN is entered.
2017-01-16 22:25:23 -06:00
Christophe Ronco b4cbe8d41a qmimodem: add pin_send feature
Add ability to send PIN to a QMI modem using QMI_UIM_VERIFY_PIN command.
This has been tested on MC7304 and MC7430 modems.
2017-01-11 09:57:53 -06:00
Christophe Ronco 6a1d111e21 qmimodem: get password state from modem
Password state and number of retries asked to modem using
QMI_UIM_GET_CARD_STATUS command rather than remembered after initial
QMI_UIM_GET_CARD_STATUS command.
2017-01-11 09:57:06 -06:00
Christophe Ronco 2505d96544 qmimodem: Add read_imsi to qmimodem sim driver
Add read_imsi feature to qmimodem sim driver.
This is based on DMS service.
On MC7430, this is mandatory to be able to use this driver for GPRS
connection because reading IMSI via EF reads fails.
2017-01-09 12:31:35 -06:00
Christophe Ronco 567e5ec9fc qmimodem: fix QMI notification messages handling
QMI notification messages handlers are never called on MC7430 without this fix.

- Do not test transaction id before calling notification handler.  On MC7430,
notification messages contain a not null transaction id (starts with 1,
increased at each message for a particular client).
- On MC7304 transaction id in notification messages is always 0.
2016-12-30 18:38:29 -06:00
Christophe Ronco f15c33ed20 qmimodem: fix get signal strength
Get current signal strength (type: 0x01), not list of other signals strength
(0x10)

Without this fix:
- I can't get a signal strength on MC7430 because list does not exist
	(only one signal strength).
- On MC7304, result is wrong
2016-12-30 18:37:30 -06:00
Denis Kenzior b67e68e753 sim: Fix whitespace violation 2013-01-15 12:16:08 -06:00
Marcel Holtmann 788922cbdf qmi: Include persistent device configuration service 2012-12-04 05:42:14 +01:00
Marcel Holtmann 15f309742c qmi: Print service number if name is not known 2012-12-01 21:37:22 +01:00
Marcel Holtmann 076abafb03 qmimodem: Fix reporting of PIN or PUK states 2012-11-27 23:31:52 +01:00
Marcel Holtmann 67670a659f qmimodem: Add support for UIM service handling 2012-11-25 20:11:29 +01:00
Marcel Holtmann 56e4798e1e qmimodem: Print error string instead of code if available 2012-11-25 10:19:40 +01:00
Marcel Holtmann 9b4d69cf8d qmimodem: Pretty print service name in debug logs 2012-11-25 00:05:54 +01:00
Marcel Holtmann 535e16c8a4 qmimodem: Fix debug printing of messages 2012-11-25 00:05:15 +01:00
Marcel Holtmann 7feb9e2711 qmimodem: Add helper for error message strings 2012-11-25 00:04:14 +01:00
Denis Kenzior 180f91f6c9 qmi: Update sim-legacy driver to the new API 2012-11-22 10:26:34 -06:00
Marcel Holtmann dd3db6f6bd qmimodem: Avoid shadowing length parameter 2012-07-15 20:16:59 -03:00
Denis Kenzior 05bf01991d qmi: fix whitespace 2012-06-24 17:40:59 -05:00
Marcel Holtmann 1c20ec6c16 modem: Add skeleton for USSD support 2012-06-25 20:24:33 -07:00
Marcel Holtmann 71f6d63859 qmimodem: Add skeleton for voice call support 2012-06-25 12:11:08 -07:00
Marcel Holtmann a04341cdb6 qmimodem: Make sure all service destroy functions are called 2012-06-25 10:25:03 -07:00
Marcel Holtmann a41b7a246b qmimodem: Add support for canceling all service requests 2012-06-25 10:20:08 -07:00
Marcel Holtmann 5ada27b7c1 qmimodem: Use shared DMS service for device information and SIM handling 2012-06-25 09:31:49 -07:00
Marcel Holtmann a19dc51227 qmimodem: Add support for shared services with same client id 2012-06-25 09:30:31 -07:00
Marcel Holtmann 18fb4817f7 qmimodem: Use unsigned int for notify id to make GUINT_TO_POINTER happy 2012-06-25 01:57:15 -07:00
Marcel Holtmann 8f2549416a qmimodem: Use unsigned int for tid to make GUINT_TO_POINTER happy 2012-06-25 01:23:14 -07:00
Marcel Holtmann 2c00dfb0fe qmimodem: Use unsigned int for hash_id to make GUINT_TO_POINTER happy 2012-06-25 01:18:48 -07:00
Marcel Holtmann b168c0f953 qmimodem: Add support for unregister of individual notifications 2012-06-24 23:31:49 -07:00
Marcel Holtmann 29067f75bc qmimodem: Add support for canceling service requests 2012-06-24 23:20:25 -07:00
Marcel Holtmann d4d639f40e qmimodem: Add skeleton for radio settings support 2012-06-24 22:56:27 -07:00
Marcel Holtmann 1631d21e35 qmimodem: Return transaction identifier from service requests 2012-06-24 22:38:26 -07:00
Marcel Holtmann 74d208768a qmimodem: Add helper function for accessing 64-bit integers 2012-06-24 22:24:56 -07:00
Marcel Holtmann 797f3a502e qmimodem: Add common constants for GSM, UMTS and LTE bands 2012-06-24 22:21:39 -07:00
Marcel Holtmann 8c590a85c2 qmimodem: Add support for SMS handling 2012-06-22 13:20:11 -07:00
Marcel Holtmann c958378d6c qmimodem: Add support for GPS location reporting 2012-06-21 21:08:31 -07:00
Marcel Holtmann b12dad8883 qmimodem: Add support for GPRS data connection handling 2012-06-21 20:47:22 -07:00
Marcel Holtmann b36bb2ee50 qmimodem: Add support for network registration handling 2012-06-21 18:44:43 -07:00
Marcel Holtmann 3a42d98623 qmimodem: Add support for legacy SIM handling 2012-06-21 17:29:16 -07:00
Marcel Holtmann ad20ea12c5 qmimodem: Add support for device information handling 2012-06-21 16:07:59 -07:00
Marcel Holtmann 0e6fc7aee4 qmimodem: Add support for QMI control point handling 2012-06-21 15:18:36 -07:00
Marcel Holtmann 85d43570fd build: Add skeleton for Qualcomm QMI modem driver 2012-05-27 10:13:55 +02:00