From 0d02cdca46872fef27d5d2cd6ef1023eee40bb62 Mon Sep 17 00:00:00 2001 From: Chew Zeh Yang Date: Wed, 27 Nov 2024 16:07:59 +0800 Subject: [PATCH] drivers: udc_ambiq: defer enqueue event if the endpoint is stalled Ambiq USB HAL do not expect endpoint transaction request when an endpoint is stalled. This commit addresses this behavior in shim driver by checking for endpoint's stall status when enqueue request is received, and defer it until endpoint stall is cleared. Signed-off-by: Chew Zeh Yang --- drivers/usb/udc/udc_ambiq.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/usb/udc/udc_ambiq.c b/drivers/usb/udc/udc_ambiq.c index 887cb64cf6b..ffc84c0413d 100644 --- a/drivers/usb/udc/udc_ambiq.c +++ b/drivers/usb/udc/udc_ambiq.c @@ -265,7 +265,10 @@ static int udc_ambiq_ep_enqueue(const struct device *dev, struct udc_ep_config * udc_ambiq_ep_xfer_complete_callback(dev, USB_CONTROL_EP_IN, 0, 0, NULL); return 0; } - k_msgq_put(&drv_msgq, &evt, K_NO_WAIT); + + if (!ep_cfg->stat.halted) { + k_msgq_put(&drv_msgq, &evt, K_NO_WAIT); + } return 0; } @@ -299,6 +302,9 @@ static int udc_ambiq_ep_set_halt(const struct device *dev, struct udc_ep_config LOG_DBG("Halt ep 0x%02x", ep_cfg->addr); am_hal_usb_ep_stall(priv->usb_handle, ep_cfg->addr); + if (USB_EP_GET_IDX(ep_cfg->addr)) { + ep_cfg->stat.halted = true; + } return 0; } @@ -311,6 +317,17 @@ static int udc_ambiq_ep_clear_halt(const struct device *dev, struct udc_ep_confi am_hal_usb_ep_clear_stall(priv->usb_handle, ep_cfg->addr); + ep_cfg->stat.halted = false; + + /* Resume queued transfer if any */ + if (udc_buf_peek(dev, ep_cfg->addr)) { + struct udc_ambiq_event evt = { + .ep = ep_cfg->addr, + .type = UDC_AMBIQ_EVT_XFER, + }; + k_msgq_put(&drv_msgq, &evt, K_NO_WAIT); + } + return 0; }