15fd54aceSGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0+ 296c27377SValentina Manea /* 396c27377SValentina Manea * Copyright (C) 2003-2008 Takahiro Hirofuchi 496c27377SValentina Manea */ 596c27377SValentina Manea 696c27377SValentina Manea #ifndef __USBIP_STUB_H 796c27377SValentina Manea #define __USBIP_STUB_H 896c27377SValentina Manea 996c27377SValentina Manea #include <linux/list.h> 1096c27377SValentina Manea #include <linux/slab.h> 1196c27377SValentina Manea #include <linux/spinlock.h> 1296c27377SValentina Manea #include <linux/types.h> 1396c27377SValentina Manea #include <linux/usb.h> 1496c27377SValentina Manea #include <linux/wait.h> 1596c27377SValentina Manea 1696c27377SValentina Manea #define STUB_BUSID_OTHER 0 1796c27377SValentina Manea #define STUB_BUSID_REMOV 1 1896c27377SValentina Manea #define STUB_BUSID_ADDED 2 1996c27377SValentina Manea #define STUB_BUSID_ALLOC 3 2096c27377SValentina Manea 2196c27377SValentina Manea struct stub_device { 2296c27377SValentina Manea struct usb_device *udev; 2396c27377SValentina Manea 2496c27377SValentina Manea struct usbip_device ud; 2596c27377SValentina Manea __u32 devid; 2696c27377SValentina Manea 2796c27377SValentina Manea /* 2896c27377SValentina Manea * stub_priv preserves private data of each urb. 2996c27377SValentina Manea * It is allocated as stub_priv_cache and assigned to urb->context. 3096c27377SValentina Manea * 3196c27377SValentina Manea * stub_priv is always linked to any one of 3 lists; 3296c27377SValentina Manea * priv_init: linked to this until the comletion of a urb. 3396c27377SValentina Manea * priv_tx : linked to this after the completion of a urb. 3496c27377SValentina Manea * priv_free: linked to this after the sending of the result. 3596c27377SValentina Manea * 3696c27377SValentina Manea * Any of these list operations should be locked by priv_lock. 3796c27377SValentina Manea */ 3896c27377SValentina Manea spinlock_t priv_lock; 3996c27377SValentina Manea struct list_head priv_init; 4096c27377SValentina Manea struct list_head priv_tx; 4196c27377SValentina Manea struct list_head priv_free; 4296c27377SValentina Manea 4396c27377SValentina Manea /* see comments for unlinking in stub_rx.c */ 4496c27377SValentina Manea struct list_head unlink_tx; 4596c27377SValentina Manea struct list_head unlink_free; 4696c27377SValentina Manea 4796c27377SValentina Manea wait_queue_head_t tx_waitq; 4896c27377SValentina Manea }; 4996c27377SValentina Manea 5096c27377SValentina Manea /* private data into urb->priv */ 5196c27377SValentina Manea struct stub_priv { 5296c27377SValentina Manea unsigned long seqnum; 5396c27377SValentina Manea struct list_head list; 5496c27377SValentina Manea struct stub_device *sdev; 55*ea44d190SSuwan Kim struct urb **urbs; 56*ea44d190SSuwan Kim struct scatterlist *sgl; 57*ea44d190SSuwan Kim int num_urbs; 58*ea44d190SSuwan Kim int completed_urbs; 59*ea44d190SSuwan Kim int urb_status; 6096c27377SValentina Manea 6196c27377SValentina Manea int unlinking; 6296c27377SValentina Manea }; 6396c27377SValentina Manea 6496c27377SValentina Manea struct stub_unlink { 6596c27377SValentina Manea unsigned long seqnum; 6696c27377SValentina Manea struct list_head list; 6796c27377SValentina Manea __u32 status; 6896c27377SValentina Manea }; 6996c27377SValentina Manea 7096c27377SValentina Manea /* same as SYSFS_BUS_ID_SIZE */ 7196c27377SValentina Manea #define BUSID_SIZE 32 7296c27377SValentina Manea 7396c27377SValentina Manea struct bus_id_priv { 7496c27377SValentina Manea char name[BUSID_SIZE]; 7596c27377SValentina Manea char status; 7696c27377SValentina Manea int interf_count; 7796c27377SValentina Manea struct stub_device *sdev; 7896c27377SValentina Manea struct usb_device *udev; 7996c27377SValentina Manea char shutdown_busid; 8022076557SShuah Khan (Samsung OSG) spinlock_t busid_lock; 8196c27377SValentina Manea }; 8296c27377SValentina Manea 8396c27377SValentina Manea /* stub_priv is allocated from stub_priv_cache */ 8496c27377SValentina Manea extern struct kmem_cache *stub_priv_cache; 8596c27377SValentina Manea 8696c27377SValentina Manea /* stub_dev.c */ 8796c27377SValentina Manea extern struct usb_device_driver stub_driver; 8896c27377SValentina Manea 8996c27377SValentina Manea /* stub_main.c */ 9096c27377SValentina Manea struct bus_id_priv *get_busid_priv(const char *busid); 9122076557SShuah Khan (Samsung OSG) void put_busid_priv(struct bus_id_priv *bid); 9296c27377SValentina Manea int del_match_busid(char *busid); 93*ea44d190SSuwan Kim void stub_free_priv_and_urb(struct stub_priv *priv); 9496c27377SValentina Manea void stub_device_cleanup_urbs(struct stub_device *sdev); 9596c27377SValentina Manea 9696c27377SValentina Manea /* stub_rx.c */ 9796c27377SValentina Manea int stub_rx_loop(void *data); 9896c27377SValentina Manea 9996c27377SValentina Manea /* stub_tx.c */ 10096c27377SValentina Manea void stub_enqueue_ret_unlink(struct stub_device *sdev, __u32 seqnum, 10196c27377SValentina Manea __u32 status); 10296c27377SValentina Manea void stub_complete(struct urb *urb); 10396c27377SValentina Manea int stub_tx_loop(void *data); 10496c27377SValentina Manea 10596c27377SValentina Manea #endif /* __USBIP_STUB_H */ 106