Changeset 56257ba in mainline for uspace/drv/bus/usb/xhci/bus.c
- Timestamp:
- 2018-01-07T01:01:42Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 63431db2
- Parents:
- 9efad54
- git-author:
- Ondřej Hlavatý <aearsis@…> (2018-01-07 01:01:41)
- git-committer:
- Ondřej Hlavatý <aearsis@…> (2018-01-07 01:01:42)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/xhci/bus.c
r9efad54 r56257ba 77 77 goto err_slot; 78 78 79 /* Temporaryreference */79 /* Bus reference */ 80 80 endpoint_add_ref(ep0_base); 81 dev->base.endpoints[0] = ep0_base; 81 82 82 83 xhci_endpoint_t *ep0 = xhci_endpoint_get(ep0_base); 83 84 84 85 if ((err = xhci_endpoint_alloc_transfer_ds(ep0))) 85 goto err_ep; 86 87 /* Register EP0 */ 88 if ((err = xhci_device_add_endpoint(dev, ep0))) 89 goto err_prepared; 86 goto err_added; 90 87 91 88 /* Address device */ 92 89 if ((err = hc_address_device(bus->hc, dev, ep0))) 93 goto err_added; 94 95 /* Temporary reference */ 96 endpoint_del_ref(ep0_base); 97 return EOK; 98 99 err_added: 100 xhci_device_remove_endpoint(ep0); 90 goto err_prepared; 91 92 return EOK; 93 101 94 err_prepared: 102 95 xhci_endpoint_free_transfer_ds(ep0); 103 err_ ep:104 /* Temporaryreference */96 err_added: 97 /* Bus reference */ 105 98 endpoint_del_ref(ep0_base); 99 dev->base.endpoints[0] = NULL; 106 100 err_slot: 107 101 hc_disable_slot(bus->hc, dev); … … 123 117 return err; 124 118 125 xhci_endpoint_t *ep0 = dev->endpoints[0];119 xhci_endpoint_t *ep0 = xhci_device_get_endpoint(dev, 0); 126 120 assert(ep0); 127 121 … … 218 212 /* Abort running transfers. */ 219 213 usb_log_debug2("Aborting all active transfers to device " XHCI_DEV_FMT ".", XHCI_DEV_ARGS(*xhci_dev)); 220 for ( size_t i = 0; i < ARRAY_SIZE(xhci_dev->endpoints); ++i) {221 xhci_endpoint_t *ep = xhci_dev ->endpoints[i];214 for (usb_endpoint_t i = 0; i < USB_ENDPOINT_MAX; ++i) { 215 xhci_endpoint_t *ep = xhci_device_get_endpoint(xhci_dev, i); 222 216 if (!ep) 223 217 continue; … … 244 238 245 239 /* Unregister remaining endpoints, freeing memory. */ 246 for (u nsigned i = 0; i < ARRAY_SIZE(xhci_dev->endpoints); ++i) {247 if (! xhci_dev->endpoints[i])240 for (usb_endpoint_t i = 0; i < USB_ENDPOINT_MAX; ++i) { 241 if (!dev->endpoints[i]) 248 242 continue; 249 243 250 if ((err = endpoint_unregister( &xhci_dev->endpoints[i]->base))) {244 if ((err = endpoint_unregister(dev->endpoints[i]))) { 251 245 usb_log_warning("Failed to unregister endpoint " XHCI_EP_FMT ": %s", 252 XHCI_EP_ARGS(*xhci_dev ->endpoints[i]), str_error(err));246 XHCI_EP_ARGS(*xhci_device_get_endpoint(xhci_dev, i)), str_error(err)); 253 247 } 254 248 } … … 332 326 333 327 /* We will need the endpoint array later for DS deallocation. */ 334 xhci_endpoint_t *endpoints[ARRAY_SIZE(dev->endpoints)]; 335 memcpy(endpoints, dev->endpoints, sizeof(dev->endpoints)); 336 337 /* Remove all endpoints except zero. */ 338 for (unsigned i = 1; i < ARRAY_SIZE(endpoints); ++i) { 339 if (!endpoints[i]) 340 continue; 341 328 endpoint_t *endpoints[USB_ENDPOINT_MAX]; 329 memcpy(endpoints, dev->base.endpoints, sizeof(endpoints)); 330 331 for (usb_endpoint_t i = 1; i < USB_ENDPOINT_MAX; ++i) { 342 332 /* FIXME: Asserting here that the endpoint is not active. If not, EBUSY? */ 343 344 xhci_device_remove_endpoint(endpoints[i]); 333 dev->base.endpoints[i] = NULL; 345 334 } 346 335 … … 356 345 continue; 357 346 358 xhci_endpoint_free_transfer_ds( endpoints[i]);359 }360 361 /* FIXME: What happens to unregistered endpoints now? Destroy them? */347 xhci_endpoint_free_transfer_ds(xhci_endpoint_get(endpoints[i])); 348 /* Bus reference */ 349 endpoint_del_ref(endpoints[i]); 350 } 362 351 363 352 return EOK; … … 397 386 return err; 398 387 399 if ((err = xhci_device_add_endpoint(dev, ep)))400 goto err_prepared;401 402 388 usb_log_info("Endpoint " XHCI_EP_FMT " registered to XHCI bus.", XHCI_EP_ARGS(*ep)); 403 389 … … 406 392 407 393 if ((err = hc_add_endpoint(bus->hc, dev->slot_id, xhci_endpoint_index(ep), &ep_ctx))) 408 goto err_added; 409 410 return EOK; 411 412 err_added: 413 xhci_device_remove_endpoint(ep); 394 goto err_prepared; 395 396 return EOK; 397 414 398 err_prepared: 415 399 xhci_endpoint_free_transfer_ds(ep); … … 425 409 426 410 usb_log_info("Endpoint " XHCI_EP_FMT " unregistered from XHCI bus.", XHCI_EP_ARGS(*ep)); 427 428 xhci_device_remove_endpoint(ep);429 411 430 412 /* If device slot is still available, drop the endpoint. */ … … 444 426 } 445 427 446 static endpoint_t* device_find_endpoint(device_t *dev_base, usb_target_t target, usb_direction_t direction)447 {448 xhci_device_t *dev = xhci_device_get(dev_base);449 450 xhci_endpoint_t *ep = xhci_device_get_endpoint(dev, target.endpoint);451 if (!ep)452 return NULL;453 454 return &ep->base;455 }456 457 static int reset_toggle(bus_t *bus_base, usb_target_t target, toggle_reset_mode_t mode)458 {459 // TODO: Implement me!460 return ENOTSUP;461 }462 463 /* Endpoint ops, optional (have generic fallback) */464 static bool endpoint_get_toggle(endpoint_t *ep)465 {466 // TODO: Implement me!467 return ENOTSUP;468 }469 470 static void endpoint_set_toggle(endpoint_t *ep, bool toggle)471 {472 // TODO: Implement me!473 }474 475 428 static int reserve_default_address(bus_t *bus_base, usb_speed_t speed) 476 429 { … … 510 463 BIND_OP(reserve_default_address) 511 464 BIND_OP(release_default_address) 512 BIND_OP(reset_toggle)513 465 514 466 BIND_OP(device_enumerate) … … 516 468 BIND_OP(device_online) 517 469 BIND_OP(device_offline) 518 BIND_OP(device_find_endpoint)519 470 520 471 BIND_OP(endpoint_create) … … 522 473 BIND_OP(endpoint_register) 523 474 BIND_OP(endpoint_unregister) 524 BIND_OP(endpoint_get_toggle)525 BIND_OP(endpoint_set_toggle)526 475 527 476 BIND_OP(batch_create)
Note:
See TracChangeset
for help on using the changeset viewer.