Revision 50b7963e hw/usb.c

b/hw/usb.c
63 63
   protocol)
64 64
*/
65 65

  
66
#define SETUP_STATE_IDLE 0
67
#define SETUP_STATE_DATA 1
68
#define SETUP_STATE_ACK  2
66
#define SETUP_STATE_IDLE  0
67
#define SETUP_STATE_SETUP 1
68
#define SETUP_STATE_DATA  2
69
#define SETUP_STATE_ACK   3
69 70

  
70 71
static int do_token_setup(USBDevice *s, USBPacket *p)
71 72
{
......
86 87
    if (s->setup_buf[0] & USB_DIR_IN) {
87 88
        ret = s->info->handle_control(s, p, request, value, index,
88 89
                                      s->setup_len, s->data_buf);
90
        if (ret == USB_RET_ASYNC) {
91
             s->setup_state = SETUP_STATE_SETUP;
92
             return USB_RET_ASYNC;
93
        }
89 94
        if (ret < 0)
90 95
            return ret;
91 96

  
......
241 246
    }
242 247
}
243 248

  
249
/* ctrl complete function for devices which use usb_generic_handle_packet and
250
   may return USB_RET_ASYNC from their handle_control callback. Device code
251
   which does this *must* call this function instead of the normal
252
   usb_packet_complete to complete their async control packets. */
253
void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p)
254
{
255
    if (p->len < 0) {
256
        s->setup_state = SETUP_STATE_IDLE;
257
    }
258

  
259
    switch (s->setup_state) {
260
    case SETUP_STATE_SETUP:
261
        if (p->len < s->setup_len) {
262
            s->setup_len = p->len;
263
        }
264
        s->setup_state = SETUP_STATE_DATA;
265
        p->len = 8;
266
        break;
267

  
268
    case SETUP_STATE_ACK:
269
        s->setup_state = SETUP_STATE_IDLE;
270
        p->len = 0;
271
        break;
272

  
273
    default:
274
        break;
275
    }
276
    usb_packet_complete(s, p);
277
}
278

  
244 279
/* XXX: fix overflow */
245 280
int set_usb_string(uint8_t *buf, const char *str)
246 281
{

Also available in: Unified diff