mirror of https://gerrit.osmocom.org/simtrace2
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:
parent
81f4ef7750
commit
5b136021d8
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue