altos/lpc: Stop sending SETUP IN when the requested size is reached
authorKeith Packard <keithp@keithp.com>
Thu, 19 Dec 2013 08:08:50 +0000 (00:08 -0800)
committerKeith Packard <keithp@keithp.com>
Thu, 19 Dec 2013 08:08:50 +0000 (00:08 -0800)
The host won't keep asking for SETUP IN packets once it has received
the amount of data requested, so check to see if we've sent that much
and flip back to IDLE state if so.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/lpc/ao_usb_lpc.c

index 713fbc53f599714c873cb3af99d7cf4a2a187698..686dc3a4bd8019d6c2e44251c1bbb10a01f586be 100644 (file)
@@ -58,6 +58,7 @@ static uint8_t        ao_usb_ep0_state;
 /* Pending EP0 IN data */
 static const uint8_t   *ao_usb_ep0_in_data;    /* Remaining data */
 static uint8_t                 ao_usb_ep0_in_len;      /* Remaining amount */
 /* Pending EP0 IN data */
 static const uint8_t   *ao_usb_ep0_in_data;    /* Remaining data */
 static uint8_t                 ao_usb_ep0_in_len;      /* Remaining amount */
+static uint16_t                ao_usb_ep0_in_max;      /* Requested amount from host */
 
 /* Temp buffer for smaller EP0 in data */
 static uint8_t ao_usb_ep0_in_buf[2];
 
 /* Temp buffer for smaller EP0 in data */
 static uint8_t ao_usb_ep0_in_buf[2];
@@ -380,10 +381,11 @@ ao_usb_ep0_flush(void)
        if (this_len > AO_USB_CONTROL_SIZE)
                this_len = AO_USB_CONTROL_SIZE;
 
        if (this_len > AO_USB_CONTROL_SIZE)
                this_len = AO_USB_CONTROL_SIZE;
 
-       if (this_len < AO_USB_CONTROL_SIZE)
-               ao_usb_ep0_state = AO_USB_EP0_IDLE;
-
        ao_usb_ep0_in_len -= this_len;
        ao_usb_ep0_in_len -= this_len;
+       ao_usb_ep0_in_max -= this_len;
+
+       if (this_len < AO_USB_CONTROL_SIZE || ao_usb_ep0_in_max == 0)
+               ao_usb_ep0_state = AO_USB_EP0_IDLE;
 
        debug_data ("Flush EP0 len %d:", this_len);
        memcpy(ao_usb_ep0_tx_buffer, ao_usb_ep0_in_data, this_len);
 
        debug_data ("Flush EP0 len %d:", this_len);
        memcpy(ao_usb_ep0_tx_buffer, ao_usb_ep0_in_data, this_len);
@@ -456,6 +458,7 @@ ao_usb_ep0_out_set(uint8_t *data, uint8_t len)
 static void
 ao_usb_ep0_in_start(uint16_t max)
 {
 static void
 ao_usb_ep0_in_start(uint16_t max)
 {
+       ao_usb_ep0_in_max = max;
        /* Don't send more than asked for */
        if (ao_usb_ep0_in_len > max)
                ao_usb_ep0_in_len = max;
        /* Don't send more than asked for */
        if (ao_usb_ep0_in_len > max)
                ao_usb_ep0_in_len = max;