From 302cc88ab36ffb96622987a55f4abc22a4751fed Mon Sep 17 00:00:00 2001 From: eeshanl Date: Wed, 28 May 2025 23:06:12 +0000 Subject: [PATCH] NetworkPkg/SnpDxe: Update SnpDxe SNP_DRIVER struct out of DMA-able memory. CPB, DB, and CDB structs to use DMA-able memory. Updates the overall SNP_DRIVER allocation to use AllocatePool() instead of PciIo->AllocateBuffer(). This moves this struct out of DMA-able memory. Allocates the PXE_CDB struct as a pointer instead, using PciIo->AllocateBuffer() for DMA-able memory. End result: CPB, DB, and CDB are allocated with individual PciIo->AllocateBuffer() calls with a size of 4096 for CPB and DB. and sizeof(PXE_CDB) for CDB. Each of these members point to locations within the Allocated Buffer, and all of these pointers are at-least 8-Byte aligned. SNP_DRIVER is allocated with AllocatePool() In the SNP_DRIVER structure, the PXE_CDB member is changed to a pointer so we can allocate it with PciIo->AllocateBuffer() Signed-off-by: Eeshan Londhe --- NetworkPkg/SnpDxe/Get_status.c | 49 +++--- NetworkPkg/SnpDxe/Initialize.c | 45 ++--- NetworkPkg/SnpDxe/Mcast_ip_to_mac.c | 41 +++-- NetworkPkg/SnpDxe/Nvdata.c | 39 +++-- NetworkPkg/SnpDxe/Receive.c | 37 ++-- NetworkPkg/SnpDxe/Receive_filters.c | 149 ++++++++-------- NetworkPkg/SnpDxe/Reset.c | 33 ++-- NetworkPkg/SnpDxe/Shutdown.c | 31 ++-- NetworkPkg/SnpDxe/Snp.c | 255 ++++++++++++++++------------ NetworkPkg/SnpDxe/Snp.h | 2 +- NetworkPkg/SnpDxe/Start.c | 37 ++-- NetworkPkg/SnpDxe/Station_address.c | 78 +++++---- NetworkPkg/SnpDxe/Statistics.c | 45 ++--- NetworkPkg/SnpDxe/Stop.c | 33 ++-- NetworkPkg/SnpDxe/Transmit.c | 80 +++++---- NetworkPkg/SnpDxe/WaitForPacket.c | 29 ++-- 16 files changed, 555 insertions(+), 428 deletions(-) diff --git a/NetworkPkg/SnpDxe/Get_status.c b/NetworkPkg/SnpDxe/Get_status.c index 2097fbcbaa..5f500c01fd 100644 --- a/NetworkPkg/SnpDxe/Get_status.c +++ b/NetworkPkg/SnpDxe/Get_status.c @@ -38,49 +38,54 @@ PxeGetStatus ( UINT32 Index; UINT64 *Tmp; - Tmp = NULL; - Db = Snp->Db; - Snp->Cdb.OpCode = PXE_OPCODE_GET_STATUS; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } - Snp->Cdb.OpFlags = 0; + Tmp = NULL; + Db = Snp->Db; + Snp->Cdb->OpCode = PXE_OPCODE_GET_STATUS; + + Snp->Cdb->OpFlags = 0; if (GetTransmittedBuf) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS; ZeroMem (Db->TxBuffer, sizeof (Db->TxBuffer)); } if (InterruptStatusPtr != NULL) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_GET_INTERRUPT_STATUS; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_GET_INTERRUPT_STATUS; } if (Snp->MediaStatusSupported) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_GET_MEDIA_STATUS; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_GET_MEDIA_STATUS; } - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_GET_STATUS); - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_GET_STATUS); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nSnp->undi.get_status() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { DEBUG ( (DEBUG_NET, "\nSnp->undi.get_status() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; @@ -90,7 +95,7 @@ PxeGetStatus ( // report the values back.. // if (InterruptStatusPtr != NULL) { - InterruptFlags = (UINT16)(Snp->Cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_INTERRUPT_MASK); + InterruptFlags = (UINT16)(Snp->Cdb->StatFlags & PXE_STATFLAGS_GET_STATUS_INTERRUPT_MASK); *InterruptStatusPtr = 0; @@ -112,7 +117,7 @@ PxeGetStatus ( } if (GetTransmittedBuf) { - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN) == 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN) == 0) { // // UNDI has written some transmitted buffer addresses into the DB. Store them into Snp->RecycledTxBuf. // @@ -150,7 +155,7 @@ PxeGetStatus ( // if (Snp->MediaStatusSupported) { Snp->Snp.Mode->MediaPresent = - (BOOLEAN)(((Snp->Cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_NO_MEDIA) != 0) ? FALSE : TRUE); + (BOOLEAN)(((Snp->Cdb->StatFlags & PXE_STATFLAGS_GET_STATUS_NO_MEDIA) != 0) ? FALSE : TRUE); } return EFI_SUCCESS; diff --git a/NetworkPkg/SnpDxe/Initialize.c b/NetworkPkg/SnpDxe/Initialize.c index c219a1cb20..1e2ed67ead 100644 --- a/NetworkPkg/SnpDxe/Initialize.c +++ b/NetworkPkg/SnpDxe/Initialize.c @@ -30,6 +30,11 @@ PxeInit ( VOID *Addr; EFI_STATUS Status; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + Status = EFI_SUCCESS; Cpb = Snp->Cpb; @@ -76,41 +81,41 @@ PxeInit ( Cpb->LoopBackMode = LOOPBACK_NORMAL; - Snp->Cdb.OpCode = PXE_OPCODE_INITIALIZE; - Snp->Cdb.OpFlags = CableDetectFlag; + Snp->Cdb->OpCode = PXE_OPCODE_INITIALIZE; + Snp->Cdb->OpFlags = CableDetectFlag; - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_INITIALIZE); - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_INITIALIZE); + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_INITIALIZE); + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_INITIALIZE); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Snp->Cpb; - Snp->Cdb.DBaddr = (UINT64)(UINTN)Snp->Db; + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Snp->Cpb; + Snp->Cdb->DBaddr = (UINT64)(UINTN)Snp->Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; DEBUG ((DEBUG_NET, "\nSnp->undi.initialize() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); // // There are two fields need to be checked here: - // First is the upper two bits (14 & 15) in the CDB.StatFlags field. Until these bits change to report + // First is the upper two bits (14 & 15) in the Cdb->StatFlags field. Until these bits change to report // PXE_STATFLAGS_COMMAND_COMPLETE or PXE_STATFLAGS_COMMAND_FAILED, the command has not been executed by the UNDI. - // Second is the CDB.StatCode field. After command execution completes, either successfully or not, - // the CDB.StatCode field contains the result of the command execution. + // Second is the Cdb->StatCode field. After command execution completes, either successfully or not, + // the Cdb->StatCode field contains the result of the command execution. // - if ((((Snp->Cdb.StatFlags) & PXE_STATFLAGS_STATUS_MASK) == PXE_STATFLAGS_COMMAND_COMPLETE) && - (Snp->Cdb.StatCode == PXE_STATCODE_SUCCESS)) + if ((((Snp->Cdb->StatFlags) & PXE_STATFLAGS_STATUS_MASK) == PXE_STATFLAGS_COMMAND_COMPLETE) && + (Snp->Cdb->StatCode == PXE_STATCODE_SUCCESS)) { // - // If cable detect feature is enabled in CDB.OpFlags, check the CDB.StatFlags to see if there is an + // If cable detect feature is enabled in Cdb->OpFlags, check the Cdb->StatFlags to see if there is an // active connection to this network device. If the no media StatFlag is set, the UNDI and network // device are still initialized. // if (CableDetectFlag == PXE_OPFLAGS_INITIALIZE_DETECT_CABLE) { - if (((Snp->Cdb.StatFlags) & PXE_STATFLAGS_INITIALIZED_NO_MEDIA) != PXE_STATFLAGS_INITIALIZED_NO_MEDIA) { + if (((Snp->Cdb->StatFlags) & PXE_STATFLAGS_INITIALIZED_NO_MEDIA) != PXE_STATFLAGS_INITIALIZED_NO_MEDIA) { Snp->Mode.MediaPresent = TRUE; } else { Snp->Mode.MediaPresent = FALSE; @@ -123,8 +128,8 @@ PxeInit ( DEBUG ( (DEBUG_WARN, "\nSnp->undi.initialize() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); if (Snp->TxRxBuffer != NULL) { diff --git a/NetworkPkg/SnpDxe/Mcast_ip_to_mac.c b/NetworkPkg/SnpDxe/Mcast_ip_to_mac.c index 2b42e20aaf..52a9fbb5b4 100644 --- a/NetworkPkg/SnpDxe/Mcast_ip_to_mac.c +++ b/NetworkPkg/SnpDxe/Mcast_ip_to_mac.c @@ -35,20 +35,25 @@ PxeIp2Mac ( PXE_CPB_MCAST_IP_TO_MAC *Cpb; PXE_DB_MCAST_IP_TO_MAC *Db; - Cpb = Snp->Cpb; - Db = Snp->Db; - Snp->Cdb.OpCode = PXE_OPCODE_MCAST_IP_TO_MAC; - Snp->Cdb.OpFlags = (UINT16)(IPv6 ? PXE_OPFLAGS_MCAST_IPV6_TO_MAC : PXE_OPFLAGS_MCAST_IPV4_TO_MAC); - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_MCAST_IP_TO_MAC); - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_MCAST_IP_TO_MAC); + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb; - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Cpb = Snp->Cpb; + Db = Snp->Db; + Snp->Cdb->OpCode = PXE_OPCODE_MCAST_IP_TO_MAC; + Snp->Cdb->OpFlags = (UINT16)(IPv6 ? PXE_OPFLAGS_MCAST_IPV6_TO_MAC : PXE_OPFLAGS_MCAST_IPV4_TO_MAC); + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_MCAST_IP_TO_MAC); + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_MCAST_IP_TO_MAC); - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb; + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; + + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; CopyMem (&Cpb->IP, IP, sizeof (PXE_IP_ADDR)); @@ -57,9 +62,9 @@ PxeIp2Mac ( // DEBUG ((DEBUG_NET, "\nSnp->undi.mcast_ip_to_mac() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: break; @@ -70,8 +75,8 @@ PxeIp2Mac ( DEBUG ( (DEBUG_NET, "\nSnp->undi.mcast_ip_to_mac() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_UNSUPPORTED; @@ -83,8 +88,8 @@ PxeIp2Mac ( DEBUG ( (DEBUG_NET, "\nSnp->undi.mcast_ip_to_mac() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Nvdata.c b/NetworkPkg/SnpDxe/Nvdata.c index 54bcec125b..a0962b4418 100644 --- a/NetworkPkg/SnpDxe/Nvdata.c +++ b/NetworkPkg/SnpDxe/Nvdata.c @@ -33,30 +33,35 @@ PxeNvDataRead ( { PXE_DB_NVDATA *Db; - Db = Snp->Db; - Snp->Cdb.OpCode = PXE_OPCODE_NVDATA; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } - Snp->Cdb.OpFlags = PXE_OPFLAGS_NVDATA_READ; + Db = Snp->Db; + Snp->Cdb->OpCode = PXE_OPCODE_NVDATA; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NVDATA_READ; - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_NVDATA); - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_NVDATA); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; + + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.nvdata () ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: break; @@ -64,8 +69,8 @@ PxeNvDataRead ( DEBUG ( (DEBUG_NET, "\nsnp->undi.nvdata() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_UNSUPPORTED; @@ -74,8 +79,8 @@ PxeNvDataRead ( DEBUG ( (DEBUG_NET, "\nsnp->undi.nvdata() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Receive.c b/NetworkPkg/SnpDxe/Receive.c index 41601980f2..e86db89a5f 100644 --- a/NetworkPkg/SnpDxe/Receive.c +++ b/NetworkPkg/SnpDxe/Receive.c @@ -49,6 +49,11 @@ PxeReceive ( PXE_DB_RECEIVE *Db; UINTN BuffSize; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + Cpb = Snp->Cpb; Db = Snp->Db; BuffSize = *BufferSize; @@ -58,28 +63,28 @@ PxeReceive ( Cpb->reserved = 0; - Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->OpCode = PXE_OPCODE_RECEIVE; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_RECEIVE); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb; + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_RECEIVE); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb; - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_RECEIVE); - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_RECEIVE); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.receive () ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: break; @@ -87,8 +92,8 @@ PxeReceive ( DEBUG ( (DEBUG_NET, "\nsnp->undi.receive () %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_NOT_READY; @@ -97,8 +102,8 @@ PxeReceive ( DEBUG ( (DEBUG_ERROR, "\nsnp->undi.receive() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Receive_filters.c b/NetworkPkg/SnpDxe/Receive_filters.c index 4a21165567..aa947ec49d 100644 --- a/NetworkPkg/SnpDxe/Receive_filters.c +++ b/NetworkPkg/SnpDxe/Receive_filters.c @@ -32,41 +32,46 @@ PxeRecvFilterEnable ( EFI_MAC_ADDRESS *MCastAddressList ) { - Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS; - Snp->Cdb.OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_ENABLE; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Snp->Cdb->OpCode = PXE_OPCODE_RECEIVE_FILTERS; + Snp->Cdb->OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_ENABLE; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_UNICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST; } if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST; } if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS; } if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST; } if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST; } if (MCastAddressCount != 0) { - Snp->Cdb.CPBsize = (UINT16)(MCastAddressCount * sizeof (EFI_MAC_ADDRESS)); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Snp->Cpb; - CopyMem (Snp->Cpb, MCastAddressList, Snp->Cdb.CPBsize); + Snp->Cdb->CPBsize = (UINT16)(MCastAddressCount * sizeof (EFI_MAC_ADDRESS)); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Snp->Cpb; + CopyMem (Snp->Cpb, MCastAddressList, Snp->Cdb->CPBsize); } // @@ -74,20 +79,20 @@ PxeRecvFilterEnable ( // DEBUG ((DEBUG_NET, "\nsnp->undi.receive_filters() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { // // UNDI command failed. Return UNDI status to caller. // DEBUG ( (DEBUG_ERROR, "\nsnp->undi.receive_filters() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_INVALID_CDB: case PXE_STATCODE_INVALID_CPB: case PXE_STATCODE_INVALID_PARAMETER: @@ -122,40 +127,45 @@ PxeRecvFilterDisable ( BOOLEAN ResetMCastList ) { - Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } - Snp->Cdb.OpFlags = (UINT16)((DisableFlags != 0) ? PXE_OPFLAGS_RECEIVE_FILTER_DISABLE : PXE_OPFLAGS_NOT_USED); + Snp->Cdb->OpCode = PXE_OPCODE_RECEIVE_FILTERS; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; + + Snp->Cdb->OpFlags = (UINT16)((DisableFlags != 0) ? PXE_OPFLAGS_RECEIVE_FILTER_DISABLE : PXE_OPFLAGS_NOT_USED); if (ResetMCastList) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST; } if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_UNICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST; } if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST; } if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS; } if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST; } if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST; } // @@ -163,17 +173,17 @@ PxeRecvFilterDisable ( // DEBUG ((DEBUG_NET, "\nsnp->undi.receive_filters() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { // // UNDI command failed. Return UNDI status to caller. // DEBUG ( (DEBUG_ERROR, "\nsnp->undi.receive_filters() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; @@ -196,36 +206,41 @@ PxeRecvFilterRead ( SNP_DRIVER *Snp ) { - Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS; - Snp->Cdb.OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_READ; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = (UINT16)(Snp->Mode.MaxMCastFilterCount * sizeof (EFI_MAC_ADDRESS)); - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - if (Snp->Cdb.DBsize == 0) { - Snp->Cdb.DBaddr = (UINT64)(UINTN)NULL; - } else { - Snp->Cdb.DBaddr = (UINT64)(UINTN)Snp->Db; - ZeroMem (Snp->Db, Snp->Cdb.DBsize); + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; } - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->OpCode = PXE_OPCODE_RECEIVE_FILTERS; + Snp->Cdb->OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_READ; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = (UINT16)(Snp->Mode.MaxMCastFilterCount * sizeof (EFI_MAC_ADDRESS)); + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + if (Snp->Cdb->DBsize == 0) { + Snp->Cdb->DBaddr = (UINT64)(UINTN)NULL; + } else { + Snp->Cdb->DBaddr = (UINT64)(UINTN)Snp->Db; + ZeroMem (Snp->Db, Snp->Cdb->DBsize); + } + + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; DEBUG ((DEBUG_NET, "\nsnp->undi.receive_filters() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { // // UNDI command failed. Return UNDI status to caller. // DEBUG ( (DEBUG_ERROR, "\nsnp->undi.receive_filters() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; @@ -236,27 +251,27 @@ PxeRecvFilterRead ( // Snp->Mode.ReceiveFilterSetting = 0; - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_UNICAST) != 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_UNICAST) != 0) { Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_UNICAST; } - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_BROADCAST) != 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_BROADCAST) != 0) { Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST; } - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_PROMISCUOUS) != 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_PROMISCUOUS) != 0) { Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS; } - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_ALL_MULTICAST) != 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_ALL_MULTICAST) != 0) { Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST; } - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST) != 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST) != 0) { Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST; } - CopyMem (Snp->Mode.MCastFilter, Snp->Db, Snp->Cdb.DBsize); + CopyMem (Snp->Mode.MCastFilter, Snp->Db, Snp->Cdb->DBsize); // // Count number of active entries in multicast filter list. diff --git a/NetworkPkg/SnpDxe/Reset.c b/NetworkPkg/SnpDxe/Reset.c index 72f31425d0..3fcc2a19ed 100644 --- a/NetworkPkg/SnpDxe/Reset.c +++ b/NetworkPkg/SnpDxe/Reset.c @@ -23,30 +23,35 @@ PxeReset ( SNP_DRIVER *Snp ) { - Snp->Cdb.OpCode = PXE_OPCODE_RESET; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Snp->Cdb->OpCode = PXE_OPCODE_RESET; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.reset() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { DEBUG ( (DEBUG_WARN, "\nsnp->undi32.reset() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); // diff --git a/NetworkPkg/SnpDxe/Shutdown.c b/NetworkPkg/SnpDxe/Shutdown.c index 33fa7cb033..0f1ad35fed 100644 --- a/NetworkPkg/SnpDxe/Shutdown.c +++ b/NetworkPkg/SnpDxe/Shutdown.c @@ -22,29 +22,34 @@ PxeShutdown ( IN SNP_DRIVER *Snp ) { - Snp->Cdb.OpCode = PXE_OPCODE_SHUTDOWN; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Snp->Cdb->OpCode = PXE_OPCODE_SHUTDOWN; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.shutdown() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { // // UNDI could not be shutdown. Return UNDI error. // - DEBUG ((DEBUG_WARN, "\nsnp->undi.shutdown() %xh:%xh\n", Snp->Cdb.StatFlags, Snp->Cdb.StatCode)); + DEBUG ((DEBUG_WARN, "\nsnp->undi.shutdown() %xh:%xh\n", Snp->Cdb->StatFlags, Snp->Cdb->StatCode)); return EFI_DEVICE_ERROR; } diff --git a/NetworkPkg/SnpDxe/Snp.c b/NetworkPkg/SnpDxe/Snp.c index 09d6c8fc99..2b3f943f5a 100644 --- a/NetworkPkg/SnpDxe/Snp.c +++ b/NetworkPkg/SnpDxe/Snp.c @@ -235,6 +235,54 @@ Done: return Status; } +/** + Free the SNP_DRIVER structure and all its sub-structures. + + @param Snp Pointer to SNP_DRIVER structure to be freed. +**/ +VOID +SimpleNetworkDriverFree ( + IN SNP_DRIVER *Snp + ) +{ + EFI_PCI_IO_PROTOCOL *PciIo; + + if (Snp != NULL) { + PciIo = Snp->PciIo; + if (PciIo != NULL) { + if (Snp->Cpb != NULL) { + PciIo->FreeBuffer ( + PciIo, + SNP_MEM_PAGES (EFI_PAGE_SIZE), + Snp->Cpb + ); + } + + if (Snp->Db != NULL) { + PciIo->FreeBuffer ( + PciIo, + SNP_MEM_PAGES (EFI_PAGE_SIZE), + Snp->Db + ); + } + + if (Snp->Cdb != NULL) { + PciIo->FreeBuffer ( + PciIo, + SNP_MEM_PAGES (sizeof (PXE_CDB)), + (VOID *)(UINTN)Snp->Cdb + ); + } + } + + if (Snp->RecycledTxBuf != NULL) { + FreePool (Snp->RecycledTxBuf); + } + + FreePool (Snp); + } +} + /** Start this driver on ControllerHandle. This service is called by the EFI boot service ConnectController(). In order to make @@ -266,7 +314,6 @@ SimpleNetworkDriverStart ( EFI_STATUS Status; PXE_UNDI *Pxe; SNP_DRIVER *Snp; - VOID *Address; EFI_HANDLE Handle; UINT8 BarIndex; PXE_STATFLAGS InitStatFlags; @@ -339,7 +386,7 @@ SimpleNetworkDriverStart ( if (Calc8BitCksum (Pxe, Pxe->hw.Len) != 0) { DEBUG ((DEBUG_NET, "\n!PXE checksum is not correct.\n")); - goto NiiError; + goto ErrorDeleteSnp; } if ((Pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED) != 0) { @@ -354,31 +401,19 @@ SimpleNetworkDriverStart ( // } else { DEBUG ((DEBUG_NET, "\nUNDI does not have promiscuous or broadcast support.")); - goto NiiError; + goto ErrorDeleteSnp; } // // OK, we like this UNDI, and we know snp is not already there on this handle // Allocate and initialize a new simple network protocol structure. // - Status = PciIo->AllocateBuffer ( - PciIo, - AllocateAnyPages, - EfiBootServicesData, - SNP_MEM_PAGES (sizeof (SNP_DRIVER)), - &Address, - 0 - ); - - if (Status != EFI_SUCCESS) { + Snp = AllocateZeroPool (sizeof (SNP_DRIVER)); + if (Snp == NULL) { DEBUG ((DEBUG_NET, "\nCould not allocate SNP_DRIVER structure.\n")); - goto NiiError; + goto ErrorDeleteSnp; } - Snp = (SNP_DRIVER *)(UINTN)Address; - - ZeroMem (Snp, sizeof (SNP_DRIVER)); - Snp->PciIo = PciIo; Snp->Signature = SNP_DRIVER_SIGNATURE; @@ -408,7 +443,7 @@ SimpleNetworkDriverStart ( Snp->RecycledTxBuf = AllocatePool (sizeof (UINT64) * SNP_TX_BUFFER_INCREASEMENT); if (Snp->RecycledTxBuf == NULL) { Status = EFI_OUT_OF_RESOURCES; - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } Snp->MaxRecycledTxBuf = SNP_TX_BUFFER_INCREASEMENT; @@ -453,18 +488,47 @@ SimpleNetworkDriverStart ( PciIo, AllocateAnyPages, EfiBootServicesData, - SNP_MEM_PAGES (4096), - &Address, + SNP_MEM_PAGES (EFI_PAGE_SIZE), + &Snp->Cpb, 0 ); if (Status != EFI_SUCCESS) { - DEBUG ((DEBUG_NET, "\nCould not allocate CPB and DB structures.\n")); - goto Error_DeleteSNP; + DEBUG ((DEBUG_NET, "\nCould not allocate CPB structure.\n")); + goto ErrorDeleteSnp; } - Snp->Cpb = (VOID *)(UINTN)Address; - Snp->Db = (VOID *)((UINTN)Address + 2048); + Status = PciIo->AllocateBuffer ( + PciIo, + AllocateAnyPages, + EfiBootServicesData, + SNP_MEM_PAGES (EFI_PAGE_SIZE), + &Snp->Db, + 0 + ); + + if (Status != EFI_SUCCESS) { + DEBUG ((DEBUG_NET, "\nCould not allocate DB structure.\n")); + goto ErrorDeleteSnp; + } + + Status = PciIo->AllocateBuffer ( + PciIo, + AllocateAnyPages, + EfiBootServicesData, + SNP_MEM_PAGES (sizeof (PXE_CDB)), + (VOID **)&Snp->Cdb, + 0 + ); + + if (Status != EFI_SUCCESS) { + DEBUG ((DEBUG_NET, "\nCould not allocate CDB structure.\n")); + goto ErrorDeleteSnp; + } + + ZeroMem (Snp->Cpb, EFI_PAGE_SIZE); + ZeroMem (Snp->Db, EFI_PAGE_SIZE); + ZeroMem (Snp->Cdb, sizeof (PXE_CDB)); // // Find the correct BAR to do IO. @@ -487,7 +551,7 @@ SimpleNetworkDriverStart ( if (Status == EFI_UNSUPPORTED) { continue; } else if (EFI_ERROR (Status)) { - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } if ((!FoundMemoryBar) && (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM)) { @@ -508,37 +572,37 @@ SimpleNetworkDriverStart ( Status = PxeStart (Snp); if (Status != EFI_SUCCESS) { - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } - Snp->Cdb.OpCode = PXE_OPCODE_GET_INIT_INFO; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->OpCode = PXE_OPCODE_GET_INIT_INFO; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.DBsize = (UINT16)sizeof (Snp->InitInfo); - Snp->Cdb.DBaddr = (UINT64)(UINTN)(&Snp->InitInfo); + Snp->Cdb->DBsize = (UINT16)sizeof (Snp->InitInfo); + Snp->Cdb->DBaddr = (UINT64)(UINTN)(&Snp->InitInfo); - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; DEBUG ((DEBUG_NET, "\nSnp->undi.get_init_info() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); // // Save the INIT Stat Code... // - InitStatFlags = Snp->Cdb.StatFlags; + InitStatFlags = Snp->Cdb->StatFlags; - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { - DEBUG ((DEBUG_NET, "\nSnp->undi.init_info() %xh:%xh\n", Snp->Cdb.StatFlags, Snp->Cdb.StatCode)); + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { + DEBUG ((DEBUG_NET, "\nSnp->undi.init_info() %xh:%xh\n", Snp->Cdb->StatFlags, Snp->Cdb->StatCode)); PxeStop (Snp); - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } // @@ -623,7 +687,7 @@ SimpleNetworkDriverStart ( if (EFI_ERROR (Status)) { PxeStop (Snp); - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } Status = PxeGetStnAddr (Snp); @@ -632,7 +696,7 @@ SimpleNetworkDriverStart ( DEBUG ((DEBUG_ERROR, "\nSnp->undi.get_station_addr() failed.\n")); PxeShutdown (Snp); PxeStop (Snp); - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } Snp->Mode.MediaPresent = FALSE; @@ -663,7 +727,7 @@ SimpleNetworkDriverStart ( &Snp->ExitBootServicesEvent ); if (EFI_ERROR (Status)) { - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } } @@ -681,24 +745,9 @@ SimpleNetworkDriverStart ( return Status; } - PciIo->FreeBuffer ( - PciIo, - SNP_MEM_PAGES (4096), - Snp->Cpb - ); +ErrorDeleteSnp: + SimpleNetworkDriverFree (Snp); -Error_DeleteSNP: - - if (Snp->RecycledTxBuf != NULL) { - FreePool (Snp->RecycledTxBuf); - } - - PciIo->FreeBuffer ( - PciIo, - SNP_MEM_PAGES (sizeof (SNP_DRIVER)), - Snp - ); -NiiError: gBS->CloseProtocol ( Controller, &gEfiNetworkInterfaceIdentifierProtocolGuid_31, @@ -753,7 +802,6 @@ SimpleNetworkDriverStop ( EFI_STATUS Status; EFI_SIMPLE_NETWORK_PROTOCOL *SnpProtocol; SNP_DRIVER *Snp; - EFI_PCI_IO_PROTOCOL *PciIo; // // Get our context back. @@ -773,55 +821,44 @@ SimpleNetworkDriverStop ( Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (SnpProtocol); - Status = gBS->UninstallProtocolInterface ( - Controller, - &gEfiSimpleNetworkProtocolGuid, - &Snp->Snp - ); + if (Snp != NULL) { + Status = gBS->UninstallProtocolInterface ( + Controller, + &gEfiSimpleNetworkProtocolGuid, + &Snp->Snp + ); - if (EFI_ERROR (Status)) { - return Status; + if (EFI_ERROR (Status)) { + return Status; + } + + if (PcdGetBool (PcdSnpCreateExitBootServicesEvent)) { + // + // Close EXIT_BOOT_SERVICES Event + // + gBS->CloseEvent (Snp->ExitBootServicesEvent); + } + + Status = gBS->CloseProtocol ( + Controller, + &gEfiNetworkInterfaceIdentifierProtocolGuid_31, + This->DriverBindingHandle, + Controller + ); + + Status = gBS->CloseProtocol ( + Controller, + &gEfiDevicePathProtocolGuid, + This->DriverBindingHandle, + Controller + ); + + PxeShutdown (Snp); + PxeStop (Snp); + + SimpleNetworkDriverFree (Snp); } - if (PcdGetBool (PcdSnpCreateExitBootServicesEvent)) { - // - // Close EXIT_BOOT_SERVICES Event - // - gBS->CloseEvent (Snp->ExitBootServicesEvent); - } - - Status = gBS->CloseProtocol ( - Controller, - &gEfiNetworkInterfaceIdentifierProtocolGuid_31, - This->DriverBindingHandle, - Controller - ); - - Status = gBS->CloseProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - PxeShutdown (Snp); - PxeStop (Snp); - - FreePool (Snp->RecycledTxBuf); - - PciIo = Snp->PciIo; - PciIo->FreeBuffer ( - PciIo, - SNP_MEM_PAGES (4096), - Snp->Cpb - ); - - PciIo->FreeBuffer ( - PciIo, - SNP_MEM_PAGES (sizeof (SNP_DRIVER)), - Snp - ); - return Status; } diff --git a/NetworkPkg/SnpDxe/Snp.h b/NetworkPkg/SnpDxe/Snp.h index d57804ca28..74fc3cda40 100644 --- a/NetworkPkg/SnpDxe/Snp.h +++ b/NetworkPkg/SnpDxe/Snp.h @@ -100,7 +100,7 @@ typedef struct { // Buffers for command descriptor block, command parameter block // and data block. // - PXE_CDB Cdb; + PXE_CDB *Cdb; VOID *Cpb; VOID *CpbUnmap; VOID *Db; diff --git a/NetworkPkg/SnpDxe/Start.c b/NetworkPkg/SnpDxe/Start.c index 514582b9b9..bd59a57354 100644 --- a/NetworkPkg/SnpDxe/Start.c +++ b/NetworkPkg/SnpDxe/Start.c @@ -24,28 +24,33 @@ PxeStart ( { PXE_CPB_START_31 *Cpb31; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + Cpb31 = Snp->Cpb; // // Initialize UNDI Start CDB for H/W UNDI // - Snp->Cdb.OpCode = PXE_OPCODE_START; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->OpCode = PXE_OPCODE_START; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Make changes to H/W UNDI Start CDB if this is // a S/W UNDI. // if (Snp->IsSwUndi) { - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_START_31); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb31; + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_START_31); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb31; Cpb31->Delay = (UINT64)(UINTN)&SnpUndi32CallbackDelay; Cpb31->Block = (UINT64)(UINTN)&SnpUndi32CallbackBlock; @@ -68,17 +73,17 @@ PxeStart ( // DEBUG ((DEBUG_NET, "\nsnp->undi.start() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { // // UNDI could not be started. Return UNDI error. // DEBUG ( (DEBUG_ERROR, "\nsnp->undi.start() %xh:%xh\n", - Snp->Cdb.StatCode, - Snp->Cdb.StatFlags) + Snp->Cdb->StatCode, + Snp->Cdb->StatFlags) ); return EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Station_address.c b/NetworkPkg/SnpDxe/Station_address.c index 66ddbf6831..7411be907f 100644 --- a/NetworkPkg/SnpDxe/Station_address.c +++ b/NetworkPkg/SnpDxe/Station_address.c @@ -25,34 +25,39 @@ PxeGetStnAddr ( { PXE_DB_STATION_ADDRESS *Db; - Db = Snp->Db; - Snp->Cdb.OpCode = PXE_OPCODE_STATION_ADDRESS; - Snp->Cdb.OpFlags = PXE_OPFLAGS_STATION_ADDRESS_READ; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; + Db = Snp->Db; + Snp->Cdb->OpCode = PXE_OPCODE_STATION_ADDRESS; + Snp->Cdb->OpFlags = PXE_OPFLAGS_STATION_ADDRESS_READ; - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_STATION_ADDRESS); - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_STATION_ADDRESS); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; + + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.station_addr() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { DEBUG ( (DEBUG_ERROR, "\nsnp->undi.station_addr() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; @@ -101,46 +106,51 @@ PxeSetStnAddr ( PXE_CPB_STATION_ADDRESS *Cpb; PXE_DB_STATION_ADDRESS *Db; - Cpb = Snp->Cpb; - Db = Snp->Db; - Snp->Cdb.OpCode = PXE_OPCODE_STATION_ADDRESS; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Cpb = Snp->Cpb; + Db = Snp->Db; + Snp->Cdb->OpCode = PXE_OPCODE_STATION_ADDRESS; if (NewMacAddr == NULL) { - Snp->Cdb.OpFlags = PXE_OPFLAGS_STATION_ADDRESS_RESET; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->OpFlags = PXE_OPFLAGS_STATION_ADDRESS_RESET; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; } else { - Snp->Cdb.OpFlags = PXE_OPFLAGS_STATION_ADDRESS_WRITE; + Snp->Cdb->OpFlags = PXE_OPFLAGS_STATION_ADDRESS_WRITE; // // Supplying a new address in the CPB will make undi change the mac address to the new one. // CopyMem (&Cpb->StationAddr, NewMacAddr, Snp->Mode.HwAddressSize); - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_STATION_ADDRESS); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb; + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_STATION_ADDRESS); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb; } - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_STATION_ADDRESS); - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_STATION_ADDRESS); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.station_addr() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { DEBUG ( (DEBUG_ERROR, "\nsnp->undi.station_addr() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); // diff --git a/NetworkPkg/SnpDxe/Statistics.c b/NetworkPkg/SnpDxe/Statistics.c index 34d1332523..97ce1ddf53 100644 --- a/NetworkPkg/SnpDxe/Statistics.c +++ b/NetworkPkg/SnpDxe/Statistics.c @@ -82,6 +82,11 @@ SnpUndi32Statistics ( Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (This); + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + OldTpl = gBS->RaiseTPL (TPL_CALLBACK); // @@ -112,23 +117,23 @@ SnpUndi32Statistics ( // // Initialize UNDI Statistics CDB // - Snp->Cdb.OpCode = PXE_OPCODE_STATISTICS; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->OpCode = PXE_OPCODE_STATISTICS; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; if (Reset) { - Snp->Cdb.OpFlags = PXE_OPFLAGS_STATISTICS_RESET; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Db = Snp->Db; + Snp->Cdb->OpFlags = PXE_OPFLAGS_STATISTICS_RESET; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Db = Snp->Db; } else { - Snp->Cdb.OpFlags = PXE_OPFLAGS_STATISTICS_READ; - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_STATISTICS); - Snp->Cdb.DBaddr = (UINT64)(UINTN)(Db = Snp->Db); + Snp->Cdb->OpFlags = PXE_OPFLAGS_STATISTICS_READ; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_STATISTICS); + Snp->Cdb->DBaddr = (UINT64)(UINTN)(Db = Snp->Db); } // @@ -136,9 +141,9 @@ SnpUndi32Statistics ( // DEBUG ((DEBUG_NET, "\nsnp->undi.statistics() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: break; @@ -146,8 +151,8 @@ SnpUndi32Statistics ( DEBUG ( (DEBUG_ERROR, "\nsnp->undi.statistics() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); Status = EFI_UNSUPPORTED; @@ -157,8 +162,8 @@ SnpUndi32Statistics ( DEBUG ( (DEBUG_ERROR, "\nsnp->undi.statistics() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); Status = EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Stop.c b/NetworkPkg/SnpDxe/Stop.c index a3ce530fea..e3ef79f4ad 100644 --- a/NetworkPkg/SnpDxe/Stop.c +++ b/NetworkPkg/SnpDxe/Stop.c @@ -22,30 +22,35 @@ PxeStop ( SNP_DRIVER *Snp ) { - Snp->Cdb.OpCode = PXE_OPCODE_STOP; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Snp->Cdb->OpCode = PXE_OPCODE_STOP; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command // DEBUG ((DEBUG_NET, "\nsnp->undi.stop() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { DEBUG ( (DEBUG_WARN, "\nsnp->undi.stop() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Transmit.c b/NetworkPkg/SnpDxe/Transmit.c index 7947cde436..a08c309012 100644 --- a/NetworkPkg/SnpDxe/Transmit.c +++ b/NetworkPkg/SnpDxe/Transmit.c @@ -38,6 +38,11 @@ PxeFillHeader ( { PXE_CPB_FILL_HEADER_FRAGMENTED *Cpb; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + Cpb = Snp->Cpb; if (SrcAddr != NULL) { CopyMem ( @@ -77,28 +82,28 @@ PxeFillHeader ( Cpb->FragDesc[0].reserved = Cpb->FragDesc[1].reserved = 0; - Snp->Cdb.OpCode = PXE_OPCODE_FILL_HEADER; - Snp->Cdb.OpFlags = PXE_OPFLAGS_FILL_HEADER_FRAGMENTED; + Snp->Cdb->OpCode = PXE_OPCODE_FILL_HEADER; + Snp->Cdb->OpFlags = PXE_OPFLAGS_FILL_HEADER_FRAGMENTED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_FILL_HEADER_FRAGMENTED); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb; + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_FILL_HEADER_FRAGMENTED); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nSnp->undi.fill_header() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: return EFI_SUCCESS; @@ -106,8 +111,8 @@ PxeFillHeader ( DEBUG ( (DEBUG_ERROR, "\nSnp->undi.fill_header() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_INVALID_PARAMETER; @@ -116,8 +121,8 @@ PxeFillHeader ( DEBUG ( (DEBUG_ERROR, "\nSnp->undi.fill_header() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; @@ -145,6 +150,11 @@ PxeTransmit ( PXE_CPB_TRANSMIT *Cpb; EFI_STATUS Status; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + Cpb = Snp->Cpb; Cpb->FrameAddr = (UINT64)(UINTN)Buffer; Cpb->DataLen = (UINT32)BufferSize; @@ -152,37 +162,37 @@ PxeTransmit ( Cpb->MediaheaderLen = 0; Cpb->reserved = 0; - Snp->Cdb.OpFlags = PXE_OPFLAGS_TRANSMIT_WHOLE; + Snp->Cdb->OpFlags = PXE_OPFLAGS_TRANSMIT_WHOLE; - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_TRANSMIT); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb; + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_TRANSMIT); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb; - Snp->Cdb.OpCode = PXE_OPCODE_TRANSMIT; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->OpCode = PXE_OPCODE_TRANSMIT; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nSnp->undi.transmit() ")); - DEBUG ((DEBUG_NET, "\nSnp->Cdb.OpCode == %x", Snp->Cdb.OpCode)); - DEBUG ((DEBUG_NET, "\nSnp->Cdb.CPBaddr == %LX", Snp->Cdb.CPBaddr)); - DEBUG ((DEBUG_NET, "\nSnp->Cdb.DBaddr == %LX", Snp->Cdb.DBaddr)); + DEBUG ((DEBUG_NET, "\nSnp->Cdb->OpCode == %x", Snp->Cdb->OpCode)); + DEBUG ((DEBUG_NET, "\nSnp->Cdb->CPBaddr == %LX", Snp->Cdb->CPBaddr)); + DEBUG ((DEBUG_NET, "\nSnp->Cdb->DBaddr == %LX", Snp->Cdb->DBaddr)); DEBUG ((DEBUG_NET, "\nCpb->FrameAddr == %LX\n", Cpb->FrameAddr)); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); DEBUG ((DEBUG_NET, "\nexit Snp->undi.transmit() ")); // // we will unmap the buffers in get_status call, not here // - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: return EFI_SUCCESS; @@ -193,8 +203,8 @@ PxeTransmit ( DEBUG ( (DEBUG_NET, "\nSnp->undi.transmit() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); break; @@ -202,8 +212,8 @@ PxeTransmit ( DEBUG ( (DEBUG_ERROR, "\nSnp->undi.transmit() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); Status = EFI_DEVICE_ERROR; } diff --git a/NetworkPkg/SnpDxe/WaitForPacket.c b/NetworkPkg/SnpDxe/WaitForPacket.c index f0e9041238..999399d091 100644 --- a/NetworkPkg/SnpDxe/WaitForPacket.c +++ b/NetworkPkg/SnpDxe/WaitForPacket.c @@ -31,6 +31,11 @@ SnpWaitForPacketNotify ( return; } + if (((SNP_DRIVER *)SnpPtr)->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return; + } + // // Do nothing if the SNP interface is not initialized. // @@ -47,16 +52,16 @@ SnpWaitForPacketNotify ( // // Fill in CDB for UNDI GetStatus(). // - ((SNP_DRIVER *)SnpPtr)->Cdb.OpCode = PXE_OPCODE_GET_STATUS; - ((SNP_DRIVER *)SnpPtr)->Cdb.OpFlags = 0; - ((SNP_DRIVER *)SnpPtr)->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - ((SNP_DRIVER *)SnpPtr)->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - ((SNP_DRIVER *)SnpPtr)->Cdb.DBsize = (UINT16)(sizeof (UINT32) * 2); - ((SNP_DRIVER *)SnpPtr)->Cdb.DBaddr = (UINT64)(UINTN)(((SNP_DRIVER *)SnpPtr)->Db); - ((SNP_DRIVER *)SnpPtr)->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - ((SNP_DRIVER *)SnpPtr)->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - ((SNP_DRIVER *)SnpPtr)->Cdb.IFnum = ((SNP_DRIVER *)SnpPtr)->IfNum; - ((SNP_DRIVER *)SnpPtr)->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + ((SNP_DRIVER *)SnpPtr)->Cdb->OpCode = PXE_OPCODE_GET_STATUS; + ((SNP_DRIVER *)SnpPtr)->Cdb->OpFlags = 0; + ((SNP_DRIVER *)SnpPtr)->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + ((SNP_DRIVER *)SnpPtr)->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + ((SNP_DRIVER *)SnpPtr)->Cdb->DBsize = (UINT16)(sizeof (UINT32) * 2); + ((SNP_DRIVER *)SnpPtr)->Cdb->DBaddr = (UINT64)(UINTN)(((SNP_DRIVER *)SnpPtr)->Db); + ((SNP_DRIVER *)SnpPtr)->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + ((SNP_DRIVER *)SnpPtr)->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + ((SNP_DRIVER *)SnpPtr)->Cdb->IFnum = ((SNP_DRIVER *)SnpPtr)->IfNum; + ((SNP_DRIVER *)SnpPtr)->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Clear contents of DB buffer. @@ -66,9 +71,9 @@ SnpWaitForPacketNotify ( // // Issue UNDI command and check result. // - (*((SNP_DRIVER *)SnpPtr)->IssueUndi32Command)((UINT64)(UINTN)&((SNP_DRIVER *)SnpPtr)->Cdb); + (*((SNP_DRIVER *)SnpPtr)->IssueUndi32Command)((UINT64)(UINTN)((SNP_DRIVER *)SnpPtr)->Cdb); - if (((SNP_DRIVER *)SnpPtr)->Cdb.StatCode != EFI_SUCCESS) { + if (((SNP_DRIVER *)SnpPtr)->Cdb->StatCode != EFI_SUCCESS) { return; }