+++ /dev/null
-/*++\r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module name:\r
- initialize.c\r
-\r
-Abstract:\r
-\r
-Revision history:\r
- 2000-Feb-09 M(f)J Genesis.\r
---*/\r
-\r
-\r
-#include "Snp.h"\r
-\r
-EFI_STATUS\r
-pxe_init (\r
- SNP_DRIVER *snp,\r
- UINT16 CableDetectFlag\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- this routine calls undi to initialize the interface.\r
-\r
-Arguments:\r
- snp - pointer to snp driver structure\r
- CableDetectFlag - Do/don't detect the cable (depending on what undi supports)\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- PXE_CPB_INITIALIZE *cpb;\r
- VOID *addr;\r
- EFI_STATUS Status;\r
-\r
- cpb = snp->cpb;\r
- if (snp->tx_rx_bufsize != 0) {\r
- Status = snp->IoFncs->AllocateBuffer (\r
- snp->IoFncs,\r
- AllocateAnyPages,\r
- EfiBootServicesData,\r
- SNP_MEM_PAGES (snp->tx_rx_bufsize),\r
- &addr,\r
- 0\r
- );\r
-\r
- if (Status != EFI_SUCCESS) {\r
- DEBUG (\r
- (EFI_D_ERROR,\r
- "\nsnp->pxe_init() AllocateBuffer %xh (%r)\n",\r
- Status,\r
- Status)\r
- );\r
-\r
- return Status;\r
- }\r
-\r
- ASSERT (addr);\r
-\r
- snp->tx_rx_buffer = addr;\r
- }\r
-\r
- cpb->MemoryAddr = (UINT64) (UINTN) snp->tx_rx_buffer;\r
-\r
- cpb->MemoryLength = snp->tx_rx_bufsize;\r
-\r
- //\r
- // let UNDI decide/detect these values\r
- //\r
- cpb->LinkSpeed = 0;\r
- cpb->TxBufCnt = 0;\r
- cpb->TxBufSize = 0;\r
- cpb->RxBufCnt = 0;\r
- cpb->RxBufSize = 0;\r
-\r
- cpb->DuplexMode = PXE_DUPLEX_DEFAULT;\r
-\r
- cpb->LoopBackMode = LOOPBACK_NORMAL;\r
-\r
- snp->cdb.OpCode = PXE_OPCODE_INITIALIZE;\r
- snp->cdb.OpFlags = CableDetectFlag;\r
-\r
- snp->cdb.CPBsize = sizeof (PXE_CPB_INITIALIZE);\r
- snp->cdb.DBsize = sizeof (PXE_DB_INITIALIZE);\r
-\r
- snp->cdb.CPBaddr = (UINT64) (UINTN) snp->cpb;\r
- snp->cdb.DBaddr = (UINT64) (UINTN) snp->db;\r
-\r
- snp->cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
- snp->cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
- snp->cdb.IFnum = snp->if_num;\r
- snp->cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
-\r
- DEBUG ((EFI_D_NET, "\nsnp->undi.initialize() "));\r
-\r
- (*snp->issue_undi32_command) ((UINT64) (UINTN) &snp->cdb);\r
-\r
- if (snp->cdb.StatCode == PXE_STATCODE_SUCCESS) {\r
- snp->mode.State = EfiSimpleNetworkInitialized;\r
-\r
- Status = EFI_SUCCESS;\r
- } else {\r
- DEBUG (\r
- (EFI_D_WARN,\r
- "\nsnp->undi.initialize() %xh:%xh\n",\r
- snp->cdb.StatFlags,\r
- snp->cdb.StatCode)\r
- );\r
-\r
- if (snp->tx_rx_buffer != NULL) {\r
- snp->IoFncs->FreeBuffer (\r
- snp->IoFncs,\r
- SNP_MEM_PAGES (snp->tx_rx_bufsize),\r
- (VOID *) snp->tx_rx_buffer\r
- );\r
- }\r
-\r
- snp->tx_rx_buffer = NULL;\r
-\r
- Status = EFI_DEVICE_ERROR;\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-snp_undi32_initialize (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *this,\r
- IN UINTN extra_rx_buffer_size OPTIONAL,\r
- IN UINTN extra_tx_buffer_size OPTIONAL\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- This is the SNP interface routine for initializing the interface\r
- This routine basically retrieves snp structure, checks the SNP state and\r
- calls the pxe_initialize routine to actually do the undi initialization\r
-\r
-Arguments:\r
- this - context pointer\r
- extra_rx_buffer_size - optional parameter, indicates extra space for rx_buffers\r
- extra_tx_buffer_size - optional parameter, indicates extra space for tx_buffers\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
- EFI_STATUS EfiStatus;\r
- SNP_DRIVER *snp;\r
-\r
- //\r
- //\r
- //\r
- if (this == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (this);\r
-\r
- if (snp == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- //\r
- //\r
- //\r
- switch (snp->mode.State) {\r
- case EfiSimpleNetworkStarted:\r
- break;\r
-\r
- case EfiSimpleNetworkStopped:\r
- return EFI_NOT_STARTED;\r
-\r
- case EfiSimpleNetworkInitialized:\r
- return EFI_DEVICE_ERROR;\r
-\r
- default:\r
- return EFI_DEVICE_ERROR;\r
- }\r
- //\r
- //\r
- //\r
- EfiStatus = gBS->CreateEvent (\r
- EVT_NOTIFY_WAIT,\r
- TPL_NOTIFY,\r
- &SnpWaitForPacketNotify,\r
- snp,\r
- &snp->snp.WaitForPacket\r
- );\r
-\r
- if (EFI_ERROR (EfiStatus)) {\r
- snp->snp.WaitForPacket = NULL;\r
- return EFI_DEVICE_ERROR;\r
- }\r
- //\r
- //\r
- //\r
- snp->mode.MCastFilterCount = 0;\r
- snp->mode.ReceiveFilterSetting = 0;\r
- ZeroMem (snp->mode.MCastFilter, sizeof snp->mode.MCastFilter);\r
- CopyMem (\r
- &snp->mode.CurrentAddress,\r
- &snp->mode.PermanentAddress,\r
- sizeof (EFI_MAC_ADDRESS)\r
- );\r
-\r
- //\r
- // Compute tx/rx buffer sizes based on UNDI init info and parameters.\r
- //\r
- snp->tx_rx_bufsize = (UINT32) (snp->init_info.MemoryRequired + extra_rx_buffer_size + extra_tx_buffer_size);\r
-\r
- if (snp->mode.MediaPresentSupported) {\r
- if (pxe_init (snp, PXE_OPFLAGS_INITIALIZE_DETECT_CABLE) == EFI_SUCCESS) {\r
- snp->mode.MediaPresent = TRUE;\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- snp->mode.MediaPresent = FALSE;\r
-\r
- EfiStatus = pxe_init (snp, PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE);\r
-\r
- if (EFI_ERROR (EfiStatus)) {\r
- gBS->CloseEvent (snp->snp.WaitForPacket);\r
- }\r
-\r
- return EfiStatus;\r
-}\r