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



Reply via email to