#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 <scsi/scsi.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_CONFIG = USB_GADGET_FIRST_AVAIL_IDX, USB_G_STR_INT_UAS, USB_G_STR_INT_BBB, }; #define USB_G_ALT_INT_BBB 0 #define USB_G_ALT_INT_UAS 1 struct usbg_nacl { /* Binary World Wide unique Port Name for SAS Initiator port */ u64 iport_wwpn; /* ASCII formatted WWPN for Sas Initiator port */ char iport_name[USBG_NAMELEN]; /* Returned by usbg_make_nodeacl() */ struct se_node_acl se_node_acl; }; 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 usbg_tport { /* SCSI protocol the tport is providing */ u8 tport_proto_id; /* 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; }; extern struct usbg_tpg *the_only_tpg_I_currently_have; #endif