diff --git a/repos/dde_linux/src/drivers/wifi/main.cc b/repos/dde_linux/src/drivers/wifi/main.cc
index 76253b2e4..da4287020 100644
--- a/repos/dde_linux/src/drivers/wifi/main.cc
+++ b/repos/dde_linux/src/drivers/wifi/main.cc
@@ -111,7 +111,6 @@ struct Main
_wifi_frontend = &*_frontend;
_wpa.construct(env, _wpa_startup_lock);
- _wpa->start();
/*
* Forcefully disable 11n but for convenience the attribute is used the
diff --git a/repos/dde_linux/src/drivers/wifi/target.mk b/repos/dde_linux/src/drivers/wifi/target.mk
index 20b3d4e45..631330579 100644
--- a/repos/dde_linux/src/drivers/wifi/target.mk
+++ b/repos/dde_linux/src/drivers/wifi/target.mk
@@ -1,9 +1,9 @@
REQUIRES = x86
TARGET = wifi_drv
-SRC_CC = main.cc
+SRC_CC = main.cc wpa.cc
LIBS = base wifi iwl_firmware
-LIBS += wpa_supplicant
+LIBS += wpa_supplicant libc
# needed for firmware.h
INC_DIR += $(REP_DIR)/src/lib/wifi/include
diff --git a/repos/dde_linux/src/drivers/wifi/wpa.cc b/repos/dde_linux/src/drivers/wifi/wpa.cc
new file mode 100644
index 000000000..1d986045f
--- /dev/null
+++ b/repos/dde_linux/src/drivers/wifi/wpa.cc
@@ -0,0 +1,57 @@
+/*
+ * \brief Wpa_supplicant thread of the wifi driver
+ * \author Josef Soentgen
+ * \author Christian Helmuth
+ * \date 2019-12-18
+ */
+
+/*
+ * Copyright (C) 2019 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+/* Genode includes */
+#include
+#include
+#include
+
+/* libc includes */
+#include
+#include
+#include
+
+#include "wpa.h"
+
+
+/* entry function */
+extern "C" int wpa_main(void);
+
+
+void * Wpa_thread::_entry_trampoline(void *arg)
+{
+ Wpa_thread *t = (Wpa_thread *)arg;
+ t->_entry();
+ return nullptr;
+}
+
+
+void Wpa_thread::_entry()
+{
+ /* wait until the wifi driver is up and running */
+ _lock.lock();
+ _exit = wpa_main();
+ Genode::sleep_forever();
+}
+
+
+Wpa_thread::Wpa_thread(Genode::Env &env, Genode::Lock &lock)
+: _lock(lock), _exit(-1)
+{
+ pthread_t tid = 0;
+ if (pthread_create(&tid, 0, _entry_trampoline, this) != 0) {
+ printf("Error: pthread_create() failed\n");
+ exit(-1);
+ }
+}
diff --git a/repos/dde_linux/src/drivers/wifi/wpa.h b/repos/dde_linux/src/drivers/wifi/wpa.h
index 2cc5f423c..476d0335a 100644
--- a/repos/dde_linux/src/drivers/wifi/wpa.h
+++ b/repos/dde_linux/src/drivers/wifi/wpa.h
@@ -14,34 +14,26 @@
#ifndef _WIFI__WPA_H_
#define _WIFI__WPA_H_
-/* Genode includes */
-#include
-/* entry function */
-extern "C" int wpa_main(void);
+namespace Genode {
+ struct Env;
+ struct Lock;
+}
-class Wpa_thread : public Genode::Thread
+class Wpa_thread
{
private:
Genode::Lock &_lock;
int _exit;
+ static void * _entry_trampoline(void *arg);
+
+ void _entry();
+
public:
- Wpa_thread(Genode::Env &env, Genode::Lock &lock)
- :
- Thread(env, "wpa_supplicant", 8*1024*sizeof(long)),
- _lock(lock), _exit(-1)
- { }
-
- void entry()
- {
- /* wait until the wifi driver is up and running */
- _lock.lock();
- _exit = wpa_main();
- Genode::sleep_forever();
- }
+ Wpa_thread(Genode::Env &env, Genode::Lock &lock);
};
#endif /* _WIFI__WPA_H_ */