cardem: Implement WWAN Modem reset via USB

Using the SIMTRACE_MSGT_DT_MODEM_RESET message
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 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 @@
 	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;