Hi Lars,

On 8/31/20 8:24 AM, poesc...@lemonage.de wrote:
From: Lars Poeschel <poesc...@lemonage.de>

Currently AT+CGEREP=2,1 is sent in case we don't know what the modem
needs. (default case) Not all modems understand this. So, we first query
what the modem supports with AT+CGEREP=? and then use this information
to be nice to the modem. This way modems, like the Quectel M95 that do
only understand AT+CGEREP=1 do also work nicely.
---
  drivers/atmodem/gprs.c | 59 ++++++++++++++++++++++++++++++++++++++++--
  1 file changed, 57 insertions(+), 2 deletions(-)

diff --git a/drivers/atmodem/gprs.c b/drivers/atmodem/gprs.c
index 68470f11..443bdf77 100644
--- a/drivers/atmodem/gprs.c
+++ b/drivers/atmodem/gprs.c
@@ -45,6 +45,7 @@
  #define MAX_CONTEXTS 255
static const char *cgreg_prefix[] = { "+CGREG:", NULL };
+static const char *cgerep_prefix[] = { "+CGEREP:", NULL };
  static const char *cgdcont_prefix[] = { "+CGDCONT:", NULL };
  static const char *cgact_prefix[] = { "+CGACT:", NULL };
  static const char *none_prefix[] = { NULL };
@@ -648,6 +649,60 @@ static void gprs_initialized(gboolean ok, GAtResult 
*result, gpointer user_data)
        ofono_gprs_register(gprs);
  }
+static void at_cgerep_test_cb(gboolean ok, GAtResult *result,
+                               gpointer user_data)
+{
+       struct ofono_gprs *gprs = user_data;
+       struct gprs_data *gd = ofono_gprs_get_data(gprs);
+       GAtResultIter iter;
+       int min, max, arg1 = 0, arg2 = 0;
+       gboolean two_arguments = true;
+       char buf[20];
+
+       if (!ok)
+               return;
+
+       g_at_result_iter_init(&iter, result);
+
+       g_at_result_iter_next(&iter, "+CGEREP:");
+
+       if (!g_at_result_iter_open_list(&iter))
+               return;
+
+       while (g_at_result_iter_next_range(&iter, &min, &max)) {
+               if ((min <= 1) && (max >= 1))
+                       arg1 = 1;
+
+               if ((min <= 2) && (max >= 2))
+                       arg1 = 2;
+       }
+
+       if (!g_at_result_iter_close_list(&iter))
+               return;
+
+       if (!g_at_result_iter_open_list(&iter)) {
+               two_arguments = false;
+               goto out;
+       }
+
+       while (g_at_result_iter_next_range(&iter, &min, &max)) {
+               if (min <= 1 <= max)
+                       arg2 = 1;

drivers/atmodem/gprs.c: In function ‘at_cgerep_test_cb’:
drivers/atmodem/gprs.c:689:11: error: comparisons like ‘X<=Y<=Z’ do not have their mathematical meaning [-Werror=parentheses]

+       }
+
+       if (!g_at_result_iter_close_list(&iter))
+               return;
+
+out:
+       if (two_arguments)
+               sprintf(buf, "AT+CGEREP=%u,%u", arg1, arg2);
+       else
+               sprintf(buf, "AT+CGEREP=%u", arg1);
+
+       g_at_chat_send(gd->chat, buf, none_prefix, gprs_initialized, gprs,
+               NULL);
+}
+
  static void at_cgreg_test_cb(gboolean ok, GAtResult *result,
                                gpointer user_data)
  {
@@ -702,8 +757,8 @@ retry:
                        gprs_initialized, gprs, NULL);
                break;
        default:
-               g_at_chat_send(gd->chat, "AT+CGEREP=2,1", none_prefix,
-                       gprs_initialized, gprs, NULL);
+               g_at_chat_send(gd->chat, "AT+CGEREP=?", cgerep_prefix,
+                       at_cgerep_test_cb, gprs, NULL);
                break;
        }

Regards,
-Deenis
_______________________________________________
ofono mailing list -- ofono@ofono.org
To unsubscribe send an email to ofono-le...@ofono.org

Reply via email to