From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH 3/4] plugins: add a new driver for Quectel UC15 modules
Date: Tue, 24 Jun 2014 13:44:04 -0500 [thread overview]
Message-ID: <53A9C6F4.9030308@gmail.com> (raw)
In-Reply-To: <20140624183408.GK33006@rincewind.trouble.is>
[-- Attachment #1: Type: text/plain, Size: 4556 bytes --]
Hi Philip,
>
> I don't think there's any reason this needs to be there specifically. I
> probably put it there when I was debugging a USB-related reset problem.
> It can probably either go away (I've not done more than cursory testing
> with the modem connected to a UART - many things may be broken) or move
> to quectel_enable() (in which case the modem will behave a little bit
> more like one expects a modem to behave when connected to a UART).
Just wondering. We usually send &C0 fairly early in the process.
>
>> Any reason for checking that CFUN succeeded? If so, then it might be a
>> good idea to document that in comments / commit description.
>
> It turns out that AT+CFUN=0 -> AT+CFUN=1 transitions can return OK
> before the SIM is completely out of reset (temperature related). In
> that case, AT+CPIN will return any number of bizarre error codes (from
> SIM not inserted to memory failure). Trying again a bit later just
> works.
Should you be using at_util_sim_state_query_new for this? Or does
CFUN=1 needs to be sent again?
>
>> What if it failed? Are you relying on the core timeout mechanisms?
>
> It it doesn't behave as expected after retrying as often and waiting as
> long as this, it's unlikely to ever work. The core will timeout waiting
> for the driver to indicate the modem is powered. I would expect higher
> layers to see this as a hint that something may be wrong with powering
> up the modem.
>
> Can you suggest a better way to fail here?
I was thinking that the driver should notify the core as soon as it
determines that the hardware is inoperable. The core timeout handling
is really just a failsafe. But either way works...
>
>>> + if (!ok) {
>>> + if (data->enable_tries > MAX_RETRIES) {
>>> + g_at_chat_unref(data->aux);
>>> + data->aux = NULL;
>>> + g_at_chat_unref(data->modem);
>>> + data->modem = NULL;
>>> + ofono_modem_set_powered(modem, FALSE);
>>> + DBG("modem won't enable - giving up");
>>> + }
>>> + goto retry;
>>
>> Is the timer still running in case MAX_RETRIES is reached? In general
>> we prefer using single-shot timers and re-starting them if the command
>> fails. Certain commands might take several seconds to return on some
>> hardware.
>
> I am fairly confident it's safe: I ran into this failure case quite
> often during development and testing. I schedule quectel_start() in
> quectel_enable() and quectel_start() keeps rescheduling cfun_enable()
> until it succeeds or runs out of retries. I carefully check if the
> timer is still running everywhere I try to tear things down.
The thing is that running out of retries does not stop the timer. At
least I don't see g_source_remove for it here. Neither does the
quectel_start() function check for max retries.
>
> It's probably not too hard to rework this to use a single-shot timer.
>
That might make things a bit more reliable and readable as well.
>>> + /* Give the modem a bit more time to power up completely. */
>>> + data->enable_tries = 0;
>>> + data->enable_timer = g_timeout_add_seconds(RESET_DELAY,
>>> + quectel_start, modem);
>>
>> Is this delay always necessary? enable() is called in other situations
>> besides a hot-plugging...
>
> I mainly tested this with hot-plugging and not-so-hot-plugging (keeping
> the module powered but kicking its reset line) and it seems necessary in
> both cases. I haven't tested toggling enable in software much, but just
> doing AT+CFUN=0 ; AT+CFUN=1 in a loop shows a fair amount of variance
> even without touching power or reset. May be a hardware issue, but I've
> not talked to Quectel about it.
>
Just wondering whether upping the max retries and sending this command
right away might be 'better' for the non-hotplug case.
>>> + g_at_chat_send(data->aux, "AT+CFUN=0", NULL,
>>> + cfun_disable, modem, NULL);
>>
>> What behavior does this modem exhibit when using CFUN=0? Many devices
>> jump off the USB bus when this is sent. Hence why most drivers use CFUN=4.
>
> It stays on the bus but turns off the radio and goes into lower power
> mode. I have no strong feelings about using CFUN=4 instead, but
> intuitively that feels more like "offline" than "disabled". Am I
> missing some other distinction between set_online and enable/disable?
If the modem stays on the bus, using CFUN=0 is just fine. As I said,
most others jump off the bus, which makes using CFUN=0 not a good idea :)
Regards,
-Denis
next prev parent reply other threads:[~2014-06-24 18:44 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-24 10:08 [PATCH 0/4] Add a driver for Quectel UC15 modules Philip Paeps
2014-06-24 10:08 ` [PATCH 1/4] atmodem: add vendor Quectel Philip Paeps
2014-06-24 10:08 ` [PATCH 2/4] udevng: add setup logic for Quectel UC15 modules Philip Paeps
2014-06-24 10:08 ` [PATCH 3/4] plugins: add a new driver " Philip Paeps
2014-06-24 10:15 ` Philip Paeps
2014-06-24 17:41 ` Denis Kenzior
2014-06-24 18:34 ` Philip Paeps
2014-06-24 18:44 ` Denis Kenzior [this message]
2014-06-24 10:08 ` [PATCH 4/4] sim: query Quectel UC15 PIN retries with AT+QPINQ Philip Paeps
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=53A9C6F4.9030308@gmail.com \
--to=denkenz@gmail.com \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.