From d233f363c129dae2ba5fd7ac536cf92fb4c2dd6e Mon Sep 17 00:00:00 2001 From: Stefan Reinauer Date: Thu, 30 Apr 2009 16:46:12 +0000 Subject: 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 Acked-by: Patrick Georgi git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4239 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- payloads/libpayload/drivers/options.c | 3 --- payloads/libpayload/drivers/serial.c | 2 +- payloads/libpayload/drivers/usb/uhci.c | 19 ++++++++++++++++++- payloads/libpayload/drivers/usb/usb.c | 11 ++++++++++- payloads/libpayload/drivers/usb/usbhid.c | 3 ++- payloads/libpayload/drivers/usb/usbmsc.c | 6 ++++-- 6 files changed, 35 insertions(+), 9 deletions(-) (limited to 'payloads') diff --git a/payloads/libpayload/drivers/options.c b/payloads/libpayload/drivers/options.c index 8eed78ef17..a13b207a6d 100644 --- a/payloads/libpayload/drivers/options.c +++ b/payloads/libpayload/drivers/options.c @@ -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; diff --git a/payloads/libpayload/drivers/serial.c b/payloads/libpayload/drivers/serial.c index e58f0fc228..9fd7acf6be 100644 --- a/payloads/libpayload/drivers/serial.c +++ b/payloads/libpayload/drivers/serial.c @@ -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 = { diff --git a/payloads/libpayload/drivers/usb/uhci.c b/payloads/libpayload/drivers/usb/uhci.c index 34a6ec80d3..612fc7f199 100644 --- a/payloads/libpayload/drivers/usb/uhci.c +++ b/payloads/libpayload/drivers/usb/uhci.c @@ -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)); diff --git a/payloads/libpayload/drivers/usb/usb.c b/payloads/libpayload/drivers/usb/usb.c index 3820180cbc..d536d31d86 100644 --- a/payloads/libpayload/drivers/usb/usb.c +++ b/payloads/libpayload/drivers/usb/usb.c @@ -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); diff --git a/payloads/libpayload/drivers/usb/usbhid.c b/payloads/libpayload/drivers/usb/usbhid.c index b96bfe63f5..44be9ce8d9 100644 --- a/payloads/libpayload/drivers/usb/usbhid.c +++ b/payloads/libpayload/drivers/usb/usbhid.c @@ -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; diff --git a/payloads/libpayload/drivers/usb/usbmsc.c b/payloads/libpayload/drivers/usb/usbmsc.c index d9ffbd151e..ad4a10c146 100644 --- a/payloads/libpayload/drivers/usb/usbmsc.c +++ b/payloads/libpayload/drivers/usb/usbmsc.c @@ -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 { -- cgit v1.2.3