static void do_token_in(USBDevice *s, USBPacket *p)

{

    int request, value, index;



    assert(p->ep->nr == 0);



    request = (s->setup_buf[0] << 8) | s->setup_buf[1];

    value   = (s->setup_buf[3] << 8) | s->setup_buf[2];

    index   = (s->setup_buf[5] << 8) | s->setup_buf[4];

 

    switch(s->setup_state) {

    case SETUP_STATE_ACK:

        if (!(s->setup_buf[0] & USB_DIR_IN)) {

            usb_device_handle_control(s, p, request, value, index,

                                      s->setup_len, s->data_buf);

            if (p->status == USB_RET_ASYNC) {

                return;

            }

            s->setup_state = SETUP_STATE_IDLE;

            p->actual_length = 0;

        }

        break;



    case SETUP_STATE_DATA:

        if (s->setup_buf[0] & USB_DIR_IN) {

            int len = s->setup_len - s->setup_index;

            if (len > p->iov.size) {

                len = p->iov.size;

            }

            usb_packet_copy(p, s->data_buf + s->setup_index, len);

            s->setup_index += len;

            if (s->setup_index >= s->setup_len) {

                s->setup_state = SETUP_STATE_ACK;

            }

            return;

        }

        s->setup_state = SETUP_STATE_IDLE;

        p->status = USB_RET_STALL;

        break;



    default:

        p->status = USB_RET_STALL;

    }

}

static void do_token_in(USBDevice *s, USBPacket *p)

{

    int request, value, index;



    assert(p->ep->nr == 0);



    request = (s->setup_buf[0] << 8) | s->setup_buf[1];

    value   = (s->setup_buf[3] << 8) | s->setup_buf[2];

    index   = (s->setup_buf[5] << 8) | s->setup_buf[4];

 

    switch(s->setup_state) {

    case SETUP_STATE_ACK:

        if (!(s->setup_buf[0] & USB_DIR_IN)) {

            usb_device_handle_control(s, p, request, value, index,

                                      s->setup_len, s->data_buf);

            if (p->status == USB_RET_ASYNC) {

                return;

            }

            s->setup_state = SETUP_STATE_IDLE;

            p->actual_length = 0;

        }

        break;



    case SETUP_STATE_DATA:

        if (s->setup_buf[0] & USB_DIR_IN) {

            int len = s->setup_len - s->setup_index;

            if (len > p->iov.size) {

                len = p->iov.size;

            }

            usb_packet_copy(p, s->data_buf + s->setup_index, len);

            s->setup_index += len;

            if (s->setup_index >= s->setup_len) {

                s->setup_state = SETUP_STATE_ACK;

            }

            return;

        }

        s->setup_state = SETUP_STATE_IDLE;

        p->status = USB_RET_STALL;

        break;



    default:

        p->status = USB_RET_STALL;

    }

}

static void FUNC_0(USBDevice *VAR_0, USBPacket *VAR_1)

{

    int VAR_2, VAR_3, VAR_4;



    assert(VAR_1->ep->nr == 0);



    VAR_2 = (VAR_0->setup_buf[0] << 8) | VAR_0->setup_buf[1];

    VAR_3   = (VAR_0->setup_buf[3] << 8) | VAR_0->setup_buf[2];

    VAR_4   = (VAR_0->setup_buf[5] << 8) | VAR_0->setup_buf[4];

 

    switch(VAR_0->setup_state) {

    case SETUP_STATE_ACK:

        if (!(VAR_0->setup_buf[0] & USB_DIR_IN)) {

            usb_device_handle_control(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4,

                                      VAR_0->setup_len, VAR_0->data_buf);

            if (VAR_1->status == USB_RET_ASYNC) {

                return;

            }

            VAR_0->setup_state = SETUP_STATE_IDLE;

            VAR_1->actual_length = 0;

        }

        break;



    case SETUP_STATE_DATA:

        if (VAR_0->setup_buf[0] & USB_DIR_IN) {

            int VAR_5 = VAR_0->setup_len - VAR_0->setup_index;

            if (VAR_5 > VAR_1->iov.size) {

                VAR_5 = VAR_1->iov.size;

            }

            usb_packet_copy(VAR_1, VAR_0->data_buf + VAR_0->setup_index, VAR_5);

            VAR_0->setup_index += VAR_5;

            if (VAR_0->setup_index >= VAR_0->setup_len) {

                VAR_0->setup_state = SETUP_STATE_ACK;

            }

            return;

        }

        VAR_0->setup_state = SETUP_STATE_IDLE;

        VAR_1->status = USB_RET_STALL;

        break;



    default:

        VAR_1->status = USB_RET_STALL;

    }

}

static void FUNC_0(USBDevice *VAR_0, USBPacket *VAR_1)
{ int VAR_2, VAR_3, VAR_4; assert(VAR_1->ep->nr == 0); VAR_2 = (VAR_0->setup_buf[0] << 8) | VAR_0->setup_buf[1]; VAR_3   = (VAR_0->setup_buf[3] << 8) | VAR_0->setup_buf[2]; VAR_4   = (VAR_0->setup_buf[5] << 8) | VAR_0->setup_buf[4]; switch(VAR_0->setup_state) { case SETUP_STATE_ACK:
if (!(VAR_0->setup_buf[0] & USB_DIR_IN)) { usb_device_handle_control(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4,
VAR_0->setup_len, VAR_0->data_buf); if (VAR_1->status == USB_RET_ASYNC) { return; } VAR_0->setup_state = SETUP_STATE_IDLE; VAR_1->actual_length = 0; } break; case SETUP_STATE_DATA:
if (VAR_0->setup_buf[0] & USB_DIR_IN) { int VAR_5 = VAR_0->setup_len - VAR_0->setup_index; if (VAR_5 > VAR_1->iov.size) { VAR_5 = VAR_1->iov.size; } usb_packet_copy(VAR_1, VAR_0->data_buf + VAR_0->setup_index, VAR_5); VAR_0->setup_index += VAR_5; if (VAR_0->setup_index >= VAR_0->setup_len) { VAR_0->setup_state = SETUP_STATE_ACK; } return; } VAR_0->setup_state = SETUP_STATE_IDLE; VAR_1->status = USB_RET_STALL; break; default:
VAR_1->status = USB_RET_STALL; } }