root/drivers/usb/usbip/stub.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  * Copyright (C) 2003-2008 Takahiro Hirofuchi
   4  */
   5 
   6 #ifndef __USBIP_STUB_H
   7 #define __USBIP_STUB_H
   8 
   9 #include <linux/list.h>
  10 #include <linux/slab.h>
  11 #include <linux/spinlock.h>
  12 #include <linux/types.h>
  13 #include <linux/usb.h>
  14 #include <linux/wait.h>
  15 
  16 #define STUB_BUSID_OTHER 0
  17 #define STUB_BUSID_REMOV 1
  18 #define STUB_BUSID_ADDED 2
  19 #define STUB_BUSID_ALLOC 3
  20 
  21 struct stub_device {
  22         struct usb_device *udev;
  23 
  24         struct usbip_device ud;
  25         __u32 devid;
  26 
  27         /*
  28          * stub_priv preserves private data of each urb.
  29          * It is allocated as stub_priv_cache and assigned to urb->context.
  30          *
  31          * stub_priv is always linked to any one of 3 lists;
  32          *      priv_init: linked to this until the comletion of a urb.
  33          *      priv_tx  : linked to this after the completion of a urb.
  34          *      priv_free: linked to this after the sending of the result.
  35          *
  36          * Any of these list operations should be locked by priv_lock.
  37          */
  38         spinlock_t priv_lock;
  39         struct list_head priv_init;
  40         struct list_head priv_tx;
  41         struct list_head priv_free;
  42 
  43         /* see comments for unlinking in stub_rx.c */
  44         struct list_head unlink_tx;
  45         struct list_head unlink_free;
  46 
  47         wait_queue_head_t tx_waitq;
  48 };
  49 
  50 /* private data into urb->priv */
  51 struct stub_priv {
  52         unsigned long seqnum;
  53         struct list_head list;
  54         struct stub_device *sdev;
  55         struct urb **urbs;
  56         struct scatterlist *sgl;
  57         int num_urbs;
  58         int completed_urbs;
  59         int urb_status;
  60 
  61         int unlinking;
  62 };
  63 
  64 struct stub_unlink {
  65         unsigned long seqnum;
  66         struct list_head list;
  67         __u32 status;
  68 };
  69 
  70 /* same as SYSFS_BUS_ID_SIZE */
  71 #define BUSID_SIZE 32
  72 
  73 struct bus_id_priv {
  74         char name[BUSID_SIZE];
  75         char status;
  76         int interf_count;
  77         struct stub_device *sdev;
  78         struct usb_device *udev;
  79         char shutdown_busid;
  80         spinlock_t busid_lock;
  81 };
  82 
  83 /* stub_priv is allocated from stub_priv_cache */
  84 extern struct kmem_cache *stub_priv_cache;
  85 
  86 /* stub_dev.c */
  87 extern struct usb_device_driver stub_driver;
  88 
  89 /* stub_main.c */
  90 struct bus_id_priv *get_busid_priv(const char *busid);
  91 void put_busid_priv(struct bus_id_priv *bid);
  92 int del_match_busid(char *busid);
  93 void stub_free_priv_and_urb(struct stub_priv *priv);
  94 void stub_device_cleanup_urbs(struct stub_device *sdev);
  95 
  96 /* stub_rx.c */
  97 int stub_rx_loop(void *data);
  98 
  99 /* stub_tx.c */
 100 void stub_enqueue_ret_unlink(struct stub_device *sdev, __u32 seqnum,
 101                              __u32 status);
 102 void stub_complete(struct urb *urb);
 103 int stub_tx_loop(void *data);
 104 
 105 #endif /* __USBIP_STUB_H */

/* [<][>][^][v][top][bottom][index][help] */