Commit Graph
57 Commits
Author SHA1 Message Date
Aleksander Morgado 59c783eb61 plugin-base: new 'allowed-subsystems' property
The plugins can set this property to filter support check requests by subsystem.
The value given to the property should be a NULL-terminated array of C strings,
e.g.:

    const gchar *subsystems[] = { "tty", NULL };
2012-03-15 14:14:20 +01:00
Aleksander Morgado 62030debf2 plugin-base: rename 'cancel_supports_port' to 'supports_port_cancel'
We now have 'supports_port' (async method) and 'supports_port_finish' (to get
the result of the async method), so it makes sense to rename the method to
'supports_port_cancel'.
2012-03-15 14:14:19 +01:00
Aleksander Morgado dc30536456 plugin-base: rewrite port supports check as fully asynchronous
Before this change, supports check was either synchronous (e.g. in some
UNSUPPORTED cases) or asynchronous (when IN_PROGRESS was returned).

With this fix, the supports check requested to the plugin will always be
completed asynchronously; either directly in an idle before launching any real
probing operation, or once the probing operation is finished.

Therefore, it is not expected to get a IN_PROGRESS reply in
mm_plugin_supports_port_finish(), only UNSUPPORTED|SUPPORTED|DEFERRED.
2012-03-15 14:14:19 +01:00
Dan Williams 4dad94d500 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.
2012-02-28 10:06:04 -06:00
Aleksander Morgado 670f560b3d iridium: add initial dummy plugin 2012-02-17 13:25:02 +01:00
Dan Williams 30bb9e878f cdma: fixes for libqcdm changes 2012-01-03 00:30:59 -06:00
Dan Williams d40e043623 core: better handle NULL spew from serial ports during probing
Observed on a generic ZTE device.
2011-10-18 13:17:39 -05:00
Dan Williams 8799f4da1f core: when probing mark ports as AT capable too
On a ZTE MF626, sometimes the aux port will respond only with
"ERROR" to probing commands (while the SIM is starting up) and
previously we'd lose the port because we were only looking for
valid probe responses.  But if the port returns ERROR or CME ERROR
etc we know it's an AT port and that we can use it once we've
gotten the type response (CDMA or GSM) from the main port.
2011-08-14 16:02:41 -05:00
Dan Williams eb2d14ab4a core: fix possible double-free
If there was data waiting, the task freed it, but then the port
got closed, and the data callback might have freed the data again.
2011-08-02 21:56:56 -05:00
Dan Williams 85000adfe9 core: add another CnS string to the immediate ignore list
Newer Sierra devices have this (ie 306); it's the CnS port so ignore
it immediately.
2011-07-18 18:31:58 -05:00
Aleksander Morgado f9f6d1dfdb plugins: propagate cached probing result to supports task
We need to ensure that the supports task always has the results of the probing,
no matter if the probing was just launched by the plugin grabbing the port, or
by a previous plugin. We do this during supports_port(), by propagating to the
supports task any possible previously cached probing results.
2011-06-06 17:21:47 +02:00
Aleksander Morgado df0d9b480c plugin base: let plugins decide if they should be sorted last
Note that even if a plugin says it wants to be sorted last, the generic plugin
will always be the last one. Also, there is no order guaranteed between two
plugins that request to be sorted last.
2011-06-06 17:20:17 +02:00
Aleksander Morgado 5a2078a2a5 plugin base: include vendor ID and product ID retrieval during AT port probing
Port probing is extended to also query for Vendor ID and Product ID. This allows
plugins to check whether the reported IDs are expected, and thus we enable
plugins to handle modems connected via RS232 ports (where udev doesn't give any
vendor ID) or modems connected via a USB adapter (where udev gives the vendor ID
of the adapter).

