mirror of
https://gitlab.com/qemu-project/edk2.git
synced 2025-10-30 07:56:39 +08:00
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:
@ -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;
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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)
|
||||
);
|
||||
|
||||
//
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
);
|
||||
|
||||
//
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user