projects/linux·blob master · refs

164 lines · 3.5 KiB

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