Changes in uspace/lib/usbdev/src/devdrv.c [e0a5d4c:b7fd2a0] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/src/devdrv.c
re0a5d4c rb7fd2a0 2 2 * Copyright (c) 2011 Vojtech Horky 3 3 * Copyright (c) 2011 Jan Vesely 4 * Copyright (c) 2018 Ondrej Hlavaty, Petr Manek, Michal Staruch5 4 * All rights reserved. 6 5 * … … 49 48 #include <devman.h> 50 49 #include <errno.h> 51 #include <str_error.h>52 50 #include <stdlib.h> 53 51 … … 58 56 /** Connection to device on USB bus */ 59 57 usb_dev_session_t *bus_session; 60 58 61 59 /** devman handle */ 62 60 devman_handle_t handle; 63 61 64 62 /** The default control pipe. */ 65 63 usb_pipe_t ctrl_pipe; 66 64 67 65 /** Other endpoint pipes. 68 66 * … … 71 69 */ 72 70 usb_endpoint_mapping_t *pipes; 73 71 74 72 /** Number of other endpoint pipes. */ 75 73 size_t pipes_count; 76 77 /** USB address of this device */ 78 usb_address_t address; 79 80 /** Depth in the USB hub hiearchy */ 81 unsigned depth; 82 83 /** USB speed of this device */ 84 usb_speed_t speed; 85 74 86 75 /** Current interface. 87 76 * … … 90 79 */ 91 80 int interface_no; 92 81 93 82 /** Alternative interfaces. */ 94 83 usb_alternate_interfaces_t alternate_interfaces; 95 84 96 85 /** Some useful descriptors for USB device. */ 97 86 usb_device_descriptors_t descriptors; 98 87 99 88 /** Generic DDF device backing this one. DO NOT TOUCH! */ 100 89 ddf_dev_t *ddf_dev; 101 90 102 91 /** Custom driver data. 103 92 * … … 157 146 return rc; 158 147 } 159 148 160 149 /* Change current alternative */ 161 150 usb_dev->alternate_interfaces.current = alternate_setting; … … 266 255 267 256 /* Register created pipes. */ 268 unsigned pipes_registered = 0;269 257 for (size_t i = 0; i < pipe_count; i++) { 270 258 if (pipes[i].present) { 271 rc = usb_pipe_register(&pipes[i].pipe, pipes[i].descriptor, pipes[i].companion_descriptor); 259 rc = usb_pipe_register(&pipes[i].pipe, 260 pipes[i].descriptor->poll_interval); 272 261 if (rc != EOK) { 273 262 goto rollback_unregister_endpoints; 274 263 } 275 264 } 276 pipes_registered++;277 265 } 278 266 … … 289 277 */ 290 278 rollback_unregister_endpoints: 291 for (size_t i = 0; i < pipe s_registered; i++) {279 for (size_t i = 0; i < pipe_count; i++) { 292 280 if (pipes[i].present) { 293 281 usb_pipe_unregister(&pipes[i].pipe); … … 308 296 assert(usb_dev); 309 297 assert(usb_dev->pipes || usb_dev->pipes_count == 0); 310 298 311 299 /* Destroy the pipes. */ 312 int rc;313 300 for (size_t i = 0; i < usb_dev->pipes_count; ++i) { 314 usb_log_debug2("Unregistering pipe %zu: %spresent. ",301 usb_log_debug2("Unregistering pipe %zu: %spresent.\n", 315 302 i, usb_dev->pipes[i].present ? "" : "not "); 316 317 rc = usb_device_unmap_ep(usb_dev->pipes + i); 318 if (rc != EOK && rc != ENOENT) 319 usb_log_warning("Unregistering pipe %zu failed: %s", i, str_error(rc)); 320 } 321 303 if (usb_dev->pipes[i].present) 304 usb_pipe_unregister(&usb_dev->pipes[i].pipe); 305 } 306 322 307 free(usb_dev->pipes); 323 308 usb_dev->pipes = NULL; … … 342 327 } 343 328 344 int usb_device_unmap_ep(usb_endpoint_mapping_t *epm) 345 { 346 assert(epm); 347 348 if (!epm->present) 349 return ENOENT; 350 351 const int rc = usb_pipe_unregister(&epm->pipe); 352 if (rc != EOK) 353 return rc; 354 355 epm->present = false; 356 return EOK; 357 } 358 359 usb_address_t usb_device_get_address(const usb_device_t *usb_dev) 360 { 361 assert(usb_dev); 362 return usb_dev->depth; 363 } 364 365 unsigned usb_device_get_depth(const usb_device_t *usb_dev) 366 { 367 assert(usb_dev); 368 return usb_dev->depth; 369 } 370 371 usb_speed_t usb_device_get_speed(const usb_device_t *usb_dev) 372 { 373 assert(usb_dev); 374 return usb_dev->speed; 375 } 376 377 int usb_device_get_iface_number(const usb_device_t *usb_dev) 329 usb_endpoint_mapping_t * usb_device_get_mapped_ep( 330 usb_device_t *usb_dev, usb_endpoint_t ep) 331 { 332 assert(usb_dev); 333 for (unsigned i = 0; i < usb_dev->pipes_count; ++i) { 334 if (usb_dev->pipes[i].pipe.endpoint_no == ep) 335 return &usb_dev->pipes[i]; 336 } 337 return NULL; 338 } 339 340 int usb_device_get_iface_number(usb_device_t *usb_dev) 378 341 { 379 342 assert(usb_dev); … … 381 344 } 382 345 383 devman_handle_t usb_device_get_devman_handle( constusb_device_t *usb_dev)346 devman_handle_t usb_device_get_devman_handle(usb_device_t *usb_dev) 384 347 { 385 348 assert(usb_dev); … … 431 394 */ 432 395 static errno_t usb_device_init(usb_device_t *usb_dev, ddf_dev_t *ddf_dev, 433 const usb_endpoint_description_t **endpoints, const char **errstr_ptr) 396 const usb_endpoint_description_t **endpoints, const char **errstr_ptr, 397 devman_handle_t handle, int interface_no) 434 398 { 435 399 assert(usb_dev != NULL); … … 439 403 440 404 usb_dev->ddf_dev = ddf_dev; 405 usb_dev->handle = handle; 406 usb_dev->interface_no = interface_no; 441 407 usb_dev->driver_data = NULL; 442 408 usb_dev->descriptors.full_config = NULL; … … 445 411 usb_dev->pipes = NULL; 446 412 447 usb_dev->bus_session = usb_dev_connect( usb_dev->handle);413 usb_dev->bus_session = usb_dev_connect(handle); 448 414 449 415 if (!usb_dev->bus_session) { … … 454 420 /* This pipe was registered by the hub driver, 455 421 * during device initialization. */ 456 errno_t rc = usb_pipe_initialize_default_control(&usb_dev->ctrl_pipe, usb_dev->bus_session); 422 errno_t rc = usb_pipe_initialize_default_control( 423 &usb_dev->ctrl_pipe, usb_dev->bus_session); 457 424 if (rc != EOK) { 458 425 usb_dev_disconnect(usb_dev->bus_session); … … 473 440 * it makes no sense to speak about alternate interfaces when 474 441 * controlling a device. */ 475 usb_alternate_interfaces_init(&usb_dev->alternate_interfaces,442 rc = usb_alternate_interfaces_init(&usb_dev->alternate_interfaces, 476 443 usb_dev->descriptors.full_config, 477 444 usb_dev->descriptors.full_config_size, usb_dev->interface_no); … … 490 457 } 491 458 492 static errno_t usb_device_get_info(async_sess_t *sess, usb_device_t *dev) 493 { 494 assert(dev); 495 459 static errno_t usb_device_get_info(async_sess_t *sess, devman_handle_t *handle, 460 int *iface_no) 461 { 462 assert(handle); 463 assert(iface_no); 464 496 465 async_exch_t *exch = async_exchange_begin(sess); 497 466 if (!exch) 498 467 return EPARTY; 499 500 usb_device_desc_t dev_desc; 501 const errno_t ret = usb_get_my_description(exch, &dev_desc); 502 468 469 errno_t ret = usb_get_my_device_handle(exch, handle); 503 470 if (ret == EOK) { 504 dev->address = dev_desc.address;505 dev->depth = dev_desc.depth;506 dev->speed = dev_desc.speed;507 dev->handle = dev_desc.handle;508 dev->interface_no = dev_desc.iface;509 } 510 471 ret = usb_get_my_interface(exch, iface_no); 472 if (ret == ENOTSUP) { 473 *iface_no = -1; 474 ret = EOK; 475 } 476 } 477 511 478 async_exchange_end(exch); 512 479 return ret; … … 518 485 assert(ddf_dev); 519 486 assert(err); 487 488 devman_handle_t h = 0; 489 int iface_no = -1; 520 490 521 491 async_sess_t *sess = ddf_dev_parent_sess_get(ddf_dev); 522 492 if (sess == NULL) 523 493 return ENOMEM; 494 const errno_t ret = usb_device_get_info(sess, &h, &iface_no); 495 if (ret != EOK) 496 return ret; 524 497 525 498 usb_device_t *usb_dev = … … 529 502 return ENOMEM; 530 503 } 531 532 const errno_t ret = usb_device_get_info(sess, usb_dev); 533 if (ret != EOK) 534 return ret; 535 536 return usb_device_init(usb_dev, ddf_dev, desc, err); 504 505 return usb_device_init(usb_dev, ddf_dev, desc, err, h, iface_no); 537 506 } 538 507 … … 548 517 usb_device_t * usb_device_create(devman_handle_t handle) 549 518 { 519 devman_handle_t h = 0; 520 int iface_no = -1; 521 522 async_sess_t *sess = devman_device_connect(handle, IPC_FLAG_BLOCKING); 523 errno_t ret = usb_device_get_info(sess, &h, &iface_no); 524 if (sess) 525 async_hangup(sess); 526 if (ret != EOK) 527 return NULL; 528 550 529 usb_device_t *usb_dev = malloc(sizeof(usb_device_t)); 551 530 if (!usb_dev) 552 531 return NULL; 553 532 554 async_sess_t *sess = devman_device_connect(handle, IPC_FLAG_BLOCKING);555 errno_t ret = usb_device_get_info(sess, usb_dev);556 if (sess)557 async_hangup(sess);558 if (ret != EOK) {559 free(usb_dev);560 return NULL;561 }562 563 533 const char* dummy = NULL; 564 ret = usb_device_init(usb_dev, NULL, NULL, &dummy );534 ret = usb_device_init(usb_dev, NULL, NULL, &dummy, handle, iface_no); 565 535 if (ret != EOK) { 566 536 free(usb_dev);
Note:
See TracChangeset
for help on using the changeset viewer.