Ignore:
File:
1 edited

Legend:

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

    r8b1e15ac r4db43721  
    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>
     
    115116        async_set_client_connection(conn);
    116117       
    117         async_connect_to_me(phone, 0, 0, 0, NULL);
     118        sysarg_t callback_phonehash;
     119        ipc_connect_to_me(phone, 0, 0, 0, &callback_phonehash);
    118120        async_wait_for(req, &retval);
    119121       
     
    123125}
    124126
    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 
     127static int devman_send_match_id(int phone, match_id_t *match_id) \
     128{
     129        ipc_call_t answer;
     130        aid_t req = async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, &answer);
     131        int retval = async_data_write_start(phone, match_id->id, str_size(match_id->id));
    134132        async_wait_for(req, NULL);
    135133        return retval;
     
    137135
    138136
    139 static int devman_send_match_ids(int phone, match_id_list_t *match_ids)
     137static int devman_send_match_ids(int phone, match_id_list_t *match_ids) 
    140138{
    141139        link_t *link = match_ids->ids.next;
    142140        match_id_t *match_id = NULL;
    143141        int ret = EOK;
    144 
     142       
    145143        while (link != &match_ids->ids) {
    146144                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 
     145                if (EOK != (ret = devman_send_match_id(phone, match_id)))
     146                {
     147                        printf("Driver failed to send match id, error number = %d\n", ret);
     148                        return ret;                     
     149                }
    154150                link = link->next;
    155151        }
    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 {
     152        return ret;     
     153}
     154
     155int devman_child_device_register(
     156        const char *name, match_id_list_t *match_ids, devman_handle_t parent_handle, devman_handle_t *handle)
     157{               
    176158        int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING);
    177         int fun_handle;
    178159       
    179160        if (phone < 0)
     
    182163        async_serialize_start();
    183164       
    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);
     165        int match_count = list_count(&match_ids->ids); 
     166        ipc_call_t answer;
     167        aid_t req = async_send_2(phone, DEVMAN_ADD_CHILD_DEVICE, parent_handle, match_count, &answer);
    189168
    190169        sysarg_t retval = async_data_write_start(phone, name, str_size(name));
     
    201180        async_serialize_end();
    202181       
    203         if (retval == EOK)
    204                 fun_handle = (int) IPC_GET_ARG1(answer);
    205         else
    206                 fun_handle = -1;
    207        
    208         *funh = fun_handle;
    209 
     182        if (retval != EOK) {
     183                if (handle != NULL) {
     184                        *handle = -1;
     185                }
     186                return retval;
     187        }       
     188       
     189        if (handle != NULL)
     190                *handle = (int) IPC_GET_ARG1(answer);   
     191               
    210192        return retval;
    211193}
    212194
    213 int devman_add_device_to_class(devman_handle_t devman_handle,
    214     const char *class_name)
     195int devman_add_device_to_class(devman_handle_t devman_handle, const char *class_name)
    215196{
    216197        int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING);
     
    221202        async_serialize_start();
    222203        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));
     204        aid_t req = async_send_1(phone, DEVMAN_ADD_DEVICE_TO_CLASS, devman_handle, &answer);
     205       
     206        sysarg_t retval = async_data_write_start(phone, class_name, str_size(class_name));
    228207        if (retval != EOK) {
    229208                async_wait_for(req, NULL);
     
    235214        async_serialize_end();
    236215       
    237         return retval;
     216        return retval; 
    238217}
    239218
     
    243222        case DEVMAN_DRIVER:
    244223                if (devman_phone_driver >= 0) {
    245                         async_hangup(devman_phone_driver);
     224                        ipc_hangup(devman_phone_driver);
    246225                        devman_phone_driver = -1;
    247226                }
     
    249228        case DEVMAN_CLIENT:
    250229                if (devman_phone_client >= 0) {
    251                         async_hangup(devman_phone_client);
     230                        ipc_hangup(devman_phone_client);
    252231                        devman_phone_client = -1;
    253232                }
     
    288267}
    289268
    290 int devman_device_get_handle(const char *pathname, devman_handle_t *handle,
    291     unsigned int flags)
     269int devman_device_get_handle(const char *pathname, devman_handle_t *handle, unsigned int flags)
    292270{
    293271        int phone = devman_get_phone(DEVMAN_CLIENT, flags);
     
    302280            &answer);
    303281       
    304         sysarg_t retval = async_data_write_start(phone, pathname,
    305             str_size(pathname));
     282        sysarg_t retval = async_data_write_start(phone, pathname, str_size(pathname));
    306283        if (retval != EOK) {
    307284                async_wait_for(req, NULL);
Note: See TracChangeset for help on using the changeset viewer.