23d94d7b8c
(Also sync with Alpine while I'm at it...) This is necessary for mobile data to work on MSM8916-based devices after some changes in the network driver (bam-dmux) to operate in Raw-IP mode instead of Ethernet mode (which is somewhat broken).
125 lines
4.3 KiB
Diff
125 lines
4.3 KiB
Diff
From 326066dcf5ca27ed8c46f9dfba888255ce84b408 Mon Sep 17 00:00:00 2001
|
|
From: Minecrell <minecrell@minecrell.net>
|
|
Date: Fri, 19 Feb 2021 11:48:44 +0100
|
|
Subject: [PATCH] qmimodem: Update WDA data format for network interfaces !=
|
|
qmi_wwan
|
|
|
|
The network interface for the qmimodem may be provided by another
|
|
driver, e.g. bam-dmux for the integrated modem in Qualcomm SoCs or IPA.
|
|
Those do not support changing the expected data format, they just support
|
|
using the modem in Raw-IP mode. However, it may be necessary to change
|
|
the WDA data format of the modem to make that work.
|
|
|
|
To implement that:
|
|
1. Assume the network interface expects Raw-IP if it is not exposed
|
|
via USB (and therefore managed by qmi_wwan).
|
|
2. Fall back to changing the modem data format with "WDA Set Data Format"
|
|
if changing the expected data format fails.
|
|
---
|
|
drivers/qmimodem/gprs-context.c | 59 ++++++++++++++++++++++++++-------
|
|
drivers/qmimodem/qmi.c | 5 ++-
|
|
2 files changed, 51 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/drivers/qmimodem/gprs-context.c b/drivers/qmimodem/gprs-context.c
|
|
index f1fd1f12..b5ab8a83 100644
|
|
--- a/drivers/qmimodem/gprs-context.c
|
|
+++ b/drivers/qmimodem/gprs-context.c
|
|
@@ -390,12 +390,25 @@ static void create_wds_cb(struct qmi_service *service, void *user_data)
|
|
pkt_status_notify, gc, NULL);
|
|
}
|
|
|
|
+static void set_data_format_cb(struct qmi_result *result, void *user_data)
|
|
+{
|
|
+ struct ofono_gprs_context *gc = user_data;
|
|
+ struct gprs_context_data *data = ofono_gprs_context_get_data(gc);
|
|
+ uint16_t error;
|
|
+
|
|
+ qmi_result_set_error(result, &error);
|
|
+ DBG("result %#x\n", error);
|
|
+
|
|
+ qmi_service_create_shared(data->dev, QMI_SERVICE_WDS, create_wds_cb, gc,
|
|
+ NULL);
|
|
+}
|
|
+
|
|
static void get_data_format_cb(struct qmi_result *result, void *user_data)
|
|
{
|
|
struct ofono_gprs_context *gc = user_data;
|
|
struct gprs_context_data *data = ofono_gprs_context_get_data(gc);
|
|
- uint32_t llproto;
|
|
- enum qmi_device_expected_data_format expected_llproto;
|
|
+ uint32_t llproto, new_llproto = 0;
|
|
+ enum qmi_device_expected_data_format expected_llproto, new_expected = 0;
|
|
|
|
DBG("");
|
|
|
|
@@ -410,19 +423,41 @@ static void get_data_format_cb(struct qmi_result *result, void *user_data)
|
|
if ((llproto == QMI_WDA_DATA_LINK_PROTOCOL_802_3) &&
|
|
(expected_llproto ==
|
|
QMI_DEVICE_EXPECTED_DATA_FORMAT_RAW_IP)) {
|
|
- if (!qmi_device_set_expected_data_format(data->dev,
|
|
- QMI_DEVICE_EXPECTED_DATA_FORMAT_802_3))
|
|
- DBG("Fail to set expected data to 802.3");
|
|
- else
|
|
- DBG("expected data set to 802.3");
|
|
+ new_llproto = QMI_WDA_DATA_LINK_PROTOCOL_RAW_IP;
|
|
+ new_expected = QMI_DEVICE_EXPECTED_DATA_FORMAT_802_3;
|
|
} else if ((llproto == QMI_WDA_DATA_LINK_PROTOCOL_RAW_IP) &&
|
|
(expected_llproto ==
|
|
QMI_DEVICE_EXPECTED_DATA_FORMAT_802_3)) {
|
|
- if (!qmi_device_set_expected_data_format(data->dev,
|
|
- QMI_DEVICE_EXPECTED_DATA_FORMAT_RAW_IP))
|
|
- DBG("Fail to set expected data to raw-ip");
|
|
- else
|
|
- DBG("expected data set to raw-ip");
|
|
+ new_llproto = QMI_WDA_DATA_LINK_PROTOCOL_802_3;
|
|
+ new_expected = QMI_DEVICE_EXPECTED_DATA_FORMAT_RAW_IP;
|
|
+ }
|
|
+
|
|
+ /* First, try to change expected data format */
|
|
+ if (new_expected) {
|
|
+ if (qmi_device_set_expected_data_format(data->dev,
|
|
+ QMI_DEVICE_EXPECTED_DATA_FORMAT_RAW_IP)) {
|
|
+ DBG("updated expected data format");
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
+ DBG("Fail to set expected data format (not qmi_wwan?)");
|
|
+ }
|
|
+
|
|
+ /* Otherwise try to change modem data format */
|
|
+ if (new_llproto) {
|
|
+ struct qmi_param *param;
|
|
+
|
|
+ DBG("set WDA data format: %d\n", new_llproto);
|
|
+
|
|
+ param = qmi_param_new_uint32(QMI_WDA_LL_PROTOCOL, new_llproto);
|
|
+ if (!param)
|
|
+ goto done;
|
|
+
|
|
+ if (qmi_service_send(data->wda, QMI_WDA_SET_DATA_FORMAT, param,
|
|
+ set_data_format_cb, gc, NULL) > 0)
|
|
+ return;
|
|
+
|
|
+ qmi_param_free(param);
|
|
}
|
|
|
|
done:
|
|
diff --git a/drivers/qmimodem/qmi.c b/drivers/qmimodem/qmi.c
|
|
index 4cd1530f..d412adb6 100644
|
|
--- a/drivers/qmimodem/qmi.c
|
|
+++ b/drivers/qmimodem/qmi.c
|
|
@@ -1543,7 +1543,10 @@ enum qmi_device_expected_data_format qmi_device_get_expected_data_format(
|
|
interface = get_device_interface(device);
|
|
|
|
if (!interface) {
|
|
- DBG("Error while getting interface name");
|
|
+ DBG("Error while getting interface name (not qmi_wwan?)");
|
|
+
|
|
+ /* Assume that all other network drivers use Raw-IP */
|
|
+ expected = QMI_DEVICE_EXPECTED_DATA_FORMAT_RAW_IP;
|
|
goto done;
|
|
}
|
|
|
|
--
|
|
2.30.1
|
|
|