/*
* 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
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);
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;
}
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
return port;
}
-// no change
+ // no change
return -1;
}
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++)