summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Universal/Network/SnpDxe/Snp.c
diff options
context:
space:
mode:
authorniry <niry@6f19259b-4bc3-4df7-8a09-765794883524>2008-11-13 03:42:21 +0000
committerniry <niry@6f19259b-4bc3-4df7-8a09-765794883524>2008-11-13 03:42:21 +0000
commit4cda7726e5fd30aaf3e05c80207ae1b264bfa123 (patch)
tree55bfc014e0f2e8a23cb450c9dbbe0d3f7df65527 /MdeModulePkg/Universal/Network/SnpDxe/Snp.c
parentdfc005c30fc2efded3215dd3341b8c1ad5f8a1ad (diff)
downloadedk2-4cda7726e5fd30aaf3e05c80207ae1b264bfa123.zip
edk2-4cda7726e5fd30aaf3e05c80207ae1b264bfa123.tar.gz
edk2-4cda7726e5fd30aaf3e05c80207ae1b264bfa123.tar.bz2
sync comments, fix function header, rename variable name to follow coding style.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6481 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg/Universal/Network/SnpDxe/Snp.c')
-rw-r--r--MdeModulePkg/Universal/Network/SnpDxe/Snp.c821
1 files changed, 393 insertions, 428 deletions
diff --git a/MdeModulePkg/Universal/Network/SnpDxe/Snp.c b/MdeModulePkg/Universal/Network/SnpDxe/Snp.c
index 267dde6..80a05f1 100644
--- a/MdeModulePkg/Universal/Network/SnpDxe/Snp.c
+++ b/MdeModulePkg/Universal/Network/SnpDxe/Snp.c
@@ -1,264 +1,42 @@
/** @file
-Copyright (c) 2004 - 2005, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
+ Implementation of driver entry point and driver binding protocol.
+
+Copyright (c) 2004 - 2008, Intel Corporation. <BR>
+All rights reserved. This program and the accompanying materials are licensed
+and made available under the terms and conditions of the BSD License which
+accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-Module name:
- snp.c
-
-Abstract:
-
-
**/
#include "Snp.h"
-EFI_STATUS
-pxe_start (
- SNP_DRIVER *snp
- );
-EFI_STATUS
-pxe_stop (
- SNP_DRIVER *snp
- );
-EFI_STATUS
-pxe_init (
- SNP_DRIVER *snp,
- UINT16 OpFlags
- );
-EFI_STATUS
-pxe_shutdown (
- SNP_DRIVER *snp
- );
-EFI_STATUS
-pxe_get_stn_addr (
- SNP_DRIVER *snp
- );
-
-EFI_STATUS
-EFIAPI
-InitializeSnpNiiDriver (
- IN EFI_HANDLE image_handle,
- IN EFI_SYSTEM_TABLE *system_table
- );
-
-EFI_STATUS
-EFIAPI
-SimpleNetworkDriverSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-EFI_STATUS
-EFIAPI
-SimpleNetworkDriverStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-EFI_STATUS
-EFIAPI
-SimpleNetworkDriverStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- );
-
-//
-// Simple Network Protocol Driver Global Variables
-//
-EFI_DRIVER_BINDING_PROTOCOL mSimpleNetworkDriverBinding = {
- SimpleNetworkDriverSupported,
- SimpleNetworkDriverStart,
- SimpleNetworkDriverStop,
- 0xa,
- NULL,
- NULL
-};
-
//
// Module global variables needed to support undi 3.0 interface
//
-EFI_PCI_IO_PROTOCOL *mPciIoFncs;
-struct s_v2p *_v2p = NULL; // undi3.0 map_list head
+EFI_PCI_IO_PROTOCOL *mPciIo;
+V2P *mV2p = NULL; // undi3.0 map_list head
// End Global variables
//
-/**
- This routine maps the given CPU address to a Device address. It creates a
- an entry in the map list with the virtual and physical addresses and the
- un map cookie.
-
- @param v2p pointer to return a map list node pointer.
- @param type the direction in which the data flows from the given
- virtual address device->cpu or cpu->device or both
- ways.
- @param vaddr virtual address (or CPU address) to be mapped
- @param bsize size of the buffer to be mapped.
-
- @retval EFI_SUCEESS routine has completed the mapping
- @retval other error as indicated.
-
-**/
-EFI_STATUS
-add_v2p (
- IN OUT struct s_v2p **v2p,
- EFI_PCI_IO_PROTOCOL_OPERATION type,
- VOID *vaddr,
- UINTN bsize
- )
-{
- EFI_STATUS Status;
-
- if ((v2p == NULL) || (vaddr == NULL) || (bsize == 0)) {
- return EFI_INVALID_PARAMETER;
- }
-
- *v2p = AllocatePool (sizeof (struct s_v2p));
- if (*v2p != NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = mPciIoFncs->Map (
- mPciIoFncs,
- type,
- vaddr,
- &bsize,
- &(*v2p)->paddr,
- &(*v2p)->unmap
- );
- if (Status != EFI_SUCCESS) {
- FreePool (*v2p);
- return Status;
- }
- (*v2p)->vaddr = vaddr;
- (*v2p)->bsize = bsize;
- (*v2p)->next = _v2p;
- _v2p = *v2p;
-
- return EFI_SUCCESS;
-}
-
/**
- This routine searches the linked list of mapped address nodes (for undi3.0
- interface) to find the node that corresponds to the given virtual address and
- returns a pointer to that node.
-
- @param v2p pointer to return a map list node pointer.
- @param vaddr virtual address (or CPU address) to be searched in
- the map list
-
- @retval EFI_SUCEESS if a match found!
- @retval Other match not found
+ Unsupport currently.
+
+ @param Cdb command to be sent to UNDI.
**/
EFI_STATUS
-find_v2p (
- struct s_v2p **v2p,
- VOID *vaddr
+IssueHwUndiCommand (
+ UINT64 Cdb
)
{
- struct s_v2p *v;
+ DEBUG ((EFI_D_ERROR, "\nIssueHwUndiCommand() - This should not be called!"));
- if (v2p == NULL || vaddr == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- for (v = _v2p; v != NULL; v = v->next) {
- if (v->vaddr == vaddr) {
- *v2p = v;
- return EFI_SUCCESS;
- }
- }
-
- return EFI_NOT_FOUND;
-}
-
-
-/**
- This routine unmaps the given virtual address and frees the memory allocated
- for the map list node corresponding to that address.
-
- @param vaddr virtual address (or CPU address) to be unmapped
-
- @retval EFI_SUCEESS if successfully unmapped
- @retval Other as indicated by the error
-
-**/
-EFI_STATUS
-del_v2p (
- VOID *vaddr
- )
-{
- struct s_v2p *v;
- struct s_v2p *t;
- EFI_STATUS Status;
-
- if (vaddr == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (_v2p == NULL) {
- return EFI_NOT_FOUND;
- }
- //
- // Is our node at the head of the list??
- //
- if ((v = _v2p)->vaddr == vaddr) {
- _v2p = _v2p->next;
-
- Status = mPciIoFncs->Unmap (mPciIoFncs, v->unmap);
-
- FreePool (v);
-
- if (Status) {
- DEBUG ((EFI_D_ERROR, "Unmap failed with status = %r\n", Status));
- }
- return Status;
- }
-
- for (; v->next != NULL; v = t) {
- if ((t = v->next)->vaddr == vaddr) {
- v->next = t->next;
- Status = mPciIoFncs->Unmap (mPciIoFncs, t->unmap);
- FreePool (t);
-
- if (Status) {
- DEBUG ((EFI_D_ERROR, "Unmap failed with status = %r\n", Status));
- }
- return Status;
- }
- }
-
- return EFI_NOT_FOUND;
-}
-
-EFI_STATUS
-issue_hwundi_command (
- UINT64 cdb
- )
-/*++
-
-Routine Description:
-
-Arguments:
-
-Returns:
-
---*/
-{
- DEBUG ((EFI_D_ERROR, "\nissue_hwundi_command() - This should not be called!"));
-
- if (cdb == 0) {
+ if (Cdb == 0) {
return EFI_INVALID_PARAMETER;
}
@@ -272,48 +50,52 @@ Returns:
/**
Compute 8-bit checksum of a buffer.
- @param ptr Pointer to buffer.
- @param len Length of buffer in bytes.
+ @param Buffer Pointer to buffer.
+ @param Length Length of buffer in bytes.
@return 8-bit checksum of all bytes in buffer.
@return If ptr is NULL or len is zero, zero is returned.
**/
UINT8
-calc_8bit_cksum (
- VOID *ptr,
- UINTN len
+Calc8BitCksum (
+ VOID *Buffer,
+ UINTN Length
)
{
- UINT8 *bptr;
- UINT8 cksum;
+ UINT8 *Ptr;
+ UINT8 Cksum;
- bptr = ptr;
- cksum = 0;
+ Ptr = Buffer;
+ Cksum = 0;
- if (ptr == NULL || len == 0) {
+ if (Ptr == NULL || Length == 0) {
return 0;
}
- while (len--) {
- cksum = (UINT8) (cksum +*bptr++);
+ while (Length-- != 0) {
+ Cksum = (UINT8) (Cksum + *Ptr++);
}
- return cksum;
+ return Cksum;
}
-
/**
- Test to see if this driver supports Controller. Any Controller
- that contains a Nii protocol can be supported.
-
- @param This Protocol instance pointer.
- @param Controller Handle of device to test.
- @param RemainingDevicePath Not used.
-
- @retval EFI_SUCCESS This driver supports this device.
- @retval EFI_ALREADY_STARTED This driver is already running on this device.
- @retval other This driver does not support this device.
+ Test to see if this driver supports ControllerHandle. This service
+ is called by the EFI boot service ConnectController(). In
+ order to make drivers as small as possible, there are a few calling
+ restrictions for this service. ConnectController() must
+ follow these calling restrictions. If any other agent wishes to call
+ Supported() it must also follow these calling restrictions.
+
+ @param This Protocol instance pointer.
+ @param ControllerHandle Handle of device to test
+ @param RemainingDevicePath Optional parameter use to pick a specific child
+ device to start.
+
+ @retval EFI_SUCCESS This driver supports this device
+ @retval EFI_ALREADY_STARTED This driver is already running on this device
+ @retval other This driver does not support this device
**/
EFI_STATUS
@@ -326,7 +108,7 @@ SimpleNetworkDriverSupported (
{
EFI_STATUS Status;
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *NiiProtocol;
- PXE_UNDI *pxe;
+ PXE_UNDI *Pxe;
Status = gBS->OpenProtocol (
Controller,
@@ -374,30 +156,30 @@ SimpleNetworkDriverSupported (
goto Done;
}
- pxe = (PXE_UNDI *) (UINTN) (NiiProtocol->ID);
+ Pxe = (PXE_UNDI *) (UINTN) (NiiProtocol->ID);
//
// Verify !PXE revisions.
//
- if (pxe->hw.Signature != PXE_ROMID_SIGNATURE) {
+ if (Pxe->hw.Signature != PXE_ROMID_SIGNATURE) {
DEBUG ((EFI_D_NET, "\n!PXE signature is not valid.\n"));
Status = EFI_UNSUPPORTED;
goto Done;
}
- if (pxe->hw.Rev < PXE_ROMID_REV) {
+ if (Pxe->hw.Rev < PXE_ROMID_REV) {
DEBUG ((EFI_D_NET, "\n!PXE.Rev is not supported.\n"));
Status = EFI_UNSUPPORTED;
goto Done;
}
- if (pxe->hw.MajorVer < PXE_ROMID_MAJORVER) {
+ if (Pxe->hw.MajorVer < PXE_ROMID_MAJORVER) {
DEBUG ((EFI_D_NET, "\n!PXE.MajorVer is not supported.\n"));
Status = EFI_UNSUPPORTED;
goto Done;
- } else if (pxe->hw.MajorVer == PXE_ROMID_MAJORVER && pxe->hw.MinorVer < PXE_ROMID_MINORVER) {
+ } else if (Pxe->hw.MajorVer == PXE_ROMID_MAJORVER && Pxe->hw.MinorVer < PXE_ROMID_MINORVER) {
DEBUG ((EFI_D_NET, "\n!PXE.MinorVer is not supported."));
Status = EFI_UNSUPPORTED;
goto Done;
@@ -405,14 +187,14 @@ SimpleNetworkDriverSupported (
//
// Do S/W UNDI specific checks.
//
- if ((pxe->hw.Implementation & PXE_ROMID_IMP_HW_UNDI) == 0) {
- if (pxe->sw.EntryPoint < pxe->sw.Len) {
+ if ((Pxe->hw.Implementation & PXE_ROMID_IMP_HW_UNDI) == 0) {
+ if (Pxe->sw.EntryPoint < Pxe->sw.Len) {
DEBUG ((EFI_D_NET, "\n!PXE S/W entry point is not valid."));
Status = EFI_UNSUPPORTED;
goto Done;
}
- if (pxe->sw.BusCnt == 0) {
+ if (Pxe->sw.BusCnt == 0) {
DEBUG ((EFI_D_NET, "\n!PXE.BusCnt is zero."));
Status = EFI_UNSUPPORTED;
goto Done;
@@ -433,16 +215,22 @@ Done:
return Status;
}
-
/**
- called for any handle that we said "supported" in the above call!
+ Start this driver on ControllerHandle. This service is called by the
+ EFI boot service ConnectController(). In order to make
+ drivers as small as possible, there are a few calling restrictions for
+ this service. ConnectController() must follow these
+ calling restrictions. If any other agent wishes to call Start() it
+ must also follow these calling restrictions.
@param This Protocol instance pointer.
- @param Controller Handle of device to start
- @param RemainingDevicePath Not used.
+ @param ControllerHandle Handle of device to bind driver to.
+ @param RemainingDevicePath Optional parameter use to pick a specific child
+ device to start.
- @retval EFI_SUCCESS This driver supports this device.
- @retval other This driver failed to start this device.
+ @retval EFI_SUCCESS This driver is added to ControllerHandle
+ @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
+ @retval other This driver does not support this device
**/
EFI_STATUS
@@ -456,9 +244,9 @@ SimpleNetworkDriverStart (
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii;
EFI_DEVICE_PATH_PROTOCOL *NiiDevicePath;
EFI_STATUS Status;
- PXE_UNDI *pxe;
- SNP_DRIVER *snp;
- VOID *addr;
+ PXE_UNDI *Pxe;
+ SNP_DRIVER *Snp;
+ VOID *Address;
EFI_HANDLE Handle;
PXE_PCI_CONFIG_INFO ConfigInfo;
PCI_TYPE00 *ConfigHeader;
@@ -494,7 +282,7 @@ SimpleNetworkDriverStart (
Status = gBS->OpenProtocol (
Handle,
&gEfiPciIoProtocolGuid,
- (VOID **) &mPciIoFncs,
+ (VOID **) &mPciIo,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
@@ -525,18 +313,18 @@ SimpleNetworkDriverStart (
DEBUG ((EFI_D_INFO, "Start(): UNDI3.1 found\n"));
- pxe = (PXE_UNDI *) (UINTN) (Nii->ID);
+ Pxe = (PXE_UNDI *) (UINTN) (Nii->ID);
- if (calc_8bit_cksum (pxe, pxe->hw.Len) != 0) {
+ if (Calc8BitCksum (Pxe, Pxe->hw.Len) != 0) {
DEBUG ((EFI_D_NET, "\n!PXE checksum is not correct.\n"));
goto NiiError;
}
- if ((pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED) != 0) {
+ if ((Pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED) != 0) {
//
// We can get any packets.
//
- } else if ((pxe->hw.Implementation & PXE_ROMID_IMP_BROADCAST_RX_SUPPORTED) != 0) {
+ } else if ((Pxe->hw.Implementation & PXE_ROMID_IMP_BROADCAST_RX_SUPPORTED) != 0) {
//
// We need to be able to get broadcast packets for DHCP.
// If we do not have promiscuous support, we must at least have
@@ -550,12 +338,12 @@ SimpleNetworkDriverStart (
// OK, we like this UNDI, and we know snp is not already there on this handle
// Allocate and initialize a new simple network protocol structure.
//
- Status = mPciIoFncs->AllocateBuffer (
- mPciIoFncs,
+ Status = mPciIo->AllocateBuffer (
+ mPciIo,
AllocateAnyPages,
EfiBootServicesData,
SNP_MEM_PAGES (sizeof (SNP_DRIVER)),
- &addr,
+ &Address,
0
);
@@ -564,48 +352,48 @@ SimpleNetworkDriverStart (
goto NiiError;
}
- snp = (SNP_DRIVER *) (UINTN) addr;
+ Snp = (SNP_DRIVER *) (UINTN) Address;
- ZeroMem (snp, sizeof (SNP_DRIVER));
+ ZeroMem (Snp, sizeof (SNP_DRIVER));
- snp->IoFncs = mPciIoFncs;
- snp->Signature = SNP_DRIVER_SIGNATURE;
+ Snp->PciIo = mPciIo;
+ Snp->Signature = SNP_DRIVER_SIGNATURE;
- EfiInitializeLock (&snp->lock, TPL_NOTIFY);
+ EfiInitializeLock (&Snp->Lock, TPL_NOTIFY);
- snp->snp.Revision = EFI_SIMPLE_NETWORK_PROTOCOL_REVISION;
- snp->snp.Start = snp_undi32_start;
- snp->snp.Stop = snp_undi32_stop;
- snp->snp.Initialize = snp_undi32_initialize;
- snp->snp.Reset = snp_undi32_reset;
- snp->snp.Shutdown = snp_undi32_shutdown;
- snp->snp.ReceiveFilters = snp_undi32_receive_filters;
- snp->snp.StationAddress = snp_undi32_station_address;
- snp->snp.Statistics = snp_undi32_statistics;
- snp->snp.MCastIpToMac = snp_undi32_mcast_ip_to_mac;
- snp->snp.NvData = snp_undi32_nvdata;
- snp->snp.GetStatus = snp_undi32_get_status;
- snp->snp.Transmit = snp_undi32_transmit;
- snp->snp.Receive = snp_undi32_receive;
- snp->snp.WaitForPacket = NULL;
+ Snp->Snp.Revision = EFI_SIMPLE_NETWORK_PROTOCOL_REVISION;
+ Snp->Snp.Start = SnpUndi32Start;
+ Snp->Snp.Stop = SnpUndi32Stop;
+ Snp->Snp.Initialize = SnpUndi32Initialize;
+ Snp->Snp.Reset = SnpUndi32Reset;
+ Snp->Snp.Shutdown = SnpUndi32Shutdown;
+ Snp->Snp.ReceiveFilters = SnpUndi32ReceiveFilters;
+ Snp->Snp.StationAddress = SnpUndi32StationAddress;
+ Snp->Snp.Statistics = SnpUndi32Statistics;
+ Snp->Snp.MCastIpToMac = SnpUndi32McastIpToMac;
+ Snp->Snp.NvData = SnpUndi32NvData;
+ Snp->Snp.GetStatus = SnpUndi32GetStatus;
+ Snp->Snp.Transmit = SnpUndi32Transmit;
+ Snp->Snp.Receive = SnpUndi32Receive;
+ Snp->Snp.WaitForPacket = NULL;
- snp->snp.Mode = &snp->mode;
+ Snp->Snp.Mode = &Snp->Mode;
- snp->tx_rx_bufsize = 0;
- snp->tx_rx_buffer = NULL;
+ Snp->TxRxBufferSize = 0;
+ Snp->TxRxBuffer = NULL;
- snp->if_num = Nii->IfNum;
+ Snp->IfNum = Nii->IfNum;
- if ((pxe->hw.Implementation & PXE_ROMID_IMP_HW_UNDI) != 0) {
- snp->is_swundi = FALSE;
- snp->issue_undi32_command = &issue_hwundi_command;
+ if ((Pxe->hw.Implementation & PXE_ROMID_IMP_HW_UNDI) != 0) {
+ Snp->IsSwUndi = FALSE;
+ Snp->IssueUndi32Command = &IssueHwUndiCommand;
} else {
- snp->is_swundi = TRUE;
+ Snp->IsSwUndi = TRUE;
- if ((pxe->sw.Implementation & PXE_ROMID_IMP_SW_VIRT_ADDR) != 0) {
- snp->issue_undi32_command = (issue_undi32_command) (UINTN) pxe->sw.EntryPoint;
+ if ((Pxe->sw.Implementation & PXE_ROMID_IMP_SW_VIRT_ADDR) != 0) {
+ Snp->IssueUndi32Command = (ISSUE_UNDI32_COMMAND) (UINTN) Pxe->sw.EntryPoint;
} else {
- snp->issue_undi32_command = (issue_undi32_command) (UINTN) ((UINT8) (UINTN) pxe + pxe->sw.EntryPoint);
+ Snp->IssueUndi32Command = (ISSUE_UNDI32_COMMAND) (UINTN) ((UINT8) (UINTN) Pxe + Pxe->sw.EntryPoint);
}
}
//
@@ -624,12 +412,12 @@ SimpleNetworkDriverStart (
// -it is OK to allocate one global set of CPB, DB pair for each UNDI
// interface as EFI does not multi-task and so SNP will not be re-entered!
//
- Status = mPciIoFncs->AllocateBuffer (
- mPciIoFncs,
+ Status = mPciIo->AllocateBuffer (
+ mPciIo,
AllocateAnyPages,
EfiBootServicesData,
SNP_MEM_PAGES (4096),
- &addr,
+ &Address,
0
);
@@ -638,81 +426,81 @@ SimpleNetworkDriverStart (
goto Error_DeleteSNP;
}
- snp->cpb = (VOID *) (UINTN) addr;
- snp->db = (VOID *) ((UINTN) addr + 2048);
+ Snp->Cpb = (VOID *) (UINTN) Address;
+ Snp->Db = (VOID *) ((UINTN) Address + 2048);
//
- // pxe_start call is going to give the callback functions to UNDI, these callback
+ // PxeStart call is going to give the callback functions to UNDI, these callback
// functions use the BarIndex values from the snp structure, so these must be initialized
- // with default values before doing a pxe_start. The correct values can be obtained after
+ // with default values before doing a PxeStart. The correct values can be obtained after
// getting the config information from UNDI
//
- snp->MemoryBarIndex = 0;
- snp->IoBarIndex = 1;
+ Snp->MemoryBarIndex = 0;
+ Snp->IoBarIndex = 1;
//
// we need the undi init information many times in this snp code, just get it
// once here and store it in the snp driver structure. to get Init Info
// from UNDI we have to start undi first.
//
- Status = pxe_start (snp);
+ Status = PxeStart (Snp);
if (Status != EFI_SUCCESS) {
goto Error_DeleteSNP;
}
- snp->cdb.OpCode = PXE_OPCODE_GET_INIT_INFO;
- snp->cdb.OpFlags = PXE_OPFLAGS_NOT_USED;
+ Snp->Cdb.OpCode = PXE_OPCODE_GET_INIT_INFO;
+ Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED;
- snp->cdb.CPBsize = PXE_CPBSIZE_NOT_USED;
- snp->cdb.CPBaddr = PXE_DBADDR_NOT_USED;
+ Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED;
+ Snp->Cdb.CPBaddr = PXE_DBADDR_NOT_USED;
- snp->cdb.DBsize = sizeof snp->init_info;
- snp->cdb.DBaddr = (UINT64)(UINTN) &snp->init_info;
+ Snp->Cdb.DBsize = sizeof Snp->InitInfo;
+ Snp->Cdb.DBaddr = (UINT64)(UINTN) &Snp->InitInfo;
- snp->cdb.StatCode = PXE_STATCODE_INITIALIZE;
- snp->cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;
+ Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE;
+ Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;
- snp->cdb.IFnum = snp->if_num;
- snp->cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;
+ Snp->Cdb.IFnum = Snp->IfNum;
+ Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;
- DEBUG ((EFI_D_NET, "\nsnp->undi.get_init_info() "));
+ DEBUG ((EFI_D_NET, "\nSnp->undi.get_init_info() "));
- (*snp->issue_undi32_command) ((UINT64)(UINTN) &snp->cdb);
+ (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb);
//
// Save the INIT Stat Code...
//
- InitStatFlags = snp->cdb.StatFlags;
+ InitStatFlags = Snp->Cdb.StatFlags;
- if (snp->cdb.StatCode != PXE_STATCODE_SUCCESS) {
- DEBUG ((EFI_D_NET, "\nsnp->undi.init_info() %xh:%xh\n", snp->cdb.StatFlags, snp->cdb.StatCode));
- pxe_stop (snp);
+ if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) {
+ DEBUG ((EFI_D_NET, "\nSnp->undi.init_info() %xh:%xh\n", Snp->Cdb.StatFlags, Snp->Cdb.StatCode));
+ PxeStop (Snp);
goto Error_DeleteSNP;
}
- snp->cdb.OpCode = PXE_OPCODE_GET_CONFIG_INFO;
- snp->cdb.OpFlags = PXE_OPFLAGS_NOT_USED;
+ Snp->Cdb.OpCode = PXE_OPCODE_GET_CONFIG_INFO;
+ Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED;
- snp->cdb.CPBsize = PXE_CPBSIZE_NOT_USED;
- snp->cdb.CPBaddr = PXE_DBADDR_NOT_USED;
+ Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED;
+ Snp->Cdb.CPBaddr = PXE_DBADDR_NOT_USED;
- snp->cdb.DBsize = sizeof ConfigInfo;
- snp->cdb.DBaddr = (UINT64)(UINTN) &ConfigInfo;
+ Snp->Cdb.DBsize = sizeof ConfigInfo;
+ Snp->Cdb.DBaddr = (UINT64)(UINTN) &ConfigInfo;
- snp->cdb.StatCode = PXE_STATCODE_INITIALIZE;
- snp->cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;
+ Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE;
+ Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;
- snp->cdb.IFnum = snp->if_num;
- snp->cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;
+ Snp->Cdb.IFnum = Snp->IfNum;
+ Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;
- DEBUG ((EFI_D_NET, "\nsnp->undi.get_config_info() "));
+ DEBUG ((EFI_D_NET, "\nSnp->undi.get_config_info() "));
- (*snp->issue_undi32_command) ((UINT64)(UINTN) &snp->cdb);
+ (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb);
- if (snp->cdb.StatCode != PXE_STATCODE_SUCCESS) {
- DEBUG ((EFI_D_NET, "\nsnp->undi.config_info() %xh:%xh\n", snp->cdb.StatFlags, snp->cdb.StatCode));
- pxe_stop (snp);
+ if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) {
+ DEBUG ((EFI_D_NET, "\nSnp->undi.config_info() %xh:%xh\n", Snp->Cdb.StatFlags, Snp->Cdb.StatCode));
+ PxeStop (Snp);
goto Error_DeleteSNP;
}
//
@@ -735,7 +523,7 @@ SimpleNetworkDriverStart (
}
if ((*TempBar & PCI_BAR_IO_MASK) == PCI_BAR_IO_MODE) {
- snp->IoBarIndex = BarIndex;
+ Snp->IoBarIndex = BarIndex;
break;
}
@@ -745,102 +533,102 @@ SimpleNetworkDriverStart (
//
// Initialize simple network protocol mode structure
//
- snp->mode.State = EfiSimpleNetworkStopped;
- snp->mode.HwAddressSize = snp->init_info.HWaddrLen;
- snp->mode.MediaHeaderSize = snp->init_info.MediaHeaderLen;
- snp->mode.MaxPacketSize = snp->init_info.FrameDataLen;
- snp->mode.NvRamAccessSize = snp->init_info.NvWidth;
- snp->mode.NvRamSize = snp->init_info.NvCount * snp->mode.NvRamAccessSize;
- snp->mode.IfType = snp->init_info.IFtype;
- snp->mode.MaxMCastFilterCount = snp->init_info.MCastFilterCnt;
- snp->mode.MCastFilterCount = 0;
+ Snp->Mode.State = EfiSimpleNetworkStopped;
+ Snp->Mode.HwAddressSize = Snp->InitInfo.HWaddrLen;
+ Snp->Mode.MediaHeaderSize = Snp->InitInfo.MediaHeaderLen;
+ Snp->Mode.MaxPacketSize = Snp->InitInfo.FrameDataLen;
+ Snp->Mode.NvRamAccessSize = Snp->InitInfo.NvWidth;
+ Snp->Mode.NvRamSize = Snp->InitInfo.NvCount * Snp->Mode.NvRamAccessSize;
+ Snp->Mode.IfType = Snp->InitInfo.IFtype;
+ Snp->Mode.MaxMCastFilterCount = Snp->InitInfo.MCastFilterCnt;
+ Snp->Mode.MCastFilterCount = 0;
switch (InitStatFlags & PXE_STATFLAGS_CABLE_DETECT_MASK) {
case PXE_STATFLAGS_CABLE_DETECT_SUPPORTED:
- snp->mode.MediaPresentSupported = TRUE;
+ Snp->Mode.MediaPresentSupported = TRUE;
break;
case PXE_STATFLAGS_CABLE_DETECT_NOT_SUPPORTED:
default:
- snp->mode.MediaPresentSupported = FALSE;
+ Snp->Mode.MediaPresentSupported = FALSE;
}
- if ((pxe->hw.Implementation & PXE_ROMID_IMP_STATION_ADDR_SETTABLE) != 0) {
- snp->mode.MacAddressChangeable = TRUE;
+ if ((Pxe->hw.Implementation & PXE_ROMID_IMP_STATION_ADDR_SETTABLE) != 0) {
+ Snp->Mode.MacAddressChangeable = TRUE;
} else {
- snp->mode.MacAddressChangeable = FALSE;
+ Snp->Mode.MacAddressChangeable = FALSE;
}
- if ((pxe->hw.Implementation & PXE_ROMID_IMP_MULTI_FRAME_SUPPORTED) != 0) {
- snp->mode.MultipleTxSupported = TRUE;
+ if ((Pxe->hw.Implementation & PXE_ROMID_IMP_MULTI_FRAME_SUPPORTED) != 0) {
+ Snp->Mode.MultipleTxSupported = TRUE;
} else {
- snp->mode.MultipleTxSupported = FALSE;
+ Snp->Mode.MultipleTxSupported = FALSE;
}
- snp->mode.ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST;
+ Snp->Mode.ReceiveFilterMask = EFI_SIMPLE_NETWORK_RECEIVE_UNICAST;
- if ((pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED) != 0) {
- snp->mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;
+ if ((Pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED) != 0) {
+ Snp->Mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;
}
- if ((pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED) != 0) {
- snp->mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS;
+ if ((Pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED) != 0) {
+ Snp->Mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS;
}
- if ((pxe->hw.Implementation & PXE_ROMID_IMP_BROADCAST_RX_SUPPORTED) != 0) {
- snp->mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST;
+ if ((Pxe->hw.Implementation & PXE_ROMID_IMP_BROADCAST_RX_SUPPORTED) != 0) {
+ Snp->Mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST;
}
- if ((pxe->hw.Implementation & PXE_ROMID_IMP_FILTERED_MULTICAST_RX_SUPPORTED) != 0) {
- snp->mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST;
+ if ((Pxe->hw.Implementation & PXE_ROMID_IMP_FILTERED_MULTICAST_RX_SUPPORTED) != 0) {
+ Snp->Mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST;
}
- if (pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED) {
- snp->mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;
+ if (Pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED) {
+ Snp->Mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;
}
- snp->mode.ReceiveFilterSetting = 0;
+ Snp->Mode.ReceiveFilterSetting = 0;
//
// need to get the station address to save in the mode structure. we need to
// initialize the UNDI first for this.
//
- snp->tx_rx_bufsize = snp->init_info.MemoryRequired;
- Status = pxe_init (snp, PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE);
+ Snp->TxRxBufferSize = Snp->InitInfo.MemoryRequired;
+ Status = PxeInit (Snp, PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE);
- if (Status) {
- pxe_stop (snp);
+ if (EFI_ERROR (Status)) {
+ PxeStop (Snp);
goto Error_DeleteSNP;
}
- Status = pxe_get_stn_addr (snp);
+ Status = PxeGetStnAddr (Snp);
if (Status != EFI_SUCCESS) {
- DEBUG ((EFI_D_ERROR, "\nsnp->undi.get_station_addr() failed.\n"));
- pxe_shutdown (snp);
- pxe_stop (snp);
+ DEBUG ((EFI_D_ERROR, "\nSnp->undi.get_station_addr() failed.\n"));
+ PxeShutdown (Snp);
+ PxeStop (Snp);
goto Error_DeleteSNP;
}
- snp->mode.MediaPresent = FALSE;
+ Snp->Mode.MediaPresent = FALSE;
//
// We should not leave UNDI started and initialized here. this DriverStart()
// routine must only find and attach the SNP interface to UNDI layer that it
// finds on the given handle!
- // The UNDI layer will be started when upper layers call snp->start.
+ // The UNDI layer will be started when upper layers call Snp->start.
// How ever, this DriverStart() must fill up the snp mode structure which
// contains the MAC address of the NIC. For this reason we started and
// initialized UNDI here, now we are done, do a shutdown and stop of the
// UNDI interface!
//
- pxe_shutdown (snp);
- pxe_stop (snp);
+ PxeShutdown (Snp);
+ PxeStop (Snp);
//
// add SNP to the undi handle
@@ -849,25 +637,25 @@ SimpleNetworkDriverStart (
&Controller,
&gEfiSimpleNetworkProtocolGuid,
EFI_NATIVE_INTERFACE,
- &(snp->snp)
+ &(Snp->Snp)
);
if (!EFI_ERROR (Status)) {
return Status;
}
- Status = mPciIoFncs->FreeBuffer (
- mPciIoFncs,
+ Status = mPciIo->FreeBuffer (
+ mPciIo,
SNP_MEM_PAGES (4096),
- snp->cpb
+ Snp->Cpb
);
Error_DeleteSNP:
- mPciIoFncs->FreeBuffer (
- mPciIoFncs,
+ mPciIo->FreeBuffer (
+ mPciIo,
SNP_MEM_PAGES (sizeof (SNP_DRIVER)),
- snp
+ Snp
);
NiiError:
gBS->CloseProtocol (
@@ -887,10 +675,22 @@ NiiError:
return Status;
}
-
/**
-
-
+ Stop this driver on ControllerHandle. This service is called by the
+ EFI boot service DisconnectController(). In order to
+ make drivers as small as possible, there are a few calling
+ restrictions for this service. DisconnectController()
+ must follow these calling restrictions. If any other agent wishes
+ to call Stop() it must also follow these calling restrictions.
+
+ @param This Protocol instance pointer.
+ @param ControllerHandle Handle of device to stop driver on
+ @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
+ children is zero stop the entire bus driver.
+ @param ChildHandleBuffer List of Child Handles to Stop.
+
+ @retval EFI_SUCCESS This driver is removed ControllerHandle
+ @retval other This driver was not removed from this device
**/
EFI_STATUS
@@ -927,7 +727,7 @@ SimpleNetworkDriverStop (
Status = gBS->UninstallProtocolInterface (
Controller,
&gEfiSimpleNetworkProtocolGuid,
- &Snp->snp
+ &Snp->Snp
);
if (EFI_ERROR (Status)) {
@@ -948,17 +748,17 @@ SimpleNetworkDriverStop (
Controller
);
- pxe_shutdown (Snp);
- pxe_stop (Snp);
+ PxeShutdown (Snp);
+ PxeStop (Snp);
- mPciIoFncs->FreeBuffer (
- mPciIoFncs,
+ mPciIo->FreeBuffer (
+ mPciIo,
SNP_MEM_PAGES (4096),
- Snp->cpb
+ Snp->Cpb
);
- mPciIoFncs->FreeBuffer (
- mPciIoFncs,
+ mPciIo->FreeBuffer (
+ mPciIo,
SNP_MEM_PAGES (sizeof (SNP_DRIVER)),
Snp
);
@@ -966,18 +766,183 @@ SimpleNetworkDriverStop (
return Status;
}
+//
+// Simple Network Protocol Driver Global Variables
+//
+EFI_DRIVER_BINDING_PROTOCOL mSimpleNetworkDriverBinding = {
+ SimpleNetworkDriverSupported,
+ SimpleNetworkDriverStart,
+ SimpleNetworkDriverStop,
+ 0xa,
+ NULL,
+ NULL
+};
+
+
+/**
+ This routine maps the given CPU address to a Device address. It creates a
+ an entry in the map list with the virtual and physical addresses and the
+ un map cookie.
+
+ @param V2p pointer to return a map list node pointer.
+ @param Type the direction in which the data flows from the given
+ virtual address device->cpu or cpu->device or both
+ ways.
+ @param VirtualAddress virtual address (or CPU address) to be mapped.
+ @param BufferSize size of the buffer to be mapped.
+
+ @retval EFI_SUCEESS routine has completed the mapping.
+ @retval EFI_INVALID_PARAMETER invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES out of resource.
+ @retval other error as indicated.
+
+**/
+EFI_STATUS
+AddV2P (
+ IN OUT V2P **V2p,
+ EFI_PCI_IO_PROTOCOL_OPERATION Type,
+ VOID *VirtualAddress,
+ UINTN BufferSize
+ )
+{
+ EFI_STATUS Status;
+
+ if ((V2p == NULL) || (VirtualAddress == NULL) || (BufferSize == 0)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ *V2p = AllocatePool (sizeof (V2P ));
+ if (*V2p != NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Status = mPciIo->Map (
+ mPciIo,
+ Type,
+ VirtualAddress,
+ &BufferSize,
+ &(*V2p)->PhysicalAddress,
+ &(*V2p)->Unmap
+ );
+ if (Status != EFI_SUCCESS) {
+ FreePool (*V2p);
+ return Status;
+ }
+ (*V2p)->VirtualAddress = VirtualAddress;
+ (*V2p)->BufferSize = BufferSize;
+ (*V2p)->Next = mV2p;
+ mV2p = *V2p;
+
+ return EFI_SUCCESS;
+}
+
+
+/**
+ This routine searches the linked list of mapped address nodes (for undi3.0
+ interface) to find the node that corresponds to the given virtual address and
+ returns a pointer to that node.
+
+ @param V2p pointer to return a map list node pointer.
+ @param VirtualAddr virtual address (or CPU address) to be searched in
+ the map list
+
+ @retval EFI_SUCEESS if a match found!
+ @retval Other match not found
+
+**/
+EFI_STATUS
+FindV2p (
+ V2P **V2p,
+ VOID *VirtualAddr
+ )
+{
+ V2P *Ptr;
+
+ if (V2p == NULL || VirtualAddr == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ for (Ptr = mV2p; Ptr != NULL; Ptr = Ptr->Next) {
+ if (Ptr->VirtualAddress == VirtualAddr) {
+ *V2p = Ptr;
+ return EFI_SUCCESS;
+ }
+ }
+
+ return EFI_NOT_FOUND;
+}
+
+
+/**
+ This routine unmaps the given virtual address and frees the memory allocated
+ for the map list node corresponding to that address.
+
+ @param VirtualAddress virtual address (or CPU address) to be unmapped
+
+ @retval EFI_SUCEESS if successfully unmapped
+ @retval Other as indicated by the error
+
+**/
+EFI_STATUS
+DelV2p (
+ VOID *VirtualAddress
+ )
+{
+ V2P *Current;
+ V2P *Next;
+ EFI_STATUS Status;
+
+ if (VirtualAddress == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (mV2p == NULL) {
+ return EFI_NOT_FOUND;
+ }
+ //
+ // Is our node at the head of the list??
+ //
+ if ((Current = mV2p)->VirtualAddress == VirtualAddress) {
+ mV2p = mV2p->Next;
+
+ Status = mPciIo->Unmap (mPciIo, Current->Unmap);
+
+ FreePool (Current);
+
+ if (EFI_ERROR (Status)) {
+ DEBUG ((EFI_D_ERROR, "Unmap failed with status = %r\n", Status));
+ }
+ return Status;
+ }
+
+ for (; Current->Next != NULL; Current = Next) {
+ if ((Next = Current->Next)->VirtualAddress == VirtualAddress) {
+ Current->Next = Next->Next;
+ Status = mPciIo->Unmap (mPciIo, Next->Unmap);
+ FreePool (Next);
+
+ if (EFI_ERROR (Status)) {
+ DEBUG ((EFI_D_ERROR, "Unmap failed with status = %r\n", Status));
+ }
+ return Status;
+ }
+ }
+
+ return EFI_NOT_FOUND;
+}
/**
- Install all the driver protocol
+ The SNP driver entry point.
- @param entry EFI_IMAGE_ENTRY_POINT)
+ @param ImageHandle The driver image handle.
+ @param SystemTable The system table.
- @retval EFI_SUCEESS Initialization routine has found UNDI hardware,
- loaded it's ROM, and installed a notify event for
- the Network Indentifier Interface Protocol
- successfully.
- @retval Other Return value from HandleProtocol for
- DeviceIoProtocol or LoadedImageProtocol
+ @retval EFI_SUCEESS Initialization routine has found UNDI hardware,
+ loaded it's ROM, and installed a notify event for
+ the Network Indentifier Interface Protocol
+ successfully.
+ @retval Other Return value from HandleProtocol for
+ DeviceIoProtocol or LoadedImageProtocol
**/
EFI_STATUS