Changes in uspace/lib/usbdev/src/devdrv.c [fb422312:882580a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/src/devdrv.c
rfb422312 r882580a 54 54 }; 55 55 56 static usb_driver_t *driver = NULL;56 static const usb_driver_t *driver = NULL; 57 57 58 58 … … 64 64 * @return Task exit status. 65 65 */ 66 int usb_driver_main( usb_driver_t *drv)66 int usb_driver_main(const usb_driver_t *drv) 67 67 { 68 68 assert(drv != NULL); … … 81 81 * @return Number of pipes (excluding default control pipe). 82 82 */ 83 static size_t count_other_pipes( usb_endpoint_description_t **endpoints)83 static size_t count_other_pipes(const usb_endpoint_description_t **endpoints) 84 84 { 85 85 size_t count = 0; … … 101 101 * @return Error code. 102 102 */ 103 static int initialize_other_pipes( usb_endpoint_description_t **endpoints,103 static int initialize_other_pipes(const usb_endpoint_description_t **endpoints, 104 104 usb_device_t *dev, int alternate_setting) 105 105 { … … 115 115 int rc = usb_device_create_pipes(dev->ddf_dev, &dev->wire, endpoints, 116 116 dev->descriptors.configuration, dev->descriptors.configuration_size, 117 dev->interface_no, alternate_setting, 118 &pipes, &pipes_count); 117 dev->interface_no, alternate_setting, &pipes, &pipes_count); 119 118 120 119 if (rc != EOK) { … … 141 140 assert(driver->ops->device_add); 142 141 143 int rc; 144 145 usb_device_t *dev = NULL; 142 usb_device_t *dev = ddf_dev_data_alloc(gen_dev, sizeof(usb_device_t)); 143 if (dev == NULL) { 144 usb_log_error("USB device `%s' structure allocation failed.\n", 145 gen_dev->name); 146 return ENOMEM; 147 } 146 148 const char *err_msg = NULL; 147 rc = usb_device_create(gen_dev, driver->endpoints, &dev, &err_msg);148 if (rc != EOK) { 149 usb_log_error("USB device `%s' creationfailed (%s): %s.\n",149 int rc = usb_device_init(dev, gen_dev, driver->endpoints, &err_msg); 150 if (rc != EOK) { 151 usb_log_error("USB device `%s' init failed (%s): %s.\n", 150 152 gen_dev->name, err_msg, str_error(rc)); 151 153 return rc; 152 154 } 153 gen_dev->driver_data = dev; 154 155 return driver->ops->device_add(dev); 155 156 rc = driver->ops->device_add(dev); 157 if (rc != EOK) 158 usb_device_deinit(dev); 159 return rc; 156 160 } 157 161 /*----------------------------------------------------------------------------*/ … … 186 190 if (driver->ops->device_gone == NULL) 187 191 return ENOTSUP; 188 const int ret = driver->ops->device_gone(gen_dev->driver_data); 192 usb_device_t *usb_dev = gen_dev->driver_data; 193 const int ret = driver->ops->device_gone(usb_dev); 189 194 if (ret == EOK) 190 usb_device_de stroy(gen_dev->driver_data);195 usb_device_deinit(usb_dev); 191 196 192 197 return ret; … … 235 240 */ 236 241 int usb_device_select_interface(usb_device_t *dev, uint8_t alternate_setting, 237 usb_endpoint_description_t **endpoints)242 const usb_endpoint_description_t **endpoints) 238 243 { 239 244 if (dev->interface_no < 0) { … … 318 323 */ 319 324 int usb_device_create_pipes(const ddf_dev_t *dev, usb_device_connection_t *wire, 320 usb_endpoint_description_t **endpoints,321 uint8_t *config_descr, size_t config_descr_size,325 const usb_endpoint_description_t **endpoints, 326 const uint8_t *config_descr, size_t config_descr_size, 322 327 int interface_no, int interface_setting, 323 328 usb_endpoint_mapping_t **pipes_ptr, size_t *pipes_count_ptr) … … 333 338 int rc; 334 339 335 size_t pipe_count = count_other_pipes(endpoints);340 const size_t pipe_count = count_other_pipes(endpoints); 336 341 if (pipe_count == 0) { 342 *pipes_count_ptr = pipe_count; 337 343 *pipes_ptr = NULL; 338 344 return EOK; … … 445 451 { 446 452 assert(dev != NULL); 447 assert(((pipes != NULL) && (pipes_count > 0))448 || ((pipes == NULL) && (pipes_count == 0)));449 453 450 454 if (pipes_count == 0) { 455 assert(pipes == NULL); 451 456 return EOK; 452 457 } 458 assert(pipes != NULL); 453 459 454 460 int rc; … … 468 474 size_t i; 469 475 for (i = 0; i < pipes_count; i++) { 470 usb_pipe_unregister(pipes[i].pipe, &hc_conn); 476 usb_log_debug2("Unregistering pipe %zu (%spresent).\n", 477 i, pipes[i].present ? "" : "not "); 478 if (pipes[i].present) 479 usb_pipe_unregister(pipes[i].pipe, &hc_conn); 471 480 free(pipes[i].pipe); 472 481 } … … 509 518 510 519 511 /** Create new instance of USB device. 512 * 520 /** Initialize new instance of USB device. 521 * 522 * @param[in] usb_dev Pointer to the new device. 513 523 * @param[in] ddf_dev Generic DDF device backing the USB one. 514 524 * @param[in] endpoints NULL terminated array of endpoints (NULL for none). 515 * @param[out] dev_ptr Where to store pointer to the new device.516 525 * @param[out] errstr_ptr Where to store description of context 517 526 * (in case error occurs). 518 527 * @return Error code. 519 528 */ 520 int usb_device_create(ddf_dev_t *ddf_dev, 521 usb_endpoint_description_t **endpoints, 522 usb_device_t **dev_ptr, const char **errstr_ptr) 523 { 524 assert(dev_ptr != NULL); 529 int usb_device_init(usb_device_t *usb_dev, ddf_dev_t *ddf_dev, 530 const usb_endpoint_description_t **endpoints, const char **errstr_ptr) 531 { 532 assert(usb_dev != NULL); 525 533 assert(ddf_dev != NULL); 526 534 527 int rc; 528 529 usb_device_t *dev = malloc(sizeof(usb_device_t)); 530 if (dev == NULL) { 531 *errstr_ptr = "structure allocation"; 532 return ENOMEM; 533 } 534 535 // FIXME: proper deallocation in case of errors 536 537 dev->ddf_dev = ddf_dev; 538 dev->driver_data = NULL; 539 dev->descriptors.configuration = NULL; 540 dev->alternate_interfaces = NULL; 541 542 dev->pipes_count = 0; 543 dev->pipes = NULL; 535 usb_dev->ddf_dev = ddf_dev; 536 usb_dev->driver_data = NULL; 537 usb_dev->descriptors.configuration = NULL; 538 usb_dev->alternate_interfaces = NULL; 539 usb_dev->pipes_count = 0; 540 usb_dev->pipes = NULL; 544 541 545 542 /* Initialize backing wire and control pipe. */ 546 rc = init_wire_and_ctrl_pipe(dev, errstr_ptr);543 int rc = init_wire_and_ctrl_pipe(usb_dev, errstr_ptr); 547 544 if (rc != EOK) { 548 545 return rc; … … 550 547 551 548 /* Get our interface. */ 552 dev->interface_no = usb_device_get_assigned_interface(dev->ddf_dev);549 usb_dev->interface_no = usb_device_get_assigned_interface(ddf_dev); 553 550 554 551 /* Retrieve standard descriptors. */ 555 rc = usb_device_retrieve_descriptors(&dev->ctrl_pipe, 556 &dev->descriptors); 557 if (rc != EOK) { 552 rc = usb_device_retrieve_descriptors(&usb_dev->ctrl_pipe, 553 &usb_dev->descriptors); 554 if (rc != EOK) { 555 /* Nothing allocated, nothing to free. */ 558 556 *errstr_ptr = "descriptor retrieval"; 559 557 return rc; 560 558 } 561 559 562 /* Create alternate interfaces. */ 563 rc = usb_alternate_interfaces_create(dev->descriptors.configuration, 564 dev->descriptors.configuration_size, dev->interface_no, 565 &dev->alternate_interfaces); 566 if (rc != EOK) { 567 /* We will try to silently ignore this. */ 568 dev->alternate_interfaces = NULL; 569 } 570 571 rc = initialize_other_pipes(endpoints, dev, 0); 572 if (rc != EOK) { 560 /* Create alternate interfaces. We will silently ignore failure. */ 561 //TODO Why ignore? 562 usb_alternate_interfaces_create(usb_dev->descriptors.configuration, 563 usb_dev->descriptors.configuration_size, usb_dev->interface_no, 564 &usb_dev->alternate_interfaces); 565 566 rc = initialize_other_pipes(endpoints, usb_dev, 0); 567 if (rc != EOK) { 568 /* Full configuration descriptor is allocated. */ 569 free(usb_dev->descriptors.configuration); 570 /* Alternate interfaces may be allocated */ 571 usb_alternate_interfaces_destroy(usb_dev->alternate_interfaces); 573 572 *errstr_ptr = "pipes initialization"; 574 573 return rc; … … 576 575 577 576 *errstr_ptr = NULL; 578 *dev_ptr = dev;579 577 580 578 return EOK; 581 579 } 582 580 583 /** Destroy instance of a USB device. 584 * 585 * @param dev Device to be destroyed. 586 */ 587 void usb_device_destroy(usb_device_t *dev) 588 { 589 if (dev == NULL) { 590 return; 591 } 592 593 /* Ignore errors and hope for the best. */ 594 usb_device_destroy_pipes(dev->ddf_dev, dev->pipes, dev->pipes_count); 595 free(dev->descriptors.configuration); 596 597 if (dev->alternate_interfaces != NULL) { 598 free(dev->alternate_interfaces->alternatives); 599 } 600 free(dev->alternate_interfaces); 601 602 free(dev); 581 /** Clean instance of a USB device. 582 * 583 * @param dev Device to be de-initialized. 584 * 585 * Does not free/destroy supplied pointer. 586 */ 587 void usb_device_deinit(usb_device_t *dev) 588 { 589 if (dev) { 590 /* Ignore errors and hope for the best. */ 591 destroy_current_pipes(dev); 592 593 usb_alternate_interfaces_destroy(dev->alternate_interfaces); 594 free(dev->descriptors.configuration); 595 free(dev->driver_data); 596 } 597 } 598 599 void * usb_device_data_alloc(usb_device_t *usb_dev, size_t size) 600 { 601 assert(usb_dev); 602 assert(usb_dev->driver_data == NULL); 603 return usb_dev->driver_data = calloc(1, size); 604 603 605 } 604 606
Note:
See TracChangeset
for help on using the changeset viewer.