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. */
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.
*/