wifi_drv: use asynchronous IRQ session interface

Issue #1456.
This commit is contained in:
Josef Söntgen 2015-04-07 11:14:54 +02:00 committed by Christian Helmuth
parent 9606abc146
commit bfb47cfd4e
1 changed files with 6 additions and 60 deletions

View File

@ -74,47 +74,6 @@ struct Lx_irq_handler : public Lx::List<Lx_irq_handler>::Element
};
/**
* IRQ handling thread
*/
template <typename T>
class Irq_thread : public Genode::Thread<1024 * sizeof(Genode::addr_t)>
{
private:
unsigned _irq_number;
Genode::Irq_connection _irq;
bool _enabled;
/* XXX replace by functor? */
T &_obj;
void (T::*_member)(void *);
void *_priv;
public:
Irq_thread(unsigned irq, T &obj, void (T::*member)(void*), void *priv,
char const *name)
:
Thread(name),
_irq_number(irq), _irq(_irq_number), _enabled(false),
_obj(obj), _member(member), _priv(priv)
{
start();
}
void enable() { _enabled = true; }
void entry()
{
while (1) {
_irq.wait_for_irq();
if (_enabled) (_obj.*_member)(_priv);
}
}
};
namespace Lx {
class Irq;
}
@ -138,26 +97,13 @@ class Lx::Irq
Name_composer _name;
unsigned int _irq; /* IRQ number */
Genode::Irq_connection _irq_conn;
Lx::List<Lx_irq_handler> _handler; /* List of registered handlers */
Irq_task _task;
Irq_thread<Context> _thread;
Genode::Lock _irq_sync { Genode::Lock::LOCKED };
Genode::Signal_transmitter _sender;
Genode::Signal_rpc_member<Context> _dispatcher;
/**
* IRQ handling thread callback
*/
void _handle_irq(void *)
{
_sender.submit();
/* wait for interrupt to get acked at device side */
_irq_sync.lock();
}
/**
* Call one IRQ handler
*/
@ -201,13 +147,14 @@ class Lx::Irq
:
_name(irq),
_irq(irq),
_irq_conn(irq),
_task(run_irq, this, _name.name),
_thread(irq, *this, &Context::_handle_irq, 0, _name.name),
_dispatcher(ep, *this, &Context::_handle)
{
_sender.context(_dispatcher);
_irq_conn.sigh(_dispatcher);
_thread.enable();
/* initial ack to receive further IRQ signals */
_irq_conn.ack_irq();
}
/**
@ -228,8 +175,7 @@ class Lx::Irq
break;
}
/* interrupt should be acked at device now */
_irq_sync.unlock();
_irq_conn.ack_irq();
}
/**