libpayload: Drop usb_fatal()
[coreboot.git] / payloads / libpayload / drivers / usb / usbhub.c
index ce1523302d2cb00e2ea8c9063e4cd596c1f20bb7..08042a2b9fc6c02fee61368d79c15c81424d50e8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the libpayload project.
  *
- * Copyright (C) 2008 coresystems GmbH
+ * Copyright (C) 2008-2010 coresystems GmbH
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -53,9 +53,7 @@ usb_hub_destroy (usbdev_t *dev)
 static void
 usb_hub_scanport (usbdev_t *dev, int port)
 {
-       int newdev;
        unsigned short buf[2];
-       usbdev_t *newdev_t;
 
        get_status (dev, port, DR_PORT, 4, buf);
        int portstatus = ((buf[0] & 1) == 0);
@@ -67,9 +65,7 @@ usb_hub_scanport (usbdev_t *dev, int port)
                int devno = HUB_INST (dev)->ports[port];
                if (devno == -1)
                        fatal ("FATAL: illegal devno!\n");
-               dev->controller->devices[devno].destroy (&dev->controller->
-                                                        devices[devno]);
-               init_device_entry (dev->controller, devno);
+               usb_detach_device(dev->controller, devno);
                HUB_INST (dev)->ports[port] = -1;
                return;
        }
@@ -78,19 +74,15 @@ usb_hub_scanport (usbdev_t *dev, int port)
        mdelay (20);
 
        get_status (dev, port, DR_PORT, 4, buf);
-       int lowspeed = (buf[0] >> 9) & 1;
 
-       newdev = set_address (dev->controller, lowspeed);
-       if (newdev == -1)
-               return;
-       newdev_t = &dev->controller->devices[newdev];
-
-       HUB_INST (dev)->ports[port] = newdev;
-       newdev_t->address = newdev;
-       newdev_t->hub = dev->address;
-       newdev_t->port = port;
-       // determine responsible driver
-       newdev_t->init (newdev_t);
+       /* bit  10  9
+        *      0   0  full speed
+        *      0   1  low speed
+        *      1   0  high speed
+        */
+       int speed = ((buf[0] >> 9) & 3) ;
+
+       HUB_INST (dev)->ports[port] = usb_attach_device(dev->controller, dev->address, port, speed);
 }
 
 static int
@@ -107,7 +99,7 @@ usb_hub_report_port_changes (usbdev_t *dev)
                        return port;
        }
 
-// no change
+       // no change
        return -1;
 }
 
@@ -142,15 +134,17 @@ usb_hub_init (usbdev_t *dev)
 
        dev->data = malloc (sizeof (usbhub_inst_t));
 
-       HUB_INST (dev)->descriptor =
-               (hub_descriptor_t *) get_descriptor (dev,
-                                                    gen_bmRequestType
-                                                    (device_to_host,
-                                                     class_type, dev_recp),
-                                                    0x29, 0, 0);
+       if (!dev->data)
+               fatal("Not enough memory for USB hub.\n");
+
+       HUB_INST (dev)->descriptor = (hub_descriptor_t *) get_descriptor(dev,
+               gen_bmRequestType(device_to_host, class_type, dev_recp), 0x29, 0, 0);
        HUB_INST (dev)->num_ports = HUB_INST (dev)->descriptor->bNbrPorts;
        HUB_INST (dev)->ports =
                malloc (sizeof (int) * (HUB_INST (dev)->num_ports + 1));
+       if (! HUB_INST (dev)->ports)
+               fatal("Not enough memory for USB hub ports.\n");
+
        for (i = 1; i <= HUB_INST (dev)->num_ports; i++)
                HUB_INST (dev)->ports[i] = -1;
        for (i = 1; i <= HUB_INST (dev)->num_ports; i++)