Ignore:
File:
1 edited

Legend:

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

    r97e660e r71ed4849  
    3535#include <usb/usbdrv.h>
    3636#include <usbhc_iface.h>
     37#include <usb_iface.h>
    3738#include <errno.h>
    3839#include <str_error.h>
     
    5455} transfer_info_t;
    5556
     57/** Find handle of host controller the device is physically attached to.
     58 *
     59 * @param[in] dev Device looking for its host controller.
     60 * @param[out] handle Host controller devman handle.
     61 * @return Error code.
     62 */
     63int usb_drv_find_hc(device_t *dev, devman_handle_t *handle)
     64{
     65        if (dev == NULL) {
     66                return EBADMEM;
     67        }
     68        if (handle == NULL) {
     69                return EBADMEM;
     70        }
     71
     72        int parent_phone = devman_parent_device_connect(dev->handle,
     73            IPC_FLAG_BLOCKING);
     74        if (parent_phone < 0) {
     75                return parent_phone;
     76        }
     77
     78        devman_handle_t h;
     79        int rc = async_req_1_1(parent_phone, DEV_IFACE_ID(USB_DEV_IFACE),
     80            IPC_M_USB_GET_HOST_CONTROLLER_HANDLE, &h);
     81
     82        ipc_hangup(parent_phone);
     83
     84        if (rc != EOK) {
     85                return rc;
     86        }
     87
     88        *handle = h;
     89
     90        return EOK;
     91}
     92
     93/** Connect to host controller the device is physically attached to.
     94 *
     95 * @param dev Device asking for connection.
     96 * @param hc_handle Devman handle of the host controller.
     97 * @param flags Connection flags (blocking connection).
     98 * @return Phone to the HC or error code.
     99 */
     100int usb_drv_hc_connect(device_t *dev, devman_handle_t hc_handle,
     101    unsigned int flags)
     102{
     103        return devman_device_connect(hc_handle, flags);
     104}
     105
    56106/** Connect to host controller the device is physically attached to.
    57107 *
     
    60110 * @return Phone to corresponding HC or error code.
    61111 */
    62 int usb_drv_hc_connect(device_t *dev, unsigned int flags)
    63 {
     112int usb_drv_hc_connect_auto(device_t *dev, unsigned int flags)
     113{
     114        int rc;
     115        devman_handle_t hc_handle;
     116
    64117        /*
    65118         * Call parent hub to obtain device handle of respective HC.
    66119         */
    67 
    68         /*
    69          * FIXME: currently we connect always to virtual host controller.
    70          */
    71         int rc;
    72         devman_handle_t handle;
    73 
    74         rc = devman_device_get_handle("/virt/usbhc", &handle, flags);
     120        rc = usb_drv_find_hc(dev, &hc_handle);
    75121        if (rc != EOK) {
    76122                return rc;
    77123        }
    78124       
    79         int phone = devman_device_connect(handle, flags);
    80 
    81         return phone;
     125        return usb_drv_hc_connect(dev, hc_handle, flags);
    82126}
    83127
     
    90134usb_address_t usb_drv_get_my_address(int phone, device_t *dev)
    91135{
    92         ipcarg_t address;
     136        sysarg_t address;
    93137        int rc = async_req_2_1(phone, DEV_IFACE_ID(USBHC_DEV_IFACE),
    94138            IPC_M_USBHC_GET_ADDRESS,
     
    132176usb_address_t usb_drv_request_address(int phone)
    133177{
    134         ipcarg_t address;
     178        sysarg_t address;
    135179        int rc = async_req_1_1(phone, DEV_IFACE_ID(USBHC_DEV_IFACE),
    136180            IPC_M_USBHC_REQUEST_ADDRESS, &address);
     
    298342 * @return Error status.
    299343 */
    300 static int read_buffer_in(int phone, ipcarg_t hash,
     344static int read_buffer_in(int phone, sysarg_t hash,
    301345    void *buffer, size_t size, size_t *actual_size)
    302346{
    303347        ipc_call_t answer_data;
    304         ipcarg_t answer_rc;
     348        sysarg_t answer_rc;
    305349        aid_t req;
    306350        int rc;
     
    350394        transfer_info_t *transfer = (transfer_info_t *) handle;
    351395
    352         ipcarg_t answer_rc;
     396        sysarg_t answer_rc;
    353397        async_wait_for(transfer->request, &answer_rc);
    354398
     
    367411                 * We will use it when actually reading-in the data.
    368412                 */
    369                 ipcarg_t buffer_hash = IPC_GET_ARG1(transfer->reply);
     413                sysarg_t buffer_hash = IPC_GET_ARG1(transfer->reply);
    370414                if (buffer_hash == 0) {
    371415                        rc = ENOENT;
Note: See TracChangeset for help on using the changeset viewer.