[PATCH] gprs-context: fix set ipv4 netmask for rilmodem
by Nishanth V
---
drivers/rilmodem/gprs-context.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/rilmodem/gprs-context.c b/drivers/rilmodem/gprs-context.c
index f0a687d..2bc6445 100644
--- a/drivers/rilmodem/gprs-context.c
+++ b/drivers/rilmodem/gprs-context.c
@@ -275,6 +275,7 @@ static void ril_setup_data_call_cb(struct ril_msg *message, gpointer user_data)
if (raw_addrs) {
char **ip_addrs = g_strsplit(raw_addrs, " ", 3);
char **split_ip_addr;
+ char *netmask;
if (ip_addrs == NULL || g_strv_length(ip_addrs) == 0) {
g_strfreev(ip_addrs);
@@ -292,6 +293,9 @@ static void ril_setup_data_call_cb(struct ril_msg *message, gpointer user_data)
* explicitly strip any prefix after calculating the netmask
*/
split_ip_addr = g_strsplit(ip_addrs[0], "/", 2);
+
+ netmask = ril_util_get_netmask(ip_addrs[0]);
+
g_strfreev(ip_addrs);
if (split_ip_addr == NULL ||
@@ -300,8 +304,7 @@ static void ril_setup_data_call_cb(struct ril_msg *message, gpointer user_data)
goto error_free;
}
- ofono_gprs_context_set_ipv4_netmask(gc,
- ril_util_get_netmask(split_ip_addr[0]));
+ ofono_gprs_context_set_ipv4_netmask(gc, netmask);
ofono_gprs_context_set_ipv4_address(gc, split_ip_addr[0], TRUE);
}
--
1.9.1
4 years, 12 months
[PATCH] wavecom: Re-work modem handling to improve stability
by Holger Hans Peter Freyther
From: Holger Hans Peter Freyther <holger(a)moiji-mobile.com>
This is the result of heavily looking at other plugins to
decide when and which objects to create.
* Use +WIND to get to know when the modem is ready
* Enable AT+CFUN=1/AT+CFUN=4 for online/offline handling
* Deal with GAtChat surviving a disable/enable cycle
---
plugins/wavecom.c | 248 +++++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 209 insertions(+), 39 deletions(-)
diff --git a/plugins/wavecom.c b/plugins/wavecom.c
index 7f24eae..cda5da0 100644
--- a/plugins/wavecom.c
+++ b/plugins/wavecom.c
@@ -47,35 +47,148 @@
#include <ofono/sms.h>
#include <ofono/ussd.h>
#include <ofono/voicecall.h>
+#include <ofono.h>
+#include <drivers/atmodem/atutil.h>
#include <drivers/atmodem/vendor.h>
+static const char *cfun_prefix[] = { "+CFUN:", NULL };
+static const char *wind_prefix[] = { "+WIND:", NULL };
+static const char *none_prefix[] = { NULL };
+
+struct wavecom_data {
+ GAtChat *chat;
+ int have_enabled;
+ gboolean have_sim;
+ gboolean have_sms;
+};
+
+static enum ofono_vendor vendor(struct ofono_modem *modem)
+{
+ const char *model;
+
+ model = ofono_modem_get_string(modem, "Model");
+
+ if (model && strcmp(model, "Q2XXX") == 0)
+ return OFONO_VENDOR_WAVECOM_Q2XXX;
+
+ return 0;
+}
+
+static void wavecom_debug(const char *str, void *user_data)
+{
+ const char *prefix = user_data;
+
+ DBG("%s%s", prefix, str);
+}
static int wavecom_probe(struct ofono_modem *modem)
{
+ struct wavecom_data *data;
+
+ DBG("%p: %s", modem, __func__);
+
+ data = g_try_new0(struct wavecom_data, 1);
+
+ if (data == NULL)
+ return -ENOMEM;
+
+ ofono_modem_set_data(modem, data);
+
return 0;
}
static void wavecom_remove(struct ofono_modem *modem)
{
+ struct wavecom_data *data = ofono_modem_get_data(modem);
+
+ DBG("%p: %s", modem, __func__);
+
+ ofono_modem_set_data(modem, NULL);
+ g_at_chat_unref(data->chat);
+ g_free(data);
+}
+
+static void rf_off_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+
+ ofono_modem_set_powered(modem, TRUE);
}
-static void wavecom_debug(const char *str, void *user_data)
+static void wind_notify(GAtResult *result, gpointer user_data)
{
- const char *prefix = user_data;
+ struct ofono_modem *modem = user_data;
+ struct wavecom_data *data = ofono_modem_get_data(modem);
+ struct ofono_sim *sim = __ofono_atom_find(OFONO_ATOM_TYPE_SIM, modem);
+ GAtResultIter iter;
+ int val;
+
+ DBG("%p: %s", modem, __func__);
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+WIND:"))
+ return;
+
+ if (!g_at_result_iter_next_number(&iter, &val))
+ return;
+
+ switch (val) {
+ case 3: /* ready to process AT commands */
+ if (!data->have_enabled) {
+ data->have_enabled = TRUE;
+ g_at_chat_send(data->chat, "AT+CFUN=4", none_prefix,
+ rf_off_cb, modem, NULL);
+ }
+ break;
+ case 0: /* sim removed */
+ data->have_sim = FALSE;
+ if (sim)
+ ofono_sim_inserted_notify(sim, FALSE);
+ break;
+ case 1: /* sim inserted */
+ data->have_sim = TRUE;
+ break;
+ case 16: /* SMS and SMS-CB services initialized */
+ if (sim)
+ ofono_sim_inserted_notify(sim, TRUE);
+ break;
+ case 7: /* service available for emergency call */
+ break;
+ case 8: /* network is lost */
+ case 10: /* reload status of SIM phonebook */
+ break;
+ case 11: /* checksum of SIM phoenbook */
+ case 13: /* rack has been detected closed */
+ break;
+ }
+}
- ofono_info("%s%s", prefix, str);
+static void wind_set(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ DBG("%s", __func__);
}
static int wavecom_enable(struct ofono_modem *modem)
{
+ struct wavecom_data *data;
GAtChat *chat;
GIOChannel *channel;
GAtSyntax *syntax;
const char *device;
GHashTable *options;
- DBG("%p", modem);
+ DBG("%p: %s", modem, __func__);
+
+ data = ofono_modem_get_data(modem);
+
+ if (data->chat) {
+ g_at_chat_cancel_all(data->chat);
+ g_at_chat_unregister_all(data->chat);
+ g_at_chat_unref(data->chat);
+ data->chat = NULL;
+ }
device = ofono_modem_get_string(modem, "Device");
if (device == NULL)
@@ -111,75 +224,130 @@ static int wavecom_enable(struct ofono_modem *modem)
if (chat == NULL)
return -ENOMEM;
+ g_at_chat_register(chat, "+WIND", wind_notify,
+ FALSE, modem, NULL);
+
g_at_chat_add_terminator(chat, "+CPIN:", 6, TRUE);
if (getenv("OFONO_AT_DEBUG"))
g_at_chat_set_debug(chat, wavecom_debug, "");
- ofono_modem_set_data(modem, chat);
+ data->chat = chat;
- return 0;
+ g_at_chat_send(chat, "AT+WIND=32767", wind_prefix,
+ wind_set, modem, NULL);
+
+ /* restart and wait for the +WIND */
+ data->have_enabled = FALSE;
+ data->have_sim = FALSE;
+ g_at_chat_send(chat, "AT+CFUN=1,1", none_prefix,
+ NULL, modem, NULL);
+ return -EINPROGRESS;
+}
+
+static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct wavecom_data *data = ofono_modem_get_data(modem);
+
+ DBG("%p: %s", modem, __func__);
+
+ g_at_chat_unref(data->chat);
+ data->chat = NULL;
+
+ if (ok)
+ ofono_modem_set_powered(modem, FALSE);
+ else
+ ofono_error("%p power down has failed!", modem);
}
static int wavecom_disable(struct ofono_modem *modem)
{
- GAtChat *chat = ofono_modem_get_data(modem);
+ struct wavecom_data *data = ofono_modem_get_data(modem);
- DBG("%p", modem);
+ DBG("%p: %s", modem, __func__);
- ofono_modem_set_data(modem, NULL);
+ g_at_chat_cancel_all(data->chat);
+ g_at_chat_unregister_all(data->chat);
- g_at_chat_unref(chat);
+ g_at_chat_send(data->chat, "AT+CFUN=0", cfun_prefix,
+ cfun_disable, modem, NULL);
- return 0;
+ return -EINPROGRESS;
+}
+
+static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_modem_online_cb_t cb = cbd->cb;
+ struct ofono_error error;
+
+ decode_at_error(&error, g_at_result_final_response(result));
+ cb(&error, cbd->data);
+}
+
+static void wavecom_set_online(struct ofono_modem *modem, ofono_bool_t online,
+ ofono_modem_online_cb_t cb, void *user_data)
+{
+ struct wavecom_data *data = ofono_modem_get_data(modem);
+ struct cb_data *cbd = cb_data_new(cb, user_data);
+ char const *command = online ? "AT+CFUN=1,0" : "AT+CFUN=4";
+
+ DBG("%p: %s %d", modem, __func__, online);
+
+ if (g_at_chat_send(data->chat, command, cfun_prefix, set_online_cb,
+ cbd, g_free) > 0)
+ return;
+
+ CALLBACK_WITH_FAILURE(cb, cbd->data);
+
+ g_free(cbd);
}
static void wavecom_pre_sim(struct ofono_modem *modem)
{
- GAtChat *chat = ofono_modem_get_data(modem);
- const char *model;
- enum ofono_vendor vendor = 0;
+ struct wavecom_data *data = ofono_modem_get_data(modem);
struct ofono_sim *sim;
- DBG("%p", modem);
-
- model = ofono_modem_get_string(modem, "Model");
- if (model && strcmp(model, "Q2XXX") == 0)
- vendor = OFONO_VENDOR_WAVECOM_Q2XXX;
+ DBG("%p: %s", modem, __func__);
- ofono_devinfo_create(modem, 0, "atmodem", chat);
- sim = ofono_sim_create(modem, vendor, "atmodem", chat);
- ofono_voicecall_create(modem, 0, "atmodem", chat);
+ ofono_devinfo_create(modem, 0, "atmodem", data->chat);
+ sim = ofono_sim_create(modem, vendor(modem), "atmodem", data->chat);
+ ofono_voicecall_create(modem, 0, "atmodem", data->chat);
- if (vendor == OFONO_VENDOR_WAVECOM_Q2XXX)
+ if (sim && data->have_sim == TRUE) {
+ data->have_sim = FALSE;
ofono_sim_inserted_notify(sim, TRUE);
+ }
}
static void wavecom_post_sim(struct ofono_modem *modem)
{
- GAtChat *chat = ofono_modem_get_data(modem);
- struct ofono_message_waiting *mw;
- const char *model;
- enum ofono_vendor vendor = 0;
+ DBG("%p: %s", modem, __func__);
- DBG("%p", modem);
+ /* TODO: Initialize GPRS support if we have an aux line */
+}
- model = ofono_modem_get_string(modem, "Model");
- if (model && strcmp(model, "Q2XXX") == 0)
- vendor = OFONO_VENDOR_WAVECOM_Q2XXX;
+static void wavecom_post_online(struct ofono_modem *modem)
+{
+ struct ofono_message_waiting *mw;
+ struct wavecom_data *data = ofono_modem_get_data(modem);
- ofono_ussd_create(modem, 0, "atmodem", chat);
- ofono_call_forwarding_create(modem, 0, "atmodem", chat);
- ofono_call_settings_create(modem, 0, "atmodem", chat);
- ofono_netreg_create(modem, 0, "atmodem", chat);
- ofono_call_meter_create(modem, 0, "atmodem", chat);
- ofono_call_barring_create(modem, 0, "atmodem", chat);
- ofono_sms_create(modem, vendor, "atmodem", chat);
- ofono_phonebook_create(modem, 0, "atmodem", chat);
+ DBG("%p: %s", modem, __func__);
+ ofono_ussd_create(modem, 0, "atmodem", data->chat);
+ ofono_call_forwarding_create(modem, 0, "atmodem", data->chat);
+ ofono_call_settings_create(modem, 0, "atmodem", data->chat);
+ ofono_netreg_create(modem, 0, "atmodem", data->chat);
+ ofono_call_meter_create(modem, 0, "atmodem", data->chat);
+ ofono_call_barring_create(modem, 0, "atmodem", data->chat);
mw = ofono_message_waiting_create(modem);
+
if (mw)
ofono_message_waiting_register(mw);
+
+ ofono_phonebook_create(modem, 0, "atmodem", data->chat);
+ ofono_sms_create(modem, vendor(modem), "atmodem", data->chat);
}
static struct ofono_modem_driver wavecom_driver = {
@@ -188,8 +356,10 @@ static struct ofono_modem_driver wavecom_driver = {
.remove = wavecom_remove,
.enable = wavecom_enable,
.disable = wavecom_disable,
+ .set_online = wavecom_set_online,
.pre_sim = wavecom_pre_sim,
.post_sim = wavecom_post_sim,
+ .post_online = wavecom_post_online,
};
static int wavecom_init(void)
--
2.6.3
5 years
[PATCH] src/log.c: Don't crash when addr2line output contains no newline
by Holger Hans Peter Freyther
From: Harald Welte <hwelte(a)sysmocom.de>
---
src/log.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/log.c b/src/log.c
index 6331b0d..42a2ec1 100644
--- a/src/log.c
+++ b/src/log.c
@@ -192,6 +192,8 @@ static void print_backtrace(unsigned int offset)
buf[len] = '\0';
pos = strchr(buf, '\n');
+ if (!pos)
+ break;
*pos++ = '\0';
if (strcmp(buf, "??") == 0) {
--
2.6.3
5 years
[PATCH 1/3] drivers/isimodem: fix GCC 6.0 errors
by Kuba Pawlak
From: Kuba Pawlak <kuba.t.pawlak(a)gmail.com>
-Werror=misleading-indentation
---
drivers/isimodem/voicecall.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/isimodem/voicecall.c b/drivers/isimodem/voicecall.c
index 460e34e519a2c8bf5930f421b14e1c974cd49d63..d6d4ea37d66a646be305f8aefa6879b4cd8f0bab 100644
--- a/drivers/isimodem/voicecall.c
+++ b/drivers/isimodem/voicecall.c
@@ -1715,7 +1715,7 @@ static void isi_release_specific(struct ofono_voicecall *ovc, int id,
if ((status->mode_info & CALL_MODE_ORIGINATOR))
cause = CALL_CAUSE_BUSY_USER_REQUEST;
- break;
+ break;
}
isi_call_release_req(ovc, id, CALL_CAUSE_TYPE_CLIENT, cause, cb, data);
--
1.9.3
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
5 years
Bluetooth audio not routed to pulseaudio
by Gokul Krishnan
Hi,
I am trying to setup a dialer application that supports Bluetooth HFP. I am able to place calls and get it connected but when the call is answered, audio is not being routed to pulseaudio and no sound output is heard from the speakers. I am using ofono version 1.15 along with Bluez5 and Pulseaudio 6. Attached below are the journalctl logs from ofono, bluetoothd and pulseaudio when a phone is connected and a call is answered and audio is supposed to be heard.
Log from ofono
imx6qsabresd ofonod[365]: Service level connection established
imx6qsabresd ofonod[365]: Reject SCO: Agent not registered
imx6qsabresd ofonod[365]: Reject SCO: Agent not registered
imx6qsabresd ofonod[365]: Reject SCO: Agent not registered
imx6qsabresd ofonod[365]: Reject SCO: Agent not registered
imx6qsabresd ofonod[365]: Reject SCO: Agent not registered
Log from bluetooth
imx6qsabresd bluetoothd[322]: Endpoint registered: sender=:1.28 path=/MediaEndpoint/A2DPSource
imx6qsabresd bluetoothd[322]: Endpoint registered: sender=:1.28 path=/MediaEndpoint/A2DPSink
imx6qsabresd bluetoothd[322]: GAP and GATT are mandatory
imx6qsabresd bluetoothd[322]: gap-gatt-profile profile probe failed for XX:XX:XX:XX:XX:XX
imx6qsabresd bluetoothd[322]: Can't open input device: No such file or directory (2)
imx6qsabresd bluetoothd[322]: AVRCP: failed to init uinput for XX:XX:XX:XX:XX:XX
imx6qsabresd bluetoothd[322]: Endpoint unregistered: sender=:1.28 path=/MediaEndpoint/A2DPSource
imx6qsabresd bluetoothd[322]: Endpoint unregistered: sender=:1.28 path=/MediaEndpoint/A2DPSink
Log from pulseaudio
imx6qsabresd pulseaudio[765]: D: [pulseaudio] backend-native.c: Registering Profile /Profile/HSPAGProfile
imx6qsabresd pulseaudio[765]: D: [pulseaudio] protocol-native.c: Protocol version: remote 30, local 30
imx6qsabresd pulseaudio[765]: D: [pulseaudio] protocol-native.c: SHM possible: no
imx6qsabresd pulseaudio[765]: D: [pulseaudio] protocol-native.c: Negotiated SHM: no
imx6qsabresd pulseaudio[765]: D: [pulseaudio] protocol-native.c: Disabling srbchannel, reason: Must be enabled by module parameter
imx6qsabresd pulseaudio[765]: D: [pulseaudio] bluez5-util.c: Properties changed in adapter /org/bluez/hci0
imx6qsabresd pulseaudio[765]: D: [pulseaudio] bluez5-util.c: Properties changed in adapter /org/bluez/hci0
imx6qsabresd pulseaudio[765]: D: [pulseaudio] bluez5-util.c: Properties changed in adapter /org/bluez/hci0
imx6qsabresd pulseaudio[765]: D: [pulseaudio] bluez5-util.c: Properties changed in adapter /org/bluez/hci0
imx6qsabresd pulseaudio[765]: D: [pulseaudio] bluez5-util.c: Properties changed in adapter /org/bluez/hci0
I have also noticed that the .HandfreeAgent interface of ofono is not being created on dbus. Is this somehow related ? Do i need to call some additional dbus methods so that the audio is routed ?
Thanks & Regards
Gokul Krishnan
Senior Engineer - Transportation Business Unit
TATA ELXSI
Techno Park Campus, Kariyavattom, Trivandrum Kerala 695 581
www.tataelxsi.com<http://www.tataelxsi.com>
5 years
[PATCH] wavecom: Re-work modem handling to improve stability
by Holger Hans Peter Freyther
From: Holger Hans Peter Freyther <holger(a)moiji-mobile.com>
This is the result of heavily looking at other plugins to
decide when and which objects to create.
* Use +WIND to get to know when the modem is ready
* Enable AT+CFUN=1/AT+CFUN=4 for online/offline handling
* Deal with GAtChat surviving a disable/enable cycle
---
plugins/wavecom.c | 248 +++++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 209 insertions(+), 39 deletions(-)
diff --git a/plugins/wavecom.c b/plugins/wavecom.c
index 7f24eae..c3b0b52 100644
--- a/plugins/wavecom.c
+++ b/plugins/wavecom.c
@@ -47,35 +47,145 @@
#include <ofono/sms.h>
#include <ofono/ussd.h>
#include <ofono/voicecall.h>
+#include <ofono.h>
+#include <drivers/atmodem/atutil.h>
#include <drivers/atmodem/vendor.h>
+static const char *cfun_prefix[] = { "+CFUN:", NULL };
+static const char *wind_prefix[] = { "+WIND:", NULL };
+static const char *none_prefix[] = { NULL };
+
+struct wavecom_data {
+ GAtChat *chat;
+ int have_enabled;
+ gboolean have_sim;
+ gboolean have_sms;
+};
+
+static enum ofono_vendor vendor(struct ofono_modem *modem)
+{
+ const char *model;
+
+ model = ofono_modem_get_string(modem, "Model");
+ if (model && strcmp(model, "Q2XXX") == 0)
+ return OFONO_VENDOR_WAVECOM_Q2XXX;
+ return 0;
+}
+
+static void wavecom_debug(const char *str, void *user_data)
+{
+ const char *prefix = user_data;
+
+ ofono_info("%s%s", prefix, str);
+}
static int wavecom_probe(struct ofono_modem *modem)
{
+ struct wavecom_data *data;
+
+ ofono_info("%p: %s", modem, __func__);
+
+ data = g_try_new0(struct wavecom_data, 1);
+ if (data == NULL)
+ return -ENOMEM;
+
+ ofono_modem_set_data(modem, data);
+
return 0;
}
static void wavecom_remove(struct ofono_modem *modem)
{
+ struct wavecom_data *data = ofono_modem_get_data(modem);
+
+ ofono_info("%p: %s", modem, __func__);
+
+ ofono_modem_set_data(modem, NULL);
+ g_at_chat_unref(data->chat);
+ g_free(data);
}
-static void wavecom_debug(const char *str, void *user_data)
+static void rf_off_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
- const char *prefix = user_data;
+ struct ofono_modem *modem = user_data;
- ofono_info("%s%s", prefix, str);
+ ofono_modem_set_powered(modem, TRUE);
+}
+
+static void wind_notify(GAtResult *result, gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct wavecom_data *data = ofono_modem_get_data(modem);
+ struct ofono_sim *sim = __ofono_atom_find(OFONO_ATOM_TYPE_SIM, modem);
+ GAtResultIter iter;
+ int val;
+
+ ofono_info("%p: %s", modem, __func__);
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+WIND:"))
+ return;
+
+ if (!g_at_result_iter_next_number(&iter, &val))
+ return;
+
+ switch (val) {
+ case 3: /* ready to process AT commands */
+ if (!data->have_enabled) {
+ data->have_enabled = TRUE;
+ g_at_chat_send(data->chat, "AT+CFUN=4", none_prefix, rf_off_cb, modem, NULL);
+ }
+ break;
+ case 0: /* sim removed */
+ data->have_sim = FALSE;
+ if (sim)
+ ofono_sim_inserted_notify(sim, FALSE);
+ break;
+ case 1: /* sim inserted */
+ data->have_sim = TRUE;
+ break;
+ case 16: /* SMS and SMS-CB services initialized */
+ if (sim)
+ ofono_sim_inserted_notify(sim, TRUE);
+ break;
+ case 7: /* service available for emergency call */
+ break;
+ case 8: /* network is lost */
+ case 10: /* reload status of SIM phonebook */
+ break;
+ case 11: /* checksum of SIM phoenbook */
+ case 13: /* rack has been detected closed */
+ break;
+ }
+}
+
+
+static void wind_set(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ ofono_info("%s", __func__);
}
static int wavecom_enable(struct ofono_modem *modem)
{
+ struct wavecom_data *data;
GAtChat *chat;
GIOChannel *channel;
GAtSyntax *syntax;
const char *device;
GHashTable *options;
- DBG("%p", modem);
+ ofono_info("%p: %s", modem, __func__);
+
+ data = ofono_modem_get_data(modem);
+
+ if (data->chat) {
+ g_at_chat_cancel_all(data->chat);
+ g_at_chat_unregister_all(data->chat);
+ g_at_chat_unref(data->chat);
+ data->chat = NULL;
+ }
device = ofono_modem_get_string(modem, "Device");
if (device == NULL)
@@ -111,75 +221,133 @@ static int wavecom_enable(struct ofono_modem *modem)
if (chat == NULL)
return -ENOMEM;
+ g_at_chat_register(chat, "+WIND", wind_notify,
+ FALSE, modem, NULL);
+
g_at_chat_add_terminator(chat, "+CPIN:", 6, TRUE);
if (getenv("OFONO_AT_DEBUG"))
g_at_chat_set_debug(chat, wavecom_debug, "");
- ofono_modem_set_data(modem, chat);
+ data->chat = chat;
- return 0;
+ g_at_chat_send(chat, "AT+WIND=32767", wind_prefix,
+ wind_set, modem, NULL);
+
+ /* restart and wait for the +WIND */
+ data->have_enabled = FALSE;
+ data->have_sim = FALSE;
+ g_at_chat_send(chat, "AT+CFUN=1,1", none_prefix,
+ NULL, modem, NULL);
+ return -EINPROGRESS;
+}
+
+static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct wavecom_data *data = ofono_modem_get_data(modem);
+
+ ofono_info("%p: %s", modem, __func__);
+
+ g_at_chat_unref(data->chat);
+ data->chat = NULL;
+
+ if (ok)
+ ofono_modem_set_powered(modem, FALSE);
+ else
+ ofono_error("%p power down has failed!", modem);
}
static int wavecom_disable(struct ofono_modem *modem)
{
- GAtChat *chat = ofono_modem_get_data(modem);
+ struct wavecom_data *data = ofono_modem_get_data(modem);
- DBG("%p", modem);
+ ofono_info("%p: %s", modem, __func__);
- ofono_modem_set_data(modem, NULL);
+ g_at_chat_cancel_all(data->chat);
+ g_at_chat_unregister_all(data->chat);
- g_at_chat_unref(chat);
+ g_at_chat_send(data->chat, "AT+CFUN=0", cfun_prefix,
+ cfun_disable, modem, NULL);
- return 0;
+ return -EINPROGRESS;
+}
+
+static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_modem_online_cb_t cb = cbd->cb;
+ struct ofono_error error;
+
+ decode_at_error(&error, g_at_result_final_response(result));
+ cb(&error, cbd->data);
+}
+
+static void wavecom_set_online(struct ofono_modem *modem, ofono_bool_t online,
+ ofono_modem_online_cb_t cb, void *user_data)
+{
+ struct wavecom_data *data = ofono_modem_get_data(modem);
+ struct cb_data *cbd = cb_data_new(cb, user_data);
+ char const *command = online ? "AT+CFUN=1,0" : "AT+CFUN=4";
+
+ ofono_info("%p: %s %d", modem, __func__, online);
+
+ if (g_at_chat_send(data->chat, command, cfun_prefix, set_online_cb,
+ cbd, g_free) > 0)
+ return;
+
+ CALLBACK_WITH_FAILURE(cb, cbd->data);
+
+ g_free(cbd);
}
static void wavecom_pre_sim(struct ofono_modem *modem)
{
- GAtChat *chat = ofono_modem_get_data(modem);
- const char *model;
- enum ofono_vendor vendor = 0;
+ struct wavecom_data *data = ofono_modem_get_data(modem);
struct ofono_sim *sim;
- DBG("%p", modem);
-
- model = ofono_modem_get_string(modem, "Model");
- if (model && strcmp(model, "Q2XXX") == 0)
- vendor = OFONO_VENDOR_WAVECOM_Q2XXX;
+ ofono_info("%p: %s", modem, __func__);
- ofono_devinfo_create(modem, 0, "atmodem", chat);
- sim = ofono_sim_create(modem, vendor, "atmodem", chat);
- ofono_voicecall_create(modem, 0, "atmodem", chat);
+ ofono_devinfo_create(modem, 0, "atmodem", data->chat);
+ sim = ofono_sim_create(modem, vendor(modem), "atmodem", data->chat);
+ ofono_voicecall_create(modem, 0, "atmodem", data->chat);
- if (vendor == OFONO_VENDOR_WAVECOM_Q2XXX)
+ if (sim && data->have_sim == TRUE) {
+ data->have_sim = FALSE;
ofono_sim_inserted_notify(sim, TRUE);
+ }
}
static void wavecom_post_sim(struct ofono_modem *modem)
{
- GAtChat *chat = ofono_modem_get_data(modem);
- struct ofono_message_waiting *mw;
- const char *model;
- enum ofono_vendor vendor = 0;
+ ofono_info("%p: %s", modem, __func__);
- DBG("%p", modem);
+ /* TODO: Initialize GPRS support if we have an aux line */
+ /*
+ * FIXME: This only seems to be called when no immediate
+ * enabled -> online change is called
+ */
+}
- model = ofono_modem_get_string(modem, "Model");
- if (model && strcmp(model, "Q2XXX") == 0)
- vendor = OFONO_VENDOR_WAVECOM_Q2XXX;
+static void wavecom_post_online(struct ofono_modem *modem)
+{
+ struct ofono_message_waiting *mw;
+ struct wavecom_data *data = ofono_modem_get_data(modem);
- ofono_ussd_create(modem, 0, "atmodem", chat);
- ofono_call_forwarding_create(modem, 0, "atmodem", chat);
- ofono_call_settings_create(modem, 0, "atmodem", chat);
- ofono_netreg_create(modem, 0, "atmodem", chat);
- ofono_call_meter_create(modem, 0, "atmodem", chat);
- ofono_call_barring_create(modem, 0, "atmodem", chat);
- ofono_sms_create(modem, vendor, "atmodem", chat);
- ofono_phonebook_create(modem, 0, "atmodem", chat);
+ ofono_info("%p: %s", modem, __func__);
+ ofono_ussd_create(modem, 0, "atmodem", data->chat);
+ ofono_call_forwarding_create(modem, 0, "atmodem", data->chat);
+ ofono_call_settings_create(modem, 0, "atmodem", data->chat);
+ ofono_netreg_create(modem, 0, "atmodem", data->chat);
+ ofono_call_meter_create(modem, 0, "atmodem", data->chat);
+ ofono_call_barring_create(modem, 0, "atmodem", data->chat);
mw = ofono_message_waiting_create(modem);
if (mw)
ofono_message_waiting_register(mw);
+
+ ofono_phonebook_create(modem, 0, "atmodem", data->chat);
+ ofono_sms_create(modem, vendor(modem), "atmodem", data->chat);
}
static struct ofono_modem_driver wavecom_driver = {
@@ -188,8 +356,10 @@ static struct ofono_modem_driver wavecom_driver = {
.remove = wavecom_remove,
.enable = wavecom_enable,
.disable = wavecom_disable,
+ .set_online = wavecom_set_online,
.pre_sim = wavecom_pre_sim,
.post_sim = wavecom_post_sim,
+ .post_online = wavecom_post_online,
};
static int wavecom_init(void)
--
2.6.3
5 years
[PATCH] radio-settings: Add RAT mode to ofono storage
by Samrat Guha Niyogi
From: Anirudh Gargi <anirudh.gargi(a)intel.com>
---
src/radio-settings.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 106 insertions(+), 2 deletions(-)
diff --git a/src/radio-settings.c b/src/radio-settings.c
index bc1c691..33d498a 100644
--- a/src/radio-settings.c
+++ b/src/radio-settings.c
@@ -33,7 +33,10 @@
#include "ofono.h"
#include "common.h"
+#include "storage.h"
+#define SETTINGS_STORE "radiosetting"
+#define SETTINGS_GROUP "Settings"
#define RADIO_SETTINGS_FLAG_CACHED 0x1
static GSList *g_drivers = NULL;
@@ -50,6 +53,8 @@ struct ofono_radio_settings {
enum ofono_radio_band_umts pending_band_umts;
ofono_bool_t fast_dormancy_pending;
uint32_t available_rats;
+ GKeyFile *settings;
+ char *imsi;
const struct ofono_radio_settings_driver *driver;
void *driver_data;
struct ofono_atom *atom;
@@ -574,6 +579,14 @@ static DBusMessage *radio_set_property(DBusConnection *conn, DBusMessage *msg,
rs->driver->set_rat_mode(rs, mode, radio_mode_set_callback, rs);
+ if (rs->settings) {
+ const char *mode_str;
+ mode_str = radio_access_mode_to_string(mode);
+ g_key_file_set_string(rs->settings, SETTINGS_GROUP,
+ "TechnologyPreference", mode_str);
+ storage_sync(rs->imsi, SETTINGS_STORE, rs->settings);
+ }
+
return NULL;
} else if (g_strcmp0(property, "GsmBand") == 0) {
const char *value;
@@ -697,6 +710,14 @@ static void radio_settings_unregister(struct ofono_atom *atom)
ofono_modem_remove_interface(modem, OFONO_RADIO_SETTINGS_INTERFACE);
g_dbus_unregister_interface(conn, path, OFONO_RADIO_SETTINGS_INTERFACE);
+
+ if (rs->settings) {
+ storage_close(rs->imsi, SETTINGS_STORE, rs->settings, TRUE);
+
+ g_free(rs->imsi);
+ rs->imsi = NULL;
+ rs->settings = NULL;
+ }
}
static void radio_settings_remove(struct ofono_atom *atom)
@@ -750,7 +771,7 @@ struct ofono_radio_settings *ofono_radio_settings_create(struct ofono_modem *mod
return rs;
}
-void ofono_radio_settings_register(struct ofono_radio_settings *rs)
+static void ofono_radio_finish_register(struct ofono_radio_settings *rs)
{
DBusConnection *conn = ofono_dbus_get_connection();
struct ofono_modem *modem = __ofono_atom_get_modem(rs->atom);
@@ -762,14 +783,97 @@ void ofono_radio_settings_register(struct ofono_radio_settings *rs)
NULL, rs, NULL)) {
ofono_error("Could not create %s interface",
OFONO_RADIO_SETTINGS_INTERFACE);
-
return;
}
ofono_modem_add_interface(modem, OFONO_RADIO_SETTINGS_INTERFACE);
+
__ofono_atom_register(rs->atom, radio_settings_unregister);
}
+static void radio_mode_set_callback_at_reg(const struct ofono_error *error, void *data)
+{
+ struct ofono_radio_settings *rs = data;
+
+ if (error->type != OFONO_ERROR_TYPE_NO_ERROR)
+ DBG("Error setting radio access mode register time");
+
+ /*
+ * Continue with atom register even if request fail at modem
+ */
+ ofono_radio_finish_register(rs);
+}
+
+static void radio_load_settings(struct ofono_radio_settings *rs,
+ const char *imsi)
+{
+ GError *error;
+ char *strmode;
+
+ rs->imsi = g_strdup(imsi);
+ rs->settings = storage_open(rs->imsi, SETTINGS_STORE);
+
+ /*
+ * If no settings present or error; Set default.
+ * Default RAT mode: ANY (LTE > UMTS > GSM)
+ */
+
+ if (rs->settings == NULL) {
+ DBG("radiosetting storage open failed");
+ rs->mode = OFONO_RADIO_ACCESS_MODE_ANY;
+ return;
+ }
+
+ error = NULL;
+ strmode = g_key_file_get_string(rs->settings, SETTINGS_GROUP,
+ "TechnologyPreference", &error);
+
+ if (error) {
+ g_error_free(error);
+ goto setdefault;
+ }
+
+ if (radio_access_mode_from_string(strmode, &rs->mode) == FALSE) {
+ DBG("Invalid rat mode in storage; Setting default");
+ goto setdefault;
+ }
+
+ g_free(strmode);
+ return;
+
+setdefault:
+ rs->mode = OFONO_RADIO_ACCESS_MODE_ANY;
+ g_key_file_set_string(rs->settings, SETTINGS_GROUP,
+ "TechnologyPreference", "any");
+ storage_sync(rs->imsi, SETTINGS_STORE, rs->settings);
+ g_free(strmode);
+}
+
+void ofono_radio_settings_register(struct ofono_radio_settings *rs)
+{
+ struct ofono_modem *modem = __ofono_atom_get_modem(rs->atom);
+ struct ofono_sim *sim = __ofono_atom_find(OFONO_ATOM_TYPE_SIM, modem);
+
+ if (sim == NULL)
+ goto finish;
+
+ radio_load_settings(rs, ofono_sim_get_imsi(sim));
+
+ if (rs->driver->set_rat_mode == NULL)
+ goto finish;
+
+ /*
+ * Diff callback used. No need of using DBUS pending concept.
+ * As its atom registration time - no DBUS clients.
+ */
+ rs->driver->set_rat_mode(rs, rs->mode,
+ radio_mode_set_callback_at_reg, rs);
+ return;
+
+finish:
+ ofono_radio_finish_register(rs);
+}
+
void ofono_radio_settings_remove(struct ofono_radio_settings *rs)
{
__ofono_atom_free(rs->atom);
--
1.9.1
5 years
[PATCH] src/log.c: Don't crash when addr2line output contains no newline
by Holger Hans Peter Freyther
From: Harald Welte <hwelte(a)sysmocom.de>
Signed-off-by: Holger Hans Peter Freyther <hfreyther(a)sysmocom.de>
---
src/log.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/log.c b/src/log.c
index 6331b0d..42a2ec1 100644
--- a/src/log.c
+++ b/src/log.c
@@ -192,6 +192,8 @@ static void print_backtrace(unsigned int offset)
buf[len] = '\0';
pos = strchr(buf, '\n');
+ if (!pos)
+ break;
*pos++ = '\0';
if (strcmp(buf, "??") == 0) {
--
2.6.3
5 years
[PATCH] gprs: Deactivate old contexts on attach
by Alfonso Sanchez-Beato
In some cases it is possible that a context is opened after a detach
event has been received, and right before an attach, depending on the
modem. We make sure that those contexts are removed to keep
consistency.
---
src/gprs.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/gprs.c b/src/gprs.c
index 3acb412..3a4a819 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -1624,6 +1624,12 @@ static void gprs_attached_update(struct ofono_gprs *gprs)
release_active_contexts(gprs);
gprs->bearer = -1;
} else if (have_active_contexts(gprs) == TRUE) {
+ /*
+ * Some times the context activates after a detach event and
+ * right before an attach. We close it to avoid unexpected open
+ * contexts.
+ */
+ release_active_contexts(gprs);
gprs->flags |= GPRS_FLAG_ATTACHED_UPDATE;
return;
}
--
2.5.0
5 years
[PATCH] hfp: Handle +CCWA at HFP connection setup
by Kuba Pawlak
Some phones with an active and waiting call at the time of HFP SLC
establishment, may send call waiting notification before all calls
are synchronized. This will lead to call Id mismatch because call
object is created with assumed Id 1 and not Id assigned by the phone.
In example below waiting call is created with Id 1 but in AT+CLCC
this phone returns active call as call with Id 1, and waiting as 2.
< \r\n+CCWA: "+1234567890",145\r\n
< \r\n+CIEV: 2,1\r\n
drivers/hfpmodem/voicecall.c:ccwa_notify() ccwa_notify: +1234567890 145 0
src/voicecall.c:ofono_voicecall_notify() Got a voicecall event, status: 5, id: 1, number: +1234567890 called_number: , called_name
src/voicecall.c:ofono_voicecall_notify() Did not find a call with id: 1
> AT+CIND?\r
< \r\n+CIND: 1,1,1,4,0,2,0\r\n\r\nOK\r\n
src/network.c:ofono_netreg_status_notify() /hfp/org/bluez/hci0/dev_60_AF_6D_F7_8E_37 status 1 tech -1
> AT+VGS=7\r
< \r\nOK\r\n
> AT+VGM=7\r
< \r\nOK\r\n
> AT+CLCC\r
< \r\n+CLCC: 1,1,0,0,0,"+9876543210",145\r\n
< \r\n+CLCC: 2,1,5,0,0,"+1234567890",145\r\n\r\nOK\r\n
src/voicecall.c:ofono_voicecall_notify() Got a voicecall event, status: 0, id: 1, number: +9876543210 called_number: , called_name
src/voicecall.c:ofono_voicecall_notify() Found call with id: 1
src/voicecall.c:ofono_voicecall_notify() Got a voicecall event, status: 5, id: 2, number: +1234567890 called_number: , called_name
src/voicecall.c:ofono_voicecall_notify() Did not find a call with id: 2
src/voicecall.c:ofono_voicecall_mpty_hint() ids: 0
---
drivers/hfpmodem/voicecall.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/hfpmodem/voicecall.c b/drivers/hfpmodem/voicecall.c
index 3acfc3a3b45ffff5c573f8af18c4d3361faabdd5..f8db584cddc341da09d9ca7bbbc0fa02c460202b 100644
--- a/drivers/hfpmodem/voicecall.c
+++ b/drivers/hfpmodem/voicecall.c
@@ -709,6 +709,15 @@ static void ccwa_notify(GAtResult *result, gpointer user_data)
int num_type, validity;
struct ofono_call *call;
+ /* Waiting call notification makes no sense, when there are
+ * no calls at all. This can happen when a phone already has
+ * waiting and active calls and is being connected over HFP
+ * but it first sends +CCWA before we manage to synchronize
+ * calls with AT+CLCC.
+ */
+ if (!vd->calls)
+ return;
+
/* CCWA can repeat, ignore if we already have an waiting call */
if (g_slist_find_custom(vd->calls,
GINT_TO_POINTER(CALL_STATUS_WAITING),
--
1.9.3
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
5 years