]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/IScsiDxe/IScsiDriver.c
MdePkg/ResetNotification: Rename to UnregisterResetNotify
[mirror_edk2.git] / NetworkPkg / IScsiDxe / IScsiDriver.c
index c3ab2c92881d6041aceac0329732f3cfee2a6c0c..2249919e18e9799a6f5a77cbb1b0845360902ccc 100644 (file)
@@ -1,7 +1,9 @@
 /** @file\r
   The entry point of IScsi driver.\r
 \r
-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2017 Hewlett Packard Enterprise Development LP<BR>\r
+\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -252,15 +254,19 @@ IScsiSupported (
   EFI_GUID                  *IScsiServiceBindingGuid;\r
   EFI_GUID                  *TcpServiceBindingGuid;\r
   EFI_GUID                  *DhcpServiceBindingGuid;\r
+  EFI_GUID                  *DnsServiceBindingGuid;\r
 \r
   if (IpVersion == IP_VERSION_4) {\r
     IScsiServiceBindingGuid  = &gIScsiV4PrivateGuid;\r
     TcpServiceBindingGuid    = &gEfiTcp4ServiceBindingProtocolGuid;\r
     DhcpServiceBindingGuid   = &gEfiDhcp4ServiceBindingProtocolGuid;\r
+    DnsServiceBindingGuid    = &gEfiDns4ServiceBindingProtocolGuid;\r
+\r
   } else {\r
     IScsiServiceBindingGuid  = &gIScsiV6PrivateGuid;\r
     TcpServiceBindingGuid    = &gEfiTcp6ServiceBindingProtocolGuid;\r
     DhcpServiceBindingGuid   = &gEfiDhcp6ServiceBindingProtocolGuid;\r
+    DnsServiceBindingGuid    = &gEfiDns6ServiceBindingProtocolGuid;\r
   }\r
 \r
   Status = gBS->OpenProtocol (\r
@@ -305,7 +311,21 @@ IScsiSupported (
       return EFI_UNSUPPORTED;\r
     }\r
   }\r
-  \r
+\r
+  if (IScsiDnsIsConfigured (ControllerHandle)) {\r
+    Status = gBS->OpenProtocol (\r
+                    ControllerHandle,\r
+                    DnsServiceBindingGuid,\r
+                    NULL,\r
+                    This->DriverBindingHandle,\r
+                    ControllerHandle,\r
+                    EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -353,11 +373,11 @@ IScsiStart (
   EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
   EFI_GUID                        *IScsiPrivateGuid;\r
   EFI_GUID                        *TcpServiceBindingGuid;\r
-  CHAR16                          MacString[ISCSI_MAX_MAC_STRING_LEN];\r
   BOOLEAN                         NeedUpdate;\r
   VOID                            *Interface;\r
   EFI_GUID                        *ProtocolGuid;\r
   UINT8                           NetworkBootPolicy;\r
+  ISCSI_SESSION_CONFIG_NVDATA     *NvData;\r
 \r
   //\r
   // Test to see if iSCSI driver supports the given controller.\r
@@ -400,7 +420,11 @@ IScsiStart (
   }\r
 \r
   NetworkBootPolicy = PcdGet8 (PcdIScsiAIPNetworkBootPolicy);\r
-  if (NetworkBootPolicy != ALWAYS_USE_UEFI_ISCSI_AND_IGNORE_AIP) {\r
+  if (NetworkBootPolicy == ALWAYS_USE_ISCSI_HBA_AND_IGNORE_UEFI_ISCSI) {\r
+    return EFI_ABORTED;\r
+  }\r
+\r
+  if (NetworkBootPolicy != ALWAYS_USE_UEFI_ISCSI_AND_IGNORE_ISCSI_HBA) {\r
     //\r
     // Check existing iSCSI AIP.\r
     //\r
@@ -672,12 +696,10 @@ IScsiStart (
     Session->ConfigData = AttemptConfigData;\r
     Session->AuthType   = AttemptConfigData->AuthenticationType;\r
 \r
-    AsciiStrToUnicodeStrS (AttemptConfigData->MacString, MacString, sizeof (MacString) / sizeof (MacString[0]));\r
     UnicodeSPrint (\r
       mPrivate->PortString,\r
       (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
-      L"%s%d",\r
-      MacString,\r
+      L"Attempt %d",\r
       (UINTN) AttemptConfigData->AttemptConfigIndex\r
       );\r
 \r
@@ -701,6 +723,24 @@ IScsiStart (
       Status = IScsiSessionReLogin (Session);\r
     }\r
 \r
+    //\r
+    // Restore the origial user setting which specifies the proxy/virtual iSCSI target to NV region.\r
+    //\r
+    NvData = &AttemptConfigData->SessionConfigData;\r
+    if (NvData->RedirectFlag) {\r
+      NvData->TargetPort = NvData->OriginalTargetPort;\r
+      CopyMem (&NvData->TargetIp, &NvData->OriginalTargetIp, sizeof (EFI_IP_ADDRESS));\r
+      NvData->RedirectFlag = FALSE;\r
+\r
+      gRT->SetVariable (\r
+             mPrivate->PortString,\r
+             &gEfiIScsiInitiatorNameProtocolGuid,\r
+             ISCSI_CONFIG_VAR_ATTR,\r
+             sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),\r
+             AttemptConfigData\r
+             );\r
+    }\r
+\r
     if (EFI_ERROR (Status)) {\r
       //\r
       // In Single path mode, only the successful attempt will be recorded in iBFT;\r
@@ -1760,6 +1800,22 @@ IScsiDriverEntryPoint (
     goto Error4;\r
   }\r
 \r
+  //\r
+  // Create the Maximum Attempts.\r
+  //\r
+  Status = IScsiCreateAttempts (PcdGet8 (PcdMaxIScsiAttemptNumber));\r
+  if (EFI_ERROR (Status)) {\r
+    goto Error5;\r
+  }\r
+\r
+  //\r
+  // Create Keywords for all the Attempts.\r
+  //\r
+  Status = IScsiCreateKeywords (PcdGet8 (PcdMaxIScsiAttemptNumber));\r
+  if (EFI_ERROR (Status)) {\r
+    goto Error6;\r
+  }\r
+\r
   //\r
   // There should be only one EFI_AUTHENTICATION_INFO_PROTOCOL. If already exists,\r
   // do not produce the protocol instance.\r
@@ -1777,17 +1833,23 @@ IScsiDriverEntryPoint (
                     &gIScsiAuthenticationInfo\r
                     );\r
     if (EFI_ERROR (Status)) {\r
-      goto Error5;\r
+      goto Error6;\r
     }    \r
   }\r
 \r
   return EFI_SUCCESS;\r
 \r
+Error6:\r
+  IScsiCleanAttemptVariable ();\r
+\r
 Error5:\r
   IScsiConfigFormUnload (gIScsiIp4DriverBinding.DriverBindingHandle);\r
 \r
 Error4:\r
-  FreePool (mPrivate);\r
+  if (mPrivate != NULL) {\r
+    FreePool (mPrivate);\r
+    mPrivate = NULL;\r
+  }\r
 \r
 Error3:\r
   gBS->UninstallMultipleProtocolInterfaces (\r