int qmi_set_wms_send_from_memory_storage_request(struct qmi_msg *msg, struct qmi_wms_send_from_memory_storage_request *req) { qmi_init_request_message(msg, QMI_SERVICE_WMS); msg->svc.message = cpu_to_le16(0x0042); if (req->set.information) { void *buf; int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.information.storage_type, 1); put_tlv_var(uint32_t, cpu_to_le32(req->data.information.memory_index), 4); put_tlv_var(uint8_t, req->data.information.message_mode, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x01, ofs, buf); } if (req->set.sms_on_ims) { void *buf; int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.sms_on_ims, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x10, ofs, buf); } return 0; }
int qmi_set_wms_modify_tag_request(struct qmi_msg *msg, struct qmi_wms_modify_tag_request *req) { qmi_init_request_message(msg, QMI_SERVICE_WMS); msg->svc.message = cpu_to_le16(0x0023); if (req->set.message_tag) { void *buf; int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.message_tag.storage_type, 1); put_tlv_var(uint32_t, cpu_to_le32(req->data.message_tag.memory_index), 4); put_tlv_var(uint8_t, req->data.message_tag.message_tag, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x01, ofs, buf); } if (req->set.message_mode) { void *buf; int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.message_mode, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x10, ofs, buf); } return 0; }
int qmi_parse_wms_get_message_protocol_response(struct qmi_msg *msg, struct qmi_wms_get_message_protocol_response *res) { void *tlv_buf = &msg->svc.tlv; int tlv_len = le16_to_cpu(msg->svc.tlv_len); struct tlv *tlv; int i; memset(res, 0, sizeof(*res)); __qmi_alloc_reset(); while ((tlv = tlv_get_next(&tlv_buf, &tlv_len)) != NULL) { unsigned int cur_tlv_len = le16_to_cpu(tlv->len); unsigned int ofs = 0; switch(tlv->type) { case 0x01: qmi_set(res, message_protocol, *(uint8_t *) get_next(1)); break; default: break; } } return 0; error_len: fprintf(stderr, "%s: Invalid TLV length in message, tlv=0x%02x, len=%d\n", __func__, tlv->type, le16_to_cpu(tlv->len)); return QMI_ERROR_INVALID_DATA; }
int qmi_parse_wms_send_from_memory_storage_response(struct qmi_msg *msg, struct qmi_wms_send_from_memory_storage_response *res) { void *tlv_buf = &msg->svc.tlv; int tlv_len = le16_to_cpu(msg->svc.tlv_len); struct tlv *tlv; int i; memset(res, 0, sizeof(*res)); __qmi_alloc_reset(); while ((tlv = tlv_get_next(&tlv_buf, &tlv_len)) != NULL) { unsigned int cur_tlv_len = le16_to_cpu(tlv->len); unsigned int ofs = 0; switch(tlv->type) { case 0x10: qmi_set(res, message_id, le16_to_cpu(*(uint16_t *) get_next(2))); break; case 0x11: qmi_set(res, cdma_cause_code, le16_to_cpu(*(uint16_t *) get_next(2))); break; case 0x12: qmi_set(res, cdma_error_class, *(uint8_t *) get_next(1)); break; case 0x13: res->set.gsm_wcdma_cause_info = 1; res->data.gsm_wcdma_cause_info.rp_cause = le16_to_cpu(*(uint16_t *) get_next(2)); res->data.gsm_wcdma_cause_info.tp_cause = *(uint8_t *) get_next(1); break; case 0x14: qmi_set(res, message_delivery_failure_type, *(uint8_t *) get_next(1)); break; default: break; } } return 0; error_len: fprintf(stderr, "%s: Invalid TLV length in message, tlv=0x%02x, len=%d\n", __func__, tlv->type, le16_to_cpu(tlv->len)); return QMI_ERROR_INVALID_DATA; }
int qmi_set_wms_set_routes_request(struct qmi_msg *msg, struct qmi_wms_set_routes_request *req) { qmi_init_request_message(msg, QMI_SERVICE_WMS); msg->svc.message = cpu_to_le16(0x0032); if (req->data.route_list) { void *buf; int ofs; int i; __qmi_alloc_reset(); put_tlv_var(uint16_t, cpu_to_le16(req->data.route_list_n), 2); for (i = 0; i < req->data.route_list_n; i++) { put_tlv_var(uint8_t, req->data.route_list[i].message_type, 1); put_tlv_var(uint8_t, req->data.route_list[i].message_class, 1); put_tlv_var(uint8_t, req->data.route_list[i].storage, 1); put_tlv_var(uint8_t, req->data.route_list[i].receipt_action, 1); } buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x01, ofs, buf); } if (req->set.transfer_status_report) { void *buf; int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.transfer_status_report, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x10, ofs, buf); } return 0; }
int qmi_set_wms_set_event_report_request(struct qmi_msg *msg, struct qmi_wms_set_event_report_request *req) { qmi_init_request_message(msg, QMI_SERVICE_WMS); msg->svc.message = cpu_to_le16(0x0001); if (req->set.new_mt_message_indicator) { void *buf; int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.new_mt_message_indicator.report, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x10, ofs, buf); } return 0; }
int qmi_set_pds_set_auto_tracking_state_request(struct qmi_msg *msg, struct qmi_pds_set_auto_tracking_state_request *req) { qmi_init_request_message(msg, QMI_SERVICE_PDS); msg->svc.message = cpu_to_le16(0x0031); if (req->set.state) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.state.auto_tracking_state, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x01, ofs, buf); } return 0; }
int qmi_parse_wms_get_routes_response(struct qmi_msg *msg, struct qmi_wms_get_routes_response *res) { void *tlv_buf = &msg->svc.tlv; int tlv_len = le16_to_cpu(msg->svc.tlv_len); struct tlv *tlv; int i; memset(res, 0, sizeof(*res)); __qmi_alloc_reset(); while ((tlv = tlv_get_next(&tlv_buf, &tlv_len)) != NULL) { unsigned int cur_tlv_len = le16_to_cpu(tlv->len); unsigned int ofs = 0; switch(tlv->type) { case 0x01: i = le16_to_cpu(*(uint16_t *) get_next(2)); res->data.route_list = __qmi_alloc_static(i); while(i-- > 0) { res->data.route_list[res->data.route_list_n].message_type = *(uint8_t *) get_next(1); res->data.route_list[res->data.route_list_n].message_class = *(uint8_t *) get_next(1); res->data.route_list[res->data.route_list_n].storage = *(uint8_t *) get_next(1); res->data.route_list[res->data.route_list_n].receipt_action = *(uint8_t *) get_next(1); res->data.route_list_n++; } break; case 0x10: qmi_set(res, transfer_status_report, *(uint8_t *) get_next(1)); break; default: break; } } return 0; error_len: fprintf(stderr, "%s: Invalid TLV length in message, tlv=0x%02x, len=%d\n", __func__, tlv->type, le16_to_cpu(tlv->len)); return QMI_ERROR_INVALID_DATA; }
int qmi_parse_wms_raw_read_response(struct qmi_msg *msg, struct qmi_wms_raw_read_response *res) { void *tlv_buf = &msg->svc.tlv; int tlv_len = le16_to_cpu(msg->svc.tlv_len); struct tlv *tlv; int i; memset(res, 0, sizeof(*res)); __qmi_alloc_reset(); while ((tlv = tlv_get_next(&tlv_buf, &tlv_len)) != NULL) { unsigned int cur_tlv_len = le16_to_cpu(tlv->len); unsigned int ofs = 0; switch(tlv->type) { case 0x01: res->set.raw_message_data = 1; res->data.raw_message_data.message_tag = *(uint8_t *) get_next(1); res->data.raw_message_data.format = *(uint8_t *) get_next(1); i = le16_to_cpu(*(uint16_t *) get_next(2)); res->data.raw_message_data.raw_data = __qmi_alloc_static(i); while(i-- > 0) { res->data.raw_message_data.raw_data[res->data.raw_message_data.raw_data_n] = *(uint8_t *) get_next(1); res->data.raw_message_data.raw_data_n++; } break; default: break; } } return 0; error_len: fprintf(stderr, "%s: Invalid TLV length in message, tlv=0x%02x, len=%d\n", __func__, tlv->type, le16_to_cpu(tlv->len)); return QMI_ERROR_INVALID_DATA; }
int qmi_parse_pds_get_gps_service_state_response(struct qmi_msg *msg, struct qmi_pds_get_gps_service_state_response *res) { void *tlv_buf = &msg->svc.tlv; unsigned int tlv_len = le16_to_cpu(msg->svc.tlv_len); struct tlv *tlv; int i; uint32_t found[1] = {}; memset(res, 0, sizeof(*res)); __qmi_alloc_reset(); while ((tlv = tlv_get_next(&tlv_buf, &tlv_len)) != NULL) { unsigned int cur_tlv_len = le16_to_cpu(tlv->len); unsigned int ofs = 0; switch(tlv->type) { case 0x01: if (found[0] & (1 << 1)) break; found[0] |= (1 << 1); res->set.state = 1; res->data.state.gps_service_state = *(uint8_t *) get_next(1); res->data.state.tracking_session_state = *(uint8_t *) get_next(1); break; default: break; } } return 0; error_len: fprintf(stderr, "%s: Invalid TLV length in message, tlv=0x%02x, len=%d\n", __func__, tlv->type, le16_to_cpu(tlv->len)); return QMI_ERROR_INVALID_DATA; }
int qmi_set_wms_raw_write_request(struct qmi_msg *msg, struct qmi_wms_raw_write_request *req) { qmi_init_request_message(msg, QMI_SERVICE_WMS); msg->svc.message = cpu_to_le16(0x0021); if (req->set.raw_message_data) { void *buf; int ofs; int i; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.raw_message_data.storage_type, 1); put_tlv_var(uint8_t, req->data.raw_message_data.format, 1); put_tlv_var(uint16_t, cpu_to_le16(req->data.raw_message_data.raw_data_n), 2); for (i = 0; i < req->data.raw_message_data.raw_data_n; i++) { put_tlv_var(uint8_t, req->data.raw_message_data.raw_data[i], 1); } buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x01, ofs, buf); } return 0; }
int qmi_set_wms_raw_send_request(struct qmi_msg *msg, struct qmi_wms_raw_send_request *req) { qmi_init_request_message(msg, QMI_SERVICE_WMS); msg->svc.message = cpu_to_le16(0x0020); if (req->set.raw_message_data) { void *buf; int ofs; int i; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.raw_message_data.format, 1); put_tlv_var(uint16_t, cpu_to_le16(req->data.raw_message_data.raw_data_n), 2); for (i = 0; i < req->data.raw_message_data.raw_data_n; i++) { put_tlv_var(uint8_t, req->data.raw_message_data.raw_data[i], 1); } buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x01, ofs, buf); } if (req->set.cdma_force_on_dc) { void *buf; int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.cdma_force_on_dc.force, 1); put_tlv_var(uint8_t, req->data.cdma_force_on_dc.service_option, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x10, ofs, buf); } if (req->set.cdma_follow_on_dc) { void *buf; int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.cdma_follow_on_dc.follow, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x11, ofs, buf); } if (req->set.gsm_wcdma_link_timer) { void *buf; int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.gsm_wcdma_link_timer, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x12, ofs, buf); } if (req->set.sms_on_ims) { void *buf; int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.sms_on_ims, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x13, ofs, buf); } return 0; }
int qmi_set_pds_set_event_report_request(struct qmi_msg *msg, struct qmi_pds_set_event_report_request *req) { qmi_init_request_message(msg, QMI_SERVICE_PDS); msg->svc.message = cpu_to_le16(0x0001); if (req->set.nmea_position_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.nmea_position_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x10, ofs, buf); } if (req->set.extended_nmea_position_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.extended_nmea_position_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x11, ofs, buf); } if (req->set.parsed_position_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.parsed_position_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x12, ofs, buf); } if (req->set.external_xtra_data_request_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.external_xtra_data_request_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x13, ofs, buf); } if (req->set.external_time_injection_request_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.external_time_injection_request_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x14, ofs, buf); } if (req->set.external_wifi_position_request_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.external_wifi_position_request_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x15, ofs, buf); } if (req->set.satellite_information_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.satellite_information_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x16, ofs, buf); } if (req->set.vx_network_initiated_request_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.vx_network_initiated_request_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x17, ofs, buf); } if (req->set.supl_network_initiated_prompt_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.supl_network_initiated_prompt_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x18, ofs, buf); } if (req->set.umts_cp_network_initiated_prompt_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.umts_cp_network_initiated_prompt_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x19, ofs, buf); } if (req->set.pds_comm_event_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.pds_comm_event_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x1A, ofs, buf); } if (req->set.accelerometer_data_streaming_ready_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.accelerometer_data_streaming_ready_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x1B, ofs, buf); } if (req->set.gyro_data_streaming_ready_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.gyro_data_streaming_ready_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x1C, ofs, buf); } if (req->set.time_sync_request_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.time_sync_request_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x1D, ofs, buf); } if (req->set.position_reliability_indicator_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.position_reliability_indicator_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x1E, ofs, buf); } if (req->set.sensor_data_usage_indicator_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.sensor_data_usage_indicator_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x1F, ofs, buf); } if (req->set.time_source_information_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.time_source_information_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x20, ofs, buf); } if (req->set.heading_uncertainty_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.heading_uncertainty_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x21, ofs, buf); } if (req->set.nmea_debug_strings_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.nmea_debug_strings_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x22, ofs, buf); } if (req->set.extended_external_xtra_data_request_reporting) { void *buf; unsigned int ofs; __qmi_alloc_reset(); put_tlv_var(uint8_t, req->data.extended_external_xtra_data_request_reporting, 1); buf = __qmi_get_buf(&ofs); tlv_new(msg, 0x23, ofs, buf); } return 0; }