diff --git a/drivers/usbdev/usbdev_trace.c b/drivers/usbdev/usbdev_trace.c
index 5b70e6f720b4c31d63ddbca80591353ef78e3899..810500f27c330a43b2b6cc51de207dc0e92b1e59 100644
--- a/drivers/usbdev/usbdev_trace.c
+++ b/drivers/usbdev/usbdev_trace.c
@@ -47,8 +47,6 @@
 #include <nuttx/usbdev_trace.h>
 #undef usbtrace
 
-#ifdef CONFIG_USBDEV_TRACE
-
 /****************************************************************************
  * Definitions
  ****************************************************************************/
@@ -71,10 +69,15 @@
  * Private Data
  ****************************************************************************/
 
-static uint16 g_disablecount = 0; /* != 0 means tracing is disabled */
+#ifdef CONFIG_USBDEV_TRACE
 static struct usbtrace_s g_trace[CONFIG_USBDEV_TRACE_NRECORDS];
 static uint16 g_head = 0;
 static uint16 g_tail = 0;
+#endif
+
+#if defined(CONFIG_USBDEV_TRACE) || (defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB))
+static usbtrace_idset_t g_maskedidset = 0;
+#endif
 
 /****************************************************************************
  * Private Functions
@@ -88,32 +91,35 @@ static uint16 g_tail = 0;
  * Name: usbtrace_enable
  *
  * Description:
- *   Enable/disable tracing
+ *  Enable/disable tracing per trace ID.  The initial state is all IDs enabled.
+ *
+ * Input Parameters:
+ *  idset - The bitset of IDs to be masked.  TRACE_ALLIDS enables all IDS; zero
+ *  masks all IDs.
+ *
+ * Returned Value:
+ *  The previous idset value.
  *
  * Assumptions:
- * - Initial state is enabled
  * - May be called from an interrupt handler
  *
  *******************************************************************************/
 
-void usbtrace_enable(boolean enable)
+#if defined(CONFIG_USBDEV_TRACE) || (defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB))
+usbtrace_idset_t usbtrace_enable(usbtrace_idset_t idset)
 {
   irqstate_t flags;
+  usbtrace_idset_t ret;
 
-  flags = irqsave();
-  if (enable)
-    {
-      if (g_disablecount < 0xffff)
-        {
-          g_disablecount++;
-        }
-    }
-  else if (g_disablecount > 0)
-    {
-      g_disablecount--;
-    }
+  /* The following read and write must be atomic */
+
+  flags         = irqsave();
+  ret           = g_maskedidset;
+  g_maskedidset = idset;
   irqrestore(flags);
+  return ret;
 }
+#endif /* CONFIG_USBDEV_TRACE || CONFIG_DEBUG && CONFIG_DEBUG_USB */
 
 /*******************************************************************************
  * Name: usbtrace
@@ -126,15 +132,17 @@ void usbtrace_enable(boolean enable)
  *
  *******************************************************************************/
 
+#if defined(CONFIG_USBDEV_TRACE) || (defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB))
 void usbtrace(uint16 event, uint16 value)
 {
   irqstate_t flags;
 
-  /* Check if tracing is enabled */
+  /* Check if tracing is enabled for this ID */
 
   flags = irqsave();
-  if (!g_disablecount)
+  if ((g_maskedidset & TRACE_ID2BIT(event)) != 0)
     {
+#ifdef CONFIG_USBDEV_TRACE
       /* Yes... save the new trace data at the nead */
 
       g_trace[g_head].event = event;
@@ -154,9 +162,183 @@ void usbtrace(uint16 event, uint16 value)
               g_tail = 0;
             }
         }
