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