Changeset eeca8a6 in mainline for uspace/lib/usbhost/src
- Timestamp:
- 2018-01-16T19:22:58Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4603b35
- Parents:
- 47e9494
- Location:
- uspace/lib/usbhost/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/src/bus.c
r47e9494 reeca8a6 60 60 fibril_mutex_initialize(&bus->guard); 61 61 bus->device_size = device_size; 62 bus->default_address_speed = USB_SPEED_MAX;63 62 } 64 63 … … 495 494 * The speed is then used for devices enumerated while the address is reserved. 496 495 */ 497 int bus_reserve_default_address(bus_t *bus, usb_speed_t speed)496 int bus_reserve_default_address(bus_t *bus, device_t *dev) 498 497 { 499 498 assert(bus); 500 499 500 int err; 501 501 fibril_mutex_lock(&bus->guard); 502 if (bus->default_address_speed != USB_SPEED_MAX) { 503 fibril_mutex_unlock(&bus->guard); 504 return EAGAIN; 502 if (bus->default_address_owner != NULL) { 503 err = (bus->default_address_owner == dev) ? EINVAL : EAGAIN; 505 504 } else { 506 bus->default_address_speed = speed; 507 fibril_mutex_unlock(&bus->guard); 508 return EOK; 509 } 505 bus->default_address_owner = dev; 506 err = EOK; 507 } 508 fibril_mutex_unlock(&bus->guard); 509 return err; 510 510 } 511 511 … … 513 513 * Release the default address. 514 514 */ 515 void bus_release_default_address(bus_t *bus )515 void bus_release_default_address(bus_t *bus, device_t *dev) 516 516 { 517 517 assert(bus); 518 bus->default_address_speed = USB_SPEED_MAX; 518 519 fibril_mutex_lock(&bus->guard); 520 if (bus->default_address_owner != dev) { 521 usb_log_error("Device %d tried to release address, which is not reserved for it.", dev->address); 522 } else { 523 bus->default_address_owner = NULL; 524 } 525 fibril_mutex_unlock(&bus->guard); 519 526 } 520 527 -
uspace/lib/usbhost/src/ddf_helpers.c
r47e9494 reeca8a6 117 117 * 118 118 * @param fun DDF function of the device (hub) requesting the address. 119 * @param speed An USB speed of the device for which the address is reserved. 120 */ 121 static int reserve_default_address(ddf_fun_t *fun, usb_speed_t speed) 119 */ 120 static int reserve_default_address(ddf_fun_t *fun) 122 121 { 123 122 assert(fun); … … 128 127 assert(dev); 129 128 130 usb_log_debug("Device %d requested default address at %s speed", 131 dev->address, usb_str_speed(speed)); 132 return bus_reserve_default_address(hcd->bus, speed); 129 usb_log_debug("Device %d requested default address", dev->address); 130 return bus_reserve_default_address(hcd->bus, dev); 133 131 } 134 132 … … 148 146 149 147 usb_log_debug("Device %d released default address", dev->address); 150 bus_release_default_address(hcd->bus );148 bus_release_default_address(hcd->bus, dev); 151 149 152 150 return EOK; … … 157 155 * 158 156 * @param fun DDF function of the device (hub) requesting the address. 159 */ 160 static int device_enumerate(ddf_fun_t *fun, unsigned port) 157 * @param speed USB speed of the new device 158 */ 159 static int device_enumerate(ddf_fun_t *fun, unsigned port, usb_speed_t speed) 161 160 { 162 161 assert(fun); … … 170 169 int err; 171 170 172 usb_log_debug("Hub %d reported a new USBdevice on port: %u",173 hub->address, port);174 175 device_t *dev = hcd_ddf_fun_create(hcd );171 usb_log_debug("Hub %d reported a new %s device on port: %u", 172 hub->address, usb_str_speed(speed), port); 173 174 device_t *dev = hcd_ddf_fun_create(hcd, speed); 176 175 if (!dev) { 177 176 usb_log_error("Failed to create USB device function."); … … 181 180 dev->hub = hub; 182 181 dev->port = port; 182 dev->speed = speed; 183 183 184 184 if ((err = bus_device_enumerate(dev))) { … … 380 380 } 381 381 382 device_t *hcd_ddf_fun_create(hc_device_t *hc )382 device_t *hcd_ddf_fun_create(hc_device_t *hc, usb_speed_t speed) 383 383 { 384 384 /* Create DDF function for the new device */ … … 398 398 bus_device_init(dev, hc->bus); 399 399 dev->fun = fun; 400 dev->speed = speed; 400 401 return dev; 401 402 } … … 464 465 assert(hcd); 465 466 466 if ((err = bus_reserve_default_address(hcd->bus, USB_SPEED_MAX))) { 467 usb_log_error("Failed to reserve default address for roothub setup: %s", str_error(err)); 468 return err; 469 } 470 471 device_t *dev = hcd_ddf_fun_create(hcd); 467 device_t *dev = hcd_ddf_fun_create(hcd, USB_SPEED_MAX); 472 468 if (!dev) { 473 469 usb_log_error("Failed to create function for the root hub."); 474 goto err_default_address;470 return ENOMEM; 475 471 } 476 472 … … 488 484 } 489 485 490 bus_release_default_address(hcd->bus);491 486 return EOK; 492 487 … … 495 490 err_usb_dev: 496 491 hcd_ddf_fun_destroy(dev); 497 err_default_address:498 bus_release_default_address(hcd->bus);499 492 return err; 500 493 } -
uspace/lib/usbhost/src/usb2_bus.c
r47e9494 reeca8a6 190 190 usb2_bus_t *bus = bus_to_usb2_bus(dev->bus); 191 191 192 /* The speed of the new device was reported by the hub when reserving193 * default address.194 */195 dev->speed = bus->base.default_address_speed;196 192 usb_log_debug("Found new %s speed USB device.", usb_str_speed(dev->speed)); 197 193
Note:
See TracChangeset
for help on using the changeset viewer.