Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
staging
usbip
usbip_common.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2003-2008 Takahiro Hirofuchi
3
*
4
* This is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
8
*
9
* This is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
17
* USA.
18
*/
19
20
#ifndef __USBIP_COMMON_H
21
#define __USBIP_COMMON_H
22
23
#include <linux/compiler.h>
24
#include <linux/device.h>
25
#include <
linux/interrupt.h
>
26
#include <linux/net.h>
27
#include <
linux/printk.h
>
28
#include <
linux/spinlock.h
>
29
#include <linux/types.h>
30
#include <
linux/usb.h
>
31
#include <linux/wait.h>
32
33
#define USBIP_VERSION "1.0.0"
34
35
#undef pr_fmt
36
37
#ifdef DEBUG
38
#define pr_fmt(fmt) KBUILD_MODNAME ": %s:%d: " fmt, __func__, __LINE__
39
#else
40
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
41
#endif
42
43
enum
{
44
usbip_debug_xmit
= (1 << 0),
45
usbip_debug_sysfs
= (1 << 1),
46
usbip_debug_urb
= (1 << 2),
47
usbip_debug_eh
= (1 << 3),
48
49
usbip_debug_stub_cmp
= (1 << 8),
50
usbip_debug_stub_dev
= (1 << 9),
51
usbip_debug_stub_rx
= (1 << 10),
52
usbip_debug_stub_tx
= (1 << 11),
53
54
usbip_debug_vhci_rh
= (1 << 8),
55
usbip_debug_vhci_hc
= (1 << 9),
56
usbip_debug_vhci_rx
= (1 << 10),
57
usbip_debug_vhci_tx
= (1 << 11),
58
usbip_debug_vhci_sysfs
= (1 << 12)
59
};
60
61
#define usbip_dbg_flag_xmit (usbip_debug_flag & usbip_debug_xmit)
62
#define usbip_dbg_flag_vhci_rh (usbip_debug_flag & usbip_debug_vhci_rh)
63
#define usbip_dbg_flag_vhci_hc (usbip_debug_flag & usbip_debug_vhci_hc)
64
#define usbip_dbg_flag_vhci_rx (usbip_debug_flag & usbip_debug_vhci_rx)
65
#define usbip_dbg_flag_vhci_tx (usbip_debug_flag & usbip_debug_vhci_tx)
66
#define usbip_dbg_flag_stub_rx (usbip_debug_flag & usbip_debug_stub_rx)
67
#define usbip_dbg_flag_stub_tx (usbip_debug_flag & usbip_debug_stub_tx)
68
#define usbip_dbg_flag_vhci_sysfs (usbip_debug_flag & usbip_debug_vhci_sysfs)
69
70
extern
unsigned
long
usbip_debug_flag
;
71
extern
struct
device_attribute
dev_attr_usbip_debug
;
72
73
#define usbip_dbg_with_flag(flag, fmt, args...) \
74
do { \
75
if (flag & usbip_debug_flag) \
76
pr_debug(fmt, ##args); \
77
} while (0)
78
79
#define usbip_dbg_sysfs(fmt, args...) \
80
usbip_dbg_with_flag(usbip_debug_sysfs, fmt , ##args)
81
#define usbip_dbg_xmit(fmt, args...) \
82
usbip_dbg_with_flag(usbip_debug_xmit, fmt , ##args)
83
#define usbip_dbg_urb(fmt, args...) \
84
usbip_dbg_with_flag(usbip_debug_urb, fmt , ##args)
85
#define usbip_dbg_eh(fmt, args...) \
86
usbip_dbg_with_flag(usbip_debug_eh, fmt , ##args)
87
88
#define usbip_dbg_vhci_rh(fmt, args...) \
89
usbip_dbg_with_flag(usbip_debug_vhci_rh, fmt , ##args)
90
#define usbip_dbg_vhci_hc(fmt, args...) \
91
usbip_dbg_with_flag(usbip_debug_vhci_hc, fmt , ##args)
92
#define usbip_dbg_vhci_rx(fmt, args...) \
93
usbip_dbg_with_flag(usbip_debug_vhci_rx, fmt , ##args)
94
#define usbip_dbg_vhci_tx(fmt, args...) \
95
usbip_dbg_with_flag(usbip_debug_vhci_tx, fmt , ##args)
96
#define usbip_dbg_vhci_sysfs(fmt, args...) \
97
usbip_dbg_with_flag(usbip_debug_vhci_sysfs, fmt , ##args)
98
99
#define usbip_dbg_stub_cmp(fmt, args...) \
100
usbip_dbg_with_flag(usbip_debug_stub_cmp, fmt , ##args)
101
#define usbip_dbg_stub_rx(fmt, args...) \
102
usbip_dbg_with_flag(usbip_debug_stub_rx, fmt , ##args)
103
#define usbip_dbg_stub_tx(fmt, args...) \
104
usbip_dbg_with_flag(usbip_debug_stub_tx, fmt , ##args)
105
106
/*
107
* USB/IP request headers
108
*
109
* Each request is transferred across the network to its counterpart, which
110
* facilitates the normal USB communication. The values contained in the headers
111
* are basically the same as in a URB. Currently, four request types are
112
* defined:
113
*
114
* - USBIP_CMD_SUBMIT: a USB request block, corresponds to usb_submit_urb()
115
* (client to server)
116
*
117
* - USBIP_RET_SUBMIT: the result of USBIP_CMD_SUBMIT
118
* (server to client)
119
*
120
* - USBIP_CMD_UNLINK: an unlink request of a pending USBIP_CMD_SUBMIT,
121
* corresponds to usb_unlink_urb()
122
* (client to server)
123
*
124
* - USBIP_RET_UNLINK: the result of USBIP_CMD_UNLINK
125
* (server to client)
126
*
127
*/
128
#define USBIP_CMD_SUBMIT 0x0001
129
#define USBIP_CMD_UNLINK 0x0002
130
#define USBIP_RET_SUBMIT 0x0003
131
#define USBIP_RET_UNLINK 0x0004
132
133
#define USBIP_DIR_OUT 0x00
134
#define USBIP_DIR_IN 0x01
135
146
struct
usbip_header_basic
{
147
__u32
command
;
148
__u32
seqnum
;
149
__u32
devid
;
150
__u32
direction
;
151
__u32
ep
;
152
}
__packed
;
153
163
struct
usbip_header_cmd_submit
{
164
__u32
transfer_flags
;
165
__s32
transfer_buffer_length
;
166
167
/* it is difficult for usbip to sync frames (reserved only?) */
168
__s32
start_frame
;
169
__s32
number_of_packets
;
170
__s32
interval
;
171
172
unsigned
char
setup
[8];
173
}
__packed
;
174
183
struct
usbip_header_ret_submit
{
184
__s32
status
;
185
__s32
actual_length
;
186
__s32
start_frame
;
187
__s32
number_of_packets
;
188
__s32
error_count
;
189
}
__packed
;
190
195
struct
usbip_header_cmd_unlink
{
196
__u32
seqnum
;
197
}
__packed
;
198
203
struct
usbip_header_ret_unlink
{
204
__s32
status
;
205
}
__packed
;
206
212
struct
usbip_header
{
213
struct
usbip_header_basic
base
;
214
215
union
{
216
struct
usbip_header_cmd_submit
cmd_submit
;
217
struct
usbip_header_ret_submit
ret_submit
;
218
struct
usbip_header_cmd_unlink
cmd_unlink
;
219
struct
usbip_header_ret_unlink
ret_unlink
;
220
}
u
;
221
}
__packed
;
222
223
/*
224
* This is the same as usb_iso_packet_descriptor but packed for pdu.
225
*/
226
struct
usbip_iso_packet_descriptor
{
227
__u32
offset
;
228
__u32
length
;
/* expected length */
229
__u32
actual_length
;
230
__u32
status
;
231
}
__packed
;
232
233
enum
usbip_side
{
234
USBIP_VHCI
,
235
USBIP_STUB
,
236
};
237
238
enum
usbip_status
{
239
/* sdev is available. */
240
SDEV_ST_AVAILABLE
= 0x01,
241
/* sdev is now used. */
242
SDEV_ST_USED
,
243
/* sdev is unusable because of a fatal error. */
244
SDEV_ST_ERROR
,
245
246
/* vdev does not connect a remote device. */
247
VDEV_ST_NULL
,
248
/* vdev is used, but the USB address is not assigned yet */
249
VDEV_ST_NOTASSIGNED
,
250
VDEV_ST_USED
,
251
VDEV_ST_ERROR
252
};
253
254
/* event handler */
255
#define USBIP_EH_SHUTDOWN (1 << 0)
256
#define USBIP_EH_BYE (1 << 1)
257
#define USBIP_EH_RESET (1 << 2)
258
#define USBIP_EH_UNUSABLE (1 << 3)
259
260
#define SDEV_EVENT_REMOVED (USBIP_EH_SHUTDOWN | USBIP_EH_RESET | USBIP_EH_BYE)
261
#define SDEV_EVENT_DOWN (USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
262
#define SDEV_EVENT_ERROR_TCP (USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
263
#define SDEV_EVENT_ERROR_SUBMIT (USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
264
#define SDEV_EVENT_ERROR_MALLOC (USBIP_EH_SHUTDOWN | USBIP_EH_UNUSABLE)
265
266
#define VDEV_EVENT_REMOVED (USBIP_EH_SHUTDOWN | USBIP_EH_BYE)
267
#define VDEV_EVENT_DOWN (USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
268
#define VDEV_EVENT_ERROR_TCP (USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
269
#define VDEV_EVENT_ERROR_MALLOC (USBIP_EH_SHUTDOWN | USBIP_EH_UNUSABLE)
270
271
/* a common structure for stub_device and vhci_device */
272
struct
usbip_device
{
273
enum
usbip_side
side
;
274
enum
usbip_status
status
;
275
276
/* lock for status */
277
spinlock_t
lock
;
278
279
struct
socket
*
tcp_socket
;
280
281
struct
task_struct
*
tcp_rx
;
282
struct
task_struct
*
tcp_tx
;
283
284
unsigned
long
event
;
285
struct
task_struct
*
eh
;
286
wait_queue_head_t
eh_waitq
;
287
288
struct
eh_ops
{
289
void
(*
shutdown
)(
struct
usbip_device
*);
290
void
(*
reset
)(
struct
usbip_device
*);
291
void
(*
unusable
)(
struct
usbip_device
*);
292
}
eh_ops
;
293
};
294
295
#define kthread_get_run(threadfn, data, namefmt, ...) \
296
({ \
297
struct task_struct *__k \
298
= kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
299
if (!IS_ERR(__k)) { \
300
get_task_struct(__k); \
301
wake_up_process(__k); \
302
} \
303
__k; \
304
})
305
306
#define kthread_stop_put(k) \
307
do { \
308
kthread_stop(k); \
309
put_task_struct(k); \
310
} while (0)
311
312
/* usbip_common.c */
313
void
usbip_dump_urb
(
struct
urb
*purb);
314
void
usbip_dump_header
(
struct
usbip_header
*
pdu
);
315
316
int
usbip_recv
(
struct
socket
*
sock
,
void
*
buf
,
int
size
);
317
struct
socket
*
sockfd_to_socket
(
unsigned
int
sockfd);
318
319
void
usbip_pack_pdu
(
struct
usbip_header
*
pdu
,
struct
urb
*
urb
,
int
cmd
,
320
int
pack);
321
void
usbip_header_correct_endian
(
struct
usbip_header
*
pdu
,
int
send
);
322
323
void
*
usbip_alloc_iso_desc_pdu
(
struct
urb
*
urb
,
ssize_t
*
bufflen
);
324
/* some members of urb must be substituted before. */
325
int
usbip_recv_iso
(
struct
usbip_device
*
ud
,
struct
urb
*
urb
);
326
void
usbip_pad_iso
(
struct
usbip_device
*
ud
,
struct
urb
*
urb
);
327
int
usbip_recv_xbuff
(
struct
usbip_device
*
ud
,
struct
urb
*
urb
);
328
329
/* usbip_event.c */
330
int
usbip_start_eh
(
struct
usbip_device
*
ud
);
331
void
usbip_stop_eh
(
struct
usbip_device
*
ud
);
332
void
usbip_event_add
(
struct
usbip_device
*
ud
,
unsigned
long
event
);
333
int
usbip_event_happened
(
struct
usbip_device
*
ud
);
334
335
static
inline
int
interface_to_busnum(
struct
usb_interface
*
interface
)
336
{
337
struct
usb_device *
udev
= interface_to_usbdev(interface);
338
return
udev->bus->busnum;
339
}
340
341
static
inline
int
interface_to_devnum(
struct
usb_interface
*
interface
)
342
{
343
struct
usb_device *
udev
= interface_to_usbdev(interface);
344
return
udev->devnum;
345
}
346
347
#endif
/* __USBIP_COMMON_H */
Generated on Thu Jan 10 2013 14:32:13 for Linux Kernel by
1.8.2