/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __TARGET_USB_GADGET_H__ #define __TARGET_USB_GADGET_H__ #include <linux/kref.h> /* #include <linux/usb/uas.h> */ #include <linux/usb/composite.h> #include <linux/usb/uas.h> #include <linux/usb/storage.h> #include <target/target_core_base.h> #include <target/target_core_fabric.h> #define USBG_NAMELEN 32 #define fuas_to_gadget(f) (f->function.config->cdev->gadget) #define UASP_SS_EP_COMP_LOG_STREAMS 4 #define UASP_SS_EP_COMP_NUM_STREAMS (1 << UASP_SS_EP_COMP_LOG_STREAMS) enum { USB_G_STR_INT_UAS = 0, USB_G_STR_INT_BBB, }; #define USB_G_ALT_INT_BBB 0 #define USB_G_ALT_INT_UAS 1 #define USB_G_DEFAULT_SESSION_TAGS 128 struct tcm_usbg_nexus { struct se_session *tvn_se_sess; }; struct usbg_tpg { struct mutex tpg_mutex; /* SAS port target portal group tag for TCM */ u16 tport_tpgt; /* Pointer back to usbg_tport */ struct usbg_tport *tport; struct workqueue_struct *workqueue; /* Returned by usbg_make_tpg() */ struct se_portal_group se_tpg; u32 gadget_connect; struct tcm_usbg_nexus *tpg_nexus; atomic_t tpg_port_count; struct usb_function_instance *fi; }; struct usbg_tport { /* Binary World Wide unique Port Name for SAS Target port */ u64 tport_wwpn; /* ASCII formatted WWPN for SAS Target port */ char tport_name[USBG_NAMELEN]; /* Returned by usbg_make_tport() */ struct se_wwn tport_wwn; }; enum uas_state { UASP_SEND_DATA, UASP_RECEIVE_DATA, UASP_SEND_STATUS, UASP_QUEUE_COMMAND, }; #define USBG_MAX_CMD 64 struct usbg_cmd { /* common */ u8 cmd_buf[USBG_MAX_CMD]; u32 data_len; struct work_struct work; int unpacked_lun; struct se_cmd se_cmd; void *data_buf; /* used if no sg support available */ struct f_uas *fu; struct completion write_complete; struct kref ref; /* UAS only */ u16 tag; u16 prio_attr; struct sense_iu sense_iu; enum uas_state state; struct uas_stream *stream; /* BOT only */ __le32 bot_tag; unsigned int csw_code; unsigned is_read:1; }; struct uas_stream { struct usb_request *req_in; struct usb_request *req_out; struct usb_request *req_status; }; struct usbg_cdb { struct usb_request *req; void *buf; }; struct bot_status { struct usb_request *req; struct bulk_cs_wrap csw; }; struct f_uas { struct usbg_tpg *tpg; struct usb_function function; u16 iface; u32 flags; #define USBG_ENABLED (1 << 0) #define USBG_IS_UAS (1 << 1) #define USBG_USE_STREAMS (1 << 2) #define USBG_IS_BOT (1 << 3) #define USBG_BOT_CMD_PEND (1 << 4) struct usbg_cdb cmd; struct usb_ep *ep_in; struct usb_ep *ep_out; /* UAS */ struct usb_ep *ep_status; struct usb_ep *ep_cmd; struct uas_stream stream[UASP_SS_EP_COMP_NUM_STREAMS]; /* BOT */ struct bot_status bot_status; struct usb_request *bot_req_in; struct usb_request *bot_req_out; }; #endif /* __TARGET_USB_GADGET_H__ */