1 /* 2 * Copyright (C) 2003-2008 Takahiro Hirofuchi 3 * Copyright (C) 2015 Nobuo Iwata 4 * 5 * This is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 */ 11 12 #ifndef __USBIP_VHCI_H 13 #define __USBIP_VHCI_H 14 15 #include <linux/device.h> 16 #include <linux/list.h> 17 #include <linux/spinlock.h> 18 #include <linux/sysfs.h> 19 #include <linux/types.h> 20 #include <linux/usb.h> 21 #include <linux/usb/hcd.h> 22 #include <linux/wait.h> 23 24 struct vhci_device { 25 struct usb_device *udev; 26 27 /* 28 * devid specifies a remote usb device uniquely instead 29 * of combination of busnum and devnum. 30 */ 31 __u32 devid; 32 33 /* speed of a remote device */ 34 enum usb_device_speed speed; 35 36 /* vhci root-hub port to which this device is attached */ 37 __u32 rhport; 38 39 struct usbip_device ud; 40 41 /* lock for the below link lists */ 42 spinlock_t priv_lock; 43 44 /* vhci_priv is linked to one of them. */ 45 struct list_head priv_tx; 46 struct list_head priv_rx; 47 48 /* vhci_unlink is linked to one of them */ 49 struct list_head unlink_tx; 50 struct list_head unlink_rx; 51 52 /* vhci_tx thread sleeps for this queue */ 53 wait_queue_head_t waitq_tx; 54 }; 55 56 /* urb->hcpriv, use container_of() */ 57 struct vhci_priv { 58 unsigned long seqnum; 59 struct list_head list; 60 61 struct vhci_device *vdev; 62 struct urb *urb; 63 }; 64 65 struct vhci_unlink { 66 /* seqnum of this request */ 67 unsigned long seqnum; 68 69 struct list_head list; 70 71 /* seqnum of the unlink target */ 72 unsigned long unlink_seqnum; 73 }; 74 75 enum hub_speed { 76 HUB_SPEED_HIGH = 0, 77 HUB_SPEED_SUPER, 78 }; 79 80 /* Number of supported ports. Value has an upperbound of USB_MAXCHILDREN */ 81 #ifdef CONFIG_USBIP_VHCI_HC_PORTS 82 #define VHCI_HC_PORTS CONFIG_USBIP_VHCI_HC_PORTS 83 #else 84 #define VHCI_HC_PORTS 8 85 #endif 86 87 /* Each VHCI has 2 hubs (USB2 and USB3), each has VHCI_HC_PORTS ports */ 88 #define VHCI_PORTS (VHCI_HC_PORTS*2) 89 90 #ifdef CONFIG_USBIP_VHCI_NR_HCS 91 #define VHCI_NR_HCS CONFIG_USBIP_VHCI_NR_HCS 92 #else 93 #define VHCI_NR_HCS 1 94 #endif 95 96 #define MAX_STATUS_NAME 16 97 98 struct vhci { 99 spinlock_t lock; 100 101 struct platform_device *pdev; 102 103 struct vhci_hcd *vhci_hcd_hs; 104 struct vhci_hcd *vhci_hcd_ss; 105 }; 106 107 /* for usb_hcd.hcd_priv[0] */ 108 struct vhci_hcd { 109 struct vhci *vhci; 110 111 u32 port_status[VHCI_HC_PORTS]; 112 113 unsigned resuming:1; 114 unsigned long re_timeout; 115 116 atomic_t seqnum; 117 118 /* 119 * NOTE: 120 * wIndex shows the port number and begins from 1. 121 * But, the index of this array begins from 0. 122 */ 123 struct vhci_device vdev[VHCI_HC_PORTS]; 124 }; 125 126 extern int vhci_num_controllers; 127 extern struct vhci *vhcis; 128 extern struct attribute_group vhci_attr_group; 129 130 /* vhci_hcd.c */ 131 void rh_port_connect(struct vhci_device *vdev, enum usb_device_speed speed); 132 133 /* vhci_sysfs.c */ 134 int vhci_init_attr_group(void); 135 void vhci_finish_attr_group(void); 136 137 /* vhci_rx.c */ 138 struct urb *pickup_urb_and_free_priv(struct vhci_device *vdev, __u32 seqnum); 139 int vhci_rx_loop(void *data); 140 141 /* vhci_tx.c */ 142 int vhci_tx_loop(void *data); 143 144 static inline __u32 port_to_rhport(__u32 port) 145 { 146 return port % VHCI_HC_PORTS; 147 } 148 149 static inline int port_to_pdev_nr(__u32 port) 150 { 151 return port / VHCI_PORTS; 152 } 153 154 static inline struct vhci_hcd *hcd_to_vhci_hcd(struct usb_hcd *hcd) 155 { 156 return (struct vhci_hcd *) (hcd->hcd_priv); 157 } 158 159 static inline struct device *hcd_dev(struct usb_hcd *hcd) 160 { 161 return (hcd)->self.controller; 162 } 163 164 static inline const char *hcd_name(struct usb_hcd *hcd) 165 { 166 return (hcd)->self.bus_name; 167 } 168 169 static inline struct usb_hcd *vhci_hcd_to_hcd(struct vhci_hcd *vhci_hcd) 170 { 171 return container_of((void *) vhci_hcd, struct usb_hcd, hcd_priv); 172 } 173 174 static inline struct vhci_hcd *vdev_to_vhci_hcd(struct vhci_device *vdev) 175 { 176 return container_of((void *)(vdev - vdev->rhport), struct vhci_hcd, vdev); 177 } 178 179 #endif /* __USBIP_VHCI_H */ 180