xref: /OK3568_Linux_fs/kernel/drivers/usb/gadget/function/tcm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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