Changes in uspace/lib/usbdev/src/devdrv.c [065064e6:70452dd4] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/src/devdrv.c
r065064e6 r70452dd4 41 41 #include <assert.h> 42 42 43 static int generic_device_add(ddf_dev_t *); 44 static int generic_device_remove(ddf_dev_t *); 45 static int generic_device_gone(ddf_dev_t *); 43 static int generic_add_device(ddf_dev_t *); 46 44 47 45 static driver_ops_t generic_driver_ops = { 48 .add_device = generic_device_add, 49 .dev_remove = generic_device_remove, 50 .dev_gone = generic_device_gone, 46 .add_device = generic_add_device 51 47 }; 52 48 static driver_t generic_driver = { … … 54 50 }; 55 51 56 static constusb_driver_t *driver = NULL;52 static usb_driver_t *driver = NULL; 57 53 58 54 … … 115 111 int rc = usb_device_create_pipes(dev->ddf_dev, &dev->wire, endpoints, 116 112 dev->descriptors.configuration, dev->descriptors.configuration_size, 117 dev->interface_no, alternate_setting, &pipes, &pipes_count); 113 dev->interface_no, alternate_setting, 114 &pipes, &pipes_count); 118 115 119 116 if (rc != EOK) { … … 126 123 return EOK; 127 124 } 128 /*----------------------------------------------------------------------------*/ 129 /** Callback when anew device is supposed to be controlled by this driver.130 * 131 * This callback is a wrapper for USB specific version of @c device_add.125 126 /** Callback when new device is supposed to be controlled by this driver. 127 * 128 * This callback is a wrapper for USB specific version of @c add_device. 132 129 * 133 130 * @param gen_dev Device structure as prepared by DDF. 134 131 * @return Error code. 135 132 */ 136 int generic_ device_add(ddf_dev_t *gen_dev)133 int generic_add_device(ddf_dev_t *gen_dev) 137 134 { 138 135 assert(driver); 139 136 assert(driver->ops); 140 assert(driver->ops-> device_add);137 assert(driver->ops->add_device); 141 138 142 139 int rc; … … 150 147 return rc; 151 148 } 152 gen_dev->driver_data = dev; 153 154 rc = driver->ops->device_add(dev); 155 if (rc != EOK) 156 usb_device_destroy(dev); 157 return rc; 158 } 159 /*----------------------------------------------------------------------------*/ 160 /** Callback when a device is supposed to be removed from the system. 161 * 162 * This callback is a wrapper for USB specific version of @c device_remove. 163 * 164 * @param gen_dev Device structure as prepared by DDF. 165 * @return Error code. 166 */ 167 int generic_device_remove(ddf_dev_t *gen_dev) 168 { 169 assert(driver); 170 assert(driver->ops); 171 if (driver->ops->device_rem == NULL) 172 return ENOTSUP; 173 /* Just tell the driver to stop whatever it is doing, keep structures */ 174 return driver->ops->device_rem(gen_dev->driver_data); 175 } 176 /*----------------------------------------------------------------------------*/ 177 /** Callback when a device was removed from the system. 178 * 179 * This callback is a wrapper for USB specific version of @c device_gone. 180 * 181 * @param gen_dev Device structure as prepared by DDF. 182 * @return Error code. 183 */ 184 int generic_device_gone(ddf_dev_t *gen_dev) 185 { 186 assert(driver); 187 assert(driver->ops); 188 if (driver->ops->device_gone == NULL) 189 return ENOTSUP; 190 usb_device_t *usb_dev = gen_dev->driver_data; 191 const int ret = driver->ops->device_gone(usb_dev); 192 if (ret == EOK) 193 usb_device_destroy(usb_dev); 194 195 return ret; 196 } 197 /*----------------------------------------------------------------------------*/ 149 150 return driver->ops->add_device(dev); 151 } 152 198 153 /** Destroy existing pipes of a USB device. 199 154 * … … 320 275 * @return Error code. 321 276 */ 322 int usb_device_create_pipes( constddf_dev_t *dev, usb_device_connection_t *wire,277 int usb_device_create_pipes(ddf_dev_t *dev, usb_device_connection_t *wire, 323 278 usb_endpoint_description_t **endpoints, 324 constuint8_t *config_descr, size_t config_descr_size,279 uint8_t *config_descr, size_t config_descr_size, 325 280 int interface_no, int interface_setting, 326 281 usb_endpoint_mapping_t **pipes_ptr, size_t *pipes_count_ptr) … … 336 291 int rc; 337 292 338 constsize_t pipe_count = count_other_pipes(endpoints);293 size_t pipe_count = count_other_pipes(endpoints); 339 294 if (pipe_count == 0) { 340 *pipes_count_ptr = pipe_count;341 295 *pipes_ptr = NULL; 342 296 return EOK; … … 395 349 } 396 350 397 if (usb_hc_connection_close(&hc_conn) != EOK) 398 usb_log_warning("usb_device_create_pipes(): " 399 "Failed to close connection.\n"); 351 usb_hc_connection_close(&hc_conn); 400 352 401 353 *pipes_ptr = pipes; … … 419 371 } 420 372 421 if (usb_hc_connection_close(&hc_conn) != EOK) 422 usb_log_warning("usb_device_create_pipes(): " 423 "Failed to close connection.\n"); 373 usb_hc_connection_close(&hc_conn); 424 374 425 375 /* … … 445 395 * @param[in] pipes_count Number of endpoints. 446 396 */ 447 int usb_device_destroy_pipes( constddf_dev_t *dev,397 int usb_device_destroy_pipes(ddf_dev_t *dev, 448 398 usb_endpoint_mapping_t *pipes, size_t pipes_count) 449 399 { 450 400 assert(dev != NULL); 401 assert(((pipes != NULL) && (pipes_count > 0)) 402 || ((pipes == NULL) && (pipes_count == 0))); 451 403 452 404 if (pipes_count == 0) { 453 assert(pipes == NULL);454 405 return EOK; 455 406 } 456 assert(pipes != NULL);457 407 458 408 int rc; … … 472 422 size_t i; 473 423 for (i = 0; i < pipes_count; i++) { 474 usb_log_debug2("Unregistering pipe %zu (%spresent).\n", 475 i, pipes[i].present ? "" : "not "); 476 if (pipes[i].present) 477 usb_pipe_unregister(pipes[i].pipe, &hc_conn); 424 usb_pipe_unregister(pipes[i].pipe, &hc_conn); 478 425 free(pipes[i].pipe); 479 426 } 480 427 481 if (usb_hc_connection_close(&hc_conn) != EOK) 482 usb_log_warning("usb_device_destroy_pipes(): " 483 "Failed to close connection.\n"); 428 usb_hc_connection_close(&hc_conn); 484 429 485 430 free(pipes); … … 599 544 600 545 /* Ignore errors and hope for the best. */ 601 destroy_current_pipes(dev); 546 usb_device_destroy_pipes(dev->ddf_dev, dev->pipes, dev->pipes_count); 547 if (dev->descriptors.configuration != NULL) { 548 free(dev->descriptors.configuration); 549 } 602 550 603 551 if (dev->alternate_interfaces != NULL) { 604 free(dev->alternate_interfaces->alternatives); 605 } 606 free(dev->alternate_interfaces); 607 free(dev->descriptors.configuration); 608 free(dev->driver_data); 609 } 610 611 void * usb_device_data_alloc(usb_device_t *usb_dev, size_t size) 612 { 613 assert(usb_dev); 614 assert(usb_dev->driver_data == NULL); 615 return usb_dev->driver_data = calloc(1, size); 616 552 if (dev->alternate_interfaces->alternatives != NULL) { 553 free(dev->alternate_interfaces->alternatives); 554 } 555 free(dev->alternate_interfaces); 556 } 557 558 free(dev); 617 559 } 618 560
Note:
See TracChangeset
for help on using the changeset viewer.