stub.h revision 499aaae000ef466150a58f31b28f88087da123e6
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 204d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi#include <linux/kernel.h> 214d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi#include <linux/list.h> 224d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi#include <linux/spinlock.h> 234d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi#include <linux/slab.h> 244d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi#include <linux/string.h> 254d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi#include <linux/module.h> 264d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi#include <linux/net.h> 274d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 28aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar#define STUB_BUSID_OTHER 0 29aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar#define STUB_BUSID_REMOV 1 30aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar#define STUB_BUSID_ADDED 2 31aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar#define STUB_BUSID_ALLOC 3 32aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar 334d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchistruct stub_device { 344d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct usb_interface *interface; 352d8f4595d1f275f424a8920bb2563fc547661213Max Vozeler struct usb_device *udev; 364d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct list_head list; 374d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 384d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct usbip_device ud; 394d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi __u32 devid; 404d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 414d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi /* 424d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * stub_priv preserves private data of each urb. 434d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * It is allocated as stub_priv_cache and assigned to urb->context. 444d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * 454d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * stub_priv is always linked to any one of 3 lists; 464d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * priv_init: linked to this until the comletion of a urb. 474d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * priv_tx : linked to this after the completion of a urb. 484d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * priv_free: linked to this after the sending of the result. 494d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * 504d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi * Any of these list operations should be locked by priv_lock. 514d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi */ 524d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi spinlock_t priv_lock; 534d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct list_head priv_init; 544d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct list_head priv_tx; 554d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct list_head priv_free; 564d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 574d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi /* see comments for unlinking in stub_rx.c */ 584d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct list_head unlink_tx; 594d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct list_head unlink_free; 604d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 614d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi wait_queue_head_t tx_waitq; 624d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi}; 634d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 644d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi/* private data into urb->priv */ 654d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchistruct stub_priv { 664d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi unsigned long seqnum; 674d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct list_head list; 684d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct stub_device *sdev; 694d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct urb *urb; 704d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 714d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi int unlinking; 724d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi}; 734d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 744d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchistruct stub_unlink { 754d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi unsigned long seqnum; 764d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi struct list_head list; 774d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi __u32 status; 784d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi}; 794d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 80aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar#define BUSID_SIZE 20 81aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollarstruct bus_id_priv { 82aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar char name[BUSID_SIZE]; 83aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar char status; 84aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar int interf_count; 85aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar struct stub_device *sdev; 86aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar char shutdown_busid; 87aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollar}; 884d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 89499aaae000ef466150a58f31b28f88087da123e6matt mooney/* stub_priv is allocated from stub_priv_cache */ 904d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchiextern struct kmem_cache *stub_priv_cache; 914d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 924d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi/* stub_dev.c */ 934d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchiextern struct usb_driver stub_driver; 944d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi 954d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchi/* stub_main.c */ 96aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollarstruct bus_id_priv *get_busid_priv(const char *busid); 97aa5873e96271611ae55586f65e49ea1fab90cb88Endre Kollarint del_match_busid(char *busid); 984d7b5c7f8ad49b7f01fb8aed83c560ac43cfbda8Takahiro Hirofuchivoid stub_device_cleanup_urbs(struct stub_device *sdev); 99499aaae000ef466150a58f31b28f88087da123e6matt mooney 100499aaae000ef466150a58f31b28f88087da123e6matt mooney/* stub_rx.c */ 101499aaae000ef466150a58f31b28f88087da123e6matt mooneyint stub_rx_loop(void *data); 102499aaae000ef466150a58f31b28f88087da123e6matt mooney 103499aaae000ef466150a58f31b28f88087da123e6matt mooney/* stub_tx.c */ 104499aaae000ef466150a58f31b28f88087da123e6matt mooneyvoid stub_enqueue_ret_unlink(struct stub_device *sdev, __u32 seqnum, 105499aaae000ef466150a58f31b28f88087da123e6matt mooney __u32 status); 106499aaae000ef466150a58f31b28f88087da123e6matt mooneyvoid stub_complete(struct urb *urb); 107499aaae000ef466150a58f31b28f88087da123e6matt mooneyint stub_tx_loop(void *data); 108