[PATCH 10/13] gobi: Bring down the main interface at startup

Denis Kenzior <[email protected]>
Newsgroups dev.linux.lists.ofono
Message-ID <[email protected]>
The current gobi logic tried to set the qmi_wwan 'raw_ip' state based on
the results of wda_get_data_format.  If link_layer protocol was
'raw_ip', then 'raw_ip' setting on qmi_wwan was set to 'Y'.  For 802.3,
'raw_ip' setting was set to 'N'.

Unfortunately this was broken at some point and the setting could not be
toggled when the main network device was IFF_UP (default when USB device
is detected by the kernel).

Fix this by having .enable callback bring the device down at
initialization time.  oFono core will set the device IFF_UP once the
context is activated, and bring it down when the context is deactivated.
---
 plugins/gobi.c | 46 ++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 38 insertions(+), 8 deletions(-)

diff --git a/plugins/gobi.c b/plugins/gobi.c
index 5c3ae0737a15..e75a0312f6d0 100644
--- a/plugins/gobi.c
+++ b/plugins/gobi.c
@@ -230,13 +230,10 @@ static void add_service_request(struct gobi_data *data,
 	data->service_requests[data->num_service_requests++] = req;
 }
 
-static void shutdown_cb(void *user_data)
+static void __shutdown_device(struct ofono_modem *modem)
 {
-	struct ofono_modem *modem = user_data;
 	struct gobi_data *data = ofono_modem_get_data(modem);
 
-	DBG("");
-
 	data->discover_attempts = 0;
 	memset(&data->service_requests, 0, sizeof(data->service_requests));
 	data->cur_service_request = 0;
@@ -245,7 +242,15 @@ static void shutdown_cb(void *user_data)
 
 	qmi_qmux_device_free(data->device);
 	data->device = NULL;
+}
+
+static void shutdown_cb(void *user_data)
+{
+	struct ofono_modem *modem = user_data;
 
+	DBG("");
+
+	__shutdown_device(modem);
 	ofono_modem_set_powered(modem, FALSE);
 }
 
@@ -552,11 +557,32 @@ error:
 	shutdown_device(modem);
 }
 
+static void init_powered_down_cb(int error, uint16_t type,
+					const void *msg, uint32_t len,
+					void *user_data)
+{
+	struct ofono_modem *modem = user_data;
+	struct gobi_data *data = ofono_modem_get_data(modem);
+	int r;
+
+	DBG("error: %d", error);
+
+	data->set_powered_id = 0;
+
+	if (error)
+		goto error;
+
+	r = qmi_qmux_device_discover(data->device, discover_cb, modem, NULL);
+	if (!r)
+		return;
+error:
+	__shutdown_device(modem);
+}
+
 static int gobi_enable(struct ofono_modem *modem)
 {
 	struct gobi_data *data = ofono_modem_get_data(modem);
 	const char *device;
-	int r;
 
 	DBG("%p", modem);
 
@@ -575,11 +601,15 @@ static int gobi_enable(struct ofono_modem *modem)
 		qmi_qmux_device_set_io_debug(data->device,
 						gobi_io_debug, "QMI: ");
 
-	r = qmi_qmux_device_discover(data->device, discover_cb, modem, NULL);
-	if (!r)
+	data->set_powered_id =
+		l_rtnl_set_powered(l_rtnl_get(), data->main_net_ifindex,
+					false, init_powered_down_cb,
+					modem, NULL);
+	if (data->set_powered_id)
 		return -EINPROGRESS;
 
-	return r;
+	__shutdown_device(modem);
+	return -EIO;
 }
 
 static void power_disable_cb(struct qmi_result *result, void *user_data)
-- 
2.45.2
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.