Changes in uspace/drv/usbhub/usbhub.c [6bb83c7:563fb40] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhub/usbhub.c
r6bb83c7 r563fb40 43 43 #include <usb/recognise.h> 44 44 #include <usb/devreq.h> 45 #include <usb/request.h>46 45 #include <usb/classes/hub.h> 47 46 … … 50 49 #include "port_status.h" 51 50 #include "usb/usb.h" 52 #include "usb/pipes.h" 51 52 static int iface_get_hc_handle(device_t *device, devman_handle_t *handle) 53 { 54 return usb_hc_find(device->handle, handle); 55 } 53 56 54 57 static usb_iface_t hub_usb_iface = { 55 .get_hc_handle = usb_drv_find_hc58 .get_hc_handle = iface_get_hc_handle 56 59 }; 57 60 … … 66 69 //********************************************* 67 70 68 usb_hub_info_t * usb_create_hub_info(device_t * device ) {71 usb_hub_info_t * usb_create_hub_info(device_t * device, int hc) { 69 72 usb_hub_info_t* result = usb_new(usb_hub_info_t); 70 usb_device_connection_initialize_from_device(&result->device_connection,71 device);72 usb_hc_connection_initialize_from_device(&result->connection,73 device);74 usb_endpoint_pipe_initialize_default_control(&result->endpoints.control,75 &result->device_connection);76 77 78 73 //result->device = device; 79 74 result->port_count = -1; … … 81 76 result->device = device; 82 77 83 //result->usb_device = usb_new(usb_hcd_attached_device_info_t); 84 78 79 dprintf(USB_LOG_LEVEL_DEBUG, "phone to hc = %d", hc); 80 if (hc < 0) { 81 return result; 82 } 83 //get some hub info 84 usb_address_t addr = usb_drv_get_my_address(hc, device); 85 dprintf(USB_LOG_LEVEL_DEBUG, "address of newly created hub = %d", addr); 86 /*if(addr<0){ 87 //return result; 88 89 }*/ 90 91 result->address = addr; 92 85 93 // get hub descriptor 86 94 … … 91 99 int opResult; 92 100 dprintf(USB_LOG_LEVEL_DEBUG, "starting control transaction"); 93 usb_endpoint_pipe_start_session(&result->endpoints.control);94 opResult = usb_ request_get_descriptor(&result->endpoints.control,101 102 opResult = usb_drv_req_get_descriptor(hc, addr, 95 103 USB_REQUEST_TYPE_CLASS, 96 104 USB_DESCTYPE_HUB, 0, 0, serialized_descriptor, 97 105 USB_HUB_MAX_DESCRIPTOR_SIZE, &received_size); 98 usb_endpoint_pipe_end_session(&result->endpoints.control);99 100 /* Initialize the interrupt endpoint.101 usb_endpoint_pipe_initalize(102 &hub_data->endpoints->status_change,103 &endpiont_descriptor, &hub_data->connection);104 105 */ /// \TODO add this call106 106 107 107 if (opResult != EOK) { … … 119 119 dprintf(USB_LOG_LEVEL_INFO, "setting port count to %d",descriptor->ports_count); 120 120 result->port_count = descriptor->ports_count; 121 result->attached_devs = (usb_h c_attached_device_t*)122 malloc((result->port_count+1) * sizeof(usb_h c_attached_device_t));121 result->attached_devs = (usb_hub_attached_device_t*) 122 malloc((result->port_count+1) * sizeof(usb_hub_attached_device_t)); 123 123 int i; 124 124 for(i=0;i<result->port_count+1;++i){ 125 result->attached_devs[i]. handle=0;125 result->attached_devs[i].devman_handle=0; 126 126 result->attached_devs[i].address=0; 127 127 } … … 148 148 dev->ops = &hub_device_ops; 149 149 150 151 usb_hub_info_t * hub_info = usb_create_hub_info(dev); 152 usb_endpoint_pipe_start_session(&hub_info->endpoints.control); 153 150 //create the hub structure 151 //get hc connection 152 int hc = usb_drv_hc_connect_auto(dev, 0); 153 if (hc < 0) { 154 return hc; 155 } 156 157 usb_hub_info_t * hub_info = usb_create_hub_info(dev, hc); 154 158 int port; 155 159 int opResult; 156 //usb_target_t target;157 //target.address = hub_info->usb_device->address;158 //target.endpoint = 0;160 usb_target_t target; 161 target.address = hub_info->address; 162 target.endpoint = 0; 159 163 160 164 //get configuration descriptor … … 162 166 // and all should be checked 163 167 usb_standard_device_descriptor_t std_descriptor; 164 opResult = usb_ request_get_device_descriptor(&hub_info->endpoints.control,168 opResult = usb_drv_req_get_device_descriptor(hc, target.address, 165 169 &std_descriptor); 166 170 if(opResult!=EOK){ … … 175 179 /// \TODO check other configurations 176 180 usb_standard_configuration_descriptor_t config_descriptor; 177 opResult = usb_ request_get_bare_configuration_descriptor(178 &hub_info->endpoints.control, 0,181 opResult = usb_drv_req_get_bare_configuration_descriptor(hc, 182 target.address, 0, 179 183 &config_descriptor); 180 184 if(opResult!=EOK){ … … 183 187 } 184 188 //set configuration 185 opResult = usb_ request_set_configuration(&hub_info->endpoints.control,189 opResult = usb_drv_req_set_configuration(hc, target.address, 186 190 config_descriptor.configuration_number); 187 191 … … 193 197 for (port = 1; port < hub_info->port_count+1; ++port) { 194 198 usb_hub_set_power_port_request(&request, port); 195 opResult = usb_endpoint_pipe_control_write(&hub_info->endpoints.control, 196 &request,sizeof(usb_device_request_setup_packet_t), NULL, 0); 199 opResult = usb_drv_sync_control_write(hc, target, &request, NULL, 0); 197 200 dprintf(USB_LOG_LEVEL_INFO, "powering port %d",port); 198 201 if (opResult != EOK) { … … 202 205 //ports powered, hub seems to be enabled 203 206 204 usb_endpoint_pipe_end_session(&hub_info->endpoints.control); 205 //async_hangup(hc); 207 async_hangup(hc); 206 208 207 209 //add the hub to list … … 217 219 218 220 dprintf(USB_LOG_LEVEL_INFO, "hub dev added"); 219 //address is lost...220 221 dprintf(USB_LOG_LEVEL_DEBUG, "\taddress %d, has %d ports ", 221 //hub_info->endpoints.control.,222 hub_info->address, 222 223 hub_info->port_count); 223 224 dprintf(USB_LOG_LEVEL_DEBUG, "\tused configuration %d",config_descriptor.configuration_number); … … 256 257 * @param target 257 258 */ 258 static void usb_hub_init_add_device( usb_hub_info_t * hub, uint16_t port) {259 static void usb_hub_init_add_device(int hc, uint16_t port, usb_target_t target) { 259 260 usb_device_request_setup_packet_t request; 260 261 int opResult; 261 262 dprintf(USB_LOG_LEVEL_INFO, "some connection changed"); 262 assert(hub->endpoints.control.hc_phone);263 263 //get default address 264 //opResult = usb_drv_reserve_default_address(hc); 265 opResult = usb_hc_reserve_default_address(&hub->connection, false); 264 opResult = usb_drv_reserve_default_address(hc); 266 265 if (opResult != EOK) { 267 266 dprintf(USB_LOG_LEVEL_WARNING, "cannot assign default address, it is probably used"); … … 270 269 //reset port 271 270 usb_hub_set_reset_port_request(&request, port); 272 opResult = usb_ endpoint_pipe_control_write(273 &hub->endpoints.control,274 &request, sizeof(usb_device_request_setup_packet_t),271 opResult = usb_drv_sync_control_write( 272 hc, target, 273 &request, 275 274 NULL, 0 276 275 ); 277 276 if (opResult != EOK) { 278 277 dprintf(USB_LOG_LEVEL_ERROR, "something went wrong when reseting a port"); 279 //usb_hub_release_default_address(hc); 280 usb_hc_release_default_address(&hub->connection); 278 usb_hub_release_default_address(hc); 281 279 } 282 280 } … … 289 287 */ 290 288 static void usb_hub_finalize_add_device( usb_hub_info_t * hub, 291 uint16_t port) {289 int hc, uint16_t port, usb_target_t target) { 292 290 293 291 int opResult; 294 292 dprintf(USB_LOG_LEVEL_INFO, "finalizing add device"); 295 opResult = usb_hub_clear_port_feature( &hub->endpoints.control,293 opResult = usb_hub_clear_port_feature(hc, target.address, 296 294 port, USB_HUB_FEATURE_C_PORT_RESET); 297 298 295 if (opResult != EOK) { 299 296 dprintf(USB_LOG_LEVEL_ERROR, "failed to clear port reset feature"); 300 usb_hc_release_default_address(&hub->connection); 301 return; 302 } 303 //create connection to device 304 usb_endpoint_pipe_t new_device_pipe; 305 usb_device_connection_t new_device_connection; 306 usb_device_connection_initialize_on_default_address( 307 &new_device_connection, 308 &hub->connection 309 ); 310 usb_endpoint_pipe_initialize_default_control( 311 &new_device_pipe, 312 &new_device_connection); 313 /// \TODO get highspeed info 314 315 316 317 318 319 /* Request address from host controller. */ 320 usb_address_t new_device_address = usb_hc_request_address( 321 &hub->connection, 322 false/// \TODO fullspeed?? 323 ); 297 usb_hub_release_default_address(hc); 298 return; 299 } 300 301 /* Request address at from host controller. */ 302 usb_address_t new_device_address = usb_drv_request_address(hc); 324 303 if (new_device_address < 0) { 325 304 dprintf(USB_LOG_LEVEL_ERROR, "failed to get free USB address"); 326 305 opResult = new_device_address; 327 usb_h c_release_default_address(&hub->connection);306 usb_hub_release_default_address(hc); 328 307 return; 329 308 } 330 309 dprintf(USB_LOG_LEVEL_INFO, "setting new address %d",new_device_address); 331 //opResult = usb_drv_req_set_address(hc, USB_ADDRESS_DEFAULT, 332 // new_device_address); 333 opResult = usb_request_set_address(&new_device_pipe,new_device_address); 310 opResult = usb_drv_req_set_address(hc, USB_ADDRESS_DEFAULT, 311 new_device_address); 334 312 335 313 if (opResult != EOK) { 336 314 dprintf(USB_LOG_LEVEL_ERROR, "could not set address for new device"); 337 usb_hc_release_default_address(&hub->connection); 338 return; 339 } 340 341 342 //opResult = usb_hub_release_default_address(hc); 343 opResult = usb_hc_release_default_address(&hub->connection); 315 usb_hub_release_default_address(hc); 316 return; 317 } 318 319 320 opResult = usb_hub_release_default_address(hc); 344 321 if(opResult!=EOK){ 345 322 return; 346 323 } 347 324 325 devman_handle_t hc_handle; 326 opResult = usb_drv_find_hc(hub->device, &hc_handle); 327 if (opResult != EOK) { 328 usb_log_error("Failed to get handle of host controller: %s.\n", 329 str_error(opResult)); 330 return; 331 } 332 348 333 devman_handle_t child_handle; 349 //?? 350 opResult = usb_device_register_child_in_devman(new_device_address, 351 hub->connection.hc_handle, hub->device, &child_handle); 352 334 opResult = usb_device_register_child_in_devman(new_device_address, 335 hc_handle, hub->device, &child_handle); 353 336 if (opResult != EOK) { 354 337 dprintf(USB_LOG_LEVEL_ERROR, "could not start driver for new device"); 355 338 return; 356 339 } 357 hub->attached_devs[port]. handle = child_handle;340 hub->attached_devs[port].devman_handle = child_handle; 358 341 hub->attached_devs[port].address = new_device_address; 359 342 360 //opResult = usb_drv_bind_address(hc, new_device_address, child_handle); 361 opResult = usb_hc_register_device( 362 &hub->connection, 363 &hub->attached_devs[port]); 343 opResult = usb_drv_bind_address(hc, new_device_address, child_handle); 364 344 if (opResult != EOK) { 365 345 dprintf(USB_LOG_LEVEL_ERROR, "could not assign address of device in hcd"); … … 378 358 */ 379 359 static void usb_hub_removed_device( 380 usb_hub_info_t * hub, uint16_t port) {360 usb_hub_info_t * hub, int hc, uint16_t port, usb_target_t target) { 381 361 //usb_device_request_setup_packet_t request; 382 362 int opResult; … … 385 365 * devide manager 386 366 */ 387 367 368 hub->attached_devs[port].devman_handle=0; 388 369 //close address 389 370 if(hub->attached_devs[port].address!=0){ 390 //opResult = usb_drv_release_address(hc,hub->attached_devs[port].address); 391 opResult = usb_hc_unregister_device( 392 &hub->connection, hub->attached_devs[port].address); 371 opResult = usb_drv_release_address(hc,hub->attached_devs[port].address); 393 372 if(opResult != EOK) { 394 373 dprintf(USB_LOG_LEVEL_WARNING, "could not release address of " \ … … 396 375 } 397 376 hub->attached_devs[port].address = 0; 398 hub->attached_devs[port].handle = 0;399 377 }else{ 400 378 dprintf(USB_LOG_LEVEL_WARNING, "this is strange, disconnected device had no address"); 401 379 //device was disconnected before it`s port was reset - return default address 402 //usb_drv_release_default_address(hc); 403 usb_hc_release_default_address(&hub->connection); 380 usb_drv_release_default_address(hc); 404 381 } 405 382 } … … 411 388 * @param target 412 389 */ 413 static void usb_hub_process_interrupt(usb_hub_info_t * hub, 414 uint16_t port ) {390 static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc, 391 uint16_t port, usb_address_t address) { 415 392 dprintf(USB_LOG_LEVEL_DEBUG, "interrupt at port %d", port); 416 393 //determine type of change 417 usb_endpoint_pipe_t *pipe = &hub->endpoints.control;418 int opResult = usb_endpoint_pipe_start_session(pipe);419 420 if(opResult != EOK){421 dprintf(USB_LOG_LEVEL_ERROR, "cannot open pipe %d", opResult);422 }423 424 /*425 394 usb_target_t target; 426 395 target.address=address; 427 396 target.endpoint=0; 428 */429 430 397 usb_port_status_t status; 431 398 size_t rcvd_size; 432 399 usb_device_request_setup_packet_t request; 433 //int opResult;400 int opResult; 434 401 usb_hub_set_port_status_request(&request, port); 435 402 //endpoint 0 436 403 437 opResult = usb_ endpoint_pipe_control_read(438 pipe,439 &request, sizeof(usb_device_request_setup_packet_t),404 opResult = usb_drv_sync_control_read( 405 hc, target, 406 &request, 440 407 &status, 4, &rcvd_size 441 408 ); … … 450 417 //something connected/disconnected 451 418 if (usb_port_connect_change(&status)) { 452 opResult = usb_hub_clear_port_feature( pipe,419 opResult = usb_hub_clear_port_feature(hc, target.address, 453 420 port, USB_HUB_FEATURE_C_PORT_CONNECTION); 454 421 // TODO: check opResult 455 422 if (usb_port_dev_connected(&status)) { 456 423 dprintf(USB_LOG_LEVEL_INFO, "some connection changed"); 457 usb_hub_init_add_device(h ub, port);424 usb_hub_init_add_device(hc, port, target); 458 425 } else { 459 usb_hub_removed_device(hub, port);426 usb_hub_removed_device(hub, hc, port, target); 460 427 } 461 428 } … … 464 431 dprintf(USB_LOG_LEVEL_INFO, "port reset complete"); 465 432 if (usb_port_enabled(&status)) { 466 usb_hub_finalize_add_device(hub, port);433 usb_hub_finalize_add_device(hub, hc, port, target); 467 434 } else { 468 435 dprintf(USB_LOG_LEVEL_WARNING, "ERROR: port reset, but port still not enabled"); … … 480 447 /// \TODO handle other changes 481 448 /// \TODO debug log for various situations 482 usb_endpoint_pipe_end_session(pipe);483 484 449 485 450 } … … 499 464 fibril_mutex_unlock(&usb_hub_list_lock); 500 465 usb_hub_info_t * hub_info = ((usb_hub_info_t*)lst_item->data); 501 int opResult;502 503 opResult = usb_endpoint_pipe_start_session(&hub_info->endpoints.status_change);504 if(opResult != EOK){505 continue;506 }507 466 /* 508 467 * Check status change pipe of this hub. 509 468 */ 510 /* 469 511 470 usb_target_t target; 512 471 target.address = hub_info->address; … … 514 473 dprintf(USB_LOG_LEVEL_INFO, "checking changes for hub at addr %d", 515 474 target.address); 516 */ 475 517 476 size_t port_count = hub_info->port_count; 518 477 519 478 /* 520 479 * Connect to respective HC. 521 * 480 */ 522 481 int hc = usb_drv_hc_connect_auto(hub_info->device, 0); 523 482 if (hc < 0) { 524 483 continue; 525 } */484 } 526 485 527 486 /// FIXME: count properly … … 530 489 void *change_bitmap = malloc(byte_length); 531 490 size_t actual_size; 532 //usb_handle_t handle;491 usb_handle_t handle; 533 492 534 493 /* 535 494 * Send the request. 536 495 */ 537 opResult = usb_endpoint_pipe_read( 538 &hub_info->endpoints.status_change, 539 change_bitmap, byte_length, &actual_size 540 ); 541 542 //usb_drv_async_wait_for(handle); 496 int opResult = usb_drv_async_interrupt_in(hc, target, 497 change_bitmap, byte_length, &actual_size, 498 &handle); 499 500 usb_drv_async_wait_for(handle); 543 501 544 502 if (opResult != EOK) { … … 553 511 if (interrupt) { 554 512 usb_hub_process_interrupt( 555 hub_info, port);513 hub_info, hc, port, hub_info->address); 556 514 } 557 515 } 558 usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);559 516 free(change_bitmap); 560 561 562 //async_hangup(hc); 517 518 async_hangup(hc); 563 519 fibril_mutex_lock(&usb_hub_list_lock); 564 520 }
Note:
See TracChangeset
for help on using the changeset viewer.