]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Raise TPL when calling UNDI entry point
authorMichael Brown <mcb30@ipxe.org>
Tue, 5 Sep 2017 09:48:41 +0000 (10:48 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 5 Sep 2017 09:48:41 +0000 (10:48 +0100)
The SnpDxe driver raises the task priority level to TPL_CALLBACK when
calling the UNDI entry point.  This does not appear to be a documented
requirement, but we should probably match the behaviour of SnpDxe to
minimise surprises to third party code.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/efi/nii.c

index 1c6980e69a35d891c1ba1064cc93a67ac6120b40..1700b4bd8e9ea0c1f36c00b862339012441d6ab7 100644 (file)
@@ -402,7 +402,9 @@ static EFIAPI VOID nii_block ( UINT64 unique_id, UINT32 acquire ) {
  */
 static int nii_issue_cpb_db ( struct nii_nic *nii, unsigned int op, void *cpb,
                              size_t cpb_len, void *db, size_t db_len ) {
+       EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
        PXE_CDB cdb;
+       UINTN tpl;
 
        /* Prepare command descriptor block */
        memset ( &cdb, 0, sizeof ( cdb ) );
@@ -414,6 +416,9 @@ static int nii_issue_cpb_db ( struct nii_nic *nii, unsigned int op, void *cpb,
        cdb.DBsize = db_len;
        cdb.IFnum = nii->nii->IfNum;
 
+       /* Raise task priority level */
+       tpl = bs->RaiseTPL ( TPL_CALLBACK );
+
        /* Issue command */
        DBGC2 ( nii, "NII %s issuing %02x:%04x ifnum %d%s%s\n",
                nii->dev.name, cdb.OpCode, cdb.OpFlags, cdb.IFnum,
@@ -424,6 +429,9 @@ static int nii_issue_cpb_db ( struct nii_nic *nii, unsigned int op, void *cpb,
                DBGC2_HD ( nii, db, db_len );
        nii->issue ( ( intptr_t ) &cdb );
 
+       /* Restore task priority level */
+       bs->RestoreTPL ( tpl );
+
        /* Check completion status */
        if ( cdb.StatCode != PXE_STATCODE_SUCCESS )
                return -cdb.StatCode;