Skip to content

Commit 8617e46

Browse files
jfischer-nofabiobaltieri
authored andcommitted
drivers: udc: do not use the MPS value directly for the endpoint size
Instead, use the helper to get the size field from the MPS value. MPS value may contain information about additional transaction per microframe (bits 12..11). Signed-off-by: Johann Fischer <[email protected]>
1 parent 07bd625 commit 8617e46

File tree

9 files changed

+44
-33
lines changed

9 files changed

+44
-33
lines changed

drivers/usb/udc/udc_dwc2.c

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -314,14 +314,14 @@ static int dwc2_tx_fifo_write(const struct device *dev,
314314
len = buf->len;
315315
} else {
316316
uint32_t spcavail = dwc2_ftx_avail(dev, ep_idx);
317-
uint32_t spcperpkt = ROUND_UP(USB_MPS_EP_SIZE(cfg->mps), 4);
317+
uint32_t spcperpkt = ROUND_UP(udc_mps_ep_size(cfg), 4);
318318
uint32_t max_pkts, max_transfer;
319319

320320
/* Maximum number of packets that can fit in TxFIFO */
321321
max_pkts = spcavail / spcperpkt;
322322

323323
/* We can transfer up to max_pkts MPS packets and a short one */
324-
max_transfer = (max_pkts * USB_MPS_EP_SIZE(cfg->mps)) +
324+
max_transfer = (max_pkts * udc_mps_ep_size(cfg)) +
325325
(spcavail % spcperpkt);
326326

327327
/* If there is enough space for the transfer, there's no need
@@ -355,10 +355,10 @@ static int dwc2_tx_fifo_write(const struct device *dev,
355355
* Determine the number of packets for the current transfer;
356356
* if the pktcnt is too large, truncate the actual transfer length.
357357
*/
358-
pktcnt = DIV_ROUND_UP(len, USB_MPS_EP_SIZE(cfg->mps));
358+
pktcnt = DIV_ROUND_UP(len, udc_mps_ep_size(cfg));
359359
if (pktcnt > max_pktcnt) {
360360
pktcnt = ROUND_DOWN(max_pktcnt, (1 + addnl));
361-
len = pktcnt * USB_MPS_EP_SIZE(cfg->mps);
361+
len = pktcnt * udc_mps_ep_size(cfg);
362362
}
363363
} else {
364364
/* ZLP */
@@ -401,7 +401,7 @@ static int dwc2_tx_fifo_write(const struct device *dev,
401401
const uint8_t *src = buf->data;
402402

403403
while (pktcnt > 0) {
404-
uint32_t pktlen = MIN(len, USB_MPS_EP_SIZE(cfg->mps));
404+
uint32_t pktlen = MIN(len, udc_mps_ep_size(cfg));
405405

406406
for (uint32_t i = 0UL; i < pktlen; i += d) {
407407
uint32_t val = src[i];
@@ -504,7 +504,7 @@ static void dwc2_prep_rx(const struct device *dev, struct net_buf *buf,
504504

505505
xfersize = dwc2_rx_xfer_size(priv, cfg, buf);
506506

507-
pktcnt = DIV_ROUND_UP(xfersize, USB_MPS_EP_SIZE(cfg->mps));
507+
pktcnt = DIV_ROUND_UP(xfersize, udc_mps_ep_size(cfg));
508508
doeptsiz = usb_dwc2_set_deptsizn_pktcnt(pktcnt) |
509509
usb_dwc2_set_deptsizn_xfersize(xfersize);
510510
if (cfg->addr == USB_CONTROL_EP_OUT) {
@@ -887,8 +887,7 @@ static inline void dwc2_handle_rxflvl(const struct device *dev)
887887
break;
888888
}
889889

890-
if (((evt.bcnt % USB_MPS_EP_SIZE(ep_cfg->mps)) == 0) &&
891-
net_buf_tailroom(buf)) {
890+
if ((evt.bcnt % udc_mps_ep_size(ep_cfg)) == 0 && net_buf_tailroom(buf)) {
892891
uint32_t doeptsiz;
893892

894893
/* Prepare next read only when transfer finished */
@@ -1010,8 +1009,7 @@ static inline void dwc2_handle_out_xfercompl(const struct device *dev,
10101009

10111010
net_buf_add(buf, evt.bcnt);
10121011

1013-
if (((evt.bcnt % USB_MPS_EP_SIZE(ep_cfg->mps)) == 0) &&
1014-
net_buf_tailroom(buf)) {
1012+
if ((evt.bcnt % udc_mps_ep_size(ep_cfg)) == 0 && net_buf_tailroom(buf)) {
10151013
dwc2_prep_rx(dev, buf, ep_cfg, 0);
10161014
} else {
10171015
k_msgq_put(&drv_msgq, &evt, K_NO_WAIT);
@@ -1200,7 +1198,7 @@ static int dwc2_set_dedicated_fifo(const struct device *dev,
12001198
/* Keep everything but FIFO number */
12011199
tmp = *diepctl & ~USB_DWC2_DEPCTL_TXFNUM_MASK;
12021200

1203-
reqdep = DIV_ROUND_UP(USB_MPS_EP_SIZE(cfg->mps), 4U);
1201+
reqdep = DIV_ROUND_UP(udc_mps_ep_size(cfg), 4U);
12041202
if (priv->bufferdma) {
12051203
/* In DMA mode, TxFIFO capable of holding 2 packets is enough */
12061204
reqdep *= MIN(2, (1 + addnl));
@@ -1331,7 +1329,7 @@ static int udc_dwc2_ep_activate(const struct device *dev,
13311329
dxepctl_reg = (mem_addr_t)&base->in_ep[ep_idx].diepctl;
13321330
}
13331331

1334-
if (priv->bufferdma && (USB_MPS_EP_SIZE(cfg->mps) % 4)) {
1332+
if (priv->bufferdma && (udc_mps_ep_size(cfg) % 4)) {
13351333
/* TODO: In Buffer DMA mode, DMA will insert padding bytes in
13361334
* between packets if endpoint Max Packet Size is not multiple
13371335
* of 4 (DWORD) and single transfer spans across multiple
@@ -1351,7 +1349,7 @@ static int udc_dwc2_ep_activate(const struct device *dev,
13511349
dxepctl = sys_read32(dxepctl_reg);
13521350
/* Set max packet size */
13531351
dxepctl &= ~USB_DWC2_DEPCTL_MPS_MASK;
1354-
dxepctl |= usb_dwc2_set_depctl_mps(USB_MPS_EP_SIZE(cfg->mps));
1352+
dxepctl |= usb_dwc2_set_depctl_mps(udc_mps_ep_size(cfg));
13551353

13561354
/* Set endpoint type */
13571355
dxepctl &= ~USB_DWC2_DEPCTL_EPTYPE_MASK;
@@ -1375,7 +1373,7 @@ static int udc_dwc2_ep_activate(const struct device *dev,
13751373
return -EINVAL;
13761374
}
13771375

1378-
if (USB_EP_DIR_IS_IN(cfg->addr) && USB_MPS_EP_SIZE(cfg->mps) != 0U) {
1376+
if (USB_EP_DIR_IS_IN(cfg->addr) && udc_mps_ep_size(cfg) != 0U) {
13791377
int ret = dwc2_set_dedicated_fifo(dev, cfg, &dxepctl);
13801378

13811379
if (ret) {
@@ -1578,7 +1576,7 @@ static int udc_dwc2_ep_deactivate(const struct device *dev,
15781576
cfg->addr, ep_idx, dxepctl);
15791577
}
15801578

1581-
if (USB_EP_DIR_IS_IN(cfg->addr) && USB_MPS_EP_SIZE(cfg->mps) != 0U &&
1579+
if (USB_EP_DIR_IS_IN(cfg->addr) && udc_mps_ep_size(cfg) != 0U &&
15821580
ep_idx != 0U) {
15831581
dwc2_unset_dedicated_fifo(dev, cfg, &dxepctl);
15841582
}

drivers/usb/udc/udc_it82xx2.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ static int it82xx2_xfer_in_data(const struct device *dev, uint8_t ep, struct net
705705
it82xx2_usb_fifo_ctrl(dev, ep);
706706
}
707707

708-
len = MIN(buf->len, ep_cfg->mps);
708+
len = MIN(buf->len, udc_mps_ep_size(ep_cfg));
709709

710710
for (size_t i = 0; i < len; i++) {
711711
ff_regs[fifo_idx].ep_tx_fifo_data = buf->data[i];
@@ -874,7 +874,7 @@ static inline int work_handler_in(const struct device *dev, uint8_t ep)
874874
}
875875
ep_cfg = udc_get_ep_cfg(dev, ep);
876876

877-
net_buf_pull(buf, MIN(buf->len, ep_cfg->mps));
877+
net_buf_pull(buf, MIN(buf->len, udc_mps_ep_size(ep_cfg)));
878878

879879
it82xx2_usb_set_ep_ctrl(dev, ep, EP_DATA_SEQ_TOGGLE, true);
880880

@@ -1016,7 +1016,7 @@ static inline int work_handler_out(const struct device *dev, uint8_t ep)
10161016
}
10171017

10181018
ep_cfg = udc_get_ep_cfg(dev, ep);
1019-
if (len > ep_cfg->mps) {
1019+
if (len > udc_mps_ep_size(ep_cfg)) {
10201020
LOG_ERR("Failed to handle this packet due to the packet size");
10211021
return -ENOBUFS;
10221022
}

drivers/usb/udc/udc_kinetis.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,10 @@ static int usbfsotg_xfer_continue(const struct device *dev,
195195
}
196196

197197
if (USB_EP_DIR_IS_OUT(cfg->addr)) {
198-
len = MIN(net_buf_tailroom(buf), cfg->mps);
198+
len = MIN(net_buf_tailroom(buf), udc_mps_ep_size(cfg));
199199
data_ptr = net_buf_tail(buf);
200200
} else {
201-
len = MIN(buf->len, cfg->mps);
201+
len = MIN(buf->len, udc_mps_ep_size(cfg));
202202
data_ptr = buf->data;
203203
}
204204

@@ -243,7 +243,7 @@ static inline int usbfsotg_ctrl_feed_start(const struct device *dev,
243243
}
244244

245245
bd = usbfsotg_get_ebd(dev, cfg, false);
246-
length = MIN(net_buf_tailroom(buf), cfg->mps);
246+
length = MIN(net_buf_tailroom(buf), udc_mps_ep_size(cfg));
247247

248248
priv->out_buf[cfg->stat.odd] = buf;
249249
priv->busy[cfg->stat.odd] = true;
@@ -267,7 +267,7 @@ static inline int usbfsotg_ctrl_feed_start_next(const struct device *dev,
267267
}
268268

269269
bd = usbfsotg_get_ebd(dev, cfg, true);
270-
length = MIN(net_buf_tailroom(buf), cfg->mps);
270+
length = MIN(net_buf_tailroom(buf), udc_mps_ep_size(cfg));
271271

272272
priv->out_buf[!cfg->stat.odd] = buf;
273273
priv->busy[!cfg->stat.odd] = true;
@@ -594,7 +594,8 @@ static ALWAYS_INLINE void isr_handle_xfer_done(const struct device *dev,
594594
}
595595

596596
net_buf_add(buf, len);
597-
if (net_buf_tailroom(buf) >= ep_cfg->mps && len == ep_cfg->mps) {
597+
if (net_buf_tailroom(buf) >= udc_mps_ep_size(ep_cfg) &&
598+
len == udc_mps_ep_size(ep_cfg)) {
598599
if (ep == USB_CONTROL_EP_OUT) {
599600
usbfsotg_ctrl_feed_start(dev, buf);
600601
} else {

drivers/usb/udc/udc_mcux_ehci.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ static int udc_mcux_ep_enable(const struct device *dev,
571571
ep_init.zlt = 0U;
572572
ep_init.interval = cfg->interval;
573573
ep_init.endpointAddress = cfg->addr;
574-
ep_init.maxPacketSize = cfg->mps;
574+
ep_init.maxPacketSize = udc_mps_ep_size(cfg);
575575

576576
switch (cfg->attributes & USB_EP_TRANSFER_TYPE_MASK) {
577577
case USB_EP_TYPE_CONTROL:

drivers/usb/udc/udc_mcux_ip3511.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ static int udc_mcux_ep_enable(const struct device *dev,
571571
ep_init.zlt = 0U;
572572
ep_init.interval = cfg->interval;
573573
ep_init.endpointAddress = cfg->addr;
574-
ep_init.maxPacketSize = cfg->mps;
574+
ep_init.maxPacketSize = udc_mps_ep_size(cfg);
575575

576576
switch (cfg->attributes & USB_EP_TRANSFER_TYPE_MASK) {
577577
case USB_EP_TYPE_CONTROL:

drivers/usb/udc/udc_nrf.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ static int udc_nrf_ep_enable(const struct device *dev,
553553
uint16_t mps;
554554

555555
__ASSERT_NO_MSG(cfg);
556-
mps = (cfg->mps == 0) ? cfg->caps.mps : cfg->mps;
556+
mps = (udc_mps_ep_size(cfg) == 0) ? cfg->caps.mps : udc_mps_ep_size(cfg);
557557
nrf_usbd_common_ep_max_packet_size_set(cfg->addr, mps);
558558
nrf_usbd_common_ep_enable(cfg->addr);
559559
if (!NRF_USBD_EPISO_CHECK(cfg->addr)) {

drivers/usb/udc/udc_stm32.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ static int udc_stm32_ep_mem_config(const struct device *dev,
423423
const struct udc_stm32_config *cfg = dev->config;
424424
uint32_t size;
425425

426-
size = MIN(ep->mps, cfg->ep_mps);
426+
size = MIN(udc_mps_ep_size(ep), cfg->ep_mps);
427427

428428
if (!enable) {
429429
priv->occupied_mem -= size;
@@ -487,7 +487,7 @@ static int udc_stm32_ep_mem_config(const struct device *dev,
487487
return 0;
488488
}
489489

490-
words = MIN(ep->mps, cfg->ep_mps) / 4;
490+
words = MIN(udc_mps_ep_size(ep), cfg->ep_mps) / 4;
491491
words = (words <= 64) ? words * 2 : words;
492492

493493
if (!enable) {
@@ -667,8 +667,8 @@ static int udc_stm32_ep_enable(const struct device *dev,
667667
return ret;
668668
}
669669

670-
status = HAL_PCD_EP_Open(&priv->pcd, ep_cfg->addr, ep_cfg->mps,
671-
ep_type);
670+
status = HAL_PCD_EP_Open(&priv->pcd, ep_cfg->addr,
671+
udc_mps_ep_size(ep_cfg), ep_type);
672672
if (status != HAL_OK) {
673673
LOG_ERR("HAL_PCD_EP_Open failed(0x%02x), %d",
674674
ep_cfg->addr, (int)status);

drivers/usb/udc/udc_virtual.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ static int vrt_handle_out(const struct device *dev,
183183

184184
LOG_DBG("Handle data OUT, %zu | %zu", pkt->length, net_buf_tailroom(buf));
185185

186-
if (net_buf_tailroom(buf) == 0 || pkt->length < ep_cfg->mps) {
186+
if (net_buf_tailroom(buf) == 0 || pkt->length < udc_mps_ep_size(ep_cfg)) {
187187
buf = udc_buf_get(dev, ep);
188188

189189
if (ep == USB_CONTROL_EP_OUT) {
@@ -246,13 +246,13 @@ static int vrt_handle_in(const struct device *dev,
246246
}
247247

248248
LOG_DBG("Handle data IN, %zu | %u | %u",
249-
pkt->length, buf->len, ep_cfg->mps);
249+
pkt->length, buf->len, udc_mps_ep_size(ep_cfg));
250250
min_len = MIN(pkt->length, buf->len);
251251
memcpy(pkt->data, buf->data, min_len);
252252
net_buf_pull(buf, min_len);
253253
pkt->length = min_len;
254254

255-
if (buf->len == 0 || pkt->length < ep_cfg->mps) {
255+
if (buf->len == 0 || pkt->length < udc_mps_ep_size(ep_cfg)) {
256256
if (udc_ep_buf_has_zlp(buf)) {
257257
udc_ep_buf_clear_zlp(buf);
258258
goto continue_in;

include/zephyr/drivers/usb/udc.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,18 @@ static inline const void *udc_get_event_ctx(const struct device *dev)
726726
return data->event_ctx;
727727
}
728728

729+
/**
730+
* @brief Get endpoint size from UDC endpoint configuration
731+
*
732+
* @param[in] cfg Pointer to UDC endpoint configuration
733+
*
734+
* @return Endpoint size
735+
*/
736+
static inline uint16_t udc_mps_ep_size(const struct udc_ep_config *const cfg)
737+
{
738+
return USB_MPS_EP_SIZE(cfg->mps);
739+
}
740+
729741
/**
730742
* @}
731743
*/

0 commit comments

Comments
 (0)