Merge lp:~phablet-team/ofono/ofono-ww51-update into lp:~phablet-team/ofono/utopic-rtm
- ofono-ww51-update
- Merge into utopic-rtm
Status: | Merged |
---|---|
Approved by: | Alfonso Sanchez-Beato |
Approved revision: | 6886 |
Merged at revision: | 6886 |
Proposed branch: | lp:~phablet-team/ofono/ofono-ww51-update |
Merge into: | lp:~phablet-team/ofono/utopic-rtm |
Diff against target: |
1485 lines (+768/-236) 19 files modified
Makefile.am (+2/-1) debian/changelog (+10/-0) doc/mtk-settings-api.txt (+49/-0) drivers/mtkmodem/mtk_constants.h (+1/-0) drivers/mtkmodem/mtkreply.c (+5/-6) drivers/mtkmodem/mtkrequest.c (+11/-0) drivers/mtkmodem/mtkrequest.h (+6/-0) drivers/mtkmodem/mtksettings.c (+261/-0) drivers/mtkmodem/mtksettings.h (+43/-0) drivers/mtkmodem/mtkutil.c (+2/-0) drivers/mtkmodem/mtkutil.h (+2/-0) drivers/mtkmodem/radio-settings.c (+5/-3) drivers/rilmodem/radio-settings.c (+8/-0) drivers/rilmodem/sim.c (+73/-53) plugins/mtk.c (+236/-107) plugins/ril.c (+0/-62) test/set-3g-slot (+20/-0) unit/test-mtkreply.c (+4/-4) unit/test-mtkrequest.c (+30/-0) |
To merge this branch: | bzr merge lp:~phablet-team/ofono/ofono-ww51-update |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Alfonso Sanchez-Beato | Approve | ||
Review via email: mp+243884@code.launchpad.net |
Description of the change
This merge includes fixes for two ofono bugs:
- fix SIM interface signals ( lp: #1376250 )
This fix also is thought to have bearing on a dialer/messaging app bug ( lp: #1379836 ), although as this is conjecture, the fix isn't included in the changelog.
- support krillin 3g slot switch ( lp: #1373388 )
Only the second bug is slated for ww51-2014, however this change is dependent on the earlier bug fix for the SIM interface signals.
Alfonso Sanchez-Beato (alfonsosanchezbeato) wrote : | # |
Tony Espy (awe) wrote : | # |
We decided to pull the Set3G code for RTM, and just land the auto-answer code, so I've marked this MP as "work-in-progress".
- 6884. By Alfonso Sanchez-Beato
-
[ Alfonso Sanchez-Beato ]
* rilmodem, mtkmodem, plugins/ril.c,mtk. c: Auto-answer calls when test SIM is present.
Approved by: Tony Espy - 6885. By CI Train Bot Account
-
Releasing 1.12.bzr6884+
15.04.20150121. 1~rtm-0ubuntu1 - 6886. By Alfonso Sanchez-Beato
-
[ Alfonso Sanchez-Beato ]
* rilmodem/sim.c, plugins/mtk.c, ril.c: fix SIM interface signals (LP: #1376250)
* Makefile.am, doc/mtk-settings- api.txt, mtkmodem,
plugins/mtk.c, test, unit: support krillin 3g slot switch (LP: #1373388)
Preview Diff
1 | === modified file 'Makefile.am' |
2 | --- Makefile.am 2014-07-29 21:21:56 +0000 |
3 | +++ Makefile.am 2015-02-06 15:08:43 +0000 |
4 | @@ -146,7 +146,8 @@ |
5 | drivers/mtkmodem/mtkreply.c \ |
6 | drivers/mtkmodem/voicecall.c \ |
7 | drivers/mtkmodem/gprs.c \ |
8 | - drivers/mtkmodem/radio-settings.c |
9 | + drivers/mtkmodem/radio-settings.c \ |
10 | + drivers/mtkmodem/mtksettings.c |
11 | |
12 | builtin_modules += rilmodem |
13 | builtin_sources += drivers/rilmodem/rilmodem.h \ |
14 | |
15 | === modified file 'debian/changelog' |
16 | --- debian/changelog 2015-01-21 18:07:49 +0000 |
17 | +++ debian/changelog 2015-02-06 15:08:43 +0000 |
18 | @@ -1,3 +1,13 @@ |
19 | +ofono (1.12.bzr6886+15.04.20150206~rtm-0ubuntu1) UNRELEASED; urgency=medium |
20 | + |
21 | + [ Alfonso Sanchez-Beato ] |
22 | + * rilmodem/sim.c, plugins/mtk.c, ril.c: fix SIM interface signals (LP: #1376250) |
23 | + |
24 | + * Makefile.am, doc/mtk-settings-api.txt, mtkmodem, |
25 | + plugins/mtk.c, test, unit: support krillin 3g slot switch (LP: #1373388) |
26 | + |
27 | + -- Alfonso Sanchez-Beato (email Canonical) <alfonso.sanchez-beato@canonical.com> Fri, 06 Feb 2015 16:03:05 +0100 |
28 | + |
29 | ofono (1.12.bzr6884+15.04.20150121.1~rtm-0ubuntu1) 14.09; urgency=medium |
30 | |
31 | [ Alfonso Sanchez-Beato ] |
32 | |
33 | === added file 'doc/mtk-settings-api.txt' |
34 | --- doc/mtk-settings-api.txt 1970-01-01 00:00:00 +0000 |
35 | +++ doc/mtk-settings-api.txt 2015-02-06 15:08:43 +0000 |
36 | @@ -0,0 +1,49 @@ |
37 | +MediaTek settings hierarchy |
38 | +=========================== |
39 | + |
40 | +Service org.ofono |
41 | +Interface org.ofono.MtkSettings |
42 | +Object path [variable prefix]/{modem0,modem1,...} |
43 | + |
44 | +Methods dict GetProperties() |
45 | + |
46 | + Returns all MtkSettings properties. See the |
47 | + properties section for available properties. |
48 | + |
49 | + Possible Errors: [service].Error.InProgress |
50 | + [service].Error.NotImplemented |
51 | + [service].Error.Failed |
52 | + |
53 | + void SetProperty(string name, variant value) |
54 | + |
55 | + Changes the value of the specified property. Only |
56 | + properties that are listed as readwrite are |
57 | + changeable. On success a PropertyChanged signal |
58 | + will be emitted. |
59 | + |
60 | + Possible Errors: [service].Error.InProgress |
61 | + [service].Error.NotImplemented |
62 | + [service].Error.InvalidArguments |
63 | + [service].Error.Failed |
64 | + |
65 | +Signals PropertyChanged(string property, variant value) |
66 | + |
67 | + This signal indicates a changed value of the given |
68 | + property. |
69 | + |
70 | +Properties boolean Has3G [readwrite] |
71 | + |
72 | + If true, the modem has 3G capabilities, otherwise it is |
73 | + just 2G. Only one of the modems can have this set at a |
74 | + time (note that in fact the modem hardware is shared |
75 | + among all ofono MTK modems, and that each ofono MTK |
76 | + modem represents one physical slot in the phone). |
77 | + |
78 | + When we set the property to TRUE, all MTK modems are |
79 | + reset, and after that this property will be false for |
80 | + all modems except for the one for which we set the |
81 | + property. Note that setting this property to FALSE is |
82 | + not allowed to avoid confusion, as one and only one of |
83 | + the modems must have it set to true and we can have |
84 | + the case of more than two modems. |
85 | + |
86 | |
87 | === modified file 'drivers/mtkmodem/mtk_constants.h' |
88 | --- drivers/mtkmodem/mtk_constants.h 2014-07-28 07:12:26 +0000 |
89 | +++ drivers/mtkmodem/mtk_constants.h 2015-02-06 15:08:43 +0000 |
90 | @@ -30,6 +30,7 @@ |
91 | #define MTK_RIL_REQUEST_RADIO_POWERON 2033 |
92 | #define MTK_RIL_REQUEST_SET_CALL_INDICATION 2036 |
93 | #define MTK_RIL_REQUEST_GET_3G_CAPABILITY 2038 |
94 | +#define MTK_RIL_REQUEST_SET_3G_CAPABILITY 2039 |
95 | #define MTK_RIL_REQUEST_SET_FD_MODE 2073 |
96 | |
97 | /* RIL Unsolicited Messages */ |
98 | |
99 | === modified file 'drivers/mtkmodem/mtkreply.c' |
100 | --- drivers/mtkmodem/mtkreply.c 2014-07-24 08:31:18 +0000 |
101 | +++ drivers/mtkmodem/mtkreply.c 2015-02-06 15:08:43 +0000 |
102 | @@ -35,7 +35,7 @@ |
103 | const struct ril_msg *message) |
104 | { |
105 | struct parcel rilp; |
106 | - int sim_3g, numint, slot; |
107 | + int slot_3g, numint; |
108 | |
109 | g_ril_init_parcel(message, &rilp); |
110 | |
111 | @@ -49,19 +49,18 @@ |
112 | * Bitmap with 3g capability per slot. Reply is the same regardless of |
113 | * the socket used to sent the request. |
114 | */ |
115 | - sim_3g = parcel_r_int32(&rilp); |
116 | + slot_3g = parcel_r_int32(&rilp); |
117 | |
118 | if (rilp.malformed) { |
119 | ofono_error("%s: malformed parcel", __func__); |
120 | goto error; |
121 | } |
122 | |
123 | - g_ril_append_print_buf(gril, "{%d}", sim_3g); |
124 | + g_ril_append_print_buf(gril, "{%d}", slot_3g); |
125 | g_ril_print_response(gril, message); |
126 | |
127 | - slot = g_ril_get_slot(gril); |
128 | - |
129 | - return (sim_3g >> slot) & 0x01; |
130 | + /* Do it zero-based */ |
131 | + return slot_3g - 1; |
132 | |
133 | error: |
134 | return -1; |
135 | |
136 | === modified file 'drivers/mtkmodem/mtkrequest.c' |
137 | --- drivers/mtkmodem/mtkrequest.c 2014-06-12 10:49:29 +0000 |
138 | +++ drivers/mtkmodem/mtkrequest.c 2015-02-06 15:08:43 +0000 |
139 | @@ -122,3 +122,14 @@ |
140 | g_ril_append_print_buf(gril, "%s)", print_buf); |
141 | } |
142 | } |
143 | + |
144 | +void g_mtk_request_set_3g_capability(GRil *gril, struct parcel *rilp) |
145 | +{ |
146 | + int mode = g_ril_get_slot(gril) + 1; |
147 | + |
148 | + parcel_init(rilp); |
149 | + parcel_w_int32(rilp, 1); |
150 | + parcel_w_int32(rilp, mode); |
151 | + |
152 | + g_ril_append_print_buf(gril, "(%d)", mode); |
153 | +} |
154 | |
155 | === modified file 'drivers/mtkmodem/mtkrequest.h' |
156 | --- drivers/mtkmodem/mtkrequest.h 2014-06-12 10:49:29 +0000 |
157 | +++ drivers/mtkmodem/mtkrequest.h 2015-02-06 15:08:43 +0000 |
158 | @@ -102,6 +102,12 @@ |
159 | void g_mtk_request_set_fd_mode(GRil *gril, int mode, int param1, |
160 | int param2, struct parcel *rilp); |
161 | |
162 | +/* |
163 | + * Sets the slot to which the GRil object is connected as the one with 3G |
164 | + * capabilities. This makes the other slot just 2G. |
165 | + */ |
166 | +void g_mtk_request_set_3g_capability(GRil *gril, struct parcel *rilp); |
167 | + |
168 | #ifdef __cplusplus |
169 | } |
170 | #endif |
171 | |
172 | === added file 'drivers/mtkmodem/mtksettings.c' |
173 | --- drivers/mtkmodem/mtksettings.c 1970-01-01 00:00:00 +0000 |
174 | +++ drivers/mtkmodem/mtksettings.c 2015-02-06 15:08:43 +0000 |
175 | @@ -0,0 +1,261 @@ |
176 | +/* |
177 | + * |
178 | + * oFono - Open Source Telephony |
179 | + * |
180 | + * Copyright (C) 2014 Canonical Ltd. |
181 | + * |
182 | + * This program is free software; you can redistribute it and/or modify |
183 | + * it under the terms of the GNU General Public License version 2 as |
184 | + * published by the Free Software Foundation. |
185 | + * |
186 | + * This program is distributed in the hope that it will be useful, |
187 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
188 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
189 | + * GNU General Public License for more details. |
190 | + * |
191 | + * You should have received a copy of the GNU General Public License |
192 | + * along with this program; if not, write to the Free Software |
193 | + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
194 | + * |
195 | + */ |
196 | + |
197 | +#ifdef HAVE_CONFIG_H |
198 | +#include <config.h> |
199 | +#endif |
200 | +#include <string.h> |
201 | +#include <stdlib.h> |
202 | +#include <stdio.h> |
203 | +#include <errno.h> |
204 | +#include <glib.h> |
205 | +#include <gdbus.h> |
206 | +#include <ofono.h> |
207 | + |
208 | +#define OFONO_API_SUBJECT_TO_CHANGE |
209 | +#include <ofono/plugin.h> |
210 | +#include <ofono/log.h> |
211 | +#include <ofono/modem.h> |
212 | +#include <ofono/dbus.h> |
213 | + |
214 | +#include "drivers/mtkmodem/mtk_constants.h" |
215 | +#include "drivers/mtkmodem/mtkrequest.h" |
216 | +#include "drivers/mtkmodem/mtkutil.h" |
217 | +#include "mtksettings.h" |
218 | + |
219 | +#define MTK_SETTINGS_INTERFACE "org.ofono.MtkSettings" |
220 | + |
221 | +struct mtk_settings_data { |
222 | + struct ofono_modem *modem; |
223 | + GRil *ril; |
224 | + ofono_bool_t has_3g; |
225 | + ofono_bool_t has_3g_pending; |
226 | + DBusMessage *pending; |
227 | +}; |
228 | + |
229 | +static void set_3g(struct mtk_settings_data *msd, ofono_bool_t has_3g) |
230 | +{ |
231 | + DBusConnection *conn = ofono_dbus_get_connection(); |
232 | + const char *path = ofono_modem_get_path(msd->modem); |
233 | + dbus_bool_t value = has_3g; |
234 | + |
235 | + if (msd->has_3g == has_3g) |
236 | + return; |
237 | + |
238 | + ofono_dbus_signal_property_changed(conn, path, MTK_SETTINGS_INTERFACE, |
239 | + "Has3G", DBUS_TYPE_BOOLEAN, |
240 | + &value); |
241 | + msd->has_3g = has_3g; |
242 | +} |
243 | + |
244 | +static void set_3g_cb(struct ril_msg *message, gpointer user_data) |
245 | +{ |
246 | + struct mtk_settings_data *msd = user_data; |
247 | + DBusMessage *reply; |
248 | + |
249 | + if (message->error != RIL_E_SUCCESS) { |
250 | + ofono_error("%s: Error setting 3G", __func__); |
251 | + |
252 | + msd->has_3g_pending = msd->has_3g; |
253 | + |
254 | + reply = __ofono_error_failed(msd->pending); |
255 | + __ofono_dbus_pending_reply(&msd->pending, reply); |
256 | + |
257 | + return; |
258 | + } |
259 | + |
260 | + g_ril_print_response_no_args(msd->ril, message); |
261 | + |
262 | + reply = dbus_message_new_method_return(msd->pending); |
263 | + __ofono_dbus_pending_reply(&msd->pending, reply); |
264 | + |
265 | + set_3g(msd, msd->has_3g_pending); |
266 | + |
267 | + mtk_reset_all_modems(); |
268 | +} |
269 | + |
270 | +static DBusMessage *set_property(DBusConnection *conn, DBusMessage *msg, |
271 | + void *data) |
272 | +{ |
273 | + struct mtk_settings_data *msd = data; |
274 | + DBusMessageIter iter; |
275 | + DBusMessageIter var; |
276 | + const char *property; |
277 | + |
278 | + if (msd->pending) |
279 | + return __ofono_error_busy(msg); |
280 | + |
281 | + if (!dbus_message_iter_init(msg, &iter)) |
282 | + return __ofono_error_invalid_args(msg); |
283 | + |
284 | + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) |
285 | + return __ofono_error_invalid_args(msg); |
286 | + |
287 | + dbus_message_iter_get_basic(&iter, &property); |
288 | + dbus_message_iter_next(&iter); |
289 | + |
290 | + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) |
291 | + return __ofono_error_invalid_args(msg); |
292 | + |
293 | + dbus_message_iter_recurse(&iter, &var); |
294 | + |
295 | + if (g_strcmp0(property, "Has3G") == 0) { |
296 | + dbus_bool_t value; |
297 | + struct parcel rilp; |
298 | + |
299 | + if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_BOOLEAN) |
300 | + return __ofono_error_invalid_args(msg); |
301 | + |
302 | + dbus_message_iter_get_basic(&var, &value); |
303 | + |
304 | + if (msd->has_3g_pending == (ofono_bool_t) value) |
305 | + return dbus_message_new_method_return(msg); |
306 | + |
307 | + /* |
308 | + * We can only set to true, as setting to false could be |
309 | + * confusing in a multi-sim environment (>2 SIM) |
310 | + */ |
311 | + if (value == FALSE) |
312 | + return __ofono_error_invalid_args(msg); |
313 | + |
314 | + g_mtk_request_set_3g_capability(msd->ril, &rilp); |
315 | + |
316 | + if (g_ril_send(msd->ril, MTK_RIL_REQUEST_SET_3G_CAPABILITY, |
317 | + &rilp, set_3g_cb, msd, NULL) == 0) { |
318 | + ofono_error("%s: unable to set 3G for slot", __func__); |
319 | + return __ofono_error_failed(msg); |
320 | + } |
321 | + |
322 | + msd->pending = dbus_message_ref(msg); |
323 | + msd->has_3g_pending = value; |
324 | + |
325 | + return NULL; |
326 | + } |
327 | + |
328 | + return __ofono_error_invalid_args(msg); |
329 | +} |
330 | + |
331 | +static DBusMessage *get_properties(DBusConnection *conn, |
332 | + DBusMessage *msg, void *data) |
333 | +{ |
334 | + struct mtk_settings_data *msd = data; |
335 | + DBusMessage *reply; |
336 | + DBusMessageIter iter; |
337 | + DBusMessageIter dict; |
338 | + |
339 | + reply = dbus_message_new_method_return(msg); |
340 | + if (reply == NULL) |
341 | + return NULL; |
342 | + |
343 | + dbus_message_iter_init_append(reply, &iter); |
344 | + |
345 | + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, |
346 | + OFONO_PROPERTIES_ARRAY_SIGNATURE, |
347 | + &dict); |
348 | + |
349 | + ofono_dbus_dict_append(&dict, "Has3G", |
350 | + DBUS_TYPE_BOOLEAN, &msd->has_3g); |
351 | + |
352 | + dbus_message_iter_close_container(&iter, &dict); |
353 | + |
354 | + return reply; |
355 | +} |
356 | + |
357 | +static const GDBusMethodTable mtk_settings_methods[] = { |
358 | + { GDBUS_ASYNC_METHOD("GetProperties", |
359 | + NULL, GDBUS_ARGS({ "properties", "a{sv}" }), |
360 | + get_properties) }, |
361 | + { GDBUS_ASYNC_METHOD("SetProperty", |
362 | + GDBUS_ARGS({ "property", "s" }, { "value", "v" }), |
363 | + NULL, set_property) }, |
364 | + { } |
365 | +}; |
366 | + |
367 | +static const GDBusSignalTable mtk_settings_signals[] = { |
368 | + { GDBUS_SIGNAL("PropertyChanged", |
369 | + GDBUS_ARGS({ "name", "s" }, { "value", "v" })) }, |
370 | + { } |
371 | +}; |
372 | + |
373 | + |
374 | +static void register_interface(struct mtk_settings_data *msd) |
375 | +{ |
376 | + DBusConnection *conn = ofono_dbus_get_connection(); |
377 | + |
378 | + if (!g_dbus_register_interface(conn, ofono_modem_get_path(msd->modem), |
379 | + MTK_SETTINGS_INTERFACE, |
380 | + mtk_settings_methods, |
381 | + mtk_settings_signals, |
382 | + NULL, msd, NULL)) { |
383 | + ofono_error("Could not create %s interface", |
384 | + MTK_SETTINGS_INTERFACE); |
385 | + return; |
386 | + } |
387 | + |
388 | + ofono_modem_add_interface(msd->modem, MTK_SETTINGS_INTERFACE); |
389 | +} |
390 | + |
391 | +static void unregister_interface(struct mtk_settings_data *msd) |
392 | +{ |
393 | + DBusConnection *conn = ofono_dbus_get_connection(); |
394 | + |
395 | + ofono_modem_remove_interface(msd->modem, MTK_SETTINGS_INTERFACE); |
396 | + |
397 | + g_dbus_unregister_interface(conn, |
398 | + ofono_modem_get_path(msd->modem), |
399 | + MTK_SETTINGS_INTERFACE); |
400 | +} |
401 | + |
402 | +struct mtk_settings_data *mtk_settings_create(struct ofono_modem *modem, |
403 | + GRil *ril, ofono_bool_t has_3g) |
404 | +{ |
405 | + struct mtk_settings_data *msd = g_try_malloc0(sizeof(*msd)); |
406 | + |
407 | + DBG(""); |
408 | + |
409 | + if (msd == NULL) { |
410 | + ofono_error("%s: Cannot allocate mtk_settings_data", __func__); |
411 | + return NULL; |
412 | + } |
413 | + |
414 | + msd->modem = modem; |
415 | + msd->ril = g_ril_clone(ril); |
416 | + |
417 | + msd->has_3g = has_3g; |
418 | + msd->has_3g_pending = has_3g; |
419 | + |
420 | + register_interface(msd); |
421 | + |
422 | + return msd; |
423 | +} |
424 | + |
425 | +void mtk_settings_remove(struct mtk_settings_data *msd) |
426 | +{ |
427 | + DBG(""); |
428 | + |
429 | + if (msd == NULL) |
430 | + return; |
431 | + |
432 | + unregister_interface(msd); |
433 | + |
434 | + g_ril_unref(msd->ril); |
435 | + g_free(msd); |
436 | +} |
437 | |
438 | === added file 'drivers/mtkmodem/mtksettings.h' |
439 | --- drivers/mtkmodem/mtksettings.h 1970-01-01 00:00:00 +0000 |
440 | +++ drivers/mtkmodem/mtksettings.h 2015-02-06 15:08:43 +0000 |
441 | @@ -0,0 +1,43 @@ |
442 | +/* |
443 | + * |
444 | + * MTK driver for ofono/rilmodem |
445 | + * |
446 | + * Copyright (C) 2014 Canonical Ltd. |
447 | + * |
448 | + * This program is free software; you can redistribute it and/or modify |
449 | + * it under the terms of the GNU General Public License version 2 as |
450 | + * published by the Free Software Foundation. |
451 | + * |
452 | + * This program is distributed in the hope that it will be useful, |
453 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
454 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
455 | + * GNU General Public License for more details. |
456 | + * |
457 | + * You should have received a copy of the GNU General Public License |
458 | + * along with this program; if not, write to the Free Software |
459 | + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
460 | + * |
461 | + */ |
462 | + |
463 | +#ifndef MTKSETTINGS_H |
464 | +#define MTKSETTINGS_H |
465 | + |
466 | +#include <ofono/types.h> |
467 | + |
468 | +#include "gril.h" |
469 | + |
470 | +#ifdef __cplusplus |
471 | +extern "C" { |
472 | +#endif |
473 | + |
474 | +struct mtk_settings_data; |
475 | + |
476 | +struct mtk_settings_data *mtk_settings_create(struct ofono_modem *modem, |
477 | + GRil *ril, ofono_bool_t has_3g); |
478 | +void mtk_settings_remove(struct mtk_settings_data *msd); |
479 | + |
480 | +#ifdef __cplusplus |
481 | +} |
482 | +#endif |
483 | + |
484 | +#endif /* MTKSETTINGS_H */ |
485 | |
486 | === modified file 'drivers/mtkmodem/mtkutil.c' |
487 | --- drivers/mtkmodem/mtkutil.c 2014-07-28 07:12:26 +0000 |
488 | +++ drivers/mtkmodem/mtkutil.c 2015-02-06 15:08:43 +0000 |
489 | @@ -41,6 +41,8 @@ |
490 | return "MTK_RIL_REQUEST_SET_CALL_INDICATION"; |
491 | case MTK_RIL_REQUEST_GET_3G_CAPABILITY: |
492 | return "MTK_RIL_REQUEST_GET_3G_CAPABILITY"; |
493 | + case MTK_RIL_REQUEST_SET_3G_CAPABILITY: |
494 | + return "MTK_RIL_REQUEST_SET_3G_CAPABILITY"; |
495 | case MTK_RIL_REQUEST_SET_FD_MODE: |
496 | return "MTK_RIL_REQUEST_SET_FD_MODE"; |
497 | default: |
498 | |
499 | === modified file 'drivers/mtkmodem/mtkutil.h' |
500 | --- drivers/mtkmodem/mtkutil.h 2014-07-31 06:45:32 +0000 |
501 | +++ drivers/mtkmodem/mtkutil.h 2015-02-06 15:08:43 +0000 |
502 | @@ -34,6 +34,8 @@ |
503 | void mtk_set_attach_state(struct ofono_modem *modem, ofono_bool_t attached); |
504 | void mtk_detach_received(struct ofono_modem *modem); |
505 | |
506 | +void mtk_reset_all_modems(void); |
507 | + |
508 | struct mtk_gprs_data { |
509 | GRil *gril; |
510 | struct ofono_modem *modem; |
511 | |
512 | === modified file 'drivers/mtkmodem/radio-settings.c' |
513 | --- drivers/mtkmodem/radio-settings.c 2014-09-25 12:16:25 +0000 |
514 | +++ drivers/mtkmodem/radio-settings.c 2015-02-06 15:08:43 +0000 |
515 | @@ -132,7 +132,7 @@ |
516 | struct radio_data *rd = ofono_radio_settings_get_data(rs); |
517 | ofono_radio_settings_modem_rats_query_cb_t cb = cbd->cb; |
518 | ofono_bool_t modem_rats[OFONO_RADIO_ACCESS_MODE_LAST] = { FALSE }; |
519 | - int is_3g; |
520 | + int slot_3g, is_3g; |
521 | |
522 | if (message->error != RIL_E_SUCCESS) { |
523 | ofono_error("%s: error %s", __func__, |
524 | @@ -141,13 +141,15 @@ |
525 | return; |
526 | } |
527 | |
528 | - is_3g = g_mtk_reply_parse_get_3g_capability(rd->ril, message); |
529 | - if (is_3g < 0) { |
530 | + slot_3g = g_mtk_reply_parse_get_3g_capability(rd->ril, message); |
531 | + if (slot_3g < 0) { |
532 | ofono_error("%s: parse error", __func__); |
533 | CALLBACK_WITH_FAILURE(cb, NULL, cbd->data); |
534 | return; |
535 | } |
536 | |
537 | + is_3g = (g_ril_get_slot(rd->ril) == slot_3g); |
538 | + |
539 | modem_rats[OFONO_RADIO_ACCESS_MODE_GSM] = TRUE; |
540 | |
541 | if (is_3g) { |
542 | |
543 | === modified file 'drivers/rilmodem/radio-settings.c' |
544 | --- drivers/rilmodem/radio-settings.c 2014-07-24 08:31:18 +0000 |
545 | +++ drivers/rilmodem/radio-settings.c 2015-02-06 15:08:43 +0000 |
546 | @@ -118,8 +118,16 @@ |
547 | return; |
548 | } |
549 | |
550 | + /* |
551 | + * GSM_WCDMA_AUTO -> ril.h: GSM/WCDMA (auto mode, according to PRL) |
552 | + * PRL: preferred roaming list. |
553 | + * This value is returned when selecting the slot as having 3G |
554 | + * capabilities, so it is sort of the default for MTK modems. |
555 | + */ |
556 | + |
557 | switch (pref) { |
558 | case PREF_NET_TYPE_GSM_WCDMA: |
559 | + case PREF_NET_TYPE_GSM_WCDMA_AUTO: |
560 | mode = OFONO_RADIO_ACCESS_MODE_UMTS; |
561 | break; |
562 | case PREF_NET_TYPE_GSM_ONLY: |
563 | |
564 | === modified file 'drivers/rilmodem/sim.c' |
565 | --- drivers/rilmodem/sim.c 2014-10-10 02:10:48 +0000 |
566 | +++ drivers/rilmodem/sim.c 2015-02-06 15:08:43 +0000 |
567 | @@ -85,7 +85,6 @@ |
568 | guint app_type; |
569 | gchar *app_str; |
570 | guint app_index; |
571 | - gboolean sim_registered; |
572 | enum ofono_sim_password_type passwd_type; |
573 | int retries[OFONO_SIM_PASSWORD_INVALID]; |
574 | enum ofono_sim_password_type passwd_state; |
575 | @@ -646,55 +645,56 @@ |
576 | struct ofono_sim *sim = user_data; |
577 | struct sim_data *sd = ofono_sim_get_data(sim); |
578 | struct reply_sim_status *status; |
579 | - guint i = 0; |
580 | - guint search_index = -1; |
581 | - |
582 | - if (sd->sim_registered == FALSE) { |
583 | - /* First status request, after sim_probe() */ |
584 | - ofono_sim_register(sim); |
585 | - sd->sim_registered = TRUE; |
586 | - |
587 | - if (sd->ril_state_watch != NULL && |
588 | - !ofono_sim_add_state_watch(sim, |
589 | - sd->ril_state_watch, |
590 | - sd->modem, NULL)) |
591 | - ofono_error("Error registering ril sim watch"); |
592 | + guint search_index; |
593 | + |
594 | + status = g_ril_reply_parse_sim_status(sd->ril, message); |
595 | + if (status == NULL) { |
596 | + ofono_error("%s: Cannot parse SIM status reply", __func__); |
597 | + return; |
598 | } |
599 | |
600 | - if ((status = g_ril_reply_parse_sim_status(sd->ril, message)) |
601 | - != NULL |
602 | - && status->card_state == RIL_CARDSTATE_PRESENT |
603 | - && status->num_apps) { |
604 | - |
605 | - DBG("num_apps: %d gsm_umts_index: %d", status->num_apps, |
606 | - status->gsm_umts_index); |
607 | - |
608 | - /* |
609 | - * TODO(CDMA): need some kind of logic to |
610 | - * set the correct app_index, |
611 | - */ |
612 | - search_index = status->gsm_umts_index; |
613 | - |
614 | - for (i = 0; i < status->num_apps; i++) { |
615 | - struct reply_sim_app *app = status->apps[i]; |
616 | - if (i == search_index && |
617 | - app->app_type != RIL_APPTYPE_UNKNOWN) { |
618 | - configure_active_app(sd, app, i); |
619 | - break; |
620 | - } |
621 | - } |
622 | - |
623 | - /* |
624 | - * Note: There doesn't seem to be any other way to |
625 | - * force the core SIM code to recheck the PIN. This |
626 | - * call causes the core to call the this atom's |
627 | - * query_passwd() function. |
628 | - */ |
629 | - __ofono_sim_recheck_pin(sim); |
630 | - |
631 | - } else if (status && status->card_state == RIL_CARDSTATE_ABSENT) { |
632 | - ofono_info("SIM card absent"); |
633 | + DBG("SIM status is %u", status->card_state); |
634 | + |
635 | + if (status->card_state == RIL_CARDSTATE_PRESENT) |
636 | + ofono_sim_inserted_notify(sim, TRUE); |
637 | + else if (status && status->card_state == RIL_CARDSTATE_ABSENT) |
638 | ofono_sim_inserted_notify(sim, FALSE); |
639 | + else |
640 | + ofono_error("%s: bad SIM state (%u)", |
641 | + __func__, status->card_state); |
642 | + |
643 | + /* TODO(CDMA): need some kind of logic to set the correct app_index */ |
644 | + search_index = status->gsm_umts_index; |
645 | + |
646 | + /* |
647 | + * We cache the current password state. Ideally this should be done by |
648 | + * issuing a GET_SIM_STATUS request from ril_query_passwd_state, which |
649 | + * is called by the core after sending a password, but unfortunately the |
650 | + * response to GET_SIM_STATUS is not reliable in mako when sent just |
651 | + * after sending the password. Some time is needed before the modem |
652 | + * refreshes its internal state, and when it does it sends a |
653 | + * SIM_STATUS_CHANGED event. In that moment we retrieve the status and |
654 | + * this function is executed. We call __ofono_sim_recheck_pin as it is |
655 | + * the only way to indicate the core to call query_passwd_state again. |
656 | + * An option that can be explored in the future is wait before invoking |
657 | + * core callback for send_passwd until we know the real password state. |
658 | + */ |
659 | + if (status->card_state == RIL_CARDSTATE_PRESENT |
660 | + && search_index < status->num_apps) { |
661 | + struct reply_sim_app *app = status->apps[search_index]; |
662 | + |
663 | + if (app->app_type != RIL_APPTYPE_UNKNOWN) { |
664 | + configure_active_app(sd, app, search_index); |
665 | + DBG("passwd_state: %d", sd->passwd_state); |
666 | + |
667 | + /* |
668 | + * Note: There doesn't seem to be any other way to force |
669 | + * the core SIM code to recheck the PIN. This call |
670 | + * causes the core to call the this atom's |
671 | + * query_passwd() function. |
672 | + */ |
673 | + __ofono_sim_recheck_pin(sim); |
674 | + } |
675 | } |
676 | |
677 | g_ril_reply_free_sim_status(status); |
678 | @@ -823,7 +823,7 @@ |
679 | g_free(retries); |
680 | } |
681 | |
682 | - /* TODO: re-bfactor to not use macro for FAILURE; |
683 | + /* TODO: re-factor to not use macro for FAILURE; |
684 | doesn't return error! */ |
685 | if (message->error == RIL_E_SUCCESS) { |
686 | CALLBACK_WITH_SUCCESS(cb, cbd->data); |
687 | @@ -992,19 +992,40 @@ |
688 | } |
689 | } |
690 | |
691 | -static gboolean ril_sim_register(gpointer user) |
692 | +static gboolean listen_and_get_sim_status(gpointer user) |
693 | { |
694 | struct ofono_sim *sim = user; |
695 | struct sim_data *sd = ofono_sim_get_data(sim); |
696 | |
697 | - DBG(""); |
698 | - |
699 | - send_get_sim_status(sim); |
700 | + send_get_sim_status(sim); |
701 | |
702 | g_ril_register(sd->ril, RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, |
703 | (GRilNotifyFunc) ril_sim_status_changed, sim); |
704 | |
705 | /* TODO: should we also register for RIL_UNSOL_SIM_REFRESH? */ |
706 | + return FALSE; |
707 | +} |
708 | + |
709 | +static gboolean ril_sim_register(gpointer user) |
710 | +{ |
711 | + struct ofono_sim *sim = user; |
712 | + struct sim_data *sd = ofono_sim_get_data(sim); |
713 | + |
714 | + DBG(""); |
715 | + |
716 | + ofono_sim_register(sim); |
717 | + |
718 | + if (sd->ril_state_watch != NULL && |
719 | + !ofono_sim_add_state_watch(sim, sd->ril_state_watch, |
720 | + sd->modem, NULL)) |
721 | + ofono_error("Error registering ril sim watch"); |
722 | + |
723 | + /* |
724 | + * We use g_idle_add here to make sure that the presence of the SIM |
725 | + * interface is signalled before signalling anything else from the said |
726 | + * interface, as ofono_sim_register also uses g_idle_add. |
727 | + */ |
728 | + g_idle_add(listen_and_get_sim_status, sim); |
729 | |
730 | return FALSE; |
731 | } |
732 | @@ -1025,7 +1046,6 @@ |
733 | sd->app_type = RIL_APPTYPE_UNKNOWN; |
734 | sd->passwd_state = OFONO_SIM_PASSWORD_NONE; |
735 | sd->passwd_type = OFONO_SIM_PASSWORD_NONE; |
736 | - sd->sim_registered = FALSE; |
737 | sd->modem = ril_data->modem; |
738 | sd->ril_state_watch = ril_data->ril_state_watch; |
739 | |
740 | |
741 | === modified file 'plugins/mtk.c' |
742 | --- plugins/mtk.c 2015-01-13 14:13:08 +0000 |
743 | +++ plugins/mtk.c 2015-02-06 15:08:43 +0000 |
744 | @@ -66,6 +66,8 @@ |
745 | #include "drivers/mtkmodem/mtk_constants.h" |
746 | #include "drivers/mtkmodem/mtkutil.h" |
747 | #include "drivers/mtkmodem/mtkrequest.h" |
748 | +#include "drivers/mtkmodem/mtkreply.h" |
749 | +#include "drivers/mtkmodem/mtksettings.h" |
750 | |
751 | #define MAX_SIM_STATUS_RETRIES 15 |
752 | |
753 | @@ -76,18 +78,25 @@ |
754 | #define SIM_2_ACTIVE 2 |
755 | #define NO_SIM_ACTIVE 0 |
756 | |
757 | +#define SOCKET_NUM_FOR_DBG_0 -1 |
758 | +#define SOCKET_NUM_FOR_DBG_1 -2 |
759 | + |
760 | /* this gives 30s for rild to initialize */ |
761 | #define RILD_MAX_CONNECT_RETRIES 5 |
762 | #define RILD_CONNECT_RETRY_TIME_S 5 |
763 | |
764 | #define T_WAIT_DISCONN_MS 1000 |
765 | |
766 | +static const char hex_slot_0[] = "Slot 0: "; |
767 | +static const char hex_slot_1[] = "Slot 1: "; |
768 | + |
769 | typedef void (*pending_cb_t)(struct cb_data *cbd); |
770 | |
771 | struct mtk_data { |
772 | GRil *modem; |
773 | int sim_status_retries; |
774 | ofono_bool_t ofono_online; |
775 | + ofono_bool_t ofono_online_target; |
776 | int radio_state; |
777 | struct ofono_sim *sim; |
778 | /* pending_* are used in case we are disconnected from the socket */ |
779 | @@ -110,6 +119,9 @@ |
780 | struct ofono_call_barring *call_barring; |
781 | struct ofono_gprs *gprs; |
782 | struct ofono_message_waiting *message_waiting; |
783 | + struct ofono_modem *ofono_modem; |
784 | + ofono_bool_t has_3g; |
785 | + struct mtk_settings_data *mtk_settings; |
786 | }; |
787 | |
788 | /* |
789 | @@ -125,11 +137,23 @@ |
790 | static gboolean disconnect_expected; |
791 | static guint not_disconn_cb_id; |
792 | |
793 | -static void send_get_sim_status(struct ofono_modem *modem); |
794 | +struct socket_data { |
795 | + GRil *gril; |
796 | + const char *path; |
797 | + int radio_state; |
798 | + guint radio_state_ev_id; |
799 | +}; |
800 | + |
801 | +static struct socket_data *sock_0, *sock_1; |
802 | + |
803 | static int create_gril(struct ofono_modem *modem); |
804 | static gboolean mtk_connected(gpointer user_data); |
805 | static void mtk_set_online(struct ofono_modem *modem, ofono_bool_t online, |
806 | ofono_modem_online_cb_t callback, void *data); |
807 | +static void query_3g_caps(struct socket_data *sock); |
808 | +static void socket_disconnected(gpointer user_data); |
809 | +static void start_slot(struct mtk_data *ril, struct socket_data *sock, |
810 | + const char *hex_prefix); |
811 | |
812 | static void mtk_debug(const char *str, void *user_data) |
813 | { |
814 | @@ -146,6 +170,14 @@ |
815 | return mtk_0; |
816 | } |
817 | |
818 | +static struct socket_data *socket_complement(struct socket_data *sock) |
819 | +{ |
820 | + if (sock == sock_0) |
821 | + return sock_1; |
822 | + else |
823 | + return sock_0; |
824 | +} |
825 | + |
826 | /* |
827 | * mtk_set_attach_state and mtk_detach_received are called by mtkmodem's gprs |
828 | * driver. They are needed to solve an issue with data attachment: in case |
829 | @@ -197,13 +229,34 @@ |
830 | } |
831 | } |
832 | |
833 | -static gboolean sim_status_retry(gpointer user_data) |
834 | +static void radio_state_changed(struct ril_msg *message, gpointer user_data) |
835 | { |
836 | - struct ofono_modem *modem = user_data; |
837 | - send_get_sim_status(modem); |
838 | - |
839 | - /* Makes this a single shot */ |
840 | - return FALSE; |
841 | + struct socket_data *sock = user_data; |
842 | + int radio_state = g_ril_unsol_parse_radio_state_changed(sock->gril, |
843 | + message); |
844 | + |
845 | + if (radio_state != sock->radio_state) { |
846 | + struct socket_data *sock_c = socket_complement(sock); |
847 | + |
848 | + ofono_info("%s, state: %s", __func__, |
849 | + ril_radio_state_to_string(radio_state)); |
850 | + |
851 | + /* |
852 | + * If there is just one slot, just start it. Otherwise, we ask |
853 | + * who owns the 3G capabilities in case both slots have already |
854 | + * radio state different from UNAVAILABLE. |
855 | + */ |
856 | + if (mtk_1 == NULL) { |
857 | + mtk_0->has_3g = TRUE; |
858 | + start_slot(mtk_0, sock, hex_slot_0); |
859 | + } else if (sock->radio_state == RADIO_STATE_UNAVAILABLE && |
860 | + sock_c != NULL && sock_c->radio_state != |
861 | + RADIO_STATE_UNAVAILABLE) { |
862 | + query_3g_caps(sock); |
863 | + } |
864 | + |
865 | + sock->radio_state = radio_state; |
866 | + } |
867 | } |
868 | |
869 | static void mtk_radio_state_changed(struct ril_msg *message, gpointer user_data) |
870 | @@ -220,9 +273,6 @@ |
871 | ril_radio_state_to_string(radio_state), |
872 | ril->ofono_online); |
873 | |
874 | - if (ril->radio_state == RADIO_STATE_UNAVAILABLE) |
875 | - mtk_connected(modem); |
876 | - |
877 | ril->radio_state = radio_state; |
878 | |
879 | switch (radio_state) { |
880 | @@ -275,65 +325,6 @@ |
881 | } |
882 | } |
883 | |
884 | -static void sim_status_cb(struct ril_msg *message, gpointer user_data) |
885 | -{ |
886 | - struct ofono_modem *modem = user_data; |
887 | - struct mtk_data *ril = ofono_modem_get_data(modem); |
888 | - struct reply_sim_status *status; |
889 | - |
890 | - DBG("slot %d", ril->slot); |
891 | - |
892 | - if (message->error != RIL_E_SUCCESS) { |
893 | - ril->sim_status_retries++; |
894 | - |
895 | - ofono_error("[slot %d] GET_SIM_STATUS request failed: " |
896 | - "%s; retries: %d", |
897 | - ril->slot, ril_error_to_string(message->error), |
898 | - ril->sim_status_retries); |
899 | - |
900 | - if (ril->sim_status_retries < MAX_SIM_STATUS_RETRIES) |
901 | - g_timeout_add_seconds(2, sim_status_retry, modem); |
902 | - else |
903 | - ofono_error("[slot %d] Max retries for GET_SIM_STATUS" |
904 | - " exceeded!", ril->slot); |
905 | - } else { |
906 | - |
907 | - /* Register for changes in SIM insertion */ |
908 | - g_ril_register(ril->modem, MTK_RIL_UNSOL_SIM_PLUG_OUT, |
909 | - sim_removed, modem); |
910 | - g_ril_register(ril->modem, MTK_RIL_UNSOL_SIM_PLUG_IN, |
911 | - sim_inserted, modem); |
912 | - |
913 | - if ((status = g_ril_reply_parse_sim_status(ril->modem, message)) |
914 | - != NULL) { |
915 | - |
916 | - if (status->card_state == RIL_CARDSTATE_PRESENT) { |
917 | - DBG("Card PRESENT; num_apps: %d", |
918 | - status->num_apps); |
919 | - |
920 | - ofono_sim_inserted_notify(ril->sim, TRUE); |
921 | - } else { |
922 | - ofono_warn("[slot %d] Card NOT_PRESENT", |
923 | - ril->slot); |
924 | - |
925 | - ofono_sim_inserted_notify(ril->sim, FALSE); |
926 | - } |
927 | - g_ril_reply_free_sim_status(status); |
928 | - } |
929 | - } |
930 | -} |
931 | - |
932 | -static void send_get_sim_status(struct ofono_modem *modem) |
933 | -{ |
934 | - struct mtk_data *ril = ofono_modem_get_data(modem); |
935 | - |
936 | - DBG("slot %d", ril->slot); |
937 | - |
938 | - if (g_ril_send(ril->modem, RIL_REQUEST_GET_SIM_STATUS, NULL, |
939 | - sim_status_cb, modem, NULL) == 0) |
940 | - ofono_error("%s: failure sending request", __func__); |
941 | -} |
942 | - |
943 | static int mtk_probe(struct ofono_modem *modem) |
944 | { |
945 | struct mtk_data *ril = g_try_new0(struct mtk_data, 1); |
946 | @@ -355,6 +346,8 @@ |
947 | |
948 | DBG("slot %d", ril->slot); |
949 | |
950 | + ril->ofono_modem = modem; |
951 | + |
952 | ofono_modem_set_data(modem, ril); |
953 | |
954 | return 0; |
955 | @@ -521,9 +514,11 @@ |
956 | ofono_radio_settings_create(modem, OFONO_RIL_VENDOR_MTK, |
957 | MTKMODEM, ril->modem); |
958 | |
959 | - /* Ask sim status */ |
960 | - ril->sim_status_retries = 0; |
961 | - send_get_sim_status(modem); |
962 | + /* Register for changes in SIM insertion */ |
963 | + g_ril_register(ril->modem, MTK_RIL_UNSOL_SIM_PLUG_OUT, |
964 | + sim_removed, modem); |
965 | + g_ril_register(ril->modem, MTK_RIL_UNSOL_SIM_PLUG_IN, |
966 | + sim_inserted, modem); |
967 | } |
968 | |
969 | static void mtk_sim_mode_cb(struct ril_msg *message, gpointer user_data) |
970 | @@ -546,11 +541,18 @@ |
971 | CALLBACK_WITH_FAILURE(cb, cbd->data); |
972 | } |
973 | |
974 | + if (ril->ofono_online) |
975 | + ril->mtk_settings = |
976 | + mtk_settings_create(ril->ofono_modem, ril->modem, |
977 | + ril->has_3g); |
978 | + else |
979 | + mtk_settings_remove(ril->mtk_settings); |
980 | + |
981 | /* Execute possible pending operation on the other modem */ |
982 | |
983 | ril_c = ril_complement(ril); |
984 | |
985 | - if (ril_c->pending_online_cbd) { |
986 | + if (ril_c != NULL && ril_c->pending_online_cbd) { |
987 | struct cb_data *pending_cbd = ril_c->pending_online_cbd; |
988 | ofono_modem_online_cb_t pending_cb = pending_cbd->cb; |
989 | |
990 | @@ -671,6 +673,8 @@ |
991 | if (message->error == RIL_E_SUCCESS) { |
992 | g_ril_print_response_no_args(ril->modem, message); |
993 | |
994 | + mtk_settings_remove(ril->mtk_settings); |
995 | + |
996 | CALLBACK_WITH_SUCCESS(cb, cbd->data); |
997 | } else { |
998 | ofono_error("%s: RIL error %s", __func__, |
999 | @@ -751,6 +755,39 @@ |
1000 | } |
1001 | } |
1002 | |
1003 | +static void set_online_cb(const struct ofono_error *error, void *data) |
1004 | +{ |
1005 | + if (mtk_1->ofono_online_target && !mtk_1->ofono_online) |
1006 | + mtk_set_online(mtk_1->ofono_modem, TRUE, set_online_cb, NULL); |
1007 | +} |
1008 | + |
1009 | +static void set_offline_cb(const struct ofono_error *error, void *data) |
1010 | +{ |
1011 | + if (mtk_1->ofono_online) |
1012 | + mtk_set_online(mtk_1->ofono_modem, FALSE, set_offline_cb, NULL); |
1013 | + else if (mtk_0->ofono_online_target) |
1014 | + mtk_set_online(mtk_0->ofono_modem, TRUE, set_online_cb, NULL); |
1015 | + else |
1016 | + mtk_set_online(mtk_1->ofono_modem, TRUE, set_online_cb, NULL); |
1017 | +} |
1018 | + |
1019 | +void mtk_reset_all_modems(void) |
1020 | +{ |
1021 | + if (!mtk_0->ofono_online && !mtk_1->ofono_online) |
1022 | + return; |
1023 | + |
1024 | + mtk_0->ofono_online_target = mtk_0->ofono_online; |
1025 | + mtk_1->ofono_online_target = mtk_1->ofono_online; |
1026 | + |
1027 | + ofono_modem_set_powered(mtk_0->ofono_modem, FALSE); |
1028 | + ofono_modem_set_powered(mtk_1->ofono_modem, FALSE); |
1029 | + |
1030 | + if (mtk_0->ofono_online) |
1031 | + mtk_set_online(mtk_0->ofono_modem, FALSE, set_offline_cb, NULL); |
1032 | + else |
1033 | + mtk_set_online(mtk_1->ofono_modem, FALSE, set_offline_cb, NULL); |
1034 | +} |
1035 | + |
1036 | static void create_atoms_on_connection(struct ofono_modem *modem) |
1037 | { |
1038 | struct mtk_data *ril = ofono_modem_get_data(modem); |
1039 | @@ -770,14 +807,97 @@ |
1040 | { |
1041 | struct mtk_data *ril = ofono_modem_get_data(modem); |
1042 | |
1043 | - ofono_call_volume_remove(ril->callvolume); |
1044 | + if (__ofono_modem_find_atom(modem, OFONO_ATOM_TYPES_CALL_VOLUME)) |
1045 | + ofono_call_volume_remove(ril->callvolume); |
1046 | ril->callvolume = NULL; |
1047 | - ofono_voicecall_remove(ril->voicecall); |
1048 | + if (__ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_VOICECALL)) |
1049 | + ofono_voicecall_remove(ril->voicecall); |
1050 | ril->voicecall = NULL; |
1051 | - ofono_devinfo_remove(ril->devinfo); |
1052 | + if (__ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_DEVINFO)) |
1053 | + ofono_devinfo_remove(ril->devinfo); |
1054 | ril->devinfo = NULL; |
1055 | } |
1056 | |
1057 | +static void start_slot(struct mtk_data *ril, struct socket_data *sock, |
1058 | + const char *hex_prefix) |
1059 | +{ |
1060 | + ofono_info("Physical slot %d in socket %s", ril->slot, sock->path); |
1061 | + |
1062 | + ril->modem = sock->gril; |
1063 | + ril->radio_state = sock->radio_state; |
1064 | + |
1065 | + g_ril_set_slot(ril->modem, ril->slot); |
1066 | + |
1067 | + if (getenv("OFONO_RIL_TRACE")) |
1068 | + g_ril_set_trace(ril->modem, TRUE); |
1069 | + |
1070 | + if (getenv("OFONO_RIL_HEX_TRACE")) |
1071 | + g_ril_set_debugf(ril->modem, mtk_debug, (char *) hex_prefix); |
1072 | + |
1073 | + g_ril_set_disconnect_function(ril->modem, socket_disconnected, |
1074 | + ril->ofono_modem); |
1075 | + |
1076 | + g_ril_unregister(sock->gril, sock->radio_state_ev_id); |
1077 | + |
1078 | + g_ril_register(ril->modem, RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, |
1079 | + mtk_radio_state_changed, ril->ofono_modem); |
1080 | + |
1081 | + mtk_connected(ril->ofono_modem); |
1082 | +} |
1083 | + |
1084 | +static void query_3g_caps_cb(struct ril_msg *message, gpointer user_data) |
1085 | +{ |
1086 | + struct socket_data *sock = user_data; |
1087 | + struct socket_data *sock_for_mtk_0, *sock_for_mtk_1; |
1088 | + int slot_3g; |
1089 | + |
1090 | + if (message->error != RIL_E_SUCCESS) { |
1091 | + ofono_error("%s: error %s", __func__, |
1092 | + ril_error_to_string(message->error)); |
1093 | + return; |
1094 | + } |
1095 | + |
1096 | + slot_3g = g_mtk_reply_parse_get_3g_capability(sock->gril, message); |
1097 | + |
1098 | + /* |
1099 | + * The socket at sock_slot_0 always connects to the slot with 3G |
1100 | + * capabilities, while sock_slot_1 connects to the slot that is just 2G. |
1101 | + * However, the physical slot that owns the 3G capabilities can be |
1102 | + * changed dynamically using a RILd request, so the sockets can connect |
1103 | + * to different physical slots depending on the current configuration. |
1104 | + * We want to keep the relationship between the physical slots and |
1105 | + * the modem names in DBus (so /ril_0 and /ril_1 always refer to the |
1106 | + * same physical slots), so here we assign the sockets needed by mtk_0 |
1107 | + * and mtk_1 structures to make sure that happens. |
1108 | + */ |
1109 | + if (slot_3g == MULTISIM_SLOT_0) { |
1110 | + sock_for_mtk_0 = sock_0; |
1111 | + sock_for_mtk_1 = sock_1; |
1112 | + mtk_0->has_3g = TRUE; |
1113 | + mtk_1->has_3g = FALSE; |
1114 | + } else { |
1115 | + sock_for_mtk_0 = sock_1; |
1116 | + sock_for_mtk_1 = sock_0; |
1117 | + mtk_0->has_3g = FALSE; |
1118 | + mtk_1->has_3g = TRUE; |
1119 | + } |
1120 | + |
1121 | + start_slot(mtk_0, sock_for_mtk_0, hex_slot_0); |
1122 | + start_slot(mtk_1, sock_for_mtk_1, hex_slot_1); |
1123 | + |
1124 | + g_free(sock_0); |
1125 | + sock_0 = NULL; |
1126 | + g_free(sock_1); |
1127 | + sock_1 = NULL; |
1128 | +} |
1129 | + |
1130 | +static void query_3g_caps(struct socket_data *sock) |
1131 | +{ |
1132 | + if (g_ril_send(sock->gril, MTK_RIL_REQUEST_GET_3G_CAPABILITY, NULL, |
1133 | + query_3g_caps_cb, sock, NULL) <= 0) |
1134 | + ofono_error("%s Error querying 3G capabilities", __func__); |
1135 | +} |
1136 | + |
1137 | static gboolean mtk_connected(gpointer user_data) |
1138 | { |
1139 | struct ofono_modem *modem = (struct ofono_modem *) user_data; |
1140 | @@ -787,10 +907,14 @@ |
1141 | |
1142 | DBG("calling set_powered(TRUE)"); |
1143 | |
1144 | - ofono_modem_set_powered(modem, TRUE); |
1145 | + if (!ofono_modem_get_powered(modem)) |
1146 | + ofono_modem_set_powered(modem, TRUE); |
1147 | |
1148 | create_atoms_on_connection(modem); |
1149 | |
1150 | + if (ril->pending_cb) |
1151 | + ril->pending_cb(ril->pending_cbd); |
1152 | + |
1153 | /* Call the function just once */ |
1154 | return FALSE; |
1155 | } |
1156 | @@ -805,11 +929,6 @@ |
1157 | if (create_gril(modem) < 0) |
1158 | return TRUE; |
1159 | |
1160 | - create_atoms_on_connection(modem); |
1161 | - |
1162 | - if (ril->pending_cb) |
1163 | - ril->pending_cb(ril->pending_cbd); |
1164 | - |
1165 | /* Reconnected: do not call this again */ |
1166 | return FALSE; |
1167 | } |
1168 | @@ -841,30 +960,34 @@ |
1169 | |
1170 | static const char sock_slot_0[] = "/dev/socket/rild"; |
1171 | static const char sock_slot_1[] = "/dev/socket/rild2"; |
1172 | -static const char hex_slot_0[] = "Slot 0: "; |
1173 | -static const char hex_slot_1[] = "Slot 1: "; |
1174 | |
1175 | static int create_gril(struct ofono_modem *modem) |
1176 | { |
1177 | struct mtk_data *ril = ofono_modem_get_data(modem); |
1178 | - const char *sock_path; |
1179 | - const char *hex_prefix; |
1180 | + struct socket_data *sock; |
1181 | + int sock_num; |
1182 | |
1183 | DBG("slot %d", ril->slot); |
1184 | |
1185 | if (ril->modem != NULL) |
1186 | return 0; |
1187 | |
1188 | + sock = g_try_malloc0(sizeof(*sock)); |
1189 | + if (sock == NULL) { |
1190 | + ofono_error("%s: Cannot allocate socket_data", __func__); |
1191 | + return -ENOMEM; |
1192 | + } |
1193 | + |
1194 | if (ril->slot == MULTISIM_SLOT_0) { |
1195 | - sock_path = sock_slot_0; |
1196 | - hex_prefix = hex_slot_0; |
1197 | + sock_num = SOCKET_NUM_FOR_DBG_0; |
1198 | + sock->path = sock_slot_0; |
1199 | } else { |
1200 | - sock_path = sock_slot_1; |
1201 | - hex_prefix = hex_slot_1; |
1202 | + sock_num = SOCKET_NUM_FOR_DBG_1; |
1203 | + sock->path = sock_slot_1; |
1204 | } |
1205 | |
1206 | /* Opens the socket to RIL */ |
1207 | - ril->modem = g_ril_new(sock_path, OFONO_RIL_VENDOR_MTK); |
1208 | + sock->gril = g_ril_new(sock->path, OFONO_RIL_VENDOR_MTK); |
1209 | |
1210 | /* |
1211 | * NOTE: Since AT modems open a tty, and then call |
1212 | @@ -875,28 +998,34 @@ |
1213 | * abstraction... ( probaby not a bad idea ). |
1214 | */ |
1215 | |
1216 | - if (ril->modem == NULL) { |
1217 | - ofono_error("g_ril_new() failed to create modem %d!", |
1218 | - ril->slot); |
1219 | + if (sock->gril == NULL) { |
1220 | + ofono_error("g_ril_new() failed to connect to %s!", sock->path); |
1221 | + g_free(sock); |
1222 | return -EIO; |
1223 | + } else if (ril->slot == MULTISIM_SLOT_0) { |
1224 | + sock_0 = sock; |
1225 | + } else { |
1226 | + sock_1 = sock; |
1227 | } |
1228 | |
1229 | - g_ril_set_slot(ril->modem, ril->slot); |
1230 | - |
1231 | - g_ril_set_vendor_print_msg_id_funcs(ril->modem, |
1232 | + sock->radio_state = RADIO_STATE_UNAVAILABLE; |
1233 | + sock->radio_state_ev_id = |
1234 | + g_ril_register(sock->gril, |
1235 | + RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, |
1236 | + radio_state_changed, sock); |
1237 | + |
1238 | + /* sock_num is negative to avoid confusion with physical slots */ |
1239 | + g_ril_set_slot(sock->gril, sock_num); |
1240 | + |
1241 | + g_ril_set_vendor_print_msg_id_funcs(sock->gril, |
1242 | mtk_request_id_to_string, |
1243 | mtk_unsol_request_to_string); |
1244 | |
1245 | if (getenv("OFONO_RIL_TRACE")) |
1246 | - g_ril_set_trace(ril->modem, TRUE); |
1247 | + g_ril_set_trace(sock->gril, TRUE); |
1248 | |
1249 | if (getenv("OFONO_RIL_HEX_TRACE")) |
1250 | - g_ril_set_debugf(ril->modem, mtk_debug, (char *) hex_prefix); |
1251 | - |
1252 | - g_ril_set_disconnect_function(ril->modem, socket_disconnected, modem); |
1253 | - |
1254 | - g_ril_register(ril->modem, RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, |
1255 | - mtk_radio_state_changed, modem); |
1256 | + g_ril_set_debugf(sock->gril, mtk_debug, (char *) sock->path); |
1257 | |
1258 | return 0; |
1259 | } |
1260 | @@ -923,14 +1052,14 @@ |
1261 | { |
1262 | int ret; |
1263 | |
1264 | + /* We handle SIM states due to MTK peculiarities */ |
1265 | + ofono_modem_set_driver_watches_sim(modem, TRUE); |
1266 | + |
1267 | ret = create_gril(modem); |
1268 | if (ret < 0) |
1269 | g_timeout_add_seconds(RILD_CONNECT_RETRY_TIME_S, |
1270 | connect_rild, modem); |
1271 | |
1272 | - /* We handle SIM states due to MTK peculiarities */ |
1273 | - ofono_modem_set_driver_watches_sim(modem, TRUE); |
1274 | - |
1275 | /* |
1276 | * We will mark the modem as powered when we receive an event that |
1277 | * confirms that the radio is in a state different from unavailable |
1278 | |
1279 | === modified file 'plugins/ril.c' |
1280 | --- plugins/ril.c 2015-01-13 14:13:08 +0000 |
1281 | +++ plugins/ril.c 2015-02-06 15:08:43 +0000 |
1282 | @@ -84,8 +84,6 @@ |
1283 | int rild_connect_retries; |
1284 | }; |
1285 | |
1286 | -static void send_get_sim_status(struct ofono_modem *modem); |
1287 | - |
1288 | static void ril_debug(const char *str, void *user_data) |
1289 | { |
1290 | const char *prefix = user_data; |
1291 | @@ -93,15 +91,6 @@ |
1292 | ofono_info("%s%s", prefix, str); |
1293 | } |
1294 | |
1295 | -static gboolean sim_status_retry(gpointer user_data) |
1296 | -{ |
1297 | - struct ofono_modem *modem = user_data; |
1298 | - send_get_sim_status(modem); |
1299 | - |
1300 | - /* Makes this a single shot */ |
1301 | - return FALSE; |
1302 | -} |
1303 | - |
1304 | static void ril_radio_state_changed(struct ril_msg *message, gpointer user_data) |
1305 | { |
1306 | struct ofono_modem *modem = user_data; |
1307 | @@ -127,7 +116,6 @@ |
1308 | ril->vendor, RILMODEM, |
1309 | ril->modem); |
1310 | |
1311 | - send_get_sim_status(modem); |
1312 | break; |
1313 | |
1314 | case RADIO_STATE_UNAVAILABLE: |
1315 | @@ -150,56 +138,6 @@ |
1316 | } |
1317 | } |
1318 | |
1319 | -static void sim_status_cb(struct ril_msg *message, gpointer user_data) |
1320 | -{ |
1321 | - struct ofono_modem *modem = user_data; |
1322 | - struct ril_data *ril = ofono_modem_get_data(modem); |
1323 | - struct reply_sim_status *status; |
1324 | - |
1325 | - DBG(""); |
1326 | - |
1327 | - if (message->error != RIL_E_SUCCESS) { |
1328 | - ril->sim_status_retries++; |
1329 | - |
1330 | - ofono_error("GET_SIM_STATUS request failed: %s; retries: %d", |
1331 | - ril_error_to_string(message->error), |
1332 | - ril->sim_status_retries); |
1333 | - |
1334 | - if (ril->sim_status_retries < MAX_SIM_STATUS_RETRIES) |
1335 | - g_timeout_add_seconds(2, sim_status_retry, modem); |
1336 | - else |
1337 | - ofono_error("Max retries for GET_SIM_STATUS exceeded!"); |
1338 | - } else { |
1339 | - |
1340 | - if ((status = g_ril_reply_parse_sim_status(ril->modem, message)) |
1341 | - != NULL) { |
1342 | - |
1343 | - if (status->card_state == RIL_CARDSTATE_PRESENT) { |
1344 | - DBG("Card PRESENT; num_apps: %d", |
1345 | - status->num_apps); |
1346 | - |
1347 | - ofono_sim_inserted_notify(ril->sim, TRUE); |
1348 | - |
1349 | - } else { |
1350 | - ofono_warn("Card NOT_PRESENT."); |
1351 | - |
1352 | - ofono_sim_inserted_notify(ril->sim, FALSE); |
1353 | - } |
1354 | - g_ril_reply_free_sim_status(status); |
1355 | - } |
1356 | - } |
1357 | -} |
1358 | - |
1359 | -static void send_get_sim_status(struct ofono_modem *modem) |
1360 | -{ |
1361 | - struct ril_data *ril = ofono_modem_get_data(modem); |
1362 | - |
1363 | - DBG(""); |
1364 | - |
1365 | - g_ril_send(ril->modem, RIL_REQUEST_GET_SIM_STATUS, NULL, |
1366 | - sim_status_cb, modem, NULL); |
1367 | -} |
1368 | - |
1369 | int ril_create(struct ofono_modem *modem, enum ofono_ril_vendor vendor) |
1370 | { |
1371 | struct ril_data *ril = g_try_new0(struct ril_data, 1); |
1372 | |
1373 | === added file 'test/set-3g-slot' |
1374 | --- test/set-3g-slot 1970-01-01 00:00:00 +0000 |
1375 | +++ test/set-3g-slot 2015-02-06 15:08:43 +0000 |
1376 | @@ -0,0 +1,20 @@ |
1377 | +#!/usr/bin/python3 |
1378 | + |
1379 | +import dbus |
1380 | +import sys |
1381 | + |
1382 | +bus = dbus.SystemBus() |
1383 | + |
1384 | +if len(sys.argv) == 2: |
1385 | + path = sys.argv[1] |
1386 | +else: |
1387 | + manager = dbus.Interface(bus.get_object('org.ofono', '/'), |
1388 | + 'org.ofono.Manager') |
1389 | + modems = manager.GetModems() |
1390 | + path = modems[0][0] |
1391 | + |
1392 | +print("Activate 3G for %s..." % path) |
1393 | +mtks = dbus.Interface(bus.get_object('org.ofono', path), |
1394 | + 'org.ofono.MtkSettings') |
1395 | + |
1396 | +mtks.SetProperty("Has3G", True) |
1397 | |
1398 | === modified file 'unit/test-mtkreply.c' |
1399 | --- unit/test-mtkreply.c 2014-07-29 16:35:05 +0000 |
1400 | +++ unit/test-mtkreply.c 2015-02-06 15:08:43 +0000 |
1401 | @@ -53,7 +53,7 @@ |
1402 | }; |
1403 | |
1404 | struct rep_3g_capability_test { |
1405 | - int is_3g; |
1406 | + int slot_3g; |
1407 | const struct ril_msg msg; |
1408 | }; |
1409 | |
1410 | @@ -113,7 +113,7 @@ |
1411 | }; |
1412 | |
1413 | static const struct rep_3g_capability_test mtk_reply_3g_capability_valid_1 = { |
1414 | - .is_3g = 1, |
1415 | + .slot_3g = 0, |
1416 | .msg = { |
1417 | .buf = (char *) &mtk_reply_3g_capability_valid_parcel1, |
1418 | .buf_len = sizeof(mtk_reply_3g_capability_valid_parcel1), |
1419 | @@ -153,9 +153,9 @@ |
1420 | { |
1421 | GRil *gril = g_ril_new(NULL, OFONO_RIL_VENDOR_MTK); |
1422 | const struct rep_3g_capability_test *test = data; |
1423 | - int is_3g = g_mtk_reply_parse_get_3g_capability(gril, &test->msg); |
1424 | + int slot_3g = g_mtk_reply_parse_get_3g_capability(gril, &test->msg); |
1425 | |
1426 | - g_assert(is_3g == test->is_3g); |
1427 | + g_assert(slot_3g == test->slot_3g); |
1428 | |
1429 | g_ril_unref(gril); |
1430 | } |
1431 | |
1432 | === modified file 'unit/test-mtkrequest.c' |
1433 | --- unit/test-mtkrequest.c 2014-06-12 11:02:03 +0000 |
1434 | +++ unit/test-mtkrequest.c 2015-02-06 15:08:43 +0000 |
1435 | @@ -207,6 +207,18 @@ |
1436 | .parcel_size = sizeof(req_set_fd_mode_parcel_valid_2), |
1437 | }; |
1438 | |
1439 | +/* MTK: set_3g_capability tests */ |
1440 | + |
1441 | +static const guchar req_set_3g_capability_valid_1[] = { |
1442 | + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
1443 | +}; |
1444 | + |
1445 | +static const struct request_test_data set_set_3g_capability_valid_test_1 = { |
1446 | + .request = NULL, |
1447 | + .parcel_data = req_set_3g_capability_valid_1, |
1448 | + .parcel_size = sizeof(req_set_3g_capability_valid_1), |
1449 | +}; |
1450 | + |
1451 | /* Test functions */ |
1452 | |
1453 | static void test_mtk_req_sim_read_binary_valid(gconstpointer data) |
1454 | @@ -322,6 +334,19 @@ |
1455 | parcel_free(&rilp); |
1456 | } |
1457 | |
1458 | +static void test_request_set_3g_capability(gconstpointer data) |
1459 | +{ |
1460 | + const struct request_test_data *test_data = data; |
1461 | + struct parcel rilp; |
1462 | + |
1463 | + g_mtk_request_set_3g_capability(NULL, &rilp); |
1464 | + |
1465 | + g_assert(!memcmp(rilp.data, test_data->parcel_data, |
1466 | + test_data->parcel_size)); |
1467 | + |
1468 | + parcel_free(&rilp); |
1469 | +} |
1470 | + |
1471 | #endif /* LITTLE_ENDIAN */ |
1472 | |
1473 | int main(int argc, char **argv) |
1474 | @@ -376,6 +401,11 @@ |
1475 | &set_fd_mode_valid_test_2, |
1476 | test_request_set_fd_mode); |
1477 | |
1478 | + g_test_add_data_func("/testmtkrequest/mtk-settings: " |
1479 | + "valid SET_3G_CAPABILITY Test 1", |
1480 | + &set_set_3g_capability_valid_test_1, |
1481 | + test_request_set_3g_capability); |
1482 | + |
1483 | #endif /* LITTLE_ENDIAN */ |
1484 | |
1485 | return g_test_run(); |
LGTM