diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-05-09 06:30:04 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-05-09 13:24:28 +0200 |
commit | 2e9254ac3f5a17495c4f71c62f85a7b4512b97c0 (patch) | |
tree | cd5e7054783ecda4f5b3a8e416038cb3e7830b9e | |
parent | cb093ce878e7126f9ae764e6737e1a6348c2de87 (diff) |
cardem: Implement WWAN Modem reset via USB
Using the SIMTRACE_MSGT_DT_MODEM_RESET message
-rw-r--r-- | firmware/libcommon/source/mode_cardemu.c | 26 |
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; |