From ac59b68257b73f07c92f110fbaac2b19221972e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Thu, 31 Jan 2019 17:00:43 +0100 Subject: [PATCH] wifi_drv: split front end notification Issue #3139. --- repos/dde_linux/include/wifi/ctrl.h | 1 + repos/dde_linux/src/drivers/wifi/frontend.h | 1 + repos/dde_linux/src/drivers/wifi/main.cc | 11 ++++++++++- .../src/lib/wpa_supplicant/ctrl_iface_genode.c | 9 ++++++--- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/repos/dde_linux/include/wifi/ctrl.h b/repos/dde_linux/include/wifi/ctrl.h index 29512a1a5..5cc748aa4 100644 --- a/repos/dde_linux/include/wifi/ctrl.h +++ b/repos/dde_linux/include/wifi/ctrl.h @@ -35,6 +35,7 @@ void wpa_ctrl_set_fd(void); void *wifi_get_buffer(void); void wifi_notify_cmd_result(void); +void wifi_block_for_processing(void); void wifi_notify_event(void); diff --git a/repos/dde_linux/src/drivers/wifi/frontend.h b/repos/dde_linux/src/drivers/wifi/frontend.h index 5da21d557..8de545cab 100644 --- a/repos/dde_linux/src/drivers/wifi/frontend.h +++ b/repos/dde_linux/src/drivers/wifi/frontend.h @@ -1501,6 +1501,7 @@ struct Wifi::Frontend char const *msg = reinterpret_cast(_msg.recv); unsigned const recv_id = _msg.recv_id; + /* return early */ if (_last_recv_id == recv_id) { _notify_lock_unlock(); diff --git a/repos/dde_linux/src/drivers/wifi/main.cc b/repos/dde_linux/src/drivers/wifi/main.cc index b1d90cc14..76253b2e4 100644 --- a/repos/dde_linux/src/drivers/wifi/main.cc +++ b/repos/dde_linux/src/drivers/wifi/main.cc @@ -35,7 +35,7 @@ static Wifi::Frontend *_wifi_frontend = nullptr; * Called by the CTRL interface after wpa_supplicant has processed * the command. */ -void wifi_notify_cmd_result(void) +void wifi_block_for_processing(void) { if (!_wifi_frontend) { Genode::warning("frontend not available, dropping notification"); @@ -50,6 +50,15 @@ void wifi_notify_cmd_result(void) /* XXX hack to trick poll() into returning faster */ wpa_ctrl_set_fd(); +} + + +void wifi_notify_cmd_result(void) +{ + if (!_wifi_frontend) { + Genode::warning("frontend not available, dropping notification"); + return; + } Genode::Signal_transmitter(_wifi_frontend->result_sigh()).submit(); } diff --git a/repos/dde_linux/src/lib/wpa_supplicant/ctrl_iface_genode.c b/repos/dde_linux/src/lib/wpa_supplicant/ctrl_iface_genode.c index d66d9b630..d95ba997a 100644 --- a/repos/dde_linux/src/lib/wpa_supplicant/ctrl_iface_genode.c +++ b/repos/dde_linux/src/lib/wpa_supplicant/ctrl_iface_genode.c @@ -115,19 +115,22 @@ static void wpa_supplicant_ctrl_iface_receive(int fd, void *eloop_ctx, &reply_len); if (reply) { - wifi_notify_cmd_result(); + wifi_block_for_processing(); send_reply(priv, reply, reply_len); + wifi_notify_cmd_result(); os_free(reply); } else if (reply_len == 1) { - wifi_notify_cmd_result(); + wifi_block_for_processing(); send_reply(priv, "FAIL", 4); + wifi_notify_cmd_result(); } else if (reply_len == 2) { - wifi_notify_cmd_result(); + wifi_block_for_processing(); send_reply(priv, "OK", 2); + wifi_notify_cmd_result(); } }