diff options
author | Aleksander Morgado <aleksandermj@chromium.org> | 2023-03-21 12:52:28 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2023-03-24 12:07:00 +0000 |
commit | b0fce20f737a88566b397eb573906f01299bc9d7 (patch) | |
tree | 317c6998b95a41a5ec860e9af8c162b7f68fdc9b /src | |
parent | f96664a159ebcff922e7d9fad170deefe65d1762 (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.c | 49 |
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); |