RE: Failed to find primary AT port

2017-04-03 Thread Jan Graczyk
Hello Dan,

Thank you for your response. The next question I have for you is how to cross 
compile ModemManager for ARM architecture. I am using ModemManager version 
1.4.2 to build. Is that version stable enough to run on ARM based processor? 
The version of ModemManager on my target is 1.4.0 and it is working well.

Best Regards,

Jan Graczyk

-Original Message-
From: Dan Williams [mailto:d...@redhat.com] 
Sent: Friday, March 31, 2017 3:15 PM
To: Jan Graczyk 
Cc: modemmanager-devel@lists.freedesktop.org
Subject: Re: Failed to find primary AT port

On Fri, 2017-03-31 at 21:09 +, Jan Graczyk wrote:
> Hello Dan,
> 
> There is no problem with connecting to this modem (mini PCIe Quectel
> UC20 modem module) from kermit and sending AT commands. However when I 
> issue the following commands:
> 
>  mmcli -m 0 --simple-disconnect
>  mmcli -m 0 --simple-connect="pin=1234,apn=internet"
> 
> the ModemManager sends debug message "Failed to find primary AT port"
> to Linux console. However if I will power down and power up the 
> development board the ModemManager starts running properly. The 
> problem only happen when I issue the above disconnect and then connect 
> command.

The UC20 should be using QMI, not AT ports.  qmi_wwan support for the
UC20 has been there since 2013.  But to use it, you need to:

1) ensure qmi_wwan has been built for your kernel
2) ensure you build ModemManager with libqmi support (--with-qmi=yes)

This will solve both your problems, most likely.

Dan

> Best Regards,
> 
> Jan Graczyk
> 
> -Original Message-
> From: Dan Williams [mailto:d...@redhat.com]
> Sent: Friday, March 31, 2017 1:51 PM
> To: Jan Graczyk ; modemmanager-devel@lists.freedeskto
> p.org
> Subject: Re: Failed to find primary AT port
> 
> On Fri, 2017-03-31 at 20:35 +, Jan Graczyk wrote:
> > Hello All,
> > 
> > I have a problem with ModemManager failing to find primary AT port.
> > Her is the ModemManager debug log:
> 
> What kind of modem is this?
> 
> Does it require a specific baud rate and/or serial settings?
> 
> Can you talk to the modem with 'minicom' on that port when 
> ModemManager isn't running?
> 
> Dan
> 
> > root@linaro-alip:~# ModemManager --debug& [1] 1574 root@linaro-alip 
> > :~#
> > ModemManager[1574]:   [1490989871.011911] [main.c:140]
> > main():
> > ModemManager (version 1.4.0) starting in system bus...
> > ModemManager[1574]:  [1490989871.035558] [main.c:65]
> > bus_acquired_cb(): Bus acquired, creating manager...
> > ModemManager[1574]:  [1490989871.047317] [mm-plugin- 
> > manager.c:852] load_plugins(): Looking for plugins in
> > '/usr/lib/arm-
> > linux-gnueabihf/ModemManager'
> > ModemManager[1574]:  [1490989871.049618] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Option'
> > ModemManager[1574]:  [1490989871.051062] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Novatel LTE'
> > ModemManager[1574]:  [1490989871.052389] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Linktop'
> > ModemManager[1574]:  [1490989871.053841] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Samsung'
> > ModemManager[1574]:  [1490989871.055357] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Sierra'
> > ModemManager[1574]:  [1490989871.056738] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Gobi'
> > ModemManager[1574]:  [1490989871.058087] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'X22X'
> > ModemManager[1574]:  [1490989871.059471] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'MTK'
> > ModemManager[1574]:  [1490989871.060811] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'AnyDATA'
> > ModemManager[1574]:  [1490989871.062214] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Pantech'
> > ModemManager[1574]:  [1490989871.063564] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Novatel'
> > ModemManager[1574]:  [1490989871.065070] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Nokia'
> > ModemManager[1574]:  [1490989871.066426] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Motorola'
> > ModemManager[1574]:  [1490989871.067906] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Huawei'
> > ModemManager[1574]:  [1490989871.069276] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'SimTech'
> > ModemManager[1574]:  [1490989871.070701] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Option High-Speed'
> > ModemManager[1574]:  [1490989871.072078] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Generic'
> > ModemManager[1574]:  [1490989871.073583] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Iridium'
> > ModemManager[1574]:  [1490989871.075071] [mm-plugin- 
> > manager.c:877] load_plugins(): Loaded plugin 'Altair LTE'
> > ModemManager[1574]:  [1490989871.076609] [mm-plugin- 
> > manager.c:877] 

Re: [PATCH] novatel-lte: revert to original plugin library name

2017-04-03 Thread Dan Williams
On Mon, 2017-04-03 at 13:05 -0700, Ben Chan wrote:
> Commit f9c63bfa0 "build,plugins: update build rules" accidentally
> changed the Novatel LTE plugin from 'libmm-plugins-novatel-lte.so' to
> 'libmm-plugins-novatel_lte.so'. The name becomes inconsistent with
> other
> plugin names.

Seems fine to me.

Dan

> ---
> It probably doesn't matter how the plugin library is named, but the
> original
> name is preferred for consistency.
> 
> Ben
> 
>  plugins/Makefile.am | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/plugins/Makefile.am b/plugins/Makefile.am
> index 596866b7..2a4ff2b6 100644
> --- a/plugins/Makefile.am
> +++ b/plugins/Makefile.am
> @@ -720,7 +720,7 @@ libmm_plugin_thuraya_la_LIBADD   =
> $(builddir)/libhelpers-thuraya.la
>  # plugin: novatel lte
>  
> 
>  
> -pkglib_LTLIBRARIES += libmm-plugin-novatel_lte.la
> +pkglib_LTLIBRARIES += libmm-plugin-novatel-lte.la
>  libmm_plugin_novatel_lte_la_SOURCES = \
>   novatel/mm-plugin-novatel-lte.c \
>   novatel/mm-plugin-novatel-lte.h \
___
ModemManager-devel mailing list
ModemManager-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel


