MM would appear to hang sometimes when writing to serial devices but
in reality was just retrying the write too many times. Make the
retry limit time-based so MM doesn't hang but times the attempt out
instead.
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.
at!pcstate is what Sierra CDMA modems use instead of AT+CFUN for
powering the radio on and off. It doesn't turn the modem off completely
like AT+CFUN=0 does for many GSM devices though, so it's quite a lot nicer.
Most AT command references allow modems to report SID 0, even though
SID 0 is not a valid SID and is not assigned to any CDMA network.
Some Sierra 5725 cards have been seen to report valid class and band
from the +CSS response but a SID 0. Accept SID 0 when at least one
other element of the +CSS response indicates that the modem has service.
Otherwise, report "no service" as before.
We only want to ignore connected/connecting/disconnecting states
and update the state based on registration for unsolicited
registration changes. Basically, when disconnecting, the modem
will be in DISCONNECTING state, but after the disconnect has finished
we want to update the modem's state based on the current
registration status. But the previous check for >= DISCONNECTING
would prevent that from happening, so we need a slightly more specific
check in update_enabled_state().
Have to fall back to the previous state if the enable/disable
operation fails since we cannot assume anything about the new
modem state when a failure occurs.
By decoupling the solicited registration callback from unsolicited
replies, we can be sure of the call flow and avoid issues where
unsolicited registration will be processed when an explicit
registration request is no longer in progress.
Also ups the timeout on CREG=0,, to 120 seconds because that
appears to trigger an internal scan on some of the 'hso' devices
that I have, and can take up to 60 or more seconds to complete
or fail.
If there's already a command in-progress don't try to send
another until the previous one has timed out. Also use
g_timeout_add_seconds() since precision doesn't really matter for
command timeouts.
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.
If the modem becomes invalid (it crashes and resets, for example)
the callback-info's modem_destroyed_cb() function will handle
cleanup. Buf if the callback-info's callback does more work than
just returning the result (like simple_state_machine) it could
double-schedule the callback. Don't let that happen.
We need better modem-removal handling, but this fixes a crash for
now.
0.7 hasn't used spaces for over a year, so this is a pretty safe
change. Some modems just don't like it.
0.7 commit to remove spaces:
commit 0265bfe52dcc93372aff6064e849044ccb72aa1e
Author: Dan Williams <dcbw@redhat.com>
Date: Fri Oct 24 15:15:06 2008 +0000
2008-10-24 Dan Williams <dcbw@redhat.com>
* src/nm-gsm-device.c
- (set_apn): remove erroneous spaces in AT+CGDCONT command (Jerone Young)
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.