Ignore:
File:
1 edited

Legend:

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

    r8b1e15ac r96b02eb9  
    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:
     
    115104        async_set_client_connection(conn);
    116105       
    117         async_connect_to_me(phone, 0, 0, 0, NULL);
    118         async_wait_for(req, &retval);
    119        
    120         async_serialize_end();
    121        
    122         return retval;
    123 }
    124 
    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 
     106        sysarg_t callback_phonehash;
     107        ipc_connect_to_me(phone, 0, 0, 0, &callback_phonehash);
     108        async_wait_for(req, &retval);
     109       
     110        async_serialize_end();
     111       
     112        return retval;
     113}
     114
     115static int devman_send_match_id(int phone, match_id_t *match_id) \
     116{
     117        ipc_call_t answer;
     118        aid_t req = 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));
    134120        async_wait_for(req, NULL);
    135121        return retval;
     
    137123
    138124
    139 static int devman_send_match_ids(int phone, match_id_list_t *match_ids)
     125static int devman_send_match_ids(int phone, match_id_list_t *match_ids) 
    140126{
    141127        link_t *link = match_ids->ids.next;
    142128        match_id_t *match_id = NULL;
    143129        int ret = EOK;
    144 
     130       
    145131        while (link != &match_ids->ids) {
    146132                match_id = list_get_instance(link, match_id_t, link);
    147                 ret = devman_send_match_id(phone, match_id);
    148                 if (ret != EOK) {
    149                         printf("Driver failed to send match id, error %d\n",
    150                             ret);
    151                         return ret;
    152                 }
    153 
     133                if (EOK != (ret = devman_send_match_id(phone, match_id)))
     134                {
     135                        printf("Driver failed to send match id, error number = %d\n", ret);
     136                        return ret;                     
     137                }
    154138                link = link->next;
    155139        }
    156 
    157         return ret;
    158 }
    159 
    160 /** Add function to a device.
    161  *
    162  * Request devman to add a new function to the specified device owned by
    163  * this driver task.
    164  *
    165  * @param name          Name of the new function
    166  * @param ftype         Function type, fun_inner or fun_exposed
    167  * @param match_ids     Match IDs (should be empty for fun_exposed)
    168  * @param devh          Devman handle of the device
    169  * @param funh          Place to store handle of the new function
    170  *
    171  * @return              EOK on success or negative error code.
    172  */
    173 int devman_add_function(const char *name, fun_type_t ftype,
    174     match_id_list_t *match_ids, devman_handle_t devh, devman_handle_t *funh)
    175 {
     140        return ret;     
     141}
     142
     143int devman_child_device_register(
     144        const char *name, match_id_list_t *match_ids, devman_handle_t parent_handle, devman_handle_t *handle)
     145{               
    176146        int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING);
    177         int fun_handle;
    178        
    179         if (phone < 0)
    180                 return phone;
    181        
    182         async_serialize_start();
    183        
    184         int match_count = list_count(&match_ids->ids);
    185         ipc_call_t answer;
    186 
    187         aid_t req = async_send_3(phone, DEVMAN_ADD_FUNCTION, (sysarg_t) ftype,
    188             devh, match_count, &answer);
     147       
     148        if (phone < 0)
     149                return phone;
     150       
     151        async_serialize_start();
     152       
     153        int match_count = list_count(&match_ids->ids); 
     154        ipc_call_t answer;
     155        aid_t req = async_send_2(phone, DEVMAN_ADD_CHILD_DEVICE, parent_handle, match_count, &answer);
    189156
    190157        sysarg_t retval = async_data_write_start(phone, name, str_size(name));
     
    201168        async_serialize_end();
    202169       
    203         if (retval == EOK)
    204                 fun_handle = (int) IPC_GET_ARG1(answer);
    205         else
    206                 fun_handle = -1;
    207        
    208         *funh = fun_handle;
    209 
    210         return retval;
    211 }
    212 
    213 int devman_add_device_to_class(devman_handle_t devman_handle,
    214     const char *class_name)
     170        if (retval != EOK) {
     171                if (handle != NULL) {
     172                        *handle = -1;
     173                }
     174                return retval;
     175        }       
     176       
     177        if (handle != NULL)
     178                *handle = (int) IPC_GET_ARG1(answer);   
     179               
     180        return retval;
     181}
     182
     183int devman_add_device_to_class(devman_handle_t devman_handle, const char *class_name)
    215184{
    216185        int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING);
     
    221190        async_serialize_start();
    222191        ipc_call_t answer;
    223         aid_t req = async_send_1(phone, DEVMAN_ADD_DEVICE_TO_CLASS,
    224             devman_handle, &answer);
    225        
    226         sysarg_t retval = async_data_write_start(phone, class_name,
    227             str_size(class_name));
    228         if (retval != EOK) {
    229                 async_wait_for(req, NULL);
    230                 async_serialize_end();
    231                 return retval;
    232         }
    233        
    234         async_wait_for(req, &retval);
    235         async_serialize_end();
    236        
    237         return retval;
     192        aid_t req = async_send_1(phone, DEVMAN_ADD_DEVICE_TO_CLASS, devman_handle, &answer);
     193       
     194        sysarg_t retval = async_data_write_start(phone, class_name, str_size(class_name));
     195        if (retval != EOK) {
     196                async_wait_for(req, NULL);
     197                async_serialize_end();
     198                return retval;
     199        }
     200       
     201        async_wait_for(req, &retval);
     202        async_serialize_end();
     203       
     204        return retval; 
    238205}
    239206
     
    243210        case DEVMAN_DRIVER:
    244211                if (devman_phone_driver >= 0) {
    245                         async_hangup(devman_phone_driver);
     212                        ipc_hangup(devman_phone_driver);
    246213                        devman_phone_driver = -1;
    247214                }
     
    249216        case DEVMAN_CLIENT:
    250217                if (devman_phone_client >= 0) {
    251                         async_hangup(devman_phone_client);
     218                        ipc_hangup(devman_phone_client);
    252219                        devman_phone_client = -1;
    253220                }
     
    263230       
    264231        if (flags & IPC_FLAG_BLOCKING) {
    265                 phone = async_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN,
     232                phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN,
    266233                    DEVMAN_CONNECT_TO_DEVICE, handle);
    267234        } else {
    268                 phone = async_connect_me_to(PHONE_NS, SERVICE_DEVMAN,
     235                phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAN,
    269236                    DEVMAN_CONNECT_TO_DEVICE, handle);
    270237        }
     
    278245       
    279246        if (flags & IPC_FLAG_BLOCKING) {
    280                 phone = async_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN,
     247                phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAN,
    281248                    DEVMAN_CONNECT_TO_PARENTS_DEVICE, handle);
    282249        } else {
    283                 phone = async_connect_me_to(PHONE_NS, SERVICE_DEVMAN,
     250                phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAN,
    284251                    DEVMAN_CONNECT_TO_PARENTS_DEVICE, handle);
    285252        }
     
    288255}
    289256
    290 int devman_device_get_handle(const char *pathname, devman_handle_t *handle,
    291     unsigned int flags)
     257int devman_device_get_handle(const char *pathname, devman_handle_t *handle, unsigned int flags)
    292258{
    293259        int phone = devman_get_phone(DEVMAN_CLIENT, flags);
     
    302268            &answer);
    303269       
    304         sysarg_t retval = async_data_write_start(phone, pathname,
    305             str_size(pathname));
     270        sysarg_t retval = async_data_write_start(phone, pathname, str_size(pathname));
    306271        if (retval != EOK) {
    307272                async_wait_for(req, NULL);
Note: See TracChangeset for help on using the changeset viewer.