host_communication: Send zero-length-packet on wMaxPacketSize

We need to send zero-length packets on bulk endpoints whenever the
transfer size is exactly a multiple of the wMaxPacketSize.

See USB 2.0 Specification Section 5.8.3 titled "Bulk Transfer Packet
Size constraints."

Change-Id: Ice3842399d5a5c4a18383860f81074497c6e7c9b
Closes: OS#4331
This commit is contained in:
Harald Welte 2019-12-15 23:55:15 +01:00
parent 81f4ef7750
commit 5b136021d8
3 changed files with 18 additions and 0 deletions

View File

@ -1077,6 +1077,14 @@ static inline uint8_t UDP_Read(uint8_t bEndpoint,
* Exported functions
*---------------------------------------------------------------------------*/
uint16_t USBD_GetEndpointSize(uint8_t bEndpoint)
{
Endpoint *pEndpoint = &(endpoints[bEndpoint]);
return pEndpoint->size;
}
/**
* USBD (UDP) interrupt handler
* Manages device resume, suspend, end of bus reset.

View File

@ -214,6 +214,8 @@ typedef void (*MblTransferCallback)(void *pArg,
* Exported functions
*------------------------------------------------------------------------------*/
extern uint16_t USBD_GetEndpointSize(uint8_t bEndpoint);
//extern void USBD_IrqHandler(void);
extern void USBD_Init(void);

View File

@ -33,10 +33,18 @@ static void usb_write_cb(uint8_t *arg, uint8_t status, uint32_t transferred,
{
struct msgb *msg = (struct msgb *) arg;
struct usb_buffered_ep *bep = msg->dst;
uint16_t ep_size = USBD_GetEndpointSize(bep->ep);
unsigned long x;
TRACE_DEBUG("%s (EP=0x%02x)\r\n", __func__, bep->ep);
if (((msgb_length(msg) % ep_size) == 0) && (transferred == ep_size)) {
/* terminate with ZLP; pass in 'msg' again as 'arg' so we get
* called the second time and proceed with usb_buf_free below */
USBD_Write(bep->ep, 0, 0, (TransferCallback) &usb_write_cb, msg);
return;
}
local_irq_save(x);
bep->in_progress--;
local_irq_restore(x);