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