fix losing pl2303 input at the price of losing some input bytes sometimes.

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-07-19 00:12:59 +02:00
parent 9685412782
commit ac2534273b
2 changed files with 14 additions and 3 deletions

View file

@ -127,17 +127,26 @@ real_config (struct grub_serial_port *port)
static int static int
pl2303_hw_fetch (struct grub_serial_port *port) pl2303_hw_fetch (struct grub_serial_port *port)
{ {
char cc;
grub_usb_err_t err; grub_usb_err_t err;
real_config (port); 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, 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) if (err != GRUB_USB_ERR_NONE)
return -1; 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. */ /* Put a character. */

View file

@ -67,6 +67,8 @@ struct grub_serial_port
struct grub_serial_driver *driver; struct grub_serial_driver *driver;
struct grub_serial_config config; struct grub_serial_config config;
int configured; int configured;
char buf[64];
int bufstart, bufend;
/* This should be void *data but since serial is useful as an early console /* This should be void *data but since serial is useful as an early console
when malloc isn't available it's a union. when malloc isn't available it's a union.
*/ */