Commit 2bcf4e9f authored by Jason Andryuk's avatar Jason Andryuk Committed by Gerd Hoffmann
Browse files

usb-serial: Move USB_TOKEN_IN into a helper function



We'll be adding a loop, so move the code into a helper function.  breaks
are replaced with returns.  While making this change, add braces to
single line if statements to comply with coding style and keep
checkpatch happy.

Signed-off-by: default avatarJason Andryuk <jandryuk@gmail.com>
Message-id: 20200316174610.115820-2-jandryuk@gmail.com
Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
parent 61c265f0
Loading
Loading
Loading
Loading
+46 −34
Original line number Diff line number Diff line
@@ -358,35 +358,16 @@ static void usb_serial_handle_control(USBDevice *dev, USBPacket *p,
    }
}

static void usb_serial_handle_data(USBDevice *dev, USBPacket *p)
static void usb_serial_token_in(USBSerialState *s, USBPacket *p)
{
    USBSerialState *s = (USBSerialState *)dev;
    uint8_t devep = p->ep->nr;
    struct iovec *iov;
    int first_len, len;
    uint8_t header[2];
    int i, first_len, len;

    switch (p->pid) {
    case USB_TOKEN_OUT:
        if (devep != 2)
            goto fail;
        for (i = 0; i < p->iov.niov; i++) {
            iov = p->iov.iov + i;
            /* XXX this blocks entire thread. Rewrite to use
             * qemu_chr_fe_write and background I/O callbacks */
            qemu_chr_fe_write_all(&s->cs, iov->iov_base, iov->iov_len);
        }
        p->actual_length = p->iov.size;
        break;

    case USB_TOKEN_IN:
        if (devep != 1)
            goto fail;
    first_len = RECV_BUF - s->recv_ptr;
    len = p->iov.size;
    if (len <= 2) {
        p->status = USB_RET_NAK;
            break;
        return;
    }
    header[0] = usb_get_modem_lines(s) | 1;
    /* We do not have the uart details */
@@ -395,25 +376,56 @@ static void usb_serial_handle_data(USBDevice *dev, USBPacket *p)
        s->event_trigger &= ~FTDI_BI;
        header[1] = FTDI_BI;
        usb_packet_copy(p, header, 2);
            break;
        return;
    } else {
        header[1] = 0;
    }
    len -= 2;
        if (len > s->recv_used)
    if (len > s->recv_used) {
        len = s->recv_used;
    }
    if (!len) {
        p->status = USB_RET_NAK;
            break;
        return;
    }
        if (first_len > len)
    if (first_len > len) {
        first_len = len;
    }
    usb_packet_copy(p, header, 2);
    usb_packet_copy(p, s->recv_buf + s->recv_ptr, first_len);
        if (len > first_len)
    if (len > first_len) {
        usb_packet_copy(p, s->recv_buf, len - first_len);
    }
    s->recv_used -= len;
    s->recv_ptr = (s->recv_ptr + len) % RECV_BUF;

    return;
}

static void usb_serial_handle_data(USBDevice *dev, USBPacket *p)
{
    USBSerialState *s = (USBSerialState *)dev;
    uint8_t devep = p->ep->nr;
    struct iovec *iov;
    int i;

    switch (p->pid) {
    case USB_TOKEN_OUT:
        if (devep != 2)
            goto fail;
        for (i = 0; i < p->iov.niov; i++) {
            iov = p->iov.iov + i;
            /* XXX this blocks entire thread. Rewrite to use
             * qemu_chr_fe_write and background I/O callbacks */
            qemu_chr_fe_write_all(&s->cs, iov->iov_base, iov->iov_len);
        }
        p->actual_length = p->iov.size;
        break;

    case USB_TOKEN_IN:
        if (devep != 1)
            goto fail;
        usb_serial_token_in(s, p);
        break;

    default: