f725e3
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
f725e3
From: Josef Bacik <jbacik@fb.com>
f725e3
Date: Mon, 31 Aug 2015 13:34:35 -0400
f725e3
Subject: [PATCH] efinet: retransmit if our device is busy
f725e3
f725e3
When I fixed the txbuf handling I ripped out the retransmission code since it
f725e3
was flooding our network when we had the buggy behavior.  Turns out this was too
f725e3
heavy handed as we can still have transient tx timeouts.  So instead make sure
f725e3
we retry our transmission once per timeout.  This way we can deal with transient
f725e3
transmission problems without flooding the box.  This fixes an issue we were
f725e3
seeing in production.  Thanks,
f725e3
f725e3
Signed-off-by: Josef Bacik <jbacik@fb.com>
f725e3
---
f725e3
 grub-core/net/drivers/efi/efinet.c | 10 ++++++++++
f725e3
 1 file changed, 10 insertions(+)
f725e3
f725e3
diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c
f725e3
index ea0e0ca360e..c3a128cd1dc 100644
f725e3
--- a/grub-core/net/drivers/efi/efinet.c
f725e3
+++ b/grub-core/net/drivers/efi/efinet.c
f725e3
@@ -38,6 +38,7 @@ send_card_buffer (struct grub_net_card *dev,
f725e3
   grub_efi_simple_network_t *net = dev->efi_net;
f725e3
   grub_uint64_t limit_time = grub_get_time_ms () + 4000;
f725e3
   void *txbuf;
f725e3
+  int retry = 0;
f725e3
 
f725e3
   if (dev->txbusy)
f725e3
     while (1)
f725e3
@@ -60,6 +61,15 @@ send_card_buffer (struct grub_net_card *dev,
f725e3
 	    dev->txbusy = 0;
f725e3
 	    break;
f725e3
 	  }
f725e3
+	if (!retry)
f725e3
+	  {
f725e3
+	    st = efi_call_7 (net->transmit, net, 0, dev->last_pkt_size,
f725e3
+			     dev->txbuf, NULL, NULL, NULL);
f725e3
+	    if (st != GRUB_EFI_SUCCESS)
f725e3
+	      return grub_error (GRUB_ERR_IO,
f725e3
+				 N_("couldn't send network packet"));
f725e3
+	    retry = 1;
f725e3
+	  }
f725e3
 	if (limit_time < grub_get_time_ms ())
f725e3
 	  return grub_error (GRUB_ERR_TIMEOUT,
f725e3
 			     N_("couldn't send network packet"));