Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usb/src/ddfiface.c

    r56bdd9a4 r79ae36dd  
    3636#include <devman.h>
    3737#include <async.h>
    38 #include <usb_iface.h>
    3938#include <usb/ddfiface.h>
    4039#include <usb/hc.h>
    4140#include <usb/debug.h>
    42 #include <usb/dev/hub.h>
    4341#include <errno.h>
    4442#include <assert.h>
    4543
    4644/** DDF interface for USB device, implementation for typical hub. */
    47 usb_iface_t usb_iface_hub_impl = {
    48         .get_hc_handle = usb_iface_get_hc_handle_device_impl,
    49         .get_my_address = usb_iface_get_my_address_forward_impl,
     45usb_iface_t  usb_iface_hub_impl = {
     46        .get_hc_handle = usb_iface_get_hc_handle_hub_impl,
     47        .get_address = usb_iface_get_address_hub_impl
    5048};
    5149
    5250/** DDF interface for USB device, implementation for child of a typical hub. */
    53 usb_iface_t usb_iface_hub_child_impl = {
    54         .get_hc_handle = usb_iface_get_hc_handle_device_impl,
    55         .get_my_address = usb_iface_get_my_address_from_device_data,
     51usb_iface_t  usb_iface_hub_child_impl = {
     52        .get_hc_handle = usb_iface_get_hc_handle_hub_child_impl,
     53        .get_address = usb_iface_get_address_hub_child_impl
    5654};
    5755
     
    6361 * @return Error code.
    6462 */
    65 int usb_iface_get_hc_handle_device_impl(ddf_fun_t *fun, devman_handle_t *handle)
     63int usb_iface_get_hc_handle_hub_impl(ddf_fun_t *fun, devman_handle_t *handle)
    6664{
    6765        assert(fun);
    6866        return usb_hc_find(fun->handle, handle);
     67}
     68
     69/** Get host controller handle, interface implementation for child of
     70 * a hub driver.
     71 *
     72 * @param[in] fun Device function the operation is running on.
     73 * @param[out] handle Storage for the host controller handle.
     74 * @return Error code.
     75 */
     76int usb_iface_get_hc_handle_hub_child_impl(ddf_fun_t *fun,
     77    devman_handle_t *handle)
     78{
     79        assert(fun != NULL);
     80       
     81        async_sess_t *parent_sess =
     82            devman_parent_device_connect(EXCHANGE_SERIALIZE, fun->handle,
     83            IPC_FLAG_BLOCKING);
     84        if (!parent_sess)
     85                return ENOMEM;
     86       
     87        async_exch_t *exch = async_exchange_begin(parent_sess);
     88       
     89        sysarg_t hc_handle;
     90        int rc = async_req_1_1(exch, DEV_IFACE_ID(USB_DEV_IFACE),
     91            IPC_M_USB_GET_HOST_CONTROLLER_HANDLE, &hc_handle);
     92       
     93        async_exchange_end(exch);
     94        async_hangup(parent_sess);
     95       
     96        if (rc != EOK)
     97                return rc;
     98       
     99        *handle = hc_handle;
     100        return EOK;
    69101}
    70102
     
    93125 * @return Error code.
    94126 */
    95 int usb_iface_get_my_address_forward_impl(ddf_fun_t *fun,
     127int usb_iface_get_address_hub_impl(ddf_fun_t *fun, devman_handle_t handle,
    96128    usb_address_t *address)
    97129{
    98130        assert(fun);
    99 
     131       
    100132        async_sess_t *parent_sess =
    101133            devman_parent_device_connect(EXCHANGE_SERIALIZE, fun->handle,
     
    103135        if (!parent_sess)
    104136                return ENOMEM;
    105 
     137       
    106138        async_exch_t *exch = async_exchange_begin(parent_sess);
    107         if (!exch) {
    108                 async_hangup(parent_sess);
    109                 return ENOMEM;
    110         }
    111 
    112         const int ret = usb_get_my_address(exch, address);
    113 
     139       
     140        sysarg_t addr;
     141        int rc = async_req_2_1(exch, DEV_IFACE_ID(USB_DEV_IFACE),
     142            IPC_M_USB_GET_ADDRESS, handle, &addr);
     143       
    114144        async_exchange_end(exch);
    115145        async_hangup(parent_sess);
    116 
    117         return ret;
     146       
     147        if (rc != EOK)
     148                return rc;
     149       
     150        if (address != NULL)
     151                *address = (usb_address_t) addr;
     152       
     153        return EOK;
    118154}
    119155
    120156/** Get USB device address, interface implementation for child of
    121157 * a hub driver.
    122  *
    123  * This implementation eccepts 0 as valid handle and replaces it with fun's
    124  * handle.
    125158 *
    126159 * @param[in] fun Device function the operation is running on.
     
    129162 * @return Error code.
    130163 */
    131 int usb_iface_get_my_address_from_device_data(ddf_fun_t *fun,
    132     usb_address_t *address)
     164int usb_iface_get_address_hub_child_impl(ddf_fun_t *fun,
     165    devman_handle_t handle, usb_address_t *address)
    133166{
    134         assert(fun);
    135         assert(fun->driver_data);
    136         usb_hub_attached_device_t *device = fun->driver_data;
    137         assert(device->fun == fun);
    138         if (address)
    139                 *address = device->address;
    140         return EOK;
     167        if (handle == 0) {
     168                handle = fun->handle;
     169        }
     170        return usb_iface_get_address_hub_impl(fun, handle, address);
    141171}
    142172
Note: See TracChangeset for help on using the changeset viewer.