Changes in uspace/srv/devman/devman.c [0b5a4131:96b02eb9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/devman.c
r0b5a4131 r96b02eb9 498 498 * @param phone The phone to the driver. 499 499 */ 500 void set_driver_phone(driver_t *driver, ipcarg_t phone)500 void set_driver_phone(driver_t *driver, sysarg_t phone) 501 501 { 502 502 fibril_mutex_lock(&driver->driver_mutex); … … 508 508 /** Notify driver about the devices to which it was assigned. 509 509 * 510 * The driver's mutex must be locked.511 *512 510 * @param driver The driver to which the devices are passed. 513 511 */ … … 518 516 int phone; 519 517 520 printf(NAME ": pass_devices_to_driver\n"); 521 522 phone = ipc_connect_me_to(driver->phone, DRIVER_DEVMAN, 0, 0); 523 if (phone > 0) { 524 518 printf(NAME ": pass_devices_to_driver(`%s')\n", driver->name); 519 520 fibril_mutex_lock(&driver->driver_mutex); 521 522 phone = async_connect_me_to(driver->phone, DRIVER_DEVMAN, 0, 0); 523 524 if (phone < 0) { 525 fibril_mutex_unlock(&driver->driver_mutex); 526 return; 527 } 528 529 /* 530 * Go through devices list as long as there is some device 531 * that has not been passed to the driver. 532 */ 533 link = driver->devices.next; 534 while (link != &driver->devices) { 535 dev = list_get_instance(link, node_t, driver_devices); 536 if (dev->passed_to_driver) { 537 link = link->next; 538 continue; 539 } 540 541 /* 542 * We remove the device from the list to allow safe adding 543 * of new devices (no one will touch our item this way). 544 */ 545 list_remove(link); 546 547 /* 548 * Unlock to avoid deadlock when adding device 549 * handled by itself. 550 */ 551 fibril_mutex_unlock(&driver->driver_mutex); 552 553 add_device(phone, driver, dev, tree); 554 555 /* 556 * Lock again as we will work with driver's 557 * structure. 558 */ 559 fibril_mutex_lock(&driver->driver_mutex); 560 561 /* 562 * Insert the device back. 563 * The order is not relevant here so no harm is done 564 * (actually, the order would be preserved in most cases). 565 */ 566 list_append(link, &driver->devices); 567 568 /* 569 * Restart the cycle to go through all devices again. 570 */ 525 571 link = driver->devices.next; 526 while (link != &driver->devices) { 527 dev = list_get_instance(link, node_t, driver_devices); 528 add_device(phone, driver, dev, tree); 529 link = link->next; 530 } 531 532 ipc_hangup(phone); 533 } 572 } 573 574 ipc_hangup(phone); 575 576 /* 577 * Once we passed all devices to the driver, we need to mark the 578 * driver as running. 579 * It is vital to do it here and inside critical section. 580 * 581 * If we would change the state earlier, other devices added to 582 * the driver would be added to the device list and started 583 * immediately and possibly started here as well. 584 */ 585 printf(NAME ": driver %s goes into running state.\n", driver->name); 586 driver->state = DRIVER_RUNNING; 587 588 fibril_mutex_unlock(&driver->driver_mutex); 534 589 } 535 590 … … 545 600 void initialize_running_driver(driver_t *driver, dev_tree_t *tree) 546 601 { 547 printf(NAME ": initialize_running_driver\n"); 548 fibril_mutex_lock(&driver->driver_mutex); 602 printf(NAME ": initialize_running_driver (`%s')\n", driver->name); 549 603 550 604 /* … … 553 607 */ 554 608 pass_devices_to_driver(driver, tree); 555 556 /* Change driver's state to running. */557 driver->state = DRIVER_RUNNING;558 559 fibril_mutex_unlock(&driver->driver_mutex);560 609 } 561 610 … … 629 678 } 630 679 631 632 680 /** Pass a device to running driver. 633 681 * … … 637 685 void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree) 638 686 { 639 printf(NAME ": add_device\n"); 640 641 ipcarg_t rc; 687 /* 688 * We do not expect to have driver's mutex locked as we do not 689 * access any structures that would affect driver_t. 690 */ 691 printf(NAME ": add_device (driver `%s', device `%s')\n", drv->name, 692 node->name); 693 694 sysarg_t rc; 642 695 ipc_call_t answer; 643 696 644 697 /* Send the device to the driver. */ 645 aid_t req = async_send_1(phone, DRIVER_ADD_DEVICE, node->handle, 646 &answer); 698 devman_handle_t parent_handle; 699 if (node->parent) { 700 parent_handle = node->parent->handle; 701 } else { 702 parent_handle = 0; 703 } 704 705 aid_t req = async_send_2(phone, DRIVER_ADD_DEVICE, node->handle, 706 parent_handle, &answer); 647 707 648 708 /* Send the device's name to the driver. */ … … 652 712 /* TODO handle error */ 653 713 } 654 714 655 715 /* Wait for answer from the driver. */ 656 716 async_wait_for(req, &rc); 717 657 718 switch(rc) { 658 719 case EOK: … … 667 728 } 668 729 730 node->passed_to_driver = true; 731 669 732 return; 670 733 } … … 692 755 attach_driver(node, drv); 693 756 757 fibril_mutex_lock(&drv->driver_mutex); 694 758 if (drv->state == DRIVER_NOT_STARTED) { 695 759 /* Start the driver. */ 696 760 start_driver(drv); 697 761 } 698 699 if (drv->state == DRIVER_RUNNING) { 762 bool is_running = drv->state == DRIVER_RUNNING; 763 fibril_mutex_unlock(&drv->driver_mutex); 764 765 if (is_running) { 700 766 /* Notify the driver about the new device. */ 701 int phone = ipc_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0);767 int phone = async_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0); 702 768 if (phone > 0) { 703 769 add_device(phone, drv, node, tree); … … 861 927 node->name = dev_name; 862 928 if (!set_dev_path(node, parent)) { 863 fibril_rwlock_write_unlock(&tree->rwlock);864 929 return false; 865 930 } … … 1014 1079 1015 1080 size_t idx = get_new_class_dev_idx(cl); 1016 asprintf(&dev_name, "%s% d", base_name, idx);1081 asprintf(&dev_name, "%s%zu", base_name, idx); 1017 1082 1018 1083 return dev_name; … … 1083 1148 while (link != &class_list->classes) { 1084 1149 cl = list_get_instance(link, dev_class_t, link); 1085 if (str_cmp(cl->name, class_name) == 0) 1150 if (str_cmp(cl->name, class_name) == 0) { 1086 1151 return cl; 1152 } 1153 link = link->next; 1087 1154 } 1088 1155
Note:
See TracChangeset
for help on using the changeset viewer.