Ignore:
File:
1 edited

Legend:

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

    r79ae36dd r4ae90f9  
    3737
    3838#include <ipc/services.h>
    39 #include <ns.h>
     39#include <ipc/ns.h>
    4040#include <async.h>
    4141#include <stdio.h>
     
    5959        /** Pointers to previous and next drivers in linked list */
    6060        link_t drivers;
    61        
    6261        /** Pointer to the linked list of devices controlled by this driver */
    6362        link_t devices;
    64        
    65         /** Session asociated with this driver */
    66         async_sess_t *sess;
    67        
     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;
     
    7975        /** 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;
     
    412405         * Create connection to the driver
    413406         */
    414         driver->sess = async_callback_receive(EXCHANGE_SERIALIZE);
    415         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) {
    416411                free(driver->name);
    417412                free(driver);
     413                async_answer_0(callid, ENOTSUP);
    418414                async_answer_0(iid, ENOTSUP);
    419415                return NULL;
    420416        }
     417       
     418        driver->phone = IPC_GET_ARG5(call);
     419        async_answer_0(callid, EOK);
    421420       
    422421        /*
     
    463462        fibril_mutex_lock(&drivers_list_mutex);
    464463       
    465         if (driver->sess)
    466                 async_hangup(driver->sess);
     464        if (driver->phone != 0)
     465                async_hangup(driver->phone);
    467466       
    468467        /* Remove it from list of drivers */
     
    608607        devmap_device_t *dev = devmap_device_find_handle(handle);
    609608       
    610         if ((dev == NULL) || (dev->driver == NULL) || (!dev->driver->sess)) {
     609        if ((dev == NULL) || (dev->driver == NULL) || (dev->driver->phone == 0)) {
    611610                fibril_mutex_unlock(&devices_list_mutex);
    612611                async_answer_0(callid, ENOENT);
     
    614613        }
    615614       
    616         async_exch_t *exch = async_exchange_begin(dev->driver->sess);
    617        
    618         if (dev->forward_interface == 0)
    619                 async_forward_fast(callid, exch, dev->handle, 0, 0, IPC_FF_NONE);
    620         else
    621                 async_forward_fast(callid, exch, dev->forward_interface,
    622                     dev->handle, 0, IPC_FF_NONE);
    623        
    624         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        }
    625624       
    626625        fibril_mutex_unlock(&devices_list_mutex);
     
    10301029                return;
    10311030       
    1032         while (true) {
     1031        bool cont = true;
     1032        while (cont) {
    10331033                ipc_call_t call;
    10341034                ipc_callid_t callid = async_get_call(&call);
    10351035               
    1036                 if (!IPC_GET_IMETHOD(call))
    1037                         break;
    1038                
    10391036                switch (IPC_GET_IMETHOD(call)) {
     1037                case IPC_M_PHONE_HUNGUP:
     1038                        cont = false;
     1039                        continue;
    10401040                case DEVMAP_DRIVER_UNREGISTER:
    10411041                        if (NULL == driver)
     
    10801080        async_answer_0(iid, EOK);
    10811081       
    1082         while (true) {
     1082        bool cont = true;
     1083        while (cont) {
    10831084                ipc_call_t call;
    10841085                ipc_callid_t callid = async_get_call(&call);
    10851086               
    1086                 if (!IPC_GET_IMETHOD(call))
    1087                         break;
    1088                
    10891087                switch (IPC_GET_IMETHOD(call)) {
     1088                case IPC_M_PHONE_HUNGUP:
     1089                        cont = false;
     1090                        continue;
    10901091                case DEVMAP_DEVICE_GET_HANDLE:
    10911092                        devmap_device_get_handle(callid, &call);
Note: See TracChangeset for help on using the changeset viewer.