source: mainline/uspace/lib/drv/generic/remote_usb.c@ 832cbe7

Last change on this file since 832cbe7 was 09ab0a9a, checked in by Jiri Svoboda <jiri@…>, 7 years ago

Fix vertical spacing with new Ccheck revision.

  • Property mode set to 100644
File size: 3.8 KB
RevLine 
[56fb3732]1/*
2 * Copyright (c) 2010 Vojtech Horky
[56bdd9a4]3 * Copyright (c) 2011 Jan Vesely
[e0a5d4c]4 * Copyright (c) 2018 Michal Staruch, Ondrej Hlavaty
[56fb3732]5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * - The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31/** @addtogroup libdrv
32 * @{
33 */
34/** @file
35 */
36
37#include <async.h>
[90c340fb]38#include <assert.h>
[9be30cdf]39#include <macros.h>
[56fb3732]40#include <errno.h>
[e938fa6]41#include <devman.h>
[56fb3732]42
43#include "usb_iface.h"
[eb1a2f4]44#include "ddf/driver.h"
[56fb3732]45
[94fbf78]46usb_dev_session_t *usb_dev_connect(devman_handle_t handle)
[56bdd9a4]47{
[b4b534ac]48 return devman_device_connect(handle, IPC_FLAG_BLOCKING);
[94fbf78]49}
[56bdd9a4]50
[94fbf78]51usb_dev_session_t *usb_dev_connect_to_self(ddf_dev_t *dev)
[e938fa6]52{
[ae3a941]53 return devman_parent_device_connect(ddf_dev_get_handle(dev),
54 IPC_FLAG_BLOCKING);
[e938fa6]55}
56
[71384bd3]57void usb_dev_disconnect(usb_dev_session_t *sess)
[e938fa6]58{
59 if (sess)
60 async_hangup(sess);
[56bdd9a4]61}
[a76b01b4]62
[56bdd9a4]63typedef enum {
[c280d7e]64 IPC_M_USB_GET_MY_DESCRIPTION,
[56bdd9a4]65} usb_iface_funcs_t;
66
67/** Tell interface number given device can use.
68 * @param[in] exch IPC communication exchange
69 * @param[in] handle Id of the device
70 * @param[out] usb_iface Assigned USB interface
71 * @return Error code.
72 */
[5a6cc679]73errno_t usb_get_my_description(async_exch_t *exch, usb_device_desc_t *desc)
[56bdd9a4]74{
75 if (!exch)
[8afeb04]76 return EBADMEM;
[a76b01b4]77
[831aa466]78 sysarg_t address, depth, speed, handle, iface;
[c280d7e]79
[5a6cc679]80 const errno_t ret = async_req_1_5(exch, DEV_IFACE_ID(USB_DEV_IFACE),
[831aa466]81 IPC_M_USB_GET_MY_DESCRIPTION, &address, &depth, &speed, &handle,
82 &iface);
83 if (ret == EOK && desc) {
84 *desc = (usb_device_desc_t) {
85 .address = address,
86 .depth = depth,
87 .speed = speed,
88 .handle = handle,
89 .iface = iface,
90 };
91 }
92
[9d15d1b]93 return ret;
94}
95
[984a9ba]96static void remote_usb_get_my_description(ddf_fun_t *, void *, ipc_call_t *);
[56fb3732]97
98/** Remote USB interface operations. */
[9be30cdf]99static const remote_iface_func_ptr_t remote_usb_iface_ops [] = {
[c280d7e]100 [IPC_M_USB_GET_MY_DESCRIPTION] = remote_usb_get_my_description,
[56fb3732]101};
102
103/** Remote USB interface structure.
104 */
[7f80313]105const remote_iface_t remote_usb_iface = {
[9be30cdf]106 .method_count = ARRAY_SIZE(remote_usb_iface_ops),
[e938fa6]107 .methods = remote_usb_iface_ops,
[56fb3732]108};
109
[c280d7e]110void remote_usb_get_my_description(ddf_fun_t *fun, void *iface,
[984a9ba]111 ipc_call_t *call)
[357a302]112{
[56bdd9a4]113 const usb_iface_t *usb_iface = (usb_iface_t *) iface;
[357a302]114
[c280d7e]115 if (usb_iface->get_my_description == NULL) {
[984a9ba]116 async_answer_0(call, ENOTSUP);
[357a302]117 return;
118 }
119
[c280d7e]120 usb_device_desc_t desc;
[5a6cc679]121 const errno_t ret = usb_iface->get_my_description(fun, &desc);
[56bdd9a4]122 if (ret != EOK) {
[984a9ba]123 async_answer_0(call, ret);
[357a302]124 } else {
[984a9ba]125 async_answer_5(call, EOK,
[c280d7e]126 (sysarg_t) desc.address,
[2aaba7e]127 (sysarg_t) desc.depth,
[c280d7e]128 (sysarg_t) desc.speed,
129 desc.handle,
130 desc.iface);
[357a302]131 }
132}
[a76b01b4]133
[56fb3732]134/**
135 * @}
136 */
Note: See TracBrowser for help on using the repository browser.