Changeset 80a96d2 in mainline for uspace/srv/devman
- Timestamp:
- 2011-09-05T21:26:47Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b33870b
- Parents:
- 16cc9a6
- Location:
- uspace/srv/devman
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/devman.c
r16cc9a6 r80a96d2 878 878 879 879 return retval; 880 880 } 881 882 int driver_dev_gone(dev_tree_t *tree, dev_node_t *dev) 883 { 884 async_exch_t *exch; 885 sysarg_t retval; 886 driver_t *drv; 887 devman_handle_t handle; 888 889 assert(dev != NULL); 890 891 log_msg(LVL_DEBUG, "driver_dev_gone(%p)", dev); 892 893 fibril_rwlock_read_lock(&tree->rwlock); 894 drv = dev->drv; 895 handle = dev->handle; 896 fibril_rwlock_read_unlock(&tree->rwlock); 897 898 exch = async_exchange_begin(drv->sess); 899 retval = async_req_1_0(exch, DRIVER_DEV_GONE, handle); 900 async_exchange_end(exch); 901 902 return retval; 881 903 } 882 904 -
uspace/srv/devman/devman.h
r16cc9a6 r80a96d2 263 263 extern bool start_driver(driver_t *); 264 264 extern int driver_dev_remove(dev_tree_t *, dev_node_t *); 265 extern int driver_dev_gone(dev_tree_t *, dev_node_t *); 265 266 extern int driver_fun_online(dev_tree_t *, fun_node_t *); 266 267 extern int driver_fun_offline(dev_tree_t *, fun_node_t *); -
uspace/srv/devman/main.c
r16cc9a6 r80a96d2 316 316 if (fun->child != NULL) { 317 317 dev_node_t *dev = fun->child; 318 device_state_t dev_state; 318 319 319 320 dev_add_ref(dev); 321 dev_state = dev->state; 322 320 323 fibril_rwlock_write_unlock(&device_tree.rwlock); 321 324 322 325 /* If device is owned by driver, ask driver to give it up. */ 323 if (dev ->state == DEVICE_USABLE) {326 if (dev_state == DEVICE_USABLE) { 324 327 rc = driver_dev_remove(&device_tree, dev); 325 328 if (rc != EOK) { … … 333 336 if (!list_empty(&dev->functions)) { 334 337 fibril_rwlock_read_unlock(&device_tree.rwlock); 338 dev_del_ref(dev); 335 339 return EIO; 336 340 } 341 337 342 driver_t *driver = dev->drv; 338 343 fibril_rwlock_read_unlock(&device_tree.rwlock); … … 579 584 int rc; 580 585 581 582 586 fun_node_t *fun = find_fun_node(&device_tree, fun_handle); 583 587 if (fun == NULL) { … … 598 602 599 603 if (fun->ftype == fun_inner) { 600 /* Handle possible descendants */ 601 /* TODO - This is a surprise removal */ 604 /* This is a surprise removal. Handle possible descendants */ 602 605 if (fun->child != NULL) { 603 log_msg(LVL_WARN, "devman_remove_function(): not handling " 604 "descendants\n"); 606 dev_node_t *dev = fun->child; 607 device_state_t dev_state; 608 int gone_rc; 609 610 dev_add_ref(dev); 611 dev_state = dev->state; 612 613 fibril_rwlock_write_unlock(&device_tree.rwlock); 614 615 /* If device is owned by driver, inform driver it is gone. */ 616 if (dev_state == DEVICE_USABLE) 617 gone_rc = driver_dev_gone(&device_tree, dev); 618 else 619 gone_rc = EOK; 620 621 fibril_rwlock_read_lock(&device_tree.rwlock); 622 623 /* Verify that driver succeeded and removed all functions */ 624 if (gone_rc != EOK || !list_empty(&dev->functions)) { 625 log_msg(LVL_ERROR, "Driver did not remove " 626 "functions for device that is gone. " 627 "Device node is now defunct."); 628 629 /* 630 * Not much we can do but mark the device 631 * node as having invalid state. This 632 * is a driver bug. 633 */ 634 dev->state = DEVICE_INVALID; 635 fibril_rwlock_read_unlock(&device_tree.rwlock); 636 dev_del_ref(dev); 637 return; 638 } 639 640 driver_t *driver = dev->drv; 641 fibril_rwlock_read_unlock(&device_tree.rwlock); 642 643 if (driver) 644 detach_driver(&device_tree, dev); 645 646 fibril_rwlock_write_lock(&device_tree.rwlock); 647 remove_dev_node(&device_tree, dev); 648 649 /* Delete ref created when node was inserted */ 650 dev_del_ref(dev); 651 /* Delete ref created by dev_add_ref(dev) above */ 652 dev_del_ref(dev); 605 653 } 606 654 } else {
Note:
See TracChangeset
for help on using the changeset viewer.