+#else
+      switch (event)
+        {
+        case TRACE_DEVINIT:
+          lldbg("USB controller initialization: %04x\n", value);
+          break;
+
+        case TRACE_DEVUNINIT:
+          lldbg("USB controller un-initialization: %04x\n", value);
+          break;
+
+        case TRACE_DEVREGISTER:
+          lldbg("usbdev_register(): %04x\n", value);
+          break;
+
+        case TRACE_DEVUNREGISTER:
+          lldbg("usbdev_unregister(): %04x\n", value);
+          break;
+
+        case TRACE_EPCONFIGURE:
+          lldbg("Endpoint configure(): %04x\n", value);
+          break;
+
+        case TRACE_EPDISABLE:
+          lldbg("Endpoint disable(): %04x\n", value);
+          break;
+
+        case TRACE_EPALLOCREQ:
+          lldbg("Endpoint allocreq(): %04x\n", value);
+          break;
+
+        case TRACE_EPFREEREQ:
+          lldbg("Endpoint freereq(): %04x\n", value);
+          break;
+
+        case TRACE_EPALLOCBUFFER:
+          lldbg("Endpoint allocbuffer(): %04x\n", value);
+          break;
+
+        case TRACE_EPFREEBUFFER:
+          lldbg("Endpoint freebuffer(): %04x\n", value);
+          break;
+
+        case TRACE_EPSUBMIT:
+          lldbg("Endpoint submit(): %04x\n", value);
+          break;
+
+        case TRACE_EPCANCEL:
+          lldbg("Endpoint cancel(): %04x\n", value);
+          break;
+
+        case TRACE_EPSTALL:
+          lldbg("Endpoint stall(TRUE): %04x\n", value);
+          break;
+
+        case TRACE_EPRESUME:
+          lldbg("Endpoint stall(FALSE): %04x\n", value);
+          break;
+
+        case TRACE_DEVALLOCEP:
+          lldbg("Device allocep(): %04x\n", value);
+          break;
+
+        case TRACE_DEVFREEEP:
+          lldbg("Device freeep(): %04x\n", value);
+          break;
+
+        case TRACE_DEVGETFRAME:
+          lldbg("Device getframe(): %04x\n", value);
+          break;
+
+        case TRACE_DEVWAKEUP:
+          lldbg("Device wakeup(): %04x\n", value);
+          break;
+
+        case TRACE_DEVSELFPOWERED:
+          lldbg("Device selfpowered(): %04x\n", value);
+          break;
+
+        case TRACE_DEVPULLUP:
+          lldbg("Device pullup(): %04x\n", value);
+          break;
+
+        case TRACE_CLASSBIND:
+          lldbg("Class bind(): %04x\n", value);
+          break;
+
+        case TRACE_CLASSUNBIND:
+          lldbg("Class unbind(): %04x\n", value);
+          break;
+
+        case TRACE_CLASSDISCONNECT:
+          lldbg("Class disconnect(): %04x\n", value);
+          break;
+
+        case TRACE_CLASSSETUP:
+          lldbg("Class setup(): %04x\n", value);
+          break;
+
+        case TRACE_CLASSSUSPEND:
+          lldbg("Class suspend(): %04x\n", value);
+          break;
+
+        case TRACE_CLASSRESUME:
+          lldbg("Class resume(): %04x\n", value);
+          break;
+
+        case TRACE_CLASSRDCOMPLETE:
+          lldbg("Class RD request complete: %04x\n", value);
+          break;
+
+        case TRACE_CLASSWRCOMPLETE:
+          lldbg("Class WR request complete: %04x\n", value);
+          break;
+
+        default:
+          switch (TRACE_ID(event))
+            {
+            case TRACE_CLASSAPI_ID:        /* Other class driver system API calls */
+              lldbg("Class API call %d: %04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_CLASSSTATE_ID:      /* Track class driver state changes */
+              lldbg("Class state %d: %04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_INTENTRY_ID:        /* Interrupt handler entry */
+              lldbg("Interrrupt %d entry: %04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_INTDECODE_ID:       /* Decoded interrupt event */
+              lldbg("Interrrupt decode %d: %04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_INTEXIT_ID:         /* Interrupt handler exit */
+              lldbg("Interrrupt %d exit: %04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_OUTREQQUEUED_ID:    /* Request queued for OUT endpoint */
+              lldbg("EP%d OUT request queued: %04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_INREQQUEUED_ID:     /* Request queued for IN endpoint */
+              lldbg("EP%d IN request queued: %04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_READ_ID:            /* Read (OUT) action */
+              lldbg("EP%d OUT read: %04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_WRITE_ID:           /* Write (IN) action */
+              lldbg("EP%d IN write: %04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_COMPLETE_ID:        /* Request completed */
+              lldbg("EP%d request complete: %04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_DEVERROR_ID:        /* USB controller driver error event */
+              lldbg("Controller error: %02x:%04x\n", TRACE_DATA(event), value);
+              break;
+
+            case TRACE_CLSERROR_ID:        /* USB class driver error event */
+              lldbg("Class error: %02x:%04x\n", TRACE_DATA(event), value);
+              break;
+
+            default:
+              lldbg("Unrecognized event: %02x:%02x:%04x\n",
+                    TRACE_ID(event) >> 8, TRACE_DATA(event), value);
+              break;
+            }
+        }
+#endif /* CONFIG_USBDEV_TRACE */
     }
   irqrestore(flags);
 }
+#endif /* CONFIG_USBDEV_TRACE || CONFIG_DEBUG && CONFIG_DEBUG_USB */
 
 /*******************************************************************************
  * Name: usbtrace_enumerate
@@ -169,6 +351,7 @@ void usbtrace(uint16 event, uint16 value)
  *
  *******************************************************************************/
 
+#ifdef CONFIG_USBDEV_TRACE
 int usbtrace_enumerate(trace_callback_t callback, void *arg)
 {
   uint16 ndx = g_tail;
@@ -202,194 +385,4 @@ int usbtrace_enumerate(trace_callback_t callback, void *arg)
 
   return ret;
 }
-
-#else
-
-/*******************************************************************************
- * Name: usbtrace
- *
- * Description:
- *  Map trace to simple debug output
- *
- *******************************************************************************/
-
-void usbtrace(uint16 event, uint16 value)
-{
-#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB)
-  irqstate_t flags;
-  flags = irqsave();
-  switch (event)
-    {
-    case TRACE_DEVINIT:
-      lldbg("USB controller initialization: %04x\n", value);
-      break;
-
-    case TRACE_DEVUNINIT:
-      lldbg("USB controller un-initialization: %04x\n", value);
-      break;
-
-    case TRACE_DEVREGISTER:
-      lldbg("usbdev_register(): %04x\n", value);
-      break;
-
-    case TRACE_DEVUNREGISTER:
-      lldbg("usbdev_unregister(): %04x\n", value);
-      break;
-
-    case TRACE_EPCONFIGURE:
-      lldbg("Endpoint configure(): %04x\n", value);
-      break;
-
-    case TRACE_EPDISABLE:
-      lldbg("Endpoint disable(): %04x\n", value);
-      break;
-
-    case TRACE_EPALLOCREQ:
-      lldbg("Endpoint allocreq(): %04x\n", value);
-      break;
-
-    case TRACE_EPFREEREQ:
-      lldbg("Endpoint freereq(): %04x\n", value);
-      break;
-
-    case TRACE_EPALLOCBUFFER:
-      lldbg("Endpoint allocbuffer(): %04x\n", value);
-      break;
-
-    case TRACE_EPFREEBUFFER:
-      lldbg("Endpoint freebuffer(): %04x\n", value);
-      break;
-
-    case TRACE_EPSUBMIT:
-      lldbg("Endpoint submit(): %04x\n", value);
-      break;
-
-    case TRACE_EPCANCEL:
-      lldbg("Endpoint cancel(): %04x\n", value);
-      break;
-
-    case TRACE_EPSTALL:
-      lldbg("Endpoint stall(TRUE): %04x\n", value);
-      break;
-
-    case TRACE_EPRESUME:
-      lldbg("Endpoint stall(FALSE): %04x\n", value);
-      break;
-
-    case TRACE_DEVALLOCEP:
-      lldbg("Device allocep(): %04x\n", value);
-      break;
-
-    case TRACE_DEVFREEEP:
-      lldbg("Device freeep(): %04x\n", value);
-      break;
-
-    case TRACE_DEVGETFRAME:
-      lldbg("Device getframe(): %04x\n", value);
-      break;
-
-    case TRACE_DEVWAKEUP:
-      lldbg("Device wakeup(): %04x\n", value);
-      break;
-
-    case TRACE_DEVSELFPOWERED:
-      lldbg("Device selfpowered(): %04x\n", value);
-      break;
-
-    case TRACE_DEVPULLUP:
-      lldbg("Device pullup(): %04x\n", value);
-      break;
-
-    case TRACE_CLASSBIND:
-      lldbg("Class bind(): %04x\n", value);
-      break;
-
-    case TRACE_CLASSUNBIND:
-      lldbg("Class unbind(): %04x\n", value);
-      break;
-
-    case TRACE_CLASSDISCONNECT:
-      lldbg("Class disconnect(): %04x\n", value);
-      break;
-
-    case TRACE_CLASSSETUP:
-      lldbg("Class setup(): %04x\n", value);
-      break;
-
-    case TRACE_CLASSSUSPEND:
-      lldbg("Class suspend(): %04x\n", value);
-      break;
-
-    case TRACE_CLASSRESUME:
-      lldbg("Class resume(): %04x\n", value);
-      break;
-
-    case TRACE_CLASSRDCOMPLETE:
-      lldbg("Class RD request complete: %04x\n", value);
-      break;
-
-    case TRACE_CLASSWRCOMPLETE:
-      lldbg("Class WR request complete: %04x\n", value);
-      break;
-
-    default:
-      switch (TRACE_ID(event))
-        {
-        case TRACE_CLASSAPI_ID:        /* Other class driver system API calls */
-          lldbg("Class API call %d: %04x\n", TRACE_DATA(event), value);
-          break;
-
-        case TRACE_CLASSSTATE_ID:      /* Track class driver state changes */
-          lldbg("Class state %d: %04x\n", TRACE_DATA(event), value);
-
-        case TRACE_INTENTRY_ID:        /* Interrupt handler entry */
-          lldbg("Interrrupt %d entry: %04x\n", TRACE_DATA(event), value);
-          break;
-
-        case TRACE_INTDECODE_ID:       /* Decoded interrupt event */
-          lldbg("Interrrupt decode %d: %04x\n", TRACE_DATA(event), value);
-          break;
-
-        case TRACE_INTEXIT_ID:         /* Interrupt handler exit */
-          lldbg("Interrrupt %d exit: %04x\n", TRACE_DATA(event), value);
-          break;
-
-        case TRACE_OUTREQQUEUED_ID:    /* Request queued for OUT endpoint */
-          lldbg("EP%d OUT request queued: %04x\n", TRACE_DATA(event), value);
-          break;
-
-        case TRACE_INREQQUEUED_ID:     /* Request queued for IN endpoint */
-          lldbg("EP%d IN request queued: %04x\n", TRACE_DATA(event), value);
-          break;
-
-        case TRACE_READ_ID:            /* Read (OUT) action */
-          lldbg("EP%d OUT read: %04x\n", TRACE_DATA(event), value);
-          break;
-
-        case TRACE_WRITE_ID:           /* Write (IN) action */
-          lldbg("EP%d IN write: %04x\n", TRACE_DATA(event), value);
-          break;
-
-        case TRACE_COMPLETE_ID:        /* Request completed */
-          lldbg("EP%d request complete: %04x\n", TRACE_DATA(event), value);
-          break;
-
-        case TRACE_DEVERROR_ID:        /* USB controller driver error event */
-          lldbg("Controller error: %02x:%04x\n", TRACE_DATA(event), value);
-          break;
-
-        case TRACE_CLSERROR_ID:        /* USB class driver error event */
-          lldbg("Class error: %02x:%04x\n", TRACE_DATA(event), value);
-          break;
-
-        default:
-          lldbg("Unrecognized event: %02x:%02x:%04x\n",
-                TRACE_ID(event) >> 8, TRACE_DATA(event), value);
-          break;
-        }
-    }
-  irqrestore(flags);
-#endif /* CONFIG_DEBUG && CONFIG_DEBUG_USB */
-}
-
 #endif /* CONFIG_USBDEV_TRACE */
diff --git a/examples/usbstorage/usbstrg_main.c b/examples/usbstorage/usbstrg_main.c
index a0db2aa5de5368a14441000e934644488a56bbb7..a581d356d87e68e19fc967e037b65b111ba257d9 100644
--- a/examples/usbstorage/usbstrg_main.c
+++ b/examples/usbstorage/usbstrg_main.c
@@ -45,6 +45,7 @@
 #include <debug.h>
 
 #include <nuttx/usbdev.h>
+#include <nuttx/usbdev_trace.h>
 
 #include "usbstrg.h"
 
@@ -82,6 +83,24 @@ int user_start(int argc, char *argv[])
   void *handle;
   int ret;
 
+  /* Initialize USB trace output IDs */
+
+  usbtrace_enable(
+    TRACE_INIT_BIT|            /* Initialization events */
+    TRACE_EP_BIT|              /* Endpoint API calls */
+    TRACE_DEV_BIT|             /* USB device API calls */
+    TRACE_CLASS_BIT|           /* USB class driver API calls */
+    TRACE_CLASSAPI_BIT|        /* Other class driver system API calls */
+    TRACE_CLASSSTATE_BIT|      /* Track class driver state changes */
+    TRACE_OUTREQQUEUED_BIT|    /* Request queued for OUT endpoint */
+    TRACE_INREQQUEUED_BIT|     /* Request queued for IN endpoint */
+    TRACE_READ_BIT|            /* Read (OUT) action */
+    TRACE_WRITE_BIT|           /* Write (IN) action */
+    TRACE_COMPLETE_BIT|        /* Request completed */
+    TRACE_DEVERROR_BIT|        /* USB controller driver error event */
+    TRACE_CLSERROR_BIT         /* USB class driver error event */
+  );
+
   /* Register block drivers (architecture-specific) */
 
   message("user_start: Creating block drivers\n");
diff --git a/include/nuttx/usbdev_trace.h b/include/nuttx/usbdev_trace.h
index b2a2d0f25cb91ca08a97c440277f27b3dd13cdea..5e68f0c03b681b44802f3f31d9ea8d309a01a73a 100644
--- a/include/nuttx/usbdev_trace.h
+++ b/include/nuttx/usbdev_trace.h
@@ -74,7 +74,28 @@
 #define TRACE_DEVERROR_ID        (0x0e00) /* USB controller driver error event */
 #define TRACE_CLSERROR_ID        (0x0f00) /* USB class driver error event */
 
-#define TRACE_NIDS               15
+#define TRACE_NIDS               16       /* Cannot exceed bits in usbtrace_idset_t */
+
+/* Bit settings for usbtrace_enable */
+
+#define TRACE_ID2BIT(id)         ((1) << ((id) >> 8))
+#define TRACE_INIT_BIT           TRACE_ID2BIT(TRACE_INIT_ID)
+#define TRACE_EP_BIT             TRACE_ID2BIT(TRACE_EP_ID)
+#define TRACE_DEV_BIT            TRACE_ID2BIT(TRACE_DEV_ID)
+#define TRACE_CLASS_BIT          TRACE_ID2BIT(TRACE_CLASS_ID)
+#define TRACE_CLASSAPI_BIT       TRACE_ID2BIT(TRACE_CLASSAPI_ID)
+#define TRACE_CLASSSTATE_BIT     TRACE_ID2BIT(TRACE_CLASSSTATE_ID)
+#define TRACE_INTENTRY_BIT       TRACE_ID2BIT(TRACE_INTENTRY_ID
+#define TRACE_INTDECODE_BIT      TRACE_ID2BIT(TRACE_INTDECODE_ID)
+#define TRACE_INTEXIT_BIT        TRACE_ID2BIT(TRACE_INTEXIT_ID)
+#define TRACE_OUTREQQUEUED_BIT   TRACE_ID2BIT(TRACE_OUTREQQUEUED_ID)
+#define TRACE_INREQQUEUED_BIT    TRACE_ID2BIT(TRACE_INREQQUEUED_ID)
+#define TRACE_READ_BIT           TRACE_ID2BIT(TRACE_READ_ID)
+#define TRACE_WRITE_BIT          TRACE_ID2BIT(TRACE_WRITE_ID)
+#define TRACE_COMPLETE_BIT       TRACE_ID2BIT(TRACE_COMPLETE_ID)
+#define TRACE_DEVERROR_BIT       TRACE_ID2BIT(TRACE_DEVERROR_ID)
+#define TRACE_CLSERROR_BIT       TRACE_ID2BIT(TRACE_CLSERROR_ID)
+#define TRACE_ALLBITS            ((usbtrace_idset_t)-1)
 
 /* Initialization events */
 
@@ -358,6 +379,12 @@ struct usbtrace_s
 
 typedef int (*trace_callback_t)(struct usbtrace_s *trace, void *arg);
 
+/* Bit mask input type for usbtrace_enable().  If  TRACE_NIDS grows beyond
+ * 16, then this will have to be changed to uint32
+ */
+
+typedef uint16 usbtrace_idset_t;
+
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
@@ -374,18 +401,24 @@ extern "C" {
  * Name: usbtrace_enable
  *
  * Description:
- *  Enable/disable tracing
+ *  Enable/disable tracing per trace ID.  The initial state is all IDs enabled.
+ *
+ * Input Parameters:
+ *  idset - The bitset of IDs to be masked.  TRACE_ALLIDS enables all IDS; zero
+ *  masks all IDs.
+ *
+ * Returned Value:
+ *  The previous idset value.
  *
  * Assumptions:
- * - Initial state is enabled
  * - May be called from an interrupt handler
  *
  *******************************************************************************/
 
-#ifdef CONFIG_USBDEV_TRACE
-EXTERN void usbtrace_enable(boolean enable);
+#if defined(CONFIG_USBDEV_TRACE) || (defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB))
+EXTERN usbtrace_idset_t usbtrace_enable(usbtrace_idset_t idset);
 #else
-#  define usbtrace_enable(enable)
+#  define usbtrace_enable(idset)
 #endif
 
 /*******************************************************************************