[PATCH] novatel-lte: revert to original plugin library name

2017-04-03 Thread Ben Chan
Commit f9c63bfa0 "build,plugins: update build rules" accidentally
changed the Novatel LTE plugin from 'libmm-plugins-novatel-lte.so' to
'libmm-plugins-novatel_lte.so'. The name becomes inconsistent with other
plugin names.
---
It probably doesn't matter how the plugin library is named, but the original
name is preferred for consistency.

Ben

 plugins/Makefile.am | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 596866b7..2a4ff2b6 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -720,7 +720,7 @@ libmm_plugin_thuraya_la_LIBADD   = 
$(builddir)/libhelpers-thuraya.la
 # plugin: novatel lte
 

 
-pkglib_LTLIBRARIES += libmm-plugin-novatel_lte.la
+pkglib_LTLIBRARIES += libmm-plugin-novatel-lte.la
 libmm_plugin_novatel_lte_la_SOURCES = \
novatel/mm-plugin-novatel-lte.c \
novatel/mm-plugin-novatel-lte.h \
-- 
2.12.2.564.g063fe858b8-goog

___
ModemManager-devel mailing list
ModemManager-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel


[PATCH] telit: fix AT+SERVICE 3GPP2 access technology reporting

2017-04-03 Thread Dan Williams
Looks like a C error from the AT#PSNT codepath; all the docs
I can find indicate that AT+SERVICE returns only an integer and
no commas:

 (ttyUSB2): --> 'AT+SERVICE?'
 (ttyUSB2): <-- '+SERVICE: 3OK'
 Couldn't refresh access technologies: 'Failed to parse +SERVICE 
