4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Provides the basic UNID functions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Undi32.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Global variables defined in this file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_CALL_TABLE api_table[PXE_OPCODE_LAST_VALID+1] = { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {PXE_CPBSIZE_NOT_USED,PXE_DBSIZE_NOT_USED,0, (UINT16)(ANY_STATE),UNDI_GetState },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(UINT16)(DONT_CHECK),PXE_DBSIZE_NOT_USED,0,(UINT16)(ANY_STATE),UNDI_Start },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {PXE_CPBSIZE_NOT_USED,PXE_DBSIZE_NOT_USED,0,MUST_BE_STARTED,UNDI_Stop },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {PXE_CPBSIZE_NOT_USED,sizeof(PXE_DB_GET_INIT_INFO),0,MUST_BE_STARTED, UNDI_GetInitInfo },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {PXE_CPBSIZE_NOT_USED,sizeof(PXE_DB_GET_CONFIG_INFO),0,MUST_BE_STARTED, UNDI_GetConfigInfo },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {sizeof(PXE_CPB_INITIALIZE),(UINT16)(DONT_CHECK),(UINT16)(DONT_CHECK),MUST_BE_STARTED,UNDI_Initialize },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {PXE_CPBSIZE_NOT_USED,PXE_DBSIZE_NOT_USED,(UINT16)(DONT_CHECK), MUST_BE_INITIALIZED,UNDI_Reset },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {PXE_CPBSIZE_NOT_USED,PXE_DBSIZE_NOT_USED,0, MUST_BE_INITIALIZED,UNDI_Shutdown },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {PXE_CPBSIZE_NOT_USED,PXE_DBSIZE_NOT_USED,(UINT16)(DONT_CHECK), MUST_BE_INITIALIZED,UNDI_Interrupt },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(UINT16)(DONT_CHECK),(UINT16)(DONT_CHECK),(UINT16)(DONT_CHECK), MUST_BE_INITIALIZED, UNDI_RecFilter },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(UINT16)(DONT_CHECK),(UINT16)(DONT_CHECK),(UINT16)(DONT_CHECK), MUST_BE_INITIALIZED, UNDI_StnAddr },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {PXE_CPBSIZE_NOT_USED, (UINT16)(DONT_CHECK), (UINT16)(DONT_CHECK), MUST_BE_INITIALIZED, UNDI_Statistics },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {sizeof(PXE_CPB_MCAST_IP_TO_MAC),sizeof(PXE_DB_MCAST_IP_TO_MAC), (UINT16)(DONT_CHECK),MUST_BE_INITIALIZED, UNDI_ip2mac },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(UINT16)(DONT_CHECK),(UINT16)(DONT_CHECK),(UINT16)(DONT_CHECK), MUST_BE_INITIALIZED, UNDI_NVData },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {PXE_CPBSIZE_NOT_USED,(UINT16)(DONT_CHECK),(UINT16)(DONT_CHECK), MUST_BE_INITIALIZED, UNDI_Status },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(UINT16)(DONT_CHECK),PXE_DBSIZE_NOT_USED,(UINT16)(DONT_CHECK), MUST_BE_INITIALIZED, UNDI_FillHeader },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(UINT16)(DONT_CHECK),PXE_DBSIZE_NOT_USED,(UINT16)(DONT_CHECK), MUST_BE_INITIALIZED, UNDI_Transmit },\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {sizeof(PXE_CPB_RECEIVE),sizeof(PXE_DB_RECEIVE),0,MUST_BE_INITIALIZED, UNDI_Receive } \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// end of global variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine determines the operational state of the UNDI. It updates the state flags in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Command Descriptor Block based on information derived from the AdapterInfo instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync To ensure the command has completed successfully, CdbPtr->StatCode will contain the result of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the command execution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The CdbPtr->StatFlags will contain a STOPPED, STARTED, or INITIALIZED state once the command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync has successfully completed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Keep in mind the AdapterInfo->State is the active state of the adapter (based on software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync interrogation), and the CdbPtr->StateFlags is the passed back information that is reflected
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to the caller of the UNDI API.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_GetState (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = (PXE_STATFLAGS) (CdbPtr->StatFlags | AdapterInfo->State);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to change the operational state of the UNDI from stopped to started.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It will do this as long as the adapter's state is PXE_STATFLAGS_GET_STATE_STOPPED, otherwise
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the CdbPtr->StatFlags will reflect a command failure, and the CdbPtr->StatCode will reflect the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UNDI as having already been started.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is modified to reflect the undi 1.1 specification changes. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync changes in the spec are mainly in the callback routines, the new spec adds
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 3 more callbacks and a unique id.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Since this UNDI supports both old and new undi specifications,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The NIC's data structure is filled in with the callback routines (depending
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync on the version) pointed to in the caller's CpbPtr. This seeds the Delay,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Virt2Phys, Block, and Mem_IO for old and new versions and Map_Mem, UnMap_Mem
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Sync_Mem routines and a unique id variable for the new version.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is the function which an external entity (SNP, O/S, etc) would call
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to provide it's I/O abstraction to the UNDI.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It's final action is to change the AdapterInfo->State to PXE_STATFLAGS_GET_STATE_STARTED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_Start (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_CPB_START_30 *CpbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_CPB_START_31 *CpbPtr_31;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check if it is already started.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AdapterInfo->State != PXE_STATFLAGS_GET_STATE_STOPPED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_ALREADY_STARTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->CPBsize != sizeof(PXE_CPB_START_30) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->CPBsize != sizeof(PXE_CPB_START_31)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CpbPtr = (PXE_CPB_START_30 *) (UINTN) (CdbPtr->CPBaddr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CpbPtr_31 = (PXE_CPB_START_31 *) (UINTN) (CdbPtr->CPBaddr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AdapterInfo->VersionFlag == 0x30) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Delay_30 = (bsptr_30) (UINTN) CpbPtr->Delay;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Virt2Phys_30 = (virtphys_30) (UINTN) CpbPtr->Virt2Phys;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Block_30 = (block_30) (UINTN) CpbPtr->Block;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // patch for old buggy 3.0 code:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // In EFI1.0 undi used to provide the full (absolute) I/O address to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // i/o calls and SNP used to provide a callback that used GlobalIoFncs and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // everything worked fine! In EFI 1.1, UNDI is not using the full
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // i/o or memory address to access the device, The base values for the i/o
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // and memory address is abstracted by the device specific PciIoFncs and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // UNDI only uses the offset values. Since UNDI3.0 cannot provide any
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // identification to SNP, SNP cannot use nic specific PciIoFncs callback!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // To fix this and make undi3.0 work with SNP in EFI1.1 we
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // use a TmpMemIo function that is defined in init.c
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This breaks the runtime driver feature of undi, but what to do
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if we have to provide the 3.0 compatibility (including the 3.0 bugs)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This TmpMemIo function also takes a UniqueId parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // (as in undi3.1 design) and so initialize the UniqueId as well here
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Note: AdapterInfo->Mem_Io_30 is just filled for consistency with other
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // parameters but never used, we only use Mem_Io field in the In/Out routines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // inside e100b.c.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Mem_Io_30 = (mem_io_30) (UINTN) CpbPtr->Mem_IO;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Mem_Io = (mem_io) (UINTN) TmpMemIo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Unique_ID = (UINT64) (UINTN) AdapterInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Delay = (bsptr) (UINTN) CpbPtr_31->Delay;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Virt2Phys = (virtphys) (UINTN) CpbPtr_31->Virt2Phys;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Block = (block) (UINTN) CpbPtr_31->Block;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Mem_Io = (mem_io) (UINTN) CpbPtr_31->Mem_IO;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Map_Mem = (map_mem) (UINTN) CpbPtr_31->Map_Mem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->UnMap_Mem = (unmap_mem) (UINTN) CpbPtr_31->UnMap_Mem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Sync_Mem = (sync_mem) (UINTN) CpbPtr_31->Sync_Mem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Unique_ID = CpbPtr_31->Unique_ID;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->State = PXE_STATFLAGS_GET_STATE_STARTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to change the operational state of the UNDI from started to stopped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It will not do this if the adapter's state is PXE_STATFLAGS_GET_STATE_INITIALIZED, otherwise
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the CdbPtr->StatFlags will reflect a command failure, and the CdbPtr->StatCode will reflect the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UNDI as having already not been shut down.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The NIC's data structure will have the Delay, Virt2Phys, and Block, pointers zero'd out..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It's final action is to change the AdapterInfo->State to PXE_STATFLAGS_GET_STATE_STOPPED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_Stop (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AdapterInfo->State == PXE_STATFLAGS_GET_STATE_INITIALIZED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_NOT_SHUTDOWN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Delay_30 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Virt2Phys_30 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Block_30 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Delay = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Virt2Phys = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Block = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Map_Mem = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->UnMap_Mem = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Sync_Mem = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->State = PXE_STATFLAGS_GET_STATE_STOPPED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to retrieve the initialization information that is needed by drivers and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync applications to initialize the UNDI. This will fill in data in the Data Block structure that is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pointed to by the caller's CdbPtr->DBaddr. The fields filled in are as follows:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MemoryRequired, FrameDataLen, LinkSpeeds[0-3], NvCount, NvWidth, MediaHeaderLen, HWaddrLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MCastFilterCnt, TxBufCnt, TxBufSize, RxBufCnt, RxBufSize, IFtype, Duplex, and LoopBack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync In addition, the CdbPtr->StatFlags ORs in that this NIC supports cable detection. (APRIORI knowledge)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_GetInitInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_DB_GET_INIT_INFO *DbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr = (PXE_DB_GET_INIT_INFO *) (UINTN) (CdbPtr->DBaddr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->MemoryRequired = MEMORY_NEEDED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->FrameDataLen = PXE_MAX_TXRX_UNIT_ETHER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->LinkSpeeds[0] = 10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->LinkSpeeds[1] = 100;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->LinkSpeeds[2] = DbPtr->LinkSpeeds[3] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->NvCount = MAX_EEPROM_LEN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->NvWidth = 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->MediaHeaderLen = PXE_MAC_HEADER_LEN_ETHER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->HWaddrLen = PXE_HWADDR_LEN_ETHER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->MCastFilterCnt = MAX_MCAST_ADDRESS_CNT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->TxBufCnt = TX_BUFFER_COUNT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->TxBufSize = (UINT16) sizeof (TxCB);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->RxBufCnt = RX_BUFFER_COUNT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->RxBufSize = (UINT16) sizeof (RxFD);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->IFtype = PXE_IFTYPE_ETHERNET;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->SupportedDuplexModes = PXE_DUPLEX_ENABLE_FULL_SUPPORTED |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_DUPLEX_FORCE_FULL_SUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->SupportedLoopBackModes = PXE_LOOPBACK_INTERNAL_SUPPORTED |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_LOOPBACK_EXTERNAL_SUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags |= (PXE_STATFLAGS_CABLE_DETECT_SUPPORTED |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to retrieve the configuration information about the NIC being controlled by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this driver. This will fill in data in the Data Block structure that is pointed to by the caller's CdbPtr->DBaddr.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The fields filled in are as follows:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->pci.BusType, DbPtr->pci.Bus, DbPtr->pci.Device, and DbPtr->pci.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync In addition, the DbPtr->pci.Config.Dword[0-63] grabs a copy of this NIC's PCI configuration space.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_GetConfigInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_DB_GET_CONFIG_INFO *DbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr = (PXE_DB_GET_CONFIG_INFO *) (UINTN) (CdbPtr->DBaddr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->pci.BusType = PXE_BUSTYPE_PCI;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->pci.Bus = AdapterInfo->Bus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->pci.Device = AdapterInfo->Device;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->pci.Function = AdapterInfo->Function;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < MAX_PCI_CONFIG_LEN; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->pci.Config.Dword[Index] = AdapterInfo->Config[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine resets the network adapter and initializes the UNDI using the parameters supplied in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the CPB. This command must be issued before the network adapter can be setup to transmit and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync receive packets.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Once the memory requirements of the UNDI are obtained by using the GetInitInfo command, a block
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of non-swappable memory may need to be allocated. The address of this memory must be passed to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UNDI during the Initialize in the CPB. This memory is used primarily for transmit and receive buffers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The fields CableDetect, LinkSpeed, Duplex, LoopBack, MemoryPtr, and MemoryLength are set with information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that was passed in the CPB and the NIC is initialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the NIC initialization fails, the CdbPtr->StatFlags are updated with PXE_STATFLAGS_COMMAND_FAILED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Otherwise, AdapterInfo->State is updated with PXE_STATFLAGS_GET_STATE_INITIALIZED showing the state of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI is now initialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_Initialize (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_CPB_INITIALIZE *CpbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->OpFlags != PXE_OPFLAGS_INITIALIZE_DETECT_CABLE) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CdbPtr->OpFlags != PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check if it is already initialized
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AdapterInfo->State == PXE_STATFLAGS_GET_STATE_INITIALIZED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_ALREADY_INITIALIZED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CpbPtr = (PXE_CPB_INITIALIZE *) (UINTN) CdbPtr->CPBaddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CpbPtr->MemoryLength < (UINT32) MEMORY_NEEDED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CPB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // default behaviour is to detect the cable, if the 3rd param is 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // do not do that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->CableDetect = (UINT8) ((CdbPtr->OpFlags == (UINT16) PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE) ? (UINT8) 0 : (UINT8) 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->LinkSpeedReq = (UINT16) CpbPtr->LinkSpeed;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->DuplexReq = CpbPtr->DuplexMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->LoopBack = CpbPtr->LoopBackMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->MemoryPtr = CpbPtr->MemoryAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->MemoryLength = CpbPtr->MemoryLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = (PXE_STATCODE) E100bInit (AdapterInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->StatCode != PXE_STATCODE_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->State = PXE_STATFLAGS_GET_STATE_INITIALIZED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine resets the network adapter and initializes the UNDI using the parameters supplied in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the CPB. The transmit and receive queues are emptied and any pending interrupts are cleared.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the NIC reset fails, the CdbPtr->StatFlags are updated with PXE_STATFLAGS_COMMAND_FAILED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_Reset (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->OpFlags != PXE_OPFLAGS_NOT_USED &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->OpFlags != PXE_OPFLAGS_RESET_DISABLE_INTERRUPTS &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->OpFlags != PXE_OPFLAGS_RESET_DISABLE_FILTERS ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = (UINT16) E100bReset (AdapterInfo, CdbPtr->OpFlags);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->StatCode != PXE_STATCODE_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine resets the network adapter and leaves it in a safe state for another driver to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync initialize. Any pending transmits or receives are lost. Receive filters and external
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync interrupt enables are disabled. Once the UNDI has been shutdown, it can then be stopped
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or initialized again.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the NIC reset fails, the CdbPtr->StatFlags are updated with PXE_STATFLAGS_COMMAND_FAILED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Otherwise, AdapterInfo->State is updated with PXE_STATFLAGS_GET_STATE_STARTED showing the state of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the NIC as being started.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_Shutdown (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // do the shutdown stuff here
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = (UINT16) E100bShutdown (AdapterInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->StatCode != PXE_STATCODE_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->State = PXE_STATFLAGS_GET_STATE_STARTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine can be used to read and/or change the current external interrupt enable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync settings. Disabling an external interrupt enable prevents and external (hardware)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync interrupt from being signaled by the network device. Internally the interrupt events
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync can still be polled by using the UNDI_GetState command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The resulting information on the interrupt state will be passed back in the CdbPtr->StatFlags.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_Interrupt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 IntMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IntMask = (UINT8)(UINTN)(CdbPtr->OpFlags & (PXE_OPFLAGS_INTERRUPT_RECEIVE |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_OPFLAGS_INTERRUPT_TRANSMIT |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_OPFLAGS_INTERRUPT_COMMAND |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_OPFLAGS_INTERRUPT_SOFTWARE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (CdbPtr->OpFlags & PXE_OPFLAGS_INTERRUPT_OPMASK) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PXE_OPFLAGS_INTERRUPT_READ:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PXE_OPFLAGS_INTERRUPT_ENABLE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IntMask == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->int_mask = IntMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync E100bSetInterruptState (AdapterInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PXE_OPFLAGS_INTERRUPT_DISABLE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IntMask != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->int_mask = (UINT16) (AdapterInfo->int_mask & ~(IntMask));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync E100bSetInterruptState (AdapterInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // else fall thru.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((AdapterInfo->int_mask & PXE_OPFLAGS_INTERRUPT_RECEIVE) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags |= PXE_STATFLAGS_INTERRUPT_RECEIVE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((AdapterInfo->int_mask & PXE_OPFLAGS_INTERRUPT_TRANSMIT) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags |= PXE_STATFLAGS_INTERRUPT_TRANSMIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((AdapterInfo->int_mask & PXE_OPFLAGS_INTERRUPT_COMMAND) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags |= PXE_STATFLAGS_INTERRUPT_COMMAND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to read and change receive filters and, if supported, read
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and change multicast MAC address filter list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_RecFilter (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 NewFilter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 OpFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_DB_RECEIVE_FILTERS *DbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *MacAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN MacCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 copy_len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *ptr1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *ptr2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN InvalidMacAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpFlags = CdbPtr->OpFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewFilter = (UINT16) (OpFlags & 0x1F);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (OpFlags & PXE_OPFLAGS_RECEIVE_FILTER_OPMASK) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PXE_OPFLAGS_RECEIVE_FILTER_READ:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // not expecting a cpb, not expecting any filter bits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((NewFilter != 0) || (CdbPtr->CPBsize != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto BadCdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((NewFilter & PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto JustRead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewFilter = (UINT16) (NewFilter | AdapterInfo->Rx_Filter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // all other flags are ignored except mcast_reset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PXE_OPFLAGS_RECEIVE_FILTER_ENABLE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // there should be atleast one other filter bit set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewFilter == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // nothing to enable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto BadCdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->CPBsize != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // this must be a multicast address list!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // don't accept the list unless selective_mcast is set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // don't accept confusing mcast settings with this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((NewFilter & PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST) == 0) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((NewFilter & PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST) != 0) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((NewFilter & PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST) != 0) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((CdbPtr->CPBsize % sizeof (PXE_MAC_ADDR)) != 0) ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto BadCdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacAddr = (UINT8 *) ((UINTN) (CdbPtr->CPBaddr));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacCount = CdbPtr->CPBsize / sizeof (PXE_MAC_ADDR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The format of Ethernet multicast address for IPv6 is defined in RFC2464,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // for IPv4 is defined in RFC1112. Check whether the address is valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InvalidMacAddr = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; MacCount-- != 0; MacAddr += sizeof (PXE_MAC_ADDR)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MacAddr[0] == 0x01) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This multicast MAC address is mapped from IPv4 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MacAddr[1] != 0x00 || MacAddr[2] != 0x5E || (MacAddr[3] & 0x80) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InvalidMacAddr = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (MacAddr[0] == 0x33) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This multicast MAC address is mapped from IPv6 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MacAddr[1] != 0x33) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InvalidMacAddr = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InvalidMacAddr = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InvalidMacAddr) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CPB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check selective mcast case enable case
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((OpFlags & PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((OpFlags & PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST) != 0) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((OpFlags & PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST) != 0) ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto BadCdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if no cpb, make sure we have an old list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->CPBsize == 0) && (AdapterInfo->mcast_list.list_len == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto BadCdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if you want to enable anything, you got to have unicast
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // and you have what you already enabled!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewFilter = (UINT16) (NewFilter | (PXE_OPFLAGS_RECEIVE_FILTER_UNICAST | AdapterInfo->Rx_Filter));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PXE_OPFLAGS_RECEIVE_FILTER_DISABLE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // mcast list not expected, i.e. no cpb here!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->CPBsize != PXE_CPBSIZE_NOT_USED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto BadCdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewFilter = (UINT16) ((~(CdbPtr->OpFlags & 0x1F)) & AdapterInfo->Rx_Filter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto BadCdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((OpFlags & PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->mcast_list.list_len = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewFilter &= (~PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync E100bSetfilter (AdapterInfo, NewFilter, CdbPtr->CPBaddr, CdbPtr->CPBsize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncJustRead:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // give the current mcast list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->DBsize != 0) && (AdapterInfo->mcast_list.list_len != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // copy the mc list to db
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr = (PXE_DB_RECEIVE_FILTERS *) (UINTN) CdbPtr->DBaddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ptr1 = (UINT8 *) (&DbPtr->MCastList[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // DbPtr->mc_count = AdapterInfo->mcast_list.list_len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync copy_len = (UINT16) (AdapterInfo->mcast_list.list_len * PXE_MAC_LENGTH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (copy_len > CdbPtr->DBsize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync copy_len = CdbPtr->DBsize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ptr2 = (UINT8 *) (&AdapterInfo->mcast_list.mc_list[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < copy_len; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ptr1[Index] = ptr2[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // give the stat flags here
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AdapterInfo->Receive_Started) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = (PXE_STATFLAGS) (CdbPtr->StatFlags | AdapterInfo->Rx_Filter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBadCdb:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to get the current station and broadcast MAC addresses, and to change the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync current station MAC address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_StnAddr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_CPB_STATION_ADDRESS *CpbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_DB_STATION_ADDRESS *DbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->OpFlags == PXE_OPFLAGS_STATION_ADDRESS_RESET) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // configure the permanent address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // change the AdapterInfo->CurrentNodeAddress field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AdapterInfo->CurrentNodeAddress[0],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AdapterInfo->PermNodeAddress[0],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_MAC_LENGTH
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PXE_MAC_LENGTH; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->CurrentNodeAddress[Index] = AdapterInfo->PermNodeAddress[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync E100bSetupIAAddr (AdapterInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->CPBaddr != (UINT64) 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CpbPtr = (PXE_CPB_STATION_ADDRESS *) (UINTN) (CdbPtr->CPBaddr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // configure the new address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PXE_MAC_LENGTH; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->CurrentNodeAddress[Index] = CpbPtr->StationAddr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync E100bSetupIAAddr (AdapterInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->DBaddr != (UINT64) 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr = (PXE_DB_STATION_ADDRESS *) (UINTN) (CdbPtr->DBaddr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // fill it with the new values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PXE_MAC_LENGTH; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->StationAddr[Index] = AdapterInfo->CurrentNodeAddress[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->BroadcastAddr[Index] = AdapterInfo->BroadcastNodeAddress[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->PermanentAddr[Index] = AdapterInfo->PermNodeAddress[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to read and clear the NIC traffic statistics. This command is supported only
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if the !PXE structure's Implementation flags say so.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Results will be parsed out in the following manner:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBaddr.Data[0] R Total Frames (Including frames with errors and dropped frames)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBaddr.Data[1] R Good Frames (All frames copied into receive buffer)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBaddr.Data[2] R Undersize Frames (Frames below minimum length for media <64 for ethernet)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBaddr.Data[4] R Dropped Frames (Frames that were dropped because receive buffers were full)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBaddr.Data[8] R CRC Error Frames (Frames with alignment or CRC errors)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBaddr.Data[A] T Total Frames (Including frames with errors and dropped frames)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBaddr.Data[B] T Good Frames (All frames copied into transmit buffer)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBaddr.Data[C] T Undersize Frames (Frames below minimum length for media <64 for ethernet)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBaddr.Data[E] T Dropped Frames (Frames that were dropped because of collisions)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBaddr.Data[14] T Total Collision Frames (Total collisions on this subnet)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_Statistics (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->OpFlags &~(PXE_OPFLAGS_STATISTICS_RESET)) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->OpFlags & PXE_OPFLAGS_STATISTICS_RESET) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reset the statistics
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = (UINT16) E100bStatistics (AdapterInfo, 0, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = (UINT16) E100bStatistics (AdapterInfo, CdbPtr->DBaddr, CdbPtr->DBsize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to translate a multicast IP address to a multicast MAC address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This results in a MAC address composed of 25 bits of fixed data with the upper 23 bits of the IP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync address being appended to it. Results passed back in the equivalent of CdbPtr->DBaddr->MAC[0-5].
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_ip2mac (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_CPB_MCAST_IP_TO_MAC *CpbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_DB_MCAST_IP_TO_MAC *DbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TmpPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CpbPtr = (PXE_CPB_MCAST_IP_TO_MAC *) (UINTN) CdbPtr->CPBaddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr = (PXE_DB_MCAST_IP_TO_MAC *) (UINTN) CdbPtr->DBaddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->OpFlags & PXE_OPFLAGS_MCAST_IPV6_TO_MAC) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // for now this is not supported
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpPtr = (UINT8 *) (&CpbPtr->IP.IPv4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check if the ip given is a mcast IP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((TmpPtr[0] & 0xF0) != 0xE0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CPB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // take the last 23 bits in IP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // be very careful. accessing word on a non-word boundary will hang motherboard codenamed Big Sur
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // casting the mac array (in the middle) to a UINT32 pointer and accessing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the UINT32 content hung the system...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->MAC[0] = 0x01;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->MAC[1] = 0x00;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->MAC[2] = 0x5e;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->MAC[3] = (UINT8) (TmpPtr[1] & 0x7f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->MAC[4] = (UINT8) TmpPtr[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->MAC[5] = (UINT8) TmpPtr[3];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to read and write non-volatile storage on the NIC (if supported). The NVRAM
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync could be EEPROM, FLASH, or battery backed RAM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is an optional function according to the UNDI specification (or will be......)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_NVData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_DB_NVDATA *DbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->OpFlags == PXE_OPFLAGS_NVDATA_READ) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->DBsize == PXE_DBSIZE_NOT_USED) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr = (PXE_DB_NVDATA *) (UINTN) CdbPtr->DBaddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < MAX_PCI_CONFIG_LEN; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->Data.Dword[Index] = AdapterInfo->NVData[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // no write for now
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine returns the current interrupt status and/or the transmitted buffer addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the current interrupt status is returned, pending interrupts will be acknowledged by this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync command. Transmitted buffer addresses that are written to the DB are removed from the transmit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer queue.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Normally, this command would be polled with interrupts disabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The transmit buffers are returned in CdbPtr->DBaddr->TxBufer[0 - NumEntries].
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The interrupt status is returned in CdbPtr->StatFlags.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_Status (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_DB_GET_STATUS *DbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_DB_GET_STATUS TmpGetStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 NumEntries;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RxFD *RxPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill in temporary GetStatus storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RxPtr = &AdapterInfo->rx_ring[AdapterInfo->cur_rx_ind];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((RxPtr->cb_header.status & RX_COMPLETE) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpGetStatus.RxFrameLen = RxPtr->ActualCount & 0x3fff;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpGetStatus.RxFrameLen = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpGetStatus.reserved = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill in size of next available receive packet and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // reserved field in caller's DB storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr = (PXE_DB_GET_STATUS *) (UINTN) CdbPtr->DBaddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->DBsize > 0 && CdbPtr->DBsize < sizeof (UINT32) * 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (DbPtr, &TmpGetStatus, CdbPtr->DBsize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (DbPtr, &TmpGetStatus, sizeof (UINT32) * 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->OpFlags & PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // DBsize of zero is invalid if Tx buffers are requested.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->DBsize == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // remember this b4 we overwrite
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NumEntries = (UINT16) (CdbPtr->DBsize - sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We already filled in 2 UINT32s.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBsize = (UINT16) (sizeof (UINT32) * 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // will claim any hanging free CBs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckCBList (AdapterInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AdapterInfo->xmit_done_head == AdapterInfo->xmit_done_tail) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags |= PXE_STATFLAGS_GET_STATUS_TXBUF_QUEUE_EMPTY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; ((Index < MAX_XMIT_BUFFERS) && (NumEntries >= sizeof (UINT64))); Index++, NumEntries -= sizeof (UINT64)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AdapterInfo->xmit_done_head != AdapterInfo->xmit_done_tail) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DbPtr->TxBuffer[Index] = AdapterInfo->xmit_done[AdapterInfo->xmit_done_head];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->xmit_done_head = next (AdapterInfo->xmit_done_head);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->DBsize += sizeof (UINT64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AdapterInfo->xmit_done_head != AdapterInfo->xmit_done_tail) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags |= PXE_STATFLAGS_DB_WRITE_TRUNCATED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for a receive buffer and give it's size in db
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->OpFlags & PXE_OPFLAGS_GET_INTERRUPT_STATUS) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InWord (AdapterInfo, AdapterInfo->ioaddr + SCBStatus);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->Int_Status = (UINT16) (AdapterInfo->Int_Status | Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // acknoledge the interrupts
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OutWord (AdapterInfo, (UINT16) (Status & 0xfc00), (UINT32) (AdapterInfo->ioaddr + SCBStatus));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // report all the outstanding interrupts
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = AdapterInfo->Int_Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Status & SCB_STATUS_FR) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags |= PXE_STATFLAGS_GET_STATUS_RECEIVE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Status & SCB_STATUS_SWI) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags |= PXE_STATFLAGS_GET_STATUS_SOFTWARE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return current media status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->OpFlags & PXE_OPFLAGS_GET_MEDIA_STATUS) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->PhyAddress = 0xFF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->CableDetect = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!PhyDetect (AdapterInfo)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags |= PXE_STATFLAGS_GET_STATUS_NO_MEDIA;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to fill media header(s) in transmit packet(s).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copies the MAC address into the media header whether it is dealing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync with fragmented or non-fragmented packets.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_FillHeader (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_CPB_FILL_HEADER *Cpb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_CPB_FILL_HEADER_FRAGMENTED *Cpbf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EtherHeader *MacHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->CPBsize == PXE_CPBSIZE_NOT_USED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->OpFlags & PXE_OPFLAGS_FILL_HEADER_FRAGMENTED) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cpbf = (PXE_CPB_FILL_HEADER_FRAGMENTED *) (UINTN) CdbPtr->CPBaddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assume 1st fragment is big enough for the mac header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Cpbf->FragCnt == 0) || (Cpbf->FragDesc[0].FragLen < PXE_MAC_HEADER_LEN_ETHER)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // no buffers given
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacHeader = (EtherHeader *) (UINTN) Cpbf->FragDesc[0].FragAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we don't swap the protocol bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacHeader->type = Cpbf->Protocol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PXE_HWADDR_LEN_ETHER; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacHeader->dest_addr[Index] = Cpbf->DestAddr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacHeader->src_addr[Index] = Cpbf->SrcAddr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cpb = (PXE_CPB_FILL_HEADER *) (UINTN) CdbPtr->CPBaddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacHeader = (EtherHeader *) (UINTN) Cpb->MediaHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we don't swap the protocol bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacHeader->type = Cpb->Protocol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PXE_HWADDR_LEN_ETHER; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacHeader->dest_addr[Index] = Cpb->DestAddr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacHeader->src_addr[Index] = Cpb->SrcAddr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine is used to place a packet into the transmit queue. The data buffers given to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this command are to be considered locked and the application or network driver loses
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ownership of these buffers and must not free or relocate them until the ownership returns.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When the packets are transmitted, a transmit complete interrupt is generated (if interrupts
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are disabled, the transmit interrupt status is still set and can be checked using the UNDI_Status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Some implementations and adapters support transmitting multiple packets with one transmit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync command. If this feature is supported, the transmit CPBs can be linked in one transmit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync All UNDIs support fragmented frames, now all network devices or protocols do. If a fragmented
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync frame CPB is given to UNDI and the network device does not support fragmented frames
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (see !PXE.Implementation flag), the UNDI will have to copy the fragments into a local buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync before transmitting.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_Transmit (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->CPBsize == PXE_CPBSIZE_NOT_USED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = (PXE_STATCODE) E100bTransmit (AdapterInfo, CdbPtr->CPBaddr, CdbPtr->OpFlags);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->StatCode != PXE_STATCODE_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When the network adapter has received a frame, this command is used to copy the frame
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync into the driver/application storage location. Once a frame has been copied, it is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync removed from the receive queue.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_Receive (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_CDB *CdbPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *AdapterInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check if RU has started...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!AdapterInfo->Receive_Started) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_NOT_INITIALIZED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = (UINT16) E100bReceive (AdapterInfo, CdbPtr->CPBaddr, CdbPtr->DBaddr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->StatCode != PXE_STATCODE_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is the main SW UNDI API entry using the newer nii protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The parameter passed in is a 64 bit flat model virtual
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync address of the cdb. We then jump into the common routine for both old and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync new nii protocol entries.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// TODO: cdb - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_APIEntry_new (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 cdb
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_CDB *CdbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NIC_DATA_INSTANCE *AdapterInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (cdb == (UINT64) 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr = (PXE_CDB *) (UINTN) cdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->IFnum >= pxe_31->IFcnt) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo = &(UNDI32DeviceList[CdbPtr->IFnum]->NicInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // entering from older entry point
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo->VersionFlag = 0x31;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UNDI_APIEntry_Common (cdb);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is the common routine for both old and new entry point procedures.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The parameter passed in is a 64 bit flat model virtual
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync address of the cdb. We then jump into the service routine pointed to by the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Api_Table[OpCode].
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CdbPtr Pointer to the command descriptor block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AdapterInfo Pointer to the NIC data structure information which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the UNDI driver is layering on..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// TODO: cdb - add argument and description to function comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNDI_APIEntry_Common (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 cdb
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_CDB *CdbPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NIC_DATA_INSTANCE *AdapterInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UNDI_CALL_TABLE *tab_ptr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr = (PXE_CDB *) (UINTN) cdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check the OPCODE range
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CdbPtr->OpCode > PXE_OPCODE_LAST_VALID) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CdbPtr->StatCode != PXE_STATCODE_INITIALIZE) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CdbPtr->StatFlags != PXE_STATFLAGS_INITIALIZE) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CdbPtr->IFnum >= pxe_31->IFcnt) ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto badcdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->CPBsize == PXE_CPBSIZE_NOT_USED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->CPBaddr != PXE_CPBADDR_NOT_USED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto badcdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (CdbPtr->CPBaddr == PXE_CPBADDR_NOT_USED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto badcdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->DBsize == PXE_DBSIZE_NOT_USED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CdbPtr->DBaddr != PXE_DBADDR_NOT_USED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto badcdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (CdbPtr->DBaddr == PXE_DBADDR_NOT_USED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto badcdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check if cpbsize and dbsize are as needed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check if opflags are as expected
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tab_ptr = &api_table[CdbPtr->OpCode];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (tab_ptr->cpbsize != (UINT16) (DONT_CHECK) && tab_ptr->cpbsize != CdbPtr->CPBsize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto badcdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (tab_ptr->dbsize != (UINT16) (DONT_CHECK) && tab_ptr->dbsize != CdbPtr->DBsize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto badcdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (tab_ptr->opflags != (UINT16) (DONT_CHECK) && tab_ptr->opflags != CdbPtr->OpFlags) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto badcdb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdapterInfo = &(UNDI32DeviceList[CdbPtr->IFnum]->NicInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check if UNDI_State is valid for this call
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (tab_ptr->state != (UINT16) (-1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // should atleast be started
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AdapterInfo->State == PXE_STATFLAGS_GET_STATE_STOPPED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_NOT_STARTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check if it should be initialized
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (tab_ptr->state == 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AdapterInfo->State != PXE_STATFLAGS_GET_STATE_INITIALIZED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_NOT_INITIALIZED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // set the return variable for success case here
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_COMPLETE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tab_ptr->api_ptr (CdbPtr, AdapterInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // %% AVL - check for command linking
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbadcdb:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When called with a null NicPtr, this routine decrements the number of NICs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this UNDI is supporting and removes the NIC_DATA_POINTER from the array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Otherwise, it increments the number of NICs this UNDI is supported and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync updates the pxe.Fudge to ensure a proper check sum results.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NicPtr Pointer to the NIC data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPxeUpdate (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NIC_DATA_INSTANCE *NicPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_SW_UNDI *PxePtr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NicPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PxePtr->IFcnt > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // number of NICs this undi supports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->IFcnt--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->Fudge = (UINT8) (PxePtr->Fudge - CalculateSum8 ((VOID *) PxePtr, PxePtr->Len));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // number of NICs this undi supports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->IFcnt++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->Fudge = (UINT8) (PxePtr->Fudge - CalculateSum8 ((VOID *) PxePtr, PxePtr->Len));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initialize the !PXE structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PxePtr Pointer to SW_UNDI data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS This driver is added to Controller.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval other This driver does not support this device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPxeStructInit (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN PXE_SW_UNDI *PxePtr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize the !PXE structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->Signature = PXE_ROMID_SIGNATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->Len = (UINT8) sizeof (PXE_SW_UNDI);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // cksum
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->Fudge = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // number of NICs this undi supports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->IFcnt = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->Rev = PXE_ROMID_REV;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->MajorVer = PXE_ROMID_MAJORVER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->MinorVer = PXE_ROMID_MINORVER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->reserved1 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->Implementation = PXE_ROMID_IMP_SW_VIRT_ADDR |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_ROMID_IMP_FRAG_SUPPORTED |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_ROMID_IMP_CMD_LINK_SUPPORTED |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_ROMID_IMP_NVDATA_READ_ONLY |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_ROMID_IMP_STATION_ADDR_SETTABLE |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_ROMID_IMP_BROADCAST_RX_SUPPORTED |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_ROMID_IMP_FILTERED_MULTICAST_RX_SUPPORTED |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_ROMID_IMP_SOFTWARE_INT_SUPPORTED |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_ROMID_IMP_PACKET_RX_INT_SUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->EntryPoint = (UINT64) (UINTN) UNDI_APIEntry_new;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->MinorVer = PXE_ROMID_MINORVER_31;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->reserved2[0] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->reserved2[1] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->reserved2[2] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->BusCnt = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->BusType[0] = PXE_BUSTYPE_PCI;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PxePtr->Fudge = (UINT8) (PxePtr->Fudge - CalculateSum8 ((VOID *) PxePtr, PxePtr->Len));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync