Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/devman.c

    re72fb34 r692c40cb  
    2828 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2929 */
    30 
    31 /** @addtogroup libc
     30 
     31 /** @addtogroup libc
    3232 * @{
    3333 */
     
    3737#include <str.h>
    3838#include <stdio.h>
     39#include <ipc/ipc.h>
    3940#include <ipc/services.h>
    4041#include <ipc/devman.h>
    4142#include <devman.h>
    4243#include <async.h>
    43 #include <fibril_synch.h>
    4444#include <errno.h>
    4545#include <malloc.h>
     
    5050static int devman_phone_client = -1;
    5151
    52 static FIBRIL_MUTEX_INITIALIZE(devman_phone_mutex);
    53 
    5452int devman_get_phone(devman_interface_t iface, unsigned int flags)
    5553{
    5654        switch (iface) {
    5755        case DEVMAN_DRIVER:
    58                 fibril_mutex_lock(&devman_phone_mutex);
    59                 if (devman_phone_driver >= 0) {
    60                         fibril_mutex_unlock(&devman_phone_mutex);
     56                if (devman_phone_driver >= 0)
    6157                        return devman_phone_driver;
    62                 }
    6358               
    6459                if (flags & IPC_FLAG_BLOCKING)
    65                         devman_phone_driver = async_connect_me_to_blocking(
    66                             PHONE_NS, SERVICE_DEVMAN, DEVMAN_DRIVER, 0);
     60                        devman_phone_driver = ipc_connect_me_to_blocking(PHONE_NS,
     61                            SERVICE_DEVMAN, DEVMAN_DRIVER, 0);
    6762                else
    68                         devman_phone_driver = async_connect_me_to(PHONE_NS,
     63                        devman_phone_driver = ipc_connect_me_to(PHONE_NS,
    6964                            SERVICE_DEVMAN, DEVMAN_DRIVER, 0);
    7065               
    71                 fibril_mutex_unlock(&devman_phone_mutex);
    7266                return devman_phone_driver;
    7367        case DEVMAN_CLIENT:
    74                 fibril_mutex_lock(&devman_phone_mutex);
    75                 if (devman_phone_client >= 0) {
    76                         fibril_mutex_unlock(&devman_phone_mutex);
     68                if (devman_phone_client >= 0)
    7769                        return devman_phone_client;
    78                 }
    79                
    80                 if (flags & IPC_FLAG_BLOCKING) {
    81                         devman_phone_client = async_connect_me_to_blocking(
    82                             PHONE_NS, SERVICE_DEVMAN, DEVMAN_CLIENT, 0);
    83                 } else {
    84                         devman_phone_client = async_connect_me_to(PHONE_NS,
     70               
     71                if (flags & IPC_FLAG_BLOCKING)
     72                        devman_phone_client = ipc_connect_me_to_blocking(PHONE_NS,
    8573                            SERVICE_DEVMAN, DEVMAN_CLIENT, 0);
    86                 }
    87                
    88                 fibril_mutex_unlock(&devman_phone_mutex);
     74                else
     75                        devman_phone_client = ipc_connect_me_to(PHONE_NS,
     76                            SERVICE_DEVMAN, DEVMAN_CLIENT, 0);
     77               
    8978                return devman_phone_client;
    9079        default:
     
    10695        aid_t req = async_send_2(phone, DEVMAN_DRIVER_REGISTER, 0, 0, &answer);
    10796       
    108         sysarg_t retval = async_data_write_start(phone, name, str_size(name));
     97        ipcarg_t retval = async_data_write_start(phone, name, str_size(name));
    10998        if (retval != EOK) {
    11099                async_wait_for(req, NULL);
     
    115104        async_set_client_connection(conn);
    116105       
    117         async_connect_to_me(phone, 0, 0, 0, NULL);
     106        ipcarg_t callback_phonehash;
     107        ipc_connect_to_me(phone, 0, 0, 0, &callback_phonehash);
    118108        async_wait_for(req, &retval);
    119109       
     
    123113}
    124114
    125 static int devman_send_match_id(int phone, match_id_t *match_id)
    126 {
    127         ipc_call_t answer;
    128 
    129         aid_t req = async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score,
    130             &answer);
    131         int retval = async_data_write_start(phone, match_id->id,
    132             str_size(match_id->id));
    133 
    134         async_wait_for(req, NULL);
    135         return retval;
    136 }
    137 
    138 
    139 static int devman_send_match_ids(int phone, match_id_list_t *match_ids)
     115static int devman_send_match_id(int phone, match_id_t *match_id) \
     116{
     117        ipc_call_t answer;
     118        async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, &answer);
     119        int retval = async_data_write_start(phone, match_id->id, str_size(match_id->id));
     120        return retval; 
     121}
     122
     123
     124static int devman_send_match_ids(int phone, match_id_list_t *match_ids)
    140125{
    141126        link_t *link = match_ids->ids.next;
    142127        match_id_t *match_id = NULL;
    143128        int ret = EOK;
    144 
     129       
    145130        while (link != &match_ids->ids) {
    146131                match_id = list_get_instance(link, match_id_t, link);
    147                 ret = devman_send_match_id(phone, match_id);
    148                 if (ret != EOK) {
    149                         return ret;
    150                 }
    151 
     132                if (EOK != (ret = devman_send_match_id(phone, match_id)))
     133                {
     134                        printf("Driver failed to send match id, error number = %d\n", ret);
     135                        return ret;                     
     136                }
    152137                link = link->next;
    153138        }
    154 
    155         return ret;
    156 }
    157 
    158 /** Add function to a device.
    159  *
    160  * Request devman to add a new function to the specified device owned by
    161  * this driver task.
    162  *
    163  * @param name          Name of the new function
    164  * @param ftype         Function type, fun_inner or fun_exposed
    165  * @param match_ids     Match IDs (should be empty for fun_exposed)
    166  * @param devh          Devman handle of the device
    167  * @param funh          Place to store handle of the new function
    168  *
    169  * @return              EOK on success or negative error code.
    170  */
    171 int devman_add_function(const char *name, fun_type_t ftype,
    172     match_id_list_t *match_ids, devman_handle_t devh, devman_handle_t *funh)
    173 {
     139        return ret;     
     140}
     141
     142int devman_child_device_register(
     143        const char *name, match_id_list_t *match_ids, device_handle_t parent_handle, device_handle_t *handle)
     144{               
    174145        int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING);
    175         int fun_handle;
    176        
    177         if (phone < 0)
    178                 return phone;
    179        
    180         async_serialize_start();
    181        
    182         int match_count = list_count(&match_ids->ids);
    183         ipc_call_t answer;
    184 
    185         aid_t req = async_send_3(phone, DEVMAN_ADD_FUNCTION, (sysarg_t) ftype,
    186             devh, match_count, &answer);
    187 
    188         sysarg_t retval = async_data_write_start(phone, name, str_size(name));
    189         if (retval != EOK) {
    190                 async_wait_for(req, NULL);
    191                 async_serialize_end();
    192                 return retval;
    193         }
    194        
    195         int match_ids_rc = devman_send_match_ids(phone, match_ids);
    196        
    197         async_wait_for(req, &retval);
    198        
    199         async_serialize_end();
    200        
    201         /* Prefer the answer to DEVMAN_ADD_FUNCTION in case of errors. */
    202         if ((match_ids_rc != EOK) && (retval == EOK)) {
    203                 retval = match_ids_rc;
    204         }
    205 
    206         if (retval == EOK)
    207                 fun_handle = (int) IPC_GET_ARG1(answer);
    208         else
    209                 fun_handle = -1;
    210        
    211         *funh = fun_handle;
    212 
     146       
     147        if (phone < 0)
     148                return phone;
     149       
     150        async_serialize_start();
     151       
     152        int match_count = list_count(&match_ids->ids); 
     153        ipc_call_t answer;
     154        aid_t req = async_send_2(phone, DEVMAN_ADD_CHILD_DEVICE, parent_handle, match_count, &answer);
     155
     156        ipcarg_t retval = async_data_write_start(phone, name, str_size(name));
     157        if (retval != EOK) {
     158                async_wait_for(req, NULL);
     159                async_serialize_end();
     160                return retval;
     161        }
     162       
     163        devman_send_match_ids(phone, match_ids);
     164       
     165        async_wait_for(req, &retval);
     166       
     167        async_serialize_end();
     168       
     169        if (retval != EOK) {
     170                if (handle != NULL) {
     171                        *handle = -1;
     172                }
     173                return retval;
     174        }       
     175       
     176        if (handle != NULL)
     177                *handle = (int) IPC_GET_ARG1(answer);   
     178               
    213179        return retval;
    214180}
    215181
    216 int devman_add_device_to_class(devman_handle_t devman_handle,
    217     const char *class_name)
     182int devman_add_device_to_class(device_handle_t dev_handle, const char *class_name)
    218183{
    219184        int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING);
     
    224189        async_serialize_start();
    225190        ipc_call_t answer;
    226         aid_t req = async_send_1(phone, DEVMAN_ADD_DEVICE_TO_CLASS,
    227             devman_handle, &answer);
    228        
    229         sysarg_t retval = async_data_write_start(phone, class_name,
    230             str_size(class_name));
    231         if (retval != EOK) {
    232                 async_wait_for(req, NULL);
    233                 async_serialize_end();
    234                 return retval;
    235         }
    236        
    237         async_wait_for(req, &retval);
    238         async_serialize_end();
    239        
    240         return retval;
     191        aid_t req = async_send_1(phone, DEVMAN_ADD_DEVICE_TO_CLASS, dev_handle, &answer);
     192       
     193        ipcarg_t retval = async_data_write_start(phone, class_name, str_size(class_name));
     194        if (retval != EOK) {
     195                async_wait_for(req, NULL);
     196                async_serialize_end();
     197                return retval;
     198        }
     199       
     200        async_wait_for(req, &retval);
     201        async_serialize_end();
     202       
     203        return retval; 
    241204}
    242205
     
    246209        case DEVMAN_DRIVER:
    247210                if (devman_phone_driver >= 0) {
    248                         async_hangup(devman_phone_driver);
     211                        ipc_hangup(devman_phone_driver);
    249212                        devman_phone_driver = -1;
    250213                }
     
    252215        case DEVMAN_CLIENT:
    253216                if (devman_phone_client >= 0) {
    254                         async_hangup(devman_phone_client);
     217                        ipc_hangup(devman_phone_client);
    255218                        devman_phone_client = -1;
    256219                }
     
    261224}
    262225
    263 int devman_device_connect(devman_handle_t handle, unsigned int flags)
     226int devman_device_connect(device_handle_t handle, unsigned int flags)
    264227{
    265228        int phone;
    266229       
    267230        if (flags & IPC_FLAG_BLOCKING) {
    268                 phone = async_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN,
     231                phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN,
    269232                    DEVMAN_CONNECT_TO_DEVICE, handle);
    270233        } else {
    271                 phone = async_connect_me_to(PHONE_NS, SERVICE_DEVMAN,
     234                phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAN,
    272235                    DEVMAN_CONNECT_TO_DEVICE, handle);
    273236        }
     
    276239}
    277240
    278 int devman_parent_device_connect(devman_handle_t handle, unsigned int flags)
     241int devman_parent_device_connect(device_handle_t handle, unsigned int flags)
    279242{
    280243        int phone;
    281244       
    282245        if (flags & IPC_FLAG_BLOCKING) {
    283                 phone = async_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN,
     246                phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN,
    284247                    DEVMAN_CONNECT_TO_PARENTS_DEVICE, handle);
    285248        } else {
    286                 phone = async_connect_me_to(PHONE_NS, SERVICE_DEVMAN,
     249                phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAN,
    287250                    DEVMAN_CONNECT_TO_PARENTS_DEVICE, handle);
    288251        }
     
    291254}
    292255
    293 int devman_device_get_handle(const char *pathname, devman_handle_t *handle,
    294     unsigned int flags)
     256int devman_device_get_handle(const char *pathname, device_handle_t *handle, unsigned int flags)
    295257{
    296258        int phone = devman_get_phone(DEVMAN_CLIENT, flags);
     
    305267            &answer);
    306268       
    307         sysarg_t retval = async_data_write_start(phone, pathname,
    308             str_size(pathname));
     269        ipcarg_t retval = async_data_write_start(phone, pathname, str_size(pathname));
    309270        if (retval != EOK) {
    310271                async_wait_for(req, NULL);
     
    319280        if (retval != EOK) {
    320281                if (handle != NULL)
    321                         *handle = (devman_handle_t) -1;
     282                        *handle = (device_handle_t) -1;
    322283                return retval;
    323284        }
    324285       
    325286        if (handle != NULL)
    326                 *handle = (devman_handle_t) IPC_GET_ARG1(answer);
     287                *handle = (device_handle_t) IPC_GET_ARG1(answer);
    327288       
    328289        return retval;
    329290}
    330291
    331 int devman_device_get_handle_by_class(const char *classname,
    332     const char *devname, devman_handle_t *handle, unsigned int flags)
    333 {
    334         int phone = devman_get_phone(DEVMAN_CLIENT, flags);
    335 
    336         if (phone < 0)
    337                 return phone;
    338 
    339         async_serialize_start();
    340 
    341         ipc_call_t answer;
    342         aid_t req = async_send_1(phone, DEVMAN_DEVICE_GET_HANDLE_BY_CLASS,
    343             flags, &answer);
    344 
    345         sysarg_t retval = async_data_write_start(phone, classname,
    346             str_size(classname));
    347         if (retval != EOK) {
    348                 async_wait_for(req, NULL);
    349                 async_serialize_end();
    350                 return retval;
    351         }
    352         retval = async_data_write_start(phone, devname,
    353             str_size(devname));
    354         if (retval != EOK) {
    355                 async_wait_for(req, NULL);
    356                 async_serialize_end();
    357                 return retval;
    358         }
    359 
    360         async_wait_for(req, &retval);
    361 
    362         async_serialize_end();
    363 
    364         if (retval != EOK) {
    365                 if (handle != NULL)
    366                         *handle = (devman_handle_t) -1;
    367                 return retval;
    368         }
    369 
    370         if (handle != NULL)
    371                 *handle = (devman_handle_t) IPC_GET_ARG1(answer);
    372 
    373         return retval;
    374 }
    375 
    376292
    377293/** @}
Note: See TracChangeset for help on using the changeset viewer.