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