diff --git a/drivers/usbhost/usbhost_enumerate.c b/drivers/usbhost/usbhost_enumerate.c
index 1c3a827bf6575e85cb8dac3747c502dbca658940..8e1cd80e71eca8e23700b9fd15b67f9003e72965 100755
--- a/drivers/usbhost/usbhost_enumerate.c
+++ b/drivers/usbhost/usbhost_enumerate.c
@@ -249,6 +249,10 @@ static inline int usbhost_classbind(FAR struct usbhost_driver_s *drvr,
           ret = CLASS_CONNECT(devclass, configdesc, desclen, funcaddr);
           if (ret != OK)
             {
+              /* On failures, call the class disconnect method which
+               * should then free the allocated devclass instance.
+               */
+
               udbg("CLASS_CONNECT failed: %d\n", ret);
               CLASS_DISCONNECTED(devclass);
             }
diff --git a/drivers/usbhost/usbhost_hidkbd.c b/drivers/usbhost/usbhost_hidkbd.c
index ef880ea75f00372334cc8f48fc8e8ded39f45c9a..baf18703d7974cdb0a9968328ca4311e7e79d228 100644
--- a/drivers/usbhost/usbhost_hidkbd.c
+++ b/drivers/usbhost/usbhost_hidkbd.c
@@ -1545,6 +1545,10 @@ static FAR struct usbhost_class_s *usbhost_create(FAR struct usbhost_driver_s *d
  *   On success, zero (OK) is returned. On a failure, a negated errno value is
  *   returned indicating the nature of the failure
  *
+ *   NOTE that the class instance remains valid upon return with a failure.  It is
+ *   the responsibility of the higher level enumeration logic to call
+ *   CLASS_DISCONNECTED to free up the class driver resources.
+ *
  * Assumptions:
  *   - This function will *not* be called from an interrupt handler.
  *   - If this function returns an error, the USB host controller driver
diff --git a/drivers/usbhost/usbhost_skeleton.c b/drivers/usbhost/usbhost_skeleton.c
index c33dda58693a68c977aeae8a29cb961208faa9a3..206b347c54665bbb3cb4fbb713fbb4067182196a 100644
--- a/drivers/usbhost/usbhost_skeleton.c
+++ b/drivers/usbhost/usbhost_skeleton.c
@@ -673,14 +673,6 @@ static inline int usbhost_devinit(FAR struct usbhost_state_s *priv)
         }
     }
 
-  /* Disconnect on any errors detected during volume initialization */
-
-  if (ret != OK)
-    {
-      udbg("ERROR! Aborting: %d\n", ret);
-      usbhost_destroy(priv);
-    }
-
   return ret;
 }
 
@@ -924,6 +916,10 @@ static FAR struct usbhost_class_s *usbhost_create(FAR struct usbhost_driver_s *d
  *   On success, zero (OK) is returned. On a failure, a negated errno value is
  *   returned indicating the nature of the failure
  *
+ *   NOTE that the class instance remains valid upon return with a failure.  It is
+ *   the responsibility of the higher level enumeration logic to call
+ *   CLASS_DISCONNECTED to free up the class driver resources.
+ *
  * Assumptions:
  *   - This function will *not* be called from an interrupt handler.
  *   - If this function returns an error, the USB host controller driver
diff --git a/drivers/usbhost/usbhost_storage.c b/drivers/usbhost/usbhost_storage.c
index 118758a60acc79b79ff308fbc830bcb1d6eee146..7a41cde6570d9b053dacf37fa553dc83d1e2a789 100644
--- a/drivers/usbhost/usbhost_storage.c
+++ b/drivers/usbhost/usbhost_storage.c
@@ -937,6 +937,10 @@ static void usbhost_destroy(FAR void *arg)
  *   On success, zero (OK) is returned. On a failure, a negated errno value is
  *   returned indicating the nature of the failure
  *
+ *   NOTE that the class instance remains valid upon return with a failure.  It is
+ *   the responsibility of the higher level enumeration logic to call
+ *   CLASS_DISCONNECTED to free up the class driver resources.
+ *
  * Assumptions:
  *   This function will *not* be called from an interrupt handler.
  *
@@ -1308,14 +1312,6 @@ static inline int usbhost_initvolume(FAR struct usbhost_state_s *priv)
         }
     }
 
-  /* Disconnect on any errors detected during volume initialization */
-
-  if (ret != OK)
-    {
-      udbg("ERROR! Aborting: %d\n", ret);
-      usbhost_destroy(priv);
-    }
-
   return ret;
 }
 
diff --git a/include/nuttx/usb/usbhost.h b/include/nuttx/usb/usbhost.h
index 25eda9c7920dd7cc67e244da8d8d13f1c3c7e129..7f1bd880e0cad2bcfddb0fe575ade7ec3c048eca 100644
--- a/include/nuttx/usb/usbhost.h
+++ b/include/nuttx/usb/usbhost.h
@@ -113,6 +113,10 @@
  *   On success, zero (OK) is returned. On a failure, a negated errno value is
  *   returned indicating the nature of the failure
  *
+ *   NOTE that the class instance remains valid upon return with a failure.  It is
+ *   the responsibility of the higher level enumeration logic to call
+ *   CLASS_DISCONNECTED to free up the class driver resources.
+ *
  * Assumptions:
  *   - This function is probably called on the same thread that called the driver
  *     enumerate() method. This function will *not* be called from an interrupt