[edk2] [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg.

Siyuan Fu siyuan.fu at intel.com
Wed Dec 19 17:41:07 PST 2018


REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278

This patch is to delete the IScsiDxe driver in MdeModulePkg. The driver
will not be maintained and can't co-work with the dual-stack IScsiDxe in
NetworkPkg.

People should use below NetworkPkg drivers instead:
  NetworkPkg/IScsiDxe/IScsiDxe.inf
Which is actively maintained with more bug fixes and new feature support.

Cc: Jian J Wang <jian.j.wang at intel.com>
Cc: Hao Wu <hao.a.wu at intel.com>
Cc: Ruiyu Ni <ruiyu.ni at intel.com>
Cc: Star Zeng <star.zeng at intel.com>
Cc: Jiaxin Wu <jiaxin.wu at intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Siyuan Fu <siyuan.fu at intel.com>
---

Notes:
    v2:
    Break original patch to separate commits per module.

 MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c           |  283 --
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c               |  430 ---
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c             | 1264 ---------
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c               |  472 ----
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c             |  676 -----
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c    |  412 ---
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c               |  539 ----
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c      |  116 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c               |  948 -------
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c              | 2799 --------------------
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c             |  487 ----
 MdeModulePkg/Universal/Network/IScsiDxe/Md5.c                     |  350 ---
 MdeModulePkg/MdeModulePkg.dsc                                     |    1 -
 MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h           |  165 --
 MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni             |   25 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni        |   20 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h               |  106 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h             |   22 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h             |  166 --
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr        |  219 --
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni |   62 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h  |  109 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h               |   55 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h             |  140 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf              |  134 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h    |   22 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h               |   38 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h               |  168 --
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h      |   74 -
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h               |  317 ---
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h              | 1005 -------
 MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h             |  142 -
 MdeModulePkg/Universal/Network/IScsiDxe/Md5.h                     |   80 -
 33 files changed, 11846 deletions(-)

diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
deleted file mode 100644
index 3f561e93439d..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
+++ /dev/null
@@ -1,283 +0,0 @@
-/** @file
-  UEFI Component Name(2) protocol implementation for iSCSI.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-
-//
-// EFI Component Name Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL     gIScsiComponentName = {
-  IScsiComponentNameGetDriverName,
-  IScsiComponentNameGetControllerName,
-  "eng"
-};
-
-//
-// EFI Component Name 2 Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL    gIScsiComponentName2 = {
-  (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) IScsiComponentNameGetDriverName,
-  (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) IScsiComponentNameGetControllerName,
-  "en"
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIScsiDriverNameTable[] = {
-  {"eng;en", L"iSCSI Driver"},
-  {NULL, NULL}
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE  *mIScsiControllerNameTable = NULL;
-
-/**
-  Retrieves a Unicode string that is the user readable name of the EFI Driver.
-
-  This function retrieves the user readable name of a driver in the form of a
-  Unicode string. If the driver specified by This has a user readable name in
-  the language specified by Language, then a pointer to the driver name is
-  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
-  by This does not support the language specified by Language,
-  then EFI_UNSUPPORTED is returned.
-
-  @param[in]  This        A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
-  @param[in]  Language    A pointer to a three character ISO 639-2 language identifier.
-                          This is the language of the driver name that that the caller
-                          is requesting, and it must match one of the languages specified
-                          in SupportedLanguages.  The number of languages supported by a
-                          driver is up to the driver writer.
-  @param[out]  DriverName A pointer to the Unicode string to return.  This Unicode string
-                          is the name of the driver specified by This in the language
-                          specified by Language.
-
-  @retval EFI_SUCCESS           The Unicode string for the Driver specified by This
-                                and the language specified by Language was returned
-                                in DriverName.
-  @retval EFI_INVALID_PARAMETER Language is NULL.
-  @retval EFI_INVALID_PARAMETER DriverName is NULL.
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support the
-                                language specified by Language.
-**/
-EFI_STATUS
-EFIAPI
-IScsiComponentNameGetDriverName (
-  IN  EFI_COMPONENT_NAME_PROTOCOL   *This,
-  IN  CHAR8                         *Language,
-  OUT CHAR16                        **DriverName
-  )
-{
-  return LookupUnicodeString2 (
-          Language,
-          This->SupportedLanguages,
-          mIScsiDriverNameTable,
-          DriverName,
-          (BOOLEAN)(This == &gIScsiComponentName)
-          );
-}
-
-/**
-  Update the component name for the iSCSI instance.
-
-  @param[in]  IScsiExtScsiPassThru  A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
-
-  @retval EFI_SUCCESS               Update the ControllerNameTable of this instance successfully.
-  @retval EFI_INVALID_PARAMETER     The input parameter is invalid.
-  @retval EFI_UNSUPPORTED           Can't get the corresponding NIC info from the Controller handle.
-
-**/
-EFI_STATUS
-UpdateName (
-  IN   EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru
-  )
-{
-  EFI_STATUS                       Status;
-  CHAR16                           HandleName[150];
-  ISCSI_DRIVER_DATA                *Private;
-  EFI_MAC_ADDRESS                  MacAddress;
-  UINTN                            HwAddressSize;
-  UINT16                           VlanId;
-  CHAR16                           MacString[70];
-
-  if (IScsiExtScsiPassThru == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private  = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (IScsiExtScsiPassThru);
-
-  //
-  // Get the mac string, it's the name of various variable
-  //
-  Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  VlanId = NetLibGetVlanId (Private->Controller);
-  IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);
-
-  UnicodeSPrint (
-    HandleName,
-    sizeof (HandleName),
-    L"iSCSI IPv4 (MacString=%s)",
-    MacString
-  );
-
-  if (mIScsiControllerNameTable != NULL) {
-    FreeUnicodeStringTable (mIScsiControllerNameTable);
-    mIScsiControllerNameTable = NULL;
-  }
-
-  Status = AddUnicodeString2 (
-             "eng",
-             gIScsiComponentName.SupportedLanguages,
-             &mIScsiControllerNameTable,
-             HandleName,
-             TRUE
-             );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return AddUnicodeString2 (
-           "en",
-           gIScsiComponentName2.SupportedLanguages,
-           &mIScsiControllerNameTable,
-           HandleName,
-           FALSE
-           );
-}
-
-/**
-  Retrieves a Unicode string that is the user readable name of the controller
-  that is being managed by an EFI Driver.Currently not implemented.
-
-  @param[in]  This             A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
-  @param[in]  ControllerHandle The handle of a controller that the driver specified by
-                               This is managing.  This handle specifies the controller
-                               whose name is to be returned.
-  @param[in]  ChildHandle      The handle of the child controller to retrieve the name
-                               of.  This is an optional parameter that may be NULL.  It
-                               will be NULL for device drivers.  It will also be NULL
-                               for a bus drivers that wish to retrieve the name of the
-                               bus controller.  It will not be NULL for a bus driver
-                               that wishes to retrieve the name of a child controller.
-  @param[in]  Language         A pointer to a three character ISO 639-2 language
-                               identifier.  This is the language of the controller name
-                               that that the caller is requesting, and it must match one
-                               of the languages specified in SupportedLanguages.  The
-                               number of languages supported by a driver is up to the
-                               driver writer.
-  @param[out]  ControllerName  A pointer to the Unicode string to return.  This Unicode
-                               string is the name of the controller specified by
-                               ControllerHandle and ChildHandle in the language specified
-                               by Language from the point of view of the driver specified
-                               by This.
-
-  @retval EFI_SUCCESS           The Unicode string for the user readable name in the
-                                language specified by Language for the driver
-                                specified by This was returned in DriverName.
-  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
-  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE.
-  @retval EFI_INVALID_PARAMETER Language is NULL.
-  @retval EFI_INVALID_PARAMETER ControllerName is NULL.
-  @retval EFI_UNSUPPORTED       The driver specified by This is not currently managing
-                                the controller specified by ControllerHandle and
-                                ChildHandle.
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support the
-                                language specified by Language.
-**/
-EFI_STATUS
-EFIAPI
-IScsiComponentNameGetControllerName (
-  IN  EFI_COMPONENT_NAME_PROTOCOL   *This,
-  IN  EFI_HANDLE                    ControllerHandle,
-  IN  EFI_HANDLE                    ChildHandle        OPTIONAL,
-  IN  CHAR8                         *Language,
-  OUT CHAR16                        **ControllerName
-  )
-{
-  EFI_STATUS                      Status;
-
-  EFI_HANDLE                      IScsiController;
-  ISCSI_PRIVATE_PROTOCOL          *IScsiIdentifier;
-
-  EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru;
-
-  if (ControllerHandle == NULL) {
-    return EFI_UNSUPPORTED;
-  }
-
-  //
-  // Get the handle of the controller we are controling.
-  //
-  IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid);
-  if (IScsiController == NULL) {
-    return EFI_UNSUPPORTED;
-  }
-
-  Status = gBS->OpenProtocol (
-                  IScsiController,
-                  &gEfiCallerIdGuid,
-                  (VOID **)&IScsiIdentifier,
-                  NULL,
-                  NULL,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  if (ChildHandle != NULL) {
-    //
-    // Make sure this driver produced ChildHandle
-    //
-    Status = EfiTestChildHandle (
-               ControllerHandle,
-               ChildHandle,
-               &gEfiTcp4ProtocolGuid
-               );
-    if (!EFI_ERROR (Status)) {
-      //
-      // Retrieve an instance of a produced protocol from ChildHandle
-      //
-      Status = gBS->OpenProtocol (
-                      ChildHandle,
-                      &gEfiExtScsiPassThruProtocolGuid,
-                     (VOID **)&IScsiExtScsiPassThru,
-                      NULL,
-                      NULL,
-                      EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                      );
-      if (EFI_ERROR (Status)) {
-        return Status;
-      }
-
-      //
-      // Update the component name for this child handle.
-      //
-      Status = UpdateName (IScsiExtScsiPassThru);
-      if (EFI_ERROR (Status)) {
-        return Status;
-      }
-    } else {
-      return Status;
-    }
-  }
-
-  return LookupUnicodeString2 (
-           Language,
-           This->SupportedLanguages,
-           mIScsiControllerNameTable,
-           ControllerName,
-           (BOOLEAN)(This == &gIScsiComponentName)
-           );
-}
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
deleted file mode 100644
index 6307684ff05b..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
+++ /dev/null
@@ -1,430 +0,0 @@
-/** @file
-  This file is for Challenge-Handshake Authentication Protocol (CHAP) Configuration.
-
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-#include "Md5.h"
-
-/**
-  Initator calculates its own expected hash value.
-
-  @param[in]   ChapIdentifier     iSCSI CHAP identifier sent by authenticator.
-  @param[in]   ChapSecret         iSCSI CHAP secret of the authenticator.
-  @param[in]   SecretLength       The length of iSCSI CHAP secret.
-  @param[in]   ChapChallenge      The challenge message sent by authenticator.
-  @param[in]   ChallengeLength    The length of iSCSI CHAP challenge message.
-  @param[out]  ChapResponse       The calculation of the expected hash value.
-
-  @retval EFI_SUCCESS             The expected hash value was calculatedly successfully.
-  @retval EFI_PROTOCOL_ERROR      The length of the secret should be at least the
-                                  length of the hash value for the hashing algorithm chosen.
-  @retval Others                  Other errors as indicated.
-**/
-EFI_STATUS
-IScsiCHAPCalculateResponse (
-  IN  UINT32  ChapIdentifier,
-  IN  CHAR8   *ChapSecret,
-  IN  UINT32  SecretLength,
-  IN  UINT8   *ChapChallenge,
-  IN  UINT32  ChallengeLength,
-  OUT UINT8   *ChapResponse
-  )
-{
-  MD5_CTX     Md5Ctx;
-  CHAR8       IdByte[1];
-  EFI_STATUS  Status;
-
-  Status = MD5Init (&Md5Ctx);
-
-  //
-  // Hash Identifier - Only calculate 1 byte data (RFC1994)
-  //
-  IdByte[0] = (CHAR8) ChapIdentifier;
-  MD5Update (&Md5Ctx, IdByte, 1);
-
-  //
-  // Hash Secret
-  //
-  if (SecretLength < ISCSI_CHAP_SECRET_MIN_LEN - 1) {
-    return EFI_PROTOCOL_ERROR;
-  }
-
-  MD5Update (&Md5Ctx, ChapSecret, SecretLength);
-
-  //
-  // Hash Challenge received from Target
-  //
-  MD5Update (&Md5Ctx, ChapChallenge, ChallengeLength);
-
-  Status = MD5Final (&Md5Ctx, ChapResponse);
-
-  return Status;
-}
-
-/**
-  The initator checks the CHAP response replied by target against its own
-  calculation of the expected hash value.
-
-  @param[in]   AuthData             iSCSI CHAP authentication data.
-  @param[in]   TargetResponse       The response from target.
-
-  @retval EFI_SUCCESS               The response from target passed authentication.
-  @retval EFI_SECURITY_VIOLATION    The response from target was not expected value.
-  @retval Others                    Other errors as indicated.
-**/
-EFI_STATUS
-IScsiCHAPAuthTarget (
-  IN  ISCSI_CHAP_AUTH_DATA  *AuthData,
-  IN  UINT8                 *TargetResponse
-  )
-{
-  EFI_STATUS  Status;
-  UINT32      SecretSize;
-  UINT8       VerifyRsp[ISCSI_CHAP_RSP_LEN];
-
-  Status      = EFI_SUCCESS;
-
-  SecretSize  = (UINT32) AsciiStrLen (AuthData->AuthConfig.ReverseCHAPSecret);
-  Status = IScsiCHAPCalculateResponse (
-            AuthData->OutIdentifier,
-            AuthData->AuthConfig.ReverseCHAPSecret,
-            SecretSize,
-            AuthData->OutChallenge,
-            AuthData->OutChallengeLength,
-            VerifyRsp
-            );
-
-  if (CompareMem (VerifyRsp, TargetResponse, ISCSI_CHAP_RSP_LEN) != 0) {
-    Status = EFI_SECURITY_VIOLATION;
-  }
-
-  return Status;
-}
-
-/**
-  This function checks the received iSCSI Login Response during the security
-  negotiation stage.
-
-  @param[in] Conn             The iSCSI connection.
-
-  @retval EFI_SUCCESS          The Login Response passed the CHAP validation.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_PROTOCOL_ERROR   Some kind of protocol error happend.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiCHAPOnRspReceived (
-  IN ISCSI_CONNECTION  *Conn
-  )
-{
-  EFI_STATUS                Status;
-  ISCSI_SESSION             *Session;
-  ISCSI_CHAP_AUTH_DATA      *AuthData;
-  CHAR8                     *Value;
-  UINT8                     *Data;
-  UINT32                    Len;
-  LIST_ENTRY                *KeyValueList;
-  UINTN                     Algorithm;
-  CHAR8                     *Identifier;
-  CHAR8                     *Challenge;
-  CHAR8                     *Name;
-  CHAR8                     *Response;
-  UINT8                     TargetRsp[ISCSI_CHAP_RSP_LEN];
-  UINT32                    RspLen;
-
-  ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
-  ASSERT (Conn->RspQue.BufNum != 0);
-
-  Session     = Conn->Session;
-  AuthData    = &Session->AuthData;
-
-  Len         = Conn->RspQue.BufSize;
-  Data        = AllocatePool (Len);
-  if (Data == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  //
-  // Copy the data in case the data spans over multiple PDUs.
-  //
-  NetbufQueCopy (&Conn->RspQue, 0, Len, Data);
-
-  //
-  // Build the key-value list from the data segment of the Login Response.
-  //
-  KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len);
-  if (KeyValueList == NULL) {
-    FreePool (Data);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Status = EFI_PROTOCOL_ERROR;
-
-  switch (Conn->CHAPStep) {
-  case ISCSI_CHAP_INITIAL:
-    //
-    // The first Login Response.
-    //
-    Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
-    if (Value == NULL) {
-      goto ON_EXIT;
-    }
-
-    Session->TargetPortalGroupTag = (UINT16) AsciiStrDecimalToUintn (Value);
-
-    Value                         = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_AUTH_METHOD);
-    if (Value == NULL) {
-      goto ON_EXIT;
-    }
-    //
-    // Initiator mandates CHAP authentication but target replies without "CHAP" or
-    // initiator suggets "None" but target replies with some kind of auth method.
-    //
-    if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) == 0) {
-      if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
-        goto ON_EXIT;
-      }
-    } else {
-      if (AuthData->AuthConfig.CHAPType != ISCSI_CHAP_NONE) {
-        goto ON_EXIT;
-      }
-    }
-    //
-    // Transit to CHAP step one.
-    //
-    Conn->CHAPStep  = ISCSI_CHAP_STEP_ONE;
-    Status          = EFI_SUCCESS;
-    break;
-
-  case ISCSI_CHAP_STEP_TWO:
-    //
-    // The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C>
-    //
-    Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_ALGORITHM);
-    if (Value == NULL) {
-      goto ON_EXIT;
-    }
-
-    Algorithm = AsciiStrDecimalToUintn (Value);
-    if (Algorithm != ISCSI_CHAP_ALGORITHM_MD5) {
-      //
-      // Unsupported algorithm is chosen by target.
-      //
-      goto ON_EXIT;
-    }
-
-    Identifier = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_IDENTIFIER);
-    if (Identifier == NULL) {
-      goto ON_EXIT;
-    }
-
-    Challenge = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_CHALLENGE);
-    if (Challenge == NULL) {
-      goto ON_EXIT;
-    }
-    //
-    // Process the CHAP identifier and CHAP Challenge from Target
-    // Calculate Response value
-    //
-    AuthData->InIdentifier      = (UINT32) AsciiStrDecimalToUintn (Identifier);
-    AuthData->InChallengeLength = ISCSI_CHAP_AUTH_MAX_LEN;
-    IScsiHexToBin ((UINT8 *) AuthData->InChallenge, &AuthData->InChallengeLength, Challenge);
-    Status = IScsiCHAPCalculateResponse (
-              AuthData->InIdentifier,
-              AuthData->AuthConfig.CHAPSecret,
-              (UINT32) AsciiStrLen (AuthData->AuthConfig.CHAPSecret),
-              AuthData->InChallenge,
-              AuthData->InChallengeLength,
-              AuthData->CHAPResponse
-              );
-
-    //
-    // Transit to next step.
-    //
-    Conn->CHAPStep = ISCSI_CHAP_STEP_THREE;
-    break;
-
-  case ISCSI_CHAP_STEP_THREE:
-    //
-    // one way CHAP authentication and the target would like to
-    // authenticate us.
-    //
-    Status = EFI_SUCCESS;
-    break;
-
-  case ISCSI_CHAP_STEP_FOUR:
-    ASSERT (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL);
-    //
-    // The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target.
-    //
-    Name = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_NAME);
-    if (Name == NULL) {
-      goto ON_EXIT;
-    }
-
-    Response = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_RESPONSE);
-    if (Response == NULL) {
-      goto ON_EXIT;
-    }
-
-    RspLen = ISCSI_CHAP_RSP_LEN;
-    IScsiHexToBin (TargetRsp, &RspLen, Response);
-
-    //
-    // Check the CHAP Response replied by Target.
-    //
-    Status = IScsiCHAPAuthTarget (AuthData, TargetRsp);
-    break;
-
-  default:
-    break;
-  }
-
-ON_EXIT:
-
-  IScsiFreeKeyValueList (KeyValueList);
-
-  FreePool (Data);
-
-  return Status;
-}
-
-/**
-  This function fills the CHAP authentication information into the login PDU
-  during the security negotiation stage in the iSCSI connection login.
-
-  @param[in]       Conn        The iSCSI connection.
-  @param[in, out]  Pdu         The PDU to send out.
-
-  @retval EFI_SUCCESS          All check passed and the phase-related CHAP
-                               authentication info is filled into the iSCSI PDU.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_PROTOCOL_ERROR   Some kind of protocol error happend.
-**/
-EFI_STATUS
-IScsiCHAPToSendReq (
-  IN      ISCSI_CONNECTION  *Conn,
-  IN OUT  NET_BUF           *Pdu
-  )
-{
-  EFI_STATUS                Status;
-  ISCSI_SESSION             *Session;
-  ISCSI_LOGIN_REQUEST       *LoginReq;
-  ISCSI_CHAP_AUTH_DATA      *AuthData;
-  CHAR8                     *Value;
-  CHAR8                     ValueStr[256];
-  CHAR8                     *Response;
-  UINT32                    RspLen;
-  CHAR8                     *Challenge;
-  UINT32                    ChallengeLen;
-
-  ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
-
-  Session     = Conn->Session;
-  AuthData    = &Session->AuthData;
-  LoginReq    = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0);
-  if (LoginReq == NULL) {
-    return EFI_PROTOCOL_ERROR;
-  }
-  Status      = EFI_SUCCESS;
-
-  RspLen      = 2 * ISCSI_CHAP_RSP_LEN + 3;
-  Response    = AllocatePool (RspLen);
-  if (Response == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  ChallengeLen  = 2 * ISCSI_CHAP_RSP_LEN + 3;
-  Challenge     = AllocatePool (ChallengeLen);
-  if (Challenge == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  switch (Conn->CHAPStep) {
-  case ISCSI_CHAP_INITIAL:
-    //
-    // It's the initial Login Request. Fill in the key=value pairs mandatory
-    // for the initial Login Request.
-    //
-    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIATOR_NAME, Session->InitiatorName);
-    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal");
-    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_TARGET_NAME, Session->ConfigData.NvData.TargetName);
-
-    if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
-      Value = ISCSI_KEY_VALUE_NONE;
-      ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
-    } else {
-      Value = ISCSI_AUTH_METHOD_CHAP;
-    }
-
-    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value);
-
-    break;
-
-  case ISCSI_CHAP_STEP_ONE:
-    //
-    // First step, send the Login Request with CHAP_A=<A1,A2...> key-value pair.
-    //
-    AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", ISCSI_CHAP_ALGORITHM_MD5);
-    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, ValueStr);
-
-    Conn->CHAPStep = ISCSI_CHAP_STEP_TWO;
-    break;
-
-  case ISCSI_CHAP_STEP_THREE:
-    //
-    // Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or
-    // CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target ahtentication is
-    // required too.
-    //
-    // CHAP_N=<N>
-    //
-    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_NAME, (CHAR8 *) &AuthData->AuthConfig.CHAPName);
-    //
-    // CHAP_R=<R>
-    //
-    IScsiBinToHex ((UINT8 *) AuthData->CHAPResponse, ISCSI_CHAP_RSP_LEN, Response, &RspLen);
-    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response);
-
-    if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL) {
-      //
-      // CHAP_I=<I>
-      //
-      IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1);
-      AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier);
-      IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr);
-      //
-      // CHAP_C=<C>
-      //
-      IScsiGenRandom ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN);
-      AuthData->OutChallengeLength = ISCSI_CHAP_RSP_LEN;
-      IScsiBinToHex ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN, Challenge, &ChallengeLen);
-      IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge);
-
-      Conn->CHAPStep = ISCSI_CHAP_STEP_FOUR;
-    }
-    //
-    // set the stage transition flag.
-    //
-    ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
-    break;
-
-  default:
-    Status = EFI_PROTOCOL_ERROR;
-    break;
-  }
-
-  FreePool (Response);
-  FreePool (Challenge);
-
-  return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
deleted file mode 100644
index cb1eff1b690c..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
+++ /dev/null
@@ -1,1264 +0,0 @@
-/** @file
-  Helper functions for configuring or getting the parameters relating to iSCSI.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-
-CHAR16          mVendorStorageName[]     = L"ISCSI_CONFIG_IFR_NVDATA";
-BOOLEAN         mIScsiDeviceListUpdated  = FALSE;
-UINTN           mNumberOfIScsiDevices    = 0;
-ISCSI_FORM_CALLBACK_INFO  *mCallbackInfo = NULL;
-
-LIST_ENTRY      mIScsiConfigFormList = {
-  &mIScsiConfigFormList,
-  &mIScsiConfigFormList
-};
-
-HII_VENDOR_DEVICE_PATH  mIScsiHiiVendorDevicePath = {
-  {
-    {
-      HARDWARE_DEVICE_PATH,
-      HW_VENDOR_DP,
-      {
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
-        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
-      }
-    },
-    IP4_ISCSI_CONFIG_GUID
-  },
-  {
-    END_DEVICE_PATH_TYPE,
-    END_ENTIRE_DEVICE_PATH_SUBTYPE,
-    {
-      (UINT8) (END_DEVICE_PATH_LENGTH),
-      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
-    }
-  }
-};
-
-/**
-  Convert the IPv4 address into a dotted string.
-
-  @param[in]   Ip   The IPv4 address.
-  @param[out]  Str  The dotted IP string.
-**/
-VOID
-IScsiIpToStr (
-  IN  EFI_IPv4_ADDRESS  *Ip,
-  OUT CHAR16            *Str
-  )
-{
-  UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]);
-}
-
-
-/**
-  Parse IsId in string format and convert it to binary.
-
-  @param[in]        String  The buffer of the string to be parsed.
-  @param[in, out]   IsId    The buffer to store IsId.
-
-  @retval EFI_SUCCESS              The operation finished successfully.
-  @retval EFI_INVALID_PARAMETER    Any input parameter is invalid.
-
-**/
-EFI_STATUS
-IScsiParseIsIdFromString (
-  IN CONST CHAR16                    *String,
-  IN OUT   UINT8                     *IsId
-  )
-{
-  UINT8                          Index;
-  CHAR16                         *IsIdStr;
-  CHAR16                         TempStr[3];
-  UINTN                          NodeVal;
-  CHAR16                         PortString[ISCSI_NAME_IFR_MAX_SIZE];
-  EFI_INPUT_KEY                  Key;
-
-  if ((String == NULL) || (IsId == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  IsIdStr = (CHAR16 *) String;
-
-  if (StrLen (IsIdStr) != 6) {
-    UnicodeSPrint (
-      PortString,
-      (UINTN) sizeof (PortString),
-      L"Error! Input is incorrect, please input 6 hex numbers!\n"
-      );
-
-    CreatePopUp (
-      EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
-      &Key,
-      PortString,
-      NULL
-      );
-
-    return EFI_INVALID_PARAMETER;
-  }
-
-  for (Index = 3; Index < 6; Index++) {
-    CopyMem (TempStr, IsIdStr, sizeof (TempStr));
-    TempStr[2] = L'\0';
-
-    //
-    // Convert the string to IsId. StrHexToUintn stops at the first character
-    // that is not a valid hex character, '\0' here.
-    //
-    NodeVal = StrHexToUintn (TempStr);
-
-    IsId[Index] = (UINT8) NodeVal;
-
-    IsIdStr = IsIdStr + 2;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Convert IsId from binary to string format.
-
-  @param[out]      String  The buffer to store the converted string.
-  @param[in]       IsId    The buffer to store IsId.
-
-  @retval EFI_SUCCESS              The string converted successfully.
-  @retval EFI_INVALID_PARAMETER    Any input parameter is invalid.
-
-**/
-EFI_STATUS
-IScsiConvertIsIdToString (
-  OUT CHAR16                         *String,
-  IN  UINT8                          *IsId
-  )
-{
-  UINT8                          Index;
-  UINTN                          Number;
-
-  if ((String == NULL) || (IsId == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  for (Index = 0; Index < 6; Index++) {
-    if (IsId[Index] <= 0xF) {
-      Number = UnicodeSPrint (
-                 String,
-                 2 * ISID_CONFIGURABLE_STORAGE,
-                 L"0%X",
-                 (UINTN) IsId[Index]
-                 );
-    } else {
-      Number = UnicodeSPrint (
-                 String,
-                 2 * ISID_CONFIGURABLE_STORAGE,
-                 L"%X",
-                 (UINTN) IsId[Index]
-                 );
-
-    }
-
-    String = String + Number;
-  }
-
-  *String = L'\0';
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Update the list of iSCSI devices the iSCSI driver is controlling.
-
-  @retval EFI_SUCCESS            The callback successfully handled the action.
-  @retval Others                 Other errors as indicated.
-**/
-EFI_STATUS
-IScsiUpdateDeviceList (
-  VOID
-  )
-{
-  EFI_STATUS                  Status;
-  ISCSI_DEVICE_LIST           *DeviceList;
-  UINTN                       DataSize;
-  UINTN                       NumHandles;
-  EFI_HANDLE                  *Handles;
-  UINTN                       HandleIndex;
-  UINTN                       Index;
-  UINTN                       LastDeviceIndex;
-  EFI_MAC_ADDRESS             MacAddress;
-  UINTN                       HwAddressSize;
-  UINT16                      VlanId;
-  ISCSI_MAC_INFO              *CurMacInfo;
-  ISCSI_MAC_INFO              TempMacInfo;
-  CHAR16                      MacString[70];
-  UINTN                       DeviceListSize;
-
-  //
-  // Dump all the handles the Managed Network Service Binding Protocol is installed on.
-  //
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiManagedNetworkServiceBindingProtocolGuid,
-                  NULL,
-                  &NumHandles,
-                  &Handles
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  DataSize = 0;
-  Status = gRT->GetVariable (
-                  L"iSCSIDeviceList",
-                  &gIp4IScsiConfigGuid,
-                  NULL,
-                  &DataSize,
-                  NULL
-                  );
-  if (Status == EFI_BUFFER_TOO_SMALL) {
-    DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DataSize);
-    ASSERT (DeviceList != NULL);
-
-    gRT->GetVariable (
-          L"iSCSIDeviceList",
-          &gIp4IScsiConfigGuid,
-          NULL,
-          &DataSize,
-          DeviceList
-          );
-
-    LastDeviceIndex = 0;
-
-    for (HandleIndex = 0; HandleIndex < NumHandles; HandleIndex++) {
-      Status = NetLibGetMacAddress (Handles[HandleIndex], &MacAddress, &HwAddressSize);
-      ASSERT (Status == EFI_SUCCESS);
-      VlanId = NetLibGetVlanId (Handles[HandleIndex]);
-
-      for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) {
-        CurMacInfo = &DeviceList->MacInfo[Index];
-        if ((CurMacInfo->Len == HwAddressSize) &&
-            (CurMacInfo->VlanId == VlanId) &&
-            (NET_MAC_EQUAL (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize))
-            ) {
-          //
-          // The previous configured NIC is still here.
-          //
-          if (Index != LastDeviceIndex) {
-            //
-            // Swap the current MAC address entry with the one indexed by
-            // LastDeviceIndex.
-            //
-            CopyMem (&TempMacInfo, CurMacInfo, sizeof (ISCSI_MAC_INFO));
-            CopyMem (CurMacInfo, &DeviceList->MacInfo[LastDeviceIndex], sizeof (ISCSI_MAC_INFO));
-            CopyMem (&DeviceList->MacInfo[LastDeviceIndex], &TempMacInfo, sizeof (ISCSI_MAC_INFO));
-          }
-
-          LastDeviceIndex++;
-        }
-      }
-
-      if (LastDeviceIndex == DeviceList->NumDevice) {
-        break;
-      }
-    }
-
-    for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) {
-      //
-      // delete the variables
-      //
-      CurMacInfo = &DeviceList->MacInfo[Index];
-      IScsiMacAddrToStr (&CurMacInfo->Mac, CurMacInfo->Len, CurMacInfo->VlanId, MacString);
-      gRT->SetVariable (MacString, &gEfiIScsiInitiatorNameProtocolGuid, 0, 0, NULL);
-      gRT->SetVariable (MacString, &gIScsiCHAPAuthInfoGuid, 0, 0, NULL);
-    }
-
-    FreePool (DeviceList);
-  } else if (Status != EFI_NOT_FOUND) {
-    FreePool (Handles);
-    return Status;
-  }
-  //
-  // Construct the new iSCSI device list.
-  //
-  DeviceListSize        = sizeof (ISCSI_DEVICE_LIST) + (NumHandles - 1) * sizeof (ISCSI_MAC_INFO);
-  DeviceList            = (ISCSI_DEVICE_LIST *) AllocatePool (DeviceListSize);
-  ASSERT (DeviceList != NULL);
-  DeviceList->NumDevice = (UINT8) NumHandles;
-
-  for (Index = 0; Index < NumHandles; Index++) {
-    NetLibGetMacAddress (Handles[Index], &MacAddress, &HwAddressSize);
-
-    CurMacInfo  = &DeviceList->MacInfo[Index];
-    CopyMem (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize);
-    CurMacInfo->Len = (UINT8) HwAddressSize;
-    CurMacInfo->VlanId = NetLibGetVlanId (Handles[Index]);
-  }
-
-  gRT->SetVariable (
-        L"iSCSIDeviceList",
-        &gIp4IScsiConfigGuid,
-        ISCSI_CONFIG_VAR_ATTR,
-        DeviceListSize,
-        DeviceList
-        );
-
-  FreePool (DeviceList);
-  FreePool (Handles);
-
-  return Status;
-}
-
-/**
-  Get the iSCSI configuration form entry by the index of the goto opcode actived.
-
-  @param[in]  Index The 0-based index of the goto opcode actived.
-
-  @return The iSCSI configuration form entry found.
-**/
-ISCSI_CONFIG_FORM_ENTRY *
-IScsiGetConfigFormEntryByIndex (
-  IN UINT32 Index
-  )
-{
-  UINT32                  CurrentIndex;
-  LIST_ENTRY              *Entry;
-  ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
-
-  CurrentIndex    = 0;
-  ConfigFormEntry = NULL;
-
-  NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
-    if (CurrentIndex == Index) {
-      ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link);
-      break;
-    }
-
-    CurrentIndex++;
-  }
-
-  return ConfigFormEntry;
-}
-
-/**
-  Convert the iSCSI configuration data into the IFR data.
-
-  @param[in]   ConfigFormEntry The iSCSI configuration form entry.
-  @param[out]  IfrNvData       The IFR nv data.
-
-**/
-VOID
-IScsiConvertDeviceConfigDataToIfrNvData (
-  IN ISCSI_CONFIG_FORM_ENTRY      *ConfigFormEntry,
-  OUT ISCSI_CONFIG_IFR_NVDATA     *IfrNvData
-  )
-{
-  ISCSI_SESSION_CONFIG_NVDATA   *SessionConfigData;
-  ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData;
-
-  //
-  // Normal session configuration parameters.
-  //
-  SessionConfigData                 = &ConfigFormEntry->SessionConfigData;
-  IfrNvData->Enabled                = SessionConfigData->Enabled;
-
-  IfrNvData->InitiatorInfoFromDhcp  = SessionConfigData->InitiatorInfoFromDhcp;
-  IfrNvData->TargetInfoFromDhcp     = SessionConfigData->TargetInfoFromDhcp;
-  IfrNvData->TargetPort             = SessionConfigData->TargetPort;
-
-  IScsiIpToStr (&SessionConfigData->LocalIp, IfrNvData->LocalIp);
-  IScsiIpToStr (&SessionConfigData->SubnetMask, IfrNvData->SubnetMask);
-  IScsiIpToStr (&SessionConfigData->Gateway, IfrNvData->Gateway);
-  IScsiIpToStr (&SessionConfigData->TargetIp, IfrNvData->TargetIp);
-
-  IScsiAsciiStrToUnicodeStr (SessionConfigData->TargetName, IfrNvData->TargetName);
-
-  IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->BootLun);
-
-  IScsiConvertIsIdToString (IfrNvData->IsId, SessionConfigData->IsId);
-
-  //
-  // CHAP authentication parameters.
-  //
-  AuthConfigData      = &ConfigFormEntry->AuthConfigData;
-
-  IfrNvData->CHAPType = AuthConfigData->CHAPType;
-
-  IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPName, IfrNvData->CHAPName);
-  IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPSecret, IfrNvData->CHAPSecret);
-  IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPName, IfrNvData->ReverseCHAPName);
-  IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPSecret, IfrNvData->ReverseCHAPSecret);
-}
-
-/**
-  This function allows the caller to request the current
-  configuration for one or more named elements. The resulting
-  string is in <ConfigAltResp> format. Any and all alternative
-  configuration strings shall also be appended to the end of the
-  current configuration string. If they are, they must appear
-  after the current configuration. They must contain the same
-  routing (GUID, NAME, PATH) as the current configuration string.
-  They must have an additional description indicating the type of
-  alternative configuration the string represents,
-  "ALTCFG=<StringToken>". That <StringToken> (when
-  converted from Hex UNICODE to binary) is a reference to a
-  string in the associated string pack.
-
-  @param[in] This       Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
-  @param[in] Request    A null-terminated Unicode string in
-                        <ConfigRequest> format. Note that this
-                        includes the routing information as well as
-                        the configurable name / value pairs. It is
-                        invalid for this string to be in
-                        <MultiConfigRequest> format.
-  @param[out] Progress  On return, points to a character in the
-                        Request string. Points to the string's null
-                        terminator if request was successful. Points
-                        to the most recent "&" before the first
-                        failing name / value pair (or the beginning
-                        of the string if the failure is in the first
-                        name / value pair) if the request was not
-                        successful.
-  @param[out] Results   A null-terminated Unicode string in
-                        <ConfigAltResp> format which has all values
-                        filled in for the names in the Request string.
-                        String to be allocated by the called function.
-
-  @retval EFI_SUCCESS             The Results string is filled with the
-                                  values corresponding to all requested
-                                  names.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the
-                                  parts of the results that must be
-                                  stored awaiting possible future
-                                  protocols.
-  @retval EFI_INVALID_PARAMETER   For example, passing in a NULL
-                                  for the Request parameter
-                                  would result in this type of
-                                  error. In this case, the
-                                  Progress parameter would be
-                                  set to NULL.
-  @retval EFI_NOT_FOUND           Routing data doesn't match any
-                                  known driver. Progress set to the
-                                  first character in the routing header.
-                                  Note: There is no requirement that the
-                                  driver validate the routing data. It
-                                  must skip the <ConfigHdr> in order to
-                                  process the names.
-  @retval EFI_INVALID_PARAMETER   Illegal syntax. Progress set
-                                  to most recent & before the
-                                  error or the beginning of the
-                                  string.
-  @retval EFI_INVALID_PARAMETER   Unknown name. Progress points
-                                  to the & before the name in
-                                  question.Currently not implemented.
-**/
-EFI_STATUS
-EFIAPI
-IScsiFormExtractConfig (
-  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
-  IN  CONST EFI_STRING                       Request,
-  OUT EFI_STRING                             *Progress,
-  OUT EFI_STRING                             *Results
-  )
-{
-  EFI_STATUS                       Status;
-  CHAR8                            InitiatorName[ISCSI_NAME_MAX_SIZE];
-  UINTN                            BufferSize;
-  ISCSI_CONFIG_IFR_NVDATA          *IfrNvData;
-  ISCSI_FORM_CALLBACK_INFO         *Private;
-  EFI_HII_CONFIG_ROUTING_PROTOCOL  *HiiConfigRouting;
-  EFI_STRING                       ConfigRequestHdr;
-  EFI_STRING                       ConfigRequest;
-  BOOLEAN                          AllocatedRequest;
-  UINTN                            Size;
-
-  if (Progress == NULL || Results == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  *Progress = Request;
-  if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &gIp4IScsiConfigGuid, mVendorStorageName)) {
-    return EFI_NOT_FOUND;
-  }
-
-  ConfigRequestHdr = NULL;
-  ConfigRequest    = NULL;
-  AllocatedRequest = FALSE;
-  Size             = 0;
-
-  if (!mIScsiDeviceListUpdated) {
-    //
-    // Update the device list.
-    //
-    IScsiUpdateDeviceList ();
-    mIScsiDeviceListUpdated = TRUE;
-  }
-
-  Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
-  IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));
-  ASSERT (IfrNvData != NULL);
-  if (Private->Current != NULL) {
-    IScsiConvertDeviceConfigDataToIfrNvData (Private->Current, IfrNvData);
-  }
-
-  BufferSize  = ISCSI_NAME_MAX_SIZE;
-  Status      = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize, InitiatorName);
-  if (EFI_ERROR (Status)) {
-    IfrNvData->InitiatorName[0] = L'\0';
-  } else {
-    IScsiAsciiStrToUnicodeStr (InitiatorName, IfrNvData->InitiatorName);
-  }
-
-  //
-  // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
-  //
-  HiiConfigRouting = Private->ConfigRouting;
-  BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);
-  ConfigRequest = Request;
-  if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
-    //
-    // Request has no request element, construct full request string.
-    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
-    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
-    //
-    ConfigRequestHdr = HiiConstructConfigHdr (&gIp4IScsiConfigGuid, mVendorStorageName, Private->DriverHandle);
-    Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
-    ConfigRequest = AllocateZeroPool (Size);
-    ASSERT (ConfigRequest != NULL);
-    AllocatedRequest = TRUE;
-    UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);
-    FreePool (ConfigRequestHdr);
-  }
-  Status = HiiConfigRouting->BlockToConfig (
-                               HiiConfigRouting,
-                               ConfigRequest,
-                               (UINT8 *) IfrNvData,
-                               BufferSize,
-                               Results,
-                               Progress
-                               );
-  FreePool (IfrNvData);
-  //
-  // Free the allocated config request string.
-  //
-  if (AllocatedRequest) {
-    FreePool (ConfigRequest);
-    ConfigRequest = NULL;
-  }
-
-  //
-  // Set Progress string to the original request string.
-  //
-  if (Request == NULL) {
-    *Progress = NULL;
-  } else if (StrStr (Request, L"OFFSET") == NULL) {
-    *Progress = Request + StrLen (Request);
-  }
-
-  return Status;
-}
-
-/**
-  This function applies changes in a driver's configuration.
-  Input is a Configuration, which has the routing data for this
-  driver followed by name / value configuration pairs. The driver
-  must apply those pairs to its configurable storage. If the
-  driver's configuration is stored in a linear block of data
-  and the driver's name / value pairs are in <BlockConfig>
-  format, it may use the ConfigToBlock helper function (above) to
-  simplify the job. Currently not implemented.
-
-  @param[in]  This           Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
-  @param[in]  Configuration  A null-terminated Unicode string in
-                             <ConfigString> format.
-  @param[out] Progress       A pointer to a string filled in with the
-                             offset of the most recent '&' before the
-                             first failing name / value pair (or the
-                             beginn ing of the string if the failure
-                             is in the first name / value pair) or
-                             the terminating NULL if all was
-                             successful.
-
-  @retval EFI_SUCCESS             The results have been distributed or are
-                                  awaiting distribution.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the
-                                  parts of the results that must be
-                                  stored awaiting possible future
-                                  protocols.
-  @retval EFI_INVALID_PARAMETERS  Passing in a NULL for the
-                                  Results parameter would result
-                                  in this type of error.
-  @retval EFI_NOT_FOUND           Target for the specified routing data
-                                  was not found.
-**/
-EFI_STATUS
-EFIAPI
-IScsiFormRouteConfig (
-  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
-  IN  CONST EFI_STRING                       Configuration,
-  OUT EFI_STRING                             *Progress
-  )
-{
-  if (Configuration == NULL || Progress == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Check routing data in <ConfigHdr>.
-  // Note: if only one Storage is used, then this checking could be skipped.
-  //
-  if (!HiiIsConfigHdrMatch (Configuration, &gIp4IScsiConfigGuid, mVendorStorageName)) {
-    *Progress = Configuration;
-    return EFI_NOT_FOUND;
-  }
-
-  *Progress = Configuration + StrLen (Configuration);
-  return EFI_SUCCESS;
-}
-
-/**
-  This function is called to provide results data to the driver.
-  This data consists of a unique key that is used to identify
-  which data is either being passed back or being asked for.
-
-  @param[in]  This               Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
-  @param[in]  Action             Specifies the type of action taken by the browser.
-  @param[in]  QuestionId         A unique value which is sent to the original
-                                 exporting driver so that it can identify the type
-                                 of data to expect. The format of the data tends to
-                                 vary based on the opcode that enerated the callback.
-  @param[in]  Type               The type of value for the question.
-  @param[in]  Value              A pointer to the data being sent to the original
-                                 exporting driver.
-  @param[out]  ActionRequest     On return, points to the action requested by the
-                                 callback function.
-
-  @retval EFI_SUCCESS            The callback successfully handled the action.
-  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the
-                                 variable and its data.
-  @retval EFI_DEVICE_ERROR       The variable could not be saved.
-  @retval EFI_UNSUPPORTED        The specified Action is not supported by the
-                                 callback.Currently not implemented.
-  @retval EFI_INVALID_PARAMETERS Passing in wrong parameter.
-  @retval Others                 Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiFormCallback (
-  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
-  IN  EFI_BROWSER_ACTION                     Action,
-  IN  EFI_QUESTION_ID                        QuestionId,
-  IN  UINT8                                  Type,
-  IN  EFI_IFR_TYPE_VALUE                     *Value,
-  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
-  )
-{
-  ISCSI_FORM_CALLBACK_INFO  *Private;
-  UINTN                     BufferSize;
-  CHAR8                     IScsiName[ISCSI_NAME_MAX_SIZE];
-  CHAR16                    PortString[128];
-  CHAR8                     Ip4String[IP4_STR_MAX_SIZE];
-  CHAR8                     LunString[ISCSI_LUN_STR_MAX_LEN];
-  UINT64                    Lun;
-  EFI_STRING_ID             DeviceFormTitleToken;
-  ISCSI_CONFIG_IFR_NVDATA   *IfrNvData;
-  ISCSI_CONFIG_FORM_ENTRY   *ConfigFormEntry;
-  EFI_IP_ADDRESS            HostIp;
-  EFI_IP_ADDRESS            SubnetMask;
-  EFI_IP_ADDRESS            Gateway;
-  EFI_STATUS                Status;
-  EFI_INPUT_KEY             Key;
-
-  if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {
-    return EFI_UNSUPPORTED;
-  }
-
-  Private   = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
-  //
-  // Retrieve uncommitted data from Browser
-  //
-  IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));
-  ASSERT (IfrNvData != NULL);
-  if (!HiiGetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) {
-    FreePool (IfrNvData);
-    return EFI_NOT_FOUND;
-  }
-  Status = EFI_SUCCESS;
-
-  if (Action == EFI_BROWSER_ACTION_CHANGING) {
-    if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId < (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) {
-      //
-      // In case goto the device configuration form, update the device form title.
-      //
-      ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32) (QuestionId - KEY_DEVICE_ENTRY_BASE));
-      ASSERT (ConfigFormEntry != NULL);
-
-      UnicodeSPrint (PortString, (UINTN) sizeof (PortString), L"Port %s", ConfigFormEntry->MacString);
-      DeviceFormTitleToken = (EFI_STRING_ID) STR_ISCSI_DEVICE_FORM_TITLE;
-      HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString, NULL);
-
-      IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData);
-
-      Private->Current = ConfigFormEntry;
-    }
-  } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
-    switch (QuestionId) {
-    case KEY_INITIATOR_NAME:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->InitiatorName, IScsiName);
-      BufferSize  = AsciiStrSize (IScsiName);
-
-      Status      = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, IScsiName);
-      if (EFI_ERROR (Status)) {
-        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);
-      }
-
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
-      break;
-
-    case KEY_LOCAL_IP:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);
-      Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
-      if (EFI_ERROR (Status) ||
-          ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
-           !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) {
-        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
-        Status = EFI_INVALID_PARAMETER;
-      } else {
-        CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4));
-      }
-
-      break;
-
-    case KEY_SUBNET_MASK:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String);
-      Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4);
-      if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
-        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL);
-        Status = EFI_INVALID_PARAMETER;
-      } else {
-        CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));
-      }
-
-      break;
-
-    case KEY_GATE_WAY:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);
-      Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);
-      if (EFI_ERROR (Status) ||
-          ((Gateway.Addr[0] != 0) &&
-           (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
-           !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) {
-        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);
-        Status = EFI_INVALID_PARAMETER;
-      } else {
-        CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4));
-      }
-
-      break;
-
-    case KEY_TARGET_IP:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);
-      Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
-      if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) {
-        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
-        Status = EFI_INVALID_PARAMETER;
-      } else {
-        CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, sizeof (HostIp.v4));
-      }
-
-      break;
-
-    case KEY_TARGET_NAME:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName);
-      Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName));
-      if (EFI_ERROR (Status)) {
-        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);
-      } else {
-        AsciiStrCpyS (Private->Current->SessionConfigData.TargetName, ISCSI_NAME_MAX_SIZE, IScsiName);
-      }
-
-      break;
-
-    case KEY_DHCP_ENABLE:
-      if (IfrNvData->InitiatorInfoFromDhcp == 0) {
-        IfrNvData->TargetInfoFromDhcp = 0;
-      }
-
-      break;
-
-    case KEY_BOOT_LUN:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString);
-      Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun);
-      if (EFI_ERROR (Status)) {
-        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid LUN string!", NULL);
-      } else {
-        CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun));
-      }
-
-      break;
-
-    case KEY_CHAP_NAME:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPName, Private->Current->AuthConfigData.CHAPName);
-      break;
-
-    case KEY_CHAP_SECRET:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPSecret, Private->Current->AuthConfigData.CHAPSecret);
-      break;
-
-    case KEY_REVERSE_CHAP_NAME:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPName, Private->Current->AuthConfigData.ReverseCHAPName);
-      break;
-
-    case KEY_REVERSE_CHAP_SECRET:
-      IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPSecret, Private->Current->AuthConfigData.ReverseCHAPSecret);
-      break;
-
-    case KEY_CONFIG_ISID:
-      IScsiParseIsIdFromString (IfrNvData->IsId, Private->Current->SessionConfigData.IsId);
-      IScsiConvertIsIdToString (IfrNvData->IsId, Private->Current->SessionConfigData.IsId);
-
-      break;
-
-    case KEY_SAVE_CHANGES:
-      //
-      // First, update those fields which don't have INTERACTIVE set.
-      //
-      Private->Current->SessionConfigData.Enabled               = IfrNvData->Enabled;
-      Private->Current->SessionConfigData.InitiatorInfoFromDhcp = IfrNvData->InitiatorInfoFromDhcp;
-      Private->Current->SessionConfigData.TargetPort            = IfrNvData->TargetPort;
-      if (Private->Current->SessionConfigData.TargetPort == 0) {
-        Private->Current->SessionConfigData.TargetPort = ISCSI_WELL_KNOWN_PORT;
-      }
-
-      Private->Current->SessionConfigData.TargetInfoFromDhcp  = IfrNvData->TargetInfoFromDhcp;
-      Private->Current->AuthConfigData.CHAPType               = IfrNvData->CHAPType;
-
-      //
-      // Only do full parameter validation if iSCSI is enabled on this device.
-      //
-      if (Private->Current->SessionConfigData.Enabled) {
-        //
-        // Validate the address configuration of the Initiator if DHCP isn't
-        // deployed.
-        //
-        if (!Private->Current->SessionConfigData.InitiatorInfoFromDhcp) {
-          CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.LocalIp, sizeof (HostIp.v4));
-          CopyMem (&SubnetMask.v4, &Private->Current->SessionConfigData.SubnetMask, sizeof (SubnetMask.v4));
-          CopyMem (&Gateway.v4, &Private->Current->SessionConfigData.Gateway, sizeof (Gateway.v4));
-
-          if ((Gateway.Addr[0] != 0)) {
-            if (SubnetMask.Addr[0] == 0) {
-              CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Gateway address is set but subnet mask is zero.", NULL);
-              Status = EFI_INVALID_PARAMETER;
-              break;
-            } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], SubnetMask.Addr[0])) {
-              CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Local IP and Gateway are not in the same subnet.", NULL);
-              Status = EFI_INVALID_PARAMETER;
-              break;
-            }
-          }
-        }
-        //
-        // Validate target configuration if DHCP isn't deployed.
-        //
-        if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {
-          CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4));
-          if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) {
-            CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Target IP is invalid!", NULL);
-            Status = EFI_INVALID_PARAMETER;
-            break;
-          }
-
-          //
-          // Validate iSCSI target name configuration again:
-          // The format of iSCSI target name is already verified when user input the name;
-          // here we only check the case user does not input the name.
-          //
-          if (Private->Current->SessionConfigData.TargetName[0] == '\0') {
-            CreatePopUp (
-              EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
-              &Key,
-              L"iSCSI target name is NULL!",
-              NULL
-              );
-            Status = EFI_INVALID_PARAMETER;
-            break;
-          }
-
-        }
-
-        if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {
-          if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == '\0')) {
-            CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"CHAP Name or CHAP Secret is invalid!", NULL);
-            Status = EFI_INVALID_PARAMETER;
-            break;
-          }
-
-          if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) &&
-              ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData->ReverseCHAPSecret[0] == '\0'))
-              ) {
-            CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL);
-            Status = EFI_INVALID_PARAMETER;
-            break;
-          }
-        }
-      }
-
-      BufferSize = sizeof (Private->Current->SessionConfigData);
-      gRT->SetVariable (
-            Private->Current->MacString,
-            &gEfiIScsiInitiatorNameProtocolGuid,
-            ISCSI_CONFIG_VAR_ATTR,
-            BufferSize,
-            &Private->Current->SessionConfigData
-            );
-
-      BufferSize = sizeof (Private->Current->AuthConfigData);
-      gRT->SetVariable (
-            Private->Current->MacString,
-            &gIScsiCHAPAuthInfoGuid,
-            ISCSI_CONFIG_VAR_ATTR,
-            BufferSize,
-            &Private->Current->AuthConfigData
-            );
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
-      break;
-
-    default:
-      break;
-    }
-  }
-
-  if (!EFI_ERROR (Status)) {
-    //
-    // Pass changed uncommitted data back to Form Browser
-    //
-    HiiSetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL);
-  }
-
-  FreePool (IfrNvData);
-
-  return Status;
-}
-
-/**
-  Updates the iSCSI configuration form to add/delete an entry for the iSCSI
-  device specified by the Controller.
-
-  @param[in]  DriverBindingHandle The driverbinding handle.
-  @param[in]  Controller          The controller handle of the iSCSI device.
-  @param[in]  AddForm             Whether to add or delete a form entry.
-
-  @retval EFI_SUCCESS             The iSCSI configuration form is updated.
-  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
-  @retval Others                  Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConfigUpdateForm (
-  IN EFI_HANDLE  DriverBindingHandle,
-  IN EFI_HANDLE  Controller,
-  IN BOOLEAN     AddForm
-  )
-{
-  LIST_ENTRY                  *Entry;
-  ISCSI_CONFIG_FORM_ENTRY     *ConfigFormEntry;
-  BOOLEAN                     EntryExisted;
-  EFI_STATUS                  Status;
-  EFI_MAC_ADDRESS             MacAddress;
-  UINTN                       HwAddressSize;
-  UINT16                      VlanId;
-  CHAR16                      PortString[128];
-  UINT16                      FormIndex;
-  UINTN                       BufferSize;
-  VOID                        *StartOpCodeHandle;
-  VOID                        *EndOpCodeHandle;
-  EFI_IFR_GUID_LABEL          *StartLabel;
-  EFI_IFR_GUID_LABEL          *EndLabel;
-
-  ConfigFormEntry = NULL;
-  EntryExisted    = FALSE;
-
-  NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
-    ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link);
-
-    if (ConfigFormEntry->Controller == Controller) {
-      EntryExisted = TRUE;
-      break;
-    }
-  }
-
-  if (AddForm) {
-    if (EntryExisted) {
-      return EFI_SUCCESS;
-    } else {
-      //
-      // Add a new form.
-      //
-      ConfigFormEntry = (ISCSI_CONFIG_FORM_ENTRY *) AllocateZeroPool (sizeof (ISCSI_CONFIG_FORM_ENTRY));
-      if (ConfigFormEntry == NULL) {
-        return EFI_OUT_OF_RESOURCES;
-      }
-
-      InitializeListHead (&ConfigFormEntry->Link);
-      ConfigFormEntry->Controller = Controller;
-
-      //
-      // Get the MAC address and convert it into the formatted string.
-      //
-      Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize);
-      ASSERT (Status == EFI_SUCCESS);
-      VlanId = NetLibGetVlanId (Controller);
-
-      IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, ConfigFormEntry->MacString);
-
-      //
-      // Get the normal session configuration data.
-      //
-      BufferSize = sizeof (ConfigFormEntry->SessionConfigData);
-      Status = gRT->GetVariable (
-                      ConfigFormEntry->MacString,
-                      &gEfiIScsiInitiatorNameProtocolGuid,
-                      NULL,
-                      &BufferSize,
-                      &ConfigFormEntry->SessionConfigData
-                      );
-      if (EFI_ERROR (Status)) {
-        ZeroMem (&ConfigFormEntry->SessionConfigData, sizeof (ConfigFormEntry->SessionConfigData));
-
-        //
-        // Generate OUI-format ISID based on MAC address.
-        //
-        CopyMem (ConfigFormEntry->SessionConfigData.IsId, &MacAddress, 6);
-        ConfigFormEntry->SessionConfigData.IsId[0] =
-          (UINT8) (ConfigFormEntry->SessionConfigData.IsId[0] & 0x3F);
-      }
-      //
-      // Get the CHAP authentication configuration data.
-      //
-      BufferSize = sizeof (ConfigFormEntry->AuthConfigData);
-      Status = gRT->GetVariable (
-                      ConfigFormEntry->MacString,
-                      &gIScsiCHAPAuthInfoGuid,
-                      NULL,
-                      &BufferSize,
-                      &ConfigFormEntry->AuthConfigData
-                      );
-      if (EFI_ERROR (Status)) {
-        ZeroMem (&ConfigFormEntry->AuthConfigData, sizeof (ConfigFormEntry->AuthConfigData));
-      }
-      //
-      // Compose the Port string and create a new EFI_STRING_ID.
-      //
-      UnicodeSPrint (PortString, sizeof (PortString), L"Port %s", ConfigFormEntry->MacString);
-      ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL);
-
-      //
-      // Compose the help string of this port and create a new EFI_STRING_ID.
-      //
-      UnicodeSPrint (PortString, sizeof (PortString), L"Set the iSCSI parameters on port %s", ConfigFormEntry->MacString);
-      ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL);
-
-      InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link);
-      mNumberOfIScsiDevices++;
-    }
-  } else {
-    ASSERT (EntryExisted);
-
-    mNumberOfIScsiDevices--;
-    RemoveEntryList (&ConfigFormEntry->Link);
-    FreePool (ConfigFormEntry);
-    mCallbackInfo->Current = NULL;
-  }
-  //
-  // Allocate space for creation of Buffer
-  //
-
-  //
-  // Init OpCode Handle
-  //
-  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
-  ASSERT (StartOpCodeHandle != NULL);
-
-  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
-  ASSERT (EndOpCodeHandle != NULL);
-
-  //
-  // Create Hii Extend Label OpCode as the start opcode
-  //
-  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
-  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
-  StartLabel->Number       = DEVICE_ENTRY_LABEL;
-
-  //
-  // Create Hii Extend Label OpCode as the end opcode
-  //
-  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
-  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
-  EndLabel->Number       = LABEL_END;
-
-  FormIndex = 0;
-  NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
-    ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link);
-
-    HiiCreateGotoOpCode (
-      StartOpCodeHandle,                            // Container for dynamic created opcodes
-      FORMID_DEVICE_FORM,                           // Target Form ID
-      ConfigFormEntry->PortTitleToken,              // Prompt text
-      ConfigFormEntry->PortTitleHelpToken,          // Help text
-      EFI_IFR_FLAG_CALLBACK,                        // Question flag
-      (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex)   // Question ID
-      );
-
-    FormIndex++;
-  }
-
-  HiiUpdateForm (
-    mCallbackInfo->RegisteredHandle,
-    &gIp4IScsiConfigGuid,
-    FORMID_MAIN_FORM,
-    StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL
-    EndOpCodeHandle    // LABEL_END
-    );
-
-  HiiFreeOpCodeHandle (StartOpCodeHandle);
-  HiiFreeOpCodeHandle (EndOpCodeHandle);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Initialize the iSCSI configuration form.
-
-  @param[in]  DriverBindingHandle  The iSCSI driverbinding handle.
-
-  @retval EFI_SUCCESS              The iSCSI configuration form is initialized.
-  @retval EFI_OUT_OF_RESOURCES     Failed to allocate memory.
-  @retval Others                   Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConfigFormInit (
-  VOID
-  )
-{
-  EFI_STATUS                  Status;
-  EFI_HII_DATABASE_PROTOCOL   *HiiDatabase;
-  ISCSI_FORM_CALLBACK_INFO    *CallbackInfo;
-
-  Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **)&HiiDatabase);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof (ISCSI_FORM_CALLBACK_INFO));
-  if (CallbackInfo == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  CallbackInfo->Signature   = ISCSI_FORM_CALLBACK_INFO_SIGNATURE;
-  CallbackInfo->HiiDatabase = HiiDatabase;
-  CallbackInfo->Current     = NULL;
-
-  CallbackInfo->ConfigAccess.ExtractConfig = IScsiFormExtractConfig;
-  CallbackInfo->ConfigAccess.RouteConfig = IScsiFormRouteConfig;
-  CallbackInfo->ConfigAccess.Callback = IScsiFormCallback;
-
-  Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **)&CallbackInfo->ConfigRouting);
-  if (EFI_ERROR (Status)) {
-    FreePool(CallbackInfo);
-    return Status;
-  }
-
-  //
-  // Install Device Path Protocol and Config Access protocol to driver handle
-  //
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &CallbackInfo->DriverHandle,
-                  &gEfiDevicePathProtocolGuid,
-                  &mIScsiHiiVendorDevicePath,
-                  &gEfiHiiConfigAccessProtocolGuid,
-                  &CallbackInfo->ConfigAccess,
-                  NULL
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-  //
-  // Publish our HII data
-  //
-  CallbackInfo->RegisteredHandle = HiiAddPackages (
-                                     &gIp4IScsiConfigGuid,
-                                     CallbackInfo->DriverHandle,
-                                     IScsi4DxeStrings,
-                                     IScsiConfigDxeBin,
-                                     NULL
-                                     );
-  if (CallbackInfo->RegisteredHandle == NULL) {
-    FreePool(CallbackInfo);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  mCallbackInfo = CallbackInfo;
-
-  return Status;
-}
-
-/**
-  Unload the iSCSI configuration form, this includes: delete all the iSCSI
-  device configuration entries, uninstall the form callback protocol and
-  free the resources used.
-
-  @param[in]  DriverBindingHandle The iSCSI driverbinding handle.
-
-  @retval EFI_SUCCESS             The iSCSI configuration form is unloaded.
-  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
-**/
-EFI_STATUS
-IScsiConfigFormUnload (
-  IN EFI_HANDLE  DriverBindingHandle
-  )
-{
-  ISCSI_CONFIG_FORM_ENTRY     *ConfigFormEntry;
-
-  while (!IsListEmpty (&mIScsiConfigFormList)) {
-    //
-    // Uninstall the device forms as the iSCSI driver instance may fail to
-    // control the controller but still install the device configuration form.
-    // In such case, upon driver unloading, the driver instance's driverbinding.
-    // stop () won't be called, so we have to take this chance here to uninstall
-    // the device form.
-    //
-    ConfigFormEntry = NET_LIST_USER_STRUCT (mIScsiConfigFormList.ForwardLink, ISCSI_CONFIG_FORM_ENTRY, Link);
-    IScsiConfigUpdateForm (DriverBindingHandle, ConfigFormEntry->Controller, FALSE);
-  }
-
-  //
-  // Remove HII package list
-  //
-  mCallbackInfo->HiiDatabase->RemovePackageList (
-                                mCallbackInfo->HiiDatabase,
-                                mCallbackInfo->RegisteredHandle
-                                );
-
-  //
-  // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL
-  //
-  gBS->UninstallMultipleProtocolInterfaces (
-         mCallbackInfo->DriverHandle,
-         &gEfiDevicePathProtocolGuid,
-         &mIScsiHiiVendorDevicePath,
-         &gEfiHiiConfigAccessProtocolGuid,
-         &mCallbackInfo->ConfigAccess,
-         NULL
-         );
-  FreePool (mCallbackInfo);
-
-  return EFI_SUCCESS;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
deleted file mode 100644
index 6a876c8b69dd..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
+++ /dev/null
@@ -1,472 +0,0 @@
-/** @file
-  iSCSI DHCP related configuration routines.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-
-/**
-  Extract the Root Path option and get the required target information.
-
-  @param[in]        RootPath         The RootPath.
-  @param[in]        Length           Length of the RootPath option payload.
-  @param[in, out]   ConfigNvData     The iSCSI session configuration data read from nonvolatile device.
-
-  @retval EFI_SUCCESS           All required information is extracted from the RootPath option.
-  @retval EFI_NOT_FOUND         The RootPath is not an iSCSI RootPath.
-  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
-  @retval EFI_INVALID_PARAMETER The RootPath is mal-formatted.
-**/
-EFI_STATUS
-IScsiDhcpExtractRootPath (
-  IN      CHAR8                        *RootPath,
-  IN      UINT8                        Length,
-  IN OUT  ISCSI_SESSION_CONFIG_NVDATA  *ConfigNvData
-  )
-{
-  EFI_STATUS            Status;
-  UINT8                 IScsiRootPathIdLen;
-  CHAR8                 *TmpStr;
-  ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];
-  ISCSI_ROOT_PATH_FIELD *Field;
-  UINT32                FieldIndex;
-  UINT8                 Index;
-
-  //
-  // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
-  //
-  IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID);
-
-  if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) {
-    return EFI_NOT_FOUND;
-  }
-  //
-  // Skip the iSCSI RootPath ID "iscsi:".
-  //
-  RootPath += IScsiRootPathIdLen;
-  Length  = (UINT8) (Length - IScsiRootPathIdLen);
-
-  TmpStr  = (CHAR8 *) AllocatePool (Length + 1);
-  if (TmpStr == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  CopyMem (TmpStr, RootPath, Length);
-  TmpStr[Length]  = '\0';
-
-  Index           = 0;
-  FieldIndex      = RP_FIELD_IDX_SERVERNAME;
-  ZeroMem (&Fields[0], sizeof (Fields));
-
-  //
-  // Extract the fields in the Root Path option string.
-  //
-  for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex < RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) {
-    if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) {
-      Fields[FieldIndex].Str = &TmpStr[Index];
-    }
-
-    while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) {
-      Index++;
-    }
-
-    if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) {
-      if (FieldIndex != RP_FIELD_IDX_TARGETNAME) {
-        TmpStr[Index] = '\0';
-        Index++;
-      }
-
-      if (Fields[FieldIndex].Str != NULL) {
-        Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str);
-      }
-    }
-  }
-
-  if (FieldIndex != RP_FIELD_IDX_MAX) {
-    Status = EFI_INVALID_PARAMETER;
-    goto ON_EXIT;
-  }
-
-    if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) ||
-      (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) ||
-      (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1)
-      ) {
-
-    Status = EFI_INVALID_PARAMETER;
-    goto ON_EXIT;
-  }
-  //
-  // Get the IP address of the target.
-  //
-  Field   = &Fields[RP_FIELD_IDX_SERVERNAME];
-  Status  = IScsiAsciiStrToIp (Field->Str, &ConfigNvData->TargetIp);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-  //
-  // Check the protocol type.
-  //
-  Field = &Fields[RP_FIELD_IDX_PROTOCOL];
-  if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) {
-    Status = EFI_INVALID_PARAMETER;
-    goto ON_EXIT;
-  }
-  //
-  // Get the port of the iSCSI target.
-  //
-  Field = &Fields[RP_FIELD_IDX_PORT];
-  if (Field->Str != NULL) {
-    ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str);
-  } else {
-    ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
-  }
-  //
-  // Get the LUN.
-  //
-  Field = &Fields[RP_FIELD_IDX_LUN];
-  if (Field->Str != NULL) {
-    Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun);
-    if (EFI_ERROR (Status)) {
-      goto ON_EXIT;
-    }
-  } else {
-    ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun));
-  }
-  //
-  // Get the target iSCSI Name.
-  //
-  Field = &Fields[RP_FIELD_IDX_TARGETNAME];
-
-  if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) {
-    Status = EFI_INVALID_PARAMETER;
-    goto ON_EXIT;
-  }
-  //
-  // Validate the iSCSI name.
-  //
-  Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str));
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field->Str);
-
-ON_EXIT:
-
-  FreePool (TmpStr);
-
-  return Status;
-}
-
-/**
-  The callback function registerd to the DHCP4 instance which is used to select
-  the qualified DHCP OFFER.
-
-  @param[in]  This         The DHCP4 protocol.
-  @param[in]  Context      The context set when configuring the DHCP4 protocol.
-  @param[in]  CurrentState The current state of the DHCP4 protocol.
-  @param[in]  Dhcp4Event   The event occurs in the current state.
-  @param[in]  Packet       The DHCP packet that is to be sent or already received.
-  @param[out] NewPacket    The packet used to replace the above Packet.
-
-  @retval EFI_SUCCESS      Either the DHCP OFFER is qualified or we're not intereseted
-                           in the Dhcp4Event.
-  @retval EFI_NOT_READY    The DHCP OFFER packet doesn't match our requirements.
-  @retval Others           Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDhcpSelectOffer (
-  IN  EFI_DHCP4_PROTOCOL  * This,
-  IN  VOID                *Context,
-  IN  EFI_DHCP4_STATE     CurrentState,
-  IN  EFI_DHCP4_EVENT     Dhcp4Event,
-  IN  EFI_DHCP4_PACKET    * Packet, OPTIONAL
-  OUT EFI_DHCP4_PACKET    **NewPacket OPTIONAL
-  )
-{
-  EFI_STATUS              Status;
-  UINT32                  OptionCount;
-  EFI_DHCP4_PACKET_OPTION **OptionList;
-  UINT32                  Index;
-
-  if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer)) {
-    return EFI_SUCCESS;
-  }
-
-  OptionCount = 0;
-
-  Status      = This->Parse (This, Packet, &OptionCount, NULL);
-  if (Status != EFI_BUFFER_TOO_SMALL) {
-    return EFI_NOT_READY;
-  }
-
-  OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *));
-  if (OptionList == NULL) {
-    return EFI_NOT_READY;
-  }
-
-  Status = This->Parse (This, Packet, &OptionCount, OptionList);
-  if (EFI_ERROR (Status)) {
-    FreePool (OptionList);
-    return EFI_NOT_READY;
-  }
-
-  for (Index = 0; Index < OptionCount; Index++) {
-    if (OptionList[Index]->OpCode != DHCP4_TAG_ROOTPATH) {
-      continue;
-    }
-
-    Status = IScsiDhcpExtractRootPath (
-              (CHAR8 *) &OptionList[Index]->Data[0],
-              OptionList[Index]->Length,
-              (ISCSI_SESSION_CONFIG_NVDATA *) Context
-              );
-
-    break;
-  }
-
-  if (Index == OptionCount) {
-    Status = EFI_NOT_READY;
-  }
-
-  FreePool (OptionList);
-
-  return Status;
-}
-
-/**
-  Parse the DHCP ACK to get the address configuration and DNS information.
-
-  @param[in]       Dhcp4        The DHCP4 protocol.
-  @param[in, out]  ConfigData   The session configuration data.
-
-  @retval EFI_SUCCESS           The DNS information is got from the DHCP ACK.
-  @retval EFI_NO_MAPPING        DHCP failed to acquire address and other information.
-  @retval EFI_INVALID_PARAMETER The DHCP ACK's DNS option is mal-formatted.
-  @retval EFI_DEVICE_ERROR      Other errors as indicated.
-**/
-EFI_STATUS
-IScsiParseDhcpAck (
-  IN      EFI_DHCP4_PROTOCOL         *Dhcp4,
-  IN OUT  ISCSI_SESSION_CONFIG_DATA  *ConfigData
-  )
-{
-  EFI_STATUS              Status;
-  EFI_DHCP4_MODE_DATA     Dhcp4ModeData;
-  UINT32                  OptionCount;
-  EFI_DHCP4_PACKET_OPTION **OptionList;
-  UINT32                  Index;
-
-  Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  if (Dhcp4ModeData.State != Dhcp4Bound) {
-    return EFI_NO_MAPPING;
-  }
-
-  CopyMem (&ConfigData->NvData.LocalIp, &Dhcp4ModeData.ClientAddress, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&ConfigData->NvData.SubnetMask, &Dhcp4ModeData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&ConfigData->NvData.Gateway, &Dhcp4ModeData.RouterAddress, sizeof (EFI_IPv4_ADDRESS));
-
-  OptionCount = 0;
-  OptionList  = NULL;
-
-  Status      = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList);
-  if (Status != EFI_BUFFER_TOO_SMALL) {
-    return EFI_DEVICE_ERROR;
-  }
-
-  OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *));
-  if (OptionList == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList);
-  if (EFI_ERROR (Status)) {
-    FreePool (OptionList);
-    return EFI_DEVICE_ERROR;
-  }
-
-  for (Index = 0; Index < OptionCount; Index++) {
-    //
-    // Get DNS server addresses and DHCP server address from this offer.
-    //
-    if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
-
-      if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) {
-        Status = EFI_INVALID_PARAMETER;
-        break;
-      }
-      //
-      // Primary DNS server address.
-      //
-      CopyMem (&ConfigData->PrimaryDns, &OptionList[Index]->Data[0], sizeof (EFI_IPv4_ADDRESS));
-
-      if (OptionList[Index]->Length > 4) {
-        //
-        // Secondary DNS server address
-        //
-        CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[4], sizeof (EFI_IPv4_ADDRESS));
-      }
-    } else if (OptionList[Index]->OpCode == DHCP4_TAG_SERVER_ID) {
-      if (OptionList[Index]->Length != 4) {
-        Status = EFI_INVALID_PARAMETER;
-        break;
-      }
-
-      CopyMem (&ConfigData->DhcpServer, &OptionList[Index]->Data[0], sizeof (EFI_IPv4_ADDRESS));
-    }
-  }
-
-  FreePool (OptionList);
-
-  return Status;
-}
-
-/**
-  Parse the DHCP ACK to get the address configuration and DNS information.
-
-  @param[in]       Image            The handle of the driver image.
-  @param[in]       Controller       The handle of the controller;
-  @param[in, out]  ConfigData       The session configuration data.
-
-  @retval EFI_SUCCESS           The DNS information is got from the DHCP ACK.
-  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
-  @retval EFI_NO_MEDIA          There was a media error.
-  @retval Others                Other errors as indicated.
-
-**/
-EFI_STATUS
-IScsiDoDhcp (
-  IN     EFI_HANDLE                 Image,
-  IN     EFI_HANDLE                 Controller,
-  IN OUT ISCSI_SESSION_CONFIG_DATA  *ConfigData
-  )
-{
-  EFI_HANDLE              Dhcp4Handle;
-  EFI_DHCP4_PROTOCOL      *Dhcp4;
-  EFI_STATUS              Status;
-  EFI_DHCP4_PACKET_OPTION *ParaList;
-  EFI_DHCP4_CONFIG_DATA   Dhcp4ConfigData;
-  EFI_STATUS              MediaStatus;
-  UINT8                   *Data;
-
-  Dhcp4Handle = NULL;
-  Dhcp4       = NULL;
-  ParaList    = NULL;
-
-  //
-  // Check media status before do DHCP
-  //
-  MediaStatus = EFI_SUCCESS;
-  NetLibDetectMediaWaitTimeout (Controller, ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus);
-  if (MediaStatus != EFI_SUCCESS) {
-    return EFI_NO_MEDIA;
-  }
-
-  //
-  // Create a DHCP4 child instance and get the protocol.
-  //
-  Status = NetLibCreateServiceChild (
-            Controller,
-            Image,
-            &gEfiDhcp4ServiceBindingProtocolGuid,
-            &Dhcp4Handle
-            );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = gBS->OpenProtocol (
-                  Dhcp4Handle,
-                  &gEfiDhcp4ProtocolGuid,
-                  (VOID **)&Dhcp4,
-                  Image,
-                  Controller,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3);
-  if (ParaList == NULL) {
-    Status = EFI_OUT_OF_RESOURCES;
-    goto ON_EXIT;
-  }
-  //
-  // Ask the server to reply with Netmask, Router, DNS and RootPath options.
-  //
-  ParaList->OpCode  = DHCP4_TAG_PARA_LIST;
-  ParaList->Length  = (UINT8) (ConfigData->NvData.TargetInfoFromDhcp ? 4 : 3);
-  Data = &ParaList->Data[0];
-  Data[0] = DHCP4_TAG_NETMASK;
-  Data[1] = DHCP4_TAG_ROUTER;
-  Data[2] = DHCP4_TAG_DNS_SERVER;
-  Data[3] = DHCP4_TAG_ROOTPATH;
-
-  ZeroMem (&Dhcp4ConfigData, sizeof (EFI_DHCP4_CONFIG_DATA));
-  Dhcp4ConfigData.OptionCount = 1;
-  Dhcp4ConfigData.OptionList  = &ParaList;
-
-  if (ConfigData->NvData.TargetInfoFromDhcp) {
-    //
-    // Use callback to select an offer which contains target information.
-    //
-    Dhcp4ConfigData.Dhcp4Callback   = IScsiDhcpSelectOffer;
-    Dhcp4ConfigData.CallbackContext = &ConfigData->NvData;
-  }
-
-  Status = Dhcp4->Configure (Dhcp4, &Dhcp4ConfigData);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  Status = Dhcp4->Start (Dhcp4, NULL);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-  //
-  // Parse the ACK to get required information.
-  //
-  Status = IScsiParseDhcpAck (Dhcp4, ConfigData);
-
-ON_EXIT:
-
-  if (ParaList != NULL) {
-    FreePool (ParaList);
-  }
-
-  if (Dhcp4 != NULL) {
-    Dhcp4->Stop (Dhcp4);
-    Dhcp4->Configure (Dhcp4, NULL);
-
-    gBS->CloseProtocol (
-          Dhcp4Handle,
-          &gEfiDhcp4ProtocolGuid,
-          Image,
-          Controller
-          );
-  }
-
-  NetLibDestroyServiceChild (
-    Controller,
-    Image,
-    &gEfiDhcp4ServiceBindingProtocolGuid,
-    Dhcp4Handle
-    );
-
-  return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
deleted file mode 100644
index 730f3e506bbc..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
+++ /dev/null
@@ -1,676 +0,0 @@
-/** @file
-  The entry point of IScsi driver.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-
-EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = {
-  IScsiDriverBindingSupported,
-  IScsiDriverBindingStart,
-  IScsiDriverBindingStop,
-  0xa,
-  NULL,
-  NULL
-};
-
-/**
-  Tests to see if this driver supports the RemainingDevicePath.
-
-  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a device path.  This
-                                   parameter is ignored by device drivers, and is optional for bus
-                                   drivers. For bus drivers, if this parameter is not NULL, then
-                                   the bus driver must determine if the bus controller specified
-                                   by ControllerHandle and the child controller specified
-                                   by RemainingDevicePath are both supported by this
-                                   bus driver.
-
-  @retval EFI_SUCCESS              The RemainingDevicePath is supported or NULL.
-  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle and
-                                   RemainingDevicePath is not supported by the driver specified by This.
-**/
-EFI_STATUS
-IScsiIsDevicePathSupported (
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
-  )
-{
-  EFI_DEVICE_PATH_PROTOCOL  *CurrentDevicePath;
-
-  CurrentDevicePath = RemainingDevicePath;
-  if (CurrentDevicePath != NULL) {
-    while (!IsDevicePathEnd (CurrentDevicePath)) {
-      if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) && (CurrentDevicePath->SubType == MSG_ISCSI_DP)) {
-        return EFI_SUCCESS;
-      }
-
-      CurrentDevicePath = NextDevicePathNode (CurrentDevicePath);
-    }
-
-    return EFI_UNSUPPORTED;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Tests to see if this driver supports a given controller. If a child device is provided,
-  it further tests to see if this driver supports creating a handle for the specified child device.
-
-  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param[in]  ControllerHandle     The handle of the controller to test. This handle
-                                   must support a protocol interface that supplies
-                                   an I/O abstraction to the driver.
-  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a device path.
-                                   This parameter is ignored by device drivers, and is optional for bus drivers.
-
-
-  @retval EFI_SUCCESS              The device specified by ControllerHandle and
-                                   RemainingDevicePath is supported by the driver specified by This.
-  @retval EFI_ALREADY_STARTED      The device specified by ControllerHandle and
-                                   RemainingDevicePath is already being managed by the driver
-                                   specified by This.
-  @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle and
-                                   RemainingDevicePath is already being managed by a different
-                                   driver or an application that requires exclusive acces.
-                                   Currently not implemented.
-  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle and
-                                   RemainingDevicePath is not supported by the driver specified by This.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
-  )
-{
-  EFI_STATUS                Status;
-
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  &gEfiCallerIdGuid,
-                  NULL,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
-                  );
-  if (!EFI_ERROR (Status)) {
-    return EFI_ALREADY_STARTED;
-  }
-
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  &gEfiTcp4ServiceBindingProtocolGuid,
-                  NULL,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-    return EFI_UNSUPPORTED;
-  }
-
-  Status = IScsiIsDevicePathSupported (RemainingDevicePath);
-  if (EFI_ERROR (Status)) {
-    return EFI_UNSUPPORTED;
-  }
-
-  if (IScsiDhcpIsConfigured (ControllerHandle)) {
-    Status = gBS->OpenProtocol (
-                    ControllerHandle,
-                    &gEfiDhcp4ServiceBindingProtocolGuid,
-                    NULL,
-                    This->DriverBindingHandle,
-                    ControllerHandle,
-                    EFI_OPEN_PROTOCOL_TEST_PROTOCOL
-                    );
-    if (EFI_ERROR (Status)) {
-      return EFI_UNSUPPORTED;
-    }
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Start this driver on ControllerHandle.
-
-  The Start() function is designed to be invoked from the EFI boot service ConnectController().
-  As a result, much of the error checking on the parameters to Start() has been moved into this
-  common boot service. It is legal to call Start() from other locations, but the following calling
-  restrictions must be followed or the system behavior will not be deterministic.
-  1. ControllerHandle must be a valid EFI_HANDLE.
-  2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned
-     EFI_DEVICE_PATH_PROTOCOL.
-  3. Prior to calling Start(), the Supported() function for the driver specified by This must
-     have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS.
-
-  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param[in]  ControllerHandle     The handle of the controller to start. This handle
-                                   must support a protocol interface that supplies
-                                   an I/O abstraction to the driver.
-  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a device path.
-                                   This parameter is ignored by device drivers, and is optional for bus drivers.
-
-  @retval EFI_SUCCESS              The device was started.
-  @retval EFI_DEVICE_ERROR         The device could not be started due to a device error.
-                                   Currently not implemented.
-  @retval EFI_OUT_OF_RESOURCES     The request could not be completed due to a lack of resources.
-  @retval Others                   The driver failded to start the device.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
-  )
-{
-  EFI_STATUS        Status;
-  ISCSI_DRIVER_DATA *Private;
-  VOID              *Interface;
-
-  Private = IScsiCreateDriverData (This->DriverBindingHandle, ControllerHandle);
-  if (Private == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  //
-  // Create a underlayer child instance, but not need to configure it. Just open ChildHandle
-  // via BY_DRIVER. That is, establishing the relationship between ControllerHandle and ChildHandle.
-  // Therefore, when DisconnectController(), especially VLAN virtual controller handle,
-  // IScsiDriverBindingStop() will be called.
-  //
-  Status = NetLibCreateServiceChild (
-             ControllerHandle,
-             This->DriverBindingHandle,
-             &gEfiTcp4ServiceBindingProtocolGuid,
-             &Private->ChildHandle
-             );
-
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = gBS->OpenProtocol (
-                  Private->ChildHandle,
-                  &gEfiTcp4ProtocolGuid,
-                  &Interface,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  //
-  // Always install private protocol no matter what happens later. We need to
-  // keep the relationship between ControllerHandle and ChildHandle.
-  //
-  Status = gBS->InstallProtocolInterface (
-                  &ControllerHandle,
-                  &gEfiCallerIdGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &Private->IScsiIdentifier
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  //
-  // Try to add a port configuration page for this controller.
-  //
-  IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle, TRUE);
-
-  //
-  // Get the iSCSI configuration data of this controller.
-  //
-  Status = IScsiGetConfigData (Private);
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-  //
-  // Try to login and create an iSCSI session according to the configuration.
-  //
-  Status = IScsiSessionLogin (Private);
-  if (Status == EFI_MEDIA_CHANGED) {
-    //
-    // The specified target is not available and the redirection information is
-    // got, login the session again with the updated target address.
-    //
-    Status = IScsiSessionLogin (Private);
-  }
-
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-  //
-  // Duplicate the Session's tcp connection device path. The source port field
-  // will be set to zero as one iSCSI session is comprised of several iSCSI
-  // connections.
-  //
-  Private->DevicePath = IScsiGetTcpConnDevicePath (Private);
-  if (Private->DevicePath == NULL) {
-    goto ON_ERROR;
-  }
-  //
-  // Install the updated device path onto the ExtScsiPassThruHandle.
-  //
-  Status = gBS->InstallProtocolInterface (
-                  &Private->ExtScsiPassThruHandle,
-                  &gEfiDevicePathProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  Private->DevicePath
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  //
-  // ISCSI children should share the default Tcp child, just open the default Tcp child via BY_CHILD_CONTROLLER.
-  //
-  Status = gBS->OpenProtocol (
-                  Private->ChildHandle, /// Default Tcp child
-                  &gEfiTcp4ProtocolGuid,
-                  &Interface,
-                  This->DriverBindingHandle,
-                  Private->ExtScsiPassThruHandle,
-                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
-                  );
-  if (EFI_ERROR (Status)) {
-    gBS->UninstallMultipleProtocolInterfaces (
-           Private->ExtScsiPassThruHandle,
-           &gEfiExtScsiPassThruProtocolGuid,
-           &Private->IScsiExtScsiPassThru,
-           &gEfiDevicePathProtocolGuid,
-           Private->DevicePath,
-           NULL
-           );
-
-    goto ON_ERROR;
-  }
-
-  //
-  // Update/Publish the iSCSI Boot Firmware Table.
-  //
-  IScsiPublishIbft ();
-
-  return EFI_SUCCESS;
-
-ON_ERROR:
-
-  IScsiSessionAbort (&Private->Session);
-
-  return Status;
-}
-
-/**
-  Stop this driver on ControllerHandle.
-
-  Release the control of this controller and remove the IScsi functions. The Stop()
-  function is designed to be invoked from the EFI boot service DisconnectController().
-  As a result, much of the error checking on the parameters to Stop() has been moved
-  into this common boot service. It is legal to call Stop() from other locations,
-  but the following calling restrictions must be followed or the system behavior will not be deterministic.
-  1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this
-     same driver's Start() function.
-  2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid
-     EFI_HANDLE. In addition, all of these handles must have been created in this driver's
-     Start() function, and the Start() function must have called OpenProtocol() on
-     ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
-
-  @param[in]  This              A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param[in]  ControllerHandle  A handle to the device being stopped. The handle must
-                                support a bus specific I/O protocol for the driver
-                                to use to stop the device.
-  @param[in]  NumberOfChildren  The number of child device handles in ChildHandleBuffer.Not used.
-  @param[in]  ChildHandleBuffer An array of child handles to be freed. May be NULL
-                                if NumberOfChildren is 0.Not used.
-
-  @retval EFI_SUCCESS           The device was stopped.
-  @retval EFI_DEVICE_ERROR      The device could not be stopped due to a device error.
-  @retval EFI_INVALID_PARAMETER Child handle is NULL.
-  @retval EFI_ACCESS_DENIED     The protocol could not be removed from the Handle
-                                because its interfaces are being used.
-
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingStop (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN UINTN                        NumberOfChildren,
-  IN EFI_HANDLE                   *ChildHandleBuffer OPTIONAL
-  )
-{
-  EFI_HANDLE                      IScsiController;
-  EFI_STATUS                      Status;
-  ISCSI_PRIVATE_PROTOCOL          *IScsiIdentifier;
-  ISCSI_DRIVER_DATA               *Private;
-  EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;
-  ISCSI_CONNECTION                *Conn;
-
-  if (NumberOfChildren != 0) {
-    //
-    // We should have only one child.
-    //
-    Status = gBS->OpenProtocol (
-                    ChildHandleBuffer[0],
-                    &gEfiExtScsiPassThruProtocolGuid,
-                    (VOID **) &PassThru,
-                    This->DriverBindingHandle,
-                    ControllerHandle,
-                    EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                    );
-    if (EFI_ERROR (Status)) {
-      return EFI_DEVICE_ERROR;
-    }
-
-    Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
-    Conn    = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION, Link);
-
-    //
-    // Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just close
-    // the protocol here but not uninstall the device path protocol and
-    // EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle.
-    //
-    gBS->CloseProtocol (
-           Private->ChildHandle,
-           &gEfiTcp4ProtocolGuid,
-           Private->Image,
-           Private->ExtScsiPassThruHandle
-           );
-
-    gBS->CloseProtocol (
-          Conn->Tcp4Io.Handle,
-          &gEfiTcp4ProtocolGuid,
-          Private->Image,
-          Private->ExtScsiPassThruHandle
-          );
-
-    return EFI_SUCCESS;
-  }
-  //
-  // Get the handle of the controller we are controling.
-  //
-  IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid);
-
-  Status = gBS->OpenProtocol (
-                  IScsiController,
-                  &gEfiCallerIdGuid,
-                  (VOID **)&IScsiIdentifier,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-    return EFI_DEVICE_ERROR;
-  }
-
-  Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
-
-  if (Private->ChildHandle != NULL) {
-    Status = gBS->CloseProtocol (
-                    Private->ChildHandle,
-                    &gEfiTcp4ProtocolGuid,
-                    This->DriverBindingHandle,
-                    IScsiController
-                    );
-
-    ASSERT (!EFI_ERROR (Status));
-
-    Status = NetLibDestroyServiceChild (
-               IScsiController,
-               This->DriverBindingHandle,
-               &gEfiTcp4ServiceBindingProtocolGuid,
-               Private->ChildHandle
-               );
-    ASSERT (!EFI_ERROR (Status));
-  }
-
-  IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, FALSE);
-
-  //
-  // Uninstall the private protocol.
-  //
-  gBS->UninstallProtocolInterface (
-        IScsiController,
-        &gEfiCallerIdGuid,
-        &Private->IScsiIdentifier
-        );
-
-  //
-  // Update the iSCSI Boot Firware Table.
-  //
-  IScsiPublishIbft ();
-
-  IScsiSessionAbort (&Private->Session);
-  Status = IScsiCleanDriverData (Private);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Unloads an image(the iSCSI driver).
-
-  @param[in]  ImageHandle       Handle that identifies the image to be unloaded.
-
-  @retval EFI_SUCCESS           The image has been unloaded.
-  @retval Others                Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-EfiIScsiUnload (
-  IN EFI_HANDLE  ImageHandle
-  )
-{
-  EFI_STATUS                        Status;
-  UINTN                             DeviceHandleCount;
-  EFI_HANDLE                        *DeviceHandleBuffer;
-  UINTN                             Index;
-  EFI_COMPONENT_NAME_PROTOCOL       *ComponentName;
-  EFI_COMPONENT_NAME2_PROTOCOL      *ComponentName2;
-
-  //
-  // Try to disonnect the driver from the devices it's controlling.
-  //
-  Status = gBS->LocateHandleBuffer (
-                  AllHandles,
-                  NULL,
-                  NULL,
-                  &DeviceHandleCount,
-                  &DeviceHandleBuffer
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  for (Index = 0; Index < DeviceHandleCount; Index++) {
-    Status = IScsiTestManagedDevice (
-               DeviceHandleBuffer[Index],
-               gIScsiDriverBinding.DriverBindingHandle,
-               &gEfiTcp4ProtocolGuid
-               );
-    if (EFI_ERROR (Status)) {
-      continue;
-    }
-    Status = gBS->DisconnectController (
-                    DeviceHandleBuffer[Index],
-                    gIScsiDriverBinding.DriverBindingHandle,
-                    NULL
-                    );
-    if (EFI_ERROR (Status)) {
-      goto ON_EXIT;
-    }
-  }
-
-  //
-  // Unload the iSCSI configuration form.
-  //
-  Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  //
-  // Uninstall the ComponentName and ComponentName2 protocol from iSCSI4 driver binding handle
-  // if it has been installed.
-  //
-  Status = gBS->HandleProtocol (
-                  gIScsiDriverBinding.DriverBindingHandle,
-                  &gEfiComponentNameProtocolGuid,
-                  (VOID **) &ComponentName
-                  );
-  if (!EFI_ERROR (Status)) {
-    Status = gBS->UninstallMultipleProtocolInterfaces (
-           gIScsiDriverBinding.DriverBindingHandle,
-           &gEfiComponentNameProtocolGuid,
-           ComponentName,
-           NULL
-           );
-    if (EFI_ERROR (Status)) {
-      goto ON_EXIT;
-    }
-  }
-
-  Status = gBS->HandleProtocol (
-                  gIScsiDriverBinding.DriverBindingHandle,
-                  &gEfiComponentName2ProtocolGuid,
-                  (VOID **) &ComponentName2
-                  );
-  if (!EFI_ERROR (Status)) {
-    gBS->UninstallMultipleProtocolInterfaces (
-           gIScsiDriverBinding.DriverBindingHandle,
-           &gEfiComponentName2ProtocolGuid,
-           ComponentName2,
-           NULL
-           );
-    if (EFI_ERROR (Status)) {
-      goto ON_EXIT;
-    }
-  }
-
-  Status = gBS->UninstallMultipleProtocolInterfaces (
-                  ImageHandle,
-                  &gEfiDriverBindingProtocolGuid,
-                  &gIScsiDriverBinding,
-                  &gEfiIScsiInitiatorNameProtocolGuid,
-                  &gIScsiInitiatorName,
-                  NULL
-                  );
-ON_EXIT:
-
-  if (DeviceHandleBuffer != NULL) {
-    FreePool (DeviceHandleBuffer);
-  }
-
-  return Status;
-}
-
-/**
-  This is the declaration of an EFI image entry point. This entry point is
-  the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
-  both device drivers and bus drivers. It initialize the global variables and
-  publish the driver binding protocol.
-
-  @param[in]   ImageHandle      The firmware allocated handle for the UEFI image.
-  @param[in]   SystemTable      A pointer to the EFI System Table.
-
-  @retval EFI_SUCCESS           The operation completed successfully.
-  @retval EFI_ACCESS_DENIED     EFI_ISCSI_INITIATOR_NAME_PROTOCOL was installed unexpectedly.
-  @retval Others                Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverEntryPoint (
-  IN EFI_HANDLE         ImageHandle,
-  IN EFI_SYSTEM_TABLE   *SystemTable
-  )
-{
-  EFI_STATUS                         Status;
-  EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *IScsiInitiatorName;
-
-  //
-  // There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL.
-  //
-  Status = gBS->LocateProtocol (
-                   &gEfiIScsiInitiatorNameProtocolGuid,
-                   NULL,
-                   (VOID**) &IScsiInitiatorName
-                   );
-
-  if (!EFI_ERROR (Status)) {
-    return EFI_ACCESS_DENIED;
-  }
-
-  //
-  // Initialize the EFI Driver Library
-  //
-  Status = EfiLibInstallDriverBindingComponentName2 (
-             ImageHandle,
-             SystemTable,
-             &gIScsiDriverBinding,
-             ImageHandle,
-             &gIScsiComponentName,
-             &gIScsiComponentName2
-           );
-
-  if (!EFI_ERROR (Status)) {
-    //
-    // Install the iSCSI Initiator Name Protocol.
-    //
-    Status = gBS->InstallProtocolInterface (
-                    &ImageHandle,
-                    &gEfiIScsiInitiatorNameProtocolGuid,
-                    EFI_NATIVE_INTERFACE,
-                    &gIScsiInitiatorName
-                    );
-    if (EFI_ERROR (Status)) {
-      gBS->UninstallMultipleProtocolInterfaces (
-            ImageHandle,
-            &gEfiDriverBindingProtocolGuid,
-            &gIScsiDriverBinding,
-            &gEfiComponentName2ProtocolGuid,
-            &gIScsiComponentName2,
-            &gEfiComponentNameProtocolGuid,
-            &gIScsiComponentName,
-            NULL
-            );
-      return Status;
-    }
-
-    //
-    // Initialize the configuration form of iSCSI.
-    //
-    Status = IScsiConfigFormInit ();
-    if (EFI_ERROR (Status)) {
-      gBS->UninstallMultipleProtocolInterfaces (
-            ImageHandle,
-            &gEfiDriverBindingProtocolGuid,
-            &gIScsiDriverBinding,
-            &gEfiComponentName2ProtocolGuid,
-            &gIScsiComponentName2,
-            &gEfiComponentNameProtocolGuid,
-            &gIScsiComponentName,
-            &gEfiIScsiInitiatorNameProtocolGuid,
-            &gIScsiInitiatorName,
-            NULL
-            );
-    }
-  }
-  return Status;
-}
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
deleted file mode 100644
index db2d6d19366e..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
+++ /dev/null
@@ -1,412 +0,0 @@
-/** @file
-  The IScsi's EFI_EXT_SCSI_PASS_THRU_PROTOCOL driver.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-
-/**
-  Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel. This function
-  supports both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the
-  nonblocking I/O functionality is optional.
-
-  @param[in]      This    A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
-  @param[in]      Target  The Target is an array of size TARGET_MAX_BYTES and it represents
-                          the id of the SCSI device to send the SCSI Request Packet. Each
-                          transport driver may chose to utilize a subset of this size to suit the needs
-                          of transport target representation. For example, a Fibre Channel driver
-                          may use only 8 bytes (WWN) to represent an FC target.
-  @param[in]       Lun    The LUN of the SCSI device to send the SCSI Request Packet.
-  @param[in, out]  Packet A pointer to the SCSI Request Packet to send to the SCSI device
-                          specified by Target and Lun.
-  @param[in]       Event  If nonblocking I/O is not supported then Event is ignored, and blocking
-                          I/O is performed. If Event is NULL, then blocking I/O is performed. If
-                          Event is not NULL and non blocking I/O is supported, then
-                          nonblocking I/O is performed, and Event will be signaled when the
-                          SCSI Request Packet completes.
-
-  @retval EFI_SUCCESS           The SCSI Request Packet was sent by the host. For bi-directional
-                                commands, InTransferLength bytes were transferred from
-                                InDataBuffer. For write and bi-directional commands,
-                                OutTransferLength bytes were transferred by
-                                OutDataBuffer.
-  @retval EFI_BAD_BUFFER_SIZE   The SCSI Request Packet was not executed. The number of bytes that
-                                could be transferred is returned in InTransferLength. For write
-                                and bi-directional commands, OutTransferLength bytes were
-                                transferred by OutDataBuffer. Currently not implemeted.
-  @retval EFI_NOT_READY         The SCSI Request Packet could not be sent because there are too many
-                                SCSI Request Packets already queued. The caller may retry again later.
-  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to send the SCSI Request
-                                Packet.
-  @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of ScsiRequestPacket are invalid.
-  @retval EFI_UNSUPPORTED       The command described by the SCSI Request Packet is not supported
-                                by the host adapter. This includes the case of Bi-directional SCSI
-                                commands not supported by the implementation. The SCSI Request
-                                Packet was not sent, so no additional status information is available.
-                                Currently not implemeted.
-  @retval EFI_TIMEOUT           A timeout occurred while waiting for the SCSI Request Packet to execute.
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruFunction (
-  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                          *This,
-  IN UINT8                                                    *Target,
-  IN UINT64                                                   Lun,
-  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET           *Packet,
-  IN EFI_EVENT                                                Event     OPTIONAL
-  )
-{
-  ISCSI_DRIVER_DATA           *Private;
-  ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
-  EFI_STATUS                  Status;
-
-  Private       = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
-  ConfigNvData  = &Private->Session.ConfigData.NvData;
-
-  if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if ((Packet == NULL) || (Packet->Cdb == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
-  if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) {
-    //
-    // Try to reinstate the session and re-execute the Scsi command.
-    //
-    if (EFI_ERROR (IScsiSessionReinstatement (Private))) {
-      return EFI_DEVICE_ERROR;
-    }
-
-    Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
-  }
-
-  return Status;
-}
-
-/**
-  Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on a SCSI channel. These
-  can either be the list SCSI devices that are actually present on the SCSI channel, or the list of legal
-  Target Ids and LUNs for the SCSI channel. Regardless, the caller of this function must probe the
-  Target ID and LUN returned to see if a SCSI device is actually present at that location on the SCSI
-  channel.
-
-  @param[in]       This    A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
-  @param[in, out]  Target  On input, a pointer to the Target ID (an array of size
-                           TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel.
-                           On output, a pointer to the Target ID (an array of
-                           TARGET_MAX_BYTES) of the next SCSI device present on a SCSI
-                           channel. An input value of 0xF(all bytes in the array are 0xF) in the
-                           Target array retrieves the Target ID of the first SCSI device present on a
-                           SCSI channel.
-  @param[in, out]  Lun     On input, a pointer to the LUN of a SCSI device present on the SCSI
-                           channel. On output, a pointer to the LUN of the next SCSI device present
-                           on a SCSI channel.
-
-  @retval EFI_SUCCESS           The Target ID and LUN of the next SCSI device on the SCSI
-                                channel was returned in Target and Lun.
-  @retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target and Lun were
-                                not returned on a previous call to GetNextTargetLun().
-  @retval EFI_NOT_FOUND         There are no more SCSI devices on this SCSI channel.
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruGetNextTargetLun (
-  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This,
-  IN OUT UINT8                        **Target,
-  IN OUT UINT64                       *Lun
-  )
-{
-  ISCSI_DRIVER_DATA           *Private;
-  ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
-  UINT8                       TargetId[TARGET_MAX_BYTES];
-
-  Private       = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
-  ConfigNvData  = &Private->Session.ConfigData.NvData;
-
-  if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)) == 0)) {
-    //
-    // Only one <Target, Lun> pair per iSCSI Driver instance.
-    //
-    return EFI_NOT_FOUND;
-  }
-
-  SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
-  if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
-    (*Target)[0] = 0;
-    CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
-
-    return EFI_SUCCESS;
-  }
-
-  return EFI_INVALID_PARAMETER;
-}
-
-/**
-  Used to allocate and build a device path node for a SCSI device on a SCSI channel.
-
-  @param[in]      This        A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
-  @param[in]      Target      The Target is an array of size TARGET_MAX_BYTES and it specifies the
-                              Target ID of the SCSI device for which a device path node is to be
-                              allocated and built. Transport drivers may chose to utilize a subset of
-                              this size to suit the representation of targets. For example, a Fibre
-                              Channel driver may use only 8 bytes (WWN) in the array to represent a
-                              FC target.
-  @param[in]       Lun        The LUN of the SCSI device for which a device path node is to be
-                              allocated and built.
-  @param[in, out]  DevicePath A pointer to a single device path node that describes the SCSI device
-                              specified by Target and Lun. This function is responsible for
-                              allocating the buffer DevicePath with the boot service
-                              AllocatePool(). It is the caller's responsibility to free
-                              DevicePath when the caller is finished with DevicePath.
-
-  @retval EFI_SUCCESS           The device path node that describes the SCSI device specified by
-                                Target and Lun was allocated and returned in
-                                DevicePath.
-  @retval EFI_INVALID_PARAMETER DevicePath is NULL.
-  @retval EFI_NOT_FOUND         The SCSI devices specified by Target and Lun does not exist
-                                on the SCSI channel.
-  @retval EFI_OUT_OF_RESOURCES  There are not enough resources to allocate DevicePath.
-
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruBuildDevicePath (
-  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This,
-  IN UINT8                            *Target,
-  IN UINT64                           Lun,
-  IN OUT EFI_DEVICE_PATH_PROTOCOL     **DevicePath
-  )
-{
-  ISCSI_DRIVER_DATA             *Private;
-  ISCSI_SESSION                 *Session;
-  ISCSI_SESSION_CONFIG_NVDATA   *ConfigNvData;
-  ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
-  EFI_DEV_PATH                  *Node;
-  UINTN                         DevPathNodeLen;
-
-  if (DevicePath == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (Target[0] != 0) {
-    return EFI_NOT_FOUND;
-  }
-
-  Private       = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
-  Session       = &Private->Session;
-  ConfigNvData  = &Session->ConfigData.NvData;
-  AuthConfig    = &Session->AuthData.AuthConfig;
-
-  if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) {
-    return EFI_NOT_FOUND;
-  }
-
-  DevPathNodeLen  = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen (ConfigNvData->TargetName) + 1;
-  Node            = AllocatePool (DevPathNodeLen);
-  if (Node == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Node->DevPath.Type    = MESSAGING_DEVICE_PATH;
-  Node->DevPath.SubType = MSG_ISCSI_DP;
-  SetDevicePathNodeLength (&Node->DevPath, (UINT16)DevPathNodeLen);
-
-  //
-  // 0 for TCP, others are reserved.
-  //
-  Node->Iscsi.NetworkProtocol = 0;
-
-  Node->Iscsi.LoginOption     = 0;
-  switch (AuthConfig->CHAPType) {
-  case ISCSI_CHAP_NONE:
-    Node->Iscsi.LoginOption |= 0x0800;
-    break;
-
-  case ISCSI_CHAP_UNI:
-    Node->Iscsi.LoginOption |= 0x1000;
-    break;
-
-  default:
-    break;
-  }
-
-  CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64));
-  Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag;
-  AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName);
-
-  *DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node;
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Used to translate a device path node to a Target ID and LUN.
-
-  @param[in]  This       A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
-  @param[in]  DevicePath A pointer to a single device path node that describes the SCSI device
-                         on the SCSI channel.
-  @param[out] Target     A pointer to the Target Array which represents the ID of a SCSI device
-                         on the SCSI channel.
-  @param[out]  Lun       A pointer to the LUN of a SCSI device on the SCSI channel.
-
-  @retval EFI_SUCCESS           DevicePath was successfully translated to a Target ID and
-                                LUN, and they were returned in Target and Lun.
-  @retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL.
-  @retval EFI_NOT_FOUND         A valid translation from DevicePath to a Target ID and LUN
-                                does not exist.Currently not implemented.
-  @retval EFI_UNSUPPORTED       This driver does not support the device path node type in
-                                DevicePath.
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruGetTargetLun (
-  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This,
-  IN EFI_DEVICE_PATH_PROTOCOL         *DevicePath,
-  OUT UINT8                           **Target,
-  OUT UINT64                          *Lun
-  )
-{
-  ISCSI_DRIVER_DATA           *Private;
-  ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
-
-  if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if ((DevicePath->Type != MESSAGING_DEVICE_PATH) ||
-      (DevicePath->SubType != MSG_ISCSI_DP) ||
-      (DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH))
-      ) {
-    return EFI_UNSUPPORTED;
-  }
-
-  Private       = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
-  ConfigNvData  = &Private->Session.ConfigData.NvData;
-
-  SetMem (*Target, TARGET_MAX_BYTES, 0xFF);
-  (*Target)[0] = 0;
-
-  if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath + sizeof (ISCSI_DEVICE_PATH)) != 0) {
-    return EFI_UNSUPPORTED;
-  }
-
-  CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Resets a SCSI channel. This operation resets all the SCSI devices connected to the SCSI channel.
-  Currently not implemented.
-
-  @param[in]  This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
-
-  @retval EFI_SUCCESS      The SCSI channel was reset.
-  @retval EFI_DEVICE_ERROR A device error occurred while attempting to reset the SCSI channel.
-  @retval EFI_TIMEOUT      A timeout occurred while attempting to reset the SCSI channel.
-  @retval EFI_UNSUPPORTED  The SCSI channel does not support a channel reset operation.
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruResetChannel (
-  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This
-  )
-{
-  return EFI_UNSUPPORTED;
-}
-
-/**
-  Resets a SCSI logical unit that is connected to a SCSI channel. Currently not implemented.
-
-  @param[in]  This   A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
-  @param[in]  Target The Target is an array of size TARGET_MAX_BYTE and it represents the
-                     target port ID of the SCSI device containing the SCSI logical unit to
-                     reset. Transport drivers may chose to utilize a subset of this array to suit
-                     the representation of their targets.
-  @param[in]  Lun    The LUN of the SCSI device to reset.
-
-  @retval EFI_SUCCESS           The SCSI device specified by Target and Lun was reset.
-  @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
-  @retval EFI_TIMEOUT           A timeout occurred while attempting to reset the SCSI device
-                                specified by Target and Lun.
-  @retval EFI_UNSUPPORTED       The SCSI channel does not support a target reset operation.
-  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to reset the SCSI device
-                                specified by Target and Lun.
-
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruResetTargetLun (
-  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This,
-  IN UINT8                            *Target,
-  IN UINT64                           Lun
-  )
-{
-  return EFI_UNSUPPORTED;
-}
-
-/**
-  Used to retrieve the list of legal Target IDs for SCSI devices on a SCSI channel. These can either
-  be the list SCSI devices that are actually present on the SCSI channel, or the list of legal Target IDs
-  for the SCSI channel. Regardless, the caller of this function must probe the Target ID returned to
-  see if a SCSI device is actually present at that location on the SCSI channel.
-
-  @param[in]       This    A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
-  @param[in, out]  Target  (TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel.
-                           On output, a pointer to the Target ID (an array of
-                           TARGET_MAX_BYTES) of the next SCSI device present on a SCSI
-                           channel. An input value of 0xF(all bytes in the array are 0xF) in the
-                           Target array retrieves the Target ID of the first SCSI device present on a
-                           SCSI channel.
-
-  @retval EFI_SUCCESS           The Target ID of the next SCSI device on the SCSI
-                                channel was returned in Target.
-  @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
-  @retval EFI_TIMEOUT           Target array is not all 0xF, and Target were not
-                                returned on a previous call to GetNextTarget().
-                                Currently not implemented.
-  @retval EFI_NOT_FOUND         There are no more SCSI devices on this SCSI channel.
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruGetNextTarget (
-  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This,
-  IN OUT UINT8                        **Target
-  )
-{
-  UINT8 TargetId[TARGET_MAX_BYTES];
-
-  SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
-
-  if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
-    (*Target)[0] = 0;
-    return EFI_SUCCESS;
-  } else if ((*Target)[0] == 0) {
-    return EFI_NOT_FOUND;
-  } else {
-    return EFI_INVALID_PARAMETER;
-  }
-}
-
-EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate = {
-  NULL,
-  IScsiExtScsiPassThruFunction,
-  IScsiExtScsiPassThruGetNextTargetLun,
-  IScsiExtScsiPassThruBuildDevicePath,
-  IScsiExtScsiPassThruGetTargetLun,
-  IScsiExtScsiPassThruResetChannel,
-  IScsiExtScsiPassThruResetTargetLun,
-  IScsiExtScsiPassThruGetNextTarget
-};
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
deleted file mode 100644
index 58c5447dcbd1..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
+++ /dev/null
@@ -1,539 +0,0 @@
-/** @file
-  Implementation for iSCSI Boot Firmware Table publication.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-
-BOOLEAN mIbftInstalled = FALSE;
-UINTN   mTableKey;
-
-/**
-  Initialize the header of the iSCSI Boot Firmware Table.
-
-  @param[out]  Header     The header of the iSCSI Boot Firmware Table.
-  @param[in]   OemId      The OEM ID.
-  @param[in]   OemTableId The OEM table ID for the iBFT.
-**/
-VOID
-IScsiInitIbfTableHeader (
-  OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER   *Header,
-  IN  UINT8                                       *OemId,
-  IN  UINT64                                      *OemTableId
-  )
-{
-  ZeroMem (Header, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER));
-
-  Header->Signature = EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE;
-  Header->Length    = IBFT_HEAP_OFFSET;
-  Header->Revision  = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION;
-  Header->Checksum  = 0;
-
-  CopyMem (Header->OemId, OemId, sizeof (Header->OemId));
-  CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64));
-}
-
-/**
-  Initialize the control section of the iSCSI Boot Firmware Table.
-
-  @param[in]  Table       The ACPI table.
-  @param[in]  HandleCount The number of the handles associated with iSCSI sessions, it's
-                          equal to the number of iSCSI sessions.
-**/
-VOID
-IScsiInitControlSection (
-  IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER  *Table,
-  IN UINTN                                      HandleCount
-  )
-{
-  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE  *Control;
-  UINTN                                                 NumOffset;
-
-  Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
-
-  ZeroMem (Control, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE));
-
-  Control->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID;
-  Control->Header.Version     = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION;
-  Control->Header.Length      = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE);
-
-  //
-  // Each session occupies two offsets, one for the NIC section,
-  // the other for the Target section.
-  //
-  NumOffset = 2 * HandleCount;
-  if (NumOffset > 4) {
-    //
-    // Need expand the control section if more than 2 NIC/Target sections
-    // exist.
-    //
-    Control->Header.Length = (UINT16) (Control->Header.Length + (NumOffset - 4) * sizeof (UINT16));
-  }
-}
-
-/**
-  Add one item into the heap.
-
-  @param[in, out]  Heap  On input, the current address of the heap; On output, the address of
-                         the heap after the item is added.
-  @param[in]       Data  The data to add into the heap.
-  @param[in]       Len   Length of the Data in byte.
-**/
-VOID
-IScsiAddHeapItem (
-  IN OUT UINT8  **Heap,
-  IN     VOID   *Data,
-  IN     UINTN  Len
-  )
-{
-  //
-  // Add one byte for the NULL delimiter.
-  //
-  *Heap -= Len + 1;
-
-  CopyMem (*Heap, Data, Len);
-  *(*Heap + Len) = 0;
-}
-
-/**
-  Fill the Initiator section of the iSCSI Boot Firmware Table.
-
-  @param[in]       Table    The ACPI table.
-  @param[in, out]  Heap     The heap.
-  @param[in]       Handle   The handle associated with the iSCSI session.
-**/
-VOID
-IScsiFillInitiatorSection (
-  IN     EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER  *Table,
-  IN OUT UINT8                                      **Heap,
-  IN     EFI_HANDLE                                 Handle
-  )
-{
-  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE    *Control;
-  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE  *Initiator;
-  ISCSI_DRIVER_DATA                                       *DriverData;
-  ISCSI_SESSION                                           *Session;
-  ISCSI_PRIVATE_PROTOCOL                                  *IScsiIdentifier;
-  EFI_STATUS                                              Status;
-
-  Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
-
-  //
-  // Initiator section immediately follows the control section.
-  //
-  Initiator = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *) ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length));
-
-  Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table);
-
-  ZeroMem (Initiator, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE));
-
-  Initiator->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID;
-  Initiator->Header.Version     = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSION;
-  Initiator->Header.Length      = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE);
-  Initiator->Header.Flags       = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOOT_SELECTED;
-
-  //
-  // Get the identifier from the handle.
-  //
-  Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **) &IScsiIdentifier);
-  if (EFI_ERROR (Status)) {
-    ASSERT (FALSE);
-    return ;
-  }
-
-  DriverData  = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
-  Session     = &DriverData->Session;
-
-  //
-  // Fill the iSCSI Initiator Name into the heap.
-  //
-  IScsiAddHeapItem (Heap, Session->InitiatorName, Session->InitiatorNameLength - 1);
-
-  Initiator->IScsiNameLength  = (UINT16) (Session->InitiatorNameLength - 1);
-  Initiator->IScsiNameOffset  = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-}
-
-/**
-  Map the v4 IP address into v6 IP address.
-
-  @param[in]   V4 The v4 IP address.
-  @param[out]  V6 The v6 IP address.
-**/
-VOID
-IScsiMapV4ToV6Addr (
-  IN  EFI_IPv4_ADDRESS *V4,
-  OUT EFI_IPv6_ADDRESS *V6
-  )
-{
-  UINTN Index;
-
-  ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS));
-
-  V6->Addr[10]  = 0xff;
-  V6->Addr[11]  = 0xff;
-
-  for (Index = 0; Index < 4; Index++) {
-    V6->Addr[12 + Index] = V4->Addr[Index];
-  }
-}
-
-/**
-  Get the NIC's PCI location and return it according to the composited
-  format defined in iSCSI Boot Firmware Table.
-
-  @param[in]  Controller  The handle of the controller.
-
-  @return UINT16          The composited representation of the NIC PCI location.
-  @retval 0               Other errors as indicated.
-**/
-UINT16
-IScsiGetNICPciLocation (
-  IN EFI_HANDLE  Controller
-  )
-{
-  EFI_STATUS                Status;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  EFI_HANDLE                PciIoHandle;
-  EFI_PCI_IO_PROTOCOL       *PciIo;
-  UINTN                     Segment;
-  UINTN                     Bus;
-  UINTN                     Device;
-  UINTN                     Function;
-
-  Status = gBS->HandleProtocol (
-                  Controller,
-                  &gEfiDevicePathProtocolGuid,
-                  (VOID **)&DevicePath
-                  );
-  if (EFI_ERROR (Status)) {
-    return 0;
-  }
-
-  Status = gBS->LocateDevicePath (
-                  &gEfiPciIoProtocolGuid,
-                  &DevicePath,
-                  &PciIoHandle
-                  );
-  if (EFI_ERROR (Status)) {
-    return 0;
-  }
-
-  Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID **)&PciIo);
-  if (EFI_ERROR (Status)) {
-    return 0;
-  }
-
-  Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);
-  if (EFI_ERROR (Status)) {
-    return 0;
-  }
-
-  return (UINT16) ((Bus << 8) | (Device << 3) | Function);
-}
-
-/**
-  Fill the NIC and target sections in iSCSI Boot Firmware Table.
-
-  @param[in]       Table       The buffer of the ACPI table.
-  @param[in, out]  Heap        The heap buffer used to store the variable length parameters such as iSCSI name.
-  @param[in]       HandleCount Count The number of handles having iSCSI private protocol installed.
-  @param[in]       Handles     The handle buffer.
-**/
-VOID
-IScsiFillNICAndTargetSections (
-  IN     EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER  *Table,
-  IN OUT UINT8                                      **Heap,
-  IN     UINTN                                      HandleCount,
-  IN     EFI_HANDLE                                 *Handles
-  )
-{
-  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE  *Control;
-  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE      *Nic;
-  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE   *Target;
-  ISCSI_DRIVER_DATA                                     *DriverData;
-  ISCSI_SESSION_CONFIG_DATA                             *SessionConfigData;
-  ISCSI_CHAP_AUTH_CONFIG_NVDATA                         *AuthConfig;
-  UINT16                                                *SectionOffset;
-  UINTN                                                 Index;
-  UINT16                                                Length;
-  EFI_MAC_ADDRESS                                       MacAddress;
-  UINTN                                                 HwAddressSize;
-  ISCSI_PRIVATE_PROTOCOL                                *IScsiIdentifier;
-  EFI_STATUS                                            Status;
-
-  //
-  // Get the offset of the first Nic and Target section.
-  //
-  Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
-  Nic     = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Table +
-          Control->InitiatorOffset + IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)));
-  Target  = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic +
-          IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
-
-  SectionOffset = &Control->NIC0Offset;
-
-  for (Index = 0; Index < HandleCount; Index++) {
-    Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, (VOID **)&IScsiIdentifier);
-    if (EFI_ERROR (Status)) {
-      ASSERT (FALSE);
-      return ;
-    }
-
-    DriverData        = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
-    SessionConfigData = &DriverData->Session.ConfigData;
-    AuthConfig        = &DriverData->Session.AuthData.AuthConfig;
-
-    //
-    // Fill the Nic section.
-    //
-    ZeroMem (Nic, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE));
-
-    Nic->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID;
-    Nic->Header.Version     = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION;
-    Nic->Header.Length      = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE);
-    Nic->Header.Index       = (UINT8) Index;
-    Nic->Header.Flags       = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_VALID |
-                            EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_SELECTED |
-                            EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL;
-
-    //
-    // Get the subnet mask prefix length.
-    //
-    Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength (&SessionConfigData->NvData.SubnetMask);
-
-    if (SessionConfigData->NvData.InitiatorInfoFromDhcp) {
-      Nic->Origin = IpPrefixOriginDhcp;
-    } else {
-      Nic->Origin = IpPrefixOriginManual;
-    }
-    //
-    // Map the various v4 addresses into v6 addresses.
-    //
-    IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip);
-    IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic->Gateway);
-    IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic->PrimaryDns);
-    IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic->SecondaryDns);
-    IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic->DhcpServer);
-
-    Nic->VLanTag = NetLibGetVlanId (DriverData->Controller);
-
-    Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress, &HwAddressSize);
-    ASSERT (Status == EFI_SUCCESS);
-    CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac));
-
-    //
-    // Get the PCI location of the Nic.
-    //
-    Nic->PciLocation  = IScsiGetNICPciLocation (DriverData->Controller);
-
-    *SectionOffset    = (UINT16) ((UINTN) Nic - (UINTN) Table);
-    SectionOffset++;
-
-    //
-    // Fill the Target section.
-    //
-    ZeroMem (Target, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE));
-
-    Target->Header.StructureId  = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID;
-    Target->Header.Version      = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION;
-    Target->Header.Length       = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE);
-    Target->Header.Index        = (UINT8) Index;
-    Target->Header.Flags        = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_SELECTED;
-    Target->Port                = SessionConfigData->NvData.TargetPort;
-    Target->NicIndex            = (UINT8) Index;
-
-    if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) {
-      Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP;
-    } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
-      Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_CHAP;
-    } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) {
-      Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP;
-    }
-
-    IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target->Ip);
-    CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof (Target->BootLun));
-
-    //
-    // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret.
-    //
-    Length = (UINT16) AsciiStrLen (SessionConfigData->NvData.TargetName);
-    IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName, Length);
-
-    Target->IScsiNameLength = Length;
-    Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-
-    if (Target->CHAPType != EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP) {
-      //
-      // CHAP Name
-      //
-      Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName);
-      IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length);
-      Target->CHAPNameLength  = Length;
-      Target->CHAPNameOffset  = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-
-      //
-      // CHAP Secret
-      //
-      Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret);
-      IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length);
-      Target->CHAPSecretLength  = Length;
-      Target->CHAPSecretOffset  = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-
-      if (Target->CHAPType == EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP) {
-        //
-        // Reverse CHAP Name
-        //
-        Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName);
-        IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length);
-        Target->ReverseCHAPNameLength = Length;
-        Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-
-        //
-        // Reverse CHAP Secret
-        //
-        Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret);
-        IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length);
-        Target->ReverseCHAPSecretLength = Length;
-        Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-      }
-    }
-
-    *SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table);
-    SectionOffset++;
-
-    //
-    // Advance to the next NIC/Target pair
-    //
-    Nic    = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Target +
-           IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)));
-    Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic +
-           IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
-  }
-}
-
-/**
-  Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
-  session status.
-**/
-VOID
-IScsiPublishIbft (
-  VOID
-  )
-{
-  EFI_STATUS                                Status;
-  EFI_ACPI_TABLE_PROTOCOL                   *AcpiTableProtocol;
-  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table;
-  UINTN                                     HandleCount;
-  EFI_HANDLE                                *HandleBuffer;
-  UINT8                                     *Heap;
-  UINT8                                     Checksum;
-  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;
-  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;
-  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;
-
-  Rsdt = NULL;
-  Xsdt = NULL;
-
-  Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTableProtocol);
-  if (EFI_ERROR (Status)) {
-    return ;
-  }
-
-
-  //
-  // Find ACPI table RSD_PTR from system table
-  //
-  Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) &Rsdp);
-  if (EFI_ERROR (Status)) {
-    Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **) &Rsdp);
-  }
-
-  if (EFI_ERROR (Status) || (Rsdp == NULL)) {
-    return ;
-  } else if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp->XsdtAddress != 0) {
-    Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;
-  } else if (Rsdp->RsdtAddress != 0) {
-    Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;
-  }
-
-  if ((Xsdt == NULL) && (Rsdt == NULL)) {
-    return ;
-  }
-
-  if (mIbftInstalled) {
-    Status = AcpiTableProtocol->UninstallAcpiTable (
-                                  AcpiTableProtocol,
-                                  mTableKey
-                                  );
-    if (EFI_ERROR (Status)) {
-      return ;
-    }
-    mIbftInstalled = FALSE;
-  }
-
-  //
-  // Get all iSCSI private protocols.
-  //
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiCallerIdGuid,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuffer
-                  );
-  if (EFI_ERROR (Status)) {
-    return ;
-  }
-  //
-  // Allocate 4k bytes to hold the ACPI table.
-  //
-  Table = AllocateZeroPool (IBFT_MAX_SIZE);
-  if (Table == NULL) {
-    return ;
-  }
-
-  Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET;
-
-  //
-  // Fill in the various section of the iSCSI Boot Firmware Table.
-  //
-  if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {
-    IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId);
-  } else {
-    IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId);
-  }
-
-  IScsiInitControlSection (Table, HandleCount);
-  IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]);
-  IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer);
-
-  Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length);
-  Table->Checksum = Checksum;
-
-  FreePool (HandleBuffer);
-
-  //
-  // Install or update the iBFT table.
-  //
-  Status = AcpiTableProtocol->InstallAcpiTable (
-                                AcpiTableProtocol,
-                                Table,
-                                Table->Length,
-                                &mTableKey
-                                );
-  if (EFI_ERROR(Status)) {
-    return;
-  }
-
-  mIbftInstalled = TRUE;
-  FreePool (Table);
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
deleted file mode 100644
index e753d9eebdbe..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/** @file
-  Implementation for EFI iSCSI Initiator Name Protocol.
-
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-
-EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = {
-  IScsiGetInitiatorName,
-  IScsiSetInitiatorName
-};
-
-/**
-  Retrieves the current set value of iSCSI Initiator Name.
-
-  @param[in]       This       Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
-  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the
-                              variable data buffer.
-  @param[out]      Buffer     Pointer to the buffer for data to be read. The data is a null-terminated UTF-8 encoded string.
-                              The maximum length is 223 characters, including the null-terminator.
-
-  @retval EFI_SUCCESS           Data was successfully retrieved into the provided buffer and the
-                                BufferSize was sufficient to handle the iSCSI initiator name.
-  @retval EFI_BUFFER_TOO_SMALL  BufferSize is too small for the result.
-  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
-  @retval EFI_DEVICE_ERROR      The iSCSI initiator name could not be retrieved due to a hardware error.
-  @retval Others                Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiGetInitiatorName (
-  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
-  IN OUT UINTN                              *BufferSize,
-  OUT    VOID                               *Buffer
-  )
-{
-  EFI_STATUS  Status;
-
-  if ((BufferSize == NULL) || (Buffer == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Status = gRT->GetVariable (
-                  ISCSI_INITIATOR_NAME_VAR_NAME,
-                  &gEfiIScsiInitiatorNameProtocolGuid,
-                  NULL,
-                  BufferSize,
-                  Buffer
-                  );
-
-  return Status;
-}
-
-/**
-  Sets the iSCSI Initiator Name.
-
-  @param[in]       This       Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
-  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer.
-  @param[in]       Buffer     Pointer to the buffer for data to be written. The data is a null-terminated UTF-8 encoded string.
-                              The maximum length is 223 characters, including the null-terminator.
-
-  @retval EFI_SUCCESS           Data was successfully stored by the protocol.
-  @retval EFI_UNSUPPORTED       Platform policies do not allow for data to be written.
-                                Currently not implemented.
-  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit.
-  @retval EFI_DEVICE_ERROR      The data could not be stored due to a hardware error.
-  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the data.
-  @retval EFI_PROTOCOL_ERROR    Input iSCSI initiator name does not adhere to RFC 3720
-                                (and other related protocols).
-  @retval Others                Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiSetInitiatorName (
-  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
-  IN OUT UINTN                              *BufferSize,
-  IN     VOID                               *Buffer
-  )
-{
-  EFI_STATUS  Status;
-
-  if ((BufferSize == NULL) || (Buffer == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (*BufferSize > ISCSI_NAME_MAX_SIZE) {
-    *BufferSize = ISCSI_NAME_MAX_SIZE;
-    return EFI_INVALID_PARAMETER;
-  }
-  //
-  // only support iqn iSCSI names.
-  //
-  Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = gRT->SetVariable (
-                  ISCSI_INITIATOR_NAME_VAR_NAME,
-                  &gEfiIScsiInitiatorNameProtocolGuid,
-                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
-                  *BufferSize,
-                  Buffer
-                  );
-
-  return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
deleted file mode 100644
index d924a8b82427..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
+++ /dev/null
@@ -1,948 +0,0 @@
-/** @file
-  Miscellaneous routines for iSCSI driver.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8  IScsiHexString[] = "0123456789ABCDEFabcdef";
-
-/**
-  Removes (trims) specified leading and trailing characters from a string.
-
-  @param[in, out]  Str  Pointer to the null-terminated string to be trimmed. On return,
-                        Str will hold the trimmed string.
-
-  @param[in]      CharC Character will be trimmed from str.
-**/
-VOID
-StrTrim (
-  IN OUT CHAR16   *Str,
-  IN     CHAR16   CharC
-  )
-{
-  CHAR16  *Pointer1;
-  CHAR16  *Pointer2;
-
-  if (*Str == 0) {
-    return;
-  }
-
-  //
-  // Trim off the leading and trailing characters c
-  //
-  for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) {
-    ;
-  }
-
-  Pointer2 = Str;
-  if (Pointer2 == Pointer1) {
-    while (*Pointer1 != 0) {
-      Pointer2++;
-      Pointer1++;
-    }
-  } else {
-    while (*Pointer1 != 0) {
-    *Pointer2 = *Pointer1;
-    Pointer1++;
-    Pointer2++;
-    }
-    *Pointer2 = 0;
-  }
-
-
-  for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC; Pointer1--) {
-    ;
-  }
-  if  (Pointer1 !=  Str + StrLen(Str) - 1) {
-    *(Pointer1 + 1) = 0;
-  }
-}
-
-/**
-  Calculate the prefix length of the IPv4 subnet mask.
-
-  @param[in]  SubnetMask The IPv4 subnet mask.
-
-  @return The prefix length of the subnet mask.
-  @retval 0 Other errors as indicated.
-**/
-UINT8
-IScsiGetSubnetMaskPrefixLength (
-  IN EFI_IPv4_ADDRESS  *SubnetMask
-  )
-{
-  UINT8   Len;
-  UINT32  ReverseMask;
-
-  //
-  // The SubnetMask is in network byte order.
-  //
-  ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]);
-
-  //
-  // Reverse it.
-  //
-  ReverseMask = ~ReverseMask;
-
-  if ((ReverseMask & (ReverseMask + 1)) != 0) {
-    return 0;
-  }
-
-  Len = 0;
-
-  while (ReverseMask != 0) {
-    ReverseMask = ReverseMask >> 1;
-    Len++;
-  }
-
-  return (UINT8) (32 - Len);
-}
-
-/**
-  Convert the hexadecimal encoded LUN string into the 64-bit LUN.
-
-  @param[in]   Str             The hexadecimal encoded LUN string.
-  @param[out]  Lun             Storage to return the 64-bit LUN.
-
-  @retval EFI_SUCCESS           The 64-bit LUN is stored in Lun.
-  @retval EFI_INVALID_PARAMETER The string is malformatted.
-**/
-EFI_STATUS
-IScsiAsciiStrToLun (
-  IN  CHAR8  *Str,
-  OUT UINT8  *Lun
-  )
-{
-  UINTN   Index, IndexValue, IndexNum, SizeStr;
-  CHAR8   TemStr[2];
-  UINT8   TemValue;
-  UINT16  Value[4];
-
-  ZeroMem (Lun, 8);
-  ZeroMem (TemStr, 2);
-  ZeroMem ((UINT8 *) Value, sizeof (Value));
-  SizeStr    = AsciiStrLen (Str);
-  IndexValue = 0;
-  IndexNum   = 0;
-
-  for (Index = 0; Index < SizeStr; Index ++) {
-    TemStr[0] = Str[Index];
-    TemValue = (UINT8) AsciiStrHexToUint64 (TemStr);
-    if (TemValue == 0 && TemStr[0] != '0') {
-      if ((TemStr[0] != '-') || (IndexNum == 0)) {
-        //
-        // Invalid Lun Char
-        //
-        return EFI_INVALID_PARAMETER;
-      }
-    }
-
-    if ((TemValue == 0) && (TemStr[0] == '-')) {
-      //
-      // Next Lun value
-      //
-      if (++IndexValue >= 4) {
-        //
-        // Max 4 Lun value
-        //
-        return EFI_INVALID_PARAMETER;
-      }
-      //
-      // Restart str index for the next lun value
-      //
-      IndexNum = 0;
-      continue;
-    }
-
-    if (++IndexNum > 4) {
-      //
-      // Each Lun Str can't exceed size 4, because it will be as UINT16 value
-      //
-      return EFI_INVALID_PARAMETER;
-    }
-
-    //
-    // Combine UINT16 value
-    //
-    Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue);
-  }
-
-  for (Index = 0; Index <= IndexValue; Index ++) {
-    *((UINT16 *) &Lun[Index * 2]) =  HTONS (Value[Index]);
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Convert the 64-bit LUN into the hexadecimal encoded LUN string.
-
-  @param[in]   Lun The 64-bit LUN.
-  @param[out]  Str The storage to return the hexadecimal encoded LUN string.
-**/
-VOID
-IScsiLunToUnicodeStr (
-  IN UINT8    *Lun,
-  OUT CHAR16  *Str
-  )
-{
-  UINTN   Index;
-  CHAR16  *TempStr;
-
-  TempStr = Str;
-
-  for (Index = 0; Index < 4; Index++) {
-
-    if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) {
-      CopyMem(TempStr, L"0-", sizeof (L"0-"));
-    } else {
-      TempStr[0]  = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4];
-      TempStr[1]  = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F];
-      TempStr[2]  = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4];
-      TempStr[3]  = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F];
-      TempStr[4]  = L'-';
-      TempStr[5]  = 0;
-
-      StrTrim (TempStr, L'0');
-    }
-
-    TempStr += StrLen (TempStr);
-  }
-
-  ASSERT (StrLen(Str) >= 1);
-  Str[StrLen (Str) - 1] = 0;
-
-  for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) {
-    if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) {
-      Str[Index - 1] = 0;
-    } else {
-      break;
-    }
-  }
-}
-
-/**
-  Convert the ASCII string into a UNICODE string.
-
-  @param[in]   Source      The ASCII string.
-  @param[out]  Destination The storage to return the UNICODE string.
-
-  @return CHAR16 *         Pointer to the UNICODE string.
-**/
-CHAR16 *
-IScsiAsciiStrToUnicodeStr (
-  IN  CHAR8   *Source,
-  OUT CHAR16  *Destination
-  )
-{
-  ASSERT (Destination != NULL);
-  ASSERT (Source != NULL);
-
-  while (*Source != '\0') {
-    *(Destination++) = (CHAR16) *(Source++);
-  }
-
-  *Destination = '\0';
-
-  return Destination;
-}
-
-/**
-  Convert the UNICODE string into an ASCII string.
-
-  @param[in]  Source       The UNICODE string.
-  @param[out] Destination  The storage to return the ASCII string.
-
-  @return CHAR8 *          Pointer to the ASCII string.
-**/
-CHAR8 *
-IScsiUnicodeStrToAsciiStr (
-  IN  CHAR16  *Source,
-  OUT CHAR8   *Destination
-  )
-{
-  ASSERT (Destination != NULL);
-  ASSERT (Source != NULL);
-
-  while (*Source != '\0') {
-    //
-    // If any Unicode characters in Source contain
-    // non-zero value in the upper 8 bits, then ASSERT().
-    //
-    ASSERT (*Source < 0x100);
-    *(Destination++) = (CHAR8) *(Source++);
-  }
-
-  *Destination = '\0';
-
-  return Destination;
-}
-
-/**
-  Convert the decimal dotted IPv4 address into the binary IPv4 address.
-
-  @param[in]   Str             The UNICODE string.
-  @param[out]  Ip              The storage to return the ASCII string.
-
-  @retval EFI_SUCCESS           The binary IP address is returned in Ip.
-  @retval EFI_INVALID_PARAMETER The IP string is malformatted.
-**/
-EFI_STATUS
-IScsiAsciiStrToIp (
-  IN  CHAR8             *Str,
-  OUT EFI_IPv4_ADDRESS  *Ip
-  )
-{
-  UINTN Index;
-  UINTN Number;
-
-  Index = 0;
-
-  while (*Str != 0) {
-
-    if (Index > 3) {
-      return EFI_INVALID_PARAMETER;
-    }
-
-    Number = 0;
-    while (NET_IS_DIGIT (*Str)) {
-      Number = Number * 10 + (*Str - '0');
-      Str++;
-    }
-
-    if (Number > 0xFF) {
-      return EFI_INVALID_PARAMETER;
-    }
-
-    Ip->Addr[Index] = (UINT8) Number;
-
-    if ((*Str != '\0') && (*Str != '.')) {
-      //
-      // The current character should be either the NULL terminator or
-      // the dot delimiter.
-      //
-      return EFI_INVALID_PARAMETER;
-    }
-
-    if (*Str == '.') {
-      //
-      // Skip the delimiter.
-      //
-      Str++;
-    }
-
-    Index++;
-  }
-
-  if (Index != 4) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Convert the mac address into a hexadecimal encoded "-" seperated string.
-
-  @param[in]  Mac     The mac address.
-  @param[in]  Len     Length in bytes of the mac address.
-  @param[in]  VlanId  VLAN ID of the network device.
-  @param[out] Str     The storage to return the mac string.
-**/
-VOID
-IScsiMacAddrToStr (
-  IN  EFI_MAC_ADDRESS  *Mac,
-  IN  UINT32           Len,
-  IN  UINT16           VlanId,
-  OUT CHAR16           *Str
-  )
-{
-  UINT32  Index;
-  CHAR16  *String;
-
-  for (Index = 0; Index < Len; Index++) {
-    Str[3 * Index]      = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) & 0x0F];
-    Str[3 * Index + 1]  = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F];
-    Str[3 * Index + 2]  = L'-';
-  }
-
-  String = &Str[3 * Index - 1] ;
-  if (VlanId != 0) {
-    String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN) VlanId);
-  }
-
-  *String = L'\0';
-}
-
-/**
-  Convert the binary encoded buffer into a hexadecimal encoded string.
-
-  @param[in]       BinBuffer   The buffer containing the binary data.
-  @param[in]       BinLength   Length of the binary buffer.
-  @param[in, out]  HexStr      Pointer to the string.
-  @param[in, out]  HexLength   The length of the string.
-
-  @retval EFI_SUCCESS          The binary data is converted to the hexadecimal string
-                               and the length of the string is updated.
-  @retval EFI_BUFFER_TOO_SMALL The string is too small.
-  @retval EFI_INVALID_PARAMETER The IP string is malformatted.
-**/
-EFI_STATUS
-IScsiBinToHex (
-  IN     UINT8  *BinBuffer,
-  IN     UINT32 BinLength,
-  IN OUT CHAR8  *HexStr,
-  IN OUT UINT32 *HexLength
-  )
-{
-  UINTN Index;
-
-  if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (((*HexLength) - 3) < BinLength * 2) {
-    *HexLength = BinLength * 2 + 3;
-    return EFI_BUFFER_TOO_SMALL;
-  }
-
-  *HexLength = BinLength * 2 + 3;
-  //
-  // Prefix for Hex String
-  //
-  HexStr[0] = '0';
-  HexStr[1] = 'x';
-
-  for (Index = 0; Index < BinLength; Index++) {
-    HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4];
-    HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F];
-  }
-
-  HexStr[Index * 2 + 2] = '\0';
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Convert the hexadecimal string into a binary encoded buffer.
-
-  @param[in, out]  BinBuffer   The binary buffer.
-  @param[in, out]  BinLength   Length of the binary buffer.
-  @param[in]       HexStr      The hexadecimal string.
-
-  @retval EFI_SUCCESS          The hexadecimal string is converted into a binary
-                               encoded buffer.
-  @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data.
-**/
-EFI_STATUS
-IScsiHexToBin (
-  IN OUT UINT8  *BinBuffer,
-  IN OUT UINT32 *BinLength,
-  IN     CHAR8  *HexStr
-  )
-{
-  UINTN   Index;
-  UINTN   Length;
-  UINT8   Digit;
-  CHAR8   TemStr[2];
-
-  ZeroMem (TemStr, sizeof (TemStr));
-
-  //
-  // Find out how many hex characters the string has.
-  //
-  if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) {
-    HexStr += 2;
-  }
-
-  Length = AsciiStrLen (HexStr);
-
-  for (Index = 0; Index < Length; Index ++) {
-    TemStr[0] = HexStr[Index];
-    Digit = (UINT8) AsciiStrHexToUint64 (TemStr);
-    if (Digit == 0 && TemStr[0] != '0') {
-      //
-      // Invalid Lun Char
-      //
-      break;
-    }
-    if ((Index & 1) == 0) {
-      BinBuffer [Index/2] = Digit;
-    } else {
-      BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit);
-    }
-  }
-
-  *BinLength = (UINT32) ((Index + 1)/2);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Generate random numbers.
-
-  @param[in, out]  Rand       The buffer to contain random numbers.
-  @param[in]       RandLength The length of the Rand buffer.
-**/
-VOID
-IScsiGenRandom (
-  IN OUT UINT8  *Rand,
-  IN     UINTN  RandLength
-  )
-{
-  UINT32  Random;
-
-  while (RandLength > 0) {
-    Random  = NET_RANDOM (NetRandomInitSeed ());
-    *Rand++ = (UINT8) (Random);
-    RandLength--;
-  }
-}
-
-/**
-  Create the iSCSI driver data..
-
-  @param[in] Image      The handle of the driver image.
-  @param[in] Controller The handle of the controller.
-
-  @return The iSCSI driver data created.
-  @retval NULL Other errors as indicated.
-**/
-ISCSI_DRIVER_DATA *
-IScsiCreateDriverData (
-  IN EFI_HANDLE  Image,
-  IN EFI_HANDLE  Controller
-  )
-{
-  ISCSI_DRIVER_DATA *Private;
-  EFI_STATUS        Status;
-
-  Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA));
-  if (Private == NULL) {
-    return NULL;
-  }
-
-  Private->Signature  = ISCSI_DRIVER_DATA_SIGNATURE;
-  Private->Image      = Image;
-  Private->Controller = Controller;
-
-  //
-  // Create an event to be signal when the BS to RT transition is triggerd so
-  // as to abort the iSCSI session.
-  //
-  Status = gBS->CreateEventEx (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_CALLBACK,
-                  IScsiOnExitBootService,
-                  Private,
-                  &gEfiEventExitBootServicesGuid,
-                  &Private->ExitBootServiceEvent
-                  );
-  if (EFI_ERROR (Status)) {
-    FreePool (Private);
-    return NULL;
-  }
-
-  CopyMem(&Private->IScsiExtScsiPassThru, &gIScsiExtScsiPassThruProtocolTemplate, sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL));
-
-  //
-  // 0 is designated to the TargetId, so use another value for the AdapterId.
-  //
-  Private->ExtScsiPassThruMode.AdapterId = 2;
-  Private->ExtScsiPassThruMode.Attributes = EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;
-  Private->ExtScsiPassThruMode.IoAlign  = 4;
-  Private->IScsiExtScsiPassThru.Mode    = &Private->ExtScsiPassThruMode;
-
-  //
-  // Install the Ext SCSI PASS THRU protocol.
-  //
-  Status = gBS->InstallProtocolInterface (
-                  &Private->ExtScsiPassThruHandle,
-                  &gEfiExtScsiPassThruProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &Private->IScsiExtScsiPassThru
-                  );
-  if (EFI_ERROR (Status)) {
-    gBS->CloseEvent (Private->ExitBootServiceEvent);
-    FreePool (Private);
-
-    return NULL;
-  }
-
-  IScsiSessionInit (&Private->Session, FALSE);
-
-  return Private;
-}
-
-/**
-  Clean the iSCSI driver data.
-
-  @param[in]              Private The iSCSI driver data.
-
-  @retval EFI_SUCCESS     The clean operation is successful.
-  @retval Others          Other errors as indicated.
-
-**/
-EFI_STATUS
-IScsiCleanDriverData (
-  IN ISCSI_DRIVER_DATA  *Private
-  )
-{
-  EFI_STATUS             Status;
-
-  Status = EFI_SUCCESS;
-
-  if (Private->DevicePath != NULL) {
-    Status = gBS->UninstallProtocolInterface (
-                    Private->ExtScsiPassThruHandle,
-                    &gEfiDevicePathProtocolGuid,
-                    Private->DevicePath
-                    );
-    if (EFI_ERROR (Status)) {
-      goto EXIT;
-    }
-
-    FreePool (Private->DevicePath);
-  }
-
-  if (Private->ExtScsiPassThruHandle != NULL) {
-    Status = gBS->UninstallProtocolInterface (
-                    Private->ExtScsiPassThruHandle,
-                    &gEfiExtScsiPassThruProtocolGuid,
-                    &Private->IScsiExtScsiPassThru
-                    );
-  }
-
-EXIT:
-  if (Private->ExitBootServiceEvent != NULL) {
-    gBS->CloseEvent (Private->ExitBootServiceEvent);
-  }
-
-  FreePool (Private);
-  return Status;
-}
-
-/**
-  Check wheather the Controller is configured to use DHCP protocol.
-
-  @param[in]  Controller           The handle of the controller.
-
-  @retval TRUE                     The handle of the controller need the Dhcp protocol.
-  @retval FALSE                    The handle of the controller does not need the Dhcp protocol.
-
-**/
-BOOLEAN
-IScsiDhcpIsConfigured (
-  IN EFI_HANDLE  Controller
-  )
-{
-  EFI_STATUS                  Status;
-  EFI_MAC_ADDRESS             MacAddress;
-  UINTN                       HwAddressSize;
-  UINT16                      VlanId;
-  CHAR16                      MacString[70];
-  ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp;
-
-  //
-  // Get the mac string, it's the name of various variable
-  //
-  Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize);
-  if (EFI_ERROR (Status)) {
-    return FALSE;
-  }
-  VlanId = NetLibGetVlanId (Controller);
-  IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);
-
-  //
-  // Get the normal configuration.
-  //
-  Status = GetVariable2 (
-             MacString,
-             &gEfiIScsiInitiatorNameProtocolGuid,
-             (VOID**)&ConfigDataTmp,
-             NULL
-             );
-  if (ConfigDataTmp == NULL || EFI_ERROR (Status)) {
-    return FALSE;
-  }
-
-  if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) {
-    FreePool (ConfigDataTmp);
-    return TRUE;
-  }
-
-  FreePool (ConfigDataTmp);
-  return FALSE;
-}
-
-/**
-  Get the various configuration data of this iSCSI instance.
-
-  @param[in]  Private   The iSCSI driver data.
-
-  @retval EFI_SUCCESS   The configuration of this instance is got.
-  @retval EFI_ABORTED   The operation was aborted.
-  @retval Others        Other errors as indicated.
-**/
-EFI_STATUS
-IScsiGetConfigData (
-  IN ISCSI_DRIVER_DATA  *Private
-  )
-{
-  EFI_STATUS                  Status;
-  ISCSI_SESSION               *Session;
-  UINTN                       BufferSize;
-  EFI_MAC_ADDRESS             MacAddress;
-  UINTN                       HwAddressSize;
-  UINT16                      VlanId;
-  CHAR16                      MacString[70];
-
-  //
-  // get the iSCSI Initiator Name
-  //
-  Session                       = &Private->Session;
-  Session->InitiatorNameLength  = ISCSI_NAME_MAX_SIZE;
-  Status = gIScsiInitiatorName.Get (
-                                &gIScsiInitiatorName,
-                                &Session->InitiatorNameLength,
-                                Session->InitiatorName
-                                );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Get the mac string, it's the name of various variable
-  //
-  Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize);
-  ASSERT (Status == EFI_SUCCESS);
-  VlanId = NetLibGetVlanId (Private->Controller);
-  IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);
-
-  //
-  // Get the normal configuration.
-  //
-  BufferSize = sizeof (Session->ConfigData.NvData);
-  Status = gRT->GetVariable (
-                  MacString,
-                  &gEfiIScsiInitiatorNameProtocolGuid,
-                  NULL,
-                  &BufferSize,
-                  &Session->ConfigData.NvData
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  if (!Session->ConfigData.NvData.Enabled) {
-    return EFI_ABORTED;
-  }
-  //
-  // Get the CHAP Auth information.
-  //
-  BufferSize = sizeof (Session->AuthData.AuthConfig);
-  Status = gRT->GetVariable (
-                  MacString,
-                  &gIScsiCHAPAuthInfoGuid,
-                  NULL,
-                  &BufferSize,
-                  &Session->AuthData.AuthConfig
-                  );
-
-  if (!EFI_ERROR (Status) && Session->ConfigData.NvData.InitiatorInfoFromDhcp) {
-    //
-    // Start dhcp.
-    //
-    Status = IScsiDoDhcp (Private->Image, Private->Controller, &Session->ConfigData);
-  }
-
-  return Status;
-}
-
-/**
-  Get the device path of the iSCSI tcp connection and update it.
-
-  @param[in]  Private The iSCSI driver data.
-
-  @return The updated device path.
-  @retval NULL Other errors as indicated.
-**/
-EFI_DEVICE_PATH_PROTOCOL *
-IScsiGetTcpConnDevicePath (
-  IN ISCSI_DRIVER_DATA  *Private
-  )
-{
-  ISCSI_SESSION             *Session;
-  ISCSI_CONNECTION          *Conn;
-  TCP4_IO                   *Tcp4Io;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  EFI_STATUS                Status;
-  EFI_DEV_PATH              *DPathNode;
-
-  Session = &Private->Session;
-  if (Session->State != SESSION_STATE_LOGGED_IN) {
-    return NULL;
-  }
-
-  Conn = NET_LIST_USER_STRUCT_S (
-          Session->Conns.ForwardLink,
-          ISCSI_CONNECTION,
-          Link,
-          ISCSI_CONNECTION_SIGNATURE
-          );
-  Tcp4Io = &Conn->Tcp4Io;
-
-  Status = gBS->HandleProtocol (
-                  Tcp4Io->Handle,
-                  &gEfiDevicePathProtocolGuid,
-                  (VOID **)&DevicePath
-                  );
-  if (EFI_ERROR (Status)) {
-    return NULL;
-  }
-  //
-  // Duplicate it.
-  //
-  DevicePath  = DuplicateDevicePath (DevicePath);
-  if (DevicePath == NULL) {
-    return NULL;
-  }
-
-  DPathNode   = (EFI_DEV_PATH *) DevicePath;
-
-  while (!IsDevicePathEnd (&DPathNode->DevPath)) {
-    if ((DevicePathType (&DPathNode->DevPath) == MESSAGING_DEVICE_PATH) &&
-        (DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP)
-        ) {
-
-      DPathNode->Ipv4.LocalPort       = 0;
-      DPathNode->Ipv4.StaticIpAddress =
-        (BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp);
-
-      //
-      //  Add a judgement here to support previous versions of IPv4_DEVICE_PATH.
-      //  In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and SubnetMask
-      //  do not exist.
-      //  In new version of IPv4_DEVICE_PATH, structcure length is 27.
-      //
-      if (DevicePathNodeLength (&DPathNode->Ipv4) == IP4_NODE_LEN_NEW_VERSIONS) {
-
-        IP4_COPY_ADDRESS (
-          &DPathNode->Ipv4.GatewayIpAddress,
-          &Session->ConfigData.NvData.Gateway
-          );
-
-        IP4_COPY_ADDRESS (
-          &DPathNode->Ipv4.SubnetMask,
-          &Session->ConfigData.NvData.SubnetMask
-          );
-      }
-
-      break;
-    }
-
-    DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode->DevPath);
-  }
-
-  return DevicePath;
-}
-
-/**
-  Abort the session when the transition from BS to RT is initiated.
-
-  @param[in]   Event  The event signaled.
-  @param[in]  Context The iSCSI driver data.
-**/
-VOID
-EFIAPI
-IScsiOnExitBootService (
-  IN EFI_EVENT  Event,
-  IN VOID       *Context
-  )
-{
-  ISCSI_DRIVER_DATA *Private;
-
-  Private = (ISCSI_DRIVER_DATA *) Context;
-
-  gBS->CloseEvent (Private->ExitBootServiceEvent);
-  Private->ExitBootServiceEvent = NULL;
-
-  IScsiSessionAbort (&Private->Session);
-}
-
-/**
-  Tests whether a controller handle is being managed by IScsi driver.
-
-  This function tests whether the driver specified by DriverBindingHandle is
-  currently managing the controller specified by ControllerHandle.  This test
-  is performed by evaluating if the the protocol specified by ProtocolGuid is
-  present on ControllerHandle and is was opened by DriverBindingHandle and Nic
-  Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
-  If ProtocolGuid is NULL, then ASSERT().
-
-  @param  ControllerHandle     A handle for a controller to test.
-  @param  DriverBindingHandle  Specifies the driver binding handle for the
-                               driver.
-  @param  ProtocolGuid         Specifies the protocol that the driver specified
-                               by DriverBindingHandle opens in its Start()
-                               function.
-
-  @retval EFI_SUCCESS          ControllerHandle is managed by the driver
-                               specified by DriverBindingHandle.
-  @retval EFI_UNSUPPORTED      ControllerHandle is not managed by the driver
-                               specified by DriverBindingHandle.
-
-**/
-EFI_STATUS
-EFIAPI
-IScsiTestManagedDevice (
-  IN  EFI_HANDLE       ControllerHandle,
-  IN  EFI_HANDLE       DriverBindingHandle,
-  IN  EFI_GUID         *ProtocolGuid
-  )
-{
-  EFI_STATUS     Status;
-  VOID           *ManagedInterface;
-  EFI_HANDLE     NicControllerHandle;
-
-  ASSERT (ProtocolGuid != NULL);
-
-  NicControllerHandle = NetLibGetNicHandle (ControllerHandle, ProtocolGuid);
-  if (NicControllerHandle == NULL) {
-    return EFI_UNSUPPORTED;
-  }
-
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  (EFI_GUID *) ProtocolGuid,
-                  &ManagedInterface,
-                  DriverBindingHandle,
-                  NicControllerHandle,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-  if (!EFI_ERROR (Status)) {
-    gBS->CloseProtocol (
-           ControllerHandle,
-           (EFI_GUID *) ProtocolGuid,
-           DriverBindingHandle,
-           NicControllerHandle
-           );
-    return EFI_UNSUPPORTED;
-  }
-
-  if (Status != EFI_ALREADY_STARTED) {
-    return EFI_UNSUPPORTED;
-  }
-
-  return EFI_SUCCESS;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
deleted file mode 100644
index b4a5c2d02413..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
+++ /dev/null
@@ -1,2799 +0,0 @@
-/** @file
-  The implementation of iSCSI protocol based on RFC3720.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-
-UINT32 mDataSegPad = 0;
-
-/**
-  Attach the iSCSI connection to the iSCSI session.
-
-  @param[in, out]  Session The iSCSI session.
-  @param[in, out]  Conn    The iSCSI connection.
-**/
-VOID
-IScsiAttatchConnection (
-  IN OUT ISCSI_SESSION     *Session,
-  IN OUT ISCSI_CONNECTION  *Conn
-  )
-{
-  InsertTailList (&Session->Conns, &Conn->Link);
-  Conn->Session = Session;
-  Session->NumConns++;
-}
-
-/**
-  Detach the iSCSI connection from the session it belongs to.
-
-  @param[in, out]  Conn The iSCSI connection.
-**/
-VOID
-IScsiDetatchConnection (
-  IN OUT ISCSI_CONNECTION  *Conn
-  )
-{
-  RemoveEntryList (&Conn->Link);
-  Conn->Session->NumConns--;
-  Conn->Session = NULL;
-}
-
-/**
-  Check the sequence number according to RFC3720.
-
-  @param[in, out]  ExpSN   The currently expected sequence number.
-  @param[in]       NewSN   The sequence number to check.
-
-  @retval EFI_SUCCESS         The check passed and the ExpSN is increased.
-  @retval EFI_NOT_READY       Response was sent due to a retransmission request.
-  @retval EFI_PROTOCOL_ERROR  Some kind of iSCSI protocol error happened.
-**/
-EFI_STATUS
-IScsiCheckSN (
-  IN OUT UINT32  *ExpSN,
-  IN UINT32      NewSN
-  )
-{
-  if (!ISCSI_SEQ_EQ (NewSN, *ExpSN)) {
-    if (ISCSI_SEQ_LT (NewSN, *ExpSN)) {
-      //
-      // Duplicate
-      //
-      return EFI_NOT_READY;
-    } else {
-      return EFI_PROTOCOL_ERROR;
-    }
-  } else {
-    //
-    // Advance the ExpSN
-    //
-    (*ExpSN)++;
-    return EFI_SUCCESS;
-  }
-}
-
-/**
-  Update the sequence numbers for the iSCSI command.
-
-  @param[in, out]  Session  The iSCSI session.
-  @param[in]       MaxCmdSN Maximum CmdSN from the target.
-  @param[in]       ExpCmdSN Next expected CmdSN from the target.
-**/
-VOID
-IScsiUpdateCmdSN (
-  IN OUT ISCSI_SESSION  *Session,
-  IN UINT32             MaxCmdSN,
-  IN UINT32             ExpCmdSN
-  )
-{
-  if (ISCSI_SEQ_LT (MaxCmdSN, ExpCmdSN - 1)) {
-    return ;
-  }
-
-  if (ISCSI_SEQ_GT (MaxCmdSN, Session->MaxCmdSN)) {
-    Session->MaxCmdSN = MaxCmdSN;
-  }
-
-  if (ISCSI_SEQ_GT (ExpCmdSN, Session->ExpCmdSN)) {
-    Session->ExpCmdSN = ExpCmdSN;
-  }
-}
-
-/**
-  This function does the iSCSI connection login.
-
-  @param[in, out]  Conn      The iSCSI connection to login.
-
-  @retval EFI_SUCCESS        The iSCSI connection is logged into the iSCSI target.
-  @retval EFI_TIMEOUT        Timeout happened during the login procedure.
-  @retval Others             Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConnLogin (
-  IN OUT ISCSI_CONNECTION  *Conn
-  )
-{
-  EFI_STATUS  Status;
-
-  //
-  // Start the timer, wait 16 seconds to establish the TCP connection.
-  //
-  Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, 16 * TICKS_PER_SECOND);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  //
-  // try to establish the tcp connection
-  //
-  Status = Tcp4IoConnect (&Conn->Tcp4Io, Conn->TimeoutEvent);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  gBS->SetTimer (Conn->TimeoutEvent, TimerCancel, 0);
-  Conn->State = CONN_STATE_IN_LOGIN;
-
-  //
-  // connection is established, start the iSCSI Login
-  //
-  do {
-    Status = IScsiSendLoginReq (Conn);
-    if (EFI_ERROR (Status)) {
-      break;
-    }
-
-    Status = IScsiReceiveLoginRsp (Conn);
-    if (EFI_ERROR (Status)) {
-      break;
-    }
-  } while (Conn->CurrentStage != ISCSI_FULL_FEATURE_PHASE);
-
-  return Status;
-}
-
-/**
-  Reset the iSCSI connection.
-
-  @param[in, out]  Conn The iSCSI connection to reset.
-**/
-VOID
-IScsiConnReset (
-  IN OUT ISCSI_CONNECTION  *Conn
-  )
-{
-  Tcp4IoReset (&Conn->Tcp4Io);
-}
-
-/**
-  Create a TCP connection for the iSCSI session.
-
-  @param[in]  Private The iSCSI driver data.
-  @param[in]  Session Maximum CmdSN from the target.
-
-  @return The newly created iSCSI connection.
-**/
-ISCSI_CONNECTION *
-IScsiCreateConnection (
-  IN ISCSI_DRIVER_DATA  *Private,
-  IN ISCSI_SESSION      *Session
-  )
-{
-  ISCSI_CONNECTION    *Conn;
-  TCP4_IO_CONFIG_DATA Tcp4IoConfig;
-  EFI_STATUS          Status;
-
-  Conn = AllocatePool (sizeof (ISCSI_CONNECTION));
-  if (Conn == NULL) {
-    return NULL;
-  }
-
-  Conn->Signature       = ISCSI_CONNECTION_SIGNATURE;
-  Conn->State           = CONN_STATE_FREE;
-  Conn->CurrentStage    = ISCSI_SECURITY_NEGOTIATION;
-  Conn->NextStage       = ISCSI_LOGIN_OPERATIONAL_NEGOTIATION;
-  Conn->CHAPStep        = ISCSI_CHAP_INITIAL;
-  Conn->ExpStatSN       = 0;
-  Conn->PartialReqSent  = FALSE;
-  Conn->PartialRspRcvd  = FALSE;
-  Conn->Cid             = Session->NextCid++;
-
-  Status = gBS->CreateEvent (
-                  EVT_TIMER,
-                  TPL_CALLBACK,
-                  NULL,
-                  NULL,
-                  &Conn->TimeoutEvent
-                  );
-  if (EFI_ERROR (Status)) {
-    FreePool (Conn);
-    return NULL;
-  }
-
-  NetbufQueInit (&Conn->RspQue);
-
-  //
-  // set the default connection-only parameters
-  //
-  Conn->MaxRecvDataSegmentLength  = DEFAULT_MAX_RECV_DATA_SEG_LEN;
-  Conn->HeaderDigest              = IScsiDigestNone;
-  Conn->DataDigest                = IScsiDigestNone;
-
-  CopyMem (&Tcp4IoConfig.LocalIp, &Session->ConfigData.NvData.LocalIp, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&Tcp4IoConfig.SubnetMask, &Session->ConfigData.NvData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&Tcp4IoConfig.Gateway, &Session->ConfigData.NvData.Gateway, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&Tcp4IoConfig.RemoteIp, &Session->ConfigData.NvData.TargetIp, sizeof (EFI_IPv4_ADDRESS));
-
-  Tcp4IoConfig.RemotePort = Session->ConfigData.NvData.TargetPort;
-
-  //
-  // Create the tcp4 IO for this connection
-  //
-  Status = Tcp4IoCreateSocket (
-            Private->Image,
-            Private->Controller,
-            &Tcp4IoConfig,
-            &Conn->Tcp4Io
-            );
-  if (EFI_ERROR (Status)) {
-    gBS->CloseEvent (Conn->TimeoutEvent);
-    FreePool (Conn);
-    Conn = NULL;
-  }
-
-  return Conn;
-}
-
-/**
-  Destroy an iSCSI connection.
-
-  @param[in]  Conn The connection to destroy.
-**/
-VOID
-IScsiDestroyConnection (
-  IN ISCSI_CONNECTION  *Conn
-  )
-{
-  Tcp4IoDestroySocket (&Conn->Tcp4Io);
-  NetbufQueFlush (&Conn->RspQue);
-  gBS->CloseEvent (Conn->TimeoutEvent);
-  FreePool (Conn);
-}
-
-/**
-  Login the iSCSI session.
-
-  @param[in]  Private          The iSCSI driver data.
-
-  @retval EFI_SUCCESS          The iSCSI session login procedure finished.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_NO_MEDIA         There was a media error.
-  @retval Others               Other errors as indicated.
-
-**/
-EFI_STATUS
-IScsiSessionLogin (
-  IN ISCSI_DRIVER_DATA  *Private
-  )
-{
-  EFI_STATUS        Status;
-  ISCSI_SESSION     *Session;
-  ISCSI_CONNECTION  *Conn;
-  EFI_TCP4_PROTOCOL *Tcp4;
-  EFI_STATUS        MediaStatus;
-
-  Session = &Private->Session;
-
-  //
-  // Check media status before session login
-  //
-  MediaStatus = EFI_SUCCESS;
-  NetLibDetectMediaWaitTimeout (Private->Controller, ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME, &MediaStatus);
-  if (MediaStatus != EFI_SUCCESS) {
-    return EFI_NO_MEDIA;
-  }
-
-  //
-  // Set session identifier
-  //
-  CopyMem (Session->Isid, Session->ConfigData.NvData.IsId, 6);
-
-  //
-  // Create a connection for the session.
-  //
-  Conn = IScsiCreateConnection (Private, Session);
-  if (Conn == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  IScsiAttatchConnection (Session, Conn);
-
-  //
-  // Login througth the newly created connection.
-  //
-  Status = IScsiConnLogin (Conn);
-  if (EFI_ERROR (Status)) {
-    IScsiConnReset (Conn);
-    IScsiDetatchConnection (Conn);
-    IScsiDestroyConnection (Conn);
-  } else {
-    Session->State = SESSION_STATE_LOGGED_IN;
-
-    gBS->OpenProtocol (
-          Conn->Tcp4Io.Handle,
-          &gEfiTcp4ProtocolGuid,
-          (VOID **)&Tcp4,
-          Private->Image,
-          Private->ExtScsiPassThruHandle,
-          EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
-          );
-  }
-
-  return Status;
-}
-
-/**
-  Build and send the iSCSI login request to the iSCSI target according to
-  the current login stage.
-
-  @param[in]  Conn             The connection in the iSCSI login phase.
-
-  @retval EFI_SUCCESS          The iSCSI login request PDU is built and sent on this
-                               connection.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_DEVICE_ERROR     Some kind of device error happened.
-**/
-EFI_STATUS
-IScsiSendLoginReq (
-  IN ISCSI_CONNECTION  *Conn
-  )
-{
-  NET_BUF     *Pdu;
-  EFI_STATUS  Status;
-
-  //
-  // build the Login Request PDU
-  //
-  Pdu = IScsiPrepareLoginReq (Conn);
-  if (Pdu == NULL) {
-    return EFI_DEVICE_ERROR;
-  }
-  //
-  // Send it to the iSCSI target.
-  //
-  Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu);
-
-  NetbufFree (Pdu);
-
-  return Status;
-}
-
-/**
-  Receive and process the iSCSI login response.
-
-  @param[in]  Conn             The connection in the iSCSI login phase.
-
-  @retval EFI_SUCCESS          The iSCSI login response PDU is received and processed.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiReceiveLoginRsp (
-  IN ISCSI_CONNECTION  *Conn
-  )
-{
-  EFI_STATUS  Status;
-  NET_BUF     *Pdu;
-
-  Pdu = NULL;
-
-  //
-  // Receive the iSCSI login response.
-  //
-  Status = IScsiReceivePdu (Conn, &Pdu, NULL, FALSE, FALSE, NULL);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  //
-  // A Login Response is received, process it.
-  //
-  ASSERT (Pdu != NULL);
-  Status = IScsiProcessLoginRsp (Conn, Pdu);
-
-  NetbufFree (Pdu);
-
-  return Status;
-}
-
-/**
-  Add an iSCSI key-value pair as a string into the data segment of the Login Request PDU.
-  The DataSegmentLength and the actual size of the net buffer containing this PDU will be
-  updated.
-
-  @param[in, out]  Pdu         The iSCSI PDU whose data segment the key-value pair will
-                               be added to.
-  @param[in]       Key         The key name string.
-  @param[in]       Value       The value string.
-
-  @retval EFI_SUCCESS          The key-valu pair is added to the PDU's datasegment and
-                               the correspondence length fields are updated.
-  @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to add the key-value
-                               pair.
-**/
-EFI_STATUS
-IScsiAddKeyValuePair (
-  IN OUT NET_BUF      *Pdu,
-  IN CHAR8            *Key,
-  IN CHAR8            *Value
-  )
-{
-  UINT32              DataSegLen;
-  UINT32              KeyLen;
-  UINT32              ValueLen;
-  UINT32              TotalLen;
-  ISCSI_LOGIN_REQUEST *LoginReq;
-  CHAR8               *Data;
-
-  LoginReq    = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, NULL);
-  if (LoginReq == NULL) {
-    return EFI_PROTOCOL_ERROR;
-  }
-  DataSegLen  = NTOH24 (LoginReq->DataSegmentLength);
-
-  KeyLen      = (UINT32) AsciiStrLen (Key);
-  ValueLen    = (UINT32) AsciiStrLen (Value);
-
-  //
-  // 1 byte for the key value separator '=' and 1 byte for the null
-  // delimiter after the value.
-  //
-  TotalLen = KeyLen + 1 + ValueLen + 1;
-
-  //
-  // Allocate the space for the key-value pair.
-  //
-  Data = (CHAR8 *)NetbufAllocSpace (Pdu, TotalLen, NET_BUF_TAIL);
-  if (Data == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  //
-  // Add the key.
-  //
-  CopyMem (Data, Key, KeyLen);
-  Data += KeyLen;
-
-  *Data = '=';
-  Data++;
-
-  //
-  // Add the value.
-  //
-  CopyMem (Data, Value, ValueLen);
-  Data += ValueLen;
-
-  *Data = '\0';
-
-  //
-  // update the DataSegmentLength
-  //
-  ISCSI_SET_DATASEG_LEN (LoginReq, DataSegLen + TotalLen);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Prepare the iSCSI login request to be sent according to the current login status.
-
-  @param[in, out]  Conn The connection in the iSCSI login phase.
-
-  @return The pointer to the net buffer containing the iSCSI login request built.
-  @retval Others    Other errors as indicated.
-**/
-NET_BUF *
-IScsiPrepareLoginReq (
-  IN OUT ISCSI_CONNECTION  *Conn
-  )
-{
-  ISCSI_SESSION       *Session;
-  NET_BUF             *Nbuf;
-  ISCSI_LOGIN_REQUEST *LoginReq;
-  EFI_STATUS          Status;
-
-  Session = Conn->Session;
-
-  Nbuf    = NetbufAlloc (sizeof (ISCSI_LOGIN_REQUEST) + DEFAULT_MAX_RECV_DATA_SEG_LEN);
-  if (Nbuf == NULL) {
-    return NULL;
-  }
-
-  LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufAllocSpace (Nbuf, sizeof (ISCSI_LOGIN_REQUEST), NET_BUF_TAIL);
-  ASSERT (LoginReq != NULL);
-  ZeroMem (LoginReq, sizeof (ISCSI_LOGIN_REQUEST));
-
-  //
-  // Init the login request pdu
-  //
-  ISCSI_SET_OPCODE (LoginReq, ISCSI_OPCODE_LOGIN_REQ, ISCSI_REQ_IMMEDIATE);
-  ISCSI_SET_STAGES (LoginReq, Conn->CurrentStage, Conn->NextStage);
-  LoginReq->VersionMax        = ISCSI_VERSION_MAX;
-  LoginReq->VersionMin        = ISCSI_VERSION_MIN;
-  LoginReq->Tsih              = HTONS (Session->Tsih);
-  LoginReq->InitiatorTaskTag  = HTONL (Session->InitiatorTaskTag);
-  LoginReq->Cid               = HTONS (Conn->Cid);
-  LoginReq->CmdSN             = HTONL (Session->CmdSN);
-
-  //
-  // For the first Login Request on a coonection this is ExpStatSN for the
-  // old connection and this field is only valid if the Login Request restarts
-  // a connection.
-  // For subsequent Login Requests it is used to acknowledge the Login Responses
-  // with their increasing StatSN values.
-  //
-  LoginReq->ExpStatSN = HTONL (Conn->ExpStatSN);
-  CopyMem (LoginReq->Isid, Session->Isid, sizeof (LoginReq->Isid));
-
-  if (Conn->PartialRspRcvd) {
-    //
-    // A partial response, initiator must send an empty Login Request.
-    //
-    return Nbuf;
-  }
-
-  switch (Conn->CurrentStage) {
-  case ISCSI_SECURITY_NEGOTIATION:
-    Status = IScsiCHAPToSendReq (Conn, Nbuf);
-    break;
-
-  case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:
-    Status = IScsiFillOpParams (Conn, Nbuf);
-    ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
-    break;
-
-  default:
-    //
-    // something error happens...
-    //
-    Status = EFI_DEVICE_ERROR;
-    break;
-  }
-
-  if (EFI_ERROR (Status)) {
-    NetbufFree (Nbuf);
-    Nbuf = NULL;
-  } else {
-    //
-    // Pad the data segment if needed.
-    //
-    IScsiPadSegment (Nbuf, ISCSI_GET_DATASEG_LEN (LoginReq));
-    //
-    // Check whether we will issue the stage transition signal?
-    //
-    Conn->TransitInitiated = (BOOLEAN) ISCSI_FLAG_ON (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
-  }
-
-  return Nbuf;
-}
-
-/**
-  Process the iSCSI Login Response.
-
-  @param[in, out]  Conn The connection on which the iSCSI login response is received.
-  @param[in, out]  Pdu  The iSCSI login response PDU.
-
-  @retval EFI_SUCCESS        The iSCSI login response PDU is processed and all check are passed.
-  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
-  @retval EFI_MEDIA_CHANGED  Target is redirected.
-  @retval Others             Other errors as indicated.
-**/
-EFI_STATUS
-IScsiProcessLoginRsp (
-  IN OUT ISCSI_CONNECTION  *Conn,
-  IN OUT NET_BUF           *Pdu
-  )
-{
-  EFI_STATUS            Status;
-  ISCSI_SESSION         *Session;
-  ISCSI_LOGIN_RESPONSE  *LoginRsp;
-  BOOLEAN               Transit;
-  BOOLEAN               Continue;
-  UINT8                 CurrentStage;
-  UINT8                 NextStage;
-  UINT8                 *DataSeg;
-  UINT32                DataSegLen;
-
-  Session   = Conn->Session;
-
-  LoginRsp  = (ISCSI_LOGIN_RESPONSE *) NetbufGetByte (Pdu, 0, NULL);
-  if (LoginRsp == NULL) {
-    return EFI_PROTOCOL_ERROR;
-  }
-  if (!ISCSI_CHECK_OPCODE (LoginRsp, ISCSI_OPCODE_LOGIN_RSP)) {
-    //
-    // It's not a Login Response
-    //
-    return EFI_PROTOCOL_ERROR;
-  }
-  //
-  // Get the data segment if any.
-  //
-  DataSegLen = ISCSI_GET_DATASEG_LEN (LoginRsp);
-  if (DataSegLen != 0) {
-    DataSeg = NetbufGetByte (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NULL);
-  } else {
-    DataSeg = NULL;
-  }
-  //
-  // Check the status class in the login response PDU.
-  //
-  switch (LoginRsp->StatusClass) {
-  case ISCSI_LOGIN_STATUS_SUCCESS:
-    //
-    // Just break here, the response and the data segment will be processed later.
-    //
-    break;
-
-  case ISCSI_LOGIN_STATUS_REDIRECTION:
-    //
-    // The target may be moved to a different address
-    //
-    if (DataSeg == NULL) {
-      return EFI_PROTOCOL_ERROR;
-    }
-    //
-    // Process the TargetAddress key-value strings in the data segment to update the
-    // target address info.
-    //
-    Status = IScsiUpdateTargetAddress (Session, (CHAR8 *)DataSeg, DataSegLen);
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-    //
-    // Session will be restarted on this error status because the Target is
-    // redirected by this Login Response.
-    //
-    return EFI_MEDIA_CHANGED;
-
-  default:
-    //
-    // Initiator Error, Target Error, or any other undefined error code.
-    //
-    return EFI_PROTOCOL_ERROR;
-  }
-  //
-  // The status is sucess, extract the wanted fields from the header segment.
-  //
-  Transit                     = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT);
-  Continue                    = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE);
-
-  CurrentStage                = (UINT8) ISCSI_GET_CURRENT_STAGE (LoginRsp);
-  NextStage                   = (UINT8) ISCSI_GET_NEXT_STAGE (LoginRsp);
-
-  LoginRsp->InitiatorTaskTag  = NTOHL (LoginRsp->InitiatorTaskTag);
-
-  if ((Transit && Continue) ||
-      (CurrentStage != Conn->CurrentStage) ||
-      (!Conn->TransitInitiated && Transit) ||
-      (Transit && (NextStage != Conn->NextStage)) ||
-      (CompareMem (Session->Isid, LoginRsp->Isid, sizeof (LoginRsp->Isid)) != 0) ||
-      (LoginRsp->InitiatorTaskTag != Session->InitiatorTaskTag)
-      ) {
-    //
-    // A Login Response with the C bit set to 1 MUST have the T bit set to 0;
-    // The CSG in the Login Response MUST be the same with the I-end of this connection;
-    // The T bit can't be 1 if the last Login Response sent by the initiator doesn't
-    // initiate the transistion;
-    // The NSG MUST be the same with the I-end of this connection if Transit is required.
-    // The ISID in the Login Response MUST be the same with this session.
-    //
-    return EFI_PROTOCOL_ERROR;
-  }
-
-  LoginRsp->StatSN    = NTOHL (LoginRsp->StatSN);
-  LoginRsp->ExpCmdSN  = NTOHL (LoginRsp->ExpCmdSN);
-  LoginRsp->MaxCmdSN  = NTOHL (LoginRsp->MaxCmdSN);
-
-  if ((Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION) && (Conn->CHAPStep == ISCSI_CHAP_INITIAL)) {
-    //
-    // If the Login Request is a leading Login Request, the target MUST use
-    // the value presented in CmdSN as the target value for ExpCmdSN.
-    //
-    if ((Session->State == SESSION_STATE_FREE) && (Session->CmdSN != LoginRsp->ExpCmdSN)) {
-      return EFI_PROTOCOL_ERROR;
-    }
-
-    //
-    // It's the initial Login Response, initialize the local ExpStatSN, MaxCmdSN
-    // and ExpCmdSN.
-    //
-    Conn->ExpStatSN   = LoginRsp->StatSN + 1;
-    Session->MaxCmdSN = LoginRsp->MaxCmdSN;
-    Session->ExpCmdSN = LoginRsp->ExpCmdSN;
-  } else {
-    //
-    // Check the StatSN of this PDU
-    //
-    Status = IScsiCheckSN (&Conn->ExpStatSN, LoginRsp->StatSN);
-    if (!EFI_ERROR (Status)) {
-      //
-      // Update the MaxCmdSN and ExpCmdSN
-      //
-      IScsiUpdateCmdSN (Session, LoginRsp->MaxCmdSN, LoginRsp->ExpCmdSN);
-    } else {
-      return Status;
-    }
-  }
-  //
-  // Trim off the header segment.
-  //
-  NetbufTrim (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NET_BUF_HEAD);
-
-  //
-  // Queue this login response first in case it's a partial response so that
-  // later when the full response list is received we can combine these scattered
-  // responses' data segment and then process it.
-  //
-  NET_GET_REF (Pdu);
-  NetbufQueAppend (&Conn->RspQue, Pdu);
-
-  Conn->PartialRspRcvd = Continue;
-  if (Continue) {
-    //
-    // It's a partial response, have to wait for another or more Request/Response
-    // conversations to get the full response.
-    //
-    return EFI_SUCCESS;
-  }
-
-  switch (CurrentStage) {
-  case ISCSI_SECURITY_NEGOTIATION:
-    //
-    // In security negotiation stage, let CHAP module handle it.
-    //
-    Status = IScsiCHAPOnRspReceived (Conn);
-    break;
-
-  case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:
-    //
-    // Response received with negotiation resonse on iSCSI parameters, check them.
-    //
-    Status = IScsiCheckOpParams (Conn);
-    break;
-
-  default:
-    //
-    // Should never get here.
-    //
-    Status = EFI_PROTOCOL_ERROR;
-    break;
-  }
-
-  if (Transit && (Status == EFI_SUCCESS)) {
-    //
-    // Do the state transition.
-    //
-    Conn->CurrentStage = Conn->NextStage;
-
-    if (Conn->CurrentStage == ISCSI_LOGIN_OPERATIONAL_NEGOTIATION) {
-      Conn->NextStage = ISCSI_FULL_FEATURE_PHASE;
-    } else {
-      //
-      // CurrentStage is iSCSI Full Feature, it's the Login-Final Response,
-      // get the TSIH from the Login Response.
-      //
-      Session->Tsih = NTOHS (LoginRsp->Tsih);
-    }
-  }
-  //
-  // Flush the response(s) received.
-  //
-  NetbufQueFlush (&Conn->RspQue);
-
-  return Status;
-}
-
-/**
-  Updated the target information according the data received in the iSCSI
-  login response with an target redirection status.
-
-  @param[in, out] Session      The iSCSI session.
-  @param[in]      Data         The data segment which should contain the
-                               TargetAddress key-value list.
-  @param[in]      Len          Length of the data.
-
-  @retval EFI_SUCCESS          The target address is updated.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_NOT_FOUND        The TargetAddress key is not found.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiUpdateTargetAddress (
-  IN OUT ISCSI_SESSION  *Session,
-  IN CHAR8              *Data,
-  IN UINT32             Len
-  )
-{
-  LIST_ENTRY      *KeyValueList;
-  CHAR8           *TargetAddress;
-  CHAR8           *IpStr;
-  EFI_STATUS      Status;
-  UINTN           Number;
-
-  KeyValueList = IScsiBuildKeyValueList (Data, Len);
-  if (KeyValueList == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Status = EFI_NOT_FOUND;
-
-  while (TRUE) {
-    TargetAddress = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ADDRESS);
-    if (TargetAddress == NULL) {
-      break;
-    }
-
-    if (!NET_IS_DIGIT (TargetAddress[0])) {
-      //
-      // The domainname of the target may be presented in three formats: a DNS host name,
-      // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only accept dotted
-      // IPv4 address.
-      //
-      continue;
-    }
-
-    IpStr = TargetAddress;
-
-    while ((*TargetAddress != 0) && (*TargetAddress != ':') && (*TargetAddress != ',')) {
-      //
-      // NULL, ':' or ',' ends the IPv4 string.
-      //
-      TargetAddress++;
-    }
-
-    if (*TargetAddress == ',') {
-      //
-      // Comma and the portal group tag MUST be ommitted if the TargetAddress is sent
-      // as the result of a redirection.
-      //
-      continue;
-    } else if (*TargetAddress == ':') {
-      *TargetAddress = '\0';
-
-      TargetAddress++;
-
-      Number = AsciiStrDecimalToUintn (TargetAddress);
-      if (Number > 0xFFFF) {
-        continue;
-      } else {
-        Session->ConfigData.NvData.TargetPort = (UINT16) Number;
-      }
-    } else {
-      //
-      // The string only contains the IPv4 address. Use the well known port.
-      //
-      Session->ConfigData.NvData.TargetPort = ISCSI_WELL_KNOWN_PORT;
-    }
-    //
-    // Update the target IP address.
-    //
-    Status = IScsiAsciiStrToIp (IpStr, &Session->ConfigData.NvData.TargetIp);
-    if (EFI_ERROR (Status)) {
-      continue;
-    } else {
-      break;
-    }
-  }
-
-  IScsiFreeKeyValueList (KeyValueList);
-
-  return Status;
-}
-
-/**
-  The callback function to free the net buffer list.
-
-  @param[in]  Arg The opaque parameter.
-**/
-VOID
-EFIAPI
-IScsiFreeNbufList (
-  VOID *Arg
-  )
-{
-  ASSERT (Arg != NULL);
-
-  NetbufFreeList ((LIST_ENTRY     *) Arg);
-  FreePool (Arg);
-}
-
-/**
-  The callback function called in NetBufFree, it does nothing.
-
-  @param[in]   Arg  The opaque parameter.
-**/
-VOID
-EFIAPI
-IScsiNbufExtFree (
-  VOID *Arg
-  )
-{
-}
-
-/**
-  Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU header and
-  an optional data segment. The two parts will be put into two blocks of buffers in the
-  net buffer. The digest check will be conducted in this function if needed and the digests
-  will be trimmed from the PDU buffer.
-
-  @param[in]   Conn        The iSCSI connection to receive data from.
-  @param[out]  Pdu         The received iSCSI pdu.
-  @param[in]   Context     The context used to describe information on the caller provided
-                           buffer to receive data segment of the iSCSI pdu, it's optional.
-  @param[in]  HeaderDigest Whether there will be header digest received.
-  @param[in]  DataDigest   Whether there will be data digest.
-  @param[in]  TimeoutEvent The timeout event, it's optional.
-
-  @retval EFI_SUCCESS          An iSCSI pdu is received.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error happened.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiReceivePdu (
-  IN ISCSI_CONNECTION                      *Conn,
-  OUT NET_BUF                              **Pdu,
-  IN ISCSI_IN_BUFFER_CONTEXT               *Context, OPTIONAL
-  IN BOOLEAN                               HeaderDigest,
-  IN BOOLEAN                               DataDigest,
-  IN EFI_EVENT                             TimeoutEvent OPTIONAL
-  )
-{
-  LIST_ENTRY      *NbufList;
-  UINT32          Len;
-  NET_BUF         *PduHdr;
-  UINT8           *Header;
-  EFI_STATUS      Status;
-  UINT32          PadLen;
-  UINT32          InDataOffset;
-  NET_FRAGMENT    Fragment[2];
-  UINT32          FragmentCount;
-  NET_BUF         *DataSeg;
-  UINT32          PadAndCRC32[2];
-
-  NbufList = AllocatePool (sizeof (LIST_ENTRY));
-  if (NbufList == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  InitializeListHead (NbufList);
-
-  //
-  // The header digest will be received together with the PDU header if exists.
-  //
-  Len     = sizeof (ISCSI_BASIC_HEADER) + (HeaderDigest ? sizeof (UINT32) : 0);
-  PduHdr  = NetbufAlloc (Len);
-  if (PduHdr == NULL) {
-    FreePool (NbufList);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Header = NetbufAllocSpace (PduHdr, Len, NET_BUF_TAIL);
-  ASSERT (Header != NULL);
-  InsertTailList (NbufList, &PduHdr->List);
-
-  //
-  // First step, receive the BHS of the PDU.
-  //
-  Status = Tcp4IoReceive (&Conn->Tcp4Io, PduHdr, FALSE, TimeoutEvent);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  if (HeaderDigest) {
-    //
-    // TODO: check the header-digest.
-    //
-    //
-    // Trim off the digest.
-    //
-    NetbufTrim (PduHdr, sizeof (UINT32), NET_BUF_TAIL);
-  }
-
-  Len = ISCSI_GET_DATASEG_LEN (Header);
-  if (Len == 0) {
-    //
-    // No data segment.Form the pdu from a list of pdu segments.
-    //
-    *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
-    if (*Pdu == NULL) {
-      Status = EFI_OUT_OF_RESOURCES;
-      goto ON_EXIT;
-    }
-    return Status;
-  }
-  //
-  // Get the length of the padding bytes of the data segment.
-  //
-  PadLen = ISCSI_GET_PAD_LEN (Len);
-
-  switch (ISCSI_GET_OPCODE (Header)) {
-  case ISCSI_OPCODE_SCSI_DATA_IN:
-    //
-    // Try to use the buffer described by Context if the PDU is an
-    // iSCSI SCSI data in pdu so as to reduce memory copy overhead.
-    //
-    InDataOffset = ISCSI_GET_BUFFER_OFFSET (Header);
-    if ((Context == NULL) || ((InDataOffset + Len) > Context->InDataLen)) {
-      Status = EFI_PROTOCOL_ERROR;
-      goto ON_EXIT;
-    }
-
-    Fragment[0].Len   = Len;
-    Fragment[0].Bulk  = Context->InData + InDataOffset;
-
-    if (DataDigest || (PadLen != 0)) {
-      //
-      // The data segment is padded, use two fragments to receive it.
-      // The first to receive the useful data. The second to receive the padding.
-      //
-      Fragment[1].Len   = PadLen + (DataDigest ? sizeof (UINT32) : 0);
-      Fragment[1].Bulk  = (UINT8 *)PadAndCRC32 + (4 - PadLen);
-      FragmentCount     = 2;
-    } else {
-      FragmentCount = 1;
-    }
-
-    DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, IScsiNbufExtFree, NULL);
-    if (DataSeg == NULL) {
-      Status = EFI_OUT_OF_RESOURCES;
-      goto ON_EXIT;
-    }
-
-    break;
-
-  case ISCSI_OPCODE_SCSI_RSP:
-  case ISCSI_OPCODE_NOP_IN:
-  case ISCSI_OPCODE_LOGIN_RSP:
-  case ISCSI_OPCODE_TEXT_RSP:
-  case ISCSI_OPCODE_ASYNC_MSG:
-  case ISCSI_OPCODE_REJECT:
-  case ISCSI_OPCODE_VENDOR_T0:
-  case ISCSI_OPCODE_VENDOR_T1:
-  case ISCSI_OPCODE_VENDOR_T2:
-    //
-    // Allocate buffer to receive the data segment.
-    //
-    Len += PadLen + (DataDigest ? sizeof (UINT32) : 0);
-    DataSeg = NetbufAlloc (Len);
-    if (DataSeg == NULL) {
-      Status = EFI_OUT_OF_RESOURCES;
-      goto ON_EXIT;
-    }
-
-    NetbufAllocSpace (DataSeg, Len, NET_BUF_TAIL);
-    break;
-
-  default:
-    Status = EFI_PROTOCOL_ERROR;
-    goto ON_EXIT;
-  }
-
-  InsertTailList (NbufList, &DataSeg->List);
-
-  //
-  // Receive the data segment with the data digest if any.
-  //
-  Status = Tcp4IoReceive (&Conn->Tcp4Io, DataSeg, FALSE, TimeoutEvent);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  if (DataDigest) {
-    //
-    // TODO: Check the data digest.
-    //
-    NetbufTrim (DataSeg, sizeof (UINT32), NET_BUF_TAIL);
-  }
-
-  if (PadLen != 0) {
-    //
-    // Trim off the padding bytes in the data segment.
-    //
-    NetbufTrim (DataSeg, PadLen, NET_BUF_TAIL);
-  }
-
-  //
-  // Form the pdu from a list of pdu segments.
-  //
-  *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
-  if (*Pdu == NULL) {
-    Status = EFI_OUT_OF_RESOURCES;
-  }
-
-ON_EXIT:
-
-  if (EFI_ERROR (Status)) {
-    //
-    // Free the Nbufs in this NbufList and the NbufList itself.
-    //
-    IScsiFreeNbufList (NbufList);
-  }
-
-  return Status;
-}
-
-/**
-  Check and get the result of the prameter negotiation.
-
-  @param[in, out]  Conn          The connection in iSCSI login.
-
-  @retval EFI_SUCCESS          The parmeter check is passed and negotiation is finished.
-  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error happened.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-**/
-EFI_STATUS
-IScsiCheckOpParams (
-  IN OUT ISCSI_CONNECTION  *Conn
-  )
-{
-  EFI_STATUS      Status;
-  LIST_ENTRY      *KeyValueList;
-  CHAR8           *Data;
-  UINT32          Len;
-  ISCSI_SESSION   *Session;
-  CHAR8           *Value;
-  UINTN           NumericValue;
-
-  ASSERT (Conn->RspQue.BufNum != 0);
-
-  Session = Conn->Session;
-
-  Len     = Conn->RspQue.BufSize;
-  Data    = AllocatePool (Len);
-  if (Data == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  NetbufQueCopy (&Conn->RspQue, 0, Len, (UINT8 *) Data);
-
-  Status = EFI_PROTOCOL_ERROR;
-
-  //
-  // Extract the Key-Value pairs into a list.
-  //
-  KeyValueList = IScsiBuildKeyValueList (Data, Len);
-  if (KeyValueList == NULL) {
-    FreePool (Data);
-    return Status;
-  }
-  //
-  // HeaderDigest
-  //
-  Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_HEADER_DIGEST);
-  if (Value == NULL) {
-    goto ON_ERROR;
-  }
-
-  if (AsciiStrCmp (Value, "CRC32") == 0) {
-    if (Conn->HeaderDigest != IScsiDigestCRC32) {
-      goto ON_ERROR;
-    }
-  } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) {
-    Conn->HeaderDigest = IScsiDigestNone;
-  } else {
-    goto ON_ERROR;
-  }
-  //
-  // DataDigest
-  //
-  Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_DIGEST);
-  if (Value == NULL) {
-    goto ON_ERROR;
-  }
-
-  if (AsciiStrCmp (Value, "CRC32") == 0) {
-    if (Conn->DataDigest != IScsiDigestCRC32) {
-      goto ON_ERROR;
-    }
-  } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) {
-    Conn->DataDigest = IScsiDigestNone;
-  } else {
-    goto ON_ERROR;
-  }
-  //
-  // ErrorRecoveryLevel, result fuction is Minimum.
-  //
-  Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_ERROR_RECOVERY_LEVEL);
-  if (Value == NULL) {
-    goto ON_ERROR;
-  }
-
-  NumericValue = AsciiStrDecimalToUintn (Value);
-  if (NumericValue > 2) {
-    goto ON_ERROR;
-  }
-
-  Session->ErrorRecoveryLevel = (UINT8) MIN (Session->ErrorRecoveryLevel, NumericValue);
-
-  //
-  // InitialR2T, result function is OR.
-  //
-  if (!Session->InitialR2T) {
-    Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
-    if (Value == NULL) {
-      goto ON_ERROR;
-    }
-
-    Session->InitialR2T = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
-  }
-
-  //
-  // ImmediateData, result function is AND.
-  //
-  Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_IMMEDIATE_DATA);
-  if (Value == NULL) {
-    goto ON_ERROR;
-  }
-
-  Session->ImmediateData = (BOOLEAN) (Session->ImmediateData && (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0));
-
-  //
-  // MaxRecvDataSegmentLength is declarative.
-  //
-  Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH);
-  if (Value != NULL) {
-    Conn->MaxRecvDataSegmentLength = (UINT32) AsciiStrDecimalToUintn (Value);
-  }
-  //
-  // MaxBurstLength, result funtion is Mininum.
-  //
-  Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_BURST_LENGTH);
-  if (Value == NULL) {
-    goto ON_ERROR;
-  }
-
-  NumericValue            = AsciiStrDecimalToUintn (Value);
-  Session->MaxBurstLength = (UINT32) MIN (Session->MaxBurstLength, NumericValue);
-
-  //
-  // FirstBurstLength, result function is Minimum. Irrelevant when InitialR2T=Yes and
-  // ImmediateData=No.
-  // This Key/Value is negotiation type.
-  //
-  if (!(Session->InitialR2T && !Session->ImmediateData)) {
-    Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH);
-    if (Value == NULL) {
-      goto ON_ERROR;
-    }
-
-    NumericValue              = AsciiStrDecimalToUintn (Value);
-    Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength, NumericValue);
-  }
-
-  //
-  // MaxConnections, result function is Minimum.
-  //
-  Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_CONNECTIONS);
-  if (Value == NULL) {
-    goto ON_ERROR;
-  }
-
-  NumericValue = AsciiStrDecimalToUintn (Value);
-  if ((NumericValue == 0) || (NumericValue > 65535)) {
-    goto ON_ERROR;
-  }
-
-  Session->MaxConnections = (UINT32) MIN (Session->MaxConnections, NumericValue);
-
-  //
-  // DataPDUInOrder, result function is OR.
-  //
-  if (!Session->DataPDUInOrder) {
-    Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER);
-    if (Value == NULL) {
-      goto ON_ERROR;
-    }
-
-    Session->DataPDUInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
-  }
-
-  //
-  // DataSequenceInorder, result function is OR.
-  //
-  if (!Session->DataSequenceInOrder) {
-    Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
-    if (Value == NULL) {
-      goto ON_ERROR;
-    }
-
-    Session->DataSequenceInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
-  }
-
-  //
-  // DefaultTime2Wait, result function is Maximum.
-  //
-  Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DEFAULT_TIME2WAIT);
-  if (Value == NULL) {
-    goto ON_ERROR;
-  }
-
-  NumericValue = AsciiStrDecimalToUintn (Value);
-  if (NumericValue == 0) {
-    Session->DefaultTime2Wait = 0;
-  } else if (NumericValue > 3600) {
-    goto ON_ERROR;
-  } else {
-    Session->DefaultTime2Wait = (UINT32) MAX (Session->DefaultTime2Wait, NumericValue);
-  }
-  //
-  // DefaultTime2Retain, result function is Minimum.
-  //
-  Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DEFAULT_TIME2RETAIN);
-  if (Value == NULL) {
-    goto ON_ERROR;
-  }
-
-  NumericValue = AsciiStrDecimalToUintn (Value);
-  if (NumericValue == 0) {
-    Session->DefaultTime2Retain = 0;
-  } else if (NumericValue > 3600) {
-    goto ON_ERROR;
-  } else {
-    Session->DefaultTime2Retain = (UINT32) MIN (Session->DefaultTime2Retain, NumericValue);
-  }
-  //
-  // MaxOutstandingR2T, result function is Minimum.
-  //
-  Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_OUTSTANDING_R2T);
-  if (Value == NULL) {
-    goto ON_ERROR;
-  }
-
-  NumericValue = AsciiStrDecimalToUintn (Value);
-  if ((NumericValue == 0) || (NumericValue > 65535)) {
-    goto ON_ERROR;
-  }
-
-  Session->MaxOutstandingR2T = (UINT16) MIN (Session->MaxOutstandingR2T, NumericValue);
-
-  //
-  // Remove declarative key-value pairs, if any.
-  //
-  IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE);
-  IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS);
-  IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
-  //
-  // Remove the key-value that may not needed for result function is OR.
-  //
-  IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
-  IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER);
-  IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
-
-  //
-  // Remove irrelevant parameter, if any.
-  //
-  if (Session->InitialR2T && !Session->ImmediateData) {
-    IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH);
-  }
-
-  if (IsListEmpty (KeyValueList)) {
-    //
-    // Succeed if no more keys in the list.
-    //
-    Status = EFI_SUCCESS;
-  }
-
-ON_ERROR:
-
-  IScsiFreeKeyValueList (KeyValueList);
-
-  FreePool (Data);
-
-  return Status;
-}
-
-/**
-  Fill the oprational prameters.
-
-  @param[in]       Conn        The connection in iSCSI login.
-  @param[in, out]  Pdu         The iSCSI login request PDU to fill the parameters.
-
-  @retval EFI_SUCCESS          The parmeters are filled into the iSCSI login request PDU.
-**/
-EFI_STATUS
-IScsiFillOpParams (
-  IN ISCSI_CONNECTION  *Conn,
-  IN OUT NET_BUF       *Pdu
-  )
-{
-  ISCSI_SESSION *Session;
-  CHAR8         Value[256];
-
-  Session = Conn->Session;
-
-  AsciiSPrint (Value, sizeof (Value), "%a", (Conn->HeaderDigest == IScsiDigestCRC32) ? "None,CRC32" : "None");
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_HEADER_DIGEST, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%a", (Conn->DataDigest == IScsiDigestCRC32) ? "None,CRC32" : "None");
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_DIGEST, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%d", Session->ErrorRecoveryLevel);
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_ERROR_RECOVERY_LEVEL, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%a", Session->InitialR2T ? "Yes" : "No");
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIAL_R2T, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%a", Session->ImmediateData ? "Yes" : "No");
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_IMMEDIATE_DATA, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%d", MAX_RECV_DATA_SEG_LEN_IN_FFP);
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxBurstLength);
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_BURST_LENGTH, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%d", Session->FirstBurstLength);
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_FIRST_BURST_LENGTH, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxConnections);
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_CONNECTIONS, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%a", Session->DataPDUInOrder ? "Yes" : "No");
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_PDU_IN_ORDER, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%a", Session->DataSequenceInOrder ? "Yes" : "No");
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Wait);
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2WAIT, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Retain);
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2RETAIN, Value);
-
-  AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxOutstandingR2T);
-  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_OUTSTANDING_R2T, Value);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Pad the iSCSI AHS or data segment to an integer number of 4 byte words.
-
-  @param[in, out]  Pdu         The iSCSI pdu which contains segments to pad.
-  @param[in]       Len         The length of the last semgnet in the PDU.
-
-  @retval EFI_SUCCESS          The segment is padded or no need to pad it.
-  @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space to add the
-                               padding bytes.
-**/
-EFI_STATUS
-IScsiPadSegment (
-  IN OUT NET_BUF  *Pdu,
-  IN UINT32       Len
-  )
-{
-  UINT32  PadLen;
-  UINT8   *Data;
-
-  PadLen = ISCSI_GET_PAD_LEN (Len);
-
-  if (PadLen != 0) {
-    Data = NetbufAllocSpace (Pdu, PadLen, NET_BUF_TAIL);
-    if (Data == NULL) {
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    ZeroMem (Data, PadLen);
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Build a key-value list from the data segment.
-
-  @param[in]  Data The data segment containing the key-value pairs.
-  @param[in]  Len  Length of the data segment.
-
-  @return The key-value list.
-  @retval NULL Other errors as indicated.
-**/
-LIST_ENTRY *
-IScsiBuildKeyValueList (
-  IN CHAR8  *Data,
-  IN UINT32 Len
-  )
-{
-  LIST_ENTRY            *ListHead;
-  ISCSI_KEY_VALUE_PAIR  *KeyValuePair;
-
-  ListHead = AllocatePool (sizeof (LIST_ENTRY));
-  if (ListHead == NULL) {
-    return NULL;
-  }
-
-  InitializeListHead (ListHead);
-
-  while (Len > 0) {
-    KeyValuePair = AllocatePool (sizeof (ISCSI_KEY_VALUE_PAIR));
-    if (KeyValuePair == NULL) {
-      goto ON_ERROR;
-    }
-
-    InitializeListHead (&KeyValuePair->List);
-
-    KeyValuePair->Key = Data;
-
-    while ((Len > 0) && (*Data != '=')) {
-      Len--;
-      Data++;
-    }
-
-    if (*Data == '=') {
-      *Data = '\0';
-
-      Data++;
-      Len--;
-    } else {
-      FreePool (KeyValuePair);
-      goto ON_ERROR;
-    }
-
-    KeyValuePair->Value = Data;
-
-    InsertTailList (ListHead, &KeyValuePair->List);;
-
-    Data += AsciiStrLen (KeyValuePair->Value) + 1;
-    Len -= (UINT32) AsciiStrLen (KeyValuePair->Value) + 1;
-  }
-
-  return ListHead;
-
-ON_ERROR:
-
-  IScsiFreeKeyValueList (ListHead);
-
-  return NULL;
-}
-
-/**
-  Get the value string by the key name from the key-value list. If found,
-  the key-value entry will be removed from the list.
-
-  @param[in, out]  KeyValueList  The key-value list.
-  @param[in]       Key           The key name to find.
-
-  @return The value string.
-**/
-CHAR8 *
-IScsiGetValueByKeyFromList (
-  IN OUT LIST_ENTRY  *KeyValueList,
-  IN CHAR8           *Key
-  )
-{
-  LIST_ENTRY            *Entry;
-  ISCSI_KEY_VALUE_PAIR  *KeyValuePair;
-  CHAR8                 *Value;
-
-  Value = NULL;
-
-  NET_LIST_FOR_EACH (Entry, KeyValueList) {
-    KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, List);
-
-    if (AsciiStrCmp (KeyValuePair->Key, Key) == 0) {
-      Value = KeyValuePair->Value;
-
-      RemoveEntryList (&KeyValuePair->List);
-      FreePool (KeyValuePair);
-      break;
-    }
-  }
-
-  return Value;
-}
-
-/**
-  Free the key-value list.
-
-  @param[in]  KeyValueList The key-value list.
-**/
-VOID
-IScsiFreeKeyValueList (
-  IN LIST_ENTRY      *KeyValueList
-  )
-{
-  LIST_ENTRY            *Entry;
-  ISCSI_KEY_VALUE_PAIR  *KeyValuePair;
-
-  while (!IsListEmpty (KeyValueList)) {
-    Entry         = NetListRemoveHead (KeyValueList);
-    KeyValuePair  = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, List);
-
-    FreePool (KeyValuePair);
-  }
-
-  FreePool (KeyValueList);
-}
-
-/**
-  Normalize the iSCSI name according to RFC.
-
-  @param[in, out]  Name       The iSCSI name.
-  @param[in]       Len        length of the iSCSI name.
-
-  @retval EFI_SUCCESS        The iSCSI name is valid and normalized.
-  @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the IQN format.
-**/
-EFI_STATUS
-IScsiNormalizeName (
-  IN OUT CHAR8  *Name,
-  IN UINTN      Len
-  )
-{
-  UINTN Index;
-
-  for (Index = 0; Index < Len; Index++) {
-    if (NET_IS_UPPER_CASE_CHAR (Name[Index])) {
-      //
-      // Convert the upper-case characters to lower-case ones
-      //
-      Name[Index] = (CHAR8) (Name[Index] - 'A' + 'a');
-    }
-
-    if (!NET_IS_LOWER_CASE_CHAR (Name[Index]) &&
-        !NET_IS_DIGIT (Name[Index]) &&
-        (Name[Index] != '-') &&
-        (Name[Index] != '.') &&
-        (Name[Index] != ':')
-        ) {
-      //
-      // ASCII dash, dot, colon lower-case characters and digit characters
-      // are allowed.
-      //
-      return EFI_PROTOCOL_ERROR;
-    }
-  }
-
-  if ((Len < 4) || (CompareMem (Name, "iqn.", 4) != 0)) {
-    //
-    // Only IQN format is accepted now.
-    //
-    return EFI_PROTOCOL_ERROR;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Create an iSCSI task control block.
-
-  @param[in]   Conn           The connection on which the task control block will be created.
-  @param[out]  Tcb            The newly created task control block.
-
-  @retval EFI_SUCCESS          The task control block is created.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_NOT_READY        The target can not accept new commands.
-**/
-EFI_STATUS
-IScsiNewTcb (
-  IN  ISCSI_CONNECTION  *Conn,
-  OUT ISCSI_TCB         **Tcb
-  )
-{
-  ISCSI_SESSION *Session;
-  ISCSI_TCB     *NewTcb;
-
-  ASSERT (Tcb != NULL);
-
-  Session = Conn->Session;
-
-  if (ISCSI_SEQ_GT (Session->CmdSN, Session->MaxCmdSN)) {
-    return EFI_NOT_READY;
-  }
-
-  NewTcb = AllocateZeroPool (sizeof (ISCSI_TCB));
-  if (NewTcb == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  InitializeListHead (&NewTcb->Link);
-
-  NewTcb->SoFarInOrder      = TRUE;
-  NewTcb->InitiatorTaskTag  = Session->InitiatorTaskTag;
-  NewTcb->CmdSN             = Session->CmdSN;
-  NewTcb->Conn              = Conn;
-
-  InsertTailList (&Session->TcbList, &NewTcb->Link);
-
-  //
-  // Advance the initiator task tag.
-  //
-  Session->InitiatorTaskTag++;
-  Session->CmdSN++;
-
-  *Tcb = NewTcb;
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Delete the tcb from the connection and destroy it.
-
-  @param[in]  Tcb The tcb to delete.
-**/
-VOID
-IScsiDelTcb (
-  IN ISCSI_TCB  *Tcb
-  )
-{
-  RemoveEntryList (&Tcb->Link);
-
-  FreePool (Tcb);
-}
-
-
-/**
-  Create a data segment, pad it and calculate the CRC if needed.
-
-  @param[in]  Data       The data to fill into the data segment.
-  @param[in]  Len        Length of the data.
-  @param[in]  DataDigest Whether to calculate CRC for this data segment.
-
-  @return The net buffer wrapping the data segment.
-**/
-NET_BUF *
-IScsiNewDataSegment (
-  IN UINT8    *Data,
-  IN UINT32   Len,
-  IN BOOLEAN  DataDigest
-  )
-{
-  NET_FRAGMENT  Fragment[2];
-  UINT32        FragmentCount;
-  UINT32        PadLen;
-  NET_BUF       *DataSeg;
-
-  Fragment[0].Len   = Len;
-  Fragment[0].Bulk  = Data;
-
-  PadLen            = ISCSI_GET_PAD_LEN (Len);
-  if (PadLen != 0) {
-    Fragment[1].Len   = PadLen;
-    Fragment[1].Bulk  = (UINT8 *) &mDataSegPad;
-
-    FragmentCount     = 2;
-  } else {
-    FragmentCount = 1;
-  }
-
-  DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, IScsiNbufExtFree, NULL);
-
-  return DataSeg;
-}
-
-/**
-  Create a iSCSI SCSI command PDU to encapsulate the command issued
-  by SCSI through the EXT SCSI PASS THRU Protocol.
-
-  @param[in]  Packet The EXT SCSI PASS THRU request packet containing the SCSI command.
-  @param[in]  Lun    The LUN.
-  @param[in]  Tcb    The tcb associated with this SCSI command.
-
-  @return The  created iSCSI SCSI command PDU.
-  @retval NULL Other errors as indicated.
-**/
-NET_BUF *
-IScsiNewScsiCmdPdu (
-  IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
-  IN UINT64                                     Lun,
-  IN ISCSI_TCB                                  *Tcb
-  )
-{
-  LIST_ENTRY                      *NbufList;
-  NET_BUF                         *Pdu;
-  NET_BUF                         *PduHeader;
-  NET_BUF                         *DataSeg;
-  SCSI_COMMAND                    *ScsiCmd;
-  UINT8                           AHSLength;
-  UINT32                          Length;
-  ISCSI_ADDITIONAL_HEADER         *Header;
-  ISCSI_BI_EXP_READ_DATA_LEN_AHS  *BiExpReadDataLenAHS;
-  ISCSI_SESSION                   *Session;
-  UINT32                          ImmediateDataLen;
-
-  AHSLength = 0;
-
-  if (Packet->DataDirection == DataBi) {
-    //
-    // Bi directional Read/Write command, the bidirectional expected
-    // read data length AHS is required.
-    //
-    AHSLength += sizeof (ISCSI_BI_EXP_READ_DATA_LEN_AHS);
-  }
-
-  if (Packet->CdbLength > 16) {
-    //
-    // The CDB exceeds 16 bytes, an extended CDB AHS is required.
-    //
-    AHSLength = (UINT8) (AHSLength + (ISCSI_ROUNDUP (Packet->CdbLength - 16) + sizeof (ISCSI_ADDITIONAL_HEADER)));
-  }
-
-  Length    = sizeof (SCSI_COMMAND) + AHSLength;
-  PduHeader = NetbufAlloc (Length);
-  if (PduHeader == NULL) {
-    return NULL;
-  }
-
-  ScsiCmd = (SCSI_COMMAND *) NetbufAllocSpace (PduHeader, Length, NET_BUF_TAIL);
-  if (ScsiCmd == NULL) {
-    NetbufFree (PduHeader);
-    return NULL;
-  }
-  Header  = (ISCSI_ADDITIONAL_HEADER *) (ScsiCmd + 1);
-
-  ZeroMem (ScsiCmd, Length);
-
-  ISCSI_SET_OPCODE (ScsiCmd, ISCSI_OPCODE_SCSI_CMD, 0);
-  ISCSI_SET_FLAG (ScsiCmd, ISCSI_TASK_ATTR_SIMPLE);
-
-  //
-  // Set the READ/WRITE flags according to the IO type of this request.
-  //
-  switch (Packet->DataDirection) {
-  case DataIn:
-    ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ);
-    ScsiCmd->ExpDataXferLength = NTOHL (Packet->InTransferLength);
-    break;
-
-  case DataOut:
-    ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_WRITE);
-    ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength);
-    break;
-
-  case DataBi:
-    ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ | SCSI_CMD_PDU_FLAG_WRITE);
-    ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength);
-
-    //
-    // Fill the bidirectional expected read data length AHS.
-    //
-    BiExpReadDataLenAHS                     = (ISCSI_BI_EXP_READ_DATA_LEN_AHS *) Header;
-    Header = (ISCSI_ADDITIONAL_HEADER *) (BiExpReadDataLenAHS + 1);
-
-    BiExpReadDataLenAHS->Length = NTOHS (5);
-    BiExpReadDataLenAHS->Type = ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN;
-    BiExpReadDataLenAHS->ExpReadDataLength = NTOHL (Packet->InTransferLength);
-
-    break;
-  }
-
-  ScsiCmd->TotalAHSLength = AHSLength;
-  CopyMem (ScsiCmd->Lun, &Lun, sizeof (ScsiCmd->Lun));
-  ScsiCmd->InitiatorTaskTag = NTOHL (Tcb->InitiatorTaskTag);
-  ScsiCmd->CmdSN            = NTOHL (Tcb->CmdSN);
-  ScsiCmd->ExpStatSN        = NTOHL (Tcb->Conn->ExpStatSN);
-
-  CopyMem (ScsiCmd->Cdb, Packet->Cdb, sizeof (ScsiCmd->Cdb));
-
-  if (Packet->CdbLength > 16) {
-    Header->Length  = NTOHS ((UINT16) (Packet->CdbLength - 15));
-    Header->Type    = ISCSI_AHS_TYPE_EXT_CDB;
-
-    CopyMem (Header + 1, (UINT8 *) Packet->Cdb + 16, Packet->CdbLength - 16);
-  }
-
-  Pdu               = PduHeader;
-  Session           = Tcb->Conn->Session;
-  ImmediateDataLen  = 0;
-
-  if (Session->ImmediateData && (Packet->OutTransferLength != 0)) {
-    //
-    // Send immediate data in this SCSI Command PDU. The length of the immeidate
-    // data is the minimum of FirstBurstLength, the data length to be xfered and
-    // the MaxRecvdataSegmentLength on this connection.
-    //
-    ImmediateDataLen  = MIN (Session->FirstBurstLength, Packet->OutTransferLength);
-    ImmediateDataLen  = MIN (ImmediateDataLen, Tcb->Conn->MaxRecvDataSegmentLength);
-
-    //
-    // Update the data segment length in the PDU header.
-    //
-    ISCSI_SET_DATASEG_LEN (ScsiCmd, ImmediateDataLen);
-
-    //
-    // Create the data segment.
-    //
-    DataSeg = IScsiNewDataSegment ((UINT8 *) Packet->OutDataBuffer, ImmediateDataLen, FALSE);
-    if (DataSeg == NULL) {
-      NetbufFree (PduHeader);
-      Pdu = NULL;
-      goto ON_EXIT;
-    }
-
-    NbufList = AllocatePool (sizeof (LIST_ENTRY));
-    if (NbufList == NULL) {
-      NetbufFree (PduHeader);
-      NetbufFree (DataSeg);
-
-      Pdu = NULL;
-      goto ON_EXIT;
-    }
-
-    InitializeListHead (NbufList);
-    InsertTailList (NbufList, &PduHeader->List);
-    InsertTailList (NbufList, &DataSeg->List);
-
-    Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
-    if (Pdu == NULL) {
-      IScsiFreeNbufList (NbufList);
-    }
-  }
-
-  if (Session->InitialR2T ||
-      (ImmediateDataLen == Session->FirstBurstLength) ||
-      (ImmediateDataLen == Packet->OutTransferLength)
-      ) {
-    //
-    // Unsolicited data out sequence is not allowed,
-    // or FirstBurstLength data is already sent out by immediate data
-    // or all the OUT data accompany this SCSI packet is sent as
-    // immediate data, the final flag should be set on this SCSI Command
-    // PDU.
-    //
-    ISCSI_SET_FLAG (ScsiCmd, ISCSI_BHS_FLAG_FINAL);
-  }
-
-ON_EXIT:
-
-  return Pdu;
-}
-
-/**
-  Create a new iSCSI SCSI Data Out PDU.
-
-  @param[in]  Data   The data to put into the Data Out PDU.
-  @param[in]  Len    Length of the data.
-  @param[in]  DataSN The DataSN of the Data Out PDU.
-  @param[in]  Tcb    The task control block of this Data Out PDU.
-  @param[in]  Lun    The LUN.
-
-  @return The net buffer wrapping the Data Out PDU.
-  @retval NULL Other errors as indicated.
-**/
-NET_BUF *
-IScsiNewDataOutPdu (
-  IN UINT8      *Data,
-  IN UINT32     Len,
-  IN UINT32     DataSN,
-  IN ISCSI_TCB  *Tcb,
-  IN UINT64     Lun
-  )
-{
-  LIST_ENTRY          *NbufList;
-  NET_BUF             *PduHdr;
-  NET_BUF             *DataSeg;
-  NET_BUF             *Pdu;
-  ISCSI_SCSI_DATA_OUT *DataOutHdr;
-  ISCSI_XFER_CONTEXT  *XferContext;
-
-  NbufList = AllocatePool (sizeof (LIST_ENTRY));
-  if (NbufList == NULL) {
-    return NULL;
-  }
-
-  InitializeListHead (NbufList);
-
-  //
-  // Allocate memory for the BHS.
-  //
-  PduHdr = NetbufAlloc (sizeof (ISCSI_SCSI_DATA_OUT));
-  if (PduHdr == NULL) {
-    FreePool (NbufList);
-    return NULL;
-  }
-  //
-  // Insert the BHS into the buffer list.
-  //
-  InsertTailList (NbufList, &PduHdr->List);
-
-  DataOutHdr  = (ISCSI_SCSI_DATA_OUT *) NetbufAllocSpace (PduHdr, sizeof (ISCSI_SCSI_DATA_OUT), NET_BUF_TAIL);
-  ASSERT (DataOutHdr != NULL);
-  XferContext = &Tcb->XferContext;
-
-  ZeroMem (DataOutHdr, sizeof (ISCSI_SCSI_DATA_OUT));
-
-  //
-  // Set the flags and fields of the Data Out PDU BHS.
-  //
-  ISCSI_SET_OPCODE (DataOutHdr, ISCSI_OPCODE_SCSI_DATA_OUT, 0);
-  ISCSI_SET_DATASEG_LEN (DataOutHdr, Len);
-
-  DataOutHdr->InitiatorTaskTag  = HTONL (Tcb->InitiatorTaskTag);
-  DataOutHdr->TargetTransferTag = HTONL (XferContext->TargetTransferTag);
-  DataOutHdr->ExpStatSN         = HTONL (Tcb->Conn->ExpStatSN);
-  DataOutHdr->DataSN            = HTONL (DataSN);
-  DataOutHdr->BufferOffset      = HTONL (XferContext->Offset);
-
-  if (XferContext->TargetTransferTag != ISCSI_RESERVED_TAG) {
-    CopyMem (&DataOutHdr->Lun, &Lun, sizeof (DataOutHdr->Lun));
-  }
-  //
-  // Build the data segment for this Data Out PDU.
-  //
-  DataSeg = IScsiNewDataSegment (Data, Len, FALSE);
-  if (DataSeg == NULL) {
-    IScsiFreeNbufList (NbufList);
-    return NULL;
-  }
-  //
-  // Put the data segment into the buffer list and combine it with the BHS
-  // into a full Data Out PDU.
-  //
-  InsertTailList (NbufList, &DataSeg->List);
-  Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
-  if (Pdu == NULL) {
-    IScsiFreeNbufList (NbufList);
-  }
-
-  return Pdu;
-}
-
-/**
-  Generate a consecutive sequence of iSCSI SCSI Data Out PDUs.
-
-  @param[in]  Data The data  which will be carried by the sequence of iSCSI SCSI Data Out PDUs.
-  @param[in]  Tcb  The task control block of the data to send out.
-  @param[in]  Lun  The LUN the data will be sent to.
-
-  @return A list of net buffers with each of them wraps an iSCSI SCSI Data Out PDU.
-  @retval NULL Other errors as indicated.
-**/
-LIST_ENTRY *
-IScsiGenerateDataOutPduSequence (
-  IN UINT8      *Data,
-  IN ISCSI_TCB  *Tcb,
-  IN UINT64     Lun
-  )
-{
-  LIST_ENTRY          *PduList;
-  UINT32              DataSN;
-  UINT32              DataLen;
-  NET_BUF             *DataOutPdu;
-  ISCSI_CONNECTION    *Conn;
-  ISCSI_XFER_CONTEXT  *XferContext;
-  UINT8               *DataOutPacket;
-
-  PduList = AllocatePool (sizeof (LIST_ENTRY));
-  if (PduList == NULL) {
-    return NULL;
-  }
-
-  InitializeListHead (PduList);
-
-  DataSN      = 0;
-  Conn        = Tcb->Conn;
-  DataOutPdu  = NULL;
-  XferContext = &Tcb->XferContext;
-
-  while (XferContext->DesiredLength > 0) {
-    //
-    // Determine the length of data this Data Out PDU can carry.
-    //
-    DataLen = MIN (XferContext->DesiredLength, Conn->MaxRecvDataSegmentLength);
-
-    //
-    // Create a Data Out PDU.
-    //
-    DataOutPdu = IScsiNewDataOutPdu (Data, DataLen, DataSN, Tcb, Lun);
-    if (DataOutPdu == NULL) {
-      IScsiFreeNbufList (PduList);
-      PduList = NULL;
-
-      goto ON_EXIT;
-    }
-
-    InsertTailList (PduList, &DataOutPdu->List);
-
-    //
-    // Update the context and DataSN.
-    //
-    XferContext->Offset += DataLen;
-    XferContext->DesiredLength -= DataLen;
-    DataSN++;
-    Data += DataLen;
-  }
-  //
-  // Set the F bit for the last data out PDU in this sequence.
-  //
-  DataOutPacket = NetbufGetByte (DataOutPdu, 0, NULL);
-  if (DataOutPacket == NULL) {
-    IScsiFreeNbufList (PduList);
-    PduList = NULL;
-    goto ON_EXIT;
-  }
-
-  ISCSI_SET_FLAG (DataOutPacket, ISCSI_BHS_FLAG_FINAL);
-
-ON_EXIT:
-
-  return PduList;
-}
-
-/**
-  Send the Data in a sequence of Data Out PDUs one by one.
-
-  @param[in]  Data            The data to carry by Data Out PDUs.
-  @param[in]  Lun             The LUN the data will be sent to.
-  @param[in]  Tcb             The task control block.
-
-  @retval EFI_SUCCES           The data is sent out to the LUN.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiSendDataOutPduSequence (
-  IN UINT8      *Data,
-  IN UINT64     Lun,
-  IN ISCSI_TCB  *Tcb
-  )
-{
-  LIST_ENTRY      *DataOutPduList;
-  LIST_ENTRY      *Entry;
-  NET_BUF         *Pdu;
-  EFI_STATUS      Status;
-
-  //
-  // Generate the Data Out PDU sequence.
-  //
-  DataOutPduList = IScsiGenerateDataOutPduSequence (Data, Tcb, Lun);
-  if (DataOutPduList == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Status = EFI_SUCCESS;
-
-  //
-  // Send the Data Out PDU's one by one.
-  //
-  NET_LIST_FOR_EACH (Entry, DataOutPduList) {
-    Pdu     = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
-
-    Status  = Tcp4IoTransmit (&Tcb->Conn->Tcp4Io, Pdu);
-    if (EFI_ERROR (Status)) {
-      break;
-    }
-  }
-
-  IScsiFreeNbufList (DataOutPduList);
-
-  return Status;
-}
-
-/**
-  Process the received iSCSI SCSI Data In PDU.
-
-  @param[in]        Pdu      The Data In PDU received.
-  @param[in]        Tcb      The task control block.
-  @param[in, out]   Packet   The EXT SCSI PASS THRU request packet.
-
-  @retval EFI_SUCCES           The check on the Data IN PDU is passed and some update
-                               actions are taken.
-  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol errror happened.
-  @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the request.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiOnDataInRcvd (
-  IN NET_BUF                                         *Pdu,
-  IN ISCSI_TCB                                       *Tcb,
-  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
-  )
-{
-  ISCSI_SCSI_DATA_IN  *DataInHdr;
-  EFI_STATUS          Status;
-
-  DataInHdr                   = (ISCSI_SCSI_DATA_IN *) NetbufGetByte (Pdu, 0, NULL);
-  if (DataInHdr == NULL) {
-    return EFI_PROTOCOL_ERROR;
-  }
-
-  DataInHdr->InitiatorTaskTag = NTOHL (DataInHdr->InitiatorTaskTag);
-  DataInHdr->ExpCmdSN         = NTOHL (DataInHdr->ExpCmdSN);
-  DataInHdr->MaxCmdSN         = NTOHL (DataInHdr->MaxCmdSN);
-  DataInHdr->DataSN           = NTOHL (DataInHdr->DataSN);
-
-  //
-  // Check the DataSN.
-  //
-  Status = IScsiCheckSN (&Tcb->ExpDataSN, DataInHdr->DataSN);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  if (DataInHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) {
-    return EFI_PROTOCOL_ERROR;
-  }
-  //
-  // Update the command related sequence numbers.
-  //
-  IScsiUpdateCmdSN (Tcb->Conn->Session, DataInHdr->MaxCmdSN, DataInHdr->ExpCmdSN);
-
-  if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_STATUS_VALID)) {
-    if (!ISCSI_FLAG_ON (DataInHdr, ISCSI_BHS_FLAG_FINAL)) {
-      //
-      // The S bit is on but the F bit is off.
-      //
-      return EFI_PROTOCOL_ERROR;
-    }
-
-    Tcb->StatusXferd = TRUE;
-
-    if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_OVERFLOW | SCSI_DATA_IN_PDU_FLAG_UNDERFLOW)) {
-      //
-      // Underflow and Overflow are mutual flags.
-      //
-      return EFI_PROTOCOL_ERROR;
-    }
-    //
-    // S bit is on, the StatSN is valid.
-    //
-    Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NTOHL (DataInHdr->StatSN));
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-
-    Packet->HostAdapterStatus = 0;
-    Packet->TargetStatus      = DataInHdr->Status;
-
-    if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) {
-      Packet->InTransferLength += NTOHL (DataInHdr->ResidualCount);
-      Status = EFI_BAD_BUFFER_SIZE;
-    }
-
-    if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) {
-      Packet->InTransferLength -= NTOHL (DataInHdr->ResidualCount);
-    }
-  }
-
-  return Status;
-}
-
-/**
-  Process the received iSCSI R2T PDU.
-
-  @param[in]       Pdu       The R2T PDU received.
-  @param[in]       Tcb       The task control block.
-  @param[in]       Lun       The Lun.
-  @param[in, out]  Packet    The EXT SCSI PASS THRU request packet.
-
-  @retval EFI_SUCCES         The R2T PDU is valid and the solicited data is sent out.
-  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
-  @retval Others             Other errors as indicated.
-**/
-EFI_STATUS
-IScsiOnR2TRcvd (
-  IN NET_BUF                                         *Pdu,
-  IN ISCSI_TCB                                       *Tcb,
-  IN UINT64                                          Lun,
-  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
-  )
-{
-  ISCSI_READY_TO_TRANSFER *R2THdr;
-  EFI_STATUS              Status;
-  ISCSI_XFER_CONTEXT      *XferContext;
-  UINT8                   *Data;
-
-  R2THdr = (ISCSI_READY_TO_TRANSFER *) NetbufGetByte (Pdu, 0, NULL);
-  if (R2THdr == NULL) {
-    return EFI_PROTOCOL_ERROR;
-  }
-
-  R2THdr->InitiatorTaskTag = NTOHL (R2THdr->InitiatorTaskTag);
-  R2THdr->TargetTransferTag = NTOHL (R2THdr->TargetTransferTag);
-  R2THdr->StatSN = NTOHL (R2THdr->StatSN);
-  R2THdr->R2TSeqNum = NTOHL (R2THdr->R2TSeqNum);
-  R2THdr->BufferOffset = NTOHL (R2THdr->BufferOffset);
-  R2THdr->DesiredDataTransferLength = NTOHL (R2THdr->DesiredDataTransferLength);
-
-  if ((R2THdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) || !ISCSI_SEQ_EQ (R2THdr->StatSN, Tcb->Conn->ExpStatSN)) {
-    return EFI_PROTOCOL_ERROR;;
-  }
-  //
-  // Check the sequence number.
-  //
-  Status = IScsiCheckSN (&Tcb->ExpDataSN, R2THdr->R2TSeqNum);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  XferContext                     = &Tcb->XferContext;
-  XferContext->TargetTransferTag  = R2THdr->TargetTransferTag;
-  XferContext->Offset             = R2THdr->BufferOffset;
-  XferContext->DesiredLength      = R2THdr->DesiredDataTransferLength;
-
-  if (((XferContext->Offset + XferContext->DesiredLength) > Packet->OutTransferLength) ||
-      (XferContext->DesiredLength > Tcb->Conn->Session->MaxBurstLength)
-      ) {
-    return EFI_PROTOCOL_ERROR;
-  }
-  //
-  // Send the data solicited by this R2T.
-  //
-  Data    = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset;
-  Status  = IScsiSendDataOutPduSequence (Data, Lun, Tcb);
-
-  return Status;
-}
-
-/**
-  Process the received iSCSI SCSI Response PDU.
-
-  @param[in]       Pdu      The Response PDU received.
-  @param[in]       Tcb      The task control block.
-  @param[in, out]  Packet   The EXT SCSI PASS THRU request packet.
-
-  @retval EFI_SUCCES         The Response PDU is processed.
-  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
-  @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the request.
-  @retval Others             Other errors as indicated.
-**/
-EFI_STATUS
-IScsiOnScsiRspRcvd (
-  IN NET_BUF                                         *Pdu,
-  IN ISCSI_TCB                                       *Tcb,
-  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
-  )
-{
-  SCSI_RESPONSE     *ScsiRspHdr;
-  ISCSI_SENSE_DATA  *SenseData;
-  EFI_STATUS        Status;
-  UINT32            DataSegLen;
-
-  ScsiRspHdr                    = (SCSI_RESPONSE *) NetbufGetByte (Pdu, 0, NULL);
-  if (ScsiRspHdr == NULL) {
-    return EFI_PROTOCOL_ERROR;
-  }
-
-  ScsiRspHdr->InitiatorTaskTag  = NTOHL (ScsiRspHdr->InitiatorTaskTag);
-  if (ScsiRspHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) {
-    return EFI_PROTOCOL_ERROR;
-  }
-
-  ScsiRspHdr->StatSN  = NTOHL (ScsiRspHdr->StatSN);
-
-  Status              = IScsiCheckSN (&Tcb->Conn->ExpStatSN, ScsiRspHdr->StatSN);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  ScsiRspHdr->MaxCmdSN  = NTOHL (ScsiRspHdr->MaxCmdSN);
-  ScsiRspHdr->ExpCmdSN  = NTOHL (ScsiRspHdr->ExpCmdSN);
-  IScsiUpdateCmdSN (Tcb->Conn->Session, ScsiRspHdr->MaxCmdSN, ScsiRspHdr->ExpCmdSN);
-
-  Tcb->StatusXferd          = TRUE;
-
-  Packet->HostAdapterStatus = ScsiRspHdr->Response;
-  if (Packet->HostAdapterStatus != ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET) {
-    return EFI_SUCCESS;
-  }
-
-  Packet->TargetStatus = ScsiRspHdr->Status;
-
-  if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW | SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW) ||
-      ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW | SCSI_RSP_PDU_FLAG_UNDERFLOW)
-        ) {
-    return EFI_PROTOCOL_ERROR;
-  }
-
-  if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW)) {
-    Packet->InTransferLength += NTOHL (ScsiRspHdr->BiReadResidualCount);
-    Status = EFI_BAD_BUFFER_SIZE;
-  }
-
-  if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW)) {
-    Packet->InTransferLength -= NTOHL (ScsiRspHdr->BiReadResidualCount);
-  }
-
-  if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) {
-    if (Packet->DataDirection == DataIn) {
-      Packet->InTransferLength += NTOHL (ScsiRspHdr->ResidualCount);
-    } else {
-      Packet->OutTransferLength += NTOHL (ScsiRspHdr->ResidualCount);
-    }
-
-    Status = EFI_BAD_BUFFER_SIZE;
-  }
-
-  if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) {
-    if (Packet->DataDirection == DataIn) {
-      Packet->InTransferLength -= NTOHL (ScsiRspHdr->ResidualCount);
-    } else {
-      Packet->OutTransferLength -= NTOHL (ScsiRspHdr->ResidualCount);
-    }
-  }
-
-  DataSegLen = ISCSI_GET_DATASEG_LEN (ScsiRspHdr);
-  if (DataSegLen != 0) {
-    SenseData               = (ISCSI_SENSE_DATA *) NetbufGetByte (Pdu, sizeof (SCSI_RESPONSE), NULL);
-    if (SenseData == NULL) {
-      return EFI_PROTOCOL_ERROR;
-    }
-
-    SenseData->Length       = NTOHS (SenseData->Length);
-
-    Packet->SenseDataLength = (UINT8) MIN (SenseData->Length, Packet->SenseDataLength);
-    if (Packet->SenseDataLength != 0) {
-      CopyMem (Packet->SenseData, &SenseData->Data[0], Packet->SenseDataLength);
-    }
-  } else {
-    Packet->SenseDataLength = 0;
-  }
-
-  return Status;
-}
-
-/**
-  Process the received NOP In PDU.
-
-  @param[in]  Pdu            The NOP In PDU received.
-  @param[in]  Tcb            The task control block.
-
-  @retval EFI_SUCCES         The NOP In PDU is processed and the related sequence
-                             numbers are updated.
-  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
-**/
-EFI_STATUS
-IScsiOnNopInRcvd (
-  IN NET_BUF    *Pdu,
-  IN ISCSI_TCB  *Tcb
-  )
-{
-  ISCSI_NOP_IN  *NopInHdr;
-  EFI_STATUS    Status;
-
-  NopInHdr            = (ISCSI_NOP_IN *) NetbufGetByte (Pdu, 0, NULL);
-  if (NopInHdr == NULL) {
-    return EFI_PROTOCOL_ERROR;
-  }
-
-  NopInHdr->StatSN    = NTOHL (NopInHdr->StatSN);
-  NopInHdr->ExpCmdSN  = NTOHL (NopInHdr->ExpCmdSN);
-  NopInHdr->MaxCmdSN  = NTOHL (NopInHdr->MaxCmdSN);
-
-  if (NopInHdr->InitiatorTaskTag == ISCSI_RESERVED_TAG) {
-    if (NopInHdr->StatSN != Tcb->Conn->ExpStatSN) {
-      return EFI_PROTOCOL_ERROR;
-    }
-  } else {
-    Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NopInHdr->StatSN);
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  }
-
-  IScsiUpdateCmdSN (Tcb->Conn->Session, NopInHdr->MaxCmdSN, NopInHdr->ExpCmdSN);
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Execute the SCSI command issued through the EXT SCSI PASS THRU protocol.
-
-  @param[in]       PassThru  The EXT SCSI PASS THRU protocol.
-  @param[in]       Target    The target ID.
-  @param[in]       Lun       The LUN.
-  @param[in, out]  Packet    The request packet containing IO request, SCSI command
-                             buffer and buffers to read/write.
-
-  @retval EFI_SUCCES           The SCSI command is executed and the result is updated to
-                               the Packet.
-  @retval EFI_DEVICE_ERROR     Session state was not as required.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_NOT_READY        The target can not accept new commands.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiExecuteScsiCommand (
-  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                 *PassThru,
-  IN UINT8                                           *Target,
-  IN UINT64                                          Lun,
-  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
-  )
-{
-  EFI_STATUS              Status;
-  ISCSI_DRIVER_DATA       *Private;
-  ISCSI_SESSION           *Session;
-  EFI_EVENT               TimeoutEvent;
-  ISCSI_CONNECTION        *Conn;
-  ISCSI_TCB               *Tcb;
-  NET_BUF                 *Pdu;
-  ISCSI_XFER_CONTEXT      *XferContext;
-  UINT8                   *Data;
-  ISCSI_IN_BUFFER_CONTEXT InBufferContext;
-  UINT64                  Timeout;
-  UINT8                   *PduHdr;
-
-  Private       = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
-  Session       = &Private->Session;
-  Status        = EFI_SUCCESS;
-  Tcb           = NULL;
-  TimeoutEvent  = NULL;
-  Timeout       = 0;
-
-  if (Session->State != SESSION_STATE_LOGGED_IN) {
-    Status = EFI_DEVICE_ERROR;
-    goto ON_EXIT;
-  }
-
-  Conn = NET_LIST_USER_STRUCT_S (
-          Session->Conns.ForwardLink,
-          ISCSI_CONNECTION,
-          Link,
-          ISCSI_CONNECTION_SIGNATURE
-          );
-
-  if (Packet->Timeout != 0) {
-    Timeout = MultU64x32 (Packet->Timeout, 2);
-  }
-
-  Status = IScsiNewTcb (Conn, &Tcb);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-  //
-  // Encapsulate the SCSI request packet into an iSCSI SCSI Command PDU.
-  //
-  Pdu = IScsiNewScsiCmdPdu (Packet, Lun, Tcb);
-  if (Pdu == NULL) {
-    Status = EFI_OUT_OF_RESOURCES;
-    goto ON_EXIT;
-  }
-
-  XferContext         = &Tcb->XferContext;
-  PduHdr              = NetbufGetByte (Pdu, 0, NULL);
-  if (PduHdr == NULL) {
-    Status = EFI_PROTOCOL_ERROR;
-    NetbufFree (Pdu);
-    goto ON_EXIT;
-  }
-  XferContext->Offset = ISCSI_GET_DATASEG_LEN (PduHdr);
-
-  //
-  // Transmit the SCSI Command PDU.
-  //
-  Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu);
-
-  NetbufFree (Pdu);
-
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  if (!Session->InitialR2T &&
-      (XferContext->Offset < Session->FirstBurstLength) &&
-      (XferContext->Offset < Packet->OutTransferLength)
-      ) {
-    //
-    // Unsolicited Data-Out sequence is allowed, there is remaining SCSI
-    // OUT data and the limit of FirstBurstLength is not reached.
-    //
-    XferContext->TargetTransferTag = ISCSI_RESERVED_TAG;
-    XferContext->DesiredLength = MIN (
-                                  Session->FirstBurstLength,
-                                  Packet->OutTransferLength - XferContext->Offset
-                                  );
-
-    Data    = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset;
-    Status  = IScsiSendDataOutPduSequence (Data, Lun, Tcb);
-    if (EFI_ERROR (Status)) {
-      goto ON_EXIT;
-    }
-  }
-
-  InBufferContext.InData    = (UINT8 *) Packet->InDataBuffer;
-  InBufferContext.InDataLen = Packet->InTransferLength;
-
-  while (!Tcb->StatusXferd) {
-    //
-    // Start the timeout timer.
-    //
-    if (Timeout != 0) {
-      Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout);
-      if (EFI_ERROR (Status)) {
-        goto ON_EXIT;
-      }
-      TimeoutEvent = Conn->TimeoutEvent;
-    }
-    //
-    // try to receive PDU from target.
-    //
-    Status = IScsiReceivePdu (Conn, &Pdu, &InBufferContext, FALSE, FALSE, TimeoutEvent);
-    if (EFI_ERROR (Status)) {
-      goto ON_EXIT;
-    }
-
-    PduHdr = NetbufGetByte (Pdu, 0, NULL);
-    if (PduHdr == NULL) {
-      Status = EFI_PROTOCOL_ERROR;
-      NetbufFree (Pdu);
-      goto ON_EXIT;
-    }
-    switch (ISCSI_GET_OPCODE (PduHdr)) {
-    case ISCSI_OPCODE_SCSI_DATA_IN:
-      Status = IScsiOnDataInRcvd (Pdu, Tcb, Packet);
-      break;
-
-    case ISCSI_OPCODE_R2T:
-      Status = IScsiOnR2TRcvd (Pdu, Tcb, Lun, Packet);
-      break;
-
-    case ISCSI_OPCODE_SCSI_RSP:
-      Status = IScsiOnScsiRspRcvd (Pdu, Tcb, Packet);
-      break;
-
-    case ISCSI_OPCODE_NOP_IN:
-      Status = IScsiOnNopInRcvd (Pdu, Tcb);
-      break;
-
-    case ISCSI_OPCODE_VENDOR_T0:
-    case ISCSI_OPCODE_VENDOR_T1:
-    case ISCSI_OPCODE_VENDOR_T2:
-      //
-      // These messages are vendor specific, skip them.
-      //
-      break;
-
-    default:
-      Status = EFI_PROTOCOL_ERROR;
-      break;
-    }
-
-    NetbufFree (Pdu);
-
-    if (EFI_ERROR (Status)) {
-      break;
-    }
-  }
-
-ON_EXIT:
-
-  if (TimeoutEvent != NULL) {
-    gBS->SetTimer (TimeoutEvent, TimerCancel, 0);
-  }
-
-  if (Tcb != NULL) {
-    IScsiDelTcb (Tcb);
-  }
-
-  return Status;
-}
-
-/**
-  Reinstate the session on some error.
-
-  @param[in, out]  Private The iSCSI driver data.
-
-  @retval EFI_SUCCES  The session is reinstated from some error.
-  @retval Other       Reinstatement failed.
-**/
-EFI_STATUS
-IScsiSessionReinstatement (
-  IN OUT ISCSI_DRIVER_DATA  *Private
-  )
-{
-  ISCSI_SESSION *Session;
-  EFI_STATUS    Status;
-
-  Session = &Private->Session;
-  ASSERT (Session->State != SESSION_STATE_FREE);
-
-  //
-  // Abort the session and re-init it.
-  //
-  IScsiSessionAbort (Session);
-  IScsiSessionInit (Session, TRUE);
-
-  //
-  // Login again.
-  //
-  Status = IScsiSessionLogin (Private);
-
-  return Status;
-}
-
-/**
-  Initialize some session parameters before login.
-
-  @param[in, out]  Session  The iSCSI session.
-  @param[in]       Recovery Whether the request is from a fresh new start or recovery.
-**/
-VOID
-IScsiSessionInit (
-  IN OUT ISCSI_SESSION  *Session,
-  IN BOOLEAN            Recovery
-  )
-{
-  if (!Recovery) {
-    Session->Signature  = ISCSI_SESSION_SIGNATURE;
-    Session->State      = SESSION_STATE_FREE;
-
-    InitializeListHead (&Session->Conns);
-    InitializeListHead (&Session->TcbList);
-  }
-
-  Session->Tsih                 = 0;
-
-  Session->CmdSN                = 1;
-  Session->InitiatorTaskTag     = 1;
-  Session->NextCid              = 1;
-
-  Session->TargetPortalGroupTag = 0;
-  Session->MaxConnections       = ISCSI_MAX_CONNS_PER_SESSION;
-  Session->InitialR2T           = FALSE;
-  Session->ImmediateData        = TRUE;
-  Session->MaxBurstLength       = 262144;
-  Session->FirstBurstLength     = MAX_RECV_DATA_SEG_LEN_IN_FFP;
-  Session->DefaultTime2Wait     = 2;
-  Session->DefaultTime2Retain   = 20;
-  Session->MaxOutstandingR2T    = DEFAULT_MAX_OUTSTANDING_R2T;
-  Session->DataPDUInOrder       = TRUE;
-  Session->DataSequenceInOrder  = TRUE;
-  Session->ErrorRecoveryLevel   = 0;
-}
-
-/**
-  Abort the iSCSI session, that is, reset all the connection and free the
-  resources.
-
-  @param[in, out]  Session The iSCSI session.
-
-  @retval EFI_SUCCES  The session is aborted.
-**/
-EFI_STATUS
-IScsiSessionAbort (
-  IN OUT ISCSI_SESSION  *Session
-  )
-{
-  ISCSI_DRIVER_DATA *Private;
-  ISCSI_CONNECTION  *Conn;
-
-  if (Session->State != SESSION_STATE_LOGGED_IN) {
-    return EFI_SUCCESS;
-  }
-
-  ASSERT (!IsListEmpty (&Session->Conns));
-
-  Private = ISCSI_DRIVER_DATA_FROM_SESSION (Session);
-
-  while (!IsListEmpty (&Session->Conns)) {
-    Conn = NET_LIST_USER_STRUCT_S (
-            Session->Conns.ForwardLink,
-            ISCSI_CONNECTION,
-            Link,
-            ISCSI_CONNECTION_SIGNATURE
-            );
-
-    gBS->CloseProtocol (
-          Conn->Tcp4Io.Handle,
-          &gEfiTcp4ProtocolGuid,
-          Private->Image,
-          Private->ExtScsiPassThruHandle
-          );
-
-    IScsiConnReset (Conn);
-
-    IScsiDetatchConnection (Conn);
-    IScsiDestroyConnection (Conn);
-  }
-
-  Session->State = SESSION_STATE_FAILED;
-
-  return EFI_SUCCESS;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
deleted file mode 100644
index 901b38e92fc0..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
+++ /dev/null
@@ -1,487 +0,0 @@
-/** @file
-  The wrap of TCP/IP Socket interface.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "IScsiImpl.h"
-
-/**
-  The common notify function associated with various Tcp4Io events.
-
-  @param[in]  Event   The event signaled.
-  @param[in]  Context The context.
-**/
-VOID
-EFIAPI
-Tcp4IoCommonNotify (
-  IN EFI_EVENT  Event,
-  IN VOID       *Context
-  )
-{
-  *((BOOLEAN *) Context) = TRUE;
-}
-
-/**
-  Create a TCP socket with the specified configuration data.
-
-  @param[in]  Image      The handle of the driver image.
-  @param[in]  Controller The handle of the controller.
-  @param[in]  ConfigData The Tcp4 configuration data.
-  @param[in]  Tcp4Io     The Tcp4Io.
-
-  @retval EFI_SUCCESS    The TCP socket is created and configured.
-  @retval Others         Failed to create the TCP socket or configure it.
-**/
-EFI_STATUS
-Tcp4IoCreateSocket (
-  IN EFI_HANDLE           Image,
-  IN EFI_HANDLE           Controller,
-  IN TCP4_IO_CONFIG_DATA  *ConfigData,
-  IN TCP4_IO              *Tcp4Io
-  )
-{
-  EFI_STATUS            Status;
-  EFI_TCP4_PROTOCOL     *Tcp4;
-  EFI_TCP4_CONFIG_DATA  Tcp4ConfigData;
-  EFI_TCP4_OPTION       ControlOption;
-  EFI_TCP4_ACCESS_POINT *AccessPoint;
-
-  Tcp4Io->Handle = NULL;
-  Tcp4Io->ConnToken.CompletionToken.Event = NULL;
-  Tcp4Io->TxToken.CompletionToken.Event = NULL;
-  Tcp4Io->RxToken.CompletionToken.Event = NULL;
-  Tcp4Io->CloseToken.CompletionToken.Event = NULL;
-  Tcp4 = NULL;
-
-  //
-  // Create the TCP4 child instance and get the TCP4 protocol.
-  //
-  Status = NetLibCreateServiceChild (
-            Controller,
-            Image,
-            &gEfiTcp4ServiceBindingProtocolGuid,
-            &Tcp4Io->Handle
-            );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = gBS->OpenProtocol (
-                  Tcp4Io->Handle,
-                  &gEfiTcp4ProtocolGuid,
-                  (VOID **)&Tcp4Io->Tcp4,
-                  Image,
-                  Controller,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Tcp4Io->Image       = Image;
-  Tcp4Io->Controller  = Controller;
-  Tcp4                = Tcp4Io->Tcp4;
-
-  //
-  // Set the configuration parameters.
-  //
-  ControlOption.ReceiveBufferSize       = 0x200000;
-  ControlOption.SendBufferSize          = 0x200000;
-  ControlOption.MaxSynBackLog           = 0;
-  ControlOption.ConnectionTimeout       = 0;
-  ControlOption.DataRetries             = 6;
-  ControlOption.FinTimeout              = 0;
-  ControlOption.TimeWaitTimeout         = 0;
-  ControlOption.KeepAliveProbes         = 4;
-  ControlOption.KeepAliveTime           = 0;
-  ControlOption.KeepAliveInterval       = 0;
-  ControlOption.EnableNagle             = FALSE;
-  ControlOption.EnableTimeStamp         = FALSE;
-  ControlOption.EnableWindowScaling     = TRUE;
-  ControlOption.EnableSelectiveAck      = FALSE;
-  ControlOption.EnablePathMtuDiscovery  = FALSE;
-
-  Tcp4ConfigData.TypeOfService          = 8;
-  Tcp4ConfigData.TimeToLive             = 255;
-  Tcp4ConfigData.ControlOption          = &ControlOption;
-
-  AccessPoint = &Tcp4ConfigData.AccessPoint;
-
-  AccessPoint->UseDefaultAddress = FALSE;
-  AccessPoint->StationPort = 0;
-  AccessPoint->RemotePort = ConfigData->RemotePort;
-  AccessPoint->ActiveFlag = TRUE;
-
-  CopyMem (&AccessPoint->StationAddress, &ConfigData->LocalIp, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&AccessPoint->SubnetMask, &ConfigData->SubnetMask, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&AccessPoint->RemoteAddress, &ConfigData->RemoteIp, sizeof (EFI_IPv4_ADDRESS));
-
-  //
-  // Configure the TCP4 protocol.
-  //
-  Status = Tcp4->Configure (Tcp4, &Tcp4ConfigData);
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  if (!EFI_IP4_EQUAL (&ConfigData->Gateway, &mZeroIp4Addr)) {
-    //
-    // the gateway is not zero, add the default route by hand
-    //
-    Status = Tcp4->Routes (Tcp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, &ConfigData->Gateway);
-    if (EFI_ERROR (Status)) {
-      goto ON_ERROR;
-    }
-  }
-  //
-  // Create events for variuos asynchronous operations.
-  //
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_NOTIFY,
-                  Tcp4IoCommonNotify,
-                  &Tcp4Io->IsConnDone,
-                  &Tcp4Io->ConnToken.CompletionToken.Event
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_NOTIFY,
-                  Tcp4IoCommonNotify,
-                  &Tcp4Io->IsTxDone,
-                  &Tcp4Io->TxToken.CompletionToken.Event
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_NOTIFY,
-                  Tcp4IoCommonNotify,
-                  &Tcp4Io->IsRxDone,
-                  &Tcp4Io->RxToken.CompletionToken.Event
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_NOTIFY,
-                  Tcp4IoCommonNotify,
-                  &Tcp4Io->IsCloseDone,
-                  &Tcp4Io->CloseToken.CompletionToken.Event
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Tcp4Io->IsTxDone  = FALSE;
-  Tcp4Io->IsRxDone  = FALSE;
-
-  return EFI_SUCCESS;
-
-ON_ERROR:
-
-  if (Tcp4Io->RxToken.CompletionToken.Event != NULL) {
-    gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
-  }
-
-  if (Tcp4Io->TxToken.CompletionToken.Event != NULL) {
-    gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
-  }
-
-  if (Tcp4Io->ConnToken.CompletionToken.Event != NULL) {
-    gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
-  }
-
-  if (Tcp4 != NULL) {
-    Tcp4->Configure (Tcp4, NULL);
-
-    gBS->CloseProtocol (
-          Tcp4Io->Handle,
-          &gEfiTcp4ProtocolGuid,
-          Image,
-          Controller
-          );
-  }
-
-  NetLibDestroyServiceChild (
-    Controller,
-    Image,
-    &gEfiTcp4ServiceBindingProtocolGuid,
-    Tcp4Io->Handle
-    );
-
-  return Status;
-}
-
-/**
-  Destroy the socket.
-
-  @param[in]  Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
-**/
-VOID
-Tcp4IoDestroySocket (
-  IN TCP4_IO  *Tcp4Io
-  )
-{
-  EFI_TCP4_PROTOCOL *Tcp4;
-
-  Tcp4 = Tcp4Io->Tcp4;
-
-  Tcp4->Configure (Tcp4, NULL);
-
-  gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
-  gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
-  gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
-
-  gBS->CloseProtocol (
-        Tcp4Io->Handle,
-        &gEfiTcp4ProtocolGuid,
-        Tcp4Io->Image,
-        Tcp4Io->Controller
-        );
-
-  NetLibDestroyServiceChild (
-    Tcp4Io->Controller,
-    Tcp4Io->Image,
-    &gEfiTcp4ServiceBindingProtocolGuid,
-    Tcp4Io->Handle
-    );
-}
-
-/**
-  Connect to the other endpoint of the TCP socket.
-
-  @param[in, out]  Tcp4Io    The Tcp4Io wrapping the TCP socket.
-  @param[in]       Timeout   The time to wait for connection done.
-
-  @retval EFI_SUCCESS          Connect to the other endpoint of the TCP socket successfully.
-  @retval EFI_TIMEOUT          Failed to connect to the other endpoint of the TCP socket in the                               specified time period.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoConnect (
-  IN OUT TCP4_IO    *Tcp4Io,
-  IN EFI_EVENT      Timeout
-  )
-{
-  EFI_TCP4_PROTOCOL *Tcp4;
-  EFI_STATUS        Status;
-
-  Tcp4Io->IsConnDone  = FALSE;
-  Tcp4                = Tcp4Io->Tcp4;
-  Status              = Tcp4->Connect (Tcp4, &Tcp4Io->ConnToken);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  while (!Tcp4Io->IsConnDone && EFI_ERROR (gBS->CheckEvent (Timeout))) {
-    Tcp4->Poll (Tcp4);
-  }
-
-  if (!Tcp4Io->IsConnDone) {
-    Status = EFI_TIMEOUT;
-  } else {
-    Status = Tcp4Io->ConnToken.CompletionToken.Status;
-  }
-
-  return Status;
-}
-
-/**
-  Reset the socket.
-
-  @param[in, out]  Tcp4Io The Tcp4Io wrapping the TCP socket.
-**/
-VOID
-Tcp4IoReset (
-  IN OUT TCP4_IO  *Tcp4Io
-  )
-{
-  EFI_STATUS        Status;
-  EFI_TCP4_PROTOCOL *Tcp4;
-
-  Tcp4Io->CloseToken.AbortOnClose = TRUE;
-  Tcp4Io->IsCloseDone             = FALSE;
-
-  Tcp4 = Tcp4Io->Tcp4;
-  Status = Tcp4->Close (Tcp4, &Tcp4Io->CloseToken);
-  if (EFI_ERROR (Status)) {
-    return ;
-  }
-
-  while (!Tcp4Io->IsCloseDone) {
-    Tcp4->Poll (Tcp4);
-  }
-}
-
-/**
-  Transmit the Packet to the other endpoint of the socket.
-
-  @param[in]   Tcp4Io          The Tcp4Io wrapping the TCP socket.
-  @param[in]   Packet          The packet to transmit.
-
-  @retval EFI_SUCCESS          The packet is trasmitted.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoTransmit (
-  IN TCP4_IO  *Tcp4Io,
-  IN NET_BUF  *Packet
-  )
-{
-  EFI_TCP4_TRANSMIT_DATA  *TxData;
-  EFI_TCP4_PROTOCOL       *Tcp4;
-  EFI_STATUS              Status;
-
-  TxData = AllocatePool (sizeof (EFI_TCP4_TRANSMIT_DATA) + (Packet->BlockOpNum - 1) * sizeof (EFI_TCP4_FRAGMENT_DATA));
-  if (TxData == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  TxData->Push        = TRUE;
-  TxData->Urgent      = FALSE;
-  TxData->DataLength  = Packet->TotalSize;
-
-  //
-  // Build the fragment table.
-  //
-  TxData->FragmentCount = Packet->BlockOpNum;
-  NetbufBuildExt (Packet, (NET_FRAGMENT *) &TxData->FragmentTable[0], &TxData->FragmentCount);
-
-  Tcp4Io->TxToken.Packet.TxData = TxData;
-
-  //
-  // Trasnmit the packet.
-  //
-  Tcp4    = Tcp4Io->Tcp4;
-  Status  = Tcp4->Transmit (Tcp4, &Tcp4Io->TxToken);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  while (!Tcp4Io->IsTxDone) {
-    Tcp4->Poll (Tcp4);
-  }
-
-  Tcp4Io->IsTxDone  = FALSE;
-
-  Status            = Tcp4Io->TxToken.CompletionToken.Status;
-
-ON_EXIT:
-
-  FreePool (TxData);
-
-  return Status;
-}
-
-/**
-  Receive data from the socket.
-
-  @param[in]  Tcp4Io           The Tcp4Io which wraps the socket to be destroyed.
-  @param[in]  Packet           The buffer to hold the data copy from the soket rx buffer.
-  @param[in]  AsyncMode        Is this receive asyncronous or not.
-  @param[in]  Timeout          The time to wait for receiving the amount of data the Packet
-                               can hold.
-
-  @retval EFI_SUCCESS          The required amount of data is received from the socket.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
-  @retval EFI_TIMEOUT          Failed to receive the required amount of data in the
-                               specified time period.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoReceive (
-  IN TCP4_IO    *Tcp4Io,
-  IN NET_BUF    *Packet,
-  IN BOOLEAN    AsyncMode,
-  IN EFI_EVENT  Timeout
-  )
-{
-  EFI_TCP4_PROTOCOL     *Tcp4;
-  EFI_TCP4_RECEIVE_DATA RxData;
-  EFI_STATUS            Status;
-  NET_FRAGMENT          *Fragment;
-  UINT32                FragmentCount;
-  UINT32                CurrentFragment;
-
-  FragmentCount = Packet->BlockOpNum;
-  Fragment      = AllocatePool (FragmentCount * sizeof (NET_FRAGMENT));
-  if (Fragment == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  //
-  // Build the fragment table.
-  //
-  NetbufBuildExt (Packet, Fragment, &FragmentCount);
-
-  RxData.FragmentCount          = 1;
-  Tcp4Io->RxToken.Packet.RxData = &RxData;
-  CurrentFragment               = 0;
-  Tcp4                          = Tcp4Io->Tcp4;
-  Status                        = EFI_SUCCESS;
-
-  while (CurrentFragment < FragmentCount) {
-    RxData.DataLength                       = Fragment[CurrentFragment].Len;
-    RxData.FragmentTable[0].FragmentLength  = Fragment[CurrentFragment].Len;
-    RxData.FragmentTable[0].FragmentBuffer  = Fragment[CurrentFragment].Bulk;
-
-    Status = Tcp4->Receive (Tcp4, &Tcp4Io->RxToken);
-    if (EFI_ERROR (Status)) {
-      goto ON_EXIT;
-    }
-
-    while (!Tcp4Io->IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) {
-      //
-      // Poll until some data is received or something error happens.
-      //
-      Tcp4->Poll (Tcp4);
-    }
-
-    if (!Tcp4Io->IsRxDone) {
-      //
-      // Timeout occurs, cancel the receive request.
-      //
-      Tcp4->Cancel (Tcp4, &Tcp4Io->RxToken.CompletionToken);
-
-      Status = EFI_TIMEOUT;
-      goto ON_EXIT;
-    } else {
-      Tcp4Io->IsRxDone = FALSE;
-    }
-
-    if (EFI_ERROR (Tcp4Io->RxToken.CompletionToken.Status)) {
-      Status = Tcp4Io->RxToken.CompletionToken.Status;
-      goto ON_EXIT;
-    }
-
-    Fragment[CurrentFragment].Len -= RxData.FragmentTable[0].FragmentLength;
-    if (Fragment[CurrentFragment].Len == 0) {
-      CurrentFragment++;
-    } else {
-      Fragment[CurrentFragment].Bulk += RxData.FragmentTable[0].FragmentLength;
-    }
-  }
-
-ON_EXIT:
-  Tcp4Io->RxToken.Packet.RxData = NULL;
-  FreePool (Fragment);
-
-  return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
deleted file mode 100644
index 3555f1a2ebe3..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
+++ /dev/null
@@ -1,350 +0,0 @@
-/** @file
-  Implementation of MD5 algorithm.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#include "Md5.h"
-
-CONST UINT32  Md5_Data[][2] = {
-  { 0, 1 },
-  { 1, 5 },
-  { 5, 3 },
-  { 0, 7 }
-};
-
-CONST UINT32  Md5_S[][4] = {
-  { 7, 22, 17, 12 },
-  { 5, 20, 14, 9 },
-  { 4, 23, 16 ,11 },
-  { 6, 21, 15, 10 },
-};
-
-CONST UINT32  Md5_T[] = {
-  0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE,
-  0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501,
-  0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE,
-  0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821,
-  0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA,
-  0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8,
-  0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED,
-  0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A,
-  0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C,
-  0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70,
-  0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05,
-  0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665,
-  0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039,
-  0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1,
-  0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1,
-  0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391
-};
-
-CONST UINT8 Md5HashPadding[] =
-{
-  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-//
-// ROTATE_LEFT rotates x left n bits.
-//
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
-
-#define SA            MedStates[Index2 & 3]
-#define SB            MedStates[(Index2 + 1) & 3]
-#define SC            MedStates[(Index2 + 2) & 3]
-#define SD            MedStates[(Index2 + 3) & 3]
-
-/**
-  Tf1 is one basic MD5 transform function.
-
-  @param[in]  A      A  32-bit quantity.
-  @param[in]  B      A  32-bit quantity.
-  @param[in]  C      A  32-bit quantity.
-
-  @return             Output was produced as a 32-bit quantity based on the
-                      three 32-bit input quantity.
-**/
-UINT32
-Tf1 (
-  IN UINT32 A,
-  IN UINT32 B,
-  IN UINT32 C
-  )
-{
-  return (A & B) | (~A & C);
-}
-
-/**
-  Tf2 is one basic MD5 transform function.
-
-  @param[in]  A      A  32-bit quantity.
-  @param[in]  B      A  32-bit quantity.
-  @param[in]  C      A  32-bit quantity.
-
-  @return             Output was produced as a 32-bit quantity based on the
-                      three 32-bit input quantity.
-**/
-UINT32
-Tf2 (
-  IN UINT32 A,
-  IN UINT32 B,
-  IN UINT32 C
-  )
-{
-  return (A & C) | (B & ~C);
-}
-
-/**
-  Tf3 is one basic MD5 transform function.
-
-  @param[in]  A      A  32-bit quantity.
-  @param[in]  B      A  32-bit quantity.
-  @param[in]  C      A  32-bit quantity.
-
-  @return             Output was produced as a 32-bit quantity based on the
-                      three 32-bit input quantity.
-**/
-UINT32
-Tf3 (
-  IN UINT32 A,
-  IN UINT32 B,
-  IN UINT32 C
-  )
-{
-  return A ^ B ^ C;
-}
-
-/**
-  Tf4 is one basic MD5 transform function.
-
-  @param[in]  A      A  32-bit quantity.
-  @param[in]  B      A  32-bit quantity.
-  @param[in]  C      A  32-bit quantity.
-
-  @return             Output was produced as a 32-bit quantity based on the
-                      three 32-bit input quantity.
-**/
-UINT32
-Tf4 (
-  IN UINT32 A,
-  IN UINT32 B,
-  IN UINT32 C
-  )
-{
-  return B ^ (A | ~C);
-}
-
-typedef
-UINT32
-(*MD5_TRANSFORM_FUNC) (
-  IN UINT32  A,
-  IN UINT32  B,
-  IN UINT32  C
-  );
-
-CONST MD5_TRANSFORM_FUNC Md5_F[] = {
-  Tf1,
-  Tf2,
-  Tf3,
-  Tf4
-};
-
-/**
-  Perform the MD5 transform on 64 bytes data segment.
-
-  @param[in, out]  Md5Ctx  It includes the data segment for Md5 transform.
-**/
-VOID
-MD5Transform (
-  IN OUT MD5_CTX  *Md5Ctx
-  )
-{
-  UINT32  Index1;
-  UINT32  Index2;
-  UINT32  MedStates[MD5_HASHSIZE >> 2];
-  UINT32  *Data;
-  UINT32  IndexD;
-  UINT32  IndexT;
-
-  Data = (UINT32 *) Md5Ctx->M;
-
-  //
-  // Copy MD5 states to MedStates
-  //
-  CopyMem (MedStates, Md5Ctx->States, MD5_HASHSIZE);
-
-  IndexT = 0;
-  for (Index1 = 0; Index1 < 4; Index1++) {
-    IndexD = Md5_Data[Index1][0];
-    for (Index2 = 16; Index2 > 0; Index2--) {
-      SA += (*Md5_F[Index1]) (SB, SC, SD) + Data[IndexD] + Md5_T[IndexT];
-      SA  = ROTATE_LEFT (SA, Md5_S[Index1][Index2 & 3]);
-      SA += SB;
-
-      IndexD += Md5_Data[Index1][1];
-      IndexD &= 15;
-
-      IndexT++;
-    }
-  }
-
-  for (Index1 = 0; Index1 < 4; Index1++) {
-    Md5Ctx->States[Index1] += MedStates[Index1];
-  }
-}
-
-/**
-  Copy data segment into the M field of MD5_CTX structure for later transform.
-  If the length of data segment is larger than 64 bytes, then does the transform
-  immediately and the generated Md5 code is stored in the States field of MD5_CTX
-  data struct for later accumulation.
-  All of Md5 code generated for the sequential 64-bytes data segaments are be
-  accumulated in MD5Final() function.
-
-  @param[in, out]  Md5Ctx  The data structure of storing the original data
-                           segment and the final result.
-  @param[in]       Data    The data wanted to be transformed.
-  @param[in]       DataLen The length of data.
-**/
-VOID
-MD5UpdateBlock (
-  IN OUT MD5_CTX  *Md5Ctx,
-  IN CONST UINT8  *Data,
-  IN       UINTN  DataLen
-  )
-{
-  UINTN Limit;
-
-  for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit = 64) {
-    CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit);
-    MD5Transform (Md5Ctx);
-
-    Md5Ctx->Count = 0;
-    Data         += Limit;
-    DataLen      -= Limit;
-  }
-
-  CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen);
-  Md5Ctx->Count += DataLen;
-}
-
-/**
-  Initialize four 32-bits chaining variables and use them to do the Md5 transform.
-
-  @param[out]  Md5Ctx The data structure of Md5.
-
-  @retval EFI_SUCCESS Initialization is ok.
-**/
-EFI_STATUS
-MD5Init (
-  OUT MD5_CTX  *Md5Ctx
-  )
-{
-  ZeroMem (Md5Ctx, sizeof (*Md5Ctx));
-
-  //
-  // Set magic initialization constants.
-  //
-  Md5Ctx->States[0] = 0x67452301;
-  Md5Ctx->States[1] = 0xefcdab89;
-  Md5Ctx->States[2] = 0x98badcfe;
-  Md5Ctx->States[3] = 0x10325476;
-
-  return EFI_SUCCESS;
-}
-
-/**
-  the external interface of Md5 algorithm
-
-  @param[in, out]  Md5Ctx  The data structure of storing the original data
-                           segment and the final result.
-  @param[in]       Data    The data wanted to be transformed.
-  @param[in]       DataLen The length of data.
-
-  @retval EFI_SUCCESS The transform is ok.
-  @retval Others      Other errors as indicated.
-**/
-EFI_STATUS
-MD5Update (
-  IN  OUT MD5_CTX  *Md5Ctx,
-  IN  VOID         *Data,
-  IN  UINTN        DataLen
-  )
-{
-  if (EFI_ERROR (Md5Ctx->Status)) {
-    return Md5Ctx->Status;
-  }
-
-  MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen);
-  Md5Ctx->Length += DataLen;
-  return EFI_SUCCESS;
-}
-
-/**
-  Accumulate the MD5 value of every data segment and generate the finial
-  result according to MD5 algorithm.
-
-  @param[in, out]   Md5Ctx  The data structure of storing the original data
-                            segment and the final result.
-  @param[out]      HashVal  The final 128-bits output.
-
-  @retval EFI_SUCCESS  The transform is ok.
-  @retval Others       Other errors as indicated.
-**/
-EFI_STATUS
-MD5Final (
-  IN  OUT MD5_CTX  *Md5Ctx,
-  OUT UINT8        *HashVal
-  )
-{
-  UINTN PadLength;
-
-  if (Md5Ctx->Status == EFI_ALREADY_STARTED) {
-    //
-    // Store Hashed value & Zeroize sensitive context information.
-    //
-    CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE);
-    ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx));
-
-    return EFI_SUCCESS;
-  }
-
-  if (EFI_ERROR (Md5Ctx->Status)) {
-    return Md5Ctx->Status;
-  }
-
-  PadLength  = Md5Ctx->Count >= 56 ? 120 : 56;
-  PadLength -= Md5Ctx->Count;
-  MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength);
-  Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3);
-  MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8);
-
-  ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M));
-  Md5Ctx->Length  = 0;
-  Md5Ctx->Status  = EFI_ALREADY_STARTED;
-  return MD5Final (Md5Ctx, HashVal);
-}
-
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index 3529c8d30365..b787fb5692d3 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -354,7 +354,6 @@ [Components]
   MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
   MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
   MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
-  MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
   MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
   MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
   MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
deleted file mode 100644
index ee371d26744c..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/** @file
-  The header file of UEFI Component Name(2) protocol.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _COMPONENT_NAME_H_
-#define _COMPONENT_NAME_H_
-
-#include <Protocol/ComponentName.h>
-#include <Protocol/ComponentName2.h>
-
-extern EFI_COMPONENT_NAME2_PROTOCOL       gIScsiComponentName2;
-extern EFI_COMPONENT_NAME_PROTOCOL        gIScsiComponentName;
-
-//
-// EFI Component Name Protocol for iSCSI driver.
-//
-
-/**
-  Retrieves a Unicode string that is the user readable name of the EFI Driver.
-
-  This function retrieves the user readable name of a driver in the form of a
-  Unicode string. If the driver specified by This has a user readable name in
-  the language specified by Language, then a pointer to the driver name is
-  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
-  by This does not support the language specified by Language,
-  then EFI_UNSUPPORTED is returned.
-
-  @param[in]  This        A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
-  @param[in]  Language    A pointer to a three characters ISO 639-2 language identifier.
-                          This is the language of the driver name that that the caller
-                          is requesting, and it must match one of the languages specified
-                          in SupportedLanguages.  The number of languages supported by a
-                          driver is up to the driver writer.
-  @param[out]  DriverName A pointer to the Unicode string to return.  This Unicode string
-                          is the name of the driver specified by This in the language
-                          specified by Language.
-
-  @retval EFI_SUCCESS           The Unicode string for the Driver specified by This
-                                and the language specified by Language was returned
-                                in DriverName.
-  @retval EFI_INVALID_PARAMETER Language is NULL.
-  @retval EFI_INVALID_PARAMETER DriverName is NULL.
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support the
-                                language specified by Language.
-**/
-EFI_STATUS
-EFIAPI
-IScsiComponentNameGetDriverName (
-  IN  EFI_COMPONENT_NAME_PROTOCOL   *This,
-  IN  CHAR8                         *Language,
-  OUT CHAR16                        **DriverName
-  );
-
-/**
-  Retrieves a Unicode string that is the user readable name of the controller
-  that is being managed by an EFI Driver. Currently not implemented.
-
-  @param[in]  This             A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
-  @param[in]  ControllerHandle The handle of a controller that the driver specified by
-                               This is managing.  This handle specifies the controller
-                               whose name is to be returned.
-  @param[in]  ChildHandle      The handle of the child controller to retrieve the name
-                               of.  This is an optional parameter that may be NULL.  It
-                               will be NULL for device drivers.  It will also be NULL
-                               for a bus drivers that wish to retrieve the name of the
-                               bus controller.  It will not be NULL for a bus driver
-                               that wishes to retrieve the name of a child controller.
-  @param[in]  Language         A pointer to a three characters ISO 639-2 language
-                               identifier.  This is the language of the controller name
-                               that that the caller is requesting, and it must match one
-                               of the languages specified in SupportedLanguages.  The
-                               number of languages supported by a driver is up to the
-                               driver writer.
-  @param[out]  ControllerName  A pointer to the Unicode string to return.  This Unicode
-                               string is the name of the controller specified by
-                               ControllerHandle and ChildHandle in the language specified
-                               by Language from the point of view of the driver specified
-                               by This.
-
-  @retval EFI_SUCCESS           The Unicode string for the user readable name in the
-                                language specified by Language for the driver
-                                specified by This was returned in DriverName.
-  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
-  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE.
-  @retval EFI_INVALID_PARAMETER Language is NULL.
-  @retval EFI_INVALID_PARAMETER ControllerName is NULL.
-  @retval EFI_UNSUPPORTED       The driver specified by This is not currently managing
-                                the controller specified by ControllerHandle and
-                                ChildHandle.
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support the
-                                language specified by Language.
-**/
-EFI_STATUS
-EFIAPI
-IScsiComponentNameGetControllerName (
-  IN  EFI_COMPONENT_NAME_PROTOCOL   *This,
-  IN  EFI_HANDLE                    ControllerHandle,
-  IN  EFI_HANDLE                    ChildHandle        OPTIONAL,
-  IN  CHAR8                         *Language,
-  OUT CHAR16                        **ControllerName
-  );
-
-//
-// EFI iSCSI Initiator Name Protocol for IScsi driver.
-//
-
-/**
-  Retrieves the current set value of iSCSI Initiator Name.
-
-  @param[in]       This       Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
-  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the
-                              variable data buffer.
-  @param[out]      Buffer     Pointer to the buffer for data to be read.
-
-  @retval EFI_SUCCESS           Data was successfully retrieved into the provided buffer and the
-                                BufferSize was sufficient to handle the iSCSI initiator name
-  @retval EFI_BUFFER_TOO_SMALL  BufferSize is too small for the result.
-  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
-  @retval EFI_DEVICE_ERROR      The iSCSI initiator name could not be retrieved due to a hardware error.
-  @retval Others                Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiGetInitiatorName (
-  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
-  IN OUT UINTN                              *BufferSize,
-  OUT    VOID                               *Buffer
-  );
-
-/**
-  Sets the iSCSI Initiator Name.
-
-  @param[in]       This       Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
-  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer.
-  @param[in]       Buffer     Pointer to the buffer for data to be written.
-
-  @retval EFI_SUCCESS           Data was successfully stored by the protocol.
-  @retval EFI_UNSUPPORTED       Platform policies do not allow for data to be written.
-                                Currently not implemented.
-  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit.
-  @retval EFI_DEVICE_ERROR      The data could not be stored due to a hardware error.
-  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the data.
-  @retval EFI_PROTOCOL_ERROR    Input iSCSI initiator name does not adhere to RFC 3720
-                                (and other related protocols)
-  @retval Others                Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiSetInitiatorName (
-  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
-  IN OUT UINTN                              *BufferSize,
-  IN     VOID                               *Buffer
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
deleted file mode 100644
index d3c020e45d3b..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
+++ /dev/null
@@ -1,25 +0,0 @@
-// /** @file
-// This module produces EFI iSCSI Initiator Name Protocol.
-//
-// This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol
-// and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI
-// data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide
-// one way to configurate the iSCSI setting.
-//
-// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-//
-// 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.
-//
-// **/
-
-
-#string STR_MODULE_ABSTRACT             #language en-US "Produces EFI iSCSI Initiator Name Protocol"
-
-#string STR_MODULE_DESCRIPTION          #language en-US "This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide a way to configure the iSCSI setting."
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
deleted file mode 100644
index 5ec75820a605..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
+++ /dev/null
@@ -1,20 +0,0 @@
-// /** @file
-// IScsi4Dxe Localized Strings and Content
-//
-// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
-//
-// 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.
-//
-// **/
-
-#string STR_PROPERTIES_MODULE_NAME
-#language en-US
-"iSCSI DXE Driver"
-
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
deleted file mode 100644
index 14a5658f754b..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/** @file
-  The header file of CHAP configuration.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_CHAP_H_
-#define _ISCSI_CHAP_H_
-
-#define ISCSI_AUTH_METHOD_CHAP    "CHAP"
-
-#define ISCSI_KEY_CHAP_ALGORITHM  "CHAP_A"
-#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I"
-#define ISCSI_KEY_CHAP_CHALLENGE  "CHAP_C"
-#define ISCSI_KEY_CHAP_NAME       "CHAP_N"
-#define ISCSI_KEY_CHAP_RESPONSE   "CHAP_R"
-
-#define ISCSI_CHAP_ALGORITHM_MD5  5
-
-#define ISCSI_CHAP_AUTH_MAX_LEN   1024
-///
-/// MD5_HASHSIZE
-///
-#define ISCSI_CHAP_RSP_LEN        16
-
-#define ISCSI_CHAP_INITIAL        0
-#define ISCSI_CHAP_STEP_ONE       1
-#define ISCSI_CHAP_STEP_TWO       2
-#define ISCSI_CHAP_STEP_THREE     3
-#define ISCSI_CHAP_STEP_FOUR      4
-
-#pragma pack(1)
-
-typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA {
-  UINT8 CHAPType;
-  CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE];
-  CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
-  CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
-  CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
-} ISCSI_CHAP_AUTH_CONFIG_NVDATA;
-
-#pragma pack()
-
-///
-/// ISCSI CHAP Authentication Data
-///
-typedef struct _ISCSI_CHAP_AUTH_DATA {
-  ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfig;
-  UINT32                        InIdentifier;
-  UINT8                         InChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
-  UINT32                        InChallengeLength;
-  //
-  // Calculated CHAP Response (CHAP_R) value
-  //
-  UINT8                         CHAPResponse[ISCSI_CHAP_RSP_LEN];
-
-  //
-  // Auth-data to be sent out for mutual authentication
-  //
-  UINT32                        OutIdentifier;
-  UINT8                         OutChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
-  UINT32                        OutChallengeLength;
-} ISCSI_CHAP_AUTH_DATA;
-
-/**
-  This function checks the received iSCSI Login Response during the security
-  negotiation stage.
-
-  @param[in] Conn             The iSCSI connection.
-
-  @retval EFI_SUCCESS          The Login Response passed the CHAP validation.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_PROTOCOL_ERROR   Some kind of protocol error happend.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiCHAPOnRspReceived (
-  IN ISCSI_CONNECTION  *Conn
-  );
-/**
-  This function fills the CHAP authentication information into the login PDU
-  during the security negotiation stage in the iSCSI connection login.
-
-  @param[in]       Conn        The iSCSI connection.
-  @param[in, out]  Pdu         The PDU to send out.
-
-  @retval EFI_SUCCESS          All check passed and the phase-related CHAP
-                               authentication info is filled into the iSCSI PDU.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_PROTOCOL_ERROR   Some kind of protocol error happend.
-**/
-EFI_STATUS
-IScsiCHAPToSendReq (
-  IN      ISCSI_CONNECTION  *Conn,
-  IN OUT  NET_BUF           *Pdu
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
deleted file mode 100644
index 650c68d53bab..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/** @file
-  The common header file of Iscsi.
-
-Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_COMMON_H_
-#define _ISCSI_COMMON_H_
-
-typedef struct _ISCSI_SESSION             ISCSI_SESSION;
-typedef struct _ISCSI_CONNECTION          ISCSI_CONNECTION;
-typedef struct _ISCSI_DRIVER_DATA         ISCSI_DRIVER_DATA;
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
deleted file mode 100644
index c3d07f6f4859..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/** @file
-  The header file of IScsiConfig.c.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_CONFIG_H_
-#define _ISCSI_CONFIG_H_
-
-#include <Guid/MdeModuleHii.h>
-#include <Protocol/HiiConfigRouting.h>
-#include <Library/HiiLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseLib.h>
-#include <Library/NetLib.h>
-
-extern UINT8  IScsiConfigDxeBin[];
-extern UINT8  IScsi4DxeStrings[];
-
-#define ISCSI_INITATOR_NAME_VAR_NAME        L"I_NAME"
-
-#define ISCSI_CONFIG_VAR_ATTR               (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE)
-
-#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE  SIGNATURE_32 ('I', 'f', 'c', 'i')
-
-
-
-/**
-  If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear,
-  then this macro return a pointer to a data structure ISCSI_FORM_CALLBACK_INFO.
-
-  If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set,
-  The Signature field of the data structure ISCSI_FORM_CALLBACK_INFO
-  is compared to TestSignature.  If the signatures match, then a pointer
-  to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO is returned.
-  If the signatures do not match, then DebugAssert() is called with a description
-  of "CR has a bad signature" and Callback is returned.
-
-  If the data type ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain the field
-  specified by Callback, then the module will not compile.
-
-  If ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain a field called Signature,
-  then the module will not compile.
-
-  @param   Callback      Pointer to the specified field within the data
-                         structure ISCSI_FORM_CALLBACK_INFO.
-  @return  A pointer to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO.
-  @retval  Others        Some unexpected error happened.
-**/
-
-#define ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK(Callback) \
-  CR ( \
-  Callback, \
-  ISCSI_FORM_CALLBACK_INFO, \
-  ConfigAccess, \
-  ISCSI_FORM_CALLBACK_INFO_SIGNATURE \
-  )
-
-#pragma pack(1)
-
-typedef struct _ISCSI_MAC_INFO {
-  EFI_MAC_ADDRESS Mac;
-  UINT8           Len;
-  UINT16          VlanId;
-} ISCSI_MAC_INFO;
-
-typedef struct _ISCSI_DEVICE_LIST {
-  UINT8           NumDevice;
-  ISCSI_MAC_INFO  MacInfo[1];
-} ISCSI_DEVICE_LIST;
-
-#pragma pack()
-
-typedef struct _ISCSI_CONFIG_FORM_ENTRY {
-  LIST_ENTRY                    Link;
-  EFI_HANDLE                    Controller;
-  CHAR16                        MacString[95];
-  EFI_STRING_ID                 PortTitleToken;
-  EFI_STRING_ID                 PortTitleHelpToken;
-
-  ISCSI_SESSION_CONFIG_NVDATA   SessionConfigData;
-  ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfigData;
-} ISCSI_CONFIG_FORM_ENTRY;
-
-typedef struct _ISCSI_FORM_CALLBACK_INFO {
-  UINTN                            Signature;
-  EFI_HANDLE                       DriverHandle;
-  EFI_HII_CONFIG_ACCESS_PROTOCOL   ConfigAccess;
-  EFI_HII_DATABASE_PROTOCOL        *HiiDatabase;
-  EFI_HII_CONFIG_ROUTING_PROTOCOL  *ConfigRouting;
-  UINT16                           *KeyList;
-  VOID                             *FormBuffer;
-  EFI_HII_HANDLE                   RegisteredHandle;
-  ISCSI_CONFIG_FORM_ENTRY          *Current;
-} ISCSI_FORM_CALLBACK_INFO;
-
-#pragma pack(1)
-
-///
-/// HII specific Vendor Device Path definition.
-///
-typedef struct {
-  VENDOR_DEVICE_PATH             VendorDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL       End;
-} HII_VENDOR_DEVICE_PATH;
-
-#pragma pack()
-
-/**
-  Updates the iSCSI configuration form to add/delete an entry for the iSCSI
-  device specified by the Controller.
-
-  @param[in]  DriverBindingHandle The driverbinding handle.
-  @param[in]  Controller          The controller handle of the iSCSI device.
-  @param[in]  AddForm             Whether to add or delete a form entry.
-
-  @retval EFI_SUCCESS             The iSCSI configuration form is updated.
-  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
-  @retval Others                  Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConfigUpdateForm (
-  IN EFI_HANDLE  DriverBindingHandle,
-  IN EFI_HANDLE  Controller,
-  IN BOOLEAN     AddForm
-  );
-
-/**
-  Initialize the iSCSI configuration form.
-
-  @param[in]  DriverBindingHandle  The iSCSI driverbinding handle.
-
-  @retval EFI_SUCCESS              The iSCSI configuration form is initialized.
-  @retval EFI_OUT_OF_RESOURCES     Failed to allocate memory.
-  @retval Others                   Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConfigFormInit (
-  VOID
-  );
-
-/**
-  Unload the iSCSI configuration form, this includes: delete all the iSCSI
-  device configuration entries, uninstall the form callback protocol and
-  free the resources used.
-
-  @param[in]  DriverBindingHandle The iSCSI driverbinding handle.
-
-  @retval EFI_SUCCESS             The iSCSI configuration form is unloaded.
-  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
-**/
-EFI_STATUS
-IScsiConfigFormUnload (
-  IN EFI_HANDLE  DriverBindingHandle
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
deleted file mode 100644
index 9e28d81fb40d..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
+++ /dev/null
@@ -1,219 +0,0 @@
-/** @file
-  Vfr file for iSCSI config.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-
-#include "IScsiConfigNVDataStruc.h"
-#define EFI_NETWORK_DEVICE_CLASS  0x04
-
-formset
-  guid     = IP4_ISCSI_CONFIG_GUID,
-  title    = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE),
-  help     = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP),
-
-  varstore ISCSI_CONFIG_IFR_NVDATA,
-    name = ISCSI_CONFIG_IFR_NVDATA,
-    guid = IP4_ISCSI_CONFIG_GUID;
-  form formid = FORMID_MAIN_FORM,
-    title  = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE);
-
-    string  varid   = ISCSI_CONFIG_IFR_NVDATA.InitiatorName,
-            prompt  = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME),
-            help    = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP),
-            flags   = INTERACTIVE,
-            key     = KEY_INITIATOR_NAME,
-            minsize = ISCSI_NAME_IFR_MIN_SIZE,
-            maxsize = ISCSI_NAME_IFR_MAX_SIZE,
-    endstring;
-
-    label DEVICE_ENTRY_LABEL;
-    label LABEL_END;
-
-  endform;
-
-  form formid = FORMID_DEVICE_FORM,
-    title  = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE);
-
-    checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled,
-            prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE),
-            help   = STRING_TOKEN(STR_NULL),
-            flags  = 0,
-    endcheckbox;
-
-    checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp,
-            prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
-            help   = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
-            flags  = INTERACTIVE,
-            key    = KEY_DHCP_ENABLE,
-    endcheckbox;
-
-    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x01;
-    string  varid   = ISCSI_CONFIG_IFR_NVDATA.LocalIp,
-            prompt  = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS),
-            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
-            flags   = INTERACTIVE,
-            key     = KEY_LOCAL_IP,
-            minsize = IP_MIN_SIZE,
-            maxsize = IP_MAX_SIZE,
-    endstring;
-
-    string  varid   = ISCSI_CONFIG_IFR_NVDATA.SubnetMask,
-            prompt  = STRING_TOKEN(STR_ISCSI_LOCAL_MASK),
-            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
-            flags   = INTERACTIVE,
-            key     = KEY_SUBNET_MASK,
-            minsize = IP_MIN_SIZE,
-            maxsize = IP_MAX_SIZE,
-    endstring;
-
-    string  varid   = ISCSI_CONFIG_IFR_NVDATA.Gateway,
-            prompt  = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY),
-            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
-            flags   = INTERACTIVE,
-            key     = KEY_GATE_WAY,
-            minsize = IP_MIN_SIZE,
-            maxsize = IP_MAX_SIZE,
-    endstring;
-    endif;
-
-    subtitle text = STRING_TOKEN(STR_NULL);
-
-    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x00;
-    checkbox varid  = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp,
-             prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
-             help   = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
-             flags  = 0,
-    endcheckbox;
-    endif;
-
-    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp == 0x01;
-
-    string  varid   = ISCSI_CONFIG_IFR_NVDATA.TargetName,
-            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
-            help    = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
-            flags   = INTERACTIVE,
-            key     = KEY_TARGET_NAME,
-            minsize = ISCSI_NAME_IFR_MIN_SIZE,
-            maxsize = ISCSI_NAME_IFR_MAX_SIZE,
-    endstring;
-
-    string  varid   = ISCSI_CONFIG_IFR_NVDATA.TargetIp,
-            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS),
-            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
-            flags   = INTERACTIVE,
-            key     = KEY_TARGET_IP,
-            minsize = IP_MIN_SIZE,
-            maxsize = IP_MAX_SIZE,
-    endstring;
-
-    numeric varid   = ISCSI_CONFIG_IFR_NVDATA.TargetPort,
-            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
-            help    = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
-            flags   = 0,
-            minimum = TARGET_PORT_MIN_NUM,
-            maximum = TARGET_PORT_MAX_NUM,
-            step    = 0,
-    endnumeric;
-
-    string varid    = ISCSI_CONFIG_IFR_NVDATA.BootLun,
-            prompt  = STRING_TOKEN(STR_ISCSI_BOOT_LUN),
-            help    = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP),
-            flags   = INTERACTIVE,
-            key     = KEY_BOOT_LUN,
-            minsize = LUN_MIN_SIZE,
-            maxsize = LUN_MAX_SIZE,
-    endstring;
-    endif;
-
-    subtitle text = STRING_TOKEN(STR_NULL);
-
-    oneof varid  = ISCSI_CONFIG_IFR_NVDATA.CHAPType,
-          prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT),
-          help   = STRING_TOKEN(STR_CHAP_TYPE_HELP),
-          option text = STRING_TOKEN(STR_CHAP_TYPE_NONE),   value = ISCSI_CHAP_NONE,   flags = DEFAULT;
-          option text = STRING_TOKEN(STR_CHAP_TYPE_UNI),    value = ISCSI_CHAP_UNI,    flags = 0;
-          option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value = ISCSI_CHAP_MUTUAL, flags = 0;
-    endoneof;
-
-    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_NONE;
-
-    string  varid   = ISCSI_CONFIG_IFR_NVDATA.CHAPName,
-            prompt  = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
-            help    = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
-            flags   = INTERACTIVE,
-            key     = KEY_CHAP_NAME,
-            minsize = 0,
-            maxsize = ISCSI_CHAP_NAME_MAX_LEN,
-    endstring;
-
-    string  varid    = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret,
-            prompt   = STRING_TOKEN(STR_ISCSI_CHAP_SECRET),
-            help     = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
-            flags    = INTERACTIVE,
-            key      = KEY_CHAP_SECRET,
-            minsize  = ISCSI_CHAP_SECRET_MIN_LEN,
-            maxsize  = ISCSI_CHAP_SECRET_MAX_LEN,
-    endstring;
-
-    endif;
-
-    suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_MUTUAL;
-
-    string  varid   = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName,
-            prompt  = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
-            help    = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
-            flags   = INTERACTIVE,
-            key     = KEY_REVERSE_CHAP_NAME,
-            minsize = 0,
-            maxsize = ISCSI_CHAP_NAME_MAX_LEN,
-    endstring;
-
-    string  varid    = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret,
-            prompt   = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET),
-            help     = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
-            flags    = INTERACTIVE,
-            key      = KEY_REVERSE_CHAP_SECRET,
-            minsize  = ISCSI_CHAP_SECRET_MIN_LEN,
-            maxsize  = ISCSI_CHAP_SECRET_MAX_LEN,
-    endstring;
-
-    endif;
-
-    subtitle text = STRING_TOKEN(STR_NULL);
-
-    string  varid   = ISCSI_CONFIG_IFR_NVDATA.IsId,
-            prompt  = STRING_TOKEN(STR_ISCSI_CONFIG_ISID),
-            help    = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP),
-            flags   = INTERACTIVE,
-            key     = KEY_CONFIG_ISID,
-            minsize = ISID_CONFIGURABLE_MIN_LEN,
-            maxsize = ISID_CONFIGURABLE_MAX_LEN,
-    endstring;
-
-    subtitle text = STRING_TOKEN(STR_NULL);
-
-    text
-      help   = STRING_TOKEN (STR_SAVE_CHANGES),
-      text   = STRING_TOKEN (STR_SAVE_CHANGES),
-      flags  = INTERACTIVE,
-      key    = KEY_SAVE_CHANGES;
-
-    goto FORMID_MAIN_FORM,
-    prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM),
-    help   = STRING_TOKEN (STR_RETURN_MAIN_FORM),
-    flags  = 0;
-
-  endform;
-
-endformset;
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
deleted file mode 100644
index 729c74ebfc1b..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
+++ /dev/null
@@ -1,62 +0,0 @@
-// *++
-//
-// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-// 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:
-//
-//   IScsiConfigStrings.uni
-//
-// Abstract:
-//
-//   String definitions for iSCSI configuration.
-//
-// Revision History:
-//
-// --*/
-
-
-/=#
-
-#langdef en-US "English"
-
-#string STR_ISCSI_CONFIG_FORM_TITLE     #language en-US "iSCSI Configuration"
-#string STR_ISCSI_CONFIG_FORM_HELP      #language en-US "Configure the iSCSI parameters."
-#string STR_ISCSI_MAIN_FORM_TITLE       #language en-US "iSCSI Configuration"
-#string STR_ISCSI_CONFIG_INIT_NAME      #language en-US "iSCSI Initiator Name"
-#string STR_ISCSI_CONFIG_INIT_NAME_HELP #language en-US "The worldwide unique name of the initiator. Only iqn. format is accepted."
-#string STR_ISCSI_DEVICE_FORM_TITLE     #language en-US ""
-#string STR_ISCSI_DEVICE_ENABLE         #language en-US "Enable iSCSI"
-#string STR_ISCSI_LOCAL_IP_ADDRESS      #language en-US "  Initiator IP Address"
-#string STR_ISCSI_LOCAL_MASK            #language en-US "  Initiator Subnet Mask"
-#string STR_ISCSI_LOCAL_GATEWAY         #language en-US "  Gateway"
-#string STR_ISCSI_IP_ADDRESS_HELP       #language en-US "Enter IP address in dotted-decimal notation."
-#string STR_ISCSI_TARGET_NAME           #language en-US "  Target Name"
-#string STR_ISCSI_TARGET_IP_ADDRESS     #language en-US "  Target IP Address"
-#string STR_ISCSI_TARGET_PORT           #language en-US "  Target Port"
-#string STR_ISCSI_BOOT_LUN              #language en-US "  Boot LUN"
-#string STR_ISCSI_BOOT_LUN_HELP         #language en-US "Hexadecimal representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, 6734-9-156f-127, 4186-9"
-#string STR_ISCSI_ENABLE_DHCP           #language en-US "Enable DHCP"
-#string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target info via DHCP"
-#string STR_CHAP_TYPE_PROMPT            #language en-US "CHAP Type"
-#string STR_CHAP_TYPE_HELP              #language en-US "None, One way CHAP or mutual CHAP"
-#string STR_CHAP_TYPE_NONE              #language en-US "None"
-#string STR_CHAP_TYPE_UNI               #language en-US "One way"
-#string STR_CHAP_TYPE_MUTUAL            #language en-US "Mutual"
-#string STR_ISCSI_CHAP_NAME             #language en-US "  CHAP Name"
-#string STR_ISCSI_CHAP_SECRET           #language en-US "  CHAP Secret"
-#string STR_ISCSI_CHAP_SECRET_HELP      #language en-US "The minimum length is 12 bytes and the maximum length is 16 bytes."
-#string STR_ISCSI_REVERSE_CHAP_NAME     #language en-US "  Reverse CHAP Name"
-#string STR_ISCSI_REVERSE_CHAP_SECRET   #language en-US "  Reverse CHAP Secret"
-#string STR_ISCSI_CONFIG_ISID           #language en-US "ISID"
-#string STR_ISCSI_CONFIG_ISID_HELP      #language en-US "OUI-format ISID in 6 bytes, default value are derived from MAC address. Only last 3 bytes are configurable. Example: update 0ABBCCDDEEFF to 0ABBCCF07901 by input F07901."
-#string STR_RETURN_MAIN_FORM            #language en-US "Back to Previous Page"
-#string STR_SAVE_CHANGES                #language en-US "Save Changes"
-#string STR_NULL                        #language en-US ""
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
deleted file mode 100644
index 7c2e4e65fa8e..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/** @file
-  Define NVData structures used by the iSCSI configuration component
-
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_NVDATASTRUC_H_
-#define _ISCSI_NVDATASTRUC_H_
-
-#include <Guid/Ip4IScsiConfigHii.h>
-
-#define VAR_EQ_TEST_NAME    0x100
-
-#define FORMID_MAIN_FORM    1
-#define FORMID_DEVICE_FORM  2
-
-#define ISCSI_NAME_MAX_SIZE 224
-
-//
-// Vfr has a limit on the size, it's 255 bytes.
-//
-#define ISCSI_NAME_IFR_MIN_SIZE   4
-#define ISCSI_NAME_IFR_MAX_SIZE   223
-
-#define IP_MIN_SIZE               7
-#define IP_MAX_SIZE               15
-#define IP4_STR_MAX_SIZE          16
-
-#define LUN_MIN_SIZE              1
-#define LUN_MAX_SIZE              20
-
-#define ISCSI_CHAP_NONE           0
-#define ISCSI_CHAP_UNI            1
-#define ISCSI_CHAP_MUTUAL         2
-
-#define TARGET_PORT_MIN_NUM       0
-#define TARGET_PORT_MAX_NUM       65535
-
-#define DEVICE_ENTRY_LABEL        0x1234
-#define LABEL_END                 0xffff
-
-#define KEY_INITIATOR_NAME        0x101
-#define KEY_DHCP_ENABLE           0x102
-#define KEY_LOCAL_IP              0x103
-#define KEY_SUBNET_MASK           0x104
-#define KEY_GATE_WAY              0x105
-#define KEY_TARGET_IP             0x106
-#define KEY_CHAP_NAME             0x107
-#define KEY_CHAP_SECRET           0x108
-#define KEY_REVERSE_CHAP_NAME     0x109
-#define KEY_REVERSE_CHAP_SECRET   0x10a
-#define KEY_SAVE_CHANGES          0x10b
-#define KEY_TARGET_NAME           0x10c
-#define KEY_BOOT_LUN              0x10d
-#define KEY_CONFIG_ISID           0x10e
-
-#define KEY_DEVICE_ENTRY_BASE     0x1000
-
-#define ISCSI_LUN_STR_MAX_LEN     21
-#define ISCSI_CHAP_SECRET_MIN_LEN 12
-#define ISCSI_CHAP_SECRET_MAX_LEN 16
-//
-//  ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof (NULL-Terminator)
-//
-#define ISCSI_CHAP_SECRET_STORAGE 17
-
-#define ISCSI_CHAP_NAME_MAX_LEN   126
-#define ISCSI_CHAP_NAME_STORAGE   127
-
-#define ISID_CONFIGURABLE_MIN_LEN 6
-#define ISID_CONFIGURABLE_MAX_LEN 12
-#define ISID_CONFIGURABLE_STORAGE 13
-
-#pragma pack(1)
-typedef struct {
-  CHAR16  InitiatorName[ISCSI_NAME_MAX_SIZE];
-
-  UINT8   Enabled;
-
-  UINT8   InitiatorInfoFromDhcp;
-  CHAR16  LocalIp[IP4_STR_MAX_SIZE];
-  CHAR16  SubnetMask[IP4_STR_MAX_SIZE];
-  CHAR16  Gateway[IP4_STR_MAX_SIZE];
-
-  CHAR16  TargetName[ISCSI_NAME_MAX_SIZE];
-  CHAR16  TargetIp[IP4_STR_MAX_SIZE];
-  UINT16  TargetPort;
-  CHAR16  BootLun[ISCSI_LUN_STR_MAX_LEN];
-  UINT8   TargetInfoFromDhcp;
-
-  UINT8   CHAPType;
-  CHAR16  CHAPName[ISCSI_CHAP_NAME_STORAGE];
-  CHAR16  CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
-  CHAR16  ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
-  CHAR16  ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
-
-  CHAR16  IsId[ISID_CONFIGURABLE_STORAGE];
-} ISCSI_CONFIG_IFR_NVDATA;
-#pragma pack()
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
deleted file mode 100644
index 4c4dcaa8f68d..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/** @file
-  The header file of IScsiDhcp.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_DHCP_H_
-#define _ISCSI_DHCP_H_
-
-#include <Protocol/Dhcp4.h>
-
-#define ISCSI_ROOT_PATH_ID              "iscsi:"
-#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':'
-
-#define RP_FIELD_IDX_SERVERNAME         0
-#define RP_FIELD_IDX_PROTOCOL           1
-#define RP_FIELD_IDX_PORT               2
-#define RP_FIELD_IDX_LUN                3
-#define RP_FIELD_IDX_TARGETNAME         4
-#define RP_FIELD_IDX_MAX                5
-
-typedef struct _ISCSI_ROOT_PATH_FIELD {
-  CHAR8 *Str;
-  UINT8 Len;
-} ISCSI_ROOT_PATH_FIELD;
-
-/**
-  Parse the DHCP ACK to get the address configuration and DNS information.
-
-  @param[in]       Image            The handle of the driver image.
-  @param[in]       Controller       The handle of the controller;
-  @param[in, out]  ConfigData       The session configuration data.
-
-  @retval EFI_SUCCESS           The DNS information is got from the DHCP ACK.
-  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
-  @retval EFI_NO_MEDIA          There was a media error.
-  @retval Others                Other errors as indicated.
-
-**/
-EFI_STATUS
-IScsiDoDhcp (
-  IN     EFI_HANDLE                 Image,
-  IN     EFI_HANDLE                 Controller,
-  IN OUT ISCSI_SESSION_CONFIG_DATA  *ConfigData
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
deleted file mode 100644
index d6a619f00fc0..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/** @file
-  The header file of IScsiDriver.c.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_DRIVER_H_
-#define _ISCSI_DRIVER_H_
-
-#include <Uefi.h>
-#include <Protocol/DevicePath.h>
-#include <Protocol/LoadedImage.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/HiiDatabase.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/DevicePathLib.h>
-#include <Protocol/DriverBinding.h>
-#include <Protocol/ScsiPassThruExt.h>
-
-#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME"
-
-typedef struct _ISCSI_PRIVATE_PROTOCOL {
-  UINT32  Reserved;
-} ISCSI_PRIVATE_PROTOCOL;
-
-//
-// EFI Driver Binding Protocol for iSCSI driver.
-//
-
-/**
-  Tests to see if this driver supports a given controller. If a child device is provided,
-  it further tests to see if this driver supports creating a handle for the specified child device.
-
-  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param[in]  ControllerHandle     The handle of the controller to test. This handle
-                                   must support a protocol interface that supplies
-                                   an I/O abstraction to the driver.
-  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a device path.
-                                   This parameter is ignored by device drivers, and is optional for bus drivers.
-
-
-  @retval EFI_SUCCESS              The device specified by ControllerHandle and
-                                   RemainingDevicePath is supported by the driver specified by This.
-  @retval EFI_ALREADY_STARTED      The device specified by ControllerHandle and
-                                   RemainingDevicePath is already being managed by the driver
-                                   specified by This.
-  @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle and
-                                   RemainingDevicePath is already being managed by a different
-                                   driver or an application that requires exclusive acces.
-                                   Currently not implemented.
-  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle and
-                                   RemainingDevicePath is not supported by the driver specified by This.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
-  );
-
-/**
-  Start this driver on ControllerHandle. The Start() function is designed to be
-  invoked from the EFI boot service ConnectController(). As a result, much of
-  the error checking on the parameters to Start() has been moved into this
-  common boot service. It is legal to call Start() from other locations,
-  but the following calling restrictions must be followed or the system behavior will not be deterministic.
-  1. ControllerHandle must be a valid EFI_HANDLE.
-  2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned
-     EFI_DEVICE_PATH_PROTOCOL.
-  3. Prior to calling Start(), the Supported() function for the driver specified by This must
-     have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS.
-
-  @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param[in]  ControllerHandle     The handle of the controller to start. This handle
-                                   must support a protocol interface that supplies
-                                   an I/O abstraction to the driver.
-  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a device path.
-                                   This parameter is ignored by device drivers, and is optional for bus drivers.
-
-  @retval EFI_SUCCESS              The device was started.
-  @retval EFI_DEVICE_ERROR         The device could not be started due to a device error.
-                                   Currently not implemented.
-  @retval EFI_OUT_OF_RESOURCES     The request could not be completed due to a lack of resources.
-  @retval Others                   The driver failded to start the device.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
-  );
-
-/**
-  Stop this driver on ControllerHandle.
-
-  Release the control of this controller and remove the IScsi functions. The Stop()
-  function is designed to be invoked from the EFI boot service DisconnectController().
-  As a result, much of the error checking on the parameters to Stop() has been moved
-  into this common boot service. It is legal to call Stop() from other locations,
-  but the following calling restrictions must be followed or the system behavior will not be deterministic.
-  1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this
-     same driver's Start() function.
-  2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid
-     EFI_HANDLE. In addition, all of these handles must have been created in this driver's
-     Start() function, and the Start() function must have called OpenProtocol() on
-     ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
-
-  @param[in]  This              A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param[in]  ControllerHandle  A handle to the device being stopped. The handle must
-                                support a bus specific I/O protocol for the driver
-                                to use to stop the device.
-  @param[in]  NumberOfChildren  The number of child device handles in ChildHandleBuffer.Not used.
-  @param[in]  ChildHandleBuffer An array of child handles to be freed. May be NULL
-                                if NumberOfChildren is 0.Not used.
-
-  @retval EFI_SUCCESS           The device was stopped.
-  @retval EFI_DEVICE_ERROR      The device could not be stopped due to a device error.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingStop (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN UINTN                        NumberOfChildren,
-  IN EFI_HANDLE                   *ChildHandleBuffer OPTIONAL
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
deleted file mode 100644
index 48729e3029f7..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
+++ /dev/null
@@ -1,134 +0,0 @@
-## @file
-#  This module produces EFI iSCSI Initiator Name Protocol.
-#
-#  This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol
-#  and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI
-#  data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide
-#  one way to configurate the iSCSI setting. This driver only supports IPv4 network
-#  stack.
-#
-#  Notes:
-#  1) This driver can't co-work with the IScsiDxe driver in NetworkPkg.
-#  2) This driver might have some issues that have been fixed in the IScsiDxe driver
-#     in NetworkPkg.
-#  3) This driver supports fewer features than the IScsiDxe driver in NetworkPkg
-#     (e.g. IPv6, Dns support for target URL configuration, iSCSI keyword support).
-#  4) IScsiDxe driver in NetworkPkg is recommended for use instead of this one even
-#     though both of them can be used.
-#
-#  Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-#  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.
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = IScsi4Dxe
-  MODULE_UNI_FILE                = IScsi4Dxe.uni
-  FILE_GUID                      = 4579B72D-7EC4-4dd4-8486-083C86B182A7
-  MODULE_TYPE                    = UEFI_DRIVER
-  VERSION_STRING                 = 1.0
-  ENTRY_POINT                    = IScsiDriverEntryPoint
-  UNLOAD_IMAGE                   = EfiIScsiUnload
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-#  DRIVER_BINDING                =  gIScsiDriverBinding
-#  COMPONENT_NAME                =  gIScsiComponentName
-#  COMPONENT_NAME2               =  gIScsiComponentName2
-#
-
-[Sources]
-  IScsiTcp4Io.h
-  IScsiProto.h
-  IScsiMisc.h
-  IScsiIbft.h
-  IScsiExtScsiPassThru.h
-  IScsiDriver.h
-  IScsiDhcp.h
-  IScsiCommon.h
-  IScsiCHAP.h
-  IScsiInitiatorName.h
-  ComponentName.h
-  Md5.h
-  IScsiTcp4Io.c
-  IScsiProto.c
-  IScsiMisc.c
-  IScsiInitiatorName.c
-  IScsiIbft.c
-  IScsiExtScsiPassThru.c
-  IScsiDriver.c
-  IScsiDhcp.c
-  IScsiCHAP.c
-  ComponentName.c
-  Md5.c
-  IScsiConfigDxeStrings.uni
-  IScsiConfigDxe.vfr
-  IScsiConfig.c
-  IScsiConfig.h
-  IScsiImpl.h
-  IScsiConfigNVDataStruc.h
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-
-[LibraryClasses]
-  UefiDriverEntryPoint
-  UefiLib
-  BaseLib
-  UefiBootServicesTableLib
-  UefiRuntimeServicesTableLib
-  BaseMemoryLib
-  MemoryAllocationLib
-  DevicePathLib
-  DebugLib
-  PrintLib
-  HiiLib
-  NetLib
-
-[Protocols]
-  ## PRODUCES
-  ## UNDEFINED # Variable
-  gEfiIScsiInitiatorNameProtocolGuid
-  gEfiExtScsiPassThruProtocolGuid               ## BY_START
-  gEfiTcp4ProtocolGuid                          ## TO_START
-  gEfiTcp4ServiceBindingProtocolGuid            ## TO_START
-  gEfiDhcp4ProtocolGuid                         ## TO_START
-  gEfiDhcp4ServiceBindingProtocolGuid           ## TO_START
-  ## TO_START
-  ## PRODUCES
-  gEfiDevicePathProtocolGuid
-  gEfiHiiConfigAccessProtocolGuid               ## PRODUCES
-  gEfiHiiDatabaseProtocolGuid                   ## CONSUMES
-  gEfiPciIoProtocolGuid                         ## SOMETIMES_CONSUMES
-  gEfiAcpiTableProtocolGuid                     ## SOMETIMES_CONSUMES
-
-[Guids]
-  gEfiEventExitBootServicesGuid                 ## SOMETIMES_CONSUMES ## Event
-  gEfiIfrTianoGuid                              ## SOMETIMES_PRODUCES ## UNDEFINED
-  gEfiAcpiTableGuid                             ## SOMETIMES_CONSUMES ## SystemTable
-  gEfiAcpi10TableGuid                           ## SOMETIMES_CONSUMES ## SystemTable
-  ## SOMETIMES_PRODUCES ## Variable:L"iSCSIDeviceList"
-  ## SOMETIMES_CONSUMES ## Variable:L"iSCSIDeviceList"
-  ## SOMETIMES_CONSUMES ## UNDEFINED # HiiIsConfigHdrMatch   mVendorStorageName
-  ## SOMETIMES_PRODUCES ## UNDEFINED # HiiConstructConfigHdr mVendorStorageName
-  ## SOMETIMES_PRODUCES ## UNDEFINED # HiiGetBrowserData     mVendorStorageName
-  ## SOMETIMES_CONSUMES ## UNDEFINED # HiiSetBrowserData     mVendorStorageName
-  ## SOMETIMES_CONSUMES ## HII
-  gIp4IScsiConfigGuid
-  ## SOMETIMES_PRODUCES ## Variable
-  ## SOMETIMES_CONSUMES ## Variable
-  gIScsiCHAPAuthInfoGuid
-
-[UserExtensions.TianoCore."ExtraFiles"]
-  IScsi4DxeExtra.uni
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
deleted file mode 100644
index e635e47b9292..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/** @file
-  The header file of IScsiExtScsiPassThru.c.
-
-Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_EXT_SCSI_PASS_THRU_H_
-#define _ISCSI_EXT_SCSI_PASS_THRU_H_
-
-#include <Protocol/ScsiPassThruExt.h>
-
-extern EFI_EXT_SCSI_PASS_THRU_PROTOCOL  gIScsiExtScsiPassThruProtocolTemplate;
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
deleted file mode 100644
index 4f3828db63c6..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/** @file
-  Some extra definitions for iBFT.
-
-Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_IBFT_H_
-#define _ISCSI_IBFT_H_
-
-#include <IndustryStandard/Acpi.h>
-#include <IndustryStandard/IScsiBootFirmwareTable.h>
-#include <Protocol/AcpiTable.h>
-#include <Protocol/PciIo.h>
-
-#define IBFT_TABLE_VAR_NAME L"iBFT"
-#define IBFT_MAX_SIZE       4096
-#define IBFT_HEAP_OFFSET    2048
-
-#define IBFT_ROUNDUP(size)  NET_ROUNDUP ((size), EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT)
-
-/**
-  Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
-  session status.
-**/
-VOID
-IScsiPublishIbft (
-  VOID
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
deleted file mode 100644
index 8a5ee2149eb2..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/** @file
-  The header file of IScsiImpl.c.
-
-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_IMPL_H_
-#define _ISCSI_IMPL_H_
-
-#include <Uefi.h>
-
-#include <IndustryStandard/Dhcp.h>
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/NetLib.h>
-#include <Library/PrintLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-
-#include <Guid/EventGroup.h>
-
-#include "IScsiCommon.h"
-#include "IScsiDriver.h"
-#include "IScsiInitiatorName.h"
-#include "ComponentName.h"
-#include "IScsiConfigNVDataStruc.h"
-#include "IScsiExtScsiPassThru.h"
-#include "IScsiProto.h"
-#include "IScsiMisc.h"
-#include "IScsiCHAP.h"
-#include "IScsiConfig.h"
-#include "IScsiDhcp.h"
-#include "IScsiTcp4Io.h"
-#include "IScsiIbft.h"
-
-
-#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N')
-
-struct _ISCSI_SESSION {
-  UINT32                    Signature;
-
-  ISCSI_SESSION_CONFIG_DATA ConfigData;
-  ISCSI_CHAP_AUTH_DATA      AuthData;
-
-  CHAR8                     InitiatorName[ISCSI_NAME_MAX_SIZE];
-  UINTN                     InitiatorNameLength;
-  UINT8                     State;
-
-  UINT8                     Isid[6];
-  UINT16                    Tsih;
-
-  UINT32                    CmdSN;
-  UINT32                    ExpCmdSN;
-  UINT32                    MaxCmdSN;
-
-  UINT32                    InitiatorTaskTag;
-  UINT16                    NextCid;
-
-  LIST_ENTRY                Conns;
-  UINT32                    NumConns;
-
-  LIST_ENTRY                TcbList;
-
-  //
-  // session-wide parameters
-  //
-  UINT16                    TargetPortalGroupTag;
-  UINT32                    MaxConnections;
-  BOOLEAN                   InitialR2T;
-  BOOLEAN                   ImmediateData;
-  UINT32                    MaxBurstLength;
-  UINT32                    FirstBurstLength;
-  UINT32                    DefaultTime2Wait;
-  UINT32                    DefaultTime2Retain;
-  UINT16                    MaxOutstandingR2T;
-  BOOLEAN                   DataPDUInOrder;
-  BOOLEAN                   DataSequenceInOrder;
-  UINT8                     ErrorRecoveryLevel;
-};
-
-#define ISCSI_CONNECTION_SIGNATURE  SIGNATURE_32 ('I', 'S', 'C', 'N')
-
-struct _ISCSI_CONNECTION {
-  UINT32            Signature;
-  LIST_ENTRY        Link;
-
-  EFI_EVENT         TimeoutEvent;
-
-  ISCSI_SESSION     *Session;
-
-  UINT8             State;
-  UINT8             CurrentStage;
-  UINT8             NextStage;
-
-  UINT8             CHAPStep;
-
-  BOOLEAN           PartialReqSent;
-  BOOLEAN           PartialRspRcvd;
-
-  BOOLEAN           TransitInitiated;
-
-  UINT16            Cid;
-  UINT32            ExpStatSN;
-
-  //
-  // queues...
-  //
-  NET_BUF_QUEUE     RspQue;
-
-  TCP4_IO           Tcp4Io;
-
-  //
-  // connection-only parameters
-  //
-  UINT32            MaxRecvDataSegmentLength;
-  ISCSI_DIGEST_TYPE HeaderDigest;
-  ISCSI_DIGEST_TYPE DataDigest;
-};
-
-#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A')
-
-#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \
-  CR ( \
-  PassThru, \
-  ISCSI_DRIVER_DATA, \
-  IScsiExtScsiPassThru, \
-  ISCSI_DRIVER_DATA_SIGNATURE \
-  )
-#define ISCSI_DRIVER_DATA_FROM_IDENTIFIER(Identifier) \
-  CR ( \
-  Identifier, \
-  ISCSI_DRIVER_DATA, \
-  IScsiIdentifier, \
-  ISCSI_DRIVER_DATA_SIGNATURE \
-  )
-#define ISCSI_DRIVER_DATA_FROM_SESSION(s) \
-  CR ( \
-  s, \
-  ISCSI_DRIVER_DATA, \
-  Session, \
-  ISCSI_DRIVER_DATA_SIGNATURE \
-  )
-
-struct _ISCSI_DRIVER_DATA {
-  UINT32                          Signature;
-  EFI_HANDLE                      Image;
-  EFI_HANDLE                      Controller;
-  ISCSI_PRIVATE_PROTOCOL          IScsiIdentifier;
-  EFI_HANDLE                      ChildHandle;
-  EFI_EVENT                       ExitBootServiceEvent;
-
-  EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru;
-  EFI_EXT_SCSI_PASS_THRU_MODE     ExtScsiPassThruMode;
-  EFI_HANDLE                      ExtScsiPassThruHandle;
-  EFI_DEVICE_PATH_PROTOCOL        *DevicePath;
-
-  ISCSI_SESSION                   Session;
-};
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
deleted file mode 100644
index f967fb383095..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/** @file
-  The header file for EFI iSCSI Initiator Name Protocol.
-
-Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_INITIATOR_NAME_H_
-#define _ISCSI_INITIATOR_NAME_H_
-
-#include <Protocol/IScsiInitiatorName.h>
-
-extern EFI_ISCSI_INITIATOR_NAME_PROTOCOL  gIScsiInitiatorName;
-
-//
-// EFI iSCSI Initiator Name Protocol for IScsi driver.
-//
-
-/**
-  Retrieves the current set value of iSCSI Initiator Name.
-
-  @param[in]       This       Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
-  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the
-                              variable data buffer.
-  @param[out]      Buffer     Pointer to the buffer for data to be read.
-
-  @retval EFI_SUCCESS           Data was successfully retrieved into the provided buffer and the
-                                BufferSize was sufficient to handle the iSCSI initiator name.
-  @retval EFI_BUFFER_TOO_SMALL  BufferSize is too small for the result.
-  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
-  @retval EFI_DEVICE_ERROR      The iSCSI initiator name could not be retrieved due to a hardware error.
-  @retval Others                Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiGetInitiatorName (
-  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
-  IN OUT UINTN                              *BufferSize,
-  OUT    VOID                               *Buffer
-  );
-
-/**
-  Sets the iSCSI Initiator Name.
-
-  @param[in]       This       Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
-  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer.
-  @param[in]       Buffer     Pointer to the buffer for data to be written.
-
-  @retval EFI_SUCCESS           Data was successfully stored by the protocol.
-  @retval EFI_UNSUPPORTED       Platform policies do not allow for data to be written.
-                                Currently not implemented.
-  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit.
-  @retval EFI_DEVICE_ERROR      The data could not be stored due to a hardware error.
-  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the data.
-  @retval EFI_PROTOCOL_ERROR    Input iSCSI initiator name does not adhere to RFC 3720
-                                (and other related protocols).
-  @retval Others                Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiSetInitiatorName (
-  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
-  IN OUT UINTN                              *BufferSize,
-  IN     VOID                               *Buffer
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
deleted file mode 100644
index 500e00373b25..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
+++ /dev/null
@@ -1,317 +0,0 @@
-/** @file
-  Miscellaneous definitions for iSCSI driver.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_MISC_H_
-#define _ISCSI_MISC_H_
-
-#include <Library/BaseLib.h>
-
-typedef struct _ISCSI_SESSION_CONFIG_DATA ISCSI_SESSION_CONFIG_DATA;
-
-///
-/// IPv4 Device Path Node Length
-///
-#define IP4_NODE_LEN_NEW_VERSIONS    27
-
-#pragma pack(1)
-typedef struct {
-  BOOLEAN           Enabled;
-
-  BOOLEAN           InitiatorInfoFromDhcp;
-  EFI_IPv4_ADDRESS  LocalIp;
-  EFI_IPv4_ADDRESS  SubnetMask;
-  EFI_IPv4_ADDRESS  Gateway;
-
-  BOOLEAN           TargetInfoFromDhcp;
-  CHAR8             TargetName[ISCSI_NAME_MAX_SIZE];
-  EFI_IPv4_ADDRESS  TargetIp;
-  UINT16            TargetPort;
-  UINT8             BootLun[8];
-
-  UINT8             IsId[6];
-} ISCSI_SESSION_CONFIG_NVDATA;
-#pragma pack()
-
-struct _ISCSI_SESSION_CONFIG_DATA {
-  ISCSI_SESSION_CONFIG_NVDATA NvData;
-
-  EFI_IPv4_ADDRESS            PrimaryDns;
-  EFI_IPv4_ADDRESS            SecondaryDns;
-  EFI_IPv4_ADDRESS            DhcpServer;
-};
-
-/**
-  Calculate the prefix length of the IPv4 subnet mask.
-
-  @param[in]  SubnetMask The IPv4 subnet mask.
-
-  @return The prefix length of the subnet mask.
-  @retval 0 Other errors as indicated.
-**/
-UINT8
-IScsiGetSubnetMaskPrefixLength (
-  IN EFI_IPv4_ADDRESS  *SubnetMask
-  );
-
-/**
-  Convert the hexadecimal encoded LUN string into the 64-bit LUN.
-
-  @param[in]   Str             The hexadecimal encoded LUN string.
-  @param[out]  Lun             Storage to return the 64-bit LUN.
-
-  @retval EFI_SUCCESS           The 64-bit LUN is stored in Lun.
-  @retval EFI_INVALID_PARAMETER The string is malformatted.
-**/
-EFI_STATUS
-IScsiAsciiStrToLun (
-  IN  CHAR8  *Str,
-  OUT UINT8  *Lun
-  );
-
-/**
-  Convert the 64-bit LUN into the hexadecimal encoded LUN string.
-
-  @param[in]   Lun The 64-bit LUN.
-  @param[out]  Str The storage to return the hexadecimal encoded LUN string.
-**/
-VOID
-IScsiLunToUnicodeStr (
-  IN UINT8    *Lun,
-  OUT CHAR16  *Str
-  );
-
-/**
-  Convert the ASCII string into a UNICODE string.
-
-  @param[in]   Source      The ASCII string.
-  @param[out]  Destination The storage to return the UNICODE string.
-
-  @return CHAR16 *         Pointer to the UNICODE string.
-**/
-CHAR16 *
-IScsiAsciiStrToUnicodeStr (
-  IN  CHAR8   *Source,
-  OUT CHAR16  *Destination
-  );
-
-/**
-  Convert the UNICODE string into an ASCII string.
-
-  @param[in]  Source       The UNICODE string.
-  @param[out] Destination  The storage to return the ASCII string.
-
-  @return CHAR8 *          Pointer to the ASCII string.
-**/
-CHAR8 *
-IScsiUnicodeStrToAsciiStr (
-  IN  CHAR16  *Source,
-  OUT CHAR8   *Destination
-  );
-
-/**
-  Convert the mac address into a hexadecimal encoded "-" seperated string.
-
-  @param[in]  Mac     The mac address.
-  @param[in]  Len     Length in bytes of the mac address.
-  @param[in]  VlanId  VLAN ID of the network device.
-  @param[out] Str     The storage to return the mac string.
-**/
-VOID
-IScsiMacAddrToStr (
-  IN  EFI_MAC_ADDRESS  *Mac,
-  IN  UINT32           Len,
-  IN  UINT16           VlanId,
-  OUT CHAR16           *Str
-  );
-
-/**
-  Convert the decimal dotted IPv4 address into the binary IPv4 address.
-
-  @param[in]   Str             The UNICODE string.
-  @param[out]  Ip              The storage to return the ASCII string.
-
-  @retval EFI_SUCCESS           The binary IP address is returned in Ip.
-  @retval EFI_INVALID_PARAMETER The IP string is malformatted.
-**/
-EFI_STATUS
-IScsiAsciiStrToIp (
-  IN  CHAR8             *Str,
-  OUT EFI_IPv4_ADDRESS  *Ip
-  );
-
-/**
-  Convert the binary encoded buffer into a hexadecimal encoded string.
-
-  @param[in]       BinBuffer   The buffer containing the binary data.
-  @param[in]       BinLength   Length of the binary buffer.
-  @param[in, out]  HexStr      Pointer to the string.
-  @param[in, out]  HexLength   The length of the string.
-
-  @retval EFI_SUCCESS          The binary data is converted to the hexadecimal string
-                               and the length of the string is updated.
-  @retval EFI_BUFFER_TOO_SMALL The string is too small.
-  @retval EFI_INVALID_PARAMETER The IP string is malformatted.
-**/
-EFI_STATUS
-IScsiBinToHex (
-  IN     UINT8  *BinBuffer,
-  IN     UINT32 BinLength,
-  IN OUT CHAR8  *HexStr,
-  IN OUT UINT32 *HexLength
-  );
-
-/**
-  Convert the hexadecimal string into a binary encoded buffer.
-
-  @param[in, out]  BinBuffer   The binary buffer.
-  @param[in, out]  BinLength   Length of the binary buffer.
-  @param[in]       HexStr      The hexadecimal string.
-
-  @retval EFI_SUCCESS          The hexadecimal string is converted into a binary
-                               encoded buffer.
-  @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data.
-**/
-EFI_STATUS
-IScsiHexToBin (
-  IN OUT UINT8  *BinBuffer,
-  IN OUT UINT32 *BinLength,
-  IN     CHAR8  *HexStr
-  );
-
-/**
-  Generate random numbers.
-
-  @param[in, out]  Rand       The buffer to contain random numbers.
-  @param[in]       RandLength The length of the Rand buffer.
-**/
-VOID
-IScsiGenRandom (
-  IN OUT UINT8  *Rand,
-  IN     UINTN  RandLength
-  );
-
-/**
-  Create the iSCSI driver data..
-
-  @param[in] Image      The handle of the driver image.
-  @param[in] Controller The handle of the controller.
-
-  @return The iSCSI driver data created.
-  @retval NULL Other errors as indicated.
-**/
-ISCSI_DRIVER_DATA *
-IScsiCreateDriverData (
-  IN EFI_HANDLE  Image,
-  IN EFI_HANDLE  Controller
-  );
-
-/**
-  Clean the iSCSI driver data.
-
-  @param[in]               Private The iSCSI driver data.
-
-  @retval EFI_SUCCES       The clean operation is successful.
-  @retval Others           Other errors as indicated.
-**/
-EFI_STATUS
-IScsiCleanDriverData (
-  IN ISCSI_DRIVER_DATA  *Private
-  );
-
-/**
-  Check wheather the Controller is configured to use DHCP protocol.
-
-  @param[in]  Controller           The handle of the controller.
-
-  @retval TRUE                     The handle of the controller need the Dhcp protocol.
-  @retval FALSE                    The handle of the controller does not need the Dhcp protocol.
-
-**/
-BOOLEAN
-IScsiDhcpIsConfigured (
-  IN EFI_HANDLE  Controller
-  );
-
-/**
-  Get the various configuration data of this iSCSI instance.
-
-  @param[in]  Private   The iSCSI driver data.
-
-  @retval EFI_SUCCESS   The configuration of this instance is got.
-  @retval EFI_ABORTED   The operation was aborted.
-  @retval Others        Other errors as indicated.
-**/
-EFI_STATUS
-IScsiGetConfigData (
-  IN ISCSI_DRIVER_DATA  *Private
-  );
-
-/**
-  Get the device path of the iSCSI tcp connection and update it.
-
-  @param[in]  Private The iSCSI driver data.
-
-  @return The updated device path.
-  @retval NULL Other errors as indicated.
-**/
-EFI_DEVICE_PATH_PROTOCOL *
-IScsiGetTcpConnDevicePath (
-  IN ISCSI_DRIVER_DATA  *Private
-  );
-
-/**
-  Abort the session when the transition from BS to RT is initiated.
-
-  @param[in]   Event  The event signaled.
-  @param[in]  Context The iSCSI driver data.
-**/
-VOID
-EFIAPI
-IScsiOnExitBootService (
-  IN EFI_EVENT  Event,
-  IN VOID       *Context
-  );
-
-/**
-  Tests whether a controller handle is being managed by IScsi driver.
-
-  This function tests whether the driver specified by DriverBindingHandle is
-  currently managing the controller specified by ControllerHandle.  This test
-  is performed by evaluating if the the protocol specified by ProtocolGuid is
-  present on ControllerHandle and is was opened by DriverBindingHandle and Nic
-  Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
-  If ProtocolGuid is NULL, then ASSERT().
-
-  @param  ControllerHandle     A handle for a controller to test.
-  @param  DriverBindingHandle  Specifies the driver binding handle for the
-                               driver.
-  @param  ProtocolGuid         Specifies the protocol that the driver specified
-                               by DriverBindingHandle opens in its Start()
-                               function.
-
-  @retval EFI_SUCCESS          ControllerHandle is managed by the driver
-                               specified by DriverBindingHandle.
-  @retval EFI_UNSUPPORTED      ControllerHandle is not managed by the driver
-                               specified by DriverBindingHandle.
-
-**/
-EFI_STATUS
-EFIAPI
-IScsiTestManagedDevice (
-  IN  EFI_HANDLE       ControllerHandle,
-  IN  EFI_HANDLE       DriverBindingHandle,
-  IN  EFI_GUID         *ProtocolGuid
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
deleted file mode 100644
index 6469df0434a1..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
+++ /dev/null
@@ -1,1005 +0,0 @@
-/** @file
-  The header file of iSCSI Protocol that defines many specific data structures.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_PROTO_H_
-#define _ISCSI_PROTO_H_
-
-#include <Protocol/ScsiPassThruExt.h>
-
-//
-// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32
-//
-#define ISCSI_SEQ_EQ(s1, s2)  ((s1) == (s2))
-#define ISCSI_SEQ_LT(s1, s2) \
-    ( \
-      (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) || \
-      (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) \
-    )
-#define ISCSI_SEQ_GT(s1, s2) \
-    ( \
-      (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) || \
-      (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \
-    )
-
-#define ISCSI_WELL_KNOWN_PORT                   3260
-#define ISCSI_MAX_CONNS_PER_SESSION             1
-
-#define DEFAULT_MAX_RECV_DATA_SEG_LEN           8192
-#define MAX_RECV_DATA_SEG_LEN_IN_FFP            65536
-#define DEFAULT_MAX_OUTSTANDING_R2T             1
-
-#define ISCSI_VERSION_MAX                       0x00
-#define ISCSI_VERSION_MIN                       0x00
-
-#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME          EFI_TIMER_PERIOD_SECONDS(20)
-#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME       EFI_TIMER_PERIOD_SECONDS(20)
-
-#define ISCSI_KEY_AUTH_METHOD                   "AuthMethod"
-#define ISCSI_KEY_HEADER_DIGEST                 "HeaderDigest"
-#define ISCSI_KEY_DATA_DIGEST                   "DataDigest"
-#define ISCSI_KEY_MAX_CONNECTIONS               "MaxConnections"
-#define ISCSI_KEY_TARGET_NAME                   "TargetName"
-#define ISCSI_KEY_INITIATOR_NAME                "InitiatorName"
-#define ISCSI_KEY_TARGET_ALIAS                  "TargetAlias"
-#define ISCSI_KEY_INITIATOR_ALIAS               "InitiatorAlias"
-#define ISCSI_KEY_TARGET_ADDRESS                "TargetAddress"
-#define ISCSI_KEY_INITIAL_R2T                   "InitialR2T"
-#define ISCSI_KEY_IMMEDIATE_DATA                "ImmediateData"
-#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG       "TargetPortalGroupTag"
-#define ISCSI_KEY_MAX_BURST_LENGTH              "MaxBurstLength"
-#define ISCSI_KEY_FIRST_BURST_LENGTH            "FirstBurstLength"
-#define ISCSI_KEY_DEFAULT_TIME2WAIT             "DefaultTime2Wait"
-#define ISCSI_KEY_DEFAULT_TIME2RETAIN           "DefaultTime2Retain"
-#define ISCSI_KEY_MAX_OUTSTANDING_R2T           "MaxOutstandingR2T"
-#define ISCSI_KEY_DATA_PDU_IN_ORDER             "DataPDUInOrder"
-#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER        "DataSequenceInOrder"
-#define ISCSI_KEY_ERROR_RECOVERY_LEVEL          "ErrorRecoveryLevel"
-#define ISCSI_KEY_SESSION_TYPE                  "SessionType"
-#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH  "MaxRecvDataSegmentLength"
-
-#define ISCSI_KEY_VALUE_NONE                    "None"
-
-///
-/// connection state for initiator
-///
-
-#define CONN_STATE_FREE                         0
-#define CONN_STATE_XPT_WAIT                     1
-#define CONN_STATE_IN_LOGIN                     2
-#define CONN_STATE_LOGGED_IN                    3
-#define CONN_STATE_IN_LOGOUT                    4
-#define CONN_STATE_LOGOUT_REQUESTED             5
-#define CONN_STATE_CLEANUP_WAIT                 6
-#define CONN_STATE_IN_CLEANUP                   7
-
-///
-/// session state for initiator
-///
-#define SESSION_STATE_FREE                      0
-#define SESSION_STATE_LOGGED_IN                 1
-#define SESSION_STATE_FAILED                    2
-
-typedef enum {
-  DataIn  = 0,
-  DataOut = 1,
-  DataBi  = 2
-} DATA_DIRECTION;
-
-#define ISCSI_RESERVED_TAG                  0xffffffff
-
-#define ISCSI_REQ_IMMEDIATE                 0x40
-#define ISCSI_OPCODE_MASK                   0x3F
-
-#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs)  ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) = ((Op) | (Flgs)))
-#define ISCSI_GET_OPCODE(PduHdr)            ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) & ISCSI_OPCODE_MASK)
-#define ISCSI_CHECK_OPCODE(PduHdr, Op)      ((((PduHdr)->OpCode) & ISCSI_OPCODE_MASK) == (Op))
-#define ISCSI_IMMEDIATE_ON(PduHdr)          ((PduHdr)->OpCode & ISCSI_REQ_IMMEDIATE)
-#define ISCSI_SET_FLAG(PduHdr, Flag)        (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags |= (BOOLEAN)(Flag))
-#define ISCSI_CLEAR_FLAG(PduHdr, Flag)      (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags &= ~(Flag))
-#define ISCSI_FLAG_ON(PduHdr, Flag)         ((((ISCSI_BASIC_HEADER *) (PduHdr))->Flags & (Flag)) == (Flag))
-#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt)  ((PduHdr)->Flags = (UINT8) ((PduHdr)->Flags | ((Cur) << 2 | (Nxt))))
-#define ISCSI_GET_CURRENT_STAGE(PduHdr)     (((PduHdr)->Flags >> 2) & 0x3)
-#define ISCSI_GET_NEXT_STAGE(PduHdr)        (((PduHdr)->Flags) & 0x3)
-
-#define ISCSI_GET_PAD_LEN(DataLen)          ((~(DataLen) + 1) & 0x3)
-#define ISCSI_ROUNDUP(DataLen)              (((DataLen) + 3) &~(0x3))
-
-#define HTON24(Dst, Src) \
-  do { \
-    (Dst)[0]  = (UINT8) (((Src) >> 16) & 0xFF); \
-    (Dst)[1]  = (UINT8) (((Src) >> 8) & 0xFF); \
-    (Dst)[2]  = (UINT8) ((Src) & 0xFF); \
-  } while (0);
-
-#define NTOH24(src)                         (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2]))
-
-#define ISCSI_GET_DATASEG_LEN(PduHdr)       NTOH24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength)
-#define ISCSI_SET_DATASEG_LEN(PduHdr, Len)  HTON24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len))
-
-//
-// initiator opcodes
-//
-#define ISCSI_OPCODE_NOP_OUT        0x00
-#define ISCSI_OPCODE_SCSI_CMD       0x01
-#define ISCSI_OPCODE_SCSI_TMF_REQ   0x02
-#define ISCSI_OPCODE_LOGIN_REQ      0x03
-#define ISCSI_OPCODE_TEXT_REQ       0x04
-#define ISCSI_OPCODE_SCSI_DATA_OUT  0x05
-#define ISCSI_OPCODE_LOGOUT_REQ     0x06
-#define ISCSI_OPCODE_SNACK_REQ      0x10
-#define ISCSI_OPCODE_VENDOR_I0      0x1c
-#define ISCSI_OPCODE_VENDOR_I1      0x1d
-#define ISCSI_OPCODE_VENDOR_I2      0x1e
-
-//
-// target opcodes
-//
-#define ISCSI_OPCODE_NOP_IN       0x20
-#define ISCSI_OPCODE_SCSI_RSP     0x21
-#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22
-#define ISCSI_OPCODE_LOGIN_RSP    0x23
-#define ISCSI_OPCODE_TEXT_RSP     0x24
-#define ISCSI_OPCODE_SCSI_DATA_IN 0x25
-#define ISCSI_OPCODE_LOGOUT_RSP   0x26
-#define ISCSI_OPCODE_R2T          0x31
-#define ISCSI_OPCODE_ASYNC_MSG    0x32
-#define ISCSI_OPCODE_VENDOR_T0    0x3c
-#define ISCSI_OPCODE_VENDOR_T1    0x3d
-#define ISCSI_OPCODE_VENDOR_T2    0x3e
-#define ISCSI_OPCODE_REJECT       0x3f
-
-#define ISCSI_BHS_FLAG_FINAL      0x80
-
-///
-/// iSCSI Basic Header Segment
-///
-typedef struct _ISCSI_BASIC_HEADER {
-  UINT8   OpCode;
-  UINT8   Flags;
-  UINT16  OpCodeSpecific1;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Lun[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  OpCodeSpecific2[7];
-} ISCSI_BASIC_HEADER;
-
-//
-// Defined AHS types, others are reserved.
-//
-#define ISCSI_AHS_TYPE_EXT_CDB              0x1
-#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2
-
-typedef struct _ISCSI_ADDTIONAL_HEADER {
-  UINT16  Length;
-  UINT8   Type;
-  UINT8   TypeSpecific[1];
-} ISCSI_ADDITIONAL_HEADER;
-
-typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS {
-  UINT16  Length;
-  UINT8   Type;
-  UINT8   Reserved;
-  UINT32  ExpReadDataLength;
-} ISCSI_BI_EXP_READ_DATA_LEN_AHS;
-
-#define SCSI_CMD_PDU_FLAG_READ        0x40
-#define SCSI_CMD_PDU_FLAG_WRITE       0x20
-
-#define ISCSI_CMD_PDU_TASK_ATTR_MASK  0x07
-
-//
-// task attributes
-//
-#define ISCSI_TASK_ATTR_UNTAGGED  0x00
-#define ISCSI_TASK_ATTR_SIMPLE    0x01
-#define ISCSI_TASK_ATTR_ORDERD    0x02
-#define ISCSI_TASK_ATTR_HOQ       0x03
-#define ISCSI_TASK_ATTR_ACA       0x04
-
-///
-/// SCSI Command
-///
-typedef struct _SCSI_COMMAND {
-  UINT8   OpCode;
-  UINT8   Flags;
-  UINT16  Reserved;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Lun[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  ExpDataXferLength;
-  UINT32  CmdSN;
-  UINT32  ExpStatSN;
-  UINT8   Cdb[16];
-} SCSI_COMMAND;
-
-//
-// flag bit definitions in SCSI response
-//
-#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW  0x10
-#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08
-#define SCSI_RSP_PDU_FLAG_OVERFLOW          0x04
-#define SCSI_RSP_PDU_FLAG_UNDERFLOW         0x02
-
-//
-// iSCSI service response codes
-//
-#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET  0x00
-#define ISCSI_SERVICE_RSP_TARGET_FAILURE              0x01
-
-///
-/// SCSI Response
-///
-typedef struct _SCSI_RESPONSE {
-  UINT8   OpCode;
-  UINT8   Flags;
-  UINT8   Response;
-  UINT8   Status;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Reserved[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  SNACKTag;
-  UINT32  StatSN;
-  UINT32  ExpCmdSN;
-  UINT32  MaxCmdSN;
-  UINT32  ExpDataSN;
-  UINT32  BiReadResidualCount;
-  UINT32  ResidualCount;
-} SCSI_RESPONSE;
-
-typedef struct _ISCSI_SENSE_DATA {
-  UINT16  Length;
-  UINT8   Data[2];
-} ISCSI_SENSE_DATA;
-
-///
-/// iSCSI Task Managment Function Request
-///
-typedef struct _ISCSI_TMF_REQUEST {
-  UINT8   OpCode;
-  UINT8   Fuction;
-  UINT16  Reserved1;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Lun[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  ReferencedTaskTag;
-  UINT32  CmdSN;
-  UINT32  ExpStatSN;
-  UINT32  RefCmdSN;
-  UINT32  ExpDataSN;
-  UINT32  Reserved2[2];
-} ISCSI_TMF_REQUEST;
-
-#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE           0
-#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST              1
-#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST               2
-#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT        3
-#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4
-#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED               5
-#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED        6
-#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED           255
-
-///
-/// iSCSI Task Management Function Response
-///
-typedef struct _ISCSI_TMF_RESPONSE {
-  UINT8   OpCode;
-  UINT8   Reserved1;
-  UINT8   Response;
-  UINT8   Reserved2;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT32  Reserver3[2];
-  UINT32  InitiatorTaskTag;
-  UINT32  Reserved4;
-  UINT32  StatSN;
-  UINT32  ExpCmdSN;
-  UINT32  MaxCmdSN;
-  UINT32  Reserved[3];
-} ISCSI_TMF_RESPONSE;
-
-///
-/// SCSI Data-Out
-///
-typedef struct _ISCSI_SCSI_DATA_OUT {
-  UINT8   OpCode;
-  UINT8   Reserved1[3];
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Lun[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  TargetTransferTag;
-  UINT32  Reserved2;
-  UINT32  ExpStatSN;
-  UINT32  Reserved3;
-  UINT32  DataSN;
-  UINT32  BufferOffset;
-  UINT32  Reserved4;
-} ISCSI_SCSI_DATA_OUT;
-
-#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE  0x40
-#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW      SCSI_RSP_PDU_FLAG_OVERFLOW
-#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW     SCSI_RSP_PDU_FLAG_UNDERFLOW
-#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID  0x01
-
-///
-/// SCSI Data-In
-///
-typedef struct _ISCSI_SCSI_DATA_IN {
-  UINT8   OpCode;
-  UINT8   Flags;
-  UINT8   Reserved1;
-  UINT8   Status;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Lun[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  TargetTransferTag;
-  UINT32  StatSN;
-  UINT32  ExpCmdSN;
-  UINT32  MaxCmdSN;
-  UINT32  DataSN;
-  UINT32  BufferOffset;
-  UINT32  ResidualCount;
-} ISCSI_SCSI_DATA_IN;
-
-#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset)
-
-///
-/// Ready To Transfer
-///
-typedef struct _ISCSI_READY_TO_TRANSFER {
-  UINT8   OpCode;
-  UINT8   Reserved1[3];
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Lun[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  TargetTransferTag;
-  UINT32  StatSN;
-  UINT32  ExpCmdSN;
-  UINT32  MaxCmdSN;
-  UINT32  R2TSeqNum;
-  UINT32  BufferOffset;
-  UINT32  DesiredDataTransferLength;
-} ISCSI_READY_TO_TRANSFER;
-
-typedef struct _ISCSI_ASYNC_MESSAGE {
-  UINT8   OpCode;
-  UINT8   Reserved1[8];
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Lun[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  Reserved2;
-  UINT32  StatSN;
-  UINT32  ExpCmdSN;
-  UINT32  MaxCmdSN;
-  UINT8   AsyncEvent;
-  UINT8   AsyncVCode;
-  UINT16  Parameter1;
-  UINT16  Parameter2;
-  UINT16  Parameter3;
-  UINT32  Reserved3;
-} ISCSI_ASYNC_MESSAGE;
-
-#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT  0x80
-#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40
-
-///
-/// Login Request
-///
-typedef struct _ISCSI_LOGIN_REQUEST {
-  UINT8   OpCode;
-  UINT8   Flags;
-  UINT8   VersionMax;
-  UINT8   VersionMin;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Isid[6];
-  UINT16  Tsih;
-  UINT32  InitiatorTaskTag;
-  UINT16  Cid;
-  UINT16  Reserved1;
-  UINT32  CmdSN;
-  UINT32  ExpStatSN;
-  UINT32  Reserved2[4];
-} ISCSI_LOGIN_REQUEST;
-
-#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT    ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT
-#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE   ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE
-
-#define ISCSI_LOGIN_STATUS_SUCCESS          0
-#define ISCSI_LOGIN_STATUS_REDIRECTION      1
-#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR  2
-#define ISCSI_LOGIN_STATUS_TARGET_ERROR     3
-
-///
-/// Login Response
-///
-typedef struct _ISCSI_LOGIN_RESPONSE {
-  UINT8   OpCode;
-  UINT8   Flags;
-  UINT8   VersionMax;
-  UINT8   VersionActive;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Isid[6];
-  UINT16  Tsih;
-  UINT32  InitiatorTaskTag;
-  UINT32  Reserved1;
-  UINT32  StatSN;
-  UINT32  ExpCmdSN;
-  UINT32  MaxCmdSN;
-  UINT8   StatusClass;
-  UINT8   StatusDetail;
-  UINT8   Reserved2[10];
-} ISCSI_LOGIN_RESPONSE;
-
-#define ISCSI_LOGOUT_REASON_CLOSE_SESSION                   0
-#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION                1
-#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY  2
-
-///
-/// Logout Request
-///
-typedef struct _ISCSI_LOGOUT_REQUEST {
-  UINT8   OpCode;
-  UINT8   ReasonCode;
-  UINT16  Reserved1;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT32  Reserved2[2];
-  UINT32  InitiatorTaskTag;
-  UINT16  Cid;
-  UINT16  Reserved3;
-  UINT32  CmdSN;
-  UINT32  ExpStatSN;
-  UINT32  Reserved4[4];
-} ISCSI_LOGOUT_REQUEST;
-
-#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS  0
-#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND           1
-#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED  2
-#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED          3
-
-///
-/// Logout Response
-///
-typedef struct _ISCSI_LOGOUT_RESPONSE {
-  UINT8   OpCode;
-  UINT8   Reserved1;
-  UINT8   Response;
-  UINT8   Reserved2;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT32  Reserved3[2];
-  UINT32  InitiatorTaskTag;
-  UINT32  Reserved4;
-  UINT32  StatSN;
-  UINT32  ExpCmdSN;
-  UINT32  MaxCmdSN;
-  UINT32  Reserved5;
-  UINT16  Time2Wait;
-  UINT16  Time2Retain;
-  UINT32  Reserved6;
-} ISCSI_LOGOUT_RESPONSE;
-
-#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T  0
-#define ISCSI_SNACK_REQUEST_TYPE_STATUS       1
-#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK     2
-#define ISCSI_SNACK_REQUEST_TYPE_RDATA        3
-
-///
-/// SNACK Request
-///
-typedef struct _ISCSI_SNACK_REQUEST {
-  UINT8   OpCode;
-  UINT8   Type;
-  UINT16  Reserved1;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Lun[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  TargetTransferTag;
-  UINT32  Reserved2;
-  UINT32  ExpStatSN;
-  UINT32  Reserved[2];
-  UINT32  BegRun;
-  UINT32  RunLength;
-} ISCSI_SNACK_REQUEST;
-
-///
-/// Reject
-///
-typedef struct _ISCSI_REJECT {
-  UINT8   OpCode;
-  UINT8   Reserved1;
-  UINT8   Reason;
-  UINT8   Reserved2;
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT32  Reserved3[2];
-  UINT32  InitiatorTaskTag;
-  UINT32  Reserved4;
-  UINT32  StatSN;
-  UINT32  ExpCmdSN;
-  UINT32  MaxCmdSN;
-  UINT32  DataSN;
-  UINT32  Reserved5[2];
-} ISCSI_REJECT;
-
-///
-/// NOP-Out
-///
-typedef struct _ISCSI_NOP_OUT {
-  UINT8   OpCode;
-  UINT8   Reserved1[3];
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Lun[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  TargetTransferTag;
-  UINT32  CmdSN;
-  UINT32  ExpStatSN;
-  UINT32  Reserved2[4];
-} ISCSI_NOP_OUT;
-
-///
-/// NOP-In
-///
-typedef struct _ISCSI_NOP_IN {
-  UINT8   OpCode;
-  UINT8   Reserved1[3];
-  UINT8   TotalAHSLength;
-  UINT8   DataSegmentLength[3];
-  UINT8   Lun[8];
-  UINT32  InitiatorTaskTag;
-  UINT32  TargetTransferTag;
-  UINT32  StatSN;
-  UINT32  ExpCmdSN;
-  UINT32  MaxCmdSN;
-  UINT32  Reserved2[3];
-} ISCSI_NOP_IN;
-
-#define ISCSI_SECURITY_NEGOTIATION          0
-#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1
-#define ISCSI_FULL_FEATURE_PHASE            3
-
-typedef enum {
-  IScsiDigestNone,
-  IScsiDigestCRC32
-} ISCSI_DIGEST_TYPE;
-
-typedef struct _ISCSI_XFER_CONTEXT {
-  UINT32  TargetTransferTag;
-  UINT32  Offset;
-  UINT32  DesiredLength;
-  UINT32  ExpDataSN;
-} ISCSI_XFER_CONTEXT;
-
-typedef struct _ISCSI_IN_BUFFER_CONTEXT {
-  UINT8   *InData;
-  UINT32  InDataLen;
-} ISCSI_IN_BUFFER_CONTEXT;
-
-typedef struct _ISCSI_TCB {
-  LIST_ENTRY          Link;
-
-  BOOLEAN             SoFarInOrder;
-  UINT32              ExpDataSN;
-  BOOLEAN             FbitReceived;
-  BOOLEAN             StatusXferd;
-  UINT32              ActiveR2Ts;
-  UINT32              Response;
-  CHAR8               *Reason;
-  UINT32              InitiatorTaskTag;
-  UINT32              CmdSN;
-  UINT32              SNACKTag;
-
-  ISCSI_XFER_CONTEXT  XferContext;
-
-  ISCSI_CONNECTION    *Conn;
-} ISCSI_TCB;
-
-typedef struct _ISCSI_KEY_VALUE_PAIR {
-  LIST_ENTRY      List;
-
-  CHAR8           *Key;
-  CHAR8           *Value;
-} ISCSI_KEY_VALUE_PAIR;
-
-/**
-  Attach the iSCSI connection to the iSCSI session.
-
-  @param[in, out]  Session The iSCSI session.
-  @param[in, out]  Conn    The iSCSI connection.
-**/
-VOID
-IScsiAttatchConnection (
-  IN OUT ISCSI_SESSION     *Session,
-  IN OUT ISCSI_CONNECTION  *Conn
-  );
-
-/**
-  Detach the iSCSI connection from the session it belongs to.
-
-  @param[in, out]  Conn The iSCSI connection.
-**/
-VOID
-IScsiDetatchConnection (
-  IN OUT ISCSI_CONNECTION  *Conn
-  );
-
-/**
-  This function does the iSCSI connection login.
-
-  @param[in, out]  Conn      The iSCSI connection to login.
-
-  @retval EFI_SUCCESS        The iSCSI connection is logged into the iSCSI target.
-  @retval EFI_TIMEOUT        Timeout happened during the login procedure.
-  @retval Others             Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConnLogin (
-  IN OUT ISCSI_CONNECTION  *Conn
-  );
-
-/**
-  Create a TCP connection for the iSCSI session.
-
-  @param[in]  Private The iSCSI driver data.
-  @param[in]  Session Maximum CmdSN from the target.
-
-  @return The newly created iSCSI connection.
-**/
-ISCSI_CONNECTION *
-IScsiCreateConnection (
-  IN ISCSI_DRIVER_DATA  *Private,
-  IN ISCSI_SESSION      *Session
-  );
-
-/**
-  Destroy an iSCSI connection.
-
-  @param[in]  Conn The connection to destroy.
-**/
-VOID
-IScsiDestroyConnection (
-  IN ISCSI_CONNECTION  *Conn
-  );
-
-/**
-  Login the iSCSI session.
-
-  @param[in]  Private          The iSCSI driver data.
-
-  @retval EFI_SUCCESS          The iSCSI session login procedure finished.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_NO_MEDIA         There was a media error.
-  @retval Others               Other errors as indicated.
-
-**/
-EFI_STATUS
-IScsiSessionLogin (
-  IN ISCSI_DRIVER_DATA  *Private
-  );
-
-/**
-  Build and send the iSCSI login request to the iSCSI target according to
-  the current login stage.
-
-  @param[in]  Conn             The connection in the iSCSI login phase.
-
-  @retval EFI_SUCCESS          The iSCSI login request PDU is built and sent on this
-                               connection.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_DEVICE_ERROR     Some kind of device error happened.
-**/
-EFI_STATUS
-IScsiSendLoginReq (
-  IN ISCSI_CONNECTION  *Conn
-  );
-
-/**
-  Receive and process the iSCSI login response.
-
-  @param[in]  Conn             The connection in the iSCSI login phase.
-
-  @retval EFI_SUCCESS          The iSCSI login response PDU is received and processed.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiReceiveLoginRsp (
-  IN ISCSI_CONNECTION  *Conn
-  );
-
-/**
-  Add an iSCSI key-value pair as a string into the data segment of the Login Request PDU.
-  The DataSegmentLength and the actual size of the net buffer containing this PDU will be
-  updated.
-
-  @param[in, out]  Pdu         The iSCSI PDU whose data segment the key-value pair will
-                               be added to.
-  @param[in]       Key         The key name string.
-  @param[in]       Value       The value string.
-
-  @retval EFI_SUCCESS          The key-valu pair is added to the PDU's datasegment and
-                               the correspondence length fields are updated.
-  @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to add the key-value
-                               pair.
-**/
-EFI_STATUS
-IScsiAddKeyValuePair (
-  IN OUT NET_BUF      *Pdu,
-  IN CHAR8            *Key,
-  IN CHAR8            *Value
-  );
-
-/**
-  Prepare the iSCSI login request to be sent according to the current login status.
-
-  @param[in, out]  Conn The connection in the iSCSI login phase.
-
-  @return The pointer to the net buffer containing the iSCSI login request built.
-  @retval Others    Other errors as indicated.
-**/
-NET_BUF *
-IScsiPrepareLoginReq (
-  IN OUT ISCSI_CONNECTION  *Conn
-  );
-
-/**
-  Process the iSCSI Login Response.
-
-  @param[in, out]  Conn The connection on which the iSCSI login response is received.
-  @param[in, out]  Pdu  The iSCSI login response PDU.
-
-  @retval EFI_SUCCESS        The iSCSI login response PDU is processed and all check are passed.
-  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
-  @retval EFI_MEDIA_CHANGED  Target is redirected.
-  @retval Others             Other errors as indicated.
-**/
-EFI_STATUS
-IScsiProcessLoginRsp (
-  IN OUT ISCSI_CONNECTION  *Conn,
-  IN OUT NET_BUF           *Pdu
-  );
-
-/**
-  Updated the target information according the data received in the iSCSI
-  login response with an target redirection status.
-
-  @param[in, out] Session      The iSCSI session.
-  @param[in]      Data         The data segment which should contain the
-                               TargetAddress key-value list.
-  @param[in]      Len          Length of the data.
-
-  @retval EFI_SUCCESS          The target address is updated.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_NOT_FOUND        The TargetAddress key is not found.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiUpdateTargetAddress (
-  IN OUT ISCSI_SESSION  *Session,
-  IN CHAR8              *Data,
-  IN UINT32             Len
-  );
-
-/**
-  The callback function to free the net buffer list.
-
-  @param[in]  Arg The opaque parameter.
-**/
-VOID
-EFIAPI
-IScsiFreeNbufList (
-  VOID *Arg
-  );
-
-/**
-  Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU header and
-  an optional data segment. The two parts will be put into two blocks of buffers in the
-  net buffer. The digest check will be conducted in this function if needed and the digests
-  will be trimmed from the PDU buffer.
-
-  @param[in]   Conn        The iSCSI connection to receive data from.
-  @param[out]  Pdu         The received iSCSI pdu.
-  @param[in]   Context     The context used to describe information on the caller provided
-                           buffer to receive data segment of the iSCSI pdu, it's optional.
-  @param[in]  HeaderDigest Whether there will be header digest received.
-  @param[in]  DataDigest   Whether there will be data digest.
-  @param[in]  TimeoutEvent The timeout event, it's optional.
-
-  @retval EFI_SUCCESS          An iSCSI pdu is received.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error happened.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiReceivePdu (
-  IN ISCSI_CONNECTION                      *Conn,
-  OUT NET_BUF                              **Pdu,
-  IN ISCSI_IN_BUFFER_CONTEXT               *Context, OPTIONAL
-  IN BOOLEAN                               HeaderDigest,
-  IN BOOLEAN                               DataDigest,
-  IN EFI_EVENT                             TimeoutEvent OPTIONAL
-  );
-
-/**
-  Check and get the result of the prameter negotiation.
-
-  @param[in, out]  Conn          The connection in iSCSI login.
-
-  @retval EFI_SUCCESS          The parmeter check is passed and negotiation is finished.
-  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error happened.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-**/
-EFI_STATUS
-IScsiCheckOpParams (
-  IN OUT ISCSI_CONNECTION  *Conn
-  );
-
-/**
-  Fill the oprational prameters.
-
-  @param[in]       Conn        The connection in iSCSI login.
-  @param[in, out]  Pdu         The iSCSI login request PDU to fill the parameters.
-
-  @retval EFI_SUCCESS          The parmeters are filled into the iSCSI login request PDU.
-**/
-EFI_STATUS
-IScsiFillOpParams (
-  IN ISCSI_CONNECTION  *Conn,
-  IN OUT NET_BUF       *Pdu
-  );
-
-/**
-  Pad the iSCSI AHS or data segment to an integer number of 4 byte words.
-
-  @param[in, out]  Pdu         The iSCSI pdu which contains segments to pad.
-  @param[in]       Len         The length of the last semgnet in the PDU.
-
-  @retval EFI_SUCCESS          The segment is padded or no need to pad it.
-  @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space to add the
-                               padding bytes.
-**/
-EFI_STATUS
-IScsiPadSegment (
-  IN OUT NET_BUF  *Pdu,
-  IN UINT32       Len
-  );
-
-/**
-  Build a key-value list from the data segment.
-
-  @param[in]  Data The data segment containing the key-value pairs.
-  @param[in]  Len  Length of the data segment.
-
-  @return The key-value list.
-  @retval NULL Other errors as indicated.
-**/
-LIST_ENTRY *
-IScsiBuildKeyValueList (
-  IN CHAR8  *Data,
-  IN UINT32 Len
-  );
-
-/**
-  Get the value string by the key name from the key-value list. If found,
-  the key-value entry will be removed from the list.
-
-  @param[in, out]  KeyValueList  The key-value list.
-  @param[in]       Key           The key name to find.
-
-  @return The value string.
-**/
-CHAR8 *
-IScsiGetValueByKeyFromList (
-  IN OUT LIST_ENTRY  *KeyValueList,
-  IN CHAR8           *Key
-  );
-
-/**
-  Free the key-value list.
-
-  @param[in]  KeyValueList The key-value list.
-**/
-VOID
-IScsiFreeKeyValueList (
-  IN LIST_ENTRY      *KeyValueList
-  );
-
-/**
-  Normalize the iSCSI name according to RFC.
-
-  @param[in, out]  Name       The iSCSI name.
-  @param[in]       Len        length of the iSCSI name.
-
-  @retval EFI_SUCCESS        The iSCSI name is valid and normalized.
-  @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the IQN format.
-**/
-EFI_STATUS
-IScsiNormalizeName (
-  IN OUT CHAR8  *Name,
-  IN UINTN      Len
-  );
-
-/**
-  Execute the SCSI command issued through the EXT SCSI PASS THRU protocol.
-
-  @param[in]       PassThru  The EXT SCSI PASS THRU protocol.
-  @param[in]       Target    The target ID.
-  @param[in]       Lun       The LUN.
-  @param[in, out]  Packet    The request packet containing IO request, SCSI command
-                             buffer and buffers to read/write.
-
-  @retval EFI_SUCCES           The SCSI command is executed and the result is updated to
-                               the Packet.
-  @retval EFI_DEVICE_ERROR     Session state was not as required.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval EFI_NOT_READY        The target can not accept new commands.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-IScsiExecuteScsiCommand (
-  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                 *PassThru,
-  IN UINT8                                           *Target,
-  IN UINT64                                          Lun,
-  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
-  );
-
-/**
-  Reinstate the session on some error.
-
-  @param[in, out]  Private The iSCSI driver data.
-
-  @retval EFI_SUCCES  The session is reinstated from some error.
-  @retval Other       Reinstatement failed.
-**/
-EFI_STATUS
-IScsiSessionReinstatement (
-  IN OUT ISCSI_DRIVER_DATA  *Private
-  );
-
-/**
-  Initialize some session parameters before login.
-
-  @param[in, out]  Session  The iSCSI session.
-  @param[in]       Recovery Whether the request is from a fresh new start or recovery.
-**/
-VOID
-IScsiSessionInit (
-  IN OUT ISCSI_SESSION  *Session,
-  IN BOOLEAN            Recovery
-  );
-
-/**
-  Abort the iSCSI session, that is, reset all the connection and free the
-  resources.
-
-  @param[in, out]  Session The iSCSI session.
-
-  @retval EFI_SUCCES  The session is aborted.
-**/
-EFI_STATUS
-IScsiSessionAbort (
-  IN OUT ISCSI_SESSION  *Session
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
deleted file mode 100644
index 9e0f1e0f02c2..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/** @file
-  iSCSI Tcp4 IO related definitions.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _ISCSI_TCP4_IO_H_
-#define _ISCSI_TCP4_IO_H_
-
-#include <Library/NetLib.h>
-#include <Protocol/Tcp4.h>
-
-typedef struct _TCP4_IO_CONFIG_DATA {
-  EFI_IPv4_ADDRESS  LocalIp;
-  EFI_IPv4_ADDRESS  SubnetMask;
-  EFI_IPv4_ADDRESS  Gateway;
-
-  EFI_IPv4_ADDRESS  RemoteIp;
-  UINT16            RemotePort;
-} TCP4_IO_CONFIG_DATA;
-
-typedef struct _TCP4_IO {
-  EFI_HANDLE                Image;
-  EFI_HANDLE                Controller;
-
-  EFI_HANDLE                Handle;
-  EFI_TCP4_PROTOCOL         *Tcp4;
-
-  EFI_TCP4_CONNECTION_TOKEN ConnToken;
-  EFI_TCP4_IO_TOKEN         TxToken;
-  EFI_TCP4_IO_TOKEN         RxToken;
-  EFI_TCP4_CLOSE_TOKEN      CloseToken;
-
-  BOOLEAN                   IsConnDone;
-  BOOLEAN                   IsTxDone;
-  BOOLEAN                   IsRxDone;
-  BOOLEAN                   IsCloseDone;
-} TCP4_IO;
-
-/**
-  Create a TCP socket with the specified configuration data.
-
-  @param[in]  Image      The handle of the driver image.
-  @param[in]  Controller The handle of the controller.
-  @param[in]  ConfigData The Tcp4 configuration data.
-  @param[in]  Tcp4Io     The Tcp4Io.
-
-  @retval EFI_SUCCESS    The TCP socket is created and configured.
-  @retval Others         Failed to create the TCP socket or configure it.
-**/
-EFI_STATUS
-Tcp4IoCreateSocket (
-  IN EFI_HANDLE           Image,
-  IN EFI_HANDLE           Controller,
-  IN TCP4_IO_CONFIG_DATA  *ConfigData,
-  IN TCP4_IO              *Tcp4Io
-  );
-
-/**
-  Destroy the socket.
-
-  @param[in]  Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
-**/
-VOID
-Tcp4IoDestroySocket (
-  IN TCP4_IO  *Tcp4Io
-  );
-
-/**
-  Connect to the other endpoint of the TCP socket.
-
-  @param[in, out]  Tcp4Io    The Tcp4Io wrapping the TCP socket.
-  @param[in]       Timeout   The time to wait for connection done.
-
-  @retval EFI_SUCCESS          Connect to the other endpoint of the TCP socket successfully.
-  @retval EFI_TIMEOUT          Failed to connect to the other endpoint of the TCP socket in the                               specified time period.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoConnect (
-  IN OUT TCP4_IO    *Tcp4Io,
-  IN EFI_EVENT      Timeout
-  );
-
-/**
-  Reset the socket.
-
-  @param[in, out]  Tcp4Io The Tcp4Io wrapping the TCP socket.
-**/
-VOID
-Tcp4IoReset (
-  IN OUT TCP4_IO  *Tcp4Io
-  );
-
-/**
-  Transmit the Packet to the other endpoint of the socket.
-
-  @param[in]   Tcp4Io          The Tcp4Io wrapping the TCP socket.
-  @param[in]   Packet          The packet to transmit.
-
-  @retval EFI_SUCCESS          The packet is trasmitted.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoTransmit (
-  IN TCP4_IO  *Tcp4Io,
-  IN NET_BUF  *Packet
-  );
-
-/**
-  Receive data from the socket.
-
-  @param[in]  Tcp4Io           The Tcp4Io which wraps the socket to be destroyed.
-  @param[in]  Packet           The buffer to hold the data copy from the soket rx buffer.
-  @param[in]  AsyncMode        Is this receive asyncronous or not.
-  @param[in]  Timeout          The time to wait for receiving the amount of data the Packet
-                               can hold.
-
-  @retval EFI_SUCCESS          The required amount of data is received from the socket.
-  @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
-  @retval EFI_TIMEOUT          Failed to receive the required amount of data in the
-                               specified time period.
-  @retval Others               Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoReceive (
-  IN TCP4_IO    *Tcp4Io,
-  IN NET_BUF    *Packet,
-  IN BOOLEAN    AsyncMode,
-  IN EFI_EVENT  Timeout
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
deleted file mode 100644
index 1541b2d8ece1..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/** @file
-  Header file for Md5.
-
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
-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.
-
-**/
-
-#ifndef _MD5_H_
-#define _MD5_H_
-
-#include <Uefi.h>
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/NetLib.h>
-
-#define MD5_HASHSIZE  16
-
-typedef struct _MD5_CTX {
-  EFI_STATUS  Status;
-  UINT64      Length;
-  UINT32      States[MD5_HASHSIZE / sizeof (UINT32)];
-  UINT8       M[64];
-  UINTN       Count;
-} MD5_CTX;
-
-/**
-  Initialize four 32-bits chaining variables and use them to do the Md5 transform.
-
-  @param[out]  Md5Ctx The data structure of Md5.
-
-  @retval EFI_SUCCESS Initialization is ok.
-**/
-EFI_STATUS
-MD5Init (
-  OUT MD5_CTX  *Md5Ctx
-  );
-
-/**
-  the external interface of Md5 algorithm
-
-  @param[in, out]  Md5Ctx  The data structure of storing the original data
-                           segment and the final result.
-  @param[in]       Data    The data wanted to be transformed.
-  @param[in]       DataLen The length of data.
-
-  @retval EFI_SUCCESS The transform is ok.
-  @retval Others      Other errors as indicated.
-**/
-EFI_STATUS
-MD5Update (
-  IN  OUT MD5_CTX  *Md5Ctx,
-  IN  VOID         *Data,
-  IN  UINTN        DataLen
-  );
-
-/**
-  Accumulate the MD5 value of every data segment and generate the finial
-  result according to MD5 algorithm.
-
-  @param[in, out]   Md5Ctx  The data structure of storing the original data
-                            segment and the final result.
-  @param[out]      HashVal  The final 128-bits output.
-
-  @retval EFI_SUCCESS  The transform is ok.
-  @retval Others       Other errors as indicated.
-**/
-EFI_STATUS
-MD5Final (
-  IN  OUT MD5_CTX  *Md5Ctx,
-  OUT UINT8        *HashVal
-  );
-
-#endif
-- 
2.19.1.windows.1



More information about the edk2-devel mailing list