Note that this effectively means that a plugin which expects these kind of modem
connections will end up always launching port probing as they won't only rely on
the vendor ID reported by udev.
2011-06-06 17:20:17 +02:00
Dan Williams b122938ab5 core: allow plugins to stop probing and not support a modem
Previously plugins could only stop probing, *or* stop probing and
indicate support for a device.  For the Alcatel X200/X060s debacle
we need to stop probing and indicate that the plugin does not
support the device at all.
2011-06-05 20:58:13 -05:00
Dan Williams 1cf7a4da44 plugins: allow multiple custom init commands in sequence
Huawei will need this.
2011-04-26 23:44:56 -05:00
Dan Williams 0befde3ce9 plugins: simplify custom init commands
Instead of having two places that custom init stuff got processed
(a hook in the MMPluginBase class itself and a callback too) just
use a callback, and simplify it somewhat so that the plugin tracks
how many tries it cares about and what to do based on the response
or error.
2011-04-26 19:43:40 -05:00
Nathan Williams 1c3101fbaf serial: allow spew control to be turned off
It's only used during probing where some port types (Sierra CnS
and some Icera devices) may send streams of data that we can't
understand until we close the port.  It interferes with some SMS
operations, so turn it off for ports opened after probing.
2011-04-14 13:22:54 -05:00
Dan Williams ed5aefb3cb serial: allow plugins to specify probe-time send_delay
Let modems we know don't suck use a zero send-delay at probe time,
which greatly reduces time required to probe AT-compatible ports.
2011-04-08 16:19:36 -05:00
Thomas Bechtold b3b1d5309a core: allow plugins to handle custom init responses 2011-03-11 20:25:22 -06:00
Tom Bechtold 92e4127c7d core: allow platform devices without a VID/PID
Since platform devices don't usually have them.
2011-02-10 12:07:54 -06:00
Dan Williams 16039244bb core: rework logging
Make it more flexible, add logging to a file, and absolute and
relative timestamps.
2011-01-23 20:51:48 -06:00
Elly Jones 48169926f4 Don't probe virtual devices before they exist
Prevent ModemManager from probing virtual devices before their
associated files exist in /dev tree.

Contributed by Nasser Grainawi <nasser@codeaurora.org>

Review URL: http://codereview.chromium.org/2118005
(cherry picked from commit 617660e3572a7b79ed83f9fc0fda89b7efcb2d4d)

Conflicts:

	src/mm-plugin-base.c

Change-Id: Ie5e8b98fb6b6c69e294175523ef99c934092433b
2010-12-20 12:41:03 -05:00
Elly Jones d32eeec9ea Update from Qualcomm to support smd devices in Modem Manager
Review URL: http://codereview.chromium.org/661471
(cherry picked from commit 8475eb44b7ea41afa823919b017a39d82b07a5a2)

Conflicts:

	src/mm-plugin-base.c

Change-Id: I825886cad62a27acb39dfe74da7028d83adf692a
2010-12-20 11:05:49 -05:00
Dan Williams 91a58bbe3d core: detect PCMCIA manfid and cardid
These aren't added to the udev device database by anything yet
(though they should be) so grab them manually.
2010-10-22 11:20:16 -05:00
Dan Williams 7c410a8d08 core: strip "0x" off udev ID_VENDOR_ID and ID_MODEL_ID strings 2010-10-22 11:14:34 -05:00
Dan Williams 7ae8ffe21b core: use hardware IDs as part of DeviceIdentifier
Pass the device's hardware IDs through modem creation and use them
when calculating the device's identifier.  Add a bunch of testcases
for real hardware to ensure we don't break the device ID in the
future unless we really want to.
2010-10-22 11:06:48 -05:00
Torgny Johansson 8873c0a7dc gsm: add GetOperatorID method
Returns the ID of the operator that issued the SIM card.

