Some driver fixes for libpayload:
authorStefan Reinauer <stepan@coresystems.de>
Thu, 30 Apr 2009 16:46:12 +0000 (16:46 +0000)
committerStefan Reinauer <stepan@openbios.org>
Thu, 30 Apr 2009 16:46:12 +0000 (16:46 +0000)
- 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

payloads/libpayload/drivers/options.c
payloads/libpayload/drivers/serial.c
payloads/libpayload/drivers/usb/uhci.c
payloads/libpayload/drivers/usb/usb.c
payloads/libpayload/drivers/usb/usbhid.c
payloads/libpayload/drivers/usb/usbmsc.c

index 8eed78ef17d37572b11432d1ecbd7427ea42b5e5..a13b207a6d0521b834a38997719e64869fe1bbef 100644 (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;
index e58f0fc228463cbdaf0a4c927c56801e0411afa4..9fd7acf6be2d2d8b701ceca275e25aaeddc118cd 100644 (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 = {
index 34a6ec80d388a86e06b070981b635a248de3a3c8..612fc7f199a404f15d366904c423cd809c5674be 100644 (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));
index 3820180cbcc1636ca22464adb29043e2709be98f..d536d31d86770f7a263bc8a9de4f15d32fb5d897 100644 (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);
index b96bfe63f566040522babc7c413aa081f421d9df..44be9ce8d95f184f651bbdc99c86bc889349df4f 100644 (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;
index d9ffbd151e43c5ae4a5172b5a08a01e5859e0877..ad4a10c1469b33d8d09083fa510056e9bd65158e 100644 (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 {