Changeset 5e2b1ae6 in mainline
- Timestamp:
- 2018-01-07T01:54:45Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3dc3f99
- Parents:
- 63431db
- Location:
- uspace
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/uhci/hc.c
r63431db r5e2b1ae6 388 388 int hc_init_mem_structures(hc_t *instance, hc_device_t *hcd) 389 389 { 390 int err;391 390 assert(instance); 392 391 393 if ((err = usb2_bus_init(&instance->bus, BANDWIDTH_AVAILABLE_USB11))) 394 return err; 392 usb2_bus_init(&instance->bus, BANDWIDTH_AVAILABLE_USB11); 395 393 396 394 bus_t *bus = (bus_t *) &instance->bus; -
uspace/drv/bus/usb/usbhub/port.c
r63431db r5e2b1ae6 406 406 407 407 /* Reserve default address */ 408 while ((ret = usbhc_reserve_default_address(exch, speed)) == E NOENT) {408 while ((ret = usbhc_reserve_default_address(exch, speed)) == EAGAIN) { 409 409 async_usleep(1000000); 410 410 } -
uspace/drv/bus/usb/xhci/bus.c
r63431db r5e2b1ae6 426 426 } 427 427 428 static int reserve_default_address(bus_t *bus_base, usb_speed_t speed)429 {430 xhci_bus_t *xhci_bus = bus_to_xhci_bus(bus_base);431 432 if (xhci_bus->default_address_speed != USB_SPEED_MAX)433 /* Already allocated */434 return ENOENT;435 436 xhci_bus->default_address_speed = speed;437 return EOK;438 }439 440 static int release_default_address(bus_t *bus_base)441 {442 xhci_bus_t *xhci_bus = bus_to_xhci_bus(bus_base);443 444 xhci_bus->default_address_speed = USB_SPEED_MAX;445 return EOK;446 }447 448 428 static usb_transfer_batch_t *batch_create(endpoint_t *ep) 449 429 { … … 461 441 // TODO: Is it good idea to use this macro? It blurrs the fact that the callbacks and static functions are called the same. 462 442 #define BIND_OP(op) .op = op, 463 BIND_OP(reserve_default_address)464 BIND_OP(release_default_address)465 466 443 BIND_OP(device_enumerate) 467 444 BIND_OP(device_remove) … … 501 478 bus->hc = hc; 502 479 bus->base.ops = &xhci_bus_ops; 503 bus->default_address_speed = USB_SPEED_MAX;504 480 return EOK; 505 481 } -
uspace/drv/bus/usb/xhci/bus.h
r63431db r5e2b1ae6 51 51 52 52 xhci_device_t **devices_by_slot; /**< Devices by Slot ID */ 53 54 usb_speed_t default_address_speed; /**< Used to get speed from usb hubs */55 53 } xhci_bus_t; 56 54 -
uspace/lib/usbhost/include/usb/host/bus.h
r63431db r5e2b1ae6 100 100 void (*interrupt)(bus_t *, uint32_t); 101 101 int (*status)(bus_t *, uint32_t *); 102 int (*reserve_default_address)(bus_t *, usb_speed_t);103 int (*release_default_address)(bus_t *);104 102 105 103 /* Operations on device */ … … 139 137 const bus_ops_t *ops; 140 138 139 /* Reserving default address - USB_SPEED_MAX when free. */ 140 usb_speed_t default_address_speed; 141 141 142 /* This structure is meant to be extended by overriding. */ 142 143 } bus_t; … … 166 167 167 168 int bus_reserve_default_address(bus_t *, usb_speed_t); 168 intbus_release_default_address(bus_t *);169 void bus_release_default_address(bus_t *); 169 170 170 171 #endif -
uspace/lib/usbhost/include/usb/host/usb2_bus.h
r63431db r5e2b1ae6 50 50 bus_t base; /**< Inheritance - keep this first */ 51 51 52 /** The speed which reserved default address. Invalid unless reserved. */53 usb_speed_t default_address_speed;54 55 52 /** Map of occupied addresses */ 56 53 bool address_occupied [USB_ADDRESS_COUNT]; … … 64 61 extern const bus_ops_t usb2_bus_ops; 65 62 66 extern intusb2_bus_init(usb2_bus_t *, size_t);63 extern void usb2_bus_init(usb2_bus_t *, size_t); 67 64 68 65 #endif -
uspace/lib/usbhost/src/bus.c
r63431db r5e2b1ae6 54 54 fibril_mutex_initialize(&bus->guard); 55 55 bus->device_size = device_size; 56 bus->default_address_speed = USB_SPEED_MAX; 56 57 } 57 58 … … 239 240 assert(bus); 240 241 241 const bus_ops_t *ops = BUS_OPS_LOOKUP(bus->ops, reserve_default_address);242 if (!ops)243 return ENOTSUP;244 245 242 fibril_mutex_lock(&bus->guard); 246 const int r = ops->reserve_default_address(bus, speed); 247 fibril_mutex_unlock(&bus->guard); 248 return r; 249 } 250 251 int bus_release_default_address(bus_t *bus) 243 if (bus->default_address_speed != USB_SPEED_MAX) { 244 fibril_mutex_unlock(&bus->guard); 245 return EAGAIN; 246 } else { 247 bus->default_address_speed = speed; 248 fibril_mutex_unlock(&bus->guard); 249 return EOK; 250 } 251 } 252 253 void bus_release_default_address(bus_t *bus) 252 254 { 253 255 assert(bus); 254 255 const bus_ops_t *ops = BUS_OPS_LOOKUP(bus->ops, release_default_address); 256 if (!ops) 257 return ENOTSUP; 258 259 fibril_mutex_lock(&bus->guard); 260 const int r = ops->release_default_address(bus); 261 fibril_mutex_unlock(&bus->guard); 262 return r; 256 bus->default_address_speed = USB_SPEED_MAX; 263 257 } 264 258 -
uspace/lib/usbhost/src/ddf_helpers.c
r63431db r5e2b1ae6 137 137 138 138 usb_log_debug("Device %d released default address\n", dev->address); 139 return bus_release_default_address(hcd->bus); 139 bus_release_default_address(hcd->bus); 140 141 return EOK; 140 142 } 141 143 -
uspace/lib/usbhost/src/usb2_bus.c
r63431db r5e2b1ae6 100 100 * @param bus usb_device_manager 101 101 * @param addr Pointer to requested address value, place to store new address 102 * @parma strict Fail if the requested address is not available.103 102 * @return Error code. 104 103 * @note Default address is only available in strict mode. 105 104 */ 106 static int request_address(usb2_bus_t *bus, usb_address_t *addr , bool strict)105 static int request_address(usb2_bus_t *bus, usb_address_t *addr) 107 106 { 108 107 int err; … … 114 113 return EINVAL; 115 114 116 /* Only grant default address to strict requests */ 117 if ((*addr == USB_ADDRESS_DEFAULT) && !strict) { 118 if ((err = get_free_address(bus, addr))) 119 return err; 120 } 121 else if (bus->address_occupied[*addr]) { 122 if (strict) { 123 return ENOENT; 124 } 125 if ((err = get_free_address(bus, addr))) 126 return err; 127 } 115 if ((err = get_free_address(bus, addr))) 116 return err; 128 117 129 118 assert(usb_address_is_valid(*addr)); 130 119 assert(bus->address_occupied[*addr] == false); 131 assert(*addr != USB_ADDRESS_DEFAULT || strict);120 assert(*addr != USB_ADDRESS_DEFAULT); 132 121 133 122 bus->address_occupied[*addr] = true; … … 152 141 /** Reserve address early, we want pretty log messages */ 153 142 usb_address_t address = USB_ADDRESS_DEFAULT; 154 if ((err = request_address(bus, &address , false))) {143 if ((err = request_address(bus, &address))) { 155 144 usb_log_error("Failed to reserve new address: %s.", 156 145 str_error(err)); … … 231 220 * default address. 232 221 */ 233 dev->speed = bus-> default_address_speed;222 dev->speed = bus->base.default_address_speed; 234 223 usb_log_debug("Found new %s speed USB device.", usb_str_speed(dev->speed)); 235 224 … … 301 290 } 302 291 303 static int usb2_bus_register_default_address(bus_t *bus_base, usb_speed_t speed)304 {305 usb2_bus_t *bus = bus_to_usb2_bus(bus_base);306 usb_address_t addr = USB_ADDRESS_DEFAULT;307 const int err = request_address(bus, &addr, true);308 if (err)309 return err;310 bus->default_address_speed = speed;311 return EOK;312 }313 314 static int usb2_bus_release_default_address(bus_t *bus_base)315 {316 usb2_bus_t *bus = bus_to_usb2_bus(bus_base);317 return release_address(bus, USB_ADDRESS_DEFAULT);318 }319 320 292 const bus_ops_t usb2_bus_ops = { 321 .reserve_default_address = usb2_bus_register_default_address,322 .release_default_address = usb2_bus_release_default_address,323 293 .device_enumerate = usb2_bus_device_enumerate, 324 294 .endpoint_create = usb2_bus_create_ep, … … 334 304 * @return Error code. 335 305 */ 336 intusb2_bus_init(usb2_bus_t *bus, size_t available_bandwidth)306 void usb2_bus_init(usb2_bus_t *bus, size_t available_bandwidth) 337 307 { 338 308 assert(bus); … … 342 312 343 313 bus->free_bw = available_bandwidth; 344 345 return EOK;346 314 } 347 315 /**
Note:
See TracChangeset
for help on using the changeset viewer.