Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 34 additions & 18 deletions drivers/usb/udc/udc_dwc2.c
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,11 @@ static int dwc2_ctrl_feed_dout(const struct device *dev, const size_t length)
return -ENOMEM;
}

if (dwc2_in_buffer_dma_mode(dev)) {
/* Get rid of all dirty cache lines */
sys_cache_data_invd_range(buf->data, net_buf_tailroom(buf));
}

udc_buf_put(ep_cfg, buf);
atomic_set_bit(&priv->xfer_new, 16);
k_event_post(&priv->drv_evt, BIT(DWC2_DRV_EVT_XFER));
Expand Down Expand Up @@ -589,8 +594,6 @@ static int dwc2_tx_fifo_write(const struct device *dev,

sys_write32((uint32_t)buf->data,
(mem_addr_t)&base->in_ep[ep_idx].diepdma);

sys_cache_data_flush_range(buf->data, len);
}

diepctl = sys_read32(diepctl_reg);
Expand Down Expand Up @@ -790,8 +793,6 @@ static void dwc2_prep_rx(const struct device *dev, struct net_buf *buf,

sys_write32((uint32_t)data,
(mem_addr_t)&base->out_ep[ep_idx].doepdma);

sys_cache_data_invd_range(data, xfersize);
}

sys_write32(doepctl, doepctl_reg);
Expand Down Expand Up @@ -968,6 +969,10 @@ static inline int dwc2_handle_evt_dout(const struct device *dev,
return -ENODATA;
}

if (dwc2_in_buffer_dma_mode(dev)) {
sys_cache_data_invd_range(buf->data, buf->len);
}

udc_ep_set_busy(cfg, false);

if (cfg->addr == USB_CONTROL_EP_OUT) {
Expand Down Expand Up @@ -1743,20 +1748,11 @@ static int udc_dwc2_ep_deactivate(const struct device *dev,
dxepctl_reg = dwc2_get_dxepctl_reg(dev, cfg->addr);
}

dxepctl = sys_read32(dxepctl_reg);

if (dxepctl & USB_DWC2_DEPCTL_USBACTEP) {
LOG_DBG("Disable ep 0x%02x DxEPCTL%u %x",
cfg->addr, ep_idx, dxepctl);

udc_dwc2_ep_disable(dev, cfg, false, true);
udc_dwc2_ep_disable(dev, cfg, false, true);

dxepctl = sys_read32(dxepctl_reg);
dxepctl &= ~USB_DWC2_DEPCTL_USBACTEP;
} else {
LOG_WRN("ep 0x%02x is not active DxEPCTL%u %x",
cfg->addr, ep_idx, dxepctl);
}
dxepctl = sys_read32(dxepctl_reg);
LOG_DBG("Disable ep 0x%02x DxEPCTL%u %x", cfg->addr, ep_idx, dxepctl);
dxepctl &= ~USB_DWC2_DEPCTL_USBACTEP;

if (USB_EP_DIR_IS_IN(cfg->addr) && udc_mps_ep_size(cfg) != 0U &&
ep_idx != 0U) {
Expand Down Expand Up @@ -1835,6 +1831,17 @@ static int udc_dwc2_ep_enqueue(const struct device *dev,
struct udc_dwc2_data *const priv = udc_get_private(dev);

LOG_DBG("%p enqueue %x %p", dev, cfg->addr, buf);

if (dwc2_in_buffer_dma_mode(dev)) {
if (USB_EP_DIR_IS_IN(cfg->addr)) {
/* Write all dirty cache lines to memory */
sys_cache_data_flush_range(buf->data, buf->len);
} else {
/* Get rid of all dirty cache lines */
sys_cache_data_invd_range(buf->data, net_buf_tailroom(buf));
}
}

udc_buf_put(cfg, buf);

if (!cfg->stat.halted) {
Expand All @@ -1861,6 +1868,13 @@ static int udc_dwc2_ep_dequeue(const struct device *dev,
udc_dwc2_ep_disable(dev, cfg, false, true);

buf = udc_buf_get_all(cfg);

if (dwc2_in_buffer_dma_mode(dev) && USB_EP_DIR_IS_OUT(cfg->addr)) {
for (struct net_buf *iter = buf; iter; iter = iter->frags) {
sys_cache_data_invd_range(iter->data, iter->len);
}
}

if (buf) {
udc_submit_ep_event(dev, buf, -ECONNABORTED);
}
Expand Down Expand Up @@ -2820,7 +2834,9 @@ static inline void dwc2_handle_out_xfercompl(const struct device *dev,
}

if (dwc2_in_buffer_dma_mode(dev) && bcnt) {
sys_cache_data_invd_range(net_buf_tail(buf), bcnt);
/* Update just the length, cache will be invalidated in thread
* context after transfer if finished or cancelled.
*/
net_buf_add(buf, bcnt);
}

Expand Down
7 changes: 7 additions & 0 deletions subsys/usb/device_next/class/Kconfig.msc
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@ config USBD_MSC_SCSI_BUFFER_SIZE
Buffer size must be able to hold at least one sector. All LUNs within
single instance share the SCSI buffer.

config USBD_MSC_DOUBLE_BUFFERING
bool "SCSI double buffering"
default y
help
Allocate two SCSI buffers instead of one to increase throughput by
using one buffer by disk subsystem and one by USB at the same time.

module = USBD_MSC
module-str = usbd msc
default-count = 1
Expand Down
Loading
Loading