response: '+SERVICE: 3''
---
 plugins/telit/mm-broadband-modem-telit.c | 7 +++
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/plugins/telit/mm-broadband-modem-telit.c 
b/plugins/telit/mm-broadband-modem-telit.c
index 6ef340f..7d453c8 100644
--- a/plugins/telit/mm-broadband-modem-telit.c
+++ b/plugins/telit/mm-broadband-modem-telit.c
@@ -828,7 +828,7 @@ response_processor_service_ignore_at_errors (MMBaseModem 
*self,
  GVariant **result,
  GError **result_error)
 {
-const gchar *service, *mode;
+const gchar *service;
 
 if (error) {
 /* Ignore AT errors (ie, ERROR or CMx ERROR) */
@@ -838,9 +838,8 @@ response_processor_service_ignore_at_errors (MMBaseModem 
*self,
 }
 
 service = mm_strip_tag (response, "+SERVICE:");
-mode = strchr (service, ',');
-if (mode) {
-switch (atoi (++mode)) {
+if (service) {
+switch (atoi (service)) {
 case 1:
 *result = g_variant_new_uint32 (MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
 return TRUE;
-- 
2.9.3
___
ModemManager-devel mailing list
ModemManager-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel


Re: [PATCH] novatel: port custom init and IMSI loading to use GTask

2017-04-03 Thread Ben Chan
sgtm. Forgot to add --in-reply-to, so the revised patches are sent to:

https://lists.freedesktop.org/archives/modemmanager-devel/2017-April/004394.html
https://lists.freedesktop.org/archives/modemmanager-devel/2017-April/004395.html

On Sun, Apr 2, 2017 at 12:28 AM, Aleksander Morgado
 wrote:
>
> Hey Ben,
>
> Looks like these 2 things could really be split into 2 different
> patches, could you do that?
>
> See other comments below inline.
>
> On Sat, Apr 1, 2017 at 8:05 PM, Ben Chan  wrote:
> > ---
> >  plugins/novatel/mm-common-novatel.c  | 54 +++---
> >  plugins/novatel/mm-sim-novatel-lte.c | 89 
> > 
> >  2 files changed, 66 insertions(+), 77 deletions(-)
> >
> > diff --git a/plugins/novatel/mm-common-novatel.c 
> > b/plugins/novatel/mm-common-novatel.c
> > index 4c39c7c7..32a90a66 100644
> > --- a/plugins/novatel/mm-common-novatel.c
> > +++ b/plugins/novatel/mm-common-novatel.c
> > @@ -23,21 +23,17 @@ typedef struct {
> >  MMPortProbe *probe;
> >  MMPortSerialAt *port;
> >  GCancellable *cancellable;
>
> You wouldn't really require a GCancellable in the context any more;
> just pass it to the GTask.
>
> > -GSimpleAsyncResult *result;
> >  guint nwdmat_retries;
> >  guint wait_time;
> >  } CustomInitContext;
> >
> >  static void
> > -custom_init_context_complete_and_free (CustomInitContext *ctx)
> > +custom_init_context_free (CustomInitContext *ctx)
> >  {
> > -g_simple_async_result_complete_in_idle (ctx->result);
> > -
> >  if (ctx->cancellable)
> >  g_object_unref (ctx->cancellable);
> >  g_object_unref (ctx->port);
> >  g_object_unref (ctx->probe);
> > -g_object_unref (ctx->result);
> >  g_slice_free (CustomInitContext, ctx);
> >  }
> >
> > @@ -46,15 +42,15 @@ mm_common_novatel_custom_init_finish (MMPortProbe 
> > *probe,
> >GAsyncResult *result,
> >GError **error)
> >  {
> > -return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT 
> > (result), error);
> > +return g_task_propagate_boolean (G_TASK (result), error);
> >  }
> >
> > -static void custom_init_step (CustomInitContext *ctx);
> > +static void custom_init_step (GTask *task);
> >
> >  static void
> >  nwdmat_ready (MMPortSerialAt *port,
> >GAsyncResult *res,
> > -  CustomInitContext *ctx)
> > +  GTask* task)
> >  {
> >  const gchar *response;
> >  GError *error = NULL;
> > @@ -64,7 +60,7 @@ nwdmat_ready (MMPortSerialAt *port,
> >  if (g_error_matches (error,
> >   MM_SERIAL_ERROR,
> >   MM_SERIAL_ERROR_RESPONSE_TIMEOUT)) {
> > -custom_init_step (ctx);
> > +custom_init_step (task);
> >  goto out;
> >  }
> >
> > @@ -72,8 +68,8 @@ nwdmat_ready (MMPortSerialAt *port,
> >  }
> >
> >  /* Finish custom_init */
> > -g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
> > -custom_init_context_complete_and_free (ctx);
> > +g_task_return_boolean (task, TRUE);
> > +g_object_unref (task);
> >
> >  out:
> >  if (error)
> > @@ -81,21 +77,25 @@ out:
> >  }
> >
> >  static gboolean
> > -custom_init_wait_cb (CustomInitContext *ctx)
> > +custom_init_wait_cb (GTask *task)
> >  {
> > -custom_init_step (ctx);
> > +custom_init_step (task);
> >  return G_SOURCE_REMOVE;
> >  }
> >
> >  static void
> > -custom_init_step (CustomInitContext *ctx)
> > +custom_init_step (GTask *task)
> >  {
> > +CustomInitContext *ctx;
> > +
> > +ctx = g_task_get_task_data (task);
> > +
> >  /* If cancelled, end */
> >  if (g_cancellable_is_cancelled (ctx->cancellable)) {
>
> And here you would g_cancellable_is_cancelled (g_task_get_cancellable (task))
>
> >  mm_dbg ("(Novatel) no need to keep on running custom init in (%s)",
> >  mm_port_get_device (MM_PORT (ctx->port)));
> > -g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
> > -custom_init_context_complete_and_free (ctx);
> > +g_task_return_boolean (task, TRUE);
> > +g_object_unref (task);
> >  return;
> >  }
> >
> > @@ -103,14 +103,14 @@ custom_init_step (CustomInitContext *ctx)
> >  if (mm_port_probe_list_has_qmi_port (mm_device_peek_port_probe_list 
> > (mm_port_probe_peek_device (ctx->probe {
> >  mm_dbg ("(Novatel) no need to run custom init in (%s): device has 
> > QMI port",
> >  mm_port_get_device (MM_PORT (ctx->port)));
> > -g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
> > -custom_init_context_complete_and_free (ctx);
> > +g_task_return_boolean (task, TRUE);
> > +g_object_unref (task);
> >  return;
> >  }
> >
> >  if (ctx->wait_time > 0) {
> >  ctx->wait_time--;
> > -   

[PATCH 2/2] novatel: port IMSI loading to use GTask

2017-04-03 Thread Ben Chan
---
 plugins/novatel/mm-sim-novatel-lte.c | 89 +++-
 1 file changed, 36 insertions(+), 53 deletions(-)

diff --git a/plugins/novatel/mm-sim-novatel-lte.c 
b/plugins/novatel/mm-sim-novatel-lte.c
index 41d30411..1088d0d0 100644
--- a/plugins/novatel/mm-sim-novatel-lte.c
+++ b/plugins/novatel/mm-sim-novatel-lte.c
@@ -39,20 +39,13 @@ load_imsi_finish (MMBaseSim *self,
   GAsyncResult *res,
   GError **error)
 {
-gchar *imsi;
-
-if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), 
error))
-return NULL;
-
-imsi = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT 
(res));
-mm_dbg ("loaded IMSI: %s", imsi);
-return g_strdup (imsi);
+return g_task_propagate_pointer (G_TASK (res), error);
 }
 
 static void
 imsi_read_ready (MMBaseModem *modem,
  GAsyncResult *res,
- GSimpleAsyncResult *simple)
+ GTask *task)
 {
 GError *error = NULL;
 const gchar *response, *str;
@@ -64,9 +57,8 @@ imsi_read_ready (MMBaseModem *modem,
 
 response = mm_base_modem_at_command_finish (modem, res, );
 if (!response) {
-g_simple_async_result_take_error (simple, error);
-g_simple_async_result_complete (simple);
-g_object_unref (simple);
+g_task_return_error (task, error);
+g_object_unref (task);
 return;
 }
 
@@ -76,13 +68,12 @@ imsi_read_ready (MMBaseModem *modem,
 /* With or without quotes... */
 if (sscanf (str, "%d,%d,\"%18c\"", , , (char *) ) != 3 &&
 sscanf (str, "%d,%d,%18c", , , (char *) ) != 3) {
-g_simple_async_result_set_error (simple,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "Failed to parse the CRSM response: 
'%s'",
- response);
-g_simple_async_result_complete (simple);
-g_object_unref (simple);
+g_task_return_new_error (task,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "Failed to parse the CRSM response: '%s'",
+ response);
+g_object_unref (task);
 return;
 }
 
@@ -90,13 +81,12 @@ imsi_read_ready (MMBaseModem *modem,
 (sw1 != 0x91) &&
 (sw1 != 0x92) &&
 (sw1 != 0x9f)) {
-g_simple_async_result_set_error (simple,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "SIM failed to handle CRSM request 
(sw1 %d sw2 %d)",
- sw1, sw2);
-g_simple_async_result_complete (simple);
-g_object_unref (simple);
+g_task_return_new_error (task,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "SIM failed to handle CRSM request (sw1 %d 
sw2 %d)",
+ sw1, sw2);
+g_object_unref (task);
 return;
 }
 
@@ -114,25 +104,23 @@ imsi_read_ready (MMBaseModem *modem,
 }
 
 /* Invalid character */
-g_simple_async_result_set_error (simple,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "CRSM IMSI response contained invalid 
character '%c'",
- buf[len]);
-g_simple_async_result_complete (simple);
-g_object_unref (simple);
+g_task_return_new_error (task,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "CRSM IMSI response contained invalid 
character '%c'",
+ buf[len]);
+g_object_unref (task);
 return;
 }
 
 /* BCD encoded IMSIs plus the length byte and parity are 18 digits long */
 if (len != 18) {
-g_simple_async_result_set_error (simple,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "Invalid +CRSM IMSI response size 
(was %zd, expected 18)",
- len);
-g_simple_async_result_complete (simple);
-g_object_unref (simple);
+g_task_return_new_error (task,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "Invalid +CRSM IMSI response size (was %zd, 
expected 18)",
+ len);
+g_object_unref (task);
 return;
 }
 
@@ -160,19 +148,17 @@ imsi_read_ready (MMBaseModem 

[PATCH 1/2] novatel: port custom init to use GTask

2017-04-03 Thread Ben Chan
---
 plugins/novatel/mm-common-novatel.c | 62 +
 1 file changed, 29 insertions(+), 33 deletions(-)

diff --git a/plugins/novatel/mm-common-novatel.c 
b/plugins/novatel/mm-common-novatel.c
index 4c39c7c7..a8f2da90 100644
--- a/plugins/novatel/mm-common-novatel.c
+++ b/plugins/novatel/mm-common-novatel.c
@@ -22,22 +22,15 @@
 typedef struct {
 MMPortProbe *probe;
 MMPortSerialAt *port;
-GCancellable *cancellable;
-GSimpleAsyncResult *result;
 guint nwdmat_retries;
 guint wait_time;
 } CustomInitContext;
 
 static void
-custom_init_context_complete_and_free (CustomInitContext *ctx)
+custom_init_context_free (CustomInitContext *ctx)
 {
-g_simple_async_result_complete_in_idle (ctx->result);
-
-if (ctx->cancellable)
-g_object_unref (ctx->cancellable);
 g_object_unref (ctx->port);
 g_object_unref (ctx->probe);
-g_object_unref (ctx->result);
 g_slice_free (CustomInitContext, ctx);
 }
 
@@ -46,15 +39,15 @@ mm_common_novatel_custom_init_finish (MMPortProbe *probe,
   GAsyncResult *result,
   GError **error)
 {
-return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT 
(result), error);
+return g_task_propagate_boolean (G_TASK (result), error);
 }
 
-static void custom_init_step (CustomInitContext *ctx);
+static void custom_init_step (GTask *task);
 
 static void
 nwdmat_ready (MMPortSerialAt *port,
   GAsyncResult *res,
-  CustomInitContext *ctx)
+  GTask* task)
 {
 const gchar *response;
 GError *error = NULL;
@@ -64,7 +57,7 @@ nwdmat_ready (MMPortSerialAt *port,
 if (g_error_matches (error,
  MM_SERIAL_ERROR,
  MM_SERIAL_ERROR_RESPONSE_TIMEOUT)) {
-custom_init_step (ctx);
+custom_init_step (task);
 goto out;
 }
 
@@ -72,8 +65,8 @@ nwdmat_ready (MMPortSerialAt *port,
 }
 
 /* Finish custom_init */
-g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
-custom_init_context_complete_and_free (ctx);
+g_task_return_boolean (task, TRUE);
+g_object_unref (task);
 
 out:
 if (error)
@@ -81,21 +74,25 @@ out:
 }
 
 static gboolean
-custom_init_wait_cb (CustomInitContext *ctx)
+custom_init_wait_cb (GTask *task)
 {
-custom_init_step (ctx);
+custom_init_step (task);
 return G_SOURCE_REMOVE;
 }
 
 static void
-custom_init_step (CustomInitContext *ctx)
+custom_init_step (GTask *task)
 {
+CustomInitContext *ctx;
+
+ctx = g_task_get_task_data (task);
+
 /* If cancelled, end */
-if (g_cancellable_is_cancelled (ctx->cancellable)) {
+if (g_cancellable_is_cancelled (g_task_get_cancellable (task))) {
 mm_dbg ("(Novatel) no need to keep on running custom init in (%s)",
 mm_port_get_device (MM_PORT (ctx->port)));
-g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
-custom_init_context_complete_and_free (ctx);
+g_task_return_boolean (task, TRUE);
+g_object_unref (task);
 return;
 }
 
@@ -103,14 +100,14 @@ custom_init_step (CustomInitContext *ctx)
 if (mm_port_probe_list_has_qmi_port (mm_device_peek_port_probe_list 
(mm_port_probe_peek_device (ctx->probe {
 mm_dbg ("(Novatel) no need to run custom init in (%s): device has QMI 
port",
 mm_port_get_device (MM_PORT (ctx->port)));
-g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
-custom_init_context_complete_and_free (ctx);
+g_task_return_boolean (task, TRUE);
+g_object_unref (task);
 return;
 }
 
 if (ctx->wait_time > 0) {
 ctx->wait_time--;
-g_timeout_add_seconds (1, (GSourceFunc)custom_init_wait_cb, ctx);
+g_timeout_add_seconds (1, (GSourceFunc)custom_init_wait_cb, task);
 return;
 }
 
@@ -121,17 +118,17 @@ custom_init_step (CustomInitContext *ctx)
3,
FALSE, /* raw */
FALSE, /* allow_cached */
-   ctx->cancellable,
+   g_task_get_cancellable (task),
(GAsyncReadyCallback)nwdmat_ready,
-   ctx);
+   task);
 return;
 }
 
 /* Finish custom_init */
 mm_dbg ("(Novatel) couldn't flip secondary port to AT in (%s): all retries 
consumed",
 mm_port_get_device (MM_PORT (ctx->port)));
-g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
-custom_init_context_complete_and_free (ctx);
+g_task_return_boolean (task, TRUE);
+g_object_unref (task);
 }
 
 void
@@ -142,17 +139,16 @@ mm_common_novatel_custom_init (MMPortProbe *probe,
gpointer 

Re: [PATCH] telit: add error_code recognition to +CSIM parser

2017-04-03 Thread Dan Williams
On Mon, 2017-04-03 at 17:01 +0200, Carlo Lobrano wrote:
> Updated mm_telit_parse_csim_response in order to correctly recognize
> the
> following +CSIM error codes:
> 
> * 6300 - Verification failed
> * 6983 - Authentication method blocked
> * 6984 - Reference data invalidated
> * 6A86 - Incorrect parameters
> * 6A88 - Reference data not found
> 
> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=100374
> ---
> 
> As a side note, I observed that sometimes the modem replies with
> error
> code
> 
> 6A86 - Incorrect parameters
> 
> when #QSS: 3 has not been received yet. This seems to be a modem's
> bug
> because the very same request is accepted as correct when issued
> later,
> namely when the SIM is ready.
> 
> ---
>  plugins/telit/mm-modem-helpers-telit.c| 96
> ---
>  plugins/telit/tests/test-mm-modem-helpers-telit.c | 43 +++---
>  2 files changed, 113 insertions(+), 26 deletions(-)
> 
> diff --git a/plugins/telit/mm-modem-helpers-telit.c
> b/plugins/telit/mm-modem-helpers-telit.c
> index c8c1f4b..cc8cf0a 100644
> --- a/plugins/telit/mm-modem-helpers-telit.c
> +++ b/plugins/telit/mm-modem-helpers-telit.c
> @@ -121,45 +121,115 @@ mm_telit_parse_csim_response (const guint
> step,
>  {
>  GRegex *r = NULL;
>  GMatchInfo *match_info = NULL;
> -gchar *retries_hex_str;
> -guint retries;
> +gchar *error_code = NULL;
> +gchar *retries_hex_str = NULL;
> +gint rtv = -1;
>  
> +/* Check for error codes */
> +r = g_regex_new ("\\+CSIM:\\s*[0-9]+,\\s*.*6300\"", G_REGEX_RAW,
> 0, NULL);
> +if (g_regex_match (r, response, 0, _info)) {
> +g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
> + "SIM verification failed");
> +goto out;
> +}

Can we do a single regex, capture the 4-hex-character response as part
of the regex, run g_ascii_strtoull() on it to get a uint, and then use
switch() to compare to known error codes instead?

Dan

> +g_match_info_free (match_info);
> +match_info = NULL;
> +g_regex_unref (r);
> +r = NULL;
> +
> +r = g_regex_new ("\\+CSIM:\\s*[0-9]+,\\s*.*69(.*)\"",
> G_REGEX_RAW, 0, NULL);
> +if (g_regex_match (r, response, 0, _info) &&
> +match_info != NULL &&
> +g_match_info_matches (match_info)) {
> +error_code = mm_get_string_unquoted_from_match_info
> (match_info, 1);
> +
> +if (error_code == NULL) {
> +g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
> + "Could not parse CSIM error code in
> response '%s'",
> + response);
> +} else if (strstr (error_code, "83") != NULL) {
> +g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
> + "SIM authentication method blocked");
> +} else if (strstr (error_code, "84") != NULL) {
> +g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
> + "SIM reference data invalidated");
> +} else {
> + g_set_error (error, MM_CORE_ERROR,
> MM_CORE_ERROR_FAILED,
> + "Unknown error code '69%s'", error_code);
> +}
> +
> +goto out;
> +}
> +
> +g_match_info_free (match_info);
> +match_info = NULL;
> +g_regex_unref (r);
> +r = NULL;
> +
> +r = g_regex_new ("\\+CSIM:\\s*[0-9]+,\\s*.*6A(.*)\"",
> G_REGEX_RAW, 0, NULL);
> +if (g_regex_match (r, response, 0, _info) &&
> +match_info != NULL &&
> +g_match_info_matches (match_info)) {
> +error_code = mm_get_string_unquoted_from_match_info
> (match_info, 1);
> +
> +if (error_code == NULL) {
> +g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
> + "Could not parse CSIM error code in
> response '%s'",
> + response);
> +} else if (strstr (error_code, "86") != NULL) {
> +g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
> + "Incorrect parameters in SIM request");
> +} else if (strstr (error_code, "88") != NULL) {
> +g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
> + "SIM reference data not found");
> +} else {
> + g_set_error (error, MM_CORE_ERROR,
> MM_CORE_ERROR_FAILED,
> + "Unknown error code '6A%s'", error_code);
> +}
> +
> +goto out;
> +}
> +
> +g_match_info_free (match_info);
> +match_info = NULL;
> +g_regex_unref (r);
> +r = NULL;
> +
> +/* No errors found. Get SIM retries */
>  r = g_regex_new ("\\+CSIM:\\s*[0-9]+,\\s*.*63C(.*)\"",
> G_REGEX_RAW, 0, NULL);
>  
>  if (!g_regex_match (r, response, 0, _info)) {
>  g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
>   "Could not parse reponse '%s'", response);
> -g_match_info_free (match_info);
> -g_regex_unref (r);
> 

[PATCH] telit: add error_code recognition to +CSIM parser

2017-04-03 Thread Carlo Lobrano
Updated mm_telit_parse_csim_response in order to correctly recognize the
following +CSIM error codes:

* 6300 - Verification failed
* 6983 - Authentication method blocked
* 6984 - Reference data invalidated
* 6A86 - Incorrect parameters
* 6A88 - Reference data not found

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=100374
---

As a side note, I observed that sometimes the modem replies with error
code

6A86 - Incorrect parameters

when #QSS: 3 has not been received yet. This seems to be a modem's bug
because the very same request is accepted as correct when issued later,
namely when the SIM is ready.

---
 plugins/telit/mm-modem-helpers-telit.c| 96 ---
 plugins/telit/tests/test-mm-modem-helpers-telit.c | 43 +++---
 2 files changed, 113 insertions(+), 26 deletions(-)

diff --git a/plugins/telit/mm-modem-helpers-telit.c 
b/plugins/telit/mm-modem-helpers-telit.c
index c8c1f4b..cc8cf0a 100644
--- a/plugins/telit/mm-modem-helpers-telit.c
+++ b/plugins/telit/mm-modem-helpers-telit.c
@@ -121,45 +121,115 @@ mm_telit_parse_csim_response (const guint step,
 {
 GRegex *r = NULL;
 GMatchInfo *match_info = NULL;
-gchar *retries_hex_str;
-guint retries;
+gchar *error_code = NULL;
+gchar *retries_hex_str = NULL;
+gint rtv = -1;
 
+/* Check for error codes */
+r = g_regex_new ("\\+CSIM:\\s*[0-9]+,\\s*.*6300\"", G_REGEX_RAW, 0, NULL);
+if (g_regex_match (r, response, 0, _info)) {
+g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "SIM verification failed");
+goto out;
+}
+
+g_match_info_free (match_info);
+match_info = NULL;
+g_regex_unref (r);
+r = NULL;
+
+r = g_regex_new ("\\+CSIM:\\s*[0-9]+,\\s*.*69(.*)\"", G_REGEX_RAW, 0, 
NULL);
+if (g_regex_match (r, response, 0, _info) &&
+match_info != NULL &&
+g_match_info_matches (match_info)) {
+error_code = mm_get_string_unquoted_from_match_info (match_info, 1);
+
+if (error_code == NULL) {
+g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Could not parse CSIM error code in response '%s'",
+ response);
+} else if (strstr (error_code, "83") != NULL) {
+g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "SIM authentication method blocked");
+} else if (strstr (error_code, "84") != NULL) {
+g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "SIM reference data invalidated");
+} else {
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Unknown error code '69%s'", error_code);
+}
+
+goto out;
+}
+
+g_match_info_free (match_info);
+match_info = NULL;
+g_regex_unref (r);
+r = NULL;
+
+r = g_regex_new ("\\+CSIM:\\s*[0-9]+,\\s*.*6A(.*)\"", G_REGEX_RAW, 0, 
NULL);
+if (g_regex_match (r, response, 0, _info) &&
+match_info != NULL &&
+g_match_info_matches (match_info)) {
+error_code = mm_get_string_unquoted_from_match_info (match_info, 1);
+
+if (error_code == NULL) {
+g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Could not parse CSIM error code in response '%s'",
+ response);
+} else if (strstr (error_code, "86") != NULL) {
+g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Incorrect parameters in SIM request");
+} else if (strstr (error_code, "88") != NULL) {
+g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "SIM reference data not found");
+} else {
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Unknown error code '6A%s'", error_code);
+}
+
+goto out;
+}
+
+g_match_info_free (match_info);
+match_info = NULL;
+g_regex_unref (r);
+r = NULL;
+
+/* No errors found. Get SIM retries */
 r = g_regex_new ("\\+CSIM:\\s*[0-9]+,\\s*.*63C(.*)\"", G_REGEX_RAW, 0, 
NULL);
 
 if (!g_regex_match (r, response, 0, _info)) {
 g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
  "Could not parse reponse '%s'", response);
-g_match_info_free (match_info);
-g_regex_unref (r);
-return -1;
+goto out;
 }
 
 if (!g_match_info_matches (match_info)) {
 g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
  "Could not find matches in response '%s'", response);
