aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2012-09-27 10:55:20 -0500
committerDan Williams <dcbw@redhat.com>2012-11-14 11:04:31 -0600
commit613e761373fd06aa69f332cc278a4c9cf5841829 (patch)
tree7b96a647edffbf51b417b76826a7769bf28b0a29
parent6edd02de08f2876c249149559e11cef1e672f0b4 (diff)
qcdm: add qcdm_cmd_control_new() to set operating mode
-rw-r--r--libqcdm/src/commands.c29
-rw-r--r--libqcdm/src/commands.h13
-rw-r--r--libqcdm/src/dm-commands.h13
3 files changed, 55 insertions, 0 deletions
diff --git a/libqcdm/src/commands.c b/libqcdm/src/commands.c
index a33269ca..e53c4732 100644
--- a/libqcdm/src/commands.c
+++ b/libqcdm/src/commands.c
@@ -366,6 +366,35 @@ qcdm_cmd_esn_result (const char *buf, size_t len, int *out_error)
/**********************************************************************/
size_t
+qcdm_cmd_control_new (char *buf, size_t len, u_int8_t mode)
+{
+ char cmdbuf[5];
+ DMCmdControl *cmd = (DMCmdControl *) &cmdbuf[0];
+
+ qcdm_return_val_if_fail (buf != NULL, 0);
+ qcdm_return_val_if_fail (len >= sizeof (*cmd) + DIAG_TRAILER_LEN, 0);
+
+ memset (cmd, 0, sizeof (*cmd));
+ cmd->code = DIAG_CMD_CONTROL;
+ cmd->mode = htole16 ((u_int16_t) mode);
+
+ return dm_encapsulate_buffer (cmdbuf, sizeof (*cmd), sizeof (cmdbuf), buf, len);
+}
+
+QcdmResult *
+qcdm_cmd_control_result (const char *buf, size_t len, int *out_error)
+{
+ qcdm_return_val_if_fail (buf != NULL, NULL);
+
+ if (!check_command (buf, len, DIAG_CMD_CONTROL, sizeof (DMCmdControl), out_error))
+ return NULL;
+
+ return qcdm_result_new ();
+}
+
+/**********************************************************************/
+
+size_t
qcdm_cmd_cdma_status_new (char *buf, size_t len)
{
char cmdbuf[3];
diff --git a/libqcdm/src/commands.h b/libqcdm/src/commands.h
index 063152c6..d106ed03 100644
--- a/libqcdm/src/commands.h
+++ b/libqcdm/src/commands.h
@@ -92,6 +92,19 @@ QcdmResult *qcdm_cmd_esn_result (const char *buf,
/**********************************************************************/
+enum {
+ QCDM_CMD_CONTROL_MODE_OFFLINE = 1,
+ QCDM_CMD_CONTROL_MODE_RESET = 2,
+};
+
+size_t qcdm_cmd_control_new (char *buf, size_t len, u_int8_t mode);
+
+QcdmResult *qcdm_cmd_control_result (const char *buf,
+ size_t len,
+ int *out_error);
+
+/**********************************************************************/
+
/* Values for QCDM_CMD_CDMA_STATUS_ITEM_RF_MODE */
enum {
QCDM_CMD_CDMA_STATUS_RF_MODE_ANALOG = 0,
diff --git a/libqcdm/src/dm-commands.h b/libqcdm/src/dm-commands.h
index cc254bb7..1be04e92 100644
--- a/libqcdm/src/dm-commands.h
+++ b/libqcdm/src/dm-commands.h
@@ -246,6 +246,19 @@ struct DMCmdSubsysHeader {
} __attribute__ ((packed));
typedef struct DMCmdSubsysHeader DMCmdSubsysHeader;
+typedef enum {
+ DM_CONTROL_MODE_OFFLINE = 1,
+ DM_CONTROL_MODE_RESET = 2,
+} DMControlMode;
+
+/* DIAG_CMD_CONTROL */
+struct DMCmdControl {
+ u_int8_t code;
+ /* DMControlMode */
+ u_int16_t mode;
+} __attribute__ ((packed));
+typedef struct DMCmdControl DMCmdControl;
+
/* DIAG_CMD_NV_READ / DIAG_CMD_NV_WRITE */
struct DMCmdNVReadWrite {
u_int8_t code;