Changeset 1db5669 in mainline for uspace/srv/devman


Ignore:
Timestamp:
2013-09-11T12:35:55Z (12 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.

Location:
uspace/srv/devman
Files:
3 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:
  • uspace/srv/devman/driver.c

    rcd3b380 r1db5669  
    729729}
    730730
     731/** Get list of device functions. */
     732int driver_get_devices(driver_t *driver, devman_handle_t *hdl_buf,
     733    size_t buf_size, size_t *act_size)
     734{
     735        size_t act_cnt;
     736        size_t buf_cnt;
     737
     738        fibril_mutex_lock(&driver->driver_mutex);
     739
     740        buf_cnt = buf_size / sizeof(devman_handle_t);
     741
     742        act_cnt = list_count(&driver->devices);
     743        *act_size = act_cnt * sizeof(devman_handle_t);
     744
     745        if (buf_size % sizeof(devman_handle_t) != 0) {
     746                fibril_mutex_unlock(&driver->driver_mutex);
     747                return EINVAL;
     748        }
     749
     750        size_t pos = 0;
     751        list_foreach(driver->devices, driver_devices, dev_node_t, dev) {
     752                if (pos < buf_cnt) {
     753                        hdl_buf[pos] = dev->handle;
     754                }
     755
     756                pos++;
     757        }
     758
     759        fibril_mutex_unlock(&driver->driver_mutex);
     760        return EOK;
     761}
     762
    731763/** @}
    732764 */
  • uspace/srv/devman/driver.h

    rcd3b380 r1db5669  
    6464extern void delete_driver(driver_t *);
    6565extern int driver_get_list(driver_list_t *, devman_handle_t *, size_t, size_t *);
     66extern int driver_get_devices(driver_t *, devman_handle_t *, size_t, size_t *);
    6667
    6768#endif
Note: See TracChangeset for help on using the changeset viewer.