Changeset 7969087 in mainline


Ignore:
Timestamp:
2013-09-11T10:35:49Z (11 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
43dd8028
Parents:
e5556e4a
Message:

devctl load-drv to manually load a driver.

Location:
uspace
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/devctl/devctl.c

    re5556e4a r7969087  
    199199}
    200200
     201static int drv_load(const char *drvname)
     202{
     203        int rc;
     204        devman_handle_t drvh;
     205
     206        rc = devman_driver_get_handle(drvname, &drvh);
     207        if (rc != EOK) {
     208                printf("Failed resolving driver '%s' (%d).\n", drvname, rc);
     209                return rc;
     210        }
     211
     212        rc = devman_driver_load(drvh);
     213        if (rc != EOK) {
     214                printf("Failed loading driver '%s' (%d).\n", drvname, rc);
     215                return rc;
     216        }
     217
     218        return EOK;
     219}
     220
    201221static void print_syntax(void)
    202222{
     
    206226        printf("\tdevctl offline <function>]\n");
    207227        printf("\tdevctl list-drv\n");
     228        printf("\tdevctl load-drv <driver-name>\n");
    208229}
    209230
     
    242263                if (rc != EOK)
    243264                        return 2;
     265        } else if (str_cmp(argv[1], "load-drv") == 0) {
     266                if (argc < 3) {
     267                        printf(NAME ": Argument missing.\n");
     268                        print_syntax();
     269                        return 1;
     270                }
     271
     272                rc = drv_load(argv[2]);
     273                if (rc != EOK)
     274                        return 2;
    244275        } else {
    245276                printf(NAME ": Invalid argument '%s'.\n", argv[1]);
  • uspace/lib/c/generic/devman.c

    re5556e4a r7969087  
    598598}
    599599
     600int devman_driver_get_handle(const char *drvname, devman_handle_t *handle)
     601{
     602        async_exch_t *exch;
     603
     604        exch = devman_exchange_begin(DEVMAN_CLIENT);
     605        if (exch == NULL)
     606                return ENOMEM;
     607       
     608        ipc_call_t answer;
     609        aid_t req = async_send_0(exch, DEVMAN_DRIVER_GET_HANDLE, &answer);
     610        sysarg_t retval = async_data_write_start(exch, drvname,
     611            str_size(drvname));
     612       
     613        devman_exchange_end(exch);
     614       
     615        if (retval != EOK) {
     616                async_forget(req);
     617                return retval;
     618        }
     619       
     620        async_wait_for(req, &retval);
     621       
     622        if (retval != EOK) {
     623                if (handle != NULL)
     624                        *handle = (devman_handle_t) -1;
     625               
     626                return retval;
     627        }
     628       
     629        if (handle != NULL)
     630                *handle = (devman_handle_t) IPC_GET_ARG1(answer);
     631       
     632        return retval;
     633}
     634
    600635int devman_driver_get_name(devman_handle_t handle, char *buf, size_t buf_size)
    601636{
     
    622657}
    623658
     659int devman_driver_load(devman_handle_t drvh)
     660{
     661        async_exch_t *exch = devman_exchange_begin(DEVMAN_CLIENT);
     662        if (exch == NULL)
     663                return ENOMEM;
     664       
     665        int rc = async_req_1_0(exch, DEVMAN_DRIVER_LOAD, drvh);
     666       
     667        devman_exchange_end(exch);
     668        return rc;
     669}
     670
    624671/** @}
    625672 */
  • uspace/lib/c/include/devman.h

    re5556e4a r7969087  
    7272extern int devman_fun_sid_to_handle(service_id_t, devman_handle_t *);
    7373extern int devman_get_drivers(devman_handle_t **, size_t *);
     74extern int devman_driver_get_handle(const char *, devman_handle_t *);
    7475extern int devman_driver_get_name(devman_handle_t, char *, size_t);
    7576extern int devman_driver_get_state(devman_handle_t, driver_state_t *);
     77extern int devman_driver_load(devman_handle_t);
    7678
    7779#endif
  • uspace/lib/c/include/ipc/devman.h

    re5556e4a r7969087  
    177177        DEVMAN_FUN_SID_TO_HANDLE,
    178178        DEVMAN_GET_DRIVERS,
     179        DEVMAN_DRIVER_GET_HANDLE,
    179180        DEVMAN_DRIVER_GET_NAME,
    180         DEVMAN_DRIVER_GET_STATE
     181        DEVMAN_DRIVER_GET_STATE,
     182        DEVMAN_DRIVER_LOAD
    181183} client_to_devman_t;
    182184
  • uspace/srv/devman/client_conn.c

    re5556e4a r7969087  
    450450}
    451451
     452/** Find driver by name. */
     453static void devman_driver_get_handle(ipc_callid_t iid, ipc_call_t *icall)
     454{
     455        char *drvname;
     456       
     457        int rc = async_data_write_accept((void **) &drvname, true, 0, 0, 0, 0);
     458        if (rc != EOK) {
     459                async_answer_0(iid, rc);
     460                return;
     461        }
     462       
     463        driver_t *driver = driver_find_by_name(&drivers_list, drvname);
     464       
     465        free(drvname);
     466       
     467        if (driver == NULL) {
     468                async_answer_0(iid, ENOENT);
     469                return;
     470        }
     471       
     472        async_answer_1(iid, EOK, driver->handle);
     473}
     474
    452475/** Get driver name. */
    453476static void devman_driver_get_name(ipc_callid_t iid, ipc_call_t *icall)
     
    502525       
    503526        async_answer_1(iid, EOK, (sysarg_t) drv->state);
     527}
     528
     529/** Forcibly load a driver. */
     530static void devman_driver_load(ipc_callid_t iid, ipc_call_t *icall)
     531{
     532        driver_t *drv;
     533        int rc;
     534       
     535        drv = driver_find(&drivers_list, IPC_GET_ARG1(*icall));
     536        if (drv == NULL) {
     537                async_answer_0(iid, ENOENT);
     538                return;
     539        }
     540       
     541        fibril_mutex_lock(&drv->driver_mutex);
     542        rc = start_driver(drv) ? EOK : EIO;
     543        fibril_mutex_unlock(&drv->driver_mutex);
     544
     545        async_answer_0(iid, rc);
    504546}
    505547
     
    548590                        devman_get_drivers(callid, &call);
    549591                        break;
     592                case DEVMAN_DRIVER_GET_HANDLE:
     593                        devman_driver_get_handle(callid, &call);
     594                        break;
    550595                case DEVMAN_DRIVER_GET_NAME:
    551596                        devman_driver_get_name(callid, &call);
     
    553598                case DEVMAN_DRIVER_GET_STATE:
    554599                        devman_driver_get_state(callid, &call);
     600                        break;
     601                case DEVMAN_DRIVER_LOAD:
     602                        devman_driver_load(callid, &call);
    555603                        break;
    556604                default:
Note: See TracChangeset for help on using the changeset viewer.