X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=dev.c;h=4e48179356c70a70fa2bb3dee7e1e4b15a8c77fb;hb=c7d4858e3adbd27f47461f7f105bbff95dcdf3b3;hp=21e30eae56bedbb7a5f5af40e2c91a5a56e42def;hpb=f38d620f4c172feb435d332ad7aba353fe7326d9;p=project%2Fuqmi.git diff --git a/dev.c b/dev.c index 21e30ea..4e48179 100644 --- a/dev.c +++ b/dev.c @@ -7,6 +7,8 @@ #include "qmi-errors.h" #include "qmi-errors.c" +bool cancel_all_requests = false; + #define __qmi_service(_n) [__##_n] = _n static const uint8_t qmi_services[__QMI_SERVICE_LAST] = { __qmi_services @@ -47,7 +49,6 @@ static void __qmi_request_complete(struct qmi_dev *qmi, struct qmi_request *req, { void *tlv_buf; int tlv_len; - int ret; if (!req->pending) return; @@ -55,10 +56,14 @@ static void __qmi_request_complete(struct qmi_dev *qmi, struct qmi_request *req, req->pending = false; list_del(&req->list); - tlv_buf = qmi_msg_get_tlv_buf(msg, &tlv_len); - req->ret = qmi_check_message_status(tlv_buf, tlv_len); - if (req->ret) - msg = NULL; + if (msg) { + tlv_buf = qmi_msg_get_tlv_buf(msg, &tlv_len); + req->ret = qmi_check_message_status(tlv_buf, tlv_len); + if (req->ret) + msg = NULL; + } else { + req->ret = QMI_ERROR_CANCELLED; + } if (req->cb && (msg || !req->no_error_cb)) req->cb(qmi, req, msg); @@ -97,7 +102,6 @@ static void qmi_notify_read(struct ustream *us, int bytes) struct qmi_msg *msg; char *buf; int len, msg_len; - int i; while (1) { buf = ustream_get_read_buf(us, &len); @@ -122,8 +126,6 @@ int qmi_request_start(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_m { int len = qmi_complete_request_message(msg); uint16_t tid; - int ret; - int i; memset(req, 0, sizeof(*req)); req->ret = -1; @@ -174,6 +176,10 @@ int qmi_request_wait(struct qmi_dev *qmi, struct qmi_request *req) cancelled = uloop_cancelled; uloop_cancelled = false; uloop_run(); + + if (cancel_all_requests) + qmi_request_cancel(qmi, req); + uloop_cancelled = cancelled; } @@ -224,6 +230,8 @@ int qmi_service_connect(struct qmi_dev *qmi, QmiService svc, int client_id) return req.req.ret; client_id = req.cid; + } else { + qmi->service_keep_cid |= (1 << idx); } qmi->service_data[idx].connected = true; @@ -255,11 +263,19 @@ static void __qmi_service_disconnect(struct qmi_dev *qmi, int idx) qmi_request_wait(qmi, &req); } +int qmi_service_release_client_id(struct qmi_dev *qmi, QmiService svc) +{ + int idx = qmi_get_service_idx(svc); + qmi->service_release_cid |= 1 << idx; + return 0; +} + static void qmi_close_all_services(struct qmi_dev *qmi) { uint32_t connected = qmi->service_connected; int idx; + qmi->service_keep_cid &= ~qmi->service_release_cid; for (idx = 0; connected; idx++, connected >>= 1) { if (!(connected & 1)) continue; @@ -304,7 +320,6 @@ int qmi_device_open(struct qmi_dev *qmi, const char *path) void qmi_device_close(struct qmi_dev *qmi) { struct qmi_request *req; - int idx; qmi_close_all_services(qmi); ustream_free(&qmi->sf.stream);