1 /* 2 * Copyright (C) 2003-2008 Takahiro Hirofuchi 3 * 4 * This is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 */ 10 11 #ifndef __USBIP_VHCI_H 12 #define __USBIP_VHCI_H 13 14 #include <linux/device.h> 15 #include <linux/list.h> 16 #include <linux/spinlock.h> 17 #include <linux/sysfs.h> 18 #include <linux/types.h> 19 #include <linux/usb.h> 20 #include <linux/usb/hcd.h> 21 #include <linux/wait.h> 22 23 struct vhci_device { 24 struct usb_device *udev; 25 26 /* 27 * devid specifies a remote usb device uniquely instead 28 * of combination of busnum and devnum. 29 */ 30 __u32 devid; 31 32 /* speed of a remote device */ 33 enum usb_device_speed speed; 34 35 /* vhci root-hub port to which this device is attached */ 36 __u32 rhport; 37 38 struct usbip_device ud; 39 40 /* lock for the below link lists */ 41 spinlock_t priv_lock; 42 43 /* vhci_priv is linked to one of them. */ 44 struct list_head priv_tx; 45 struct list_head priv_rx; 46 47 /* vhci_unlink is linked to one of them */ 48 struct list_head unlink_tx; 49 struct list_head unlink_rx; 50 51 /* vhci_tx thread sleeps for this queue */ 52 wait_queue_head_t waitq_tx; 53 }; 54 55 /* urb->hcpriv, use container_of() */ 56 struct vhci_priv { 57 unsigned long seqnum; 58 struct list_head list; 59 60 struct vhci_device *vdev; 61 struct urb *urb; 62 }; 63 64 struct vhci_unlink { 65 /* seqnum of this request */ 66 unsigned long seqnum; 67 68 struct list_head list; 69 70 /* seqnum of the unlink target */ 71 unsigned long unlink_seqnum; 72 }; 73 74 /* 75 * The number of ports is less than 16 ? 76 * USB_MAXCHILDREN is statically defined to 16 in usb.h. Its maximum value 77 * would be 31 because the event_bits[1] of struct usb_hub is defined as 78 * unsigned long in hub.h 79 */ 80 #define VHCI_NPORTS 8 81 82 /* for usb_bus.hcpriv */ 83 struct vhci_hcd { 84 spinlock_t lock; 85 86 u32 port_status[VHCI_NPORTS]; 87 88 unsigned resuming:1; 89 unsigned long re_timeout; 90 91 atomic_t seqnum; 92 93 /* 94 * NOTE: 95 * wIndex shows the port number and begins from 1. 96 * But, the index of this array begins from 0. 97 */ 98 struct vhci_device vdev[VHCI_NPORTS]; 99 }; 100 101 extern struct vhci_hcd *the_controller; 102 extern const struct attribute_group dev_attr_group; 103 #define hardware (&the_controller->pdev.dev) 104 105 /* vhci_hcd.c */ 106 void rh_port_connect(int rhport, enum usb_device_speed speed); 107 void rh_port_disconnect(int rhport); 108 109 /* vhci_rx.c */ 110 struct urb *pickup_urb_and_free_priv(struct vhci_device *vdev, __u32 seqnum); 111 int vhci_rx_loop(void *data); 112 113 /* vhci_tx.c */ 114 int vhci_tx_loop(void *data); 115 port_to_vdev(__u32 port)116static inline struct vhci_device *port_to_vdev(__u32 port) 117 { 118 return &the_controller->vdev[port]; 119 } 120 hcd_to_vhci(struct usb_hcd * hcd)121static inline struct vhci_hcd *hcd_to_vhci(struct usb_hcd *hcd) 122 { 123 return (struct vhci_hcd *) (hcd->hcd_priv); 124 } 125 vhci_to_hcd(struct vhci_hcd * vhci)126static inline struct usb_hcd *vhci_to_hcd(struct vhci_hcd *vhci) 127 { 128 return container_of((void *) vhci, struct usb_hcd, hcd_priv); 129 } 130 vhci_dev(struct vhci_hcd * vhci)131static inline struct device *vhci_dev(struct vhci_hcd *vhci) 132 { 133 return vhci_to_hcd(vhci)->self.controller; 134 } 135 136 #endif /* __USBIP_VHCI_H */ 137