source: mainline/uspace/lib/drv/generic/remote_usbdiag.c@ 8c0e392

Last change on this file since 8c0e392 was 7fa8589, checked in by Matthieu Riolo <matthieu.riolo@…>, 6 years ago

Removing unneeded casts from errno_t to errno_t

  • Property mode set to 100644
File size: 6.1 KB
RevLine 
[7faf0f0]1/*
2 * Copyright (c) 2017 Petr Manek
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libdrv
30 * @{
31 */
32/** @file
33 * USB diagnostic device remote interface.
34 */
35
36#include <async.h>
37#include <assert.h>
38#include <macros.h>
39#include <errno.h>
40#include <devman.h>
41
42#include "usbdiag_iface.h"
43
44typedef enum {
[8393c73b]45 IPC_M_USBDIAG_TEST_IN,
46 IPC_M_USBDIAG_TEST_OUT,
[7faf0f0]47} usb_iface_funcs_t;
48
49async_sess_t *usbdiag_connect(devman_handle_t handle)
50{
51 return devman_device_connect(handle, IPC_FLAG_BLOCKING);
52}
53
54void usbdiag_disconnect(async_sess_t *sess)
55{
56 if (sess)
57 async_hangup(sess);
58}
59
[ae3a941]60errno_t usbdiag_test_in(async_exch_t *exch,
61 const usbdiag_test_params_t *params, usbdiag_test_results_t *results)
[7faf0f0]62{
63 if (!exch)
64 return EBADMEM;
65
[8393c73b]66 ipc_call_t answer;
[ae3a941]67 aid_t req = async_send_1(exch, DEV_IFACE_ID(USBDIAG_DEV_IFACE),
68 IPC_M_USBDIAG_TEST_IN, &answer);
[b10a434]69
[ae3a941]70 errno_t rc = async_data_write_start(exch, params,
71 sizeof(usbdiag_test_params_t));
[8393c73b]72 if (rc != EOK) {
73 async_exchange_end(exch);
74 async_forget(req);
75 return rc;
76 }
[24c8bf8]77
[ae3a941]78 rc = async_data_read_start(exch, results,
79 sizeof(usbdiag_test_results_t));
[8393c73b]80 if (rc != EOK) {
81 async_exchange_end(exch);
82 async_forget(req);
83 return rc;
84 }
[24c8bf8]85
[8393c73b]86 async_exchange_end(exch);
[24c8bf8]87
[64ce0c1]88 errno_t retval;
[8393c73b]89 async_wait_for(req, &retval);
[24c8bf8]90
[7fa8589]91 return retval;
[24c8bf8]92}
93
[ae3a941]94errno_t usbdiag_test_out(async_exch_t *exch,
95 const usbdiag_test_params_t *params, usbdiag_test_results_t *results)
[24c8bf8]96{
97 if (!exch)
98 return EBADMEM;
99
[8393c73b]100 ipc_call_t answer;
[ae3a941]101 aid_t req = async_send_1(exch, DEV_IFACE_ID(USBDIAG_DEV_IFACE),
102 IPC_M_USBDIAG_TEST_OUT, &answer);
[24c8bf8]103
[ae3a941]104 errno_t rc = async_data_write_start(exch, params,
105 sizeof(usbdiag_test_params_t));
[8393c73b]106 if (rc != EOK) {
107 async_exchange_end(exch);
108 async_forget(req);
109 return rc;
110 }
[24c8bf8]111
[ae3a941]112 rc = async_data_read_start(exch, results,
113 sizeof(usbdiag_test_results_t));
[8393c73b]114 if (rc != EOK) {
115 async_exchange_end(exch);
116 async_forget(req);
117 return rc;
118 }
[24c8bf8]119
[8393c73b]120 async_exchange_end(exch);
[24c8bf8]121
[64ce0c1]122 errno_t retval;
[8393c73b]123 async_wait_for(req, &retval);
[24c8bf8]124
[7fa8589]125 return retval;
[24c8bf8]126}
127
[984a9ba]128static void remote_usbdiag_test_in(ddf_fun_t *, void *, ipc_call_t *);
129static void remote_usbdiag_test_out(ddf_fun_t *, void *, ipc_call_t *);
[24c8bf8]130
[7faf0f0]131/** Remote USB diagnostic interface operations. */
132static const remote_iface_func_ptr_t remote_usbdiag_iface_ops [] = {
[8393c73b]133 [IPC_M_USBDIAG_TEST_IN] = remote_usbdiag_test_in,
134 [IPC_M_USBDIAG_TEST_OUT] = remote_usbdiag_test_out
[7faf0f0]135};
136
137/** Remote USB diagnostic interface structure. */
138const remote_iface_t remote_usbdiag_iface = {
139 .method_count = ARRAY_SIZE(remote_usbdiag_iface_ops),
140 .methods = remote_usbdiag_iface_ops,
141};
142
[984a9ba]143void remote_usbdiag_test_in(ddf_fun_t *fun, void *iface, ipc_call_t *call)
[e9d600c2]144{
145 const usbdiag_iface_t *diag_iface = (usbdiag_iface_t *) iface;
146
[984a9ba]147 ipc_call_t data;
[8393c73b]148 size_t size;
[984a9ba]149 if (!async_data_write_receive(&data, &size)) {
150 async_answer_0(&data, EINVAL);
151 async_answer_0(call, EINVAL);
[e9d600c2]152 return;
153 }
154
[8393c73b]155 if (size != sizeof(usbdiag_test_params_t)) {
[984a9ba]156 async_answer_0(&data, EINVAL);
157 async_answer_0(call, EINVAL);
[7faf0f0]158 return;
159 }
160
[8393c73b]161 usbdiag_test_params_t params;
[984a9ba]162 if (async_data_write_finalize(&data, &params, size) != EOK) {
163 async_answer_0(call, EINVAL);
[fd312d5]164 return;
[7faf0f0]165 }
[fd312d5]166
[8393c73b]167 usbdiag_test_results_t results;
[3bacee1]168 const errno_t ret = !diag_iface->test_in ? ENOTSUP :
169 diag_iface->test_in(fun, &params, &results);
[b10a434]170
171 if (ret != EOK) {
[984a9ba]172 async_answer_0(call, ret);
[e9d600c2]173 return;
174 }
175
[984a9ba]176 if (!async_data_read_receive(&data, &size)) {
177 async_answer_0(&data, EINVAL);
178 async_answer_0(call, EINVAL);
[ff16da5f]179 return;
180 }
181
[8393c73b]182 if (size != sizeof(usbdiag_test_results_t)) {
[984a9ba]183 async_answer_0(&data, EINVAL);
184 async_answer_0(call, EINVAL);
[ff16da5f]185 return;
186 }
[a35b458]187
[984a9ba]188 if (async_data_read_finalize(&data, &results, size) != EOK) {
189 async_answer_0(call, EINVAL);
[24c8bf8]190 return;
191 }
192
[984a9ba]193 async_answer_0(call, ret);
[24c8bf8]194}
195
[984a9ba]196void remote_usbdiag_test_out(ddf_fun_t *fun, void *iface, ipc_call_t *call)
[24c8bf8]197{
198 const usbdiag_iface_t *diag_iface = (usbdiag_iface_t *) iface;
199
[984a9ba]200 ipc_call_t data;
[8393c73b]201 size_t size;
[984a9ba]202 if (!async_data_write_receive(&data, &size)) {
203 async_answer_0(&data, EINVAL);
204 async_answer_0(call, EINVAL);
[24c8bf8]205 return;
206 }
207
[8393c73b]208 if (size != sizeof(usbdiag_test_params_t)) {
[984a9ba]209 async_answer_0(&data, EINVAL);
210 async_answer_0(call, EINVAL);
[24c8bf8]211 return;
212 }
213
[8393c73b]214 usbdiag_test_params_t params;
[984a9ba]215 if (async_data_write_finalize(&data, &params, size) != EOK) {
216 async_answer_0(call, EINVAL);
[24c8bf8]217 return;
218 }
219
[8393c73b]220 usbdiag_test_results_t results;
[3bacee1]221 const errno_t ret = !diag_iface->test_out ? ENOTSUP :
222 diag_iface->test_out(fun, &params, &results);
[24c8bf8]223
224 if (ret != EOK) {
[984a9ba]225 async_answer_0(call, ret);
[8393c73b]226 return;
[24c8bf8]227 }
228
[984a9ba]229 if (!async_data_read_receive(&data, &size)) {
230 async_answer_0(&data, EINVAL);
231 async_answer_0(call, EINVAL);
[24c8bf8]232 return;
233 }
234
[8393c73b]235 if (size != sizeof(usbdiag_test_results_t)) {
[984a9ba]236 async_answer_0(&data, EINVAL);
237 async_answer_0(call, EINVAL);
[8393c73b]238 return;
[24c8bf8]239 }
[a35b458]240
[984a9ba]241 if (async_data_read_finalize(&data, &results, size) != EOK) {
242 async_answer_0(call, EINVAL);
[24c8bf8]243 return;
244 }
245
[984a9ba]246 async_answer_0(call, ret);
[24c8bf8]247}
248
[7faf0f0]249/**
250 * @}
251 */
Note: See TracBrowser for help on using the repository browser.