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