diff --git a/repos/dde_ipxe/src/drivers/nic/main.cc b/repos/dde_ipxe/src/drivers/nic/main.cc index fbe270fd9..fc2e494e3 100644 --- a/repos/dde_ipxe/src/drivers/nic/main.cc +++ b/repos/dde_ipxe/src/drivers/nic/main.cc @@ -65,8 +65,10 @@ class Ipxe_session_component : public Nic::Session_component return true; } - if (dde_ipxe_nic_tx(1, _tx.sink()->packet_content(packet), packet.size())) - Genode::warning("Sending packet failed!"); + if (link_state()) { + if (dde_ipxe_nic_tx(1, _tx.sink()->packet_content(packet), packet.size())) + Genode::warning("Sending packet failed!"); + } _tx.sink()->acknowledge_packet(packet); return true; diff --git a/repos/dde_ipxe/src/lib/dde_ipxe/nic.c b/repos/dde_ipxe/src/lib/dde_ipxe/nic.c index 698d50cbf..8e8a230b6 100644 --- a/repos/dde_ipxe/src/lib/dde_ipxe/nic.c +++ b/repos/dde_ipxe/src/lib/dde_ipxe/nic.c @@ -199,10 +199,20 @@ static void irq_handler(void *p) dde_lock_leave(); - if (link_ok != netdev_link_ok(net_dev)) + int const new_link_ok = netdev_link_ok(net_dev); + if (link_ok != new_link_ok) { + /* report link-state changes */ if (link_callback) link_callback(); + + /* on link down, drain TX DMA to not leak packets on next link up */ + if (!new_link_ok) { + netdev_close(net_dev); + netdev_open(net_dev); + netdev_irq(net_dev, 1); + } + } }