Some driver fixes for libpayload:

- fix minor bug in serial driver.
- latest USB stack fixes
- fix dead store in options.c

Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Patrick Georgi <patrick.georgi@coresystems.de>



git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4239 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Stefan Reinauer 2009-04-30 16:46:12 +00:00 committed by Stefan Reinauer
parent b5fb0c5c4e
commit d233f363c1
6 changed files with 35 additions and 9 deletions

View File

@ -55,8 +55,6 @@ static int get_cmos_value(u32 bitnum, u32 len, void *valptr)
u32 addr, bit;
u8 reg8;
value = valptr;
/* Convert to byte borders */
addr=(bitnum / 8);
bit=(bitnum % 8);
@ -85,7 +83,6 @@ int get_option(void *dest, char *name)
int len = strnlen(name, CMOS_MAX_NAME_LENGTH);
/* cmos entries are located right after the option table */
cmos_entry=(struct cb_cmos_entries*)((unsigned char *)option_table + option_table->header_length);
for ( cmos_entry = (struct cb_cmos_entries*)((unsigned char *)option_table + option_table->header_length);
cmos_entry->tag == CB_TAG_OPTION;

View File

@ -55,7 +55,7 @@ void serial_hardware_init(int port, int speed, int word_bits, int parity, int st
outb(DIVISOR(speed) >> 8 & 0xFF, port + 1);
/* Restore the previous value of the divisor. */
outb(reg &= ~0x80, port + 0x03);
outb(reg & ~0x80, port + 0x03);
}
static struct console_input_driver consin = {

View File

@ -63,7 +63,23 @@ uhci_dump (hci_t *controller)
static void
td_dump (td_t *td)
{
printf ("%x packet (at %lx) to %x.%x failed\n", td->pid,
char td_value[3];
char *td_type;
switch (td->pid) {
case SETUP:
td_type="SETUP";
break;
case IN:
td_type="IN";
break;
case OUT:
td_type="OUT";
break;
default:
sprintf(td_value, "%x", td->pid);
td_type=td_value;
}
printf ("%s packet (at %lx) to %x.%x failed\n", td_type,
virt_to_phys (td), td->dev_addr, td->endp);
printf ("td (counter at %x) returns: ", td->counter);
printf (" bitstuff err: %x, ", td->status_bitstuff_err);
@ -493,6 +509,7 @@ uhci_create_intr_queue (endpoint_t *ep, int reqsize, int reqcount, int reqtiming
qh_t *qh = memalign(16, sizeof(qh_t));
qh->elementlinkptr.ptr = virt_to_phys(tds);
qh->elementlinkptr.queue_head = 0;
qh->elementlinkptr.terminate = 0;
intr_q *q = malloc(sizeof(intr_q));

View File

@ -281,7 +281,16 @@ set_address (hci_t *controller, int lowspeed)
int num = cd->bNumInterfaces;
interface_descriptor_t *current = interface;
printf ("device has %x interfaces\n", num);
num = (num > 5) ? 5 : num;
if (num>1)
printf ("NOTICE: This driver defaults to using the first interface.\n"
"This might be the wrong choice and lead to limited functionality\n"
"of the device. Please report such a case to coreboot@coreboot.org\n"
"as you might be the first.\n");
/* we limit to the first interface, as there was no need to
implement something else for the time being. If you need
it, see the SetInterface and GetInterface functions in
the USB specification, and adapt appropriately. */
num = (num > 1) ? 1 : num;
for (i = 0; i < num; i++) {
int j;
printf (" #%x has %x endpoints, interface %x:%x, protocol %x\n", current->bInterfaceNumber, current->bNumEndpoints, current->bInterfaceClass, current->bInterfaceSubClass, current->bInterfaceProtocol);

View File

@ -178,7 +178,7 @@ usb_hid_init (usbdev_t *dev)
dev->destroy = usb_hid_destroy;
dev->poll = usb_hid_poll;
int i;
for (i = 1; i <= dev->num_endp; i++) {
for (i = 0; i <= dev->num_endp; i++) {
if (dev->endpoints[i].endpoint == 0)
continue;
if (dev->endpoints[i].type != INTERRUPT)
@ -187,6 +187,7 @@ usb_hid_init (usbdev_t *dev)
continue;
break;
}
printf (" found endpoint %x for interrupt-in\n", i);
/* 20 buffers of 8 bytes, for every 10 msecs */
HID_INST(dev)->queue = dev->controller->create_intr_queue (&dev->endpoints[i], 8, 20, 10);
count = 0;

View File

@ -299,6 +299,8 @@ read_capacity (usbdev_t *dev)
memset (&cb, 0, sizeof (cb));
cb.command = 0x25; // read capacity
u8 buf[8];
printf ("Reading capacity of mass storage device.\n");
int count = 0;
while ((count++ < 20)
&&
@ -306,8 +308,8 @@ read_capacity (usbdev_t *dev)
(dev, cbw_direction_data_in, (u8 *) &cb, sizeof (cb), buf,
8) == 1));
if (count >= 20) {
// still not successful, assume 2tb in 512byte sectors, which is just the same garbage as any other number, but probably reasonable.
printf ("assuming 2TB in 512byte sectors as READ CAPACITY didn't answer.\n");
// still not successful, assume 2tb in 512byte sectors, which is just the same garbage as any other number, but probably more usable.
printf ("Assuming 2TB in 512byte sectors as READ CAPACITY didn't answer.\n");
MSC_INST (dev)->numblocks = 0xffffffff;
MSC_INST (dev)->blocksize = 512;
} else {