aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-05-09 06:30:04 +0200
committerHarald Welte <laforge@gnumonks.org>2017-05-09 13:24:28 +0200
commit2e9254ac3f5a17495c4f71c62f85a7b4512b97c0 (patch)
treecd5e7054783ecda4f5b3a8e416038cb3e7830b9e
parentcb093ce878e7126f9ae764e6737e1a6348c2de87 (diff)
cardem: Implement WWAN Modem reset via USB
Using the SIMTRACE_MSGT_DT_MODEM_RESET message
-rw-r--r--firmware/libcommon/source/mode_cardemu.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c
index ed18c11..2e50134 100644
--- a/firmware/libcommon/source/mode_cardemu.c
+++ b/firmware/libcommon/source/mode_cardemu.c
@@ -11,6 +11,7 @@
#include "llist_irqsafe.h"
#include "usb_buf.h"
#include "simtrace_prot.h"
+#include "wwan_perst.h"
#define TRACE_ENTRY() TRACE_DEBUG("%s entering\r\n", __func__)
@@ -496,6 +497,30 @@ static void dispatch_usb_command_cardem(struct msgb *msg, struct cardem_inst *ci
}
}
+static int usb_command_modem_reset(struct msgb *msg, struct cardem_inst *ci)
+{
+ struct st_modem_reset *mr = msg->l2h;
+
+ if (msgb_l2len(msg) < sizeof(*mr))
+ return -1;
+
+ switch (mr->asserted) {
+ case 0:
+ wwan_perst_set(ci->num, 0);
+ break;
+ case 1:
+ wwan_perst_set(ci->num, 1);
+ break;
+ case 2:
+ wwan_perst_do_reset_pulse(ci->num, mr->pulse_duration_msec);
+ break;
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
/* handle a single USB command as received from the USB host */
static void dispatch_usb_command_modem(struct msgb *msg, struct cardem_inst *ci)
{
@@ -504,6 +529,7 @@ static void dispatch_usb_command_modem(struct msgb *msg, struct cardem_inst *ci)
hdr = (struct simtrace_msg_hdr *) msg->l1h;
switch (hdr->msg_type) {
case SIMTRACE_MSGT_DT_MODEM_RESET:
+ usb_command_modem_reset(msg, ci);
break;
case SIMTRACE_MSGT_DT_MODEM_SIM_SELECT:
break;