Changeset 17279ead in mainline
- Timestamp:
- 2011-04-09T09:39:07Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 89c57b6, 969d88e, a7de7182, b2fb47f, b77ce84
- Parents:
- 53debe0 (diff), 26fa82bc (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- uspace
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/driver.c
r53debe0 r17279ead 47 47 #include <stdlib.h> 48 48 #include <str.h> 49 #include <str_error.h> 49 50 #include <ctype.h> 50 51 #include <errno.h> … … 655 656 int ddf_driver_main(driver_t *drv) 656 657 { 658 int rc; 659 657 660 /* 658 661 * Remember the driver structure - driver_ops will be called by generic … … 668 671 669 672 /* 670 * Register driver by device manager with generic handler for incoming671 * connections.673 * Register driver with device manager using generic handler for 674 * incoming connections. 672 675 */ 673 devman_driver_register(driver->name, driver_connection); 674 676 rc = devman_driver_register(driver->name, driver_connection); 677 if (rc != EOK) { 678 printf("Error: Failed to register driver with device manager " 679 "(%s).\n", (rc == EEXISTS) ? "driver already started" : 680 str_error(rc)); 681 682 return 1; 683 } 684 685 /* Return success from the task since server has started. */ 686 rc = task_retval(0); 687 if (rc != EOK) 688 return 1; 689 675 690 async_manager(); 676 691 -
uspace/srv/devman/devman.c
r53debe0 r17279ead 555 555 } 556 556 557 /** Remember the driver's phone.558 *559 * @param driver The driver.560 * @param phone The phone to the driver.561 */562 void set_driver_phone(driver_t *driver, sysarg_t phone)563 {564 fibril_mutex_lock(&driver->driver_mutex);565 assert(driver->state == DRIVER_STARTING);566 driver->phone = phone;567 fibril_mutex_unlock(&driver->driver_mutex);568 }569 570 557 /** Notify driver about the devices to which it was assigned. 571 558 * … … 685 672 list_initialize(&drv->devices); 686 673 fibril_mutex_initialize(&drv->driver_mutex); 674 drv->phone = -1; 687 675 } 688 676 -
uspace/srv/devman/devman.h
r53debe0 r17279ead 88 88 89 89 /** Phone asociated with this driver. */ 90 sysarg_t phone;90 int phone; 91 91 /** Name of the device driver. */ 92 92 char *name; … … 316 316 317 317 extern driver_t *find_driver(driver_list_t *, const char *); 318 extern void set_driver_phone(driver_t *, sysarg_t);319 318 extern void initialize_running_driver(driver_t *, dev_tree_t *); 320 319 -
uspace/srv/devman/main.c
r53debe0 r17279ead 95 95 /* Find driver structure. */ 96 96 driver = find_driver(&drivers_list, drv_name); 97 98 97 if (driver == NULL) { 99 98 log_msg(LVL_ERROR, "No driver named `%s' was found.", drv_name); … … 107 106 drv_name = NULL; 108 107 108 fibril_mutex_lock(&driver->driver_mutex); 109 110 if (driver->phone >= 0) { 111 /* We already have a connection to the driver. */ 112 log_msg(LVL_ERROR, "Driver '%s' already started.\n", 113 driver->name); 114 fibril_mutex_unlock(&driver->driver_mutex); 115 async_answer_0(iid, EEXISTS); 116 return NULL; 117 } 118 119 switch (driver->state) { 120 case DRIVER_NOT_STARTED: 121 /* Somebody started the driver manually. */ 122 log_msg(LVL_NOTE, "Driver '%s' started manually.\n", 123 driver->name); 124 driver->state = DRIVER_STARTING; 125 break; 126 case DRIVER_STARTING: 127 /* The expected case */ 128 break; 129 case DRIVER_RUNNING: 130 /* Should not happen since we do not have a connected phone */ 131 assert(false); 132 } 133 109 134 /* Create connection to the driver. */ 110 135 log_msg(LVL_DEBUG, "Creating connection to the `%s' driver.", … … 113 138 ipc_callid_t callid = async_get_call(&call); 114 139 if (IPC_GET_IMETHOD(call) != IPC_M_CONNECT_TO_ME) { 140 fibril_mutex_unlock(&driver->driver_mutex); 115 141 async_answer_0(callid, ENOTSUP); 116 142 async_answer_0(iid, ENOTSUP); … … 119 145 120 146 /* Remember driver's phone. */ 121 set_driver_phone(driver, IPC_GET_ARG5(call)); 147 driver->phone = IPC_GET_ARG5(call); 148 149 fibril_mutex_unlock(&driver->driver_mutex); 122 150 123 151 log_msg(LVL_NOTE, … … 578 606 method = DRIVER_CLIENT; 579 607 580 if (driver->phone < =0) {608 if (driver->phone < 0) { 581 609 log_msg(LVL_ERROR, 582 610 "Could not forward to driver `%s' (phone is %d).", … … 618 646 dev = fun->dev; 619 647 620 if (dev->state != DEVICE_USABLE || dev->drv->phone < =0) {648 if (dev->state != DEVICE_USABLE || dev->drv->phone < 0) { 621 649 async_answer_0(iid, EINVAL); 622 650 return;
Note:
See TracChangeset
for help on using the changeset viewer.