vudc.h (3650B)
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright (C) 2015 Karol Kosik <karo9@interia.eu> 4 * Copyright (C) 2015-2016 Samsung Electronics 5 * Igor Kotrasinski <i.kotrasinsk@samsung.com> 6 * Krzysztof Opasiak <k.opasiak@samsung.com> 7 */ 8 9#ifndef __USBIP_VUDC_H 10#define __USBIP_VUDC_H 11 12#include <linux/platform_device.h> 13#include <linux/usb.h> 14#include <linux/usb/gadget.h> 15#include <linux/usb/ch9.h> 16#include <linux/list.h> 17#include <linux/timer.h> 18#include <linux/time.h> 19#include <linux/sysfs.h> 20 21#include "usbip_common.h" 22 23#define GADGET_NAME "usbip-vudc" 24 25struct vep { 26 struct usb_ep ep; 27 unsigned type:2; /* type, as USB_ENDPOINT_XFER_* */ 28 char name[8]; /* space for ep name */ 29 30 const struct usb_endpoint_descriptor *desc; 31 struct usb_gadget *gadget; 32 struct list_head req_queue; /* Request queue */ 33 unsigned halted:1; 34 unsigned wedged:1; 35 unsigned already_seen:1; 36 unsigned setup_stage:1; 37}; 38 39struct vrequest { 40 struct usb_request req; 41 struct vudc *udc; 42 struct list_head req_entry; /* Request queue */ 43}; 44 45struct urbp { 46 struct urb *urb; 47 struct vep *ep; 48 struct list_head urb_entry; /* urb queue */ 49 unsigned long seqnum; 50 unsigned type:2; /* for tx, since ep type can change after */ 51 unsigned new:1; 52}; 53 54struct v_unlink { 55 unsigned long seqnum; 56 __u32 status; 57}; 58 59enum tx_type { 60 TX_UNLINK, 61 TX_SUBMIT, 62}; 63 64struct tx_item { 65 struct list_head tx_entry; 66 enum tx_type type; 67 union { 68 struct urbp *s; 69 struct v_unlink *u; 70 }; 71}; 72 73enum tr_state { 74 VUDC_TR_RUNNING, 75 VUDC_TR_IDLE, 76 VUDC_TR_STOPPED, 77}; 78 79struct transfer_timer { 80 struct timer_list timer; 81 enum tr_state state; 82 unsigned long frame_start; 83 int frame_limit; 84}; 85 86struct vudc { 87 struct usb_gadget gadget; 88 struct usb_gadget_driver *driver; 89 struct platform_device *pdev; 90 91 struct usb_device_descriptor dev_desc; 92 93 struct usbip_device ud; 94 struct transfer_timer tr_timer; 95 struct timespec64 start_time; 96 97 struct list_head urb_queue; 98 99 spinlock_t lock_tx; 100 struct list_head tx_queue; 101 wait_queue_head_t tx_waitq; 102 103 spinlock_t lock; 104 struct vep *ep; 105 int address; 106 u16 devstatus; 107 108 unsigned pullup:1; 109 unsigned connected:1; 110 unsigned desc_cached:1; 111}; 112 113struct vudc_device { 114 struct platform_device *pdev; 115 struct list_head dev_entry; 116}; 117 118extern const struct attribute_group *vudc_groups[]; 119 120/* visible everywhere */ 121 122static inline struct vep *to_vep(struct usb_ep *_ep) 123{ 124 return container_of(_ep, struct vep, ep); 125} 126 127static inline struct vrequest *to_vrequest( 128 struct usb_request *_req) 129{ 130 return container_of(_req, struct vrequest, req); 131} 132 133static inline struct vudc *usb_gadget_to_vudc( 134 struct usb_gadget *_gadget) 135{ 136 return container_of(_gadget, struct vudc, gadget); 137} 138 139static inline struct vudc *ep_to_vudc(struct vep *ep) 140{ 141 return container_of(ep->gadget, struct vudc, gadget); 142} 143 144/* vudc_sysfs.c */ 145 146int get_gadget_descs(struct vudc *udc); 147 148/* vudc_tx.c */ 149 150int v_tx_loop(void *data); 151void v_enqueue_ret_unlink(struct vudc *udc, __u32 seqnum, __u32 status); 152void v_enqueue_ret_submit(struct vudc *udc, struct urbp *urb_p); 153 154/* vudc_rx.c */ 155 156int v_rx_loop(void *data); 157 158/* vudc_transfer.c */ 159 160void v_init_timer(struct vudc *udc); 161void v_start_timer(struct vudc *udc); 162void v_kick_timer(struct vudc *udc, unsigned long time); 163void v_stop_timer(struct vudc *udc); 164 165/* vudc_dev.c */ 166 167struct urbp *alloc_urbp(void); 168void free_urbp_and_urb(struct urbp *urb_p); 169 170struct vep *vudc_find_endpoint(struct vudc *udc, u8 address); 171 172struct vudc_device *alloc_vudc_device(int devid); 173void put_vudc_device(struct vudc_device *udc_dev); 174 175int vudc_probe(struct platform_device *pdev); 176int vudc_remove(struct platform_device *pdev); 177 178#endif /* __USBIP_VUDC_H */