]> TLD Linux GIT Repositories - packages/grub2.git/blob - grub2-efinet_fix.patch
- PLD merge
[packages/grub2.git] / grub2-efinet_fix.patch
1 commit c5898eb4505dcd5f367048d33ec5ea9ed40dfdeb (HEAD, tmp)
2 Author: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
3 Date:   Sun Mar 17 13:33:16 2013 +0100
4
5         Resend a packet if we got the wrong buffer in status.
6     
7     (cherry picked from commit 2f1071d57ec026a7f271b1bfe302d14e86673c0f)
8
9 diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c
10 index 28f2db2..2b344d6 100644
11 --- a/grub-core/net/drivers/efi/efinet.c
12 +++ b/grub-core/net/drivers/efi/efinet.c
13 @@ -37,7 +37,6 @@ send_card_buffer (struct grub_net_card *dev,
14    grub_efi_status_t st;
15    grub_efi_simple_network_t *net = dev->efi_net;
16    grub_uint64_t limit_time = grub_get_time_ms () + 4000;
17 -  grub_size_t len;
18  
19    if (dev->txbusy)
20      while (1)
21 @@ -52,17 +51,26 @@ send_card_buffer (struct grub_net_card *dev,
22             dev->txbusy = 0;
23             break;
24           }
25 +       if (txbuf)
26 +         {
27 +           st = efi_call_7 (net->transmit, net, 0, dev->last_pkt_size,
28 +                            dev->txbuf, NULL, NULL, NULL);
29 +           if (st != GRUB_EFI_SUCCESS)
30 +             return grub_error (GRUB_ERR_IO,
31 +                                N_("couldn't send network packet"));
32 +         }
33         if (limit_time < grub_get_time_ms ())
34 -         return grub_error (GRUB_ERR_TIMEOUT, N_("couldn't send network packet"));
35 +         return grub_error (GRUB_ERR_TIMEOUT,
36 +                            N_("couldn't send network packet"));
37        }
38  
39 -  len = (pack->tail - pack->data);
40 -  if (len > dev->mtu)
41 -    len = dev->mtu;
42 +  dev->last_pkt_size = (pack->tail - pack->data);
43 +  if (dev->last_pkt_size > dev->mtu)
44 +    dev->last_pkt_size = dev->mtu;
45  
46 -  grub_memcpy (dev->txbuf, pack->data, len);
47 +  grub_memcpy (dev->txbuf, pack->data, dev->last_pkt_size);
48  
49 -  st = efi_call_7 (net->transmit, net, 0, len,
50 +  st = efi_call_7 (net->transmit, net, 0, dev->last_pkt_size,
51                    dev->txbuf, NULL, NULL, NULL);
52    if (st != GRUB_EFI_SUCCESS)
53      return grub_error (GRUB_ERR_IO, N_("couldn't send network packet"));
54 diff --git a/include/grub/net.h b/include/grub/net.h
55 index 3877451..1bd7af2 100644
56 --- a/include/grub/net.h
57 +++ b/include/grub/net.h
58 @@ -139,6 +139,7 @@ struct grub_net_card
59      {
60        struct grub_efi_simple_network *efi_net;
61        grub_efi_handle_t efi_handle;
62 +      grub_size_t last_pkt_size;
63      };
64  #endif
65      void *data;