Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/drv/generic/driver.c

    rca48672 rfafb8e5  
    11/*
    2  * Copyright (c) 2025 Jiri Svoboda
    32 * Copyright (c) 2010 Lenka Trochtova
     3 * Copyright (c) 2011 Jiri Svoboda
    44 * All rights reserved.
    55 *
     
    237237}
    238238
    239 static void driver_dev_quiesce(ipc_call_t *icall)
    240 {
    241         devman_handle_t devh = ipc_get_arg1(icall);
    242         ddf_fun_t *fun;
    243         link_t *link;
    244 
    245         fibril_mutex_lock(&devices_mutex);
    246         ddf_dev_t *dev = driver_get_device(devh);
    247         if (dev != NULL)
    248                 dev_add_ref(dev);
    249         fibril_mutex_unlock(&devices_mutex);
    250 
    251         if (dev == NULL) {
    252                 async_answer_0(icall, ENOENT);
    253                 return;
    254         }
    255 
    256         errno_t rc;
    257 
    258         if (driver->driver_ops->dev_quiesce != NULL) {
    259                 rc = driver->driver_ops->dev_quiesce(dev);
    260         } else {
    261                 /*
    262                  * If the driver does not implement quiesce, we will
    263                  * simply request all subordinate functions to quiesce.
    264                  */
    265                 fibril_mutex_lock(&functions_mutex);
    266                 link = list_first(&functions);
    267                 while (link != NULL) {
    268                         fun = list_get_instance(link, ddf_fun_t, link);
    269                         if (fun->dev == dev)
    270                                 ddf_fun_quiesce(fun);
    271                         link = list_next(link, &functions);
    272                 }
    273                 fibril_mutex_unlock(&functions_mutex);
    274                 rc = EOK;
    275         }
    276 
    277         dev_del_ref(dev);
    278         async_answer_0(icall, rc);
    279 }
    280 
    281239static void driver_fun_online(ipc_call_t *icall)
    282240{
     
    399357                case DRIVER_DEV_GONE:
    400358                        driver_dev_gone(&call);
    401                         break;
    402                 case DRIVER_DEV_QUIESCE:
    403                         driver_dev_quiesce(&call);
    404359                        break;
    405360                case DRIVER_FUN_ONLINE:
     
    948903}
    949904
    950 /** Quiesce function.
    951  *
    952  * @param fun Function to quiesce
    953  *
    954  * @return EOK on success or an error code
    955  *
    956  */
    957 errno_t ddf_fun_quiesce(ddf_fun_t *fun)
    958 {
    959         assert(fun->bound == true);
    960 
    961         errno_t res = devman_drv_fun_quiesce(fun->handle);
    962         if (res != EOK)
    963                 return res;
    964 
    965         return EOK;
    966 }
    967 
    968905/** Add single match ID to inner function.
    969906 *
     
    1034971}
    1035972
    1036 /** Wait for function to enter stable state.
    1037  *
    1038  * @param fun Function
    1039  * @return EOK on success or an error code
    1040  */
    1041 errno_t ddf_fun_wait_stable(ddf_fun_t *fun)
    1042 {
    1043         return devman_drv_fun_wait_stable(fun->handle);
    1044 }
    1045 
    1046973errno_t ddf_driver_main(const driver_t *drv)
    1047974{
    1048         port_id_t drv_port;
    1049         port_id_t devman_port;
    1050 
    1051975        /*
    1052976         * Remember the driver structure - driver_ops will be called by generic
     
    1059983         * incoming connections.
    1060984         */
    1061         errno_t rc = async_create_port(INTERFACE_DDF_DRIVER,
    1062             driver_connection_driver, NULL, &drv_port);
     985        port_id_t port;
     986        errno_t rc = async_create_port(INTERFACE_DDF_DRIVER, driver_connection_driver,
     987            NULL, &port);
    1063988        if (rc != EOK) {
    1064989                printf("Error: Failed to create driver port.\n");
     
    1067992
    1068993        rc = async_create_port(INTERFACE_DDF_DEVMAN, driver_connection_devman,
    1069             NULL, &devman_port);
     994            NULL, &port);
    1070995        if (rc != EOK) {
    1071996                printf("Error: Failed to create devman port.\n");
    1072                 async_port_destroy(drv_port);
    1073997                return rc;
    1074998        }
     
    10811005                    "(%s).\n", (rc == EEXIST) ? "driver already started" :
    10821006                    str_error(rc));
    1083                 async_port_destroy(devman_port);
    1084                 async_port_destroy(drv_port);
     1007
    10851008                return rc;
    10861009        }
     
    10901013        if (rc != EOK) {
    10911014                printf("Error: Failed returning task value.\n");
    1092                 // XXX devman_driver_unregister
    1093                 async_port_destroy(devman_port);
    1094                 async_port_destroy(drv_port);
    10951015                return rc;
    10961016        }
Note: See TracChangeset for help on using the changeset viewer.