From 125d2a09015f0d2e9c491060e115163352e3dbc4 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Thu, 18 Mar 2021 10:30:15 +0100 Subject: port-qmi: add support for QMAPv4 with checksum offload enabled --- src/mm-port-qmi.c | 30 ++++++++++++++++++++++-------- src/mm-port-qmi.h | 1 + 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/mm-port-qmi.c b/src/mm-port-qmi.c index bea301eb..c865d454 100644 --- a/src/mm-port-qmi.c +++ b/src/mm-port-qmi.c @@ -569,7 +569,7 @@ device_add_link_ready (QmiDevice *device, ctx = g_task_get_task_data (task); - ctx->link_name = qmi_device_add_link_finish (device, res, &ctx->mux_id, &error); + ctx->link_name = qmi_device_add_link_with_flags_finish (device, res, &ctx->mux_id, &error); if (!ctx->link_name) { g_prefix_error (&error, "failed to add link for device: "); g_task_return_error (task, error); @@ -665,13 +665,26 @@ mm_port_qmi_setup_link (MMPortQmi *self, /* When using rmnet, just try to add link in the QmiDevice */ if (self->priv->kernel_data_modes & MM_PORT_QMI_KERNEL_DATA_MODE_MUX_RMNET) { - qmi_device_add_link (self->priv->qmi_device, - QMI_DEVICE_MUX_ID_AUTOMATIC, - mm_kernel_device_get_name (mm_port_peek_kernel_device (data)), - link_prefix_hint, - NULL, - (GAsyncReadyCallback) device_add_link_ready, - task); + QmiDeviceAddLinkFlags flags = QMI_DEVICE_ADD_LINK_FLAGS_NONE; + + /* This may not be fully right, but it's the only way forward we know + * right now for the Qualcomm SoCs based on QRTR+IPA, where QMAPV4 is + * used and the device has checksum offload enabled by default, so we + * should create the link with special flags. Ideally, we would have a + * way to know in advance whether the checksum offload flags are needed + * or not. + */ + if (self->priv->dap == QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAPV4) + flags = (QMI_DEVICE_ADD_LINK_FLAGS_INGRESS_MAP_CKSUMV4 | QMI_DEVICE_ADD_LINK_FLAGS_EGRESS_MAP_CKSUMV4); + + qmi_device_add_link_with_flags (self->priv->qmi_device, + QMI_DEVICE_MUX_ID_AUTOMATIC, + mm_kernel_device_get_name (mm_port_peek_kernel_device (data)), + link_prefix_hint, + flags, + NULL, + (GAsyncReadyCallback) device_add_link_ready, + task); return; } @@ -1101,6 +1114,7 @@ typedef struct { static const DataFormatCombination data_format_combinations[] = { { MM_PORT_QMI_KERNEL_DATA_MODE_MUX_RMNET, QMI_WDA_LINK_LAYER_PROTOCOL_RAW_IP, QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAPV5 }, + { MM_PORT_QMI_KERNEL_DATA_MODE_MUX_RMNET, QMI_WDA_LINK_LAYER_PROTOCOL_RAW_IP, QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAPV4 }, { MM_PORT_QMI_KERNEL_DATA_MODE_MUX_RMNET, QMI_WDA_LINK_LAYER_PROTOCOL_RAW_IP, QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAP }, { MM_PORT_QMI_KERNEL_DATA_MODE_MUX_QMIWWAN, QMI_WDA_LINK_LAYER_PROTOCOL_RAW_IP, QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAPV5 }, { MM_PORT_QMI_KERNEL_DATA_MODE_MUX_QMIWWAN, QMI_WDA_LINK_LAYER_PROTOCOL_RAW_IP, QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAP }, diff --git a/src/mm-port-qmi.h b/src/mm-port-qmi.h index 247bf448..793e3b1a 100644 --- a/src/mm-port-qmi.h +++ b/src/mm-port-qmi.h @@ -38,6 +38,7 @@ typedef enum { /*< underscore_name=mm_port_qmi_kernel_data_mode >*/ #define MM_PORT_QMI_DAP_IS_SUPPORTED_QMAP(dap) \ (dap == QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAPV5 || \ + dap == QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAPV4 || \ dap == QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAP) #define MM_TYPE_PORT_QMI (mm_port_qmi_get_type ()) -- cgit v1.2.3