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_ */