Changes in / [3dfdcb7:ee7e7c93] in mainline
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
r3dfdcb7 ree7e7c93 570 570 571 571 % USB release build (less logging) 572 ! CONFIG_USB_RELEASE_BUILD ( y/n)572 ! CONFIG_USB_RELEASE_BUILD (n/y) 573 573 574 574 % Start virtual USB host controller … … 576 576 577 577 % Polling UHCI & OHCI (no interrupts) 578 ! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_USBHC_NO_INTERRUPTS ( n/y)578 ! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_USBHC_NO_INTERRUPTS (y/n) 579 579 580 580 % Run devman in kconsole (not recommended) -
uspace/drv/ehci-hcd/hc_iface.c
r3dfdcb7 ree7e7c93 48 48 methodname, __FILE__, __LINE__) 49 49 50 /** Reserve default address. 51 * 52 * This function may block the caller. 53 * 54 * @param[in] fun Device function the action was invoked on. 55 * @param[in] speed Speed of the device for which the default address is 56 * reserved. 57 * @return Error code. 58 */ 59 static int reserve_default_address(ddf_fun_t *fun, usb_speed_t speed) 60 { 61 UNSUPPORTED("reserve_default_address"); 62 63 return ENOTSUP; 64 } 65 66 /** Release default address. 67 * 68 * @param[in] fun Device function the action was invoked on. 69 * @return Error code. 70 */ 71 static int release_default_address(ddf_fun_t *fun) 72 { 73 UNSUPPORTED("release_default_address"); 74 75 return ENOTSUP; 76 } 77 50 78 /** Found free USB address. 51 79 * … … 304 332 /** Host controller interface implementation for EHCI. */ 305 333 usbhc_iface_t ehci_hc_iface = { 334 .reserve_default_address = reserve_default_address, 335 .release_default_address = release_default_address, 306 336 .request_address = request_address, 307 337 .bind_address = bind_address, -
uspace/drv/ohci/root_hub.c
r3dfdcb7 ree7e7c93 117 117 */ 118 118 static const uint32_t hub_clear_feature_by_writing_one_mask = 119 119 RHS_CLEAR_PORT_POWER; 120 120 121 121 /** … … 412 412 request->transfered_size = 4; 413 413 uint32_t data = instance->registers->rh_port_status[port - 1]; 414 memcpy(request->data_buffer, &data,4);414 memcpy(request->data_buffer,&data,4); 415 415 #if 0 416 416 int i; … … 445 445 uint32_t data = mask & instance->registers->rh_status; 446 446 //uint32_buffer[0] = mask & instance->registers->rh_status; 447 memcpy(request->data_buffer, &data,4);447 memcpy(request->data_buffer,&data,4); 448 448 449 449 return EOK; … … 499 499 | (1 << (USB_HUB_FEATURE_C_HUB_OVER_CURRENT + 16)); 500 500 bzero(bitmap, instance->interrupt_mask_size); 501 if ((instance->registers->rh_status & mask) != 0) {501 if ((instance->registers->rh_status & mask) !=0 ) { 502 502 bitmap[0] = 1; 503 503 } … … 925 925 * @return 926 926 */ 927 static int process_interrupt_mask_in_instance(rh_t *instance, 928 usb_transfer_batch_t * request) { 927 static int process_interrupt_mask_in_instance(rh_t *instance, usb_transfer_batch_t * request) { 929 928 memcpy(request->data_buffer, instance->interrupt_buffer, 930 929 instance->interrupt_mask_size); … … 946 945 * @return 947 946 */ 948 static bool is_zeros(void * buffer, size_t size) {947 static bool is_zeros(void * buffer, size_t size) { 949 948 if (!buffer) return true; 950 949 if (!size) return true; -
uspace/drv/uhci-rhd/port.h
r3dfdcb7 ree7e7c93 55 55 56 56 /** UHCI port structure */ 57 typedef struct uhci_port { 57 typedef struct uhci_port 58 { 58 59 const char *id_string; 59 60 port_status_t *address; … … 67 68 68 69 int uhci_port_init( 69 70 70 uhci_port_t *port, port_status_t *address, unsigned number, 71 unsigned usec, ddf_dev_t *rh); 71 72 72 73 void uhci_port_fini(uhci_port_t *port); -
uspace/drv/usbhid/generic/hiddev.c
r3dfdcb7 ree7e7c93 99 99 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data; 100 100 101 usb_log_debug2("hid_dev: %p, Max input report size (% zu).\n",101 usb_log_debug2("hid_dev: %p, Max input report size (%d).\n", 102 102 hid_dev, hid_dev->max_input_report_size); 103 103 … … 226 226 } 227 227 228 usb_log_debug("HID function created. Handle: % " PRIun "\n", fun->handle);228 usb_log_debug("HID function created. Handle: %d\n", fun->handle); 229 229 230 230 return EOK; -
uspace/drv/usbhid/kbd/kbddev.c
r3dfdcb7 ree7e7c93 798 798 } 799 799 800 usb_log_debug("%s function created. Handle: % " PRIun "\n",801 HID_KBD_FUN_NAME,fun->handle);800 usb_log_debug("%s function created. Handle: %d\n", HID_KBD_FUN_NAME, 801 fun->handle); 802 802 803 803 usb_log_debug("Adding DDF function to class %s...\n", -
uspace/drv/usbhid/multimedia/multimedia.c
r3dfdcb7 ree7e7c93 211 211 } 212 212 213 usb_log_debug("%s function created (jandle: %" PRIun ").\n", 214 NAME, fun->handle); 213 usb_log_debug("%s function created. Handle: %d\n", NAME, fun->handle); 215 214 216 215 rc = ddf_fun_add_to_class(fun, "keyboard"); -
uspace/drv/usbhub/port_status.h
r3dfdcb7 ree7e7c93 64 64 */ 65 65 static inline void usb_hub_set_port_status_request( 66 usb_device_request_setup_packet_t *request, uint16_t port) { 66 usb_device_request_setup_packet_t * request, uint16_t port 67 ) { 67 68 request->index = port; 68 69 request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS; … … 78 79 */ 79 80 static inline void usb_hub_set_hub_status_request( 80 usb_device_request_setup_packet_t *request) { 81 usb_device_request_setup_packet_t * request 82 ) { 81 83 request->index = 0; 82 84 request->request_type = USB_HUB_REQ_TYPE_GET_HUB_STATUS; … … 93 95 static inline usb_device_request_setup_packet_t * 94 96 usb_hub_create_port_status_request(uint16_t port) { 95 usb_device_request_setup_packet_t * result =96 malloc(sizeof(usb_device_request_setup_packet_t));97 usb_device_request_setup_packet_t * result = 98 malloc(sizeof(usb_device_request_setup_packet_t)); 97 99 usb_hub_set_port_status_request(result, port); 98 100 return result; … … 106 108 */ 107 109 static inline void usb_hub_set_enable_port_feature_request( 108 usb_device_request_setup_packet_t *request, uint16_t port, 109 uint16_t feature_selector) { 110 usb_device_request_setup_packet_t * request, uint16_t port, 111 uint16_t feature_selector 112 ) { 110 113 request->index = port; 111 114 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 122 125 */ 123 126 static inline void usb_hub_set_disable_port_feature_request( 124 usb_device_request_setup_packet_t *request, uint16_t port,125 126 127 usb_device_request_setup_packet_t * request, uint16_t port, 128 uint16_t feature_selector 129 ) { 127 130 request->index = port; 128 131 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 138 141 */ 139 142 static inline void usb_hub_set_enable_port_request( 140 usb_device_request_setup_packet_t *request, uint16_t port141 143 usb_device_request_setup_packet_t * request, uint16_t port 144 ) { 142 145 request->index = port; 143 146 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 154 157 static inline usb_device_request_setup_packet_t * 155 158 usb_hub_create_enable_port_request(uint16_t port) { 156 usb_device_request_setup_packet_t * result =157 malloc(sizeof(usb_device_request_setup_packet_t));159 usb_device_request_setup_packet_t * result = 160 malloc(sizeof(usb_device_request_setup_packet_t)); 158 161 usb_hub_set_enable_port_request(result, port); 159 162 return result; … … 166 169 */ 167 170 static inline void usb_hub_set_disable_port_request( 168 usb_device_request_setup_packet_t *request, uint16_t port169 171 usb_device_request_setup_packet_t * request, uint16_t port 172 ) { 170 173 request->index = port; 171 174 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 182 185 static inline usb_device_request_setup_packet_t * 183 186 usb_hub_create_disable_port_request(uint16_t port) { 184 usb_device_request_setup_packet_t * result =185 malloc(sizeof(usb_device_request_setup_packet_t));187 usb_device_request_setup_packet_t * result = 188 malloc(sizeof(usb_device_request_setup_packet_t)); 186 189 usb_hub_set_disable_port_request(result, port); 187 190 return result; … … 194 197 */ 195 198 static inline void usb_hub_set_reset_port_request( 196 usb_device_request_setup_packet_t *request, uint16_t port197 199 usb_device_request_setup_packet_t * request, uint16_t port 200 ) { 198 201 request->index = port; 199 202 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 210 213 static inline usb_device_request_setup_packet_t * 211 214 usb_hub_create_reset_port_request(uint16_t port) { 212 usb_device_request_setup_packet_t * result =213 malloc(sizeof(usb_device_request_setup_packet_t));215 usb_device_request_setup_packet_t * result = 216 malloc(sizeof(usb_device_request_setup_packet_t)); 214 217 usb_hub_set_reset_port_request(result, port); 215 218 return result; … … 222 225 */ 223 226 static inline void usb_hub_set_power_port_request( 224 usb_device_request_setup_packet_t *request, uint16_t port225 227 usb_device_request_setup_packet_t * request, uint16_t port 228 ) { 226 229 request->index = port; 227 230 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 237 240 */ 238 241 static inline void usb_hub_unset_power_port_request( 239 usb_device_request_setup_packet_t *request, uint16_t port240 242 usb_device_request_setup_packet_t * request, uint16_t port 243 ) { 241 244 request->index = port; 242 245 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 254 257 */ 255 258 static inline bool usb_port_is_status(usb_port_status_t status, int idx) { 256 return (status & (1 << idx)) !=0;259 return (status&(1 << idx))!=0; 257 260 } 258 261 … … 265 268 */ 266 269 static inline void usb_port_status_set_bit( 267 270 usb_port_status_t * status, int idx, bool value) { 268 271 (*status) = value ? 269 270 272 ((*status) | (1 << (idx))) : 273 ((*status)&(~(1 << (idx)))); 271 274 } 272 275 … … 279 282 */ 280 283 static inline bool usb_hub_is_status(usb_hub_status_t status, int idx) { 281 return (status & (1 << idx)) !=0;284 return (status&(1 << idx))!=0; 282 285 } 283 286 … … 290 293 */ 291 294 static inline void usb_hub_status_set_bit( 292 usb_hub_status_t *status, int idx, bool value) {295 usb_hub_status_t * status, int idx, bool value) { 293 296 (*status) = value ? 294 ((*status) | (1 << (idx))) : 295 ((*status)&(~(1 << (idx)))); 296 } 297 297 ((*status) | (1 << (idx))) : 298 ((*status)&(~(1 << (idx)))); 299 } 300 301 302 #if 0 303 /** 304 * connection status geter for port status 305 * 306 * @param status 307 * @return true if there is something connected 308 */ 309 static inline bool usb_port_dev_connected(usb_port_status_t * status) { 310 return usb_port_get_bit(status, 0); 311 } 312 313 /** 314 * set device connected bit in port status 315 * 316 * @param status 317 * @param connected value of the bit 318 */ 319 static inline void usb_port_set_dev_connected(usb_port_status_t * status, bool connected) { 320 usb_port_set_bit(status, 0, connected); 321 } 322 323 //port enabled 324 325 /** 326 * port enabled getter for port status 327 * 328 * @param status 329 * @return true if the port is enabled 330 */ 331 static inline bool usb_port_enabled(usb_port_status_t * status) { 332 return usb_port_get_bit(status, 1); 333 } 334 335 /** 336 * set port enabled bit in port status 337 * 338 * @param status 339 * @param enabled value of the bit 340 */ 341 static inline void usb_port_set_enabled(usb_port_status_t * status, bool enabled) { 342 usb_port_set_bit(status, 1, enabled); 343 } 344 345 //port suspended 346 /** 347 * port suspended getter for port status 348 * 349 * @param status 350 * @return true if port is suspended 351 */ 352 static inline bool usb_port_suspended(usb_port_status_t * status) { 353 return usb_port_get_bit(status, 2); 354 } 355 356 /** 357 * set port suspended bit in port status 358 * 359 * @param status 360 * @param suspended value of the bit 361 */ 362 static inline void usb_port_set_suspended(usb_port_status_t * status, bool suspended) { 363 usb_port_set_bit(status, 2, suspended); 364 } 365 366 //over currect 367 /** 368 * over current condition indicator getter for port status 369 * 370 * @param status 371 * @return true if there is opver-current condition on the hub 372 */ 373 static inline bool usb_port_over_current(usb_port_status_t * status) { 374 return usb_port_get_bit(status, 3); 375 } 376 377 /** 378 * set over current indicator bit in port status 379 * 380 * @param status 381 * @param value value of the bit 382 */ 383 static inline void usb_port_set_over_current(usb_port_status_t * status, bool value) { 384 usb_port_set_bit(status, 3, value); 385 } 386 387 //port reset 388 /** 389 * port reset indicator getter for port status 390 * 391 * @param status 392 * @return true if port is reset 393 */ 394 static inline bool usb_port_reset(usb_port_status_t * status) { 395 return usb_port_get_bit(status, 4); 396 } 397 398 /** 399 * set port reset bit in port status 400 * 401 * @param status 402 * @param value value of the bit 403 */ 404 static inline void usb_port_set_reset(usb_port_status_t * status, bool value) { 405 usb_port_set_bit(status, 4, value); 406 } 407 408 //powered 409 /** 410 * power state getter for port status 411 * 412 * @param status 413 * @return true if port is powered 414 */ 415 static inline bool usb_port_powered(usb_port_status_t * status) { 416 return usb_port_get_bit(status, 8); 417 } 418 419 /** 420 * set port powered bit in port status 421 * 422 * @param status 423 * @param powered value of the bit 424 */ 425 static inline void usb_port_set_powered(usb_port_status_t * status, bool powered) { 426 usb_port_set_bit(status, 8, powered); 427 } 428 429 #endif 430 431 //low speed device attached 298 432 /** 299 433 * low speed device on the port indicator … … 312 446 * @param low_speed value of the bit 313 447 */ 314 static inline void usb_port_set_low_speed(usb_port_status_t * status, bool low_speed) {448 static inline void usb_port_set_low_speed(usb_port_status_t * status, bool low_speed) { 315 449 usb_port_status_set_bit(status, 9, low_speed); 316 450 } 317 451 318 452 //high speed device attached 319 320 453 /** 321 454 * high speed device on the port indicator … … 334 467 * @param high_speed value of the bit 335 468 */ 336 static inline void usb_port_set_high_speed(usb_port_status_t * status, bool high_speed) {469 static inline void usb_port_set_high_speed(usb_port_status_t * status, bool high_speed) { 337 470 usb_port_status_set_bit(status, 10, high_speed); 338 471 } … … 352 485 } 353 486 487 #if 0 488 //connect change 489 /** 490 * port connect change indicator 491 * 492 * @param status 493 * @return true if connection has changed 494 */ 495 static inline bool usb_port_connect_change(usb_port_status_t * status) { 496 return usb_port_get_bit(status, 16); 497 } 498 499 /** 500 * set connection change bit in port status 501 * @param status 502 * @param change value of the bit 503 */ 504 static inline void usb_port_set_connect_change(usb_port_status_t * status, bool change) { 505 usb_port_set_bit(status, 16, change); 506 } 507 508 //port enable change 509 /** 510 * port enable change for port status 511 * 512 * @param status 513 * @return true if the port has been enabled/disabled 514 */ 515 static inline bool usb_port_enabled_change(usb_port_status_t * status) { 516 return usb_port_get_bit(status, 17); 517 } 518 519 /** 520 * set port enable change bit in port status 521 * 522 * @param status 523 * @param change value of the bit 524 */ 525 static inline void usb_port_set_enabled_change(usb_port_status_t * status, bool change) { 526 usb_port_set_bit(status, 17, change); 527 } 528 529 //suspend change 530 /** 531 * port suspend change for port status 532 * 533 * @param status 534 * @return ture if suspend status has changed 535 */ 536 static inline bool usb_port_suspend_change(usb_port_status_t * status) { 537 return usb_port_get_bit(status, 18); 538 } 539 540 /** 541 * set port suspend change bit in port status 542 * 543 * @param status 544 * @param change value of the bit 545 */ 546 static inline void usb_port_set_suspend_change(usb_port_status_t * status, bool change) { 547 usb_port_set_bit(status, 18, change); 548 } 549 550 //over current change 551 /** 552 * over current change indicator 553 * 554 * @param status 555 * @return true if over-current condition on port has changed 556 */ 557 static inline bool usb_port_overcurrent_change(usb_port_status_t * status) { 558 return usb_port_get_bit(status, 19); 559 } 560 561 /** 562 * set port over current change bit in port status 563 * 564 * @param status 565 * @param change value of the bit 566 */ 567 static inline void usb_port_set_overcurrent_change(usb_port_status_t * status, bool change) { 568 usb_port_set_bit(status, 19, change); 569 } 570 571 //reset change 572 /** 573 * port reset change indicator 574 * @param status 575 * @return true if port has been reset 576 */ 577 static inline bool usb_port_reset_completed(usb_port_status_t * status) { 578 return usb_port_get_bit(status, 20); 579 } 580 581 /** 582 * set port reset completed bit in port status 583 * 584 * @param status 585 * @param change value of the bit 586 */ 587 static inline void usb_port_set_reset_completed(usb_port_status_t * status, bool completed) { 588 usb_port_set_bit(status, 20, completed); 589 } 590 591 //local power status 592 /** 593 * local power lost indicator for hub status 594 * 595 * @param status 596 * @return true if hub is not powered 597 */ 598 static inline bool usb_hub_local_power_lost(usb_hub_status_t * status) { 599 return usb_hub_get_bit(status, 0); 600 } 601 602 /** 603 * set hub power lost bit in hub status 604 * 605 * @param status 606 * @param change value of the bit 607 */ 608 static inline void usb_hub_set_local_power_lost(usb_port_status_t * status, 609 bool power_lost) { 610 usb_hub_set_bit(status, 0, power_lost); 611 } 612 613 //over current ocndition 614 /** 615 * hub over-current indicator 616 * 617 * @param status 618 * @return true if over-current condition occurred on hub 619 */ 620 static inline bool usb_hub_over_current(usb_hub_status_t * status) { 621 return usb_hub_get_bit(status, 1); 622 } 623 624 /** 625 * set hub over current bit in hub status 626 * 627 * @param status 628 * @param change value of the bit 629 */ 630 static inline void usb_hub_set_over_current(usb_port_status_t * status, 631 bool over_current) { 632 usb_hub_set_bit(status, 1, over_current); 633 } 634 635 //local power change 636 /** 637 * hub power change indicator 638 * 639 * @param status 640 * @return true if local power status has been changed - power has been 641 * dropped or re-established 642 */ 643 static inline bool usb_hub_local_power_change(usb_hub_status_t * status) { 644 return usb_hub_get_bit(status, 16); 645 } 646 647 /** 648 * set hub power change bit in hub status 649 * 650 * @param status 651 * @param change value of the bit 652 */ 653 static inline void usb_hub_set_local_power_change(usb_port_status_t * status, 654 bool change) { 655 usb_hub_set_bit(status, 16, change); 656 } 657 658 //local power status 659 /** 660 * hub over-current condition change indicator 661 * 662 * @param status 663 * @return true if over-current condition has changed 664 */ 665 static inline bool usb_hub_over_current_change(usb_hub_status_t * status) { 666 return usb_hub_get_bit(status, 17); 667 } 668 669 /** 670 * set hub over current change bit in hub status 671 * 672 * @param status 673 * @param change value of the bit 674 */ 675 static inline void usb_hub_set_over_current_change(usb_port_status_t * status, 676 bool change) { 677 usb_hub_set_bit(status, 17, change); 678 } 679 #endif 354 680 355 681 -
uspace/drv/usbhub/ports.c
r3dfdcb7 ree7e7c93 47 47 #include "port_status.h" 48 48 49 49 50 /** Information for fibril for device discovery. */ 50 51 struct add_device_phase1 { … … 64 65 * any function here and must be cleared by hand 65 66 */ 66 static const int non_handled_changes[] = {67 static const int non_handled_changes[] = { 67 68 USB_HUB_FEATURE_C_PORT_ENABLE, 68 69 USB_HUB_FEATURE_C_PORT_SUSPEND … … 70 71 71 72 static void usb_hub_removed_device( 72 usb_hub_info_t *hub, uint16_t port);73 74 static void usb_hub_port_reset_completed(usb_hub_info_t * hub,75 76 77 static void usb_hub_port_over_current(usb_hub_info_t * hub,78 73 usb_hub_info_t * hub, uint16_t port); 74 75 static void usb_hub_port_reset_completed(usb_hub_info_t * hub, 76 uint16_t port, uint32_t status); 77 78 static void usb_hub_port_over_current(usb_hub_info_t * hub, 79 uint16_t port, uint32_t status); 79 80 80 81 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, … … 95 96 * @param port port number, starting from 1 96 97 */ 97 void usb_hub_process_interrupt(usb_hub_info_t * hub,98 99 usb_log_debug(" Interrupt at port %zu\n", (size_t) port);98 void usb_hub_process_interrupt(usb_hub_info_t * hub, 99 uint16_t port) { 100 usb_log_debug("interrupt at port %zu\n", (size_t) port); 100 101 //determine type of change 101 102 //usb_pipe_t *pipe = hub->control_pipe; … … 133 134 if (usb_port_is_status(status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT)) { 134 135 //check if it was not auto-resolved 135 usb_log_debug(" Overcurrent change on port\n");136 usb_log_debug("overcurrent change on port\n"); 136 137 usb_hub_port_over_current(hub, port, status); 137 138 } … … 140 141 usb_hub_port_reset_completed(hub, port, status); 141 142 } 142 usb_log_debug(" Status x%x : %d\n ", status, status);143 usb_log_debug("status x%x : %d\n ", status, status); 143 144 144 145 usb_port_status_set_bit( 145 &status, USB_HUB_FEATURE_C_PORT_CONNECTION, 146 &status, USB_HUB_FEATURE_C_PORT_CONNECTION,false); 146 147 usb_port_status_set_bit( 147 &status, USB_HUB_FEATURE_C_PORT_RESET, 148 &status, USB_HUB_FEATURE_C_PORT_RESET,false); 148 149 usb_port_status_set_bit( 149 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, 150 150 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT,false); 151 151 152 //clearing not yet handled changes 152 153 unsigned int feature_idx; 153 for (feature_idx = 0; 154 feature_idx < non_handled_changes_count; 155 ++feature_idx) { 154 for(feature_idx = 0;feature_idx<non_handled_changes_count; 155 ++feature_idx){ 156 156 unsigned int bit_idx = non_handled_changes[feature_idx]; 157 if (status & (1 << bit_idx)){157 if(status & (1<<bit_idx)){ 158 158 usb_log_info( 159 " There was not yet handled change on port %d: %d"159 "there was not yet handled change on port %d: %d" 160 160 ";clearing it\n", 161 161 port, bit_idx); 162 162 int opResult = usb_hub_clear_port_feature( 163 163 hub->control_pipe, … … 165 165 if (opResult != EOK) { 166 166 usb_log_warning( 167 " Could not clear port flag %d: %s\n",168 bit_idx, str_error(opResult)167 "could not clear port flag %d: %d\n", 168 bit_idx, opResult 169 169 ); 170 170 } 171 171 usb_port_status_set_bit( 172 &status, bit_idx, 172 &status, bit_idx,false); 173 173 } 174 174 } 175 if (status >> 16){176 usb_log_info(" There is still some unhandled change %X\n",175 if(status>>16){ 176 usb_log_info("there is still some unhandled change %X\n", 177 177 status); 178 178 } 179 179 } 180 180 181 181 182 /** … … 189 190 */ 190 191 static void usb_hub_removed_device( 191 usb_hub_info_t *hub, uint16_t port) {192 usb_hub_info_t * hub, uint16_t port) { 192 193 193 194 int opResult = usb_hub_clear_port_feature(hub->control_pipe, 194 195 port, USB_HUB_FEATURE_C_PORT_CONNECTION); 195 196 if (opResult != EOK) { 196 usb_log_warning(" Could not clear port-change-connection flag\n");197 usb_log_warning("could not clear port-change-connection flag\n"); 197 198 } 198 199 /** \TODO remove device from device manager - not yet implemented in … … 201 202 202 203 //close address 203 204 usb_hub_port_t *the_port = hub->ports + port; 205 206 fibril_mutex_lock(&hub->port_mutex); 207 208 if (the_port->attached_device.address >= 0) { 209 usb_log_warning("Device unplug on `%s' (port %zu): " \ 210 "not implemented.\n", hub->usb_device->ddf_dev->name, 211 (size_t) port); 212 the_port->attached_device.address = -1; 213 the_port->attached_device.handle = 0; 204 if(hub->ports[port].attached_device.address >= 0){ 205 /*uncomment this code to use it when DDF allows device removal 206 opResult = usb_hc_unregister_device( 207 &hub->connection, 208 hub->attached_devs[port].address); 209 if(opResult != EOK) { 210 dprintf(USB_LOG_LEVEL_WARNING, "could not release " 211 "address of " 212 "removed device: %d", opResult); 213 } 214 hub->attached_devs[port].address = 0; 215 hub->attached_devs[port].handle = 0; 216 */ 214 217 } else { 215 218 usb_log_warning("Device removed before being registered.\n"); … … 220 223 * port reset callback from new device wrapper. 221 224 */ 225 usb_hub_port_t *the_port = hub->ports + port; 222 226 fibril_mutex_lock(&the_port->reset_mutex); 223 227 the_port->reset_completed = true; … … 226 230 fibril_mutex_unlock(&the_port->reset_mutex); 227 231 } 228 229 fibril_mutex_unlock(&hub->port_mutex); 230 } 232 } 233 231 234 232 235 /** … … 239 242 * @param status 240 243 */ 241 static void usb_hub_port_reset_completed(usb_hub_info_t * hub,242 uint16_t port, uint32_t status){244 static void usb_hub_port_reset_completed(usb_hub_info_t * hub, 245 uint16_t port, uint32_t status){ 243 246 usb_log_debug("Port %zu reset complete.\n", (size_t) port); 244 247 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) { … … 272 275 * @param port port number, starting from 1 273 276 */ 274 static void usb_hub_port_over_current(usb_hub_info_t * hub,275 277 static void usb_hub_port_over_current(usb_hub_info_t * hub, 278 uint16_t port, uint32_t status) { 276 279 int opResult; 277 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){280 if(usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){ 278 281 opResult = usb_hub_clear_port_feature(hub->control_pipe, 279 282 port, USB_HUB_FEATURE_PORT_POWER); 280 283 if (opResult != EOK) { 281 usb_log_error(" Cannot power off port %d; %s\n",282 port, str_error(opResult));284 usb_log_error("cannot power off port %d; %d\n", 285 port, opResult); 283 286 } 284 } else{287 }else{ 285 288 opResult = usb_hub_set_port_feature(hub->control_pipe, 286 289 port, USB_HUB_FEATURE_PORT_POWER); 287 290 if (opResult != EOK) { 288 usb_log_error(" Cannot power on port %d; %s\n",289 port, str_error(opResult));291 usb_log_error("cannot power on port %d; %d\n", 292 port, opResult); 290 293 } 291 294 } … … 300 303 */ 301 304 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, 302 usb_port_status_t *status) { 305 usb_port_status_t *status) 306 { 303 307 size_t recv_size; 304 308 usb_device_request_setup_packet_t request; … … 307 311 usb_hub_set_port_status_request(&request, port); 308 312 int rc = usb_pipe_control_read(ctrl_pipe, 309 &request, sizeof 310 &status_tmp, sizeof 313 &request, sizeof(usb_device_request_setup_packet_t), 314 &status_tmp, sizeof(status_tmp), &recv_size); 311 315 if (rc != EOK) { 312 316 return rc; … … 333 337 * @return Error code. 334 338 */ 335 static int enable_port_callback(int port_no, void *arg) { 339 static int enable_port_callback(int port_no, void *arg) 340 { 336 341 usb_hub_info_t *hub = arg; 337 342 int rc; … … 341 346 usb_hub_set_reset_port_request(&request, port_no); 342 347 rc = usb_pipe_control_write(hub->control_pipe, 343 &request, sizeof 348 &request, sizeof(request), NULL, 0); 344 349 if (rc != EOK) { 345 350 usb_log_warning("Port reset failed: %s.\n", str_error(rc)); … … 371 376 * @return 0 Always. 372 377 */ 373 static int add_device_phase1_worker_fibril(void *arg) { 378 static int add_device_phase1_worker_fibril(void *arg) 379 { 374 380 struct add_device_phase1 *data 375 381 = (struct add_device_phase1 *) arg; … … 390 396 } 391 397 392 fibril_mutex_lock(&data->hub->port_mutex);393 398 data->hub->ports[data->port].attached_device.handle = child_handle; 394 399 data->hub->ports[data->port].attached_device.address = new_address; 395 fibril_mutex_unlock(&data->hub->port_mutex);396 400 397 401 usb_log_info("Detected new device on `%s' (port %zu), " … … 403 407 free(arg); 404 408 405 fibril_mutex_lock(&data->hub->pending_ops_mutex);406 assert(data->hub->pending_ops_count > 0);407 data->hub->pending_ops_count--;408 fibril_condvar_signal(&data->hub->pending_ops_cv);409 fibril_mutex_unlock(&data->hub->pending_ops_mutex);410 411 412 409 return EOK; 413 410 } 411 414 412 415 413 /** Start device adding when connection change is detected. … … 423 421 */ 424 422 static int create_add_device_fibril(usb_hub_info_t *hub, size_t port, 425 usb_speed_t speed) { 423 usb_speed_t speed) 424 { 426 425 struct add_device_phase1 *data 427 = malloc(sizeof 426 = malloc(sizeof(struct add_device_phase1)); 428 427 if (data == NULL) { 429 428 return ENOMEM; … … 453 452 return ENOMEM; 454 453 } 455 fibril_mutex_lock(&hub->pending_ops_mutex);456 hub->pending_ops_count++;457 fibril_mutex_unlock(&hub->pending_ops_mutex);458 454 fibril_add_ready(fibril); 459 455 -
uspace/drv/usbhub/ports.h
r3dfdcb7 ree7e7c93 70 70 71 71 72 void usb_hub_process_interrupt(usb_hub_info_t * hub,72 void usb_hub_process_interrupt(usb_hub_info_t * hub, 73 73 uint16_t port); 74 74 -
uspace/drv/usbhub/usbhub.c
r3dfdcb7 ree7e7c93 56 56 57 57 58 static usb_hub_info_t * usb_hub_info_create(usb_device_t * usb_dev);59 60 static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info);61 62 static int usb_hub_set_configuration(usb_hub_info_t * hub_info);63 64 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info);65 66 static int usb_process_hub_over_current(usb_hub_info_t * hub_info,58 static usb_hub_info_t * usb_hub_info_create(usb_device_t * usb_dev); 59 60 static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info); 61 62 static int usb_hub_set_configuration(usb_hub_info_t * hub_info); 63 64 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info); 65 66 static int usb_process_hub_over_current(usb_hub_info_t * hub_info, 67 67 usb_hub_status_t status); 68 68 69 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info,69 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info, 70 70 usb_hub_status_t status); 71 71 72 static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info);73 74 static void usb_hub_polling_termin ated_callback(usb_device_t *device,75 bool was_error, void * data);72 static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info); 73 74 static void usb_hub_polling_terminted_callback(usb_device_t * device, 75 bool was_error, void * data); 76 76 77 77 … … 90 90 * @return error code 91 91 */ 92 int usb_hub_add_device(usb_device_t * usb_dev) {92 int usb_hub_add_device(usb_device_t * usb_dev) { 93 93 if (!usb_dev) return EINVAL; 94 usb_hub_info_t * hub_info = usb_hub_info_create(usb_dev);94 usb_hub_info_t * hub_info = usb_hub_info_create(usb_dev); 95 95 //create hc connection 96 96 usb_log_debug("Initializing USB wire abstraction.\n"); … … 99 99 hub_info->usb_device->ddf_dev); 100 100 if (opResult != EOK) { 101 usb_log_error(" Could not initialize connection to device, "102 " %s\n",103 str_error(opResult));101 usb_log_error("could not initialize connection to device, " 102 "errno %d\n", 103 opResult); 104 104 free(hub_info); 105 105 return opResult; … … 109 109 opResult = usb_hub_set_configuration(hub_info); 110 110 if (opResult != EOK) { 111 usb_log_error(" Could not set hub configuration, %s\n",112 str_error(opResult));111 usb_log_error("could not set hub configuration, errno %d\n", 112 opResult); 113 113 free(hub_info); 114 114 return opResult; … … 117 117 opResult = usb_hub_process_hub_specific_info(hub_info); 118 118 if (opResult != EOK) { 119 usb_log_error(" Could process hub specific info, %s\n",120 str_error(opResult));119 usb_log_error("could process hub specific info, errno %d\n", 120 opResult); 121 121 free(hub_info); 122 122 return opResult; … … 135 135 136 136 opResult = usb_hub_start_hub_fibril(hub_info); 137 if (opResult !=EOK)137 if(opResult!=EOK) 138 138 free(hub_info); 139 139 return opResult; 140 140 } 141 141 142 142 143 /** Callback for polling hub for changes. … … 192 193 * @return basic usb_hub_info_t structure 193 194 */ 194 static usb_hub_info_t * usb_hub_info_create(usb_device_t * usb_dev) {195 usb_hub_info_t * result = malloc(sizeof 195 static usb_hub_info_t * usb_hub_info_create(usb_device_t * usb_dev) { 196 usb_hub_info_t * result = malloc(sizeof(usb_hub_info_t)); 196 197 if (!result) return NULL; 197 198 result->usb_device = usb_dev; … … 199 200 result->control_pipe = &usb_dev->ctrl_pipe; 200 201 result->is_default_address_used = false; 201 202 result->ports = NULL;203 result->port_count = (size_t) - 1;204 fibril_mutex_initialize(&result->port_mutex);205 206 fibril_mutex_initialize(&result->pending_ops_mutex);207 fibril_condvar_initialize(&result->pending_ops_cv);208 result->pending_ops_count = 0;209 202 return result; 210 203 } … … 220 213 * @return error code 221 214 */ 222 static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info) {215 static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info) { 223 216 // get hub descriptor 224 usb_log_debug(" Creating serialized descriptor\n");217 usb_log_debug("creating serialized descriptor\n"); 225 218 uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE]; 226 219 usb_hub_descriptor_t * descriptor; … … 234 227 235 228 if (opResult != EOK) { 236 usb_log_error(" Failed when receiving hub descriptor, "237 " %s\n",238 str_error(opResult));229 usb_log_error("failed when receiving hub descriptor, " 230 "badcode = %d\n", 231 opResult); 239 232 free(serialized_descriptor); 240 233 return opResult; 241 234 } 242 usb_log_debug2(" Deserializing descriptor\n");235 usb_log_debug2("deserializing descriptor\n"); 243 236 descriptor = usb_create_deserialized_hub_desriptor( 244 237 serialized_descriptor); … … 251 244 /// \TODO this is not semantically correct 252 245 bool is_power_switched = 253 ((descriptor->hub_characteristics & 1) == 246 ((descriptor->hub_characteristics & 1) ==0); 254 247 bool has_individual_port_powering = 255 ((descriptor->hub_characteristics & 1) != 248 ((descriptor->hub_characteristics & 1) !=0); 256 249 hub_info->ports = malloc( 257 250 sizeof (usb_hub_port_t) * (hub_info->port_count + 1)); 258 if (!hub_info->ports){251 if(!hub_info->ports){ 259 252 return ENOMEM; 260 253 } … … 263 256 usb_hub_port_init(&hub_info->ports[port]); 264 257 } 265 if (is_power_switched){266 usb_log_debug(" Hub powerswitched\n");267 268 if (!has_individual_port_powering){269 usb_log_debug(" Has_globalpowering\n");258 if(is_power_switched){ 259 usb_log_debug("is_power_switched\n"); 260 261 if(!has_individual_port_powering){ 262 usb_log_debug("!has_individual_port_powering\n"); 270 263 opResult = usb_hub_set_feature(hub_info->control_pipe, 271 264 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 272 265 if (opResult != EOK) { 273 usb_log_error(" Cannot power hub: %s\n",266 usb_log_error("cannot power hub: %s\n", 274 267 str_error(opResult)); 275 268 } … … 277 270 278 271 for (port = 1; port <= hub_info->port_count; ++port) { 279 usb_log_debug("Powering port %zu.\n", 272 usb_log_debug("Powering port %zu.\n",port); 280 273 opResult = usb_hub_set_port_feature(hub_info->control_pipe, 281 274 port, USB_HUB_FEATURE_PORT_POWER); … … 285 278 } 286 279 } 287 288 } else{289 usb_log_debug(" Power notswitched, not going to be powered\n");290 } 291 usb_log_debug2(" Freeing data\n");280 281 }else{ 282 usb_log_debug("!is_power_switched, not going to be powered\n"); 283 } 284 usb_log_debug2("freeing data\n"); 292 285 free(descriptor); 293 286 return EOK; … … 302 295 * @return error code 303 296 */ 304 static int usb_hub_set_configuration(usb_hub_info_t * hub_info) {297 static int usb_hub_set_configuration(usb_hub_info_t * hub_info) { 305 298 //device descriptor 306 299 usb_standard_device_descriptor_t *std_descriptor 307 300 = &hub_info->usb_device->descriptors.device; 308 usb_log_debug(" Hub has %d configurations\n",301 usb_log_debug("hub has %d configurations\n", 309 302 std_descriptor->configuration_count); 310 303 if (std_descriptor->configuration_count < 1) { 311 usb_log_error(" There are no configurations available\n");304 usb_log_error("there are no configurations available\n"); 312 305 return EINVAL; 313 306 } … … 327 320 return opResult; 328 321 } 329 usb_log_debug("\t Used configuration %d\n",322 usb_log_debug("\tused configuration %d\n", 330 323 config_descriptor->configuration_number); 331 324 … … 342 335 * @return error code 343 336 */ 344 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info){337 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info){ 345 338 int rc; 346 339 347 340 rc = usb_device_auto_poll(hub_info->usb_device, 0, 348 341 hub_port_changes_callback, ((hub_info->port_count + 1) / 8) + 1, 349 usb_hub_polling_termin ated_callback, hub_info);342 usb_hub_polling_terminted_callback, hub_info); 350 343 if (rc != EOK) { 351 344 usb_log_error("Failed to create polling fibril: %s.\n", … … 366 359 //********************************************* 367 360 361 368 362 /** 369 363 * process hub over current change … … 374 368 * @return error code 375 369 */ 376 static int usb_process_hub_over_current(usb_hub_info_t * hub_info,370 static int usb_process_hub_over_current(usb_hub_info_t * hub_info, 377 371 usb_hub_status_t status) { 378 372 int opResult; 379 if (usb_hub_is_status(status, USB_HUB_FEATURE_HUB_OVER_CURRENT)){373 if (usb_hub_is_status(status,USB_HUB_FEATURE_HUB_OVER_CURRENT)){ 380 374 //poweroff all ports 381 375 unsigned int port; 382 for (port = 1; port <= hub_info->port_count; ++port){376 for(port = 1;port <= hub_info->port_count;++port){ 383 377 opResult = usb_hub_clear_port_feature( 384 hub_info->control_pipe, 378 hub_info->control_pipe,port, 385 379 USB_HUB_FEATURE_PORT_POWER); 386 380 if (opResult != EOK) { 387 381 usb_log_warning( 388 " Cannot power off port %d; %s\n",389 port, str_error(opResult));382 "cannot power off port %d; %d\n", 383 port, opResult); 390 384 } 391 385 } … … 393 387 //power all ports 394 388 unsigned int port; 395 for (port = 1; port <= hub_info->port_count; ++port){389 for(port = 1;port <= hub_info->port_count;++port){ 396 390 opResult = usb_hub_set_port_feature( 397 hub_info->control_pipe, 391 hub_info->control_pipe,port, 398 392 USB_HUB_FEATURE_PORT_POWER); 399 393 if (opResult != EOK) { 400 394 usb_log_warning( 401 " Cannot power off port %d; %s\n",402 port, str_error(opResult));395 "cannot power off port %d; %d\n", 396 port, opResult); 403 397 } 404 398 } … … 415 409 * @return error code 416 410 */ 417 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info,411 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info, 418 412 usb_hub_status_t status) { 419 413 int opResult = EOK; 420 414 opResult = usb_hub_clear_feature(hub_info->control_pipe, 421 415 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 422 if (opResult != EOK) {423 usb_log_error(" Cannnot clear hub power change flag: "424 "% s\n",425 str_error(opResult));416 if (opResult != EOK) { 417 usb_log_error("cannnot clear hub power change flag: " 418 "%d\n", 419 opResult); 426 420 } 427 421 return opResult; … … 435 429 * @param hub_info hub instance 436 430 */ 437 static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info) {438 usb_log_debug(" Global interrupt on a hub\n");431 static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info) { 432 usb_log_debug("global interrupt on a hub\n"); 439 433 usb_pipe_t *pipe = hub_info->control_pipe; 440 434 int opResult; … … 453 447 ); 454 448 if (opResult != EOK) { 455 usb_log_error("Could not get hub status: %s\n", 456 str_error(opResult)); 449 usb_log_error("could not get hub status\n"); 457 450 return; 458 451 } 459 452 if (rcvd_size != sizeof (usb_port_status_t)) { 460 usb_log_error(" Received status has incorrect size\n");453 usb_log_error("received status has incorrect size\n"); 461 454 return; 462 455 } 463 456 //port reset 464 457 if ( 465 usb_hub_is_status(status, 16 +USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) {458 usb_hub_is_status(status,16+USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) { 466 459 usb_process_hub_over_current(hub_info, status); 467 460 } 468 461 if ( 469 usb_hub_is_status(status, 16 +USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) {462 usb_hub_is_status(status,16+USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) { 470 463 usb_process_hub_local_power_change(hub_info, status); 471 464 } … … 480 473 * @param data pointer to usb_hub_info_t structure 481 474 */ 482 static void usb_hub_polling_terminated_callback(usb_device_t *device, 483 bool was_error, void *data) { 484 usb_hub_info_t * hub = data; 485 assert(hub); 486 487 fibril_mutex_lock(&hub->pending_ops_mutex); 488 489 /* The device is dead. However there might be some pending operations 490 * that we need to wait for. 491 * One of them is device adding in progress. 492 * The respective fibril is probably waiting for status change 493 * in port reset (port enable) callback. 494 * Such change would never come (otherwise we would not be here). 495 * Thus, we would flush all pending port resets. 496 */ 497 if (hub->pending_ops_count > 0) { 498 fibril_mutex_lock(&hub->port_mutex); 499 size_t port; 500 for (port = 0; port < hub->port_count; port++) { 501 usb_hub_port_t *the_port = hub->ports + port; 502 fibril_mutex_lock(&the_port->reset_mutex); 503 the_port->reset_completed = true; 504 the_port->reset_okay = false; 505 fibril_condvar_broadcast(&the_port->reset_cv); 506 fibril_mutex_unlock(&the_port->reset_mutex); 507 } 508 fibril_mutex_unlock(&hub->port_mutex); 509 } 510 /* And now wait for them. */ 511 while (hub->pending_ops_count > 0) { 512 fibril_condvar_wait(&hub->pending_ops_cv, 513 &hub->pending_ops_mutex); 514 } 515 fibril_mutex_unlock(&hub->pending_ops_mutex); 516 517 usb_device_destroy(hub->usb_device); 518 519 free(hub->ports); 520 free(hub); 475 static void usb_hub_polling_terminted_callback(usb_device_t * device, 476 bool was_error, void * data){ 477 usb_hub_info_t * hub_info = data; 478 if(!hub_info) return; 479 free(hub_info->ports); 480 free(hub_info); 521 481 } 522 482 -
uspace/drv/usbhub/usbhub.h
r3dfdcb7 ree7e7c93 51 51 #include "ports.h" 52 52 53 54 53 55 /** Information about attached hub. */ 54 struct usb_hub_info_t 56 struct usb_hub_info_t{ 55 57 /** Number of ports. */ 56 58 size_t port_count; … … 58 60 /** attached device handles, for each port one */ 59 61 usb_hub_port_t *ports; 60 61 fibril_mutex_t port_mutex;62 62 63 63 /** connection to hcd */ … … 89 89 /** generic usb device data*/ 90 90 usb_device_t * usb_device; 91 92 /** Number of pending operations on the mutex to prevent shooting93 * ourselves in the foot.94 * When the hub is disconnected but we are in the middle of some95 * operation, we cannot destroy this structure right away because96 * the pending operation might use it.97 */98 size_t pending_ops_count;99 /** Guard for pending_ops_count. */100 fibril_mutex_t pending_ops_mutex;101 /** Condition variable for pending_ops_count. */102 fibril_condvar_t pending_ops_cv;103 104 91 }; 105 92 106 int usb_hub_add_device(usb_device_t *usb_dev); 93 //int usb_hub_control_loop(void * hub_info_param); 94 95 int usb_hub_add_device(usb_device_t * usb_dev); 107 96 108 97 bool hub_port_changes_callback(usb_device_t *dev, -
uspace/drv/usbhub/usbhub_private.h
r3dfdcb7 ree7e7c93 65 65 */ 66 66 static inline void usb_hub_set_descriptor_request( 67 68 ){67 usb_device_request_setup_packet_t * request 68 ){ 69 69 request->index = 0; 70 70 request->request_type = USB_HUB_REQ_TYPE_GET_DESCRIPTOR; … … 87 87 int port_index, 88 88 usb_hub_class_feature_t feature) { 89 89 90 90 usb_device_request_setup_packet_t clear_request = { 91 91 .request_type = USB_HUB_REQ_TYPE_CLEAR_PORT_FEATURE, … … 96 96 clear_request.value = feature; 97 97 return usb_pipe_control_write(pipe, &clear_request, 98 sizeof 98 sizeof(clear_request), NULL, 0); 99 99 } 100 100 … … 120 120 clear_request.value = feature; 121 121 return usb_pipe_control_write(pipe, &clear_request, 122 sizeof 122 sizeof(clear_request), NULL, 0); 123 123 } 124 124 125 125 126 /** … … 141 142 clear_request.value = feature; 142 143 return usb_pipe_control_write(pipe, &clear_request, 143 sizeof 144 sizeof(clear_request), NULL, 0); 144 145 } 145 146 … … 162 163 clear_request.value = feature; 163 164 return usb_pipe_control_write(pipe, &clear_request, 164 sizeof 165 sizeof(clear_request), NULL, 0); 165 166 } 166 167 -
uspace/drv/usbhub/utils.c
r3dfdcb7 ree7e7c93 62 62 * @return newly created serializd descriptor pointer 63 63 */ 64 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t * descriptor) {64 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t * descriptor) { 65 65 //base size 66 66 size_t size = 7; 67 67 //variable size according to port count 68 size_t var_size = (descriptor->ports_count + 7) /8;68 size_t var_size = (descriptor->ports_count+7)/8; 69 69 size += 2 * var_size; 70 70 uint8_t * result = malloc(size); 71 71 //size 72 if 73 usb_serialize_hub_descriptor(descriptor, 72 if(result) 73 usb_serialize_hub_descriptor(descriptor,result); 74 74 return result; 75 75 } … … 82 82 * @param serialized_descriptor 83 83 */ 84 void usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor,84 void usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor, 85 85 void * serialized_descriptor) { 86 86 //base size … … 88 88 size_t size = 7; 89 89 //variable size according to port count 90 size_t var_size = (descriptor->ports_count + 7) /8;90 size_t var_size = (descriptor->ports_count+7)/8; 91 91 size += 2 * var_size; 92 92 //size … … 110 110 } 111 111 112 112 113 /** 113 114 * create deserialized desriptor structure out of serialized descriptor … … 120 121 */ 121 122 usb_hub_descriptor_t * usb_create_deserialized_hub_desriptor( 122 void *serialized_descriptor) {123 void * serialized_descriptor) { 123 124 uint8_t * sdescriptor = serialized_descriptor; 124 125 … … 129 130 } 130 131 131 usb_hub_descriptor_t * result = malloc(sizeof 132 if 133 usb_deserialize_hub_desriptor(serialized_descriptor, 132 usb_hub_descriptor_t * result = malloc(sizeof(usb_hub_descriptor_t)); 133 if(result) 134 usb_deserialize_hub_desriptor(serialized_descriptor,result); 134 135 return result; 135 136 } … … 143 144 */ 144 145 void usb_deserialize_hub_desriptor( 145 void * serialized_descriptor, usb_hub_descriptor_t *descriptor) {146 void * serialized_descriptor, usb_hub_descriptor_t * descriptor) { 146 147 uint8_t * sdescriptor = serialized_descriptor; 147 148 descriptor->ports_count = sdescriptor[2]; … … 150 151 descriptor->pwr_on_2_good_time = sdescriptor[5]; 151 152 descriptor->current_requirement = sdescriptor[6]; 152 size_t var_size = (descriptor->ports_count +7) / 8;153 size_t var_size = (descriptor->ports_count+7) / 8; 153 154 //descriptor->devices_removable = (uint8_t*) malloc(var_size); 154 155 -
uspace/drv/usbmouse/init.c
r3dfdcb7 ree7e7c93 39 39 #include <usb/hid/hid.h> 40 40 #include <usb/dev/request.h> 41 #include <usb/hid/request.h>42 41 #include <errno.h> 43 42 … … 127 126 128 127 /* Set the boot protocol. */ 129 rc = usbhid_req_set_protocol(&dev->ctrl_pipe, dev->interface_no, 130 USB_HID_PROTOCOL_BOOT); 128 rc = usb_control_request_set(&dev->ctrl_pipe, 129 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 130 USB_HIDREQ_SET_PROTOCOL, USB_HID_PROTOCOL_BOOT, dev->interface_no, 131 NULL, 0); 131 132 if (rc != EOK) { 132 133 goto leave; -
uspace/drv/usbmouse/mouse.c
r3dfdcb7 ree7e7c93 117 117 async_hangup(mouse->console_phone); 118 118 mouse->console_phone = -1; 119 120 usb_device_destroy(dev);121 119 } 122 120 -
uspace/lib/drv/generic/driver.c
r3dfdcb7 ree7e7c93 405 405 /* The interface has not such method */ 406 406 printf("%s: driver_connection_gen error - " 407 "invalid interface method " 408 "(index %" PRIun ").\n", 407 "invalid interface method (%d).\n", 409 408 driver->name, iface_method_idx); 410 409 async_answer_0(callid, ENOTSUP); -
uspace/lib/drv/include/usbhc_iface.h
r3dfdcb7 ree7e7c93 212 212 /** USB host controller communication interface. */ 213 213 typedef struct { 214 int (*reserve_default_address)(ddf_fun_t *, usb_speed_t); 215 int (*release_default_address)(ddf_fun_t *); 214 216 int (*request_address)(ddf_fun_t *, usb_speed_t, usb_address_t *); 215 217 int (*bind_address)(ddf_fun_t *, usb_address_t, devman_handle_t); -
uspace/lib/usbdev/include/usb/dev/driver.h
r3dfdcb7 ree7e7c93 168 168 int usb_device_destroy_pipes(ddf_dev_t *, usb_endpoint_mapping_t *, size_t); 169 169 int usb_device_create(ddf_dev_t *, usb_endpoint_description_t **, usb_device_t **, const char **); 170 void usb_device_destroy(usb_device_t *);171 170 172 171 size_t usb_interface_count_alternates(uint8_t *, size_t, uint8_t); -
uspace/lib/usbdev/src/devdrv.c
r3dfdcb7 ree7e7c93 533 533 } 534 534 535 /** Destroy instance of a USB device.536 *537 * @param dev Device to be destroyed.538 */539 void usb_device_destroy(usb_device_t *dev)540 {541 if (dev == NULL) {542 return;543 }544 545 /* Ignore errors and hope for the best. */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 }550 551 if (dev->alternate_interfaces != NULL) {552 if (dev->alternate_interfaces->alternatives != NULL) {553 free(dev->alternate_interfaces->alternatives);554 }555 free(dev->alternate_interfaces);556 }557 558 free(dev);559 }560 561 535 /** 562 536 * @} -
uspace/srv/hid/console/console.c
r3dfdcb7 ree7e7c93 57 57 #include <io/style.h> 58 58 #include <io/screenbuffer.h> 59 #include <inttypes.h>60 59 61 60 #include "console.h" … … 68 67 /** Interval for checking for new keyboard (1/4s). */ 69 68 #define HOTPLUG_WATCH_INTERVAL (1000 * 250) 70 71 /* Kernel defines 32 but does not export it. */72 #define MAX_IPC_OUTGOING_PHONES 12873 /** To allow proper phone closing. */74 static ipc_callid_t driver_phones[MAX_IPC_OUTGOING_PHONES] = { 0 };75 69 76 70 /** Phone to the keyboard driver. */ … … 96 90 contents and related settings. */ 97 91 } console_t; 98 99 100 92 101 93 /** Array of data for virtual consoles */ … … 409 401 } 410 402 411 static void close_driver_phone(ipc_callid_t hash)412 {413 int i;414 for (i = 0; i < MAX_IPC_OUTGOING_PHONES; i++) {415 if (driver_phones[i] == hash) {416 printf("Device %" PRIxn " gone.\n", hash);417 driver_phones[i] = 0;418 async_hangup(i);419 return;420 }421 }422 }423 424 403 /** Handler for keyboard */ 425 404 static void keyboard_events(ipc_callid_t iid, ipc_call_t *icall) … … 436 415 case IPC_M_PHONE_HUNGUP: 437 416 /* TODO: Handle hangup */ 438 close_driver_phone(iid);439 417 return; 440 418 case KBD_EVENT: … … 480 458 case IPC_M_PHONE_HUNGUP: 481 459 /* TODO: Handle hangup */ 482 close_driver_phone(iid);483 460 return; 484 461 case MEVENT_BUTTON: … … 738 715 } 739 716 740 static int async_connect_to_me_hack(int phone, sysarg_t arg1, sysarg_t arg2,741 sysarg_t arg3, async_client_conn_t client_receiver, ipc_callid_t *hash)742 {743 sysarg_t task_hash;744 sysarg_t phone_hash;745 int rc = async_req_3_5(phone, IPC_M_CONNECT_TO_ME, arg1, arg2, arg3,746 NULL, NULL, NULL, &task_hash, &phone_hash);747 if (rc != EOK)748 return rc;749 750 if (client_receiver != NULL)751 async_new_connection(task_hash, phone_hash, phone_hash, NULL,752 client_receiver);753 754 if (hash != NULL) {755 *hash = phone_hash;756 }757 758 return EOK;759 }760 761 717 static int connect_keyboard_or_mouse(const char *devname, 762 718 async_client_conn_t handler, const char *path) … … 773 729 } 774 730 775 ipc_callid_t hash; 776 int rc = async_connect_to_me_hack(phone, SERVICE_CONSOLE, 0, phone, 777 handler, &hash); 731 int rc = async_connect_to_me(phone, SERVICE_CONSOLE, 0, 0, handler); 778 732 if (rc != EOK) { 779 733 printf(NAME ": " \ … … 783 737 } 784 738 785 driver_phones[phone] = hash; 786 787 printf(NAME ": found %s \"%s\" (%" PRIxn ").\n", devname, path, hash); 739 printf(NAME ": found %s \"%s\".\n", devname, path); 788 740 789 741 return phone;
Note:
See TracChangeset
for help on using the changeset viewer.