Changeset 6832245 in mainline for uspace/lib/usbhost/src/usb2_bus.c
- Timestamp:
- 2017-12-14T23:01:57Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 837d53d
- Parents:
- bd05140
- git-author:
- Ondřej Hlavatý <aearsis@…> (2017-12-14 23:01:54)
- git-committer:
- Ondřej Hlavatý <aearsis@…> (2017-12-14 23:01:57)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/src/usb2_bus.c
rbd05140 r6832245 200 200 }}; 201 201 202 static int address_device( usb2_bus_t *bus, hcd_t *hcd,device_t *dev)202 static int address_device(device_t *dev) 203 203 { 204 204 int err; 205 206 usb2_bus_t *bus = (usb2_bus_t *) dev->bus; 207 hcd_t *hcd = (hcd_t *) bus->base.hcd; 205 208 206 209 /* The default address is currently reserved for this device */ … … 220 223 221 224 endpoint_t *default_ep; 222 err = bus_ add_endpoint(&bus->base,dev, &usb2_default_control_ep, &default_ep);225 err = bus_endpoint_add(dev, &usb2_default_control_ep, &default_ep); 223 226 if (err != EOK) { 224 227 usb_log_error("Device(%d): Failed to add default target: %s.", … … 244 247 245 248 /* We need to remove ep before we change the address */ 246 if ((err = bus_ remove_endpoint(&bus->base,default_ep))) {249 if ((err = bus_endpoint_remove(default_ep))) { 247 250 usb_log_error("Device(%d): Failed to unregister default target: %s", address, str_error(err)); 248 251 goto err_address; … … 262 265 /* Register EP on the new address */ 263 266 usb_log_debug("Device(%d): Registering control EP.", address); 264 err = bus_ add_endpoint(&bus->base,dev, &control_ep, NULL);267 err = bus_endpoint_add(dev, &control_ep, NULL); 265 268 if (err != EOK) { 266 269 usb_log_error("Device(%d): Failed to register EP0: %s", … … 272 275 273 276 err_default_control_ep: 274 bus_ remove_endpoint(&bus->base,default_ep);277 bus_endpoint_remove(default_ep); 275 278 endpoint_del_ref(default_ep); 276 279 err_address: … … 281 284 /** Enumerate a new USB device 282 285 */ 283 static int usb2_bus_ enumerate_device(bus_t *bus_base, hcd_t *hcd,device_t *dev)286 static int usb2_bus_device_enumerate(device_t *dev) 284 287 { 285 288 int err; 286 usb2_bus_t *bus = bus_to_usb2_bus( bus_base);289 usb2_bus_t *bus = bus_to_usb2_bus(dev->bus); 287 290 288 291 /* The speed of the new device was reported by the hub when reserving … … 306 309 307 310 /* Assign an address to the device */ 308 if ((err = address_device( bus, hcd,dev))) {311 if ((err = address_device(dev))) { 309 312 usb_log_error("Failed to setup address of the new device: %s", str_error(err)); 310 313 return err; … … 312 315 313 316 /* Read the device descriptor, derive the match ids */ 314 if ((err = hcd_ddf_device_explore( hcd,dev))) {317 if ((err = hcd_ddf_device_explore(dev))) { 315 318 usb_log_error("Device(%d): Failed to explore device: %s", dev->address, str_error(err)); 316 319 release_address(bus, dev->address); … … 329 332 * @note Assumes that the internal mutex is locked. 330 333 */ 331 static endpoint_t *usb2_bus_find_ep( bus_t *bus_base,device_t *device, usb_target_t target, usb_direction_t direction)332 { 333 usb2_bus_t *bus = bus_to_usb2_bus( bus_base);334 static endpoint_t *usb2_bus_find_ep(device_t *device, usb_target_t target, usb_direction_t direction) 335 { 336 usb2_bus_t *bus = bus_to_usb2_bus(device->bus); 334 337 335 338 assert(device->address == target.address); … … 345 348 } 346 349 347 static endpoint_t *usb2_bus_create_ep( bus_t *bus)350 static endpoint_t *usb2_bus_create_ep(device_t *dev, const usb_endpoint_desc_t *desc) 348 351 { 349 352 endpoint_t *ep = malloc(sizeof(endpoint_t)); … … 351 354 return NULL; 352 355 353 endpoint_init(ep, bus);356 endpoint_init(ep, dev, desc); 354 357 return ep; 355 358 } … … 370 373 * @param endpoint USB endpoint number. 371 374 */ 372 static int usb2_bus_register_ep(bus_t *bus_base, device_t *device, endpoint_t *ep, const usb_endpoint_desc_t *desc) 373 { 374 usb2_bus_t *bus = bus_to_usb2_bus(bus_base); 375 static int usb2_bus_register_ep(endpoint_t *ep) 376 { 377 usb2_bus_t *bus = bus_to_usb2_bus(ep->device->bus); 378 assert(fibril_mutex_is_locked(&bus->base.guard)); 375 379 assert(ep); 376 380 377 ep->device = device;378 379 /* Extract USB2-related information from endpoint_desc */380 ep->endpoint = desc->endpoint_no;381 ep->direction = desc->direction;382 ep->transfer_type = desc->transfer_type;383 ep->max_packet_size = desc->max_packet_size;384 ep->packets = desc->packets;385 386 ep->bandwidth = bus_base->ops.count_bw(ep, desc->max_packet_size);387 388 381 /* Check for existence */ 389 if (usb2_bus_find_ep( bus_base,ep->device, usb2_ep_to_target(ep), ep->direction))382 if (usb2_bus_find_ep(ep->device, usb2_ep_to_target(ep), ep->direction)) 390 383 return EEXIST; 391 384 … … 394 387 return ENOSPC; 395 388 389 endpoint_add_ref(ep); 396 390 list_append(&ep->link, get_list(bus, ep->device->address)); 397 391 bus->free_bw -= ep->bandwidth; … … 400 394 } 401 395 402 403 396 /** Release bandwidth reserved by the given endpoint. 404 397 */ 405 static int usb2_bus_unregister_ep( bus_t *bus_base,endpoint_t *ep)406 { 407 usb2_bus_t *bus = bus_to_usb2_bus( bus_base);398 static int usb2_bus_unregister_ep(endpoint_t *ep) 399 { 400 usb2_bus_t *bus = bus_to_usb2_bus(ep->device->bus); 408 401 assert(ep); 409 402 410 403 list_remove(&ep->link); 411 ep->device = NULL;412 404 413 405 bus->free_bw += ep->bandwidth; 406 endpoint_del_ref(ep); 414 407 415 408 return EOK; … … 452 445 } 453 446 454 staticconst bus_ops_t usb2_bus_ops = {447 const bus_ops_t usb2_bus_ops = { 455 448 .reserve_default_address = usb2_bus_register_default_address, 456 449 .release_default_address = usb2_bus_release_default_address, 457 .enumerate_device = usb2_bus_enumerate_device,458 .create_endpoint = usb2_bus_create_ep,459 .find_endpoint = usb2_bus_find_ep,460 .unregister_endpoint = usb2_bus_unregister_ep,461 .register_endpoint = usb2_bus_register_ep,462 450 .reset_toggle = usb2_bus_reset_toggle, 451 .device_enumerate = usb2_bus_device_enumerate, 452 .device_find_endpoint = usb2_bus_find_ep, 453 .endpoint_create= usb2_bus_create_ep, 454 .endpoint_register= usb2_bus_register_ep, 455 .endpoint_unregister= usb2_bus_unregister_ep, 463 456 }; 464 457 … … 470 463 * @return Error code. 471 464 */ 472 int usb2_bus_init(usb2_bus_t *bus, size_t available_bandwidth, count_bw_func_t count_bw)465 int usb2_bus_init(usb2_bus_t *bus, hcd_t *hcd, size_t available_bandwidth) 473 466 { 474 467 assert(bus); 475 468 476 bus_init(&bus->base, sizeof(device_t)); 477 478 bus->base.ops = usb2_bus_ops; 479 bus->base.ops.count_bw = count_bw; 469 bus_init(&bus->base, hcd, sizeof(device_t)); 470 bus->base.ops = &usb2_bus_ops; 480 471 481 472 bus->free_bw = available_bandwidth;
Note:
See TracChangeset
for help on using the changeset viewer.