Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/devmap/devmap.c

    rb72efe8 r4ae90f9  
    3737
    3838#include <ipc/services.h>
    39 #include <ns.h>
     39#include <ipc/ns.h>
    4040#include <async.h>
    4141#include <stdio.h>
     
    5757 */
    5858typedef struct {
    59         /** Link to drivers_list */
     59        /** Pointers to previous and next drivers in linked list */
    6060        link_t drivers;
    61        
    62         /** List of devices controlled by this driver */
    63         list_t devices;
    64        
    65         /** Session asociated with this driver */
    66         async_sess_t *sess;
    67        
     61        /** Pointer to the linked list of devices controlled by this driver */
     62        link_t devices;
     63        /** Phone asociated with this driver */
     64        sysarg_t phone;
    6865        /** Device driver name */
    6966        char *name;
    70        
    7167        /** Fibril mutex for list of devices owned by this driver */
    7268        fibril_mutex_t devices_mutex;
     
    7773 */
    7874typedef struct {
    79         /** Link to namespaces_list */
     75        /** Pointer to the previous and next device in the list of all namespaces */
    8076        link_t namespaces;
    81        
    8277        /** Unique namespace identifier */
    8378        devmap_handle_t handle;
    84        
    8579        /** Namespace name */
    8680        char *name;
    87        
    8881        /** Reference count */
    8982        size_t refcnt;
     
    9487 */
    9588typedef struct {
    96         /** Link to global list of devices (devices_list) */
     89        /** Pointer to the previous and next device in the list of all devices */
    9790        link_t devices;
    98         /** Link to driver list of devices (devmap_driver_t.devices) */
     91        /** Pointer to the previous and next device in the list of devices
     92            owned by one driver */
    9993        link_t driver_devices;
    10094        /** Unique device identifier */
     
    224218static devmap_namespace_t *devmap_namespace_find_name(const char *name)
    225219{
     220        link_t *item;
     221       
    226222        assert(fibril_mutex_is_locked(&devices_list_mutex));
    227223       
    228         list_foreach(namespaces_list, item) {
     224        for (item = namespaces_list.next; item != &namespaces_list; item = item->next) {
    229225                devmap_namespace_t *namespace =
    230226                    list_get_instance(item, devmap_namespace_t, namespaces);
     
    243239static devmap_namespace_t *devmap_namespace_find_handle(devmap_handle_t handle)
    244240{
     241        link_t *item;
     242       
    245243        assert(fibril_mutex_is_locked(&devices_list_mutex));
    246244       
    247         list_foreach(namespaces_list, item) {
     245        for (item = namespaces_list.next; item != &namespaces_list; item = item->next) {
    248246                devmap_namespace_t *namespace =
    249247                    list_get_instance(item, devmap_namespace_t, namespaces);
     
    259257    const char *name)
    260258{
     259        link_t *item;
     260       
    261261        assert(fibril_mutex_is_locked(&devices_list_mutex));
    262262       
    263         list_foreach(devices_list, item) {
     263        for (item = devices_list.next; item != &devices_list; item = item->next) {
    264264                devmap_device_t *device =
    265265                    list_get_instance(item, devmap_device_t, devices);
     
    279279static devmap_device_t *devmap_device_find_handle(devmap_handle_t handle)
    280280{
     281        link_t *item;
     282       
    281283        assert(fibril_mutex_is_locked(&devices_list_mutex));
    282284       
    283         list_foreach(devices_list, item) {
     285        for (item = devices_list.next; item != &devices_list; item = item->next) {
    284286                devmap_device_t *device =
    285287                    list_get_instance(item, devmap_device_t, devices);
     
    403405         * Create connection to the driver
    404406         */
    405         driver->sess = async_callback_receive(EXCHANGE_SERIALIZE);
    406         if (!driver->sess) {
     407        ipc_call_t call;
     408        ipc_callid_t callid = async_get_call(&call);
     409       
     410        if (IPC_GET_IMETHOD(call) != IPC_M_CONNECT_TO_ME) {
    407411                free(driver->name);
    408412                free(driver);
     413                async_answer_0(callid, ENOTSUP);
    409414                async_answer_0(iid, ENOTSUP);
    410415                return NULL;
    411416        }
     417       
     418        driver->phone = IPC_GET_ARG5(call);
     419        async_answer_0(callid, EOK);
    412420       
    413421        /*
     
    454462        fibril_mutex_lock(&drivers_list_mutex);
    455463       
    456         if (driver->sess)
    457                 async_hangup(driver->sess);
     464        if (driver->phone != 0)
     465                async_hangup(driver->phone);
    458466       
    459467        /* Remove it from list of drivers */
     
    464472        fibril_mutex_lock(&driver->devices_mutex);
    465473       
    466         while (!list_empty(&driver->devices)) {
    467                 devmap_device_t *device = list_get_instance(
    468                     list_first(&driver->devices), devmap_device_t,
    469                     driver_devices);
     474        while (!list_empty(&(driver->devices))) {
     475                devmap_device_t *device = list_get_instance(driver->devices.next,
     476                    devmap_device_t, driver_devices);
    470477                devmap_device_unregister_core(device);
    471478        }
     
    600607        devmap_device_t *dev = devmap_device_find_handle(handle);
    601608       
    602         if ((dev == NULL) || (dev->driver == NULL) || (!dev->driver->sess)) {
     609        if ((dev == NULL) || (dev->driver == NULL) || (dev->driver->phone == 0)) {
    603610                fibril_mutex_unlock(&devices_list_mutex);
    604611                async_answer_0(callid, ENOENT);
     
    606613        }
    607614       
    608         async_exch_t *exch = async_exchange_begin(dev->driver->sess);
    609        
    610         if (dev->forward_interface == 0)
    611                 async_forward_fast(callid, exch, dev->handle, 0, 0, IPC_FF_NONE);
    612         else
    613                 async_forward_fast(callid, exch, dev->forward_interface,
    614                     dev->handle, 0, IPC_FF_NONE);
    615        
    616         async_exchange_end(exch);
     615        if (dev->forward_interface == 0) {
     616                async_forward_fast(callid, dev->driver->phone,
     617                    dev->handle, 0, 0,
     618                    IPC_FF_NONE);
     619        } else {
     620                async_forward_fast(callid, dev->driver->phone,
     621                    dev->forward_interface, dev->handle, 0,
     622                    IPC_FF_NONE);
     623        }
    617624       
    618625        fibril_mutex_unlock(&devices_list_mutex);
     
    807814        }
    808815       
     816        link_t *item;
    809817        size_t pos = 0;
    810         list_foreach(namespaces_list, item) {
     818        for (item = namespaces_list.next; item != &namespaces_list;
     819            item = item->next) {
    811820                devmap_namespace_t *namespace =
    812821                    list_get_instance(item, devmap_namespace_t, namespaces);
     
    871880        }
    872881       
     882        link_t *item;
    873883        size_t pos = 0;
    874         list_foreach(devices_list, item) {
     884        for (item = devices_list.next; item != &devices_list; item = item->next) {
    875885                devmap_device_t *device =
    876886                    list_get_instance(item, devmap_device_t, devices);
     
    10191029                return;
    10201030       
    1021         while (true) {
     1031        bool cont = true;
     1032        while (cont) {
    10221033                ipc_call_t call;
    10231034                ipc_callid_t callid = async_get_call(&call);
    10241035               
    1025                 if (!IPC_GET_IMETHOD(call))
    1026                         break;
    1027                
    10281036                switch (IPC_GET_IMETHOD(call)) {
     1037                case IPC_M_PHONE_HUNGUP:
     1038                        cont = false;
     1039                        continue;
    10291040                case DEVMAP_DRIVER_UNREGISTER:
    10301041                        if (NULL == driver)
     
    10691080        async_answer_0(iid, EOK);
    10701081       
    1071         while (true) {
     1082        bool cont = true;
     1083        while (cont) {
    10721084                ipc_call_t call;
    10731085                ipc_callid_t callid = async_get_call(&call);
    10741086               
    1075                 if (!IPC_GET_IMETHOD(call))
    1076                         break;
    1077                
    10781087                switch (IPC_GET_IMETHOD(call)) {
     1088                case IPC_M_PHONE_HUNGUP:
     1089                        cont = false;
     1090                        continue;
    10791091                case DEVMAP_DEVICE_GET_HANDLE:
    10801092                        devmap_device_get_handle(callid, &call);
     
    11131125 *
    11141126 */
    1115 static void devmap_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     1127static void devmap_connection(ipc_callid_t iid, ipc_call_t *icall)
    11161128{
    11171129        /* Select interface */
Note: See TracChangeset for help on using the changeset viewer.