[HAL][LL][USB] Rework host channel init to allow supporting hubs
diff --git a/Inc/stm32g0xx_hal_hcd.h b/Inc/stm32g0xx_hal_hcd.h
index a6dd469..4567187 100644
--- a/Inc/stm32g0xx_hal_hcd.h
+++ b/Inc/stm32g0xx_hal_hcd.h
@@ -359,12 +359,15 @@
 /** @defgroup HCD_ENDP_Kind HCD Endpoint Kind
   * @{
   */
-#define HCD_SNG_BUF                            0U
-#define HCD_DBL_BUF                            1U
+#define HCD_SNG_BUF                              0U
+#define HCD_DBL_BUF                              1U
 /**
   * @}
   */
 
+/* Powerdown exit count */
+#define HCD_PDWN_EXIT_CNT                    0x100U
+
 /* Set Channel */
 #define HCD_SET_CHANNEL                        USB_DRD_SET_CHEP
 
@@ -495,13 +498,14 @@
 __STATIC_INLINE uint16_t HCD_GET_CH_RX_CNT(HCD_TypeDef *Instance, uint16_t bChNum)
 {
   uint32_t HostCoreSpeed;
+  uint32_t ep_reg = USB_DRD_GET_CHEP(Instance, bChNum);
   __IO uint32_t count = 10U;
 
   /* Get Host core Speed */
   HostCoreSpeed = USB_GetHostSpeed(Instance);
 
   /* Count depends on device LS */
-  if (HostCoreSpeed == USB_DRD_SPEED_LS)
+  if ((HostCoreSpeed == USB_DRD_SPEED_LS) || ((ep_reg & USB_CHEP_LSEP) == USB_CHEP_LSEP))
   {
     count = (70U * (HAL_RCC_GetHCLKFreq() / 1000000U)) / 100U;
   }
diff --git a/Src/stm32g0xx_hal_hcd.c b/Src/stm32g0xx_hal_hcd.c
index 97f288a..79481ec 100644
--- a/Src/stm32g0xx_hal_hcd.c
+++ b/Src/stm32g0xx_hal_hcd.c
@@ -169,9 +169,6 @@
   /* Init Host */
   (void)USB_HostInit(hhcd->Instance, hhcd->Init);
 
-  /* Deactivate the power down */
-  hhcd->Instance->CNTR &= ~USB_CNTR_PDWN;
-
   hhcd->State = HAL_HCD_STATE_READY;
 
   /* Host Port State */
@@ -219,6 +216,27 @@
 
   __HAL_LOCK(hhcd);
 
+  if (ch_num > 16U)
+  {
+    __HAL_UNLOCK(hhcd);
+    return HAL_ERROR;
+  }
+
+  if (((epnum & 0xFU)== 0U) && ((hhcd->ep0_PmaAllocState & 0xF000U) != 0U))
+  {
+    hhcd->hc[ch_num & 0xFU].pmaadress = hhcd->hc[0U].pmaadress;
+    hhcd->hc[ch_num & 0xFU].pmaaddr0 = hhcd->hc[0U].pmaaddr0;
+    hhcd->hc[ch_num & 0xFU].pmaaddr1 = hhcd->hc[0U].pmaaddr1;
+
+    hhcd->phy_chin_state[0U] = (((uint16_t)ch_num + 1U) << 4U) |
+                               ((uint16_t)ep_type + 1U) |
+                               (((uint16_t)epnum & 0x0FU) << 8U);
+
+    hhcd->phy_chout_state[0U] = (((uint16_t)ch_num + 1U) << 4U) |
+                                ((uint16_t)ep_type + 1U) |
+                                (((uint16_t)epnum & 0x0FU) << 8U);
+  }
+
   /* Check if the logical channel are already allocated */
   used_channel = HAL_HCD_Check_usedChannel(hhcd, ch_num);
 
@@ -231,6 +249,7 @@
     /* No free Channel available, return error */
     if (hhcd->hc[ch_num & 0xFU].phy_ch_num == HCD_FREE_CH_NOT_FOUND)
     {
+      __HAL_UNLOCK(hhcd);
       return HAL_ERROR;
     }
   }
