diff --git a/bus/usb/serial/pl2303.c b/bus/usb/serial/pl2303.c index ae1a4c1b3..e2dcd606e 100644 --- a/bus/usb/serial/pl2303.c +++ b/bus/usb/serial/pl2303.c @@ -127,17 +127,26 @@ real_config (struct grub_serial_port *port) static int pl2303_hw_fetch (struct grub_serial_port *port) { - char cc; grub_usb_err_t err; real_config (port); + if (port->bufstart < port->bufend) + return port->buf[port->bufstart++]; + err = grub_usb_bulk_read_timeout (port->usbdev, port->in_endp->endp_addr, - 1, &cc, 10); + sizeof (port->buf), port->buf, 10); if (err != GRUB_USB_ERR_NONE) return -1; - return cc; + port->bufstart = 0; + /* FIXME: nearly always only one byte is transfered. + It happens however that more are transfered. + Setting sizeof (port->buf) to 1 leads code to stop reading after + such transfer. */ + port->bufend = 1; + + return port->buf[port->bufstart++]; } /* Put a character. */ diff --git a/include/grub/serial.h b/include/grub/serial.h index fd601a6d9..a7d37c7de 100644 --- a/include/grub/serial.h +++ b/include/grub/serial.h @@ -67,6 +67,8 @@ struct grub_serial_port struct grub_serial_driver *driver; struct grub_serial_config config; int configured; + char buf[64]; + int bufstart, bufend; /* This should be void *data but since serial is useful as an early console when malloc isn't available it's a union. */