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.
This commit is contained in:
Dan Williams
2011-08-14 16:02:41 -05:00
parent 8ea17921e7
commit 8799f4da1f
3 changed files with 19 additions and 8 deletions

View File

@@ -49,6 +49,8 @@ get_level_for_capabilities (guint32 capabilities)
return 10;
if (capabilities & MM_PLUGIN_BASE_PORT_CAP_QCDM)
return 10;
if (capabilities & MM_PLUGIN_BASE_PORT_CAP_AT)
return 10;
return 0;
}

View File

@@ -716,15 +716,20 @@ real_handle_probe_response (MMPluginBase *self,
{
MMPluginBaseSupportsTaskPrivate *task_priv = MM_PLUGIN_BASE_SUPPORTS_TASK_GET_PRIVATE (task);
MMAtSerialPort *port = task_priv->probe_port;
gboolean ignore_error = FALSE;
/* Some modems (Huawei E160g) won't respond to +GCAP with no SIM, but
* will respond to ATI.
* will respond to ATI. Ignore the error and continue.
*/
if (response && strstr (response, "+CME ERROR:"))
ignore_error = TRUE;
if (response && strstr (response, "+CME ERROR:")) {
task_priv->probed_caps |= MM_PLUGIN_BASE_PORT_CAP_AT;
error = NULL;
}
if (error) {
/* If the modem returned a recognizable error, it can do AT commands */
if (error->domain == MM_MOBILE_ERROR)
task_priv->probed_caps |= MM_PLUGIN_BASE_PORT_CAP_AT;
if (error && !ignore_error) {
/* Only allow timeout errors in the initial AT+GCAP queries. If all AT+GCAP
* get timed out, assume it's not an AT port. */
if (g_error_matches (error, MM_SERIAL_ERROR, MM_SERIAL_ERROR_RESPONSE_TIMEOUT)) {
@@ -763,7 +768,8 @@ real_handle_probe_response (MMPluginBase *self,
/* Some modems don't respond to AT+GCAP, but often they put a
* GCAP-style response as a line in the ATI response.
*/
task_priv->probed_caps = parse_caps_gcap (response);
task_priv->probed_caps |= parse_caps_gcap (response);
task_priv->probed_caps |= MM_PLUGIN_BASE_PORT_CAP_AT;
break;
case PROBE_STATE_CAPS_CPIN:
/* Some devices (ZTE MF628/ONDA MT503HS for example) reply to
@@ -771,13 +777,15 @@ real_handle_probe_response (MMPluginBase *self,
* Since no known CDMA modems support AT+CPIN? we can consider the
* device a GSM device if it returns a non-error response to AT+CPIN?.
*/
task_priv->probed_caps = parse_caps_cpin (response);
task_priv->probed_caps |= parse_caps_cpin (response);
task_priv->probed_caps |= MM_PLUGIN_BASE_PORT_CAP_AT;
break;
case PROBE_STATE_CAPS_CGMM:
/* Some models (BUSlink SCWi275u) stick stupid stuff in the CGMM
* response but at least it allows us to identify them.
*/
task_priv->probed_caps = parse_caps_cgmm (response);
task_priv->probed_caps |= parse_caps_cgmm (response);
task_priv->probed_caps |= MM_PLUGIN_BASE_PORT_CAP_AT;
break;
case PROBE_STATE_VENDOR_CGMI:
case PROBE_STATE_VENDOR_GMI:

View File

@@ -38,6 +38,7 @@
#define MM_PLUGIN_BASE_PORT_CAP_IS856 0x0100 /* CDMA 3G EVDO rev 0 */
#define MM_PLUGIN_BASE_PORT_CAP_IS856_A 0x0200 /* CDMA 3G EVDO rev A */
#define MM_PLUGIN_BASE_PORT_CAP_QCDM 0x0400 /* QCDM-capable port */
#define MM_PLUGIN_BASE_PORT_CAP_AT 0x0800 /* Responds to AT commands */
#define MM_TYPE_PLUGIN_BASE_SUPPORTS_TASK (mm_plugin_base_supports_task_get_type ())
#define MM_PLUGIN_BASE_SUPPORTS_TASK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_PLUGIN_BASE_SUPPORTS_TASK, MMPluginBaseSupportsTask))