EFI_STATUS Status;\r
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *NiiProtocol;\r
PXE_UNDI *pxe;\r
- BOOLEAN IsUndi31;\r
\r
- IsUndi31 = FALSE;\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiDevicePathProtocolGuid,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
- if (Status == EFI_ALREADY_STARTED)\r
- {\r
- DEBUG ((EFI_D_INFO, "Support(): Already Started. on handle %x\n", Controller));\r
- return EFI_ALREADY_STARTED;\r
- }\r
\r
- if (!EFI_ERROR (Status))\r
- {\r
- DEBUG ((EFI_D_INFO, "Support(): UNDI3.1 found on handle %x\n", Controller));\r
- IsUndi31 = TRUE;\r
- } else {\r
- //\r
- // try the older 3.0 driver\r
- //\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiNetworkInterfaceIdentifierProtocolGuid,\r
- (VOID **) &NiiProtocol,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ if (EFI_ERROR (Status)) {\r
+ if (Status == EFI_ALREADY_STARTED) {\r
+ DEBUG ((EFI_D_INFO, "Support(): Already Started. on handle %x\n", Controller));\r
}\r
-\r
- DEBUG ((EFI_D_INFO, "Support(): UNDI3.0 found on handle %x\n", Controller));\r
+ return Status;\r
}\r
+\r
+ DEBUG ((EFI_D_INFO, "Support(): UNDI3.1 found on handle %x\n", Controller));\r
+\r
//\r
// check the version, we don't want to connect to the undi16\r
//\r
DEBUG ((EFI_D_INFO, "Support(): supported on %x\n", Controller));\r
\r
Done:\r
- if (IsUndi31) {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
-\r
- } else {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiNetworkInterfaceIdentifierProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- }\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
return Status;\r
}\r
PXE_UNDI *pxe;\r
SNP_DRIVER *snp;\r
VOID *addr;\r
- VOID *addrUnmap;\r
- EFI_PHYSICAL_ADDRESS paddr;\r
EFI_HANDLE Handle;\r
- UINTN Size;\r
- BOOLEAN UndiNew;\r
PXE_PCI_CONFIG_INFO ConfigInfo;\r
PCI_TYPE00 *ConfigHeader;\r
UINT32 *TempBar;\r
return Status;\r
}\r
//\r
- // Get the NII interface. look for 3.1 undi first, if it is not there\r
- // then look for 3.0, validate the interface.\r
+ // Get the NII interface.\r
//\r
Status = gBS->OpenProtocol (\r
Controller,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
- if (Status == EFI_ALREADY_STARTED) {\r
+ if (EFI_ERROR (Status)) {\r
gBS->CloseProtocol (\r
Controller,\r
&gEfiDevicePathProtocolGuid,\r
return Status;\r
}\r
\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // probably not a 3.1 UNDI\r
- //\r
- UndiNew = TRUE;\r
- DEBUG ((EFI_D_INFO, "Start(): UNDI3.1 found\n"));\r
-\r
- } else {\r
- UndiNew = FALSE;\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiNetworkInterfaceIdentifierProtocolGuid,\r
- (VOID **) &Nii,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiDevicePathProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
-\r
- return Status;\r
- }\r
-\r
- DEBUG ((EFI_D_INFO, "Start(): UNDI3.0 found\n"));\r
- }\r
+ DEBUG ((EFI_D_INFO, "Start(): UNDI3.1 found\n"));\r
\r
pxe = (PXE_UNDI *) (UINTN) (Nii->ID);\r
\r
\r
snp = (SNP_DRIVER *) (UINTN) addr;\r
\r
- if (!UndiNew) {\r
- Size = SNP_MEM_PAGES (sizeof (SNP_DRIVER));\r
-\r
- Status = mPciIoFncs->Map (\r
- mPciIoFncs,\r
- EfiPciIoOperationBusMasterCommonBuffer,\r
- addr,\r
- &Size,\r
- &paddr,\r
- &addrUnmap\r
- );\r
-\r
- ASSERT (paddr);\r
-\r
- DEBUG ((EFI_D_NET, "\nSNP_DRIVER @ %Xh, sizeof(SNP_DRIVER) == %d", addr, sizeof (SNP_DRIVER)));\r
- snp = (SNP_DRIVER *) (UINTN) paddr;\r
- snp->SnpDriverUnmap = addrUnmap;\r
- }\r
-\r
ZeroMem (snp, sizeof (SNP_DRIVER));\r
\r
snp->IoFncs = mPciIoFncs;\r
- snp->IsOldUndi = (BOOLEAN) (!UndiNew);\r
-\r
snp->Signature = SNP_DRIVER_SIGNATURE;\r
\r
EfiInitializeLock (&snp->lock, TPL_NOTIFY);\r
goto Error_DeleteSNP;\r
}\r
\r
- if (snp->IsOldUndi) {\r
- Size = SNP_MEM_PAGES (4096);\r
-\r
- Status = mPciIoFncs->Map (\r
- mPciIoFncs,\r
- EfiPciIoOperationBusMasterCommonBuffer,\r
- addr,\r
- &Size,\r
- &paddr,\r
- &snp->CpbUnmap\r
- );\r
+ snp->cpb = (VOID *) (UINTN) addr;\r
+ snp->db = (VOID *) ((UINTN) addr + 2048);\r
\r
- ASSERT (paddr);\r
-\r
- snp->cpb = (VOID *) (UINTN) paddr;\r
- snp->db = (VOID *) ((UINTN) paddr + 2048);\r
- } else {\r
- snp->cpb = (VOID *) (UINTN) addr;\r
- snp->db = (VOID *) ((UINTN) addr + 2048);\r
- }\r
//\r
// pxe_start call is going to give the callback functions to UNDI, these callback\r
// functions use the BarIndex values from the snp structure, so these must be initialized\r
Status = pxe_start (snp);\r
\r
if (Status != EFI_SUCCESS) {\r
- goto Error_DeleteCPBDB;\r
+ goto Error_DeleteSNP;\r
}\r
\r
snp->cdb.OpCode = PXE_OPCODE_GET_INIT_INFO;\r
if (snp->cdb.StatCode != PXE_STATCODE_SUCCESS) {\r
DEBUG ((EFI_D_NET, "\nsnp->undi.init_info() %xh:%xh\n", snp->cdb.StatFlags, snp->cdb.StatCode));\r
pxe_stop (snp);\r
- goto Error_DeleteCPBDB;\r
+ goto Error_DeleteSNP;\r
}\r
\r
snp->cdb.OpCode = PXE_OPCODE_GET_CONFIG_INFO;\r
if (snp->cdb.StatCode != PXE_STATCODE_SUCCESS) {\r
DEBUG ((EFI_D_NET, "\nsnp->undi.config_info() %xh:%xh\n", snp->cdb.StatFlags, snp->cdb.StatCode));\r
pxe_stop (snp);\r
- goto Error_DeleteCPBDB;\r
+ goto Error_DeleteSNP;\r
}\r
//\r
// Find the correct BAR to do IO.\r
TempBar++;\r
}\r
\r
- //\r
- // We allocate 2 more global buffers for undi 3.0 interface. We use these\r
- // buffers to pass to undi when the user buffers are beyond 4GB.\r
- // UNDI 3.0 wants all the addresses passed to it to be\r
- // within 2GB limit, create them here and map them so that when undi calls\r
- // v2p callback to check if the physical address is < 2gb, we will pass.\r
- //\r
- // For 3.1 and later UNDIs, we do not do this because undi is\r
- // going to call the map() callback if and only if it wants to use the\r
- // device address for any address it receives.\r
- //\r
- if (snp->IsOldUndi) {\r
- //\r
- // buffer for receive\r
- //\r
- Size = SNP_MEM_PAGES (snp->init_info.MediaHeaderLen + snp->init_info.FrameDataLen);\r
- Status = mPciIoFncs->AllocateBuffer (\r
- mPciIoFncs,\r
- AllocateAnyPages,\r
- EfiBootServicesData,\r
- Size,\r
- &addr,\r
- 0\r
- );\r
-\r
- if (Status != EFI_SUCCESS) {\r
- DEBUG ((EFI_D_ERROR, "\nCould not allocate receive buffer.\n"));\r
- goto Error_DeleteCPBDB;\r
- }\r
-\r
- Status = mPciIoFncs->Map (\r
- mPciIoFncs,\r
- EfiPciIoOperationBusMasterCommonBuffer,\r
- addr,\r
- &Size,\r
- &paddr,\r
- &snp->ReceiveBufUnmap\r
- );\r
-\r
- ASSERT (paddr);\r
-\r
- snp->receive_buf = (UINT8 *) (UINTN) paddr;\r
-\r
- //\r
- // buffer for fill_header\r
- //\r
- Size = SNP_MEM_PAGES (snp->init_info.MediaHeaderLen);\r
- Status = mPciIoFncs->AllocateBuffer (\r
- mPciIoFncs,\r
- AllocateAnyPages,\r
- EfiBootServicesData,\r
- Size,\r
- &addr,\r
- 0\r
- );\r
-\r
- if (Status != EFI_SUCCESS) {\r
- DEBUG ((EFI_D_ERROR, "\nCould not allocate fill_header buffer.\n"));\r
- goto Error_DeleteRCVBuf;\r
- }\r
-\r
- Status = mPciIoFncs->Map (\r
- mPciIoFncs,\r
- EfiPciIoOperationBusMasterCommonBuffer,\r
- addr,\r
- &Size,\r
- &paddr,\r
- &snp->FillHdrBufUnmap\r
- );\r
-\r
- ASSERT (paddr);\r
- snp->fill_hdr_buf = (UINT8 *) (UINTN) paddr;\r
- }\r
//\r
// Initialize simple network protocol mode structure\r
//\r
\r
if (Status) {\r
pxe_stop (snp);\r
- goto Error_DeleteHdrBuf;\r
+ goto Error_DeleteSNP;\r
}\r
\r
Status = pxe_get_stn_addr (snp);\r
DEBUG ((EFI_D_ERROR, "\nsnp->undi.get_station_addr() failed.\n"));\r
pxe_shutdown (snp);\r
pxe_stop (snp);\r
- goto Error_DeleteHdrBuf;\r
+ goto Error_DeleteSNP;\r
}\r
\r
snp->mode.MediaPresent = FALSE;\r
return Status;\r
}\r
\r
-Error_DeleteHdrBuf:\r
- if (snp->IsOldUndi) {\r
- Status = mPciIoFncs->Unmap (\r
- mPciIoFncs,\r
- snp->FillHdrBufUnmap\r
- );\r
- Size = SNP_MEM_PAGES (snp->init_info.MediaHeaderLen);\r
- mPciIoFncs->FreeBuffer (\r
- mPciIoFncs,\r
- Size,\r
- snp->fill_hdr_buf\r
- );\r
- }\r
-\r
-Error_DeleteRCVBuf:\r
- if (snp->IsOldUndi) {\r
- Status = mPciIoFncs->Unmap (\r
- mPciIoFncs,\r
- snp->ReceiveBufUnmap\r
- );\r
- Size = SNP_MEM_PAGES (snp->init_info.MediaHeaderLen + snp->init_info.FrameDataLen);\r
- mPciIoFncs->FreeBuffer (\r
- mPciIoFncs,\r
- Size,\r
- snp->receive_buf\r
- );\r
-\r
- }\r
-\r
-Error_DeleteCPBDB:\r
- if (snp->IsOldUndi) {\r
- Status = mPciIoFncs->Unmap (\r
- mPciIoFncs,\r
- snp->CpbUnmap\r
- );\r
- }\r
-\r
Status = mPciIoFncs->FreeBuffer (\r
mPciIoFncs,\r
SNP_MEM_PAGES (4096),\r
);\r
\r
Error_DeleteSNP:\r
- if (snp->IsOldUndi) {\r
- Status = mPciIoFncs->Unmap (\r
- mPciIoFncs,\r
- snp->SnpDriverUnmap\r
- );\r
- }\r
\r
mPciIoFncs->FreeBuffer (\r
mPciIoFncs,\r
snp\r
);\r
NiiError:\r
- if (!UndiNew) {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiNetworkInterfaceIdentifierProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- } else {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- }\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
gBS->CloseProtocol (\r
Controller,\r
return Status;\r
}\r
\r
- if (!Snp->IsOldUndi) {\r
- Status = gBS->CloseProtocol (\r
- Controller,\r
- &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- } else {\r
- Status = gBS->CloseProtocol (\r
- Controller,\r
- &gEfiNetworkInterfaceIdentifierProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- }\r
+ Status = gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
Status = gBS->CloseProtocol (\r
Controller,\r
pxe_shutdown (Snp);\r
pxe_stop (Snp);\r
\r
- if (Snp->IsOldUndi) {\r
- Status = mPciIoFncs->Unmap (\r
- mPciIoFncs,\r
- Snp->FillHdrBufUnmap\r
- );\r
-\r
- mPciIoFncs->FreeBuffer (\r
- mPciIoFncs,\r
- SNP_MEM_PAGES (Snp->init_info.MediaHeaderLen),\r
- Snp->fill_hdr_buf\r
- );\r
- Status = mPciIoFncs->Unmap (\r
- mPciIoFncs,\r
- Snp->ReceiveBufUnmap\r
- );\r
-\r
- mPciIoFncs->FreeBuffer (\r
- mPciIoFncs,\r
- SNP_MEM_PAGES (Snp->init_info.MediaHeaderLen + Snp->init_info.FrameDataLen),\r
- Snp->receive_buf\r
- );\r
-\r
- Status = mPciIoFncs->Unmap (\r
- mPciIoFncs,\r
- Snp->CpbUnmap\r
- );\r
- Status = mPciIoFncs->Unmap (\r
- mPciIoFncs,\r
- Snp->SnpDriverUnmap\r
- );\r
- }\r
-\r
mPciIoFncs->FreeBuffer (\r
mPciIoFncs,\r
SNP_MEM_PAGES (4096),\r