-g_match_info_free (match_info);
-g_regex_unref (r);
-return -1;
+goto out;
 }
 
 retries_hex_str = mm_get_string_unquoted_from_match_info (match_info, 1);
 g_assert (NULL != retries_hex_str);
 
 /* convert hex value to uint */
-if 

Re: Quectel UC20: Correct way to get it up and running on embedded?

2017-04-03 Thread Einar Jón
Hi again.

This is still a mess...

On 28 March 2017 at 22:45, Aleksander Morgado  wrote:
> On Tue, Mar 28, 2017 at 8:39 PM, Dan Williams  wrote:
>>> > > RE PolicyMismatch: we're not quite sure what that error
>>> > > represents;
>>> > > we've determined that in some cases it means IPv4 vs. IPv6
>>> > > mismatch and
>>> > > profiles in the modem, but that doesn't seem to always be the
>>> > > case.
>>> >
>>> > I'm not sure what is causing it, but it's quite easy to reproduce
>>> > by
>>> > messing with the kernel module (e.g. reloading it):
>>> > $ sudo rmmod qmi_wwan
>>> > $ sudo modprobe qmi_wwan
>>>
>>> My best guess is that you experience some mismatch between an
>>> auto-connected bearer and the bearer you try to connect.  But it's a
>>> wild guess.  Try messing with the preconfigured profiles, changing
>>> between IP, IPV6 and IPV4V6 contexts and see if you can prevent the
>>> issue that way.

