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 <eeshanlondhe@microsoft.com>
This commit is contained in:
eeshanl
2025-05-28 23:06:12 +00:00
committed by mergify[bot]
parent a074649c60
commit 302cc88ab3
16 changed files with 555 additions and 428 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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.

View File

@ -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)
);
//

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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)
);
//

View File

@ -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;

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}