efi_loader: implement WaitForPacket event
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 5 Oct 2017 14:36:01 +0000 (16:36 +0200)
committerAlexander Graf <agraf@suse.de>
Mon, 9 Oct 2017 05:00:33 +0000 (07:00 +0200)
The WaitForPacket event informs that a network package has been
received by the SimpleNetworkProtocol.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
[agraf: Move is_signaled = true line into efi_net_push()]
Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_loader/efi_net.c

index 37047891c9173624e249426491f5ed5dd834a913..cd46d2db534871ab1d20802f18c990e0a9b26903 100644 (file)
@@ -24,6 +24,10 @@ static void *new_tx_packet;
  * to check if a new network packet has been received.
  */
 static struct efi_event *network_timer_event;
+/*
+ * This event is signaled when a packet has been received.
+ */
+static struct efi_event *wait_for_packet;
 
 struct efi_net_obj {
        /* Generic EFI object parent class data */
@@ -171,6 +175,7 @@ static efi_status_t EFIAPI efi_net_transmit(struct efi_simple_network *this,
 static void efi_net_push(void *pkt, int len)
 {
        new_rx_packet = true;
+       wait_for_packet->is_signaled = true;
 }
 
 static efi_status_t EFIAPI efi_net_receive(struct efi_simple_network *this,
@@ -280,6 +285,17 @@ int efi_net_register(void)
        /* Hook net up to the device list */
        list_add_tail(&netobj->parent.link, &efi_obj_list);
 
+       /*
+        * Create WaitForPacket event.
+        */
+       r = efi_create_event(EVT_NOTIFY_WAIT, TPL_CALLBACK,
+                            efi_network_timer_notify, NULL,
+                            &wait_for_packet);
+       if (r != EFI_SUCCESS) {
+               printf("ERROR: Failed to register network event\n");
+               return r;
+       }
+       netobj->net.wait_for_packet = wait_for_packet;
        /*
         * Create a timer event.
         *