Changeset 1db5669 in mainline for uspace/srv/devman/client_conn.c


Ignore:
Timestamp:
2013-09-11T12:35:55Z (11 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
48bd6f4, 4c9b28a
Parents:
cd3b380
Message:

devctl show-drv lists attached devices, add device count to list-drv.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/devman/client_conn.c

    rcd3b380 r1db5669  
    11/*
    22 * Copyright (c) 2010 Lenka Trochtova
     3 * Copyright (c) 2013 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    269270}
    270271
     272/** Get handle for parent function of a device. */
     273static void devman_dev_get_parent(ipc_callid_t iid, ipc_call_t *icall)
     274{
     275        dev_node_t *dev;
     276       
     277        fibril_rwlock_read_lock(&device_tree.rwlock);
     278       
     279        dev = find_dev_node_no_lock(&device_tree, IPC_GET_ARG1(*icall));
     280        if (dev == NULL || dev->state == DEVICE_REMOVED) {
     281                fibril_rwlock_read_unlock(&device_tree.rwlock);
     282                async_answer_0(iid, ENOENT);
     283                return;
     284        }
     285       
     286        if (dev->pfun == NULL) {
     287                fibril_rwlock_read_unlock(&device_tree.rwlock);
     288                async_answer_0(iid, ENOENT);
     289                return;
     290        }
     291       
     292        async_answer_1(iid, EOK, dev->pfun->handle);
     293       
     294        fibril_rwlock_read_unlock(&device_tree.rwlock);
     295}
     296
    271297static void devman_dev_get_functions(ipc_callid_t iid, ipc_call_t *icall)
    272298{
     
    425451       
    426452        if (!async_data_read_receive(&callid, &size)) {
    427                 async_answer_0(callid, EREFUSED);
    428453                async_answer_0(iid, EREFUSED);
    429454                return;
     
    449474        async_answer_1(iid, retval, act_size);
    450475}
     476
     477static void devman_driver_get_devices(ipc_callid_t iid, ipc_call_t *icall)
     478{
     479        ipc_callid_t callid;
     480        size_t size;
     481        size_t act_size;
     482        int rc;
     483       
     484        if (!async_data_read_receive(&callid, &size)) {
     485                async_answer_0(iid, EREFUSED);
     486                return;
     487        }
     488       
     489        driver_t *drv = driver_find(&drivers_list, IPC_GET_ARG1(*icall));
     490        if (drv == NULL) {
     491                async_answer_0(callid, ENOENT);
     492                async_answer_0(iid, ENOENT);
     493                return;
     494        }
     495       
     496        devman_handle_t *hdl_buf = (devman_handle_t *) malloc(size);
     497        if (hdl_buf == NULL) {
     498                async_answer_0(callid, ENOMEM);
     499                async_answer_0(iid, ENOMEM);
     500                return;
     501        }
     502       
     503        rc = driver_get_devices(drv, hdl_buf, size, &act_size);
     504        if (rc != EOK) {
     505                fibril_rwlock_read_unlock(&device_tree.rwlock);
     506                async_answer_0(callid, rc);
     507                async_answer_0(iid, rc);
     508                return;
     509        }
     510       
     511        sysarg_t retval = async_data_read_finalize(callid, hdl_buf, size);
     512        free(hdl_buf);
     513       
     514        async_answer_1(iid, retval, act_size);
     515}
     516
    451517
    452518/** Find driver by name. */
     
    563629                        devman_function_get_handle(callid, &call);
    564630                        break;
     631                case DEVMAN_DEV_GET_PARENT:
     632                        devman_dev_get_parent(callid, &call);
     633                        break;
    565634                case DEVMAN_DEV_GET_FUNCTIONS:
    566635                        devman_dev_get_functions(callid, &call);
     
    589658                case DEVMAN_GET_DRIVERS:
    590659                        devman_get_drivers(callid, &call);
     660                        break;
     661                case DEVMAN_DRIVER_GET_DEVICES:
     662                        devman_driver_get_devices(callid, &call);
    591663                        break;
    592664                case DEVMAN_DRIVER_GET_HANDLE:
Note: See TracChangeset for help on using the changeset viewer.