diff --git a/arch/arm/src/lpc17xx/lpc17_usbhost.c b/arch/arm/src/lpc17xx/lpc17_usbhost.c
index 0a566c9fea1bdad7e717241c4c63f969107e6579..0d6b3c23ea136da443c340c9e7736ad27ea0aa45 100755
--- a/arch/arm/src/lpc17xx/lpc17_usbhost.c
+++ b/arch/arm/src/lpc17xx/lpc17_usbhost.c
@@ -246,7 +246,7 @@ static int lpc17_usbinterrupt(int irq, FAR void *context);
 
 static int lpc17_wait(FAR struct usbhost_driver_s *drvr, bool connected);
 static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr);
-static int lpc17_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcno,
+static int lpc17_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
                               uint16_t maxpacketsize);
 static int lpc17_alloc(FAR struct usbhost_driver_s *drvr,
                          FAR uint8_t **buffer, FAR size_t *maxlen);
@@ -617,7 +617,7 @@ static void lpc17_enqueuetd(volatile struct lpc17_hced_s *ed, uint32_t dirpid,
   TDHEAD->bufend  = (uint32_t)(buffer + (buflen - 1));
   TDTAIL->bufend  = 0;
 
-  ed->headtd      = (uint32_t)TDHEAD | ((ed->headtd) & 0x00000002);
+  ed->headtd      = (uint32_t)TDHEAD | ((ed->headtd) & ED_HEADP_C);
   ed->tailtd      = (uint32_t)TDTAIL;
   ed->next        = 0;
 }
@@ -966,7 +966,7 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
  * Input Parameters:
  *   drvr - The USB host driver instance obtained as a parameter from the call to
  *      the class create() method.
- *   funcno - The USB address of the function containing the endpoint that EP0
+ *   funcaddr - The USB address of the function containing the endpoint that EP0
  *     controls
  *   maxpacketsize - The maximum number of bytes that can be sent to or
  *    received from the endpoint in a single data packet
@@ -980,11 +980,11 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
  *
  ************************************************************************************/
 
-static int lpc17_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcno,
+static int lpc17_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
                               uint16_t maxpacketsize)
 {
-  DEBUGASSERT(drvr && funcno < 128 && maxpacketsize < 2048);
-  EDCTRL->ctrl = (uint32_t)funcno << ED_CONTROL_FA_SHIFT | 
+  DEBUGASSERT(drvr && funcaddr < 128 && maxpacketsize < 2048);
+  EDCTRL->ctrl = (uint32_t)funcaddr << ED_CONTROL_FA_SHIFT | 
                  (uint32_t)maxpacketsize << ED_CONTROL_MPS_SHIFT;
   return OK;
 }
@@ -1203,11 +1203,15 @@ static int lpc17_transfer(FAR struct usbhost_driver_s *drvr,
 #endif
   int ret = -ENOMEM;
 
+  DEBUGASSERT(drvr && ep && buffer && buflen > 0);
+  uvdbg("EP%d %s maxpacket:%d buflen:%d\n",
+        ep->addr, ep->in ? "IN" : "OUT", ep->mxpacketsize, buflen);
+
   /* Allocate an IO buffer if the user buffer does not lie in AHB SRAM */
 
 #ifdef CONFIG_UBHOST_AHBIOBUFFERS
   if ((uintptr_t)buffer < LPC17_SRAM_BANK0 ||
-      (uintptr_t)buffer >= (LPC17_SRAM_BANK0 + LPC17_SRAM_BANK0 + LPC17_SRAM_BANK0))
+      (uintptr_t)buffer >= (LPC17_SRAM_BANK0 + LPC17_BANK0_SIZE + LPC17_BANK1_SIZE))
     {
       /* Will the transfer fit in an IO buffer? */
 
@@ -1242,14 +1246,15 @@ static int lpc17_transfer(FAR struct usbhost_driver_s *drvr,
   ed = lpc17_edalloc(priv);
   if (!ed)
     {
-      uvdbg("ED allocation failed\n");
+      udbg("ED allocation failed\n");
       goto errout;
     }
 
   /* Format the endpoint descriptor */
  
   lpc17_edinit(ed);
-  ed->ctrl = (uint32_t)(ep->addr) << ED_CONTROL_EN_SHIFT |
+  ed->ctrl = (uint32_t)(ep->funcaddr)     << ED_CONTROL_FA_SHIFT | 
+             (uint32_t)(ep->addr)         << ED_CONTROL_EN_SHIFT |
              (uint32_t)(ep->mxpacketsize) << ED_CONTROL_MPS_SHIFT;
 
   /* Get the direction of the endpoint */
@@ -1280,7 +1285,7 @@ static int lpc17_transfer(FAR struct usbhost_driver_s *drvr,
    * TDs on the Bulk list.
    */
  
-  regval = lpc17_getreg(LPC17_USBHOST_CMDST);
+  regval  = lpc17_getreg(LPC17_USBHOST_CMDST);
   regval |= OHCI_CMDST_BLF;
   lpc17_putreg(regval, LPC17_USBHOST_CMDST);
 
@@ -1290,7 +1295,7 @@ static int lpc17_transfer(FAR struct usbhost_driver_s *drvr,
    * should never modify the bulk list while BLE is set.
    */
 
-  regval = lpc17_getreg(LPC17_USBHOST_CTRL);
+  regval  = lpc17_getreg(LPC17_USBHOST_CTRL);
   regval |= OHCI_CTRL_BLE;
   lpc17_putreg(regval, LPC17_USBHOST_CTRL);
 
@@ -1437,12 +1442,15 @@ FAR struct usbhost_driver_s *usbhost_initialize(int controller)
   sem_init(&priv->rhssem, 0, 0);
   sem_init(&priv->wdhsem, 0, 0);
 
-  /* Enable power by setting PCUSB in the PCONP register */
+  /* Enable power by setting PCUSB in the PCONP register.  Disable interrupts
+   * because this register may be shared with other drivers.
+   */
 
   flags   = irqsave();
   regval  = lpc17_getreg(LPC17_SYSCON_PCONP);
   regval |= SYSCON_PCONP_PCUSB;
   lpc17_putreg(regval, LPC17_SYSCON_PCONP);
+  irqrestore(flags);
 
   /* Enable clocking on USB (USB PLL clocking was initialized in very low-
    * evel clock setup logic (see lpc17_clockconfig.c)).  We do still need
@@ -1582,7 +1590,9 @@ FAR struct usbhost_driver_s *usbhost_initialize(int controller)
       return NULL;
     }
 
-  /* Enable USB interrupts at the SYCON controller */
+  /* Enable USB interrupts at the SYCON controller.  Disable interrupts
+   * because this register may be shared with other drivers.
+   */
 
   flags = irqsave();
   regval = lpc17_getreg(LPC17_SYSCON_USBINTST);
diff --git a/drivers/usbhost/usbhost_storage.c b/drivers/usbhost/usbhost_storage.c
index 89b969b300ab67ff473add664582bc2e724bdc36..c544d8dcccb0e2315de034e6a649e6f5ee72ecae 100644
--- a/drivers/usbhost/usbhost_storage.c
+++ b/drivers/usbhost/usbhost_storage.c
@@ -1384,7 +1384,10 @@ static int usbhost_connect(FAR struct usbhost_class_s *class,
 
                     priv->bulkout.addr         = epdesc->addr & USB_EP_ADDR_NUMBER_MASK;
                     priv->bulkout.in           = false;
+                    priv->bulkout.funcaddr     = 1;
                     priv->bulkout.mxpacketsize = usbhost_getle16(epdesc->mxpacketsize);
+                    uvdbg("Bulk OUT EP addr:%d mxpacketsize:%d\n",
+                          priv->bulkout.addr, priv->bulkout.mxpacketsize);
                   }
                 else
                   {
@@ -1402,7 +1405,10 @@ static int usbhost_connect(FAR struct usbhost_class_s *class,
                     
                     priv->bulkin.addr          = epdesc->addr & USB_EP_ADDR_NUMBER_MASK;
                     priv->bulkin.in            = true;
+                    priv->bulkin.funcaddr      = 1;
                     priv->bulkin.mxpacketsize  = usbhost_getle16(epdesc->mxpacketsize);
+                    uvdbg("Bulk IN EP addr:%d mxpacketsize:%d\n",
+                          priv->bulkin.addr, priv->bulkin.mxpacketsize);
                   }
               }
           }
diff --git a/include/nuttx/usb/ohci.h b/include/nuttx/usb/ohci.h
index 2dc95aecc462c1abf2977d27896800883d06183d..99cf843a9a9d2d59908b031111cb2ca2d86d0b78 100755
--- a/include/nuttx/usb/ohci.h
+++ b/include/nuttx/usb/ohci.h
@@ -281,8 +281,8 @@
 #define ED_CONTROL_MPS_SHIFT       (16)       /* Bits 16-26: Maximum packet size */
 #define ED_CONTROL_MPS_MASK        (0x7ff << ED_CONTROL_MPS_SHIFT)
 
-#define ED_TAILP_H                 (1 << 0)  /* Bit 0: Halted */
-#define ED_TAILP_C                 (1 << 1)  /* Bit 1: Toggle carry */
+#define ED_HEADP_H                 (1 << 0)  /* Bit 0: Halted */
+#define ED_HEADP_C                 (1 << 1)  /* Bit 1: Toggle carry */
 
 /* General Transfer Descriptor Offsets (4.3.1) */
 
diff --git a/include/nuttx/usb/usbhost.h b/include/nuttx/usb/usbhost.h
index 18753e1b8a255866a880499ccea8ef0bed77b308..9d79198399775eee9d27857dda5a7ca4f8783e61 100644
--- a/include/nuttx/usb/usbhost.h
+++ b/include/nuttx/usb/usbhost.h
@@ -206,7 +206,7 @@
  * Input Parameters:
  *   drvr - The USB host driver instance obtained as a parameter from the call to
  *      the class create() method.
- *   funcno - The USB address of the function containing the endpoint that EP0
+ *   funcaddr - The USB address of the function containing the endpoint that EP0
  *     controls
  *   mps (maxpacketsize) - The maximum number of bytes that can be sent to or
  *    received from the endpoint in a single data packet
@@ -220,7 +220,7 @@
  *
  ************************************************************************************/
 
-#define DRVR_EP0CONFIGURE(drvr,funcno,mps) ((drvr)->ep0configure(drvr,funcno,mps))
+#define DRVR_EP0CONFIGURE(drvr,funcaddr,mps) ((drvr)->ep0configure(drvr,funcaddr,mps))
 
 /************************************************************************************
  * Name: DRVR_ALLOC
@@ -465,7 +465,7 @@ struct usbhost_driver_s
    * an external implementation of the enumeration logic.
    */
 
-  int (*ep0configure)(FAR struct usbhost_driver_s *drvr, uint8_t funcno,
+  int (*ep0configure)(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
                       uint16_t maxpacketsize);
 
   /* Some hardware supports special memory in which transfer descriptors can
@@ -523,6 +523,7 @@ struct usbhost_epdesc_s
 {
   uint8_t  addr;         /* Endpoint address */
   bool     in;           /* Direction: TRUE = IN */
+  uint8_t  funcaddr;     /* USB address of function containing endpoint */
   uint16_t mxpacketsize; /* Max packetsize */
 };