Ignore:
File:
1 edited

Legend:

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

    r9934f7d r431d6d6  
    3939#include <assert.h>
    4040#include <ipc/services.h>
    41 #include <ns.h>
     41#include <ipc/ns.h>
    4242#include <async.h>
    4343#include <stdio.h>
     
    108108        fibril_mutex_lock(&driver->driver_mutex);
    109109       
    110         if (driver->sess) {
     110        if (driver->phone >= 0) {
    111111                /* We already have a connection to the driver. */
    112112                log_msg(LVL_ERROR, "Driver '%s' already started.\n",
     
    128128                break;
    129129        case DRIVER_RUNNING:
    130                 /* Should not happen since we do not have a connected session */
     130                /* Should not happen since we do not have a connected phone */
    131131                assert(false);
    132132        }
     
    135135        log_msg(LVL_DEBUG, "Creating connection to the `%s' driver.",
    136136            driver->name);
    137         driver->sess = async_callback_receive(EXCHANGE_SERIALIZE);
    138         if (!driver->sess) {
     137        ipc_call_t call;
     138        ipc_callid_t callid = async_get_call(&call);
     139        if (IPC_GET_IMETHOD(call) != IPC_M_CONNECT_TO_ME) {
    139140                fibril_mutex_unlock(&driver->driver_mutex);
     141                async_answer_0(callid, ENOTSUP);
    140142                async_answer_0(iid, ENOTSUP);
    141143                return NULL;
    142144        }
    143145       
     146        /* Remember driver's phone. */
     147        driver->phone = IPC_GET_ARG5(call);
     148       
    144149        fibril_mutex_unlock(&driver->driver_mutex);
    145150       
    146         log_msg(LVL_NOTE,
     151        log_msg(LVL_NOTE, 
    147152            "The `%s' driver was successfully registered as running.",
    148153            driver->name);
    149154       
     155        async_answer_0(callid, EOK);
    150156        async_answer_0(iid, EOK);
    151157       
     
    428434        fibril_add_ready(fid);
    429435       
    430         while (true) {
    431                 ipc_call_t call;
    432                 ipc_callid_t callid = async_get_call(&call);
    433                
    434                 if (!IPC_GET_IMETHOD(call))
    435                         break;
     436        ipc_callid_t callid;
     437        ipc_call_t call;
     438        bool cont = true;
     439        while (cont) {
     440                callid = async_get_call(&call);
    436441               
    437442                switch (IPC_GET_IMETHOD(call)) {
     443                case IPC_M_PHONE_HUNGUP:
     444                        cont = false;
     445                        continue;
    438446                case DEVMAN_ADD_FUNCTION:
    439447                        devman_add_function(callid, &call);
     
    551559        async_answer_0(iid, EOK);
    552560       
    553         while (true) {
     561        bool cont = true;
     562        while (cont) {
    554563                ipc_call_t call;
    555564                ipc_callid_t callid = async_get_call(&call);
    556565               
    557                 if (!IPC_GET_IMETHOD(call))
    558                         break;
    559                
    560566                switch (IPC_GET_IMETHOD(call)) {
     567                case IPC_M_PHONE_HUNGUP:
     568                        cont = false;
     569                        continue;
    561570                case DEVMAN_DEVICE_GET_HANDLE:
    562571                        devman_function_get_handle(callid, &call);
     
    626635        if (driver == NULL) {
    627636                log_msg(LVL_ERROR, "IPC forwarding refused - " \
    628                     "the device %" PRIun " is not in usable state.", handle);
     637                    "the device %" PRIun "(%s) is not in usable state.",
     638                    handle, dev->pfun->pathname);
    629639                async_answer_0(iid, ENOENT);
    630640                return;
     
    637647                method = DRIVER_CLIENT;
    638648       
    639         if (!driver->sess) {
    640                 log_msg(LVL_ERROR,
    641                     "Could not forward to driver `%s'.", driver->name);
     649        if (driver->phone < 0) {
     650                log_msg(LVL_ERROR,
     651                    "Could not forward to driver `%s' (phone is %d).",
     652                    driver->name, (int) driver->phone);
    642653                async_answer_0(iid, EINVAL);
    643654                return;
     
    653664                    dev->pfun->pathname, driver->name);
    654665        }
    655        
    656         async_exch_t *exch = async_exchange_begin(driver->sess);
    657         async_forward_fast(iid, exch, method, fwd_h, 0, IPC_FF_NONE);
    658         async_exchange_end(exch);
     666
     667        async_forward_fast(iid, driver->phone, method, fwd_h, 0, IPC_FF_NONE);
    659668}
    660669
     
    678687        dev = fun->dev;
    679688       
    680         if ((dev->state != DEVICE_USABLE) || (!dev->drv->sess)) {
     689        if (dev->state != DEVICE_USABLE || dev->drv->phone < 0) {
    681690                async_answer_0(iid, EINVAL);
    682691                return;
    683692        }
    684693       
    685         async_exch_t *exch = async_exchange_begin(dev->drv->sess);
    686         async_forward_fast(iid, exch, DRIVER_CLIENT, fun->handle, 0,
     694        async_forward_fast(iid, dev->drv->phone, DRIVER_CLIENT, fun->handle, 0,
    687695            IPC_FF_NONE);
    688         async_exchange_end(exch);
    689        
    690         log_msg(LVL_DEBUG,
     696        log_msg(LVL_DEBUG,
    691697            "Forwarding devmapper request for `%s' function to driver `%s'.",
    692698            fun->pathname, dev->drv->name);
     
    694700
    695701/** Function for handling connections to device manager. */
    696 static void devman_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg)
     702static void devman_connection(ipc_callid_t iid, ipc_call_t *icall)
    697703{
    698704        /* Select interface. */
     
    780786
    781787        printf(NAME ": Accepting connections.\n");
    782         task_retval(0);
    783788        async_manager();
    784789
Note: See TracChangeset for help on using the changeset viewer.