1 /* 2 * Copyright (C) 2015 Karol Kosik <karo9@interia.eu> 3 * Copyright (C) 2015-2016 Samsung Electronics 4 * Igor Kotrasinski <i.kotrasinsk@samsung.com> 5 * Krzysztof Opasiak <k.opasiak@samsung.com> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 */ 20 21 #ifndef __USBIP_VUDC_H 22 #define __USBIP_VUDC_H 23 24 #include <linux/platform_device.h> 25 #include <linux/usb.h> 26 #include <linux/usb/gadget.h> 27 #include <linux/usb/ch9.h> 28 #include <linux/list.h> 29 #include <linux/timer.h> 30 #include <linux/time.h> 31 #include <linux/sysfs.h> 32 33 #include "usbip_common.h" 34 35 #define GADGET_NAME "usbip-vudc" 36 37 struct vep { 38 struct usb_ep ep; 39 unsigned type:2; /* type, as USB_ENDPOINT_XFER_* */ 40 char name[8]; /* space for ep name */ 41 42 const struct usb_endpoint_descriptor *desc; 43 struct usb_gadget *gadget; 44 struct list_head req_queue; /* Request queue */ 45 unsigned halted:1; 46 unsigned wedged:1; 47 unsigned already_seen:1; 48 unsigned setup_stage:1; 49 }; 50 51 struct vrequest { 52 struct usb_request req; 53 struct vudc *udc; 54 struct list_head req_entry; /* Request queue */ 55 }; 56 57 struct urbp { 58 struct urb *urb; 59 struct vep *ep; 60 struct list_head urb_entry; /* urb queue */ 61 unsigned long seqnum; 62 unsigned type:2; /* for tx, since ep type can change after */ 63 unsigned new:1; 64 }; 65 66 struct v_unlink { 67 unsigned long seqnum; 68 __u32 status; 69 }; 70 71 enum tx_type { 72 TX_UNLINK, 73 TX_SUBMIT, 74 }; 75 76 struct tx_item { 77 struct list_head tx_entry; 78 enum tx_type type; 79 union { 80 struct urbp *s; 81 struct v_unlink *u; 82 }; 83 }; 84 85 enum tr_state { 86 VUDC_TR_RUNNING, 87 VUDC_TR_IDLE, 88 VUDC_TR_STOPPED, 89 }; 90 91 struct transfer_timer { 92 struct timer_list timer; 93 enum tr_state state; 94 unsigned long frame_start; 95 int frame_limit; 96 }; 97 98 struct vudc { 99 struct usb_gadget gadget; 100 struct usb_gadget_driver *driver; 101 struct platform_device *pdev; 102 103 struct usb_device_descriptor dev_desc; 104 105 struct usbip_device ud; 106 struct transfer_timer tr_timer; 107 struct timeval start_time; 108 109 struct list_head urb_queue; 110 111 spinlock_t lock_tx; 112 struct list_head tx_queue; 113 wait_queue_head_t tx_waitq; 114 115 spinlock_t lock; 116 struct vep *ep; 117 int address; 118 u16 devstatus; 119 120 unsigned pullup:1; 121 unsigned connected:1; 122 unsigned desc_cached:1; 123 }; 124 125 struct vudc_device { 126 struct platform_device *pdev; 127 struct list_head dev_entry; 128 }; 129 130 extern const struct attribute_group vudc_attr_group; 131 132 /* visible everywhere */ 133 134 static inline struct vep *to_vep(struct usb_ep *_ep) 135 { 136 return container_of(_ep, struct vep, ep); 137 } 138 139 static inline struct vrequest *to_vrequest( 140 struct usb_request *_req) 141 { 142 return container_of(_req, struct vrequest, req); 143 } 144 145 static inline struct vudc *usb_gadget_to_vudc( 146 struct usb_gadget *_gadget) 147 { 148 return container_of(_gadget, struct vudc, gadget); 149 } 150 151 static inline struct vudc *ep_to_vudc(struct vep *ep) 152 { 153 return container_of(ep->gadget, struct vudc, gadget); 154 } 155 156 /* vudc_sysfs.c */ 157 158 int get_gadget_descs(struct vudc *udc); 159 160 /* vudc_tx.c */ 161 162 int v_tx_loop(void *data); 163 void v_enqueue_ret_unlink(struct vudc *udc, __u32 seqnum, __u32 status); 164 void v_enqueue_ret_submit(struct vudc *udc, struct urbp *urb_p); 165 166 /* vudc_rx.c */ 167 168 int v_rx_loop(void *data); 169 170 /* vudc_transfer.c */ 171 172 void v_init_timer(struct vudc *udc); 173 void v_start_timer(struct vudc *udc); 174 void v_kick_timer(struct vudc *udc, unsigned long time); 175 void v_stop_timer(struct vudc *udc); 176 177 /* vudc_dev.c */ 178 179 struct urbp *alloc_urbp(void); 180 void free_urbp_and_urb(struct urbp *urb_p); 181 182 struct vep *vudc_find_endpoint(struct vudc *udc, u8 address); 183 184 struct vudc_device *alloc_vudc_device(int devid); 185 void put_vudc_device(struct vudc_device *udc_dev); 186 187 int vudc_probe(struct platform_device *pdev); 188 int vudc_remove(struct platform_device *pdev); 189 190 #endif /* __USBIP_VUDC_H */ 191