I'm not sure how to do that. mmcli -m 0 returns:
  IP   |  supported: 'ipv4, ipv6, ipv4v6'

I can easily trigger the mismatch with an usbreset, like Bjørn
suggested - it does not fix the broken state, but it gets me into
it... :(
I think it might be related to the changing modem ID.
# on startup:
Mar 29 13:29:59 ubuntu12 modemmonitor[1508]: Setup modem:
/org/freedesktop/ModemManager1/Modem/0
Mar 29 13:29:59 ubuntu12 modemmonitor[1508]: Sim:
/org/freedesktop/ModemManager1/SIM/0
# do rmmod/modprobe qmi_wwan or usbreset (like Björn recommeded)
Mar 29 13:33:55 ubuntu12 modemmonitor[1508]: Setup modem:
/org/freedesktop/ModemManager1/Modem/1
Mar 29 13:33:55 ubuntu12 modemmonitor[1508]: Sim:
/org/freedesktop/ModemManager1/SIM/1
# do rmmod/modprobe qmi_wwan or usbreset again
Mar 29 13:40:41 ubuntu12 modemmonitor[1508]: Setup modem:
/org/freedesktop/ModemManager1/Modem/2
Mar 29 13:40:41 ubuntu12 modemmonitor[1508]: Sim:
/org/freedesktop/ModemManager1/SIM/2

Each time I do a rmmod/modprobe qmi_wwan or usbreset the ID of the
Modem/SIM is increased by 1.
After the first one I get the error on bearer connect:
Bearer connect failed (attempt 4):
org.freedesktop.libqmi.Error.Protocol.PolicyMismatch: QMI protocol
error (79): 'PolicyMismatch'
Killing ModemManager and restarting it does not help.

I think I have to reset the modem, but the only proper way to do that
seems to be sending an AT+QRST=1,0 command to the modem. That can be
done with a tool like minicom (minicom -b 115200  /dev/ttyUSB3)
I recompiled the kernel with Qualcomm additions to add
/dev/ttyUSB[0-3] devices, but now it seems like ModemManager is
hogging ttyUSB3:
$ sudo lsof /dev/ttyUSB3
COMMANDPID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
ModemMana 5024 root   11u   CHR  188,3  0t0 476554 /dev/ttyUSB3

$ mmcli  -m 1
  System   | device:
'/sys/devices/pci:00/:00:17.0/:01:00.0/:02:08.3/usb2/2-3'
   |drivers: 'qmi_wwan, option1'
   | plugin: 'Generic'
   |   primary port: 'cdc-wdm0'
   |  ports: 'ttyUSB0 (qcdm), ttyUSB2 (at), ttyUSB3
(at), wwan0 (net), cdc-wdm0 (qmi)'

If I stop the modemmanager service I can connect to the  /dev/ttyUSB3.

Why/how is ModemManager using the serial port?
Can I send a serial command via the python interface of ModemManager?
Basically this, in python, and not only allowed in debug mode...
$ mmcli -m 0 --command="AT+QRST=1,0"
error: command failed:
'GDBus.Error:org.freedesktop.ModemManager1.Error.Core.Unauthorized:
Cannot send AT command to modem: operation only allowed in debug mode'

>>
>> Are the QMI "autoconnect" settings actually the EPS Default Bearer, or
>> are they different?  Maybe
>>
>> qmicli --wds-set-autoconnect-settings=disabled
>>
>> would do the trick, but I don't know for sure.
>
> I don't think the auto-connection in QMI relates to the EPS Default
> Bearer, although also, not sure :)

I'm not sure if this is helpful, but my qmicli is old (ubuntu 12) so
there are no
--wds-set-* commands available.
I did try
sudo qmicli -d /dev/cdc-wdm0 --wds-reset -p -v
and that succeeded, but my modem still gets the PolicyMismatch error.

$ qmicli -V

qmicli 1.12.6
Copyright (C) 2015 Aleksander Morgado
License GPLv2+: GNU GPL version 2 or later

This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ qmicli --help-wds
Usage:
  qmicli [OPTION...] - Control QMI devices

WDS options
  --wds-start-network=[(APN),(PAP|CHAP|BOTH),(Username),(Password)]
 Start network (Authentication, Username and Password
are optional)
  --wds-follow-network
 Follow the network status until disconnected. Use
with `--wds-start-network'
  --wds-stop-network=[Packet data handle]
 Stop network
  --wds-get-packet-service-status
 Get packet service status
  --wds-get-packet-statistics
 Get packet statistics
  --wds-get-data-bearer-technology

Re: [PATCH 1/1] mbim-modem: disable location interface

2017-04-03 Thread Aleksander Morgado
On Mon, Apr 3, 2017 at 8:52 AM, Thomas Voß  wrote:
> On Sun, Apr 2, 2017 at 10:37 AM, Aleksander Morgado
>  wrote:
>>
>> On Sat, Apr 1, 2017 at 10:11 PM, Thomas Voß
>>  wrote:
>> > MBIM does not support 3gpp location data right now. For that,
>> > we make sure that the location interface is not reported as
>> > supported by MBIM modems.
>> > ---
>>
>> Ideally, we would be checking if the MBIM modem supports QMI over
>> MBIM, and defaulting to the QMI implementation if so, but that
>> wouldn't apply only to the location interface.
>>
>
> +1. I was thinking whether falling back even further to AT command
> sequences would make sense for
> handling device specific quirks. What do you think?

Yes, we could do that in the generic MBIM implementation for things
considered as standard, e.g. the 3GPP location, but you not always
have AT ports when MBIM is enabled, so it really depends. Same as QMI
over MBIM, not all devices support that, but probably the fallback to
AT commands may be easier, as you would just need to "call the parent
method" when the MBIM specific method isn't implemented; but that
would need to be done per feature, not as a default thing for every
method.

-- 
Aleksander
https://aleksander.es
___
ModemManager-devel mailing list
ModemManager-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel


Re: [PATCH 0/1] mbim modem: disable location interface

2017-04-03 Thread Thomas Voß
On Sun, Apr 2, 2017 at 9:18 AM, Aleksander Morgado
 wrote:
> On Sat, Apr 1, 2017 at 10:11 PM, Thomas Voß
>  wrote:
>> A simple patch to avoid MBIM modems reporting that they support the location 
>> interface.
>> I haven't submitted patches to mailing list in quite a while, so please bear 
>> with me
>> while I'm learning.
>
> No problem! What you did is perfectly fine. One extra tip:
>
> When sending a single patch with git send-email, you don't really need
> a cover letter (i.e. the PATCH 0/N email). Instead, you can abuse the
> email formatting and embed the introduction email you would have in
> the cover letter directly in the patch itself (e.g. with the
> --annotate option in git send-email). Just make sure the format of the
> introductory text goes inserted AFTER the commit message, like this:
>
> 
> MBIM does not support 3gpp location data right now. For that,
> we make sure that the location interface is not reported as
> supported by MBIM modems.
> ---
>
> You add an extra line with "---" after the one you find in the patch,
> and you add your introductory message in between. The content between
> the two lines with "---" will not be included as part of the commit
> message when it is "git am"-ed, but will still be visible in the patch
> email.
>

Great, thanks for the hint :)

Cheers,

  Thomas

> ---
>  src/mm-broadband-modem-mbim.c | 12 
>  1 file changed, 12 insertions(+)
> 
>
>
> --
> Aleksander
> https://aleksander.es
___
ModemManager-devel mailing list
ModemManager-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel


Re: [PATCH 1/1] mbim-modem: disable location interface

2017-04-03 Thread Thomas Voß
On Sun, Apr 2, 2017 at 10:37 AM, Aleksander Morgado
 wrote:
>
> On Sat, Apr 1, 2017 at 10:11 PM, Thomas Voß
>  wrote:
> > MBIM does not support 3gpp location data right now. For that,
> > we make sure that the location interface is not reported as
> > supported by MBIM modems.
> > ---
>
> Ideally, we would be checking if the MBIM modem supports QMI over
> MBIM, and defaulting to the QMI implementation if so, but that
> wouldn't apply only to the location interface.
>

+1. I was thinking whether falling back even further to AT command
sequences would make sense for
handling device specific quirks. What do you think?

>
> Anyway, I think this patch isn't bad, given that MBIM doesn't really
> report any LAC/CID.
>
> Pushed to git master
>

Thanks :)

  Thomas

>
> >  src/mm-broadband-modem-mbim.c | 12 
> >  1 file changed, 12 insertions(+)
> >
> > diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
> > index c5286a3f..0d1126d4 100644
> > --- a/src/mm-broadband-modem-mbim.c
> > +++ b/src/mm-broadband-modem-mbim.c
> > @@ -35,6 +35,7 @@
> >  #include "mm-bearer-list.h"
> >  #include "mm-iface-modem.h"
> >  #include "mm-iface-modem-3gpp.h"
> > +#include "mm-iface-modem-location.h"
> >  #include "mm-iface-modem-messaging.h"
> >  #include "mm-iface-modem-signal.h"
> >  #include "mm-sms-part-3gpp.h"
> > @@ -45,12 +46,14 @@
> >
> >  static void iface_modem_init   (MMIfaceModem  *iface);
> >  static void iface_modem_3gpp_init  (MMIfaceModem3gpp  *iface);
> > +static void iface_modem_location_init  (MMIfaceModemLocation  *iface);
> >  static void iface_modem_messaging_init (MMIfaceModemMessaging *iface);
> >  static void iface_modem_signal_init(MMIfaceModemSignal*iface);
> >
> >  G_DEFINE_TYPE_EXTENDED (MMBroadbandModemMbim, mm_broadband_modem_mbim, 
> > MM_TYPE_BROADBAND_MODEM, 0,
> >  G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, 
> > iface_modem_init)
> >  G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_3GPP, 
> > iface_modem_3gpp_init)
> > +G_IMPLEMENT_INTERFACE 
> > (MM_TYPE_IFACE_MODEM_LOCATION, iface_modem_location_init)
> >  G_IMPLEMENT_INTERFACE 
> > (MM_TYPE_IFACE_MODEM_MESSAGING, iface_modem_messaging_init)
> >  G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_SIGNAL, 
> > iface_modem_signal_init))
> >
> > @@ -3288,6 +3291,15 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface)
> >  }
> >
> >  static void
> > +iface_modem_location_init (MMIfaceModemLocation *iface)
> > +{
> > +iface->load_capabilities = NULL;
> > +iface->load_capabilities_finish = NULL;
> > +iface->enable_location_gathering = NULL;
> > +iface->enable_location_gathering_finish = NULL;
> > +}
> > +
> > +static void
> >  iface_modem_messaging_init (MMIfaceModemMessaging *iface)
> >  {
> >  iface->check_support = messaging_check_support;
> > --
> > 2.11.0
> >
> > ___
> > ModemManager-devel mailing list
> > ModemManager-devel@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel
>
>
>
> --
> Aleksander
> https://aleksander.es
___
ModemManager-devel mailing list
ModemManager-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel