G1: Add an SMS quirk for CNMI mode
authorAndres Salomon <dilinger@collabora.co.uk>
Wed, 2 Sep 2009 23:35:40 +0000 (19:35 -0400)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 3 Sep 2009 02:06:03 +0000 (19:06 -0700)
The G1 doesn't support mode2, despite advertising it.

The G1 chokes w/ an "Error 303" when we specify NMI mode 2.  Adding a
quirk to drop that mode from the supported list (just use mode 1) allows
the G1 to properly deal with SMS.

drivers/atmodem/sms.c
drivers/atmodem/vendor.h
plugins/g1.c

index fc6c052..fc53480 100644 (file)
@@ -35,6 +35,7 @@
 #include <ofono/sms.h>
 #include "smsutil.h"
 #include "util.h"
+#include "vendor.h"
 
 #include "gatchat.h"
 #include "gatresult.h"
@@ -570,17 +571,25 @@ static inline gboolean append_cnmi_element(char *buf, int *len, int cap,
 }
 
 static gboolean build_cnmi_string(char *buf, int *cnmi_opts,
-                                       gboolean cnma_enabled)
+                                       struct sms_data *data)
 {
+       const char *mode;
        int len = sprintf(buf, "AT+CNMI=");
 
-       /* Mode doesn't matter, but sounds like 2 is the sanest option */
-       if (!append_cnmi_element(buf, &len, cnmi_opts[0], "2310", FALSE))
+       if (data->vendor == OFONO_VENDOR_HTC_G1)
+               /* The G1 advertises support for mode 2, but returns an error
+                * if we attempt to actually use it. */
+               mode = "1";
+       else
+               /* Sounds like 2 is the sanest mode */
+               mode = "2310";
+
+       if (!append_cnmi_element(buf, &len, cnmi_opts[0], mode, FALSE))
                return FALSE;
 
        /* Prefer to deliver SMS via +CMT if CNMA is supported */
        if (!append_cnmi_element(buf, &len, cnmi_opts[1],
-                                       cnma_enabled ? "21" : "1", FALSE))
+                                       data->cnma_enabled ? "21" : "1", FALSE))
                return FALSE;
 
        /* Always deliver CB via +CBM, otherwise don't deliver at all */
@@ -666,7 +675,7 @@ static void at_cnmi_query_cb(gboolean ok, GAtResult *result, gpointer user_data)
                        goto out;
        }
 
-       if (build_cnmi_string(buf, cnmi_opts, data->cnma_enabled))
+       if (build_cnmi_string(buf, cnmi_opts, data))
                supported = TRUE;
 
        if (data->cnma_enabled)
index ebf771b..9551a10 100644 (file)
@@ -21,4 +21,5 @@
 
 enum ofono_vendor {
        OFONO_VENDOR_GENERIC = 0,
+       OFONO_VENDOR_HTC_G1 = 1,
 };
index 30b9f94..c515575 100644 (file)
@@ -47,6 +47,8 @@
 #include <ofono/ussd.h>
 #include <ofono/voicecall.h>
 
+#include <drivers/atmodem/vendor.h>
+
 /* Supply our own syntax parser */
 
 enum G1_STATE_ {
@@ -234,6 +236,7 @@ static void g1_populate(struct ofono_modem *modem)
        ofono_call_meter_create(modem, 0, "atmodem", chat);
        ofono_call_barring_create(modem, 0, "atmodem", chat);
        ofono_ssn_create(modem, 0, "atmodem", chat);
+       ofono_sms_create(modem, OFONO_VENDOR_HTC_G1, "atmodem", chat);
        ofono_phonebook_create(modem, 0, "atmodem", chat);
 
        mw = ofono_message_waiting_create(modem);