aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2024-02-23 18:18:51 -0600
committerDenis Kenzior <denkenz@gmail.com>2024-02-26 09:34:21 -0600
commita9ebacb42317a1a2eb25cab7d8619d631cc4b7b2 (patch)
tree51d7966131021438ec0172b401e69b76c2c4bb94
parent8a09d514f60dc8133d76ec6bac36ea54370e9b87 (diff)
downloadofono-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.c68
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,