Make sure all pending work, if any, is torn down when closing
the port, since it's closed, and is likely going to get unreffed
soon and we don't want anything running after the port is dead.
If the modem for some reason returns ERROR for a +CPIN when it's
unlocked, and subsequent PIN post-unlock pin checks return READY,
just treat the modem as unlocked don't return the +CPIN error.
Change interface to take the number of GSM characters
rather than the number of octets, so that it is possible to
distinguish the 7-character and 8-character cases.
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.
If a port returns EAGAIN on write attempts, previously the code would
spin and attempt to resend the failed byte after send_delay
microseconds. This resulted in up to 3 second hard blocks in
the serial code when sending to ports that don't respond. While
in this blocking loop no other events or dbus commands could be
processed.
Instead, send each byte and reschedule sending the next byte in
send_delay microseconds, so that we can process other events in between
attempts to write to stupid ports.
This doesn't hugely decrease the amount of time that probing
requires, since we still need to probe all ports of the device
before exporting the modem to D-Bus, but it does let MM find
responsive ports much more quickly, and ensures that MM doesn't
block any D-Bus requests.
BUG=chrome-os-partner:2394
TEST=gmerge modemmanager, watch logs, see detected as Samsung modem, connect to AT&T network
Review URL: http://codereview.chromium.org/6614026
Patch from Jun Woo Lee <jw86.lee@samsung.com>.
Change-Id: I913628ff4a1cd16c8180e3c808644b0134e69e31
We want to enable unsolicited responses on secondary ports too,
so that if the modem only sends unsolicited responses on the ports
on which they were enabled, that we can get resposnes off the
secondary port when the primary port is connected. But we can't
always trust devices to actually send them on the secondary port,
so we enable the unsolicited responses on both the primary and
secondary ports just in case.
If the device only has one AT port that's being used for data and
thus we can't do more specific registration checking in MMGenericCdma
using AT commands, but generic registration checking was successful,
just use the less specific state.
Previously, an error would be returned when no AT port was available
even though less specific QCDM registration checking worked. That
was just stupid.
If the modem's IP Method changes after construction because the
modem's full capabilities were only discovered after it was created,
make sure the change notification gets emitted.