aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2023-03-21 12:52:28 +0000
committerAleksander Morgado <aleksander@aleksander.es>2023-03-24 12:07:00 +0000
commitb0fce20f737a88566b397eb573906f01299bc9d7 (patch)
tree317c6998b95a41a5ec860e9af8c162b7f68fdc9b /src
parentf96664a159ebcff922e7d9fad170deefe65d1762 (diff)
port-qmi: read checksum offload link flags to use from kernel rmnet driver
The feature/rx_offload and feature/tx_offload sysfs attributes specify which offload settings should be used when creating new links.
Diffstat (limited to 'src')
-rw-r--r--src/mm-port-qmi.c49
1 files changed, 36 insertions, 13 deletions
diff --git a/src/mm-port-qmi.c b/src/mm-port-qmi.c
index aec1c018..a5e67594 100644
--- a/src/mm-port-qmi.c
+++ b/src/mm-port-qmi.c
@@ -682,6 +682,41 @@ initialize_preallocated_links_ready (MMPortQmi *self,
}
}
+static QmiDeviceAddLinkFlags
+get_rmnet_device_add_link_flags (MMPortQmi *self)
+{
+ QmiDeviceAddLinkFlags flags = QMI_DEVICE_ADD_LINK_FLAGS_NONE;
+ g_autofree gchar *flags_str = NULL;
+
+ if (g_strcmp0 (self->priv->net_driver, "ipa") == 0) {
+ g_autofree gchar *tx_sysfs_path = NULL;
+ g_autofree gchar *rx_sysfs_path = NULL;
+ g_autofree gchar *tx_sysfs_str = NULL;
+ g_autofree gchar *rx_sysfs_str = NULL;
+
+ tx_sysfs_path = g_build_filename (self->priv->net_sysfs_path, "device", "feature", "tx_offload", NULL);
+ rx_sysfs_path = g_build_filename (self->priv->net_sysfs_path, "device", "feature", "rx_offload", NULL);
+
+ if (g_file_get_contents (rx_sysfs_path, &rx_sysfs_str, NULL, NULL) && rx_sysfs_str) {
+ if (g_str_has_prefix (rx_sysfs_str, "MAPv4"))
+ flags |= QMI_DEVICE_ADD_LINK_FLAGS_INGRESS_MAP_CKSUMV4;
+ else if (g_str_has_prefix (rx_sysfs_str, "MAPv5"))
+ flags |= QMI_DEVICE_ADD_LINK_FLAGS_INGRESS_MAP_CKSUMV5;
+ }
+
+ if (g_file_get_contents (tx_sysfs_path, &tx_sysfs_str, NULL, NULL) && tx_sysfs_str) {
+ if (g_str_has_prefix (tx_sysfs_str, "MAPv4"))
+ flags |= QMI_DEVICE_ADD_LINK_FLAGS_EGRESS_MAP_CKSUMV4;
+ else if (g_str_has_prefix (tx_sysfs_str, "MAPv5"))
+ flags |= QMI_DEVICE_ADD_LINK_FLAGS_EGRESS_MAP_CKSUMV5;
+ }
+ }
+
+ flags_str = qmi_device_add_link_flags_build_string_from_mask (flags);
+ mm_obj_dbg (self, "Creating RMNET link with flags: %s", flags_str);
+ return flags;
+}
+
void
mm_port_qmi_setup_link (MMPortQmi *self,
MMPort *data,
@@ -719,23 +754,11 @@ 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) {
- 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,
+ get_rmnet_device_add_link_flags (self),
NULL,
(GAsyncReadyCallback) device_add_link_ready,
task);