Changes in / [17279ead:53debe0] in mainline
- Location:
- uspace
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/driver.c
r17279ead r53debe0 47 47 #include <stdlib.h> 48 48 #include <str.h> 49 #include <str_error.h>50 49 #include <ctype.h> 51 50 #include <errno.h> … … 656 655 int ddf_driver_main(driver_t *drv) 657 656 { 658 int rc;659 660 657 /* 661 658 * Remember the driver structure - driver_ops will be called by generic … … 671 668 672 669 /* 673 * Register driver with device manager using generic handler for674 * incomingconnections.670 * Register driver by device manager with generic handler for incoming 671 * connections. 675 672 */ 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 673 devman_driver_register(driver->name, driver_connection); 674 690 675 async_manager(); 691 676 -
uspace/srv/devman/devman.c
r17279ead r53debe0 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 557 570 /** Notify driver about the devices to which it was assigned. 558 571 * … … 672 685 list_initialize(&drv->devices); 673 686 fibril_mutex_initialize(&drv->driver_mutex); 674 drv->phone = -1;675 687 } 676 688 -
uspace/srv/devman/devman.h
r17279ead r53debe0 88 88 89 89 /** Phone asociated with this driver. */ 90 int phone;90 sysarg_t 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); 318 319 extern void initialize_running_driver(driver_t *, dev_tree_t *); 319 320 -
uspace/srv/devman/main.c
r17279ead r53debe0 95 95 /* Find driver structure. */ 96 96 driver = find_driver(&drivers_list, drv_name); 97 97 98 if (driver == NULL) { 98 99 log_msg(LVL_ERROR, "No driver named `%s' was found.", drv_name); … … 106 107 drv_name = NULL; 107 108 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 134 109 /* Create connection to the driver. */ 135 110 log_msg(LVL_DEBUG, "Creating connection to the `%s' driver.", … … 138 113 ipc_callid_t callid = async_get_call(&call); 139 114 if (IPC_GET_IMETHOD(call) != IPC_M_CONNECT_TO_ME) { 140 fibril_mutex_unlock(&driver->driver_mutex);141 115 async_answer_0(callid, ENOTSUP); 142 116 async_answer_0(iid, ENOTSUP); … … 145 119 146 120 /* Remember driver's phone. */ 147 driver->phone = IPC_GET_ARG5(call); 148 149 fibril_mutex_unlock(&driver->driver_mutex); 121 set_driver_phone(driver, IPC_GET_ARG5(call)); 150 122 151 123 log_msg(LVL_NOTE, … … 606 578 method = DRIVER_CLIENT; 607 579 608 if (driver->phone < 0) {580 if (driver->phone <= 0) { 609 581 log_msg(LVL_ERROR, 610 582 "Could not forward to driver `%s' (phone is %d).", … … 646 618 dev = fun->dev; 647 619 648 if (dev->state != DEVICE_USABLE || dev->drv->phone < 0) {620 if (dev->state != DEVICE_USABLE || dev->drv->phone <= 0) { 649 621 async_answer_0(iid, EINVAL); 650 622 return;
Note:
See TracChangeset
for help on using the changeset viewer.