@@ -267,6 +286,7 @@
 
       if (status == HAL_ERROR)
       {
+        __HAL_UNLOCK(hhcd);
         return HAL_ERROR;
       }
 
@@ -285,6 +305,7 @@
 
         if (status == HAL_ERROR)
         {
+          __HAL_UNLOCK(hhcd);
           return HAL_ERROR;
         }
       }
@@ -302,22 +323,28 @@
 
               if (status == HAL_ERROR)
               {
+                __HAL_UNLOCK(hhcd);
                 return HAL_ERROR;
               }
             }
             else
             {
+              __HAL_UNLOCK(hhcd);
               return HAL_ERROR;
             }
           }
           else
           {
+            /* This is a dual EP0 PMA allocation */
+            hhcd->ep0_PmaAllocState |= (0x1U << 12);
+
             /* PMA Dynamic Allocation for EP0 OUT direction */
             hhcd->hc[ch_num & 0xFU].ch_dir = CH_OUT_DIR;
             status = HAL_HCD_PMAlloc(hhcd, ch_num, HCD_SNG_BUF, 64U);
 
             if (status == HAL_ERROR)
             {
+              __HAL_UNLOCK(hhcd);
               return HAL_ERROR;
             }
 
@@ -327,6 +354,7 @@
 
             if (status == HAL_ERROR)
             {
+              __HAL_UNLOCK(hhcd);
               return HAL_ERROR;
             }
           }
@@ -352,6 +380,7 @@
 
             if (status == HAL_ERROR)
             {
+              __HAL_UNLOCK(hhcd);
               return HAL_ERROR;
             }
           }
