Attempt to re-open the network device when device_write fails, e.g. when netdde has crashed.
--- pfinet/ethernet.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/pfinet/ethernet.c b/pfinet/ethernet.c index b96c09a..f9fadf1 100644 --- a/pfinet/ethernet.c +++ b/pfinet/ethernet.c @@ -241,11 +241,24 @@ ethernet_open (struct device *dev) int ethernet_xmit (struct sk_buff *skb, struct device *dev) { - error_t err; + error_t err = 0; struct ether_device *edev = (struct ether_device *) dev->priv; u_int count; + short retries = 1; + + do + { + if (err && retries) + { + edev->ether_port = MACH_PORT_NULL; + ethernet_open (dev); + retries--; + } + + err = device_write (edev->ether_port, D_NOWAIT, 0, skb->data, skb->len, &count); + } + while (err && retries); - err = device_write (edev->ether_port, D_NOWAIT, 0, skb->data, skb->len, &count); assert_perror (err); assert (count == skb->len); dev_kfree_skb (skb); -- 1.8.3.1