/** @file\r
- Implementation of driver entry point and driver binding protocol.\r
- \r
-Copyright (c) 2004 - 2008, Intel Corporation. <BR> \r
-All rights reserved. This program and the accompanying materials are licensed \r
-and made available under the terms and conditions of the BSD License which \r
-accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
+ Implementation of driver entry point and driver binding protocol.\r
+\r
+Copyright (c) 2004 - 2010, Intel Corporation. <BR>\r
+All rights reserved. This program and the accompanying materials are licensed\r
+and made available under the terms and conditions of the BSD License which\r
+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
// End Global variables\r
//\r
\r
+/**\r
+ One notified function to stop UNDI device when gBS->ExitBootServices() called.\r
+\r
+ @param Event Pointer to this event\r
+ @param Context Event hanlder private data\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SnpNotifyExitBootServices (\r
+ EFI_EVENT Event,\r
+ VOID *Context\r
+ )\r
+{\r
+ SNP_DRIVER *Snp;\r
+\r
+ Snp = (SNP_DRIVER *)Context;\r
+\r
+ //\r
+ // Shutdown and stop UNDI driver\r
+ //\r
+ PxeShutdown (Snp);\r
+ PxeStop (Snp);\r
+}\r
\r
/**\r
Send command to UNDI. It does nothing currently.\r
- \r
+\r
@param Cdb command to be sent to UNDI.\r
- \r
- @retval EFI_INVALID_PARAMETER The command is 0. \r
- @retval EFI_UNSUPPORTED Default return status because it's not \r
+\r
+ @retval EFI_INVALID_PARAMETER The command is 0.\r
+ @retval EFI_UNSUPPORTED Default return status because it's not\r
supported currently.\r
- \r
+\r
**/\r
EFI_STATUS\r
IssueHwUndiCommand (\r
@param Buffer Pointer to buffer.\r
@param Length Length of buffer in bytes.\r
\r
- @return 8-bit checksum of all bytes in buffer, or zero if ptr is NULL or len \r
+ @return 8-bit checksum of all bytes in buffer, or zero if ptr is NULL or len\r
is zero.\r
\r
**/\r
//\r
// Check to see if !PXE structure is valid. Paragraph alignment of !PXE structure is required.\r
//\r
- if (NiiProtocol->ID & 0x0F) {\r
+ if ((NiiProtocol->Id & 0x0F) != 0) {\r
DEBUG ((EFI_D_NET, "\n!PXE structure is not paragraph aligned.\n"));\r
Status = EFI_UNSUPPORTED;\r
goto Done;\r
}\r
\r
- Pxe = (PXE_UNDI *) (UINTN) (NiiProtocol->ID);\r
+ Pxe = (PXE_UNDI *) (UINTN) (NiiProtocol->Id);\r
\r
//\r
// Verify !PXE revisions.\r
\r
DEBUG ((EFI_D_INFO, "Start(): UNDI3.1 found\n"));\r
\r
- Pxe = (PXE_UNDI *) (UINTN) (Nii->ID);\r
+ Pxe = (PXE_UNDI *) (UINTN) (Nii->Id);\r
\r
if (Calc8BitCksum (Pxe, Pxe->hw.Len) != 0) {\r
DEBUG ((EFI_D_NET, "\n!PXE checksum is not correct.\n"));\r
Snp->Mode.MediaPresentSupported = FALSE;\r
}\r
\r
+ switch (InitStatFlags & PXE_STATFLAGS_GET_STATUS_NO_MEDIA_MASK) {\r
+ case PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED:\r
+ Snp->MediaStatusSupported = TRUE;\r
+ break;\r
+\r
+ case PXE_STATFLAGS_GET_STATUS_NO_MEDIA_NOT_SUPPORTED:\r
+ default:\r
+ Snp->MediaStatusSupported = FALSE;\r
+ }\r
+\r
if ((Pxe->hw.Implementation & PXE_ROMID_IMP_STATION_ADDR_SETTABLE) != 0) {\r
Snp->Mode.MacAddressChangeable = TRUE;\r
} else {\r
\r
}\r
\r
- if (Pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED) {\r
+ if ((Pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED) != 0) {\r
Snp->Mode.ReceiveFilterMask |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;\r
\r
}\r
PxeShutdown (Snp);\r
PxeStop (Snp);\r
\r
+ //\r
+ // Create EXIT_BOOT_SERIVES Event\r
+ //\r
+ Status = gBS->CreateEventEx (\r
+ EVT_NOTIFY_SIGNAL,\r
+ TPL_NOTIFY,\r
+ SnpNotifyExitBootServices,\r
+ Snp,\r
+ &gEfiEventExitBootServicesGuid,\r
+ &Snp->ExitBootServicesEvent\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Error_DeleteSNP;\r
+ }\r
+\r
//\r
// add SNP to the undi handle\r
//\r
restrictions for this service. DisconnectController()\r
must follow these calling restrictions. If any other agent wishes\r
to call Stop() it must also follow these calling restrictions.\r
- \r
+\r
@param This Protocol instance pointer.\r
@param ControllerHandle Handle of device to stop driver on\r
@param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
return Status;\r
}\r
\r
+ //\r
+ // Close EXIT_BOOT_SERIVES Event\r
+ //\r
+ gBS->CloseEvent (Snp->ExitBootServicesEvent);\r
+\r
Status = gBS->CloseProtocol (\r
Controller,\r
&gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
}\r
\r
*V2p = AllocatePool (sizeof (V2P));\r
- if (*V2p != NULL) {\r
+ if (*V2p == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r