aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-03-18 10:30:15 +0100
committerAleksander Morgado <aleksander@aleksander.es>2021-04-14 11:27:27 +0200
commit125d2a09015f0d2e9c491060e115163352e3dbc4 (patch)
tree73ee9d62ef994c0bfa698099dba6c8b2213a8f20
parent483f8f055986576834b34ff53c22b3f1e9e21bad (diff)
port-qmi: add support for QMAPv4 with checksum offload enabled
-rw-r--r--src/mm-port-qmi.c30
-rw-r--r--src/mm-port-qmi.h1
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 ())