Ignore:
File:
1 edited

Legend:

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

    re882e3a r79ae36dd  
    3333 * Implementations of DDF interfaces functions (actual implementation).
    3434 */
     35#include <ipc/devman.h>
    3536#include <devman.h>
    3637#include <async.h>
    37 #include <usb_iface.h>
    3838#include <usb/ddfiface.h>
    3939#include <usb/hc.h>
    4040#include <usb/debug.h>
    41 #include <usb/dev/hub.h>
    4241#include <errno.h>
    4342#include <assert.h>
    4443
    45 #include <usb/dev.h>
    46 
    4744/** DDF interface for USB device, implementation for typical hub. */
    48 usb_iface_t usb_iface_hub_impl = {
    49         .get_hc_handle = usb_iface_get_hc_handle_device_impl,
    50         .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
    5148};
    5249
    5350/** DDF interface for USB device, implementation for child of a typical hub. */
    54 usb_iface_t usb_iface_hub_child_impl = {
    55         .get_hc_handle = usb_iface_get_hc_handle_device_impl,
    56         .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
    5754};
    5855
     
    6461 * @return Error code.
    6562 */
    66 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)
    6764{
    6865        assert(fun);
    69         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;
    70101}
    71102
     
    94125 * @return Error code.
    95126 */
    96 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,
    97128    usb_address_t *address)
    98129{
    99130        assert(fun);
    100         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;
    101154}
    102155
    103156/** Get USB device address, interface implementation for child of
    104157 * a hub driver.
    105  *
    106  * This implementation eccepts 0 as valid handle and replaces it with fun's
    107  * handle.
    108158 *
    109159 * @param[in] fun Device function the operation is running on.
     
    112162 * @return Error code.
    113163 */
    114 int usb_iface_get_my_address_from_device_data(ddf_fun_t *fun,
    115     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)
    116166{
    117         assert(fun);
    118         assert(fun->driver_data);
    119         const usb_hub_attached_device_t *device = fun->driver_data;
    120         assert(device->fun == fun);
    121         if (address)
    122                 *address = device->address;
    123         return EOK;
     167        if (handle == 0) {
     168                handle = fun->handle;
     169        }
     170        return usb_iface_get_address_hub_impl(fun, handle, address);
    124171}
    125172
Note: See TracChangeset for help on using the changeset viewer.