14d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi/*
24d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * Copyright (C) 2003-2008 Takahiro Hirofuchi
34d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi *
44d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * This is free software; you can redistribute it and/or modify
54d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * it under the terms of the GNU General Public License as published by
64d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * the Free Software Foundation; either version 2 of the License, or
74d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * (at your option) any later version.
84d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi *
94d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * This is distributed in the hope that it will be useful,
104d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * but WITHOUT ANY WARRANTY; without even the implied warranty of
114d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
124d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * GNU General Public License for more details.
134d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi *
144d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * You should have received a copy of the GNU General Public License
154d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * along with this program; if not, write to the Free Software
164d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
174d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * USA.
184d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi */
194d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
20306dac699e02cb399f0c2546df8cb9f5bbee572cTobias Klauser#ifndef __USBIP_STUB_H
21306dac699e02cb399f0c2546df8cb9f5bbee572cTobias Klauser#define __USBIP_STUB_H
22306dac699e02cb399f0c2546df8cb9f5bbee572cTobias Klauser
234d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi#include <linux/list.h>
244d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi#include <linux/slab.h>
257aaacb43ed97714ff0f7f77f306f24b6e564ad03matt mooney#include <linux/spinlock.h>
267aaacb43ed97714ff0f7f77f306f24b6e564ad03matt mooney#include <linux/types.h>
277aaacb43ed97714ff0f7f77f306f24b6e564ad03matt mooney#include <linux/usb.h>
287aaacb43ed97714ff0f7f77f306f24b6e564ad03matt mooney#include <linux/wait.h>
294d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
30aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar#define STUB_BUSID_OTHER 0
31aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar#define STUB_BUSID_REMOV 1
32aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar#define STUB_BUSID_ADDED 2
33aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar#define STUB_BUSID_ALLOC 3
34aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar
354d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchistruct stub_device {
364d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct usb_interface *interface;
372d8f4595d1f275f424a8920bb2563fc547661213Max Vozeler	struct usb_device *udev;
384d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
394d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct usbip_device ud;
404d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	__u32 devid;
414d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
424d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	/*
434d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	 * stub_priv preserves private data of each urb.
444d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	 * It is allocated as stub_priv_cache and assigned to urb->context.
454d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	 *
464d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	 * stub_priv is always linked to any one of 3 lists;
474d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	 *	priv_init: linked to this until the comletion of a urb.
484d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	 *	priv_tx  : linked to this after the completion of a urb.
494d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	 *	priv_free: linked to this after the sending of the result.
504d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	 *
514d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	 * Any of these list operations should be locked by priv_lock.
524d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	 */
534d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	spinlock_t priv_lock;
544d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct list_head priv_init;
554d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct list_head priv_tx;
564d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct list_head priv_free;
574d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
584d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	/* see comments for unlinking in stub_rx.c */
594d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct list_head unlink_tx;
604d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct list_head unlink_free;
614d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
624d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	wait_queue_head_t tx_waitq;
634d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi};
644d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
654d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi/* private data into urb->priv */
664d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchistruct stub_priv {
674d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	unsigned long seqnum;
684d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct list_head list;
694d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct stub_device *sdev;
704d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct urb *urb;
714d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
724d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	int unlinking;
734d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi};
744d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
754d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchistruct stub_unlink {
764d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	unsigned long seqnum;
774d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	struct list_head list;
784d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi	__u32 status;
794d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi};
804d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
813e4fda9f956d3e8f14e8cabc6dd4f1caa95981e4matt mooney/* same as SYSFS_BUS_ID_SIZE */
823e4fda9f956d3e8f14e8cabc6dd4f1caa95981e4matt mooney#define BUSID_SIZE 32
8387352760173082c2a774f83dc6fe826fdbf219c0matt mooney
84aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollarstruct bus_id_priv {
85aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar	char name[BUSID_SIZE];
86aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar	char status;
87aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar	int interf_count;
88aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar	struct stub_device *sdev;
89aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar	char shutdown_busid;
90aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar};
914d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
92499aaae000ef466150a58f31b28f88087da123e6matt mooney/* stub_priv is allocated from stub_priv_cache */
934d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchiextern struct kmem_cache *stub_priv_cache;
944d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
954d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi/* stub_dev.c */
964d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchiextern struct usb_driver stub_driver;
974d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi
984d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi/* stub_main.c */
99aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollarstruct bus_id_priv *get_busid_priv(const char *busid);
100aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollarint del_match_busid(char *busid);
1014d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchivoid stub_device_cleanup_urbs(struct stub_device *sdev);
102499aaae000ef466150a58f31b28f88087da123e6matt mooney
103499aaae000ef466150a58f31b28f88087da123e6matt mooney/* stub_rx.c */
104499aaae000ef466150a58f31b28f88087da123e6matt mooneyint stub_rx_loop(void *data);
105499aaae000ef466150a58f31b28f88087da123e6matt mooney
106499aaae000ef466150a58f31b28f88087da123e6matt mooney/* stub_tx.c */
107499aaae000ef466150a58f31b28f88087da123e6matt mooneyvoid stub_enqueue_ret_unlink(struct stub_device *sdev, __u32 seqnum,
108499aaae000ef466150a58f31b28f88087da123e6matt mooney			     __u32 status);
109499aaae000ef466150a58f31b28f88087da123e6matt mooneyvoid stub_complete(struct urb *urb);
110499aaae000ef466150a58f31b28f88087da123e6matt mooneyint stub_tx_loop(void *data);
111306dac699e02cb399f0c2546df8cb9f5bbee572cTobias Klauser
112306dac699e02cb399f0c2546df8cb9f5bbee572cTobias Klauser#endif /* __USBIP_STUB_H */
113