Changeset 00aece0 in mainline for uspace/lib/usb/src/ddfiface.c


Ignore:
Timestamp:
2012-02-18T16:47:38Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4449c6c
Parents:
bd5f3b7 (diff), f943dd3 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

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

    rbd5f3b7 r00aece0  
    3636#include <devman.h>
    3737#include <async.h>
     38#include <usb_iface.h>
    3839#include <usb/ddfiface.h>
    3940#include <usb/hc.h>
    4041#include <usb/debug.h>
     42#include <usb/dev/hub.h>
    4143#include <errno.h>
    4244#include <assert.h>
    4345
     46#include <usb/dev.h>
     47
    4448/** DDF interface for USB device, implementation for typical hub. */
    45 usb_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
     49usb_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,
    4852};
    4953
    5054/** DDF interface for USB device, implementation for child of a typical hub. */
    51 usb_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
     55usb_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,
    5458};
    5559
     
    6165 * @return Error code.
    6266 */
    63 int usb_iface_get_hc_handle_hub_impl(ddf_fun_t *fun, devman_handle_t *handle)
     67int usb_iface_get_hc_handle_device_impl(ddf_fun_t *fun, devman_handle_t *handle)
    6468{
    6569        assert(fun);
    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  */
    76 int 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;
     70        return usb_get_hc_by_handle(fun->handle, handle);
    10171}
    10272
     
    12595 * @return Error code.
    12696 */
    127 int usb_iface_get_address_hub_impl(ddf_fun_t *fun, devman_handle_t handle,
     97int usb_iface_get_my_address_forward_impl(ddf_fun_t *fun,
    12898    usb_address_t *address)
    12999{
    130100        assert(fun);
    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;
     101        return usb_get_address_by_handle(fun->handle, address);
    154102}
    155103
    156104/** Get USB device address, interface implementation for child of
    157105 * a hub driver.
     106 *
     107 * This implementation eccepts 0 as valid handle and replaces it with fun's
     108 * handle.
    158109 *
    159110 * @param[in] fun Device function the operation is running on.
     
    162113 * @return Error code.
    163114 */
    164 int usb_iface_get_address_hub_child_impl(ddf_fun_t *fun,
    165     devman_handle_t handle, usb_address_t *address)
     115int usb_iface_get_my_address_from_device_data(ddf_fun_t *fun,
     116    usb_address_t *address)
    166117{
    167         if (handle == 0) {
    168                 handle = fun->handle;
    169         }
    170         return usb_iface_get_address_hub_impl(fun, handle, address);
     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;
    171125}
    172126
Note: See TracChangeset for help on using the changeset viewer.