• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/staging/usbip/
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 __VHCI_COMMON_H
21#define __VHCI_COMMON_H
22
23
24#include <linux/version.h>
25#include <linux/usb.h>
26#include <asm/byteorder.h>
27#include <net/sock.h>
28
29/*-------------------------------------------------------------------------*/
30
31/*
32 * define macros to print messages
33 */
34
35/**
36 * usbip_udbg - print debug messages if CONFIG_USB_IP_DEBUG_ENABLE is defined
37 * @fmt:
38 * @args:
39 */
40
41#ifdef CONFIG_USB_IP_DEBUG_ENABLE
42
43#define usbip_udbg(fmt, args...)					\
44	do {								\
45		printk(KERN_DEBUG "%-10s:(%s,%d) %s: " fmt,		\
46			(in_interrupt() ? "interrupt" : (current)->comm),\
47			__FILE__, __LINE__, __func__, ##args);		\
48	} while (0)
49
50#else  /* CONFIG_USB_IP_DEBUG_ENABLE */
51
52#define usbip_udbg(fmt, args...)		do { } while (0)
53
54#endif /* CONFIG_USB_IP_DEBUG_ENABLE */
55
56
57enum {
58	usbip_debug_xmit	= (1 << 0),
59	usbip_debug_sysfs	= (1 << 1),
60	usbip_debug_urb		= (1 << 2),
61	usbip_debug_eh		= (1 << 3),
62
63	usbip_debug_stub_cmp	= (1 << 8),
64	usbip_debug_stub_dev	= (1 << 9),
65	usbip_debug_stub_rx	= (1 << 10),
66	usbip_debug_stub_tx	= (1 << 11),
67
68	usbip_debug_vhci_rh	= (1 << 8),
69	usbip_debug_vhci_hc	= (1 << 9),
70	usbip_debug_vhci_rx	= (1 << 10),
71	usbip_debug_vhci_tx	= (1 << 11),
72	usbip_debug_vhci_sysfs  = (1 << 12)
73};
74
75#define usbip_dbg_flag_xmit	(usbip_debug_flag & usbip_debug_xmit)
76#define usbip_dbg_flag_vhci_rh	(usbip_debug_flag & usbip_debug_vhci_rh)
77#define usbip_dbg_flag_vhci_hc	(usbip_debug_flag & usbip_debug_vhci_hc)
78#define usbip_dbg_flag_vhci_rx	(usbip_debug_flag & usbip_debug_vhci_rx)
79#define usbip_dbg_flag_vhci_tx	(usbip_debug_flag & usbip_debug_vhci_tx)
80#define usbip_dbg_flag_stub_rx	(usbip_debug_flag & usbip_debug_stub_rx)
81#define usbip_dbg_flag_stub_tx	(usbip_debug_flag & usbip_debug_stub_tx)
82#define usbip_dbg_flag_vhci_sysfs   (usbip_debug_flag & usbip_debug_vhci_sysfs)
83
84extern unsigned long usbip_debug_flag;
85extern struct device_attribute dev_attr_usbip_debug;
86
87#define usbip_dbg_with_flag(flag, fmt, args...)		\
88	do {						\
89		if (flag & usbip_debug_flag)		\
90			usbip_udbg(fmt , ##args);		\
91	} while (0)
92
93#define usbip_dbg_sysfs(fmt, args...)		\
94	usbip_dbg_with_flag(usbip_debug_sysfs, fmt , ##args)
95#define usbip_dbg_xmit(fmt, args...)		\
96	usbip_dbg_with_flag(usbip_debug_xmit, fmt , ##args)
97#define usbip_dbg_urb(fmt, args...)		\
98	usbip_dbg_with_flag(usbip_debug_urb, fmt , ##args)
99#define usbip_dbg_eh(fmt, args...)		\
100	usbip_dbg_with_flag(usbip_debug_eh, fmt , ##args)
101
102#define usbip_dbg_vhci_rh(fmt, args...)	\
103	usbip_dbg_with_flag(usbip_debug_vhci_rh, fmt , ##args)
104#define usbip_dbg_vhci_hc(fmt, args...)	\
105	usbip_dbg_with_flag(usbip_debug_vhci_hc, fmt , ##args)
106#define usbip_dbg_vhci_rx(fmt, args...)	\
107	usbip_dbg_with_flag(usbip_debug_vhci_rx, fmt , ##args)
108#define usbip_dbg_vhci_tx(fmt, args...)	\
109	usbip_dbg_with_flag(usbip_debug_vhci_tx, fmt , ##args)
110#define usbip_dbg_vhci_sysfs(fmt, args...)	\
111	usbip_dbg_with_flag(usbip_debug_vhci_sysfs, fmt , ##args)
112
113#define usbip_dbg_stub_cmp(fmt, args...)	\
114	usbip_dbg_with_flag(usbip_debug_stub_cmp, fmt , ##args)
115#define usbip_dbg_stub_rx(fmt, args...)	\
116	usbip_dbg_with_flag(usbip_debug_stub_rx, fmt , ##args)
117#define usbip_dbg_stub_tx(fmt, args...)	\
118	usbip_dbg_with_flag(usbip_debug_stub_tx, fmt , ##args)
119
120
121/**
122 * usbip_uerr - print error messages
123 * @fmt:
124 * @args:
125 */
126#define usbip_uerr(fmt, args...)					\
127	do {								\
128		printk(KERN_ERR "%-10s: ***ERROR*** (%s,%d) %s: " fmt,	\
129			(in_interrupt() ? "interrupt" : (current)->comm),\
130			__FILE__, __LINE__, __func__, ##args);	\
131	} while (0)
132
133/**
134 * usbip_uinfo - print information messages
135 * @fmt:
136 * @args:
137 */
138#define usbip_uinfo(fmt, args...)				\
139	do {							\
140		printk(KERN_INFO "usbip: " fmt , ## args);	\
141	} while (0)
142
143
144/*-------------------------------------------------------------------------*/
145
146/*
147 * USB/IP request headers.
148 * Currently, we define 4 request types:
149 *
150 *  - CMD_SUBMIT transfers a USB request, corresponding to usb_submit_urb().
151 *    (client to server)
152 *  - RET_RETURN transfers the result of CMD_SUBMIT.
153 *    (server to client)
154 *  - CMD_UNLINK transfers an unlink request of a pending USB request.
155 *    (client to server)
156 *  - RET_UNLINK transfers the result of CMD_UNLINK.
157 *    (server to client)
158 *
159 * Note: The below request formats are based on the USB subsystem of Linux. Its
160 * details will be defined when other implementations come.
161 *
162 *
163 */
164
165/*
166 * A basic header followed by other additional headers.
167 */
168struct usbip_header_basic {
169#define USBIP_CMD_SUBMIT	0x0001
170#define USBIP_CMD_UNLINK	0x0002
171#define USBIP_RET_SUBMIT	0x0003
172#define USBIP_RET_UNLINK	0x0004
173	__u32 command;
174
175	 /* sequential number which identifies requests.
176	  * incremented per connections */
177	__u32 seqnum;
178
179	/* devid is used to specify a remote USB device uniquely instead
180	 * of busnum and devnum in Linux. In the case of Linux stub_driver,
181	 * this value is ((busnum << 16) | devnum) */
182	__u32 devid;
183
184#define USBIP_DIR_OUT	0
185#define USBIP_DIR_IN	1
186	__u32 direction;
187	__u32 ep;     /* endpoint number */
188} __attribute__ ((packed));
189
190/*
191 * An additional header for a CMD_SUBMIT packet.
192 */
193struct usbip_header_cmd_submit {
194	/* these values are basically the same as in a URB. */
195
196	/* the same in a URB. */
197	__u32 transfer_flags;
198
199	/* set the following data size (out),
200	 * or expected reading data size (in) */
201	__s32 transfer_buffer_length;
202
203	/* it is difficult for usbip to sync frames (reserved only?) */
204	__s32 start_frame;
205
206	/* the number of iso descriptors that follows this header */
207	__s32 number_of_packets;
208
209	/* the maximum time within which this request works in a host
210	 * controller of a server side */
211	__s32 interval;
212
213	/* set setup packet data for a CTRL request */
214	unsigned char setup[8];
215} __attribute__ ((packed));
216
217/*
218 * An additional header for a RET_SUBMIT packet.
219 */
220struct usbip_header_ret_submit {
221	__s32 status;
222	__s32 actual_length; /* returned data length */
223	__s32 start_frame; /* ISO and INT */
224	__s32 number_of_packets;  /* ISO only */
225	__s32 error_count; /* ISO only */
226} __attribute__ ((packed));
227
228/*
229 * An additional header for a CMD_UNLINK packet.
230 */
231struct usbip_header_cmd_unlink {
232	__u32 seqnum; /* URB's seqnum which will be unlinked */
233} __attribute__ ((packed));
234
235
236/*
237 * An additional header for a RET_UNLINK packet.
238 */
239struct usbip_header_ret_unlink {
240	__s32 status;
241} __attribute__ ((packed));
242
243
244/* the same as usb_iso_packet_descriptor but packed for pdu */
245struct usbip_iso_packet_descriptor {
246	__u32 offset;
247	__u32 length;            /* expected length */
248	__u32 actual_length;
249	__u32 status;
250} __attribute__ ((packed));
251
252
253/*
254 * All usbip packets use a common header to keep code simple.
255 */
256struct usbip_header {
257	struct usbip_header_basic base;
258
259	union {
260		struct usbip_header_cmd_submit	cmd_submit;
261		struct usbip_header_ret_submit	ret_submit;
262		struct usbip_header_cmd_unlink	cmd_unlink;
263		struct usbip_header_ret_unlink	ret_unlink;
264	} u;
265} __attribute__ ((packed));
266
267
268
269
270/*-------------------------------------------------------------------------*/
271
272
273int usbip_xmit(int, struct socket *, char *, int, int);
274int usbip_sendmsg(struct socket *, struct msghdr *, int);
275
276
277static inline int interface_to_busnum(struct usb_interface *interface)
278{
279	struct usb_device *udev = interface_to_usbdev(interface);
280	return udev->bus->busnum;
281}
282
283static inline int interface_to_devnum(struct usb_interface *interface)
284{
285	struct usb_device *udev = interface_to_usbdev(interface);
286	return udev->devnum;
287}
288
289static inline int interface_to_infnum(struct usb_interface *interface)
290{
291	return interface->cur_altsetting->desc.bInterfaceNumber;
292}
293
294
295struct socket *sockfd_to_socket(unsigned int);
296int set_sockaddr(struct socket *socket, struct sockaddr_storage *ss);
297
298void usbip_dump_urb(struct urb *purb);
299void usbip_dump_header(struct usbip_header *pdu);
300
301
302struct usbip_device;
303
304struct usbip_task {
305	struct task_struct *thread;
306	struct completion thread_done;
307	char *name;
308	void (*loop_ops)(struct usbip_task *);
309};
310
311enum usbip_side {
312	USBIP_VHCI,
313	USBIP_STUB,
314};
315
316enum usbip_status {
317	/* sdev is available. */
318	SDEV_ST_AVAILABLE = 0x01,
319	/* sdev is now used. */
320	SDEV_ST_USED,
321	/* sdev is unusable because of a fatal error. */
322	SDEV_ST_ERROR,
323
324	/* vdev does not connect a remote device. */
325	VDEV_ST_NULL,
326	/* vdev is used, but the USB address is not assigned yet */
327	VDEV_ST_NOTASSIGNED,
328	VDEV_ST_USED,
329	VDEV_ST_ERROR
330};
331
332/* a common structure for stub_device and vhci_device */
333struct usbip_device {
334	enum usbip_side side;
335
336	enum usbip_status status;
337
338	/* lock for status */
339	spinlock_t lock;
340
341	struct socket *tcp_socket;
342
343	struct usbip_task tcp_rx;
344	struct usbip_task tcp_tx;
345
346	/* event handler */
347#define USBIP_EH_SHUTDOWN	(1 << 0)
348#define USBIP_EH_BYE		(1 << 1)
349#define USBIP_EH_RESET		(1 << 2)
350#define USBIP_EH_UNUSABLE	(1 << 3)
351
352#define SDEV_EVENT_REMOVED   (USBIP_EH_SHUTDOWN | USBIP_EH_RESET | USBIP_EH_BYE)
353#define	SDEV_EVENT_DOWN		(USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
354#define	SDEV_EVENT_ERROR_TCP	(USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
355#define	SDEV_EVENT_ERROR_SUBMIT	(USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
356#define	SDEV_EVENT_ERROR_MALLOC	(USBIP_EH_SHUTDOWN | USBIP_EH_UNUSABLE)
357
358#define	VDEV_EVENT_REMOVED	(USBIP_EH_SHUTDOWN | USBIP_EH_BYE)
359#define	VDEV_EVENT_DOWN		(USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
360#define	VDEV_EVENT_ERROR_TCP	(USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
361#define	VDEV_EVENT_ERROR_MALLOC	(USBIP_EH_SHUTDOWN | USBIP_EH_UNUSABLE)
362
363	unsigned long event;
364	struct usbip_task eh;
365	wait_queue_head_t eh_waitq;
366
367	struct eh_ops {
368		void (*shutdown)(struct usbip_device *);
369		void (*reset)(struct usbip_device *);
370		void (*unusable)(struct usbip_device *);
371	} eh_ops;
372};
373
374
375void usbip_task_init(struct usbip_task *ut, char *,
376				void (*loop_ops)(struct usbip_task *));
377
378int usbip_start_threads(struct usbip_device *ud);
379void usbip_stop_threads(struct usbip_device *ud);
380int usbip_thread(void *param);
381
382void usbip_pack_pdu(struct usbip_header *pdu, struct urb *urb, int cmd,
383								int pack);
384
385void usbip_header_correct_endian(struct usbip_header *pdu, int send);
386/* some members of urb must be substituted before. */
387int usbip_recv_xbuff(struct usbip_device *ud, struct urb *urb);
388/* some members of urb must be substituted before. */
389int usbip_recv_iso(struct usbip_device *ud, struct urb *urb);
390void *usbip_alloc_iso_desc_pdu(struct urb *urb, ssize_t *bufflen);
391
392
393/* usbip_event.c */
394int usbip_start_eh(struct usbip_device *ud);
395void usbip_stop_eh(struct usbip_device *ud);
396void usbip_event_add(struct usbip_device *ud, unsigned long event);
397int usbip_event_happened(struct usbip_device *ud);
398
399
400#endif
401