Revision: 15092
          http://sourceforge.net/p/edk2/code/15092
Author:   sfu5
Date:     2014-01-10 08:24:29 +0000 (Fri, 10 Jan 2014)
Log Message:
-----------
Fix bug in unload function: Check if component name protocol exist, only 
uninstall it when it really exists.
Signed-off-by: Fu Siyuan <[email protected]>
Reviewed-by: Tian, Feng <[email protected]>
Reviewed-by: Jin, Eric <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
    trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
    trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
    trunk/edk2/NetworkPkg/IScsiDxe/IScsiDriver.c
    trunk/edk2/NetworkPkg/IScsiDxe/IScsiMisc.c
    trunk/edk2/NetworkPkg/IScsiDxe/IScsiMisc.h

Modified: trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c    
2014-01-10 07:29:32 UTC (rev 15091)
+++ trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c    
2014-01-10 08:24:29 UTC (rev 15092)
@@ -1,7 +1,7 @@
 /** @file
   The entry point of IScsi driver.
 
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2014, 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
@@ -439,10 +439,12 @@
   IN EFI_HANDLE  ImageHandle
   )
 {
-  EFI_STATUS  Status;
-  UINTN       DeviceHandleCount;
-  EFI_HANDLE  *DeviceHandleBuffer;
-  UINTN       Index;
+  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.
@@ -454,40 +456,89 @@
                   &DeviceHandleCount,
                   &DeviceHandleBuffer
                   );
-  if (!EFI_ERROR (Status)) {
-    for (Index = 0; Index < DeviceHandleCount; Index++) {
-      Status = gBS->DisconnectController (
-                      DeviceHandleBuffer[Index],
-                      ImageHandle,
-                      NULL
-                      );
+  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;
+    }
+  }  
 
-    if (DeviceHandleBuffer != NULL) {
-      FreePool (DeviceHandleBuffer);
-    }
-  }
   //
   // Unload the iSCSI configuration form.
   //
-  IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle);
+  Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle);
+  if (EFI_ERROR (Status)) {
+    goto ON_EXIT;
+  }
 
   //
-  // Uninstall the protocols installed by iSCSI driver.
+  // 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,
-                  &gEfiComponentName2ProtocolGuid,
-                  &gIScsiComponentName2,
-                  &gEfiComponentNameProtocolGuid,
-                  &gIScsiComponentName,
                   &gEfiIScsiInitiatorNameProtocolGuid,
                   &gIScsiInitiatorName,
                   NULL
                   );
+ON_EXIT:
 
+  if (DeviceHandleBuffer != NULL) {
+    FreePool (DeviceHandleBuffer);
+  }
+  
   return Status;
 }
 

Modified: trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c      
2014-01-10 07:29:32 UTC (rev 15091)
+++ trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c      
2014-01-10 08:24:29 UTC (rev 15092)
@@ -1,7 +1,7 @@
 /** @file
   Miscellaneous routines for iSCSI driver.
 
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2014, 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
@@ -852,3 +852,70 @@
 
   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;
+}

Modified: trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h      
2014-01-10 07:29:32 UTC (rev 15091)
+++ trunk/edk2/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h      
2014-01-10 08:24:29 UTC (rev 15092)
@@ -1,7 +1,7 @@
 /** @file
   Miscellaneous definitions for iSCSI driver.
 
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2014, 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
@@ -275,6 +275,35 @@
   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

Modified: trunk/edk2/NetworkPkg/IScsiDxe/IScsiDriver.c
===================================================================
--- trunk/edk2/NetworkPkg/IScsiDxe/IScsiDriver.c        2014-01-10 07:29:32 UTC 
(rev 15091)
+++ trunk/edk2/NetworkPkg/IScsiDxe/IScsiDriver.c        2014-01-10 08:24:29 UTC 
(rev 15092)
@@ -1,7 +1,7 @@
 /** @file
   The entry point of IScsi driver.
 
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2014, 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
@@ -1245,10 +1245,12 @@
   IN EFI_HANDLE  ImageHandle
   )
 {
-  EFI_STATUS  Status;
-  UINTN       DeviceHandleCount;
-  EFI_HANDLE  *DeviceHandleBuffer;
-  UINTN       Index;
+  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.
@@ -1264,64 +1266,184 @@
     return Status;
   }
 
+  //
+  // Disconnect the iSCSI4 driver from the controlled device.
+  //
   for (Index = 0; Index < DeviceHandleCount; Index++) {
-    gBS->DisconnectController (
-           DeviceHandleBuffer[Index],
+    Status = IScsiTestManagedDevice (
+               DeviceHandleBuffer[Index],
+               gIScsiIp4DriverBinding.DriverBindingHandle,
+               &gEfiTcp4ProtocolGuid)
+               ;
+    if (EFI_ERROR (Status)) {
+      continue;
+    }
+    Status = gBS->DisconnectController (
+                    DeviceHandleBuffer[Index],
+                    gIScsiIp4DriverBinding.DriverBindingHandle,
+                    NULL
+                    );
+    if (EFI_ERROR (Status)) {
+      goto ON_EXIT;
+    }
+  }
+
+  //
+  // Disconnect the iSCSI6 driver from the controlled device.
+  //
+  for (Index = 0; Index < DeviceHandleCount; Index++) {
+    Status = IScsiTestManagedDevice (
+               DeviceHandleBuffer[Index],
+               gIScsiIp6DriverBinding.DriverBindingHandle,
+               &gEfiTcp6ProtocolGuid
+               );
+    if (EFI_ERROR (Status)) {
+      continue;
+    }
+    Status = gBS->DisconnectController (
+                    DeviceHandleBuffer[Index],
+                    gIScsiIp6DriverBinding.DriverBindingHandle,
+                    NULL
+                    );
+    if (EFI_ERROR (Status)) {
+      goto ON_EXIT;
+    }
+  }
+
+  //
+  // Unload the iSCSI configuration form.
+  //
+  Status = IScsiConfigFormUnload (gIScsiIp4DriverBinding.DriverBindingHandle);
+  if (EFI_ERROR (Status)) {
+    goto ON_EXIT;
+  }
+  
+  //
+  // Uninstall the protocols installed by iSCSI driver.
+  //
+  Status = gBS->UninstallMultipleProtocolInterfaces (
+                  ImageHandle,
+                  &gEfiAuthenticationInfoProtocolGuid,
+                  &gIScsiAuthenticationInfo,
+                  NULL
+                  );
+  if (EFI_ERROR (Status)) {
+    goto ON_EXIT;
+  }
+  
+  if (gIScsiControllerNameTable!= NULL) {
+    Status = FreeUnicodeStringTable (gIScsiControllerNameTable);
+    if (EFI_ERROR (Status)) {
+      goto ON_EXIT;
+    }
+    gIScsiControllerNameTable = NULL;
+  }
+
+  //
+  // Uninstall the ComponentName and ComponentName2 protocol from iSCSI4 
driver binding handle
+  // if it has been installed.
+  //
+  Status = gBS->HandleProtocol (
+                  gIScsiIp4DriverBinding.DriverBindingHandle,
+                  &gEfiComponentNameProtocolGuid,
+                  (VOID **) &ComponentName
+                  );
+  if (!EFI_ERROR (Status)) {
+    Status = gBS->UninstallMultipleProtocolInterfaces (
            gIScsiIp4DriverBinding.DriverBindingHandle,
+           &gEfiComponentNameProtocolGuid,
+           ComponentName,
            NULL
            );
-    gBS->DisconnectController (
-           DeviceHandleBuffer[Index],
-           gIScsiIp6DriverBinding.DriverBindingHandle,
+    if (EFI_ERROR (Status)) {
+      goto ON_EXIT;
+    }
+  }
+  
+  Status = gBS->HandleProtocol (
+                  gIScsiIp4DriverBinding.DriverBindingHandle,
+                  &gEfiComponentName2ProtocolGuid,
+                  (VOID **) &ComponentName2
+                  );
+  if (!EFI_ERROR (Status)) {
+    gBS->UninstallMultipleProtocolInterfaces (
+           gIScsiIp4DriverBinding.DriverBindingHandle,
+           &gEfiComponentName2ProtocolGuid,
+           ComponentName2,
            NULL
            );
+    if (EFI_ERROR (Status)) {
+      goto ON_EXIT;
+    }
   }
 
   //
-  // Unload the iSCSI configuration form.
+  // Uninstall the ComponentName and ComponentName2 protocol from iSCSI6 
driver binding handle
+  // if it has been installed.
   //
-  IScsiConfigFormUnload (gIScsiIp4DriverBinding.DriverBindingHandle);
+  Status = gBS->HandleProtocol (
+                  gIScsiIp6DriverBinding.DriverBindingHandle,
+                  &gEfiComponentNameProtocolGuid,
+                  (VOID **) &ComponentName
+                  );
+  if (!EFI_ERROR (Status)) {
+    Status = gBS->UninstallMultipleProtocolInterfaces (
+           gIScsiIp6DriverBinding.DriverBindingHandle,
+           &gEfiComponentNameProtocolGuid,
+           ComponentName,
+           NULL
+           );
+    if (EFI_ERROR (Status)) {
+      goto ON_EXIT;
+    }
+  }
+  
+  Status = gBS->HandleProtocol (
+                  gIScsiIp6DriverBinding.DriverBindingHandle,
+                  &gEfiComponentName2ProtocolGuid,
+                  (VOID **) &ComponentName2
+                  );
+  if (!EFI_ERROR (Status)) {
+    gBS->UninstallMultipleProtocolInterfaces (
+           gIScsiIp6DriverBinding.DriverBindingHandle,
+           &gEfiComponentName2ProtocolGuid,
+           ComponentName2,
+           NULL
+           );
+    if (EFI_ERROR (Status)) {
+      goto ON_EXIT;
+    }
+  }
 
   //
-  // Uninstall the protocols installed by iSCSI driver.
+  // Uninstall the IScsiInitiatorNameProtocol and all the driver binding 
protocols.
   //
-  gBS->UninstallMultipleProtocolInterfaces (
-         ImageHandle,
-         &gEfiAuthenticationInfoProtocolGuid,
-         &gIScsiAuthenticationInfo,
-         NULL
-         );
+  Status = gBS->UninstallMultipleProtocolInterfaces (
+                  gIScsiIp4DriverBinding.DriverBindingHandle,
+                  &gEfiDriverBindingProtocolGuid,
+                  &gIScsiIp4DriverBinding,
+                  &gEfiIScsiInitiatorNameProtocolGuid,
+                  &gIScsiInitiatorName,
+                  NULL
+                  );
+  if (EFI_ERROR (Status)) {
+    goto ON_EXIT;
+  }
 
-  if (gIScsiControllerNameTable!= NULL) {
-    FreeUnicodeStringTable (gIScsiControllerNameTable);
-    gIScsiControllerNameTable = NULL;
+  Status = gBS->UninstallMultipleProtocolInterfaces (
+                  gIScsiIp6DriverBinding.DriverBindingHandle,
+                  &gEfiDriverBindingProtocolGuid,
+                  &gIScsiIp6DriverBinding,
+                  NULL
+                  );
+
+ON_EXIT:
+
+  if (DeviceHandleBuffer != NULL) {
+    FreePool (DeviceHandleBuffer);
   }
   
-  gBS->UninstallMultipleProtocolInterfaces (
-         gIScsiIp4DriverBinding.DriverBindingHandle,
-         &gEfiDriverBindingProtocolGuid,
-         &gIScsiIp4DriverBinding,
-         &gEfiComponentName2ProtocolGuid,
-         &gIScsiComponentName2,
-         &gEfiComponentNameProtocolGuid,
-         &gIScsiComponentName,
-         &gEfiIScsiInitiatorNameProtocolGuid,
-         &gIScsiInitiatorName,
-         NULL
-         );
-
-  gBS->UninstallMultipleProtocolInterfaces (
-         gIScsiIp6DriverBinding.DriverBindingHandle,
-         &gEfiDriverBindingProtocolGuid,
-         &gIScsiIp6DriverBinding,
-         &gEfiComponentName2ProtocolGuid,
-         &gIScsiComponentName2,
-         &gEfiComponentNameProtocolGuid,
-         &gIScsiComponentName,
-         NULL
-         );
-
-  return EFI_SUCCESS;
+  return Status;
 }
 
 /**

Modified: trunk/edk2/NetworkPkg/IScsiDxe/IScsiMisc.c
===================================================================
--- trunk/edk2/NetworkPkg/IScsiDxe/IScsiMisc.c  2014-01-10 07:29:32 UTC (rev 
15091)
+++ trunk/edk2/NetworkPkg/IScsiDxe/IScsiMisc.c  2014-01-10 08:24:29 UTC (rev 
15092)
@@ -1,7 +1,7 @@
 /** @file
   Miscellaneous routines for iSCSI driver.
 
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2014, 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
@@ -1436,3 +1436,70 @@
     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;
+}

Modified: trunk/edk2/NetworkPkg/IScsiDxe/IScsiMisc.h
===================================================================
--- trunk/edk2/NetworkPkg/IScsiDxe/IScsiMisc.h  2014-01-10 07:29:32 UTC (rev 
15091)
+++ trunk/edk2/NetworkPkg/IScsiDxe/IScsiMisc.h  2014-01-10 08:24:29 UTC (rev 
15092)
@@ -1,7 +1,7 @@
 /** @file
   Miscellaneous definitions for iSCSI driver.
 
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2014, 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
@@ -357,4 +357,34 @@
   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

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today. 
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to