at v4.13 134 lines 2.8 kB view raw
1#ifndef __TARGET_USB_GADGET_H__ 2#define __TARGET_USB_GADGET_H__ 3 4#include <linux/kref.h> 5/* #include <linux/usb/uas.h> */ 6#include <linux/usb/composite.h> 7#include <linux/usb/uas.h> 8#include <linux/usb/storage.h> 9#include <target/target_core_base.h> 10#include <target/target_core_fabric.h> 11 12#define USBG_NAMELEN 32 13 14#define fuas_to_gadget(f) (f->function.config->cdev->gadget) 15#define UASP_SS_EP_COMP_LOG_STREAMS 4 16#define UASP_SS_EP_COMP_NUM_STREAMS (1 << UASP_SS_EP_COMP_LOG_STREAMS) 17 18enum { 19 USB_G_STR_INT_UAS = 0, 20 USB_G_STR_INT_BBB, 21}; 22 23#define USB_G_ALT_INT_BBB 0 24#define USB_G_ALT_INT_UAS 1 25 26#define USB_G_DEFAULT_SESSION_TAGS 128 27 28struct tcm_usbg_nexus { 29 struct se_session *tvn_se_sess; 30}; 31 32struct usbg_tpg { 33 struct mutex tpg_mutex; 34 /* SAS port target portal group tag for TCM */ 35 u16 tport_tpgt; 36 /* Pointer back to usbg_tport */ 37 struct usbg_tport *tport; 38 struct workqueue_struct *workqueue; 39 /* Returned by usbg_make_tpg() */ 40 struct se_portal_group se_tpg; 41 u32 gadget_connect; 42 struct tcm_usbg_nexus *tpg_nexus; 43 atomic_t tpg_port_count; 44 45 struct usb_function_instance *fi; 46}; 47 48struct usbg_tport { 49 /* Binary World Wide unique Port Name for SAS Target port */ 50 u64 tport_wwpn; 51 /* ASCII formatted WWPN for SAS Target port */ 52 char tport_name[USBG_NAMELEN]; 53 /* Returned by usbg_make_tport() */ 54 struct se_wwn tport_wwn; 55}; 56 57enum uas_state { 58 UASP_SEND_DATA, 59 UASP_RECEIVE_DATA, 60 UASP_SEND_STATUS, 61 UASP_QUEUE_COMMAND, 62}; 63 64#define USBG_MAX_CMD 64 65struct usbg_cmd { 66 /* common */ 67 u8 cmd_buf[USBG_MAX_CMD]; 68 u32 data_len; 69 struct work_struct work; 70 int unpacked_lun; 71 struct se_cmd se_cmd; 72 void *data_buf; /* used if no sg support available */ 73 struct f_uas *fu; 74 struct completion write_complete; 75 struct kref ref; 76 77 /* UAS only */ 78 u16 tag; 79 u16 prio_attr; 80 struct sense_iu sense_iu; 81 enum uas_state state; 82 struct uas_stream *stream; 83 84 /* BOT only */ 85 __le32 bot_tag; 86 unsigned int csw_code; 87 unsigned is_read:1; 88 89}; 90 91struct uas_stream { 92 struct usb_request *req_in; 93 struct usb_request *req_out; 94 struct usb_request *req_status; 95}; 96 97struct usbg_cdb { 98 struct usb_request *req; 99 void *buf; 100}; 101 102struct bot_status { 103 struct usb_request *req; 104 struct bulk_cs_wrap csw; 105}; 106 107struct f_uas { 108 struct usbg_tpg *tpg; 109 struct usb_function function; 110 u16 iface; 111 112 u32 flags; 113#define USBG_ENABLED (1 << 0) 114#define USBG_IS_UAS (1 << 1) 115#define USBG_USE_STREAMS (1 << 2) 116#define USBG_IS_BOT (1 << 3) 117#define USBG_BOT_CMD_PEND (1 << 4) 118 119 struct usbg_cdb cmd; 120 struct usb_ep *ep_in; 121 struct usb_ep *ep_out; 122 123 /* UAS */ 124 struct usb_ep *ep_status; 125 struct usb_ep *ep_cmd; 126 struct uas_stream stream[UASP_SS_EP_COMP_NUM_STREAMS]; 127 128 /* BOT */ 129 struct bot_status bot_status; 130 struct usb_request *bot_req_in; 131 struct usb_request *bot_req_out; 132}; 133 134#endif /* __TARGET_USB_GADGET_H__ */