Cleanups and get_mnc_length_done() by me (dcbw).
2010-06-22 16:50:21 -07:00
Dan Williams 246817fe54 serial: fix possible segfault handing port-full signals
The argument passed to the handler is a GByteArray, not a
GString.  Encountered with Option iCON Icera-based devices,
but could also be possible with Sierra devices.
2010-05-05 15:49:33 -07:00
Dan Williams a4c094c340 core: fix serial error #defines
Should have ERROR in them.
2010-04-24 23:44:35 -07:00
Dan Williams b9bb12a01e core: flash failure on disconnect shouldn't be a hard error (rh #578280) 2010-04-24 23:40:24 -07:00
Dan Williams df08f6a43f core: find the existing modem for a port in the manager 2010-03-30 15:03:35 -07:00
Dan Williams 720e38aec0 core: move physical device checking into the manager
It turns out that the manager needs to know about the physical
device so we can prevent multiple plugins from claiming ports on
the same modem.
2010-03-30 14:50:40 -07:00
Dan Williams 0b9c173fe9 core: assume +CPIN "READY" response indicates GSM capability (rh #573510)
Assume (for now) that devices that respond to AT+CPIN without an
error are GSM devices.  This may not be 100% true as some devices
in Asia (where CDMA devices use RUIMs which are basically SIMs) support
+CPIN for unlocking the RUIM, but since CDMA devices more consistently
implement AT+GCAP and ATI than we should be safe for a while.
2010-03-23 14:37:01 -07:00
Dan Williams bcfb75d88d core: grab probed QCDM ports for plugins where they are useful 2010-03-23 01:36:00 -07:00
Dan Williams 6598d2ef7f core: parse the right thing on QCDM version info response 2010-03-21 17:48:19 -07:00
Dan Williams 2e62a2e0a6 core: probe ports for QCDM capability too 2010-03-20 03:39:10 -07:00
Dan Williams b002e54cf4 core: immediately reject Sierra CnS ports during probe
For now; until Sierra releases their CnS documentation.
2010-03-16 13:03:13 -07:00
Dan Williams 4d1e00c496 core: fix merge damage 2010-03-11 16:02:12 -08:00
Dan Williams 3ec7e89f11 Merge remote branch 'origin/master' into qcdm 2010-03-11 13:43:06 -08:00
Dan Williams 749f9c0eb5 core: stop probing known-unusable ports early
Some ports we know we shouldn't use when we get certain responses
from them.  Reading from these ports triggers kernel bugs (at least
on 2.6.31 and 2.6.32) relating to flow control in some drivers
(*cough* hso *cough*), so lets try not to aggravate the kernel too
much.  This happens on Icera-based Option devices like the GI0322
(AT&T Quicksilver) for example.

(note: AFAICT this doesn't have any relation to the recent XON/XOFF
patch, since I get this problem without the XON/XOFF patch on both
2.6.31 and 2.6.32 as well)

---

BUG: sleeping function called from invalid context at kernel/mutex.c:94
in_atomic(): 1, irqs_disabled(): 1, pid: 9295, name: modem-manager
Pid: 9295, comm: modem-manager Not tainted 2.6.32.9-67.fc12.x86_64 #1
Call Trace:
 <IRQ>  [<ffffffff81045d41>] __might_sleep+0xed/0xef
 [<ffffffff81454dd0>] mutex_lock+0x24/0x50
 [<ffffffff8104811e>] ? enqueue_task_fair+0x2a/0x6d
 [<ffffffff812af79f>] tty_throttle+0x1b/0x49
 [<ffffffff812af0d9>] n_tty_receive_buf+0xdbb/0xe12
 [<ffffffff810459fd>] ? task_rq_unlock+0x11/0x13
 [<ffffffff81050c5c>] ? try_to_wake_up+0x2f3/0x305
 [<ffffffff8110de0c>] ? __kmalloc+0x37/0x15e
 [<ffffffff8110de42>] ? __kmalloc+0x6d/0x15e
 [<ffffffff812b12c9>] flush_to_ldisc+0xf8/0x18d
 [<ffffffff812b13ae>] tty_flip_buffer_push+0x50/0x61
 [<ffffffffa040ccd5>] put_rxbuf_data+0xea/0x124 [hso]
 [<ffffffffa040cd97>] put_rxbuf_data_and_resubmit_bulk_urb+0x21/0x6b [hso]
 [<ffffffffa040d0b1>] hso_std_serial_read_bulk_callback+0x14d/0x15f [hso]
 [<ffffffff8132edf7>] ? dma_unmap_single_attrs.clone.0+0x38/0x3a
 [<ffffffff8132ef74>] usb_hcd_giveback_urb+0x91/0xc5
 [<ffffffff813417c8>] ehci_urb_done+0x7b/0x90
 [<ffffffff81050c5c>] ? try_to_wake_up+0x2f3/0x305
 [<ffffffff81341b45>] qh_completions+0x368/0x4b9
 [<ffffffff8103e7a0>] ? __wake_up_common+0x4e/0x84
 [<ffffffff81343f70>] ehci_work+0x95/0x732
 [<ffffffff81045b53>] ? __wake_up+0x44/0x4d
 [<ffffffff81070490>] ? insert_work+0x8e/0x9b
 [<ffffffff81345f01>] ehci_irq+0x2be/0x420
 [<ffffffff8107071a>] ? __queue_work+0x3a/0x41
 [<ffffffff81049e43>] ? resched_cpu+0x6e/0x77
 [<ffffffff8107075d>] ? delayed_work_timer_fn+0x3c/0x3e
 [<ffffffff810b0e44>] ? __rcu_process_callbacks+0x7d/0x28a
 [<ffffffff8132e846>] usb_hcd_irq+0x3f/0x7b
 [<ffffffff810acd61>] handle_IRQ_event+0x60/0x121
 [<ffffffff810aeb8e>] handle_fasteoi_irq+0x8b/0xc7
 [<ffffffff81014625>] handle_irq+0x8b/0x96
 [<ffffffff81459c14>] do_IRQ+0x5c/0xbc
 [<ffffffff81012693>] ret_from_intr+0x0/0x11
2010-03-11 13:20:43 -08:00
Dan Williams a8c7bba19e serial: refactor MMSerialPort into a base class and an AT-capable serial port
For QCDM devices we want most of what MMSerialPort does, but not
the AT command handling stuff since the commands and responses
aren't AT commands nor are they even strings.  So convert everything
that MMSerialPort does into a GByteArray, and let MMAtSerialPort
handle the conversion to strings when necessary.
2010-02-20 14:55:10 -08:00
Dan Williams b1992f903b probe: add note about Onda MT503HS (rh #551376) 2010-01-18 23:22:02 -08:00
Dan Williams 0cc9c1731c probe: add CPIN request during the probing process (bgo #604369)
Some devices (ZTE MF628) respond to everything except CPIN? with
ERROR unless the PIN has been sent.  Since no known CDMA devices
support AT+CPIN, assume that devices that return a CPIN response
are GSM devices.
2010-01-17 17:37:41 -08:00
Dan Williams 8d42094608 zte: handle unsolicited messages during probe
This implements the same fixes that NetworkManager's 0.7 branch
implemented in commits f38ad328acfdc6ce29dd1380602c546b064161ae and
1235f71b20c92cded4abd976ccc5010649aae1a0.  Many ZTE devices will
spam the port with messages about waiting voicemail/SMS which buffer
up and cause the device to eventually crash if not suppressed.
2009-12-16 15:26:05 -08:00
Dan Williams aea0be5b9a nozomi: fix detection (lp:425312)
Nozomi devices aren't quite ready when the ports show up, so
we have to keep trying to open the port for a few seconds and
eventually it'll succeed.  Should really be fixed in the driver
(ie, don't create the ttys until they can actually be used) but
whatever.
2009-11-26 13:54:47 -08:00
Dan Williams 3193e97bb8 probe: fix probing on PPC due to missing cast
gcc will interpret the constant value as a uint32 but
the port's set_property() was taking it as a uint64.  Thus
the top 32 bits were probably garbage, and messed up
on big-endian architectures leading to random large
probe delays.
2009-11-17 14:16:24 -08:00
Dan Williams ed059286c5 bluetooth: physical device is a bit higher up the tree 2009-10-02 23:32:57 -07:00
Dan Williams e5441115a2 bluetooth: recognize rfcomm devices
Two hacks here:
1) rfcomm ports don't have an easily accessible driver name, so we just
match the parent's subsystem to 'bluetooth' and use that

2) libgudev doesn't seem be be able to get the rfcomm device's device file,
which would normally be /dev/rfcommX.  Oh well, we don't use the device file
yet anyway
2009-10-02 22:31:16 -07:00
Dan Williams 14e5c52f78 core: don't allow concurrent flashes on the same device
Previously, a few operations (like disable) could trigger a modem
flash in parallel with another flash.  That's wrong, don't allow
that.  At the same time, add in finer-grained error checking on
serial port speed operations, and fix a GSM generic bug that would
send the POWER_UP string on disable.
2009-09-08 17:34:04 -07:00
Bryan Duff 8a6cbdfb88 core: fix uninitialized variable 2009-08-26 11:28:14 -05:00