Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/drv/generic/remote_usb.c

    r56bdd9a4 r95120c3  
    11/*
    22 * Copyright (c) 2010 Vojtech Horky
    3  * Copyright (c) 2011 Jan Vesely
    43 * All rights reserved.
    54 *
     
    3837
    3938#include "usb_iface.h"
    40 #include "ddf/driver.h"
    41 
    42 typedef enum {
    43         IPC_M_USB_GET_MY_ADDRESS,
    44         IPC_M_USB_GET_MY_INTERFACE,
    45         IPC_M_USB_GET_HOST_CONTROLLER_HANDLE,
    46 } usb_iface_funcs_t;
    47 
    48 /** Tell USB address assigned to device.
    49  * @param exch Vaid IPC exchange
    50  * @param address Pointer to address storage place.
    51  * @return Error code.
    52  *
    53  * Exch param is an open communication to device implementing usb_iface.
    54  */
    55 int usb_get_my_address(async_exch_t *exch, usb_address_t *address)
    56 {
    57         if (!exch)
    58                 return EINVAL;
    59         sysarg_t addr;
    60         const int ret = async_req_1_1(exch, DEV_IFACE_ID(USB_DEV_IFACE),
    61             IPC_M_USB_GET_MY_ADDRESS, &addr);
    62 
    63         if (ret == EOK && address != NULL)
    64                 *address = (usb_address_t) addr;
    65         return ret;
    66 }
    67 /*----------------------------------------------------------------------------*/
    68 /** Tell interface number given device can use.
    69  * @param[in] exch IPC communication exchange
    70  * @param[in] handle Id of the device
    71  * @param[out] usb_iface Assigned USB interface
    72  * @return Error code.
    73  */
    74 int usb_get_my_interface(async_exch_t *exch, int *usb_iface)
    75 {
    76         if (!exch)
    77                 return EINVAL;
    78         sysarg_t iface_no;
    79         const int ret = async_req_1_1(exch, DEV_IFACE_ID(USB_DEV_IFACE),
    80             IPC_M_USB_GET_MY_INTERFACE, &iface_no);
    81         if (ret == EOK && usb_iface)
    82                 *usb_iface = (int)iface_no;
    83         return ret;
    84 }
    85 /*----------------------------------------------------------------------------*/
    86 /** Tell devman handle of device host controller.
    87  * @param[in] exch IPC communication exchange
    88  * @param[out] hc_handle devman handle of the HC used by the target device.
    89  * @return Error code.
    90  */
    91 int usb_get_hc_handle(async_exch_t *exch, devman_handle_t *hc_handle)
    92 {
    93         if (!exch)
    94                 return EINVAL;
    95         devman_handle_t h;
    96         const int ret = async_req_1_1(exch, DEV_IFACE_ID(USB_DEV_IFACE),
    97             IPC_M_USB_GET_HOST_CONTROLLER_HANDLE, &h);
    98         if (ret == EOK && hc_handle)
    99                 *hc_handle = (devman_handle_t)h;
    100         return ret;
    101 }
     39#include "driver.h"
    10240
    10341
    104 static void remote_usb_get_my_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
    105 static void remote_usb_get_my_interface(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
    106 static void remote_usb_get_hc_handle(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
     42static void remote_usb_get_address(device_t *, void *, ipc_callid_t, ipc_call_t *);
     43static void remote_usb_get_interface(device_t *, void *, ipc_callid_t, ipc_call_t *);
     44static void remote_usb_get_hc_handle(device_t *, void *, ipc_callid_t, ipc_call_t *);
     45//static void remote_usb(device_t *, void *, ipc_callid_t, ipc_call_t *);
    10746
    10847/** Remote USB interface operations. */
    10948static remote_iface_func_ptr_t remote_usb_iface_ops [] = {
    110         [IPC_M_USB_GET_MY_ADDRESS] = remote_usb_get_my_address,
    111         [IPC_M_USB_GET_MY_INTERFACE] = remote_usb_get_my_interface,
    112         [IPC_M_USB_GET_HOST_CONTROLLER_HANDLE] = remote_usb_get_hc_handle,
     49        remote_usb_get_address,
     50        remote_usb_get_interface,
     51        remote_usb_get_hc_handle
    11352};
    11453
     
    12160};
    12261
    123 /*----------------------------------------------------------------------------*/
    124 void remote_usb_get_my_address(ddf_fun_t *fun, void *iface,
     62
     63void remote_usb_get_address(device_t *device, void *iface,
    12564    ipc_callid_t callid, ipc_call_t *call)
    12665{
    127         const usb_iface_t *usb_iface = (usb_iface_t *) iface;
     66        usb_iface_t *usb_iface = (usb_iface_t *) iface;
    12867
    129         if (usb_iface->get_my_address == NULL) {
     68        if (usb_iface->get_address == NULL) {
    13069                async_answer_0(callid, ENOTSUP);
    13170                return;
    13271        }
    13372
     73        devman_handle_t handle = DEV_IPC_GET_ARG1(*call);
     74
    13475        usb_address_t address;
    135         const int ret = usb_iface->get_my_address(fun, &address);
    136         if (ret != EOK) {
    137                 async_answer_0(callid, ret);
     76        int rc = usb_iface->get_address(device, handle, &address);
     77        if (rc != EOK) {
     78                async_answer_0(callid, rc);
    13879        } else {
    13980                async_answer_1(callid, EOK, address);
    14081        }
    14182}
    142 /*----------------------------------------------------------------------------*/
    143 void remote_usb_get_my_interface(ddf_fun_t *fun, void *iface,
     83
     84void remote_usb_get_interface(device_t *device, void *iface,
    14485    ipc_callid_t callid, ipc_call_t *call)
    14586{
    146         const usb_iface_t *usb_iface = (usb_iface_t *) iface;
     87        usb_iface_t *usb_iface = (usb_iface_t *) iface;
    14788
    148         if (usb_iface->get_my_interface == NULL) {
     89        if (usb_iface->get_interface == NULL) {
    14990                async_answer_0(callid, ENOTSUP);
    15091                return;
    15192        }
    15293
     94        devman_handle_t handle = DEV_IPC_GET_ARG1(*call);
     95
    15396        int iface_no;
    154         const int ret = usb_iface->get_my_interface(fun, &iface_no);
    155         if (ret != EOK) {
    156                 async_answer_0(callid, ret);
     97        int rc = usb_iface->get_interface(device, handle, &iface_no);
     98        if (rc != EOK) {
     99                async_answer_0(callid, rc);
    157100        } else {
    158101                async_answer_1(callid, EOK, iface_no);
    159102        }
    160103}
    161 /*----------------------------------------------------------------------------*/
    162 void remote_usb_get_hc_handle(ddf_fun_t *fun, void *iface,
     104
     105void remote_usb_get_hc_handle(device_t *device, void *iface,
    163106    ipc_callid_t callid, ipc_call_t *call)
    164107{
    165         const usb_iface_t *usb_iface = (usb_iface_t *) iface;
     108        usb_iface_t *usb_iface = (usb_iface_t *) iface;
    166109
    167110        if (usb_iface->get_hc_handle == NULL) {
     
    171114
    172115        devman_handle_t handle;
    173         const int ret = usb_iface->get_hc_handle(fun, &handle);
    174         if (ret != EOK) {
    175                 async_answer_0(callid, ret);
     116        int rc = usb_iface->get_hc_handle(device, &handle);
     117        if (rc != EOK) {
     118                async_answer_0(callid, rc);
    176119        }
    177120
    178121        async_answer_1(callid, EOK, (sysarg_t) handle);
    179122}
     123
     124
     125
    180126/**
    181127 * @}
Note: See TracChangeset for help on using the changeset viewer.