Ignore:
File:
1 edited

Legend:

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

    r77ad86c r79ae36dd  
    3333 * Implementations of DDF interfaces functions (actual implementation).
    3434 */
    35 
     35#include <ipc/devman.h>
    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
    46 #include <usb/dev.h>
    47 
    4844/** DDF interface for USB device, implementation for typical hub. */
    49 usb_iface_t usb_iface_hub_impl = {
    50         .get_hc_handle = usb_iface_get_hc_handle_device_impl,
    51         .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
    5248};
    5349
    5450/** DDF interface for USB device, implementation for child of a typical hub. */
    55 usb_iface_t usb_iface_hub_child_impl = {
    56         .get_hc_handle = usb_iface_get_hc_handle_device_impl,
    57         .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
    5854};
    5955
     
    6561 * @return Error code.
    6662 */
    67 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)
    6864{
    6965        assert(fun);
    70         return usb_get_hc_by_handle(fun->handle, handle);
     66        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;
    71101}
    72102
     
    95125 * @return Error code.
    96126 */
    97 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,
    98128    usb_address_t *address)
    99129{
    100130        assert(fun);
    101         return usb_get_address_by_handle(fun->handle, address);
     131       
     132        async_sess_t *parent_sess =
     133            devman_parent_device_connect(EXCHANGE_SERIALIZE, fun->handle,
     134            IPC_FLAG_BLOCKING);
     135        if (!parent_sess)
     136                return ENOMEM;
     137       
     138        async_exch_t *exch = async_exchange_begin(parent_sess);
     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       
     144        async_exchange_end(exch);
     145        async_hangup(parent_sess);
     146       
     147        if (rc != EOK)
     148                return rc;
     149       
     150        if (address != NULL)
     151                *address = (usb_address_t) addr;
     152       
     153        return EOK;
    102154}
    103155
    104156/** Get USB device address, interface implementation for child of
    105157 * a hub driver.
    106  *
    107  * This implementation eccepts 0 as valid handle and replaces it with fun's
    108  * handle.
    109158 *
    110159 * @param[in] fun Device function the operation is running on.
     
    113162 * @return Error code.
    114163 */
    115 int usb_iface_get_my_address_from_device_data(ddf_fun_t *fun,
    116     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)
    117166{
    118         assert(fun);
    119         assert(fun->driver_data);
    120         const usb_hub_attached_device_t *device = fun->driver_data;
    121         assert(device->fun == fun);
    122         if (address)
    123                 *address = device->address;
    124         return EOK;
     167        if (handle == 0) {
     168                handle = fun->handle;
     169        }
     170        return usb_iface_get_address_hub_impl(fun, handle, address);
    125171}
    126172
Note: See TracChangeset for help on using the changeset viewer.