efi_selftest: check EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 31 Aug 2019 08:00:58 +0000 (10:00 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 5 Sep 2019 21:18:51 +0000 (23:18 +0200)
Check that when the WaitForPacket event occurs
EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT is set.

Check the return value of Receive().

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_selftest/efi_selftest_snp.c

index 4c266190012385e99cdb96e9379f2541172d7d54..807b8657b9e6d970a402c3005f4dbcd41de0ff1f 100644 (file)
@@ -268,6 +268,7 @@ static int execute(void)
        struct efi_mac_address destaddr;
        size_t buffer_size;
        u8 *addr;
+
        /*
         * The timeout is to occur after 10 s.
         */
@@ -298,6 +299,8 @@ static int execute(void)
        events[0] = timer;
        events[1] = net->wait_for_packet;
        for (;;) {
+               u32 int_status;
+
                /*
                 * Wait for packet to be received or timer event.
                 */
@@ -323,8 +326,17 @@ static int execute(void)
                 * Receive packet
                 */
                buffer_size = sizeof(buffer);
-               net->receive(net, NULL, &buffer_size, &buffer,
-                            &srcaddr, &destaddr, NULL);
+               ret = net->get_status(net, &int_status, NULL);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("Failed to get status");
+                       return EFI_ST_FAILURE;
+               }
+               if (!(int_status & EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT)) {
+                       efi_st_error("RX interrupt not set");
+                       return EFI_ST_FAILURE;
+               }
+               ret = net->receive(net, NULL, &buffer_size, &buffer,
+                                  &srcaddr, &destaddr, NULL);
                if (ret != EFI_SUCCESS) {
                        efi_st_error("Failed to receive packet");
                        return EFI_ST_FAILURE;