diff options
author | Denis Kenzior <denkenz@gmail.com> | 2024-02-23 18:18:51 -0600 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2024-02-26 09:34:21 -0600 |
commit | a9ebacb42317a1a2eb25cab7d8619d631cc4b7b2 (patch) | |
tree | 51d7966131021438ec0172b401e69b76c2c4bb94 | |
parent | 8a09d514f60dc8133d76ec6bac36ea54370e9b87 (diff) | |
download | ofono-a9ebacb42317a1a2eb25cab7d8619d631cc4b7b2.tar.gz |
qmi: Introduce write driver method
Introduce a new write driver method which will abstract away the
details of submitting a QMI message to the underlying device / protocol.
qmi_device will continue managing the request queue and setup the l_io
write handler accordingly.
-rw-r--r-- | drivers/qmimodem/qmi.c | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/drivers/qmimodem/qmi.c b/drivers/qmimodem/qmi.c index fbe4640af..2af1d6463 100644 --- a/drivers/qmimodem/qmi.c +++ b/drivers/qmimodem/qmi.c @@ -48,6 +48,15 @@ struct discovery { qmi_destroy_func_t destroy; }; +struct qmi_request { + uint16_t tid; + uint8_t client; + qmi_message_func_t callback; + void *user_data; + uint16_t len; + uint8_t data[]; +}; + struct qmi_version { uint8_t type; uint16_t major; @@ -56,6 +65,7 @@ struct qmi_version { }; struct qmi_device_ops { + int (*write)(struct qmi_device *device, struct qmi_request *req); int (*discover)(struct qmi_device *device, qmi_discover_func_t discover_func, void *user, qmi_destroy_func_t destroy); @@ -126,15 +136,6 @@ struct qmi_result { uint16_t length; }; -struct qmi_request { - uint16_t tid; - uint8_t client; - qmi_message_func_t callback; - void *user_data; - uint16_t len; - uint8_t data[]; -}; - struct qmi_notify { uint16_t id; uint16_t message; @@ -626,30 +627,18 @@ static void __debug_device(struct qmi_device *device, static bool can_write_data(struct l_io *io, void *user_data) { struct qmi_device *device = user_data; - struct qmi_mux_hdr *hdr; struct qmi_request *req; - ssize_t bytes_written; + int r; req = l_queue_pop_head(device->req_queue); if (!req) return false; - bytes_written = write(l_io_get_fd(device->io), req->data, req->len); - if (bytes_written < 0) + r = device->ops->write(device, req); + if (r < 0) { + __request_free(req); return false; - - l_util_hexdump(false, req->data, bytes_written, - device->debug_func, device->debug_data); - - __debug_msg(' ', req->data, bytes_written, - device->debug_func, device->debug_data); - - hdr = (struct qmi_mux_hdr *) req->data; - - if (hdr->service == QMI_SERVICE_CONTROL) - l_queue_push_tail(device->control_queue, req); - else - l_queue_push_tail(device->service_queue, req); + } if (l_queue_length(device->req_queue) > 0) return true; @@ -1202,6 +1191,32 @@ done: return res; } +static int qmi_device_qmux_write(struct qmi_device *device, + struct qmi_request *req) +{ + struct qmi_mux_hdr *hdr; + ssize_t bytes_written; + + bytes_written = write(l_io_get_fd(device->io), req->data, req->len); + if (bytes_written < 0) + return -errno; + + l_util_hexdump(false, req->data, bytes_written, + device->debug_func, device->debug_data); + + __debug_msg(' ', req->data, bytes_written, + device->debug_func, device->debug_data); + + hdr = (struct qmi_mux_hdr *) req->data; + + if (hdr->service == QMI_SERVICE_CONTROL) + l_queue_push_tail(device->control_queue, req); + else + l_queue_push_tail(device->service_queue, req); + + return 0; +} + static void __rx_ctl_message(struct qmi_device_qmux *qmux, uint8_t service_type, uint8_t client_id, const void *buf) @@ -1822,6 +1837,7 @@ static void qmi_device_qmux_destroy(struct qmi_device *device) } static const struct qmi_device_ops qmux_ops = { + .write = qmi_device_qmux_write, .discover = qmi_device_qmux_discover, .client_create = qmi_device_qmux_client_create, .client_release = qmi_device_qmux_client_release, |