diff --git a/repos/dde_ipxe/include/dde_ipxe/nic.h b/repos/dde_ipxe/include/dde_ipxe/nic.h index cecffe785..470227d60 100644 --- a/repos/dde_ipxe/include/dde_ipxe/nic.h +++ b/repos/dde_ipxe/include/dde_ipxe/nic.h @@ -45,6 +45,12 @@ typedef void (*dde_ipxe_nic_rx_cb)(unsigned if_index, const char *packet, unsign extern void dde_ipxe_nic_register_callbacks(dde_ipxe_nic_rx_cb rx_cb, dde_ipxe_nic_link_cb link_cb); +/** + * Clear callbacks + */ +extern void dde_ipxe_nic_unregister_callbacks(); + + /** * Send packet * diff --git a/repos/dde_ipxe/src/drivers/nic/main.cc b/repos/dde_ipxe/src/drivers/nic/main.cc index ec1526069..e805a1f6d 100644 --- a/repos/dde_ipxe/src/drivers/nic/main.cc +++ b/repos/dde_ipxe/src/drivers/nic/main.cc @@ -53,10 +53,6 @@ namespace Ipxe { Nic::Driver_notification ¬ify) : _ep(ep), _alloc(alloc), _notify(notify) { - PINF("--- init iPXE NIC"); - int cnt = dde_ipxe_nic_init(&ep); - PINF(" number of devices: %d", cnt); - PINF("--- init callbacks"); dde_ipxe_nic_register_callbacks(_rx_callback, _link_callback); @@ -67,6 +63,8 @@ namespace Ipxe { _mac_addr.addr[4] & 0xff, _mac_addr.addr[5] & 0xff); } + ~Driver() { dde_ipxe_nic_unregister_callbacks(); } + void rx_handler(const char *packet, unsigned packet_len) { try { @@ -146,6 +144,11 @@ struct Main root(&ep.rpc_ep(), &sliced_heap, factory) { PINF("--- iPXE NIC driver started ---\n"); + + PINF("--- init iPXE NIC"); + int cnt = dde_ipxe_nic_init(&ep); + PINF(" number of devices: %d", cnt); + Genode::env()->parent()->announce(ep.manage(root)); } }; diff --git a/repos/dde_ipxe/src/lib/dde_ipxe/nic.c b/repos/dde_ipxe/src/lib/dde_ipxe/nic.c index 99c8db190..a542ccfa4 100644 --- a/repos/dde_ipxe/src/lib/dde_ipxe/nic.c +++ b/repos/dde_ipxe/src/lib/dde_ipxe/nic.c @@ -220,6 +220,17 @@ void dde_ipxe_nic_register_callbacks(dde_ipxe_nic_rx_cb rx_cb, } +void dde_ipxe_nic_unregister_callbacks(void) +{ + dde_lock_enter(); + + rx_callback = (dde_ipxe_nic_rx_cb)0; + link_callback = (dde_ipxe_nic_link_cb)0; + + dde_lock_leave(); +} + + int dde_ipxe_nic_link_state(unsigned if_index) { if (if_index != 1)