intel: XMM7360: RPC and AT port interlocking
We have to avoid sending RPC and AT commands at the same time (even thought they are sent via different serial ports) since apparently this modems does not like it. It also looks like this modem does not like to receive a RPC command soon after an AT one, since such RPC commands sometimes fail to generate any response. Prevent this problem by delaying a RPC command if there was an AT command completed recently. The sufficient time gap was determined experimentally, but 300 ms seems to be enough. RPC commands are relatively rare so this should not be a performance issue. Otherwise we often never get any response to RPC calls if AT command happens to be sent at the same time. Signed-off-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
This commit is contained in:
committed by
Dan Williams
parent
df9f2d0de5
commit
5059b812fc
@@ -36,6 +36,7 @@
|
||||
|
||||
#include "mm-broadband-modem-xmm7360.h"
|
||||
#include "mm-broadband-modem-xmm7360-rpc.h"
|
||||
#include "mm-port-scheduler-rr.h"
|
||||
#include "mm-port-serial-xmmrpc-xmm7360.h"
|
||||
#include "mm-bearer-xmm7360.h"
|
||||
#include "mm-sim-xmm7360.h"
|
||||
@@ -1108,6 +1109,8 @@ initialization_started (MMBroadbandModem *modem,
|
||||
MMBroadbandModemXmm7360 *self = MM_BROADBAND_MODEM_XMM7360 (modem);
|
||||
InitializationStartedContext *ctx;
|
||||
GTask *task;
|
||||
MMPortSerialAt *at_port;
|
||||
g_autoptr(MMPortScheduler) sched = NULL;
|
||||
|
||||
task = g_task_new (self,
|
||||
NULL,
|
||||
@@ -1120,6 +1123,14 @@ initialization_started (MMBroadbandModem *modem,
|
||||
ctx->timeout_id = 0;
|
||||
g_task_set_task_data (task, ctx, (GDestroyNotify)initialization_started_context_free);
|
||||
|
||||
at_port = mm_base_modem_peek_port_primary (MM_BASE_MODEM (self));
|
||||
if (!at_port) {
|
||||
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_INITIALIZED,
|
||||
"no primary AT port");
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Open XMMRPC port for initialization */
|
||||
if (!mm_port_serial_open (MM_PORT_SERIAL (ctx->port), &error)) {
|
||||
g_prefix_error (&error, "Couldn't open XMMRPC port during initialization: ");
|
||||
@@ -1134,6 +1145,13 @@ initialization_started (MMBroadbandModem *modem,
|
||||
task,
|
||||
NULL);
|
||||
|
||||
g_object_get (G_OBJECT (ctx->port), MM_PORT_SERIAL_SCHEDULER, &sched, NULL);
|
||||
g_object_set (sched,
|
||||
MM_PORT_SCHEDULER_RR_INTER_PORT_DELAY,
|
||||
300,
|
||||
NULL);
|
||||
g_object_set (G_OBJECT (at_port), MM_PORT_SERIAL_SCHEDULER, sched, NULL);
|
||||
|
||||
mm_obj_dbg (self, "running init sequence...");
|
||||
mm_broadband_modem_xmm7360_rpc_sequence_full (MM_BROADBAND_MODEM_XMM7360 (self),
|
||||
ctx->port,
|
||||
|
||||
Reference in New Issue
Block a user