@@ -730,8 +759,7 @@
 void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd)
 {
   uint8_t phy_chnum;
-  uint8_t chnum;
-  uint32_t epch_reg;
+  uint8_t ch_dir;
   uint32_t wIstr = USB_ReadInterrupts(hhcd->Instance);
 
   /* check if this is an USB pending IT */
@@ -755,50 +783,21 @@
   /* Correct Transaction Detected -------*/
   if ((wIstr & USB_ISTR_CTR) == USB_ISTR_CTR)
   {
-    /* Handle Host channel Interrupt */
-    for (phy_chnum = 0U; phy_chnum < hhcd->Init.Host_channels; phy_chnum++)
+    /* Get Physical channel */
+    phy_chnum = (uint8_t)__HAL_HCD_GET_CHNUM(hhcd);
+
+    /* Get channel direction */
+    ch_dir = __HAL_HCD_GET_CHDIR(hhcd);
+
+    if (ch_dir == CH_OUT_DIR)
     {
-      if ((HCD_GET_CHANNEL(hhcd->Instance, phy_chnum) & USB_CH_VTRX) != 0U)
-      {
-        /* Get Logical channel to check if the channel is already opened */
-        chnum = HAL_HCD_GetLogical_Channel(hhcd, phy_chnum, 1U);
-
-        if (chnum != HCD_LOGICAL_CH_NOT_OPENED)
-        {
-          /* Call Channel_IN_IRQ() */
-          HCD_HC_IN_IRQHandler(hhcd, chnum);
-        }
-        else
-        {
-          /*Channel was not closed correctly still have interrupt */
-          epch_reg = HCD_GET_CHANNEL(hhcd->Instance, phy_chnum);
-          epch_reg = (epch_reg & (USB_CHEP_REG_MASK & (~USB_CH_ERRRX) & (~USB_CH_VTRX))) |
-                     (USB_CH_VTTX | USB_CH_ERRTX);
-
-          HCD_SET_CHANNEL(hhcd->Instance, phy_chnum, epch_reg);
-        }
-      }
-
-      if ((HCD_GET_CHANNEL(hhcd->Instance, phy_chnum) & USB_CH_VTTX) != 0U)
-      {
-        /* Get Logical channel to check if the channel is already opened */
-        chnum = HAL_HCD_GetLogical_Channel(hhcd, phy_chnum, 0U);
-
-        if (chnum != HCD_LOGICAL_CH_NOT_OPENED)
-        {
-          /*Call Channel_OUT_IRQ()*/
-          HCD_HC_OUT_IRQHandler(hhcd, chnum);
-        }
-        else
-        {
-          /* Clear Error & unwanted VTTX or Channel was not closed correctly */
-          epch_reg = HCD_GET_CHANNEL(hhcd->Instance, phy_chnum);
-          epch_reg = (epch_reg & (USB_CHEP_REG_MASK & (~USB_CH_ERRTX) & (~USB_CH_VTTX))) |
-                     (USB_CH_VTRX | USB_CH_ERRRX);
-
-          HCD_SET_CHANNEL(hhcd->Instance, phy_chnum, epch_reg);
-        }
-      }
+      /* Call Channel_OUT_IRQ() */
+      HCD_HC_OUT_IRQHandler(hhcd, phy_chnum);
+    }
+    else
+    {
+      /* Call Channel_IN_IRQ() */
+      HCD_HC_IN_IRQHandler(hhcd, phy_chnum);
     }
 
     return;
@@ -1298,17 +1297,22 @@
   */
 HAL_StatusTypeDef HAL_HCD_Start(HCD_HandleTypeDef *hhcd)
 {
+  __IO uint32_t count = HCD_PDWN_EXIT_CNT;
+
   __HAL_LOCK(hhcd);
 
-  /*Set the PullDown on the PHY */
-  hhcd->Instance->BCDR |= USB_BCDR_DPPD;
-
-  /* Clear Reset  */
-  hhcd->Instance->CNTR &= ~USB_CNTR_USBRST;
-
-  /*Remove PowerDown */
+  /* Remove PowerDown */
   hhcd->Instance->CNTR &= ~USB_CNTR_PDWN;
 
+  /* Few cycles to ensure exit from powerdown */
+  while (count > 0U)
+  {
+    count--;
+  }
+
+  /* Clear Reset */
+  hhcd->Instance->CNTR &= ~USB_CNTR_USBRST;
+
   __HAL_UNLOCK(hhcd);
 
   return HAL_OK;
@@ -1863,16 +1867,17 @@
 /**
   * @brief  Handle Host Channel IN interrupt requests.
   * @param  hhcd HCD handle
-  * @param  ch_num Channel number
-  *         This parameter can be a value from 1 to 15
+  * @param  chnum Channel number
+  *         This parameter can be a value from 1 to 8
   * @retval none
   */
-static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t ch_num)
+static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
 {
   uint16_t received_bytes;
-  uint8_t phy_chnum = (uint8_t)__HAL_HCD_GET_CHNUM(hhcd);
+  uint8_t phy_chnum = chnum;
+  uint8_t ch_num = HAL_HCD_GetLogical_Channel(hhcd, phy_chnum, 1U);
 
-  /*Take a Flag snapshot from the CHEP register, due to STRX bits are used for both control and status */
+  /* Take a Flag snapshot from the CHEP register, due to STRX bits are used for both control and status */
   uint32_t ch_reg =  HCD_GET_CHANNEL(hhcd->Instance, phy_chnum);
 
   /* Manage Correct Transaction */
@@ -2013,16 +2018,17 @@
   * @brief  Handle Host Channel OUT interrupt requests.
   * @param  hhcd  HCD handle
   * @param  chnum Channel number
-  *         This parameter can be a value from 1 to 15
+  *         This parameter can be a value from 1 to 8
   * @retval none
   */
 static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
 {
-  uint16_t data_xfr;
   __IO uint32_t WregCh;
+  uint16_t data_xfr;
+  uint8_t phy_chnum = chnum;
 
-  /* Get Physical Channel number */
-  uint32_t phy_chnum = (uint8_t)__HAL_HCD_GET_CHNUM(hhcd);
+  /* Get Virtual Channel number */
+  uint8_t ch_num = HAL_HCD_GetLogical_Channel(hhcd, phy_chnum, 0U);
 
   /* Take a Flag snapshot from the CHEP register, due to STRX bits are used for both control &status */
   uint32_t ch_reg =  *(__IO uint32_t *)(&(hhcd->Instance->CHEP0R) + phy_chnum);
@@ -2060,8 +2066,8 @@
 #endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
         /* Transfer complete state */
-        hhcd->hc[chnum & 0xFU].state = HC_XFRC;
-        hhcd->hc[chnum & 0xFU].urb_state = URB_DONE;
+        hhcd->hc[ch_num & 0xFU].state = HC_XFRC;
+        hhcd->hc[ch_num & 0xFU].urb_state = URB_DONE;
       }
 
       /*Clear Correct Transfer */
@@ -2069,9 +2075,9 @@
 
       /*TX COMPLETE*/
 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
-      hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+      hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
 #else
-      HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+      HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
 
     }
@@ -2082,36 +2088,36 @@
       {
         data_xfr = (uint16_t)(((USB_DRD_PMA_BUFF + phy_chnum)->TXBD & 0x03FF0000U) >> 16U);
 
-        if (hhcd->hc[chnum & 0xFU].xfer_len >= data_xfr)
+        if (hhcd->hc[ch_num & 0xFU].xfer_len >= data_xfr)
         {
-          hhcd->hc[chnum & 0xFU].xfer_len -= data_xfr;
+          hhcd->hc[ch_num & 0xFU].xfer_len -= data_xfr;
         }
         else
         {
-          hhcd->hc[chnum & 0xFU].xfer_len = 0U;
+          hhcd->hc[ch_num & 0xFU].xfer_len = 0U;
         }
 
         /* Transfer no yet finished only one packet of mps is transferred and ACKed from device */
-        if (hhcd->hc[chnum & 0xFU].xfer_len != 0U)
+        if (hhcd->hc[ch_num & 0xFU].xfer_len != 0U)
         {
           /* manage multiple Xfer */
-          hhcd->hc[chnum & 0xFU].xfer_buff += data_xfr;
-          hhcd->hc[chnum & 0xFU].xfer_count += data_xfr;
+          hhcd->hc[ch_num & 0xFU].xfer_buff += data_xfr;
+          hhcd->hc[ch_num & 0xFU].xfer_count += data_xfr;
 
           /* start a new transfer */
-          (void) USB_HC_StartXfer(hhcd->Instance, &hhcd->hc[chnum & 0xFU]);
+          (void) USB_HC_StartXfer(hhcd->Instance, &hhcd->hc[ch_num & 0xFU]);
         }
         else
         {
           /* Transfer complete */
-          hhcd->hc[chnum & 0xFU].xfer_count += data_xfr;
-          hhcd->hc[chnum & 0xFU].state = HC_XFRC;
-          hhcd->hc[chnum & 0xFU].urb_state = URB_DONE;
+          hhcd->hc[ch_num & 0xFU].xfer_count += data_xfr;
+          hhcd->hc[ch_num & 0xFU].state = HC_XFRC;
+          hhcd->hc[ch_num & 0xFU].urb_state = URB_DONE;
 
-          if ((hhcd->hc[chnum & 0xFU].ep_type == EP_TYPE_BULK) ||
-              (hhcd->hc[chnum & 0xFU].ep_type == EP_TYPE_INTR))
+          if ((hhcd->hc[ch_num & 0xFU].ep_type == EP_TYPE_BULK) ||
+              (hhcd->hc[ch_num & 0xFU].ep_type == EP_TYPE_INTR))
           {
-            hhcd->hc[chnum & 0xFU].toggle_out ^= 1U;
+            hhcd->hc[ch_num & 0xFU].toggle_out ^= 1U;
           }
         }
       }
@@ -2120,9 +2126,9 @@
                ((ch_reg & USB_CH_TX_STTX) == USB_CH_TX_NAK))
       {
         /* Update Channel status */
-        hhcd->hc[chnum & 0xFU].state = HC_NAK;
-        hhcd->hc[chnum & 0xFU].urb_state = URB_NOTREADY;
-        hhcd->hc[chnum & 0xFU].ErrCnt = 0U;
+        hhcd->hc[ch_num & 0xFU].state = HC_NAK;
+        hhcd->hc[ch_num & 0xFU].urb_state = URB_NOTREADY;
+        hhcd->hc[ch_num & 0xFU].ErrCnt = 0U;
 
         /* Get Channel register value */
         WregCh = *(__IO uint32_t *)(&(hhcd->Instance->CHEP0R) + phy_chnum);
@@ -2133,28 +2139,28 @@
         /* Update channel register Value */
         HCD_SET_CHANNEL(hhcd->Instance, phy_chnum, WregCh);
 
-        if (hhcd->hc[chnum & 0xFU].doublebuffer == 0U)
+        if (hhcd->hc[ch_num & 0xFU].doublebuffer == 0U)
         {
 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
-          hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+          hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
 #else
-          HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+          HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
         }
       }
       /* Check STALL Response */
       else if ((ch_reg & USB_CH_TX_STTX) == USB_CH_TX_STALL)
       {
-        (void) HAL_HCD_HC_Halt(hhcd, (uint8_t)chnum);
-        hhcd->hc[chnum & 0xFU].state = HC_STALL;
-        hhcd->hc[chnum & 0xFU].urb_state = URB_STALL;
+        (void) HAL_HCD_HC_Halt(hhcd, (uint8_t)ch_num);
+        hhcd->hc[ch_num & 0xFU].state = HC_STALL;
+        hhcd->hc[ch_num & 0xFU].urb_state = URB_STALL;
       }
 #if (USE_USB_DOUBLE_BUFFER == 1U)
       /* Check double buffer ACK in case of bulk transaction */
       else if ((ch_reg & USB_CH_TX_STTX) == USB_CH_TX_ACK_DBUF)
       {
         /* Double buffer management Bulk Out */
-        (void) HCD_HC_OUT_BulkDb(hhcd, chnum, (uint8_t)phy_chnum, ch_reg);
+        (void) HCD_HC_OUT_BulkDb(hhcd, ch_num, (uint8_t)phy_chnum, ch_reg);
       }
 #endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
       else
@@ -2165,38 +2171,38 @@
       if ((ch_reg & USB_CH_TX_STTX) != USB_CH_TX_NAK)
       {
 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
-        hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+        hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
 #else
-        HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+        HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
       }
 
       HCD_CLEAR_TX_CH_CTR(hhcd->Instance, phy_chnum);
-    }  /* end no isochronous */
+    }  /* End no isochronous */
   }
   /*------ Manage Transaction Error------*/
   else
   {
-    hhcd->hc[chnum & 0xFU].ErrCnt++;
-    if (hhcd->hc[chnum & 0xFU].ErrCnt > 3U)
+    hhcd->hc[ch_num & 0xFU].ErrCnt++;
+    if (hhcd->hc[ch_num & 0xFU].ErrCnt > 3U)
     {
       HCD_SET_CH_TX_STATUS(hhcd->Instance, phy_chnum, USB_CH_TX_DIS);
-      hhcd->hc[chnum & 0xFU].urb_state = URB_ERROR;
+      hhcd->hc[ch_num & 0xFU].urb_state = URB_ERROR;
     }
     else
     {
-      hhcd->hc[chnum & 0xFU].urb_state = URB_NOTREADY;
+      hhcd->hc[ch_num & 0xFU].urb_state = URB_NOTREADY;
     }
 
-    hhcd->hc[chnum & 0xFU].state = HC_XACTERR;
+    hhcd->hc[ch_num & 0xFU].state = HC_XACTERR;
 
-    /*Clear ERR_TX*/
+    /* Clear ERR_TX */
     HCD_CLEAR_TX_CH_ERR(hhcd->Instance, phy_chnum);
 
 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
-    hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+    hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
 #else
-    HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+    HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
   }
 }
@@ -2632,7 +2638,7 @@
   /* Get a FreePMA Address */
   pma_addr0 = HAL_HCD_GetFreePMA(hhcd, mps);
 
-  /* if there is no free space to allocate */
+  /* If there is no free space to allocate */
   if (pma_addr0 == 0xFFFFU)
   {
     return HAL_ERROR;
@@ -2647,7 +2653,8 @@
 
       if (hc->ep_num == 0U)
       {
-        hhcd->ep0_PmaAllocState = ch_num;
+        hhcd->ep0_PmaAllocState &= 0xFFF0U;
+        hhcd->ep0_PmaAllocState |= ch_num;
         hhcd->ep0_PmaAllocState |= (1U << 8);
       }
 
diff --git a/Src/stm32g0xx_ll_usb.c b/Src/stm32g0xx_ll_usb.c
index da131b2..38f18a9 100644
--- a/Src/stm32g0xx_ll_usb.c
+++ b/Src/stm32g0xx_ll_usb.c
@@ -1003,14 +1003,14 @@
   /* Clear All Pending Interrupt */
   USBx->ISTR = 0U;
 
+  /* Set the PullDown on the PHY */
+  USBx->BCDR |= USB_BCDR_DPPD;
+
   /* Enable Global interrupt */
   USBx->CNTR |= (USB_CNTR_CTRM | USB_CNTR_PMAOVRM | USB_CNTR_ERRM |
                  USB_CNTR_WKUPM | USB_CNTR_SUSPM | USB_CNTR_DCON |
                  USB_CNTR_SOFM | USB_CNTR_ESOFM | USB_CNTR_L1REQM);
 
-  /* Remove Reset */
-  USBx->CNTR &= ~USB_CNTR_USBRST;
-
   return HAL_OK;
 }
 
@@ -1126,7 +1126,7 @@
 
   wChRegVal = USB_DRD_GET_CHEP(USBx, phy_ch_num) & USB_CH_T_MASK;
 
-  /* initialize host Channel */
+  /* Initialize host Channel */
   switch (ep_type)
   {
     case EP_TYPE_CTRL:
@@ -1150,7 +1150,10 @@
       break;
   }
 
-  wChRegVal &= ~USB_CHEP_DEVADDR;
+  /* Clear device address, Endpoint number and Low Speed Endpoint fields */
+  wChRegVal &= ~(USB_CHEP_DEVADDR | USB_CHEP_ADDR | USB_CHEP_LSEP);
+
+  /* Set device address and Endpoint number assiciated to the channel */
   wChRegVal |= (((uint32_t)dev_address << USB_CHEP_DEVADDR_Pos) |
                 ((uint32_t)epnum & 0x0FU));
 
@@ -1163,7 +1166,7 @@
     wChRegVal |= USB_CHEP_LSEP;
   }
 
-  /* Set the dev_address & ep type */
+  /* Update the channel register value */
   USB_DRD_SET_CHEP(USBx, phy_ch_num, (wChRegVal | USB_CH_VTRX | USB_CH_VTTX));
 
   return ret;
@@ -1208,11 +1211,11 @@
       {
         (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_BULK_DBUFF_ENBALE);
 
-        /*Set the Double buffer counter*/
+        /* Set the Double buffer counter */
         USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 0U, len);
         USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 0U, len);
       }
-      else  /* switch to single buffer mode */
+      else  /* Switch to single buffer mode */
       {
         (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_BULK_DBUFF_DISABLE);
 
@@ -1220,7 +1223,7 @@
         USB_DRD_SET_CHEP_RX_CNT(USBx, phy_ch_num, len);
       }
     }
-    else  /* isochronous */
+    else  /* Isochronous */
     {
       /* Set the Double buffer counter */
       USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 0U, len);
@@ -1228,12 +1231,12 @@
     }
 #endif /* USE_USB_DOUBLE_BUFFER */
 
-    /*Enable host channel */
-    USB_DRD_SET_CHEP_RX_STATUS(USBx, phy_ch_num, USB_CHEP_RX_STRX);
+    /* Enable host channel */
+    USB_DRD_SET_CHEP_RX_STATUS(USBx, phy_ch_num, USB_CH_RX_VALID);
   }
   else   /* Out Channel */
   {
-    /* Multi packet transfer*/
+    /* Multi packet transfer */
     if (hc->xfer_len > hc->max_packet)
     {
       len = hc->max_packet;
@@ -1243,13 +1246,13 @@
       len = hc->xfer_len;
     }
 
-    /* configure and validate Tx endpoint */
+    /* Configure and validate Tx endpoint */
     if (hc->doublebuffer == 0U)
     {
       USB_WritePMA(USBx, hc->xfer_buff, hc->pmaadress, (uint16_t)len);
       USB_DRD_SET_CHEP_TX_CNT(USBx, phy_ch_num, (uint16_t)len);
 
-      /*SET PID SETUP  */
+      /* SET PID SETUP  */
       if ((hc->data_pid) == HC_PID_SETUP)
       {
         USB_DRD_CHEP_TX_SETUP(USBx,  phy_ch_num);