123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
- #ifndef _QMI_ENCDEC_H_
- #define _QMI_ENCDEC_H_
- #include <linux/types.h>
- #include <linux/errno.h>
- #include <linux/mm.h>
- #include <linux/list.h>
- #include <linux/socket.h>
- #include <linux/gfp.h>
- #define QMI_REQUEST_CONTROL_FLAG 0x00
- #define QMI_RESPONSE_CONTROL_FLAG 0x02
- #define QMI_INDICATION_CONTROL_FLAG 0x04
- #define QMI_HEADER_SIZE 7
- /**
- * elem_type - Enum to identify the data type of elements in a data
- * structure.
- */
- enum elem_type {
- QMI_OPT_FLAG = 1,
- QMI_DATA_LEN,
- QMI_UNSIGNED_1_BYTE,
- QMI_UNSIGNED_2_BYTE,
- QMI_UNSIGNED_4_BYTE,
- QMI_UNSIGNED_8_BYTE,
- QMI_SIGNED_2_BYTE_ENUM,
- QMI_SIGNED_4_BYTE_ENUM,
- QMI_STRUCT,
- QMI_EOTI,
- };
- /**
- * array_type - Enum to identify if an element in a data structure is
- * an array. If so, then is it a static length array or a
- * variable length array.
- */
- enum array_type {
- NO_ARRAY = 0,
- STATIC_ARRAY = 1,
- VAR_LEN_ARRAY = 2,
- };
- /**
- * elem_info - Data structure to specify information about an element
- * in a data structure. An array of this data structure
- * can be used to specify info about a complex data
- * structure to be encoded/decoded.
- *
- * @data_type: Data type of this element.
- * @elem_len: Array length of this element, if an array.
- * @elem_size: Size of a single instance of this data type.
- * @is_array: Array type of this element.
- * @tlv_type: QMI message specific type to identify which element
- * is present in an incoming message.
- * @offset: To identify the address of the first instance of this
- * element in the data structure.
- * @ei_array: Array to provide information about the nested structure
- * within a data structure to be encoded/decoded.
- */
- struct elem_info {
- enum elem_type data_type;
- uint32_t elem_len;
- uint32_t elem_size;
- enum array_type is_array;
- uint8_t tlv_type;
- uint32_t offset;
- struct elem_info *ei_array;
- };
- /**
- * @msg_desc - Describe about the main/outer structure to be
- * encoded/decoded.
- *
- * @max_msg_len: Maximum possible length of the QMI message.
- * @ei_array: Array to provide information about a data structure.
- */
- struct msg_desc {
- uint16_t msg_id;
- int max_msg_len;
- struct elem_info *ei_array;
- };
- struct qmi_header {
- unsigned char cntl_flag;
- uint16_t txn_id;
- uint16_t msg_id;
- uint16_t msg_len;
- } __attribute__((__packed__));
- static inline void encode_qmi_header(unsigned char *buf,
- unsigned char cntl_flag, uint16_t txn_id,
- uint16_t msg_id, uint16_t msg_len)
- {
- struct qmi_header *hdr = (struct qmi_header *)buf;
- hdr->cntl_flag = cntl_flag;
- hdr->txn_id = txn_id;
- hdr->msg_id = msg_id;
- hdr->msg_len = msg_len;
- }
- static inline void decode_qmi_header(unsigned char *buf,
- unsigned char *cntl_flag, uint16_t *txn_id,
- uint16_t *msg_id, uint16_t *msg_len)
- {
- struct qmi_header *hdr = (struct qmi_header *)buf;
- *cntl_flag = hdr->cntl_flag;
- *txn_id = hdr->txn_id;
- *msg_id = hdr->msg_id;
- *msg_len = hdr->msg_len;
- }
- #ifdef CONFIG_QMI_ENCDEC
- /**
- * qmi_kernel_encode() - Encode to QMI message wire format
- * @desc: Pointer to structure descriptor.
- * @out_buf: Buffer to hold the encoded QMI message.
- * @out_buf_len: Length of the out buffer.
- * @in_c_struct: C Structure to be encoded.
- *
- * @return: size of encoded message on success, < 0 on error.
- */
- int qmi_kernel_encode(struct msg_desc *desc,
- void *out_buf, uint32_t out_buf_len,
- void *in_c_struct);
- /**
- * qmi_kernel_decode() - Decode to C Structure format
- * @desc: Pointer to structure descriptor.
- * @out_c_struct: Buffer to hold the decoded C structure.
- * @in_buf: Buffer containg the QMI message to be decoded.
- * @in_buf_len: Length of the incoming QMI message.
- *
- * @return: 0 on success, < 0 on error.
- */
- int qmi_kernel_decode(struct msg_desc *desc, void *out_c_struct,
- void *in_buf, uint32_t in_buf_len);
- /**
- * qmi_verify_max_msg_len() - Verify the maximum length of a QMI message
- * @desc: Pointer to structure descriptor.
- *
- * @return: true if the maximum message length embedded in structure
- * descriptor matches the calculated value, else false.
- */
- bool qmi_verify_max_msg_len(struct msg_desc *desc);
- #else
- static inline int qmi_kernel_encode(struct msg_desc *desc,
- void *out_buf, uint32_t out_buf_len,
- void *in_c_struct)
- {
- return -EOPNOTSUPP;
- }
- static inline int qmi_kernel_decode(struct msg_desc *desc,
- void *out_c_struct,
- void *in_buf, uint32_t in_buf_len)
- {
- return -EOPNOTSUPP;
- }
- static inline bool qmi_verify_max_msg_len(struct msg_desc *desc)
- {
- return false;
- }
- #endif
- #endif
|