From 46616a52d9fcdf77405b898d0006690fb1c40d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Hundeb=C3=B8ll?= Date: Wed, 10 Jul 2019 23:51:40 +0200 Subject: [PATCH] atmodem: sms: add quectel m95 quirks CNMA isn't mentioned in the m95 documentation, but trial'n'error has revealed some details: * the CSMS query returns the list (0,128) instead of a range * CNMA is enabled by setting 128 as CSMS service * once enabled, SMS deliveries are acked by sending AT+CNMA without a value setting Add m95 quirks to the atmodem driver, so that CNMA is correctly detected, configured, and used. --- drivers/atmodem/sms.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/atmodem/sms.c b/drivers/atmodem/sms.c index 2f869da6..c3c82afb 100644 --- a/drivers/atmodem/sms.c +++ b/drivers/atmodem/sms.c @@ -339,6 +339,9 @@ static inline void at_ack_delivery(struct ofono_sms *sms) case OFONO_VENDOR_GEMALTO: snprintf(buf, sizeof(buf), "AT+CNMA=1"); break; + case OFONO_VENDOR_QUECTEL_M95: + snprintf(buf, sizeof(buf), "AT+CNMA"); + break; default: snprintf(buf, sizeof(buf), "AT+CNMA=1,%d\r%s", data->cnma_ack_pdu_len, @@ -1238,7 +1241,7 @@ static void at_csms_status_cb(gboolean ok, GAtResult *result, if (!g_at_result_iter_next_number(&iter, &mo)) goto out; - if (service == 1) + if (service == 1 || service == 128) data->cnma_enabled = TRUE; if (mt == 1 && mo == 1) @@ -1269,10 +1272,10 @@ static void at_csms_query_cb(gboolean ok, GAtResult *result, { struct ofono_sms *sms = user_data; struct sms_data *data = ofono_sms_get_data(sms); - gboolean cnma_supported = FALSE; GAtResultIter iter; int status_min, status_max; char buf[128]; + int csms = 0; if (!ok) return at_sms_not_supported(sms); @@ -1285,14 +1288,25 @@ static void at_csms_query_cb(gboolean ok, GAtResult *result, if (!g_at_result_iter_open_list(&iter)) goto out; - while (g_at_result_iter_next_range(&iter, &status_min, &status_max)) + switch (data->vendor) { + case OFONO_VENDOR_QUECTEL_M95: + g_at_result_iter_next_number(&iter, &status_min); + g_at_result_iter_next_number(&iter, &status_max); if (status_min <= 1 && 1 <= status_max) - cnma_supported = TRUE; + csms = 128; + break; + default: + while (g_at_result_iter_next_range(&iter, &status_min, + &status_max)) + if (status_min <= 1 && 1 <= status_max) + csms = 1; + break; + } DBG("CSMS query parsed successfully"); out: - snprintf(buf, sizeof(buf), "AT+CSMS=%d", cnma_supported ? 1 : 0); + snprintf(buf, sizeof(buf), "AT+CSMS=%d", csms); g_at_chat_send(data->chat, buf, csms_prefix, at_csms_set_cb, sms, NULL); }