GNU Linux-libre 4.19.245-gnu1
[releases.git] / drivers / staging / rtl8188eu / include / rtw_cmd.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 #ifndef __RTW_CMD_H_
8 #define __RTW_CMD_H_
9
10 #include <wlan_bssdef.h>
11 #include <rtw_rf.h>
12 #include <rtw_led.h>
13
14 #include <osdep_service.h>
15 #include <ieee80211.h> /*  <ieee80211/ieee80211.h> */
16
17 #define MAX_CMDSZ       1024
18 #define MAX_RSPSZ       512
19
20 #define CMDBUFF_ALIGN_SZ 512
21
22 struct cmd_obj {
23         struct adapter *padapter;
24         u16     cmdcode;
25         u8      res;
26         u8      *parmbuf;
27         u32     cmdsz;
28         u8      *rsp;
29         u32     rspsz;
30         struct list_head list;
31 };
32
33 struct cmd_priv {
34         struct completion cmd_queue_comp;
35         struct completion terminate_cmdthread_comp;
36         struct __queue cmd_queue;
37         u8 cmdthd_running;
38         struct adapter *padapter;
39 };
40
41 #define init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code) \
42 do {\
43         INIT_LIST_HEAD(&pcmd->list);\
44         pcmd->cmdcode = code;\
45         pcmd->parmbuf = (u8 *)(pparm);\
46         pcmd->cmdsz = sizeof(*pparm);\
47         pcmd->rsp = NULL;\
48         pcmd->rspsz = 0;\
49 } while (0)
50
51 u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj);
52 struct cmd_obj *rtw_dequeue_cmd(struct __queue *queue);
53 void rtw_free_cmd_obj(struct cmd_obj *pcmd);
54
55 int rtw_cmd_thread(void *context);
56
57 int rtw_init_cmd_priv(struct cmd_priv *pcmdpriv);
58
59 enum rtw_drvextra_cmd_id {
60         NONE_WK_CID,
61         DYNAMIC_CHK_WK_CID,
62         DM_CTRL_WK_CID,
63         PBC_POLLING_WK_CID,
64         POWER_SAVING_CTRL_WK_CID,/* IPS,AUTOSuspend */
65         LPS_CTRL_WK_CID,
66         ANT_SELECT_WK_CID,
67         P2P_PS_WK_CID,
68         P2P_PROTO_WK_CID,
69         CHECK_HIQ_WK_CID,/* for softap mode, check hi queue if empty */
70         INTEl_WIDI_WK_CID,
71         C2H_WK_CID,
72         RTP_TIMER_CFG_WK_CID,
73         MAX_WK_CID
74 };
75
76 enum LPS_CTRL_TYPE {
77         LPS_CTRL_SCAN = 0,
78         LPS_CTRL_JOINBSS = 1,
79         LPS_CTRL_CONNECT = 2,
80         LPS_CTRL_DISCONNECT = 3,
81         LPS_CTRL_SPECIAL_PACKET = 4,
82         LPS_CTRL_LEAVE = 5,
83 };
84
85 enum RFINTFS {
86         SWSI,
87         HWSI,
88         HWPI,
89 };
90
91 /*
92  * Caller Mode: Infra, Ad-HoC(C)
93  *
94  * Notes: To disconnect the current associated BSS
95  *
96  * Command Mode
97  *
98  */
99 struct disconnect_parm {
100         u32 deauth_timeout_ms;
101 };
102
103 struct  setopmode_parm {
104         u8      mode;
105         u8      rsvd[3];
106 };
107
108 /*
109  * Caller Mode: AP, Ad-HoC, Infra
110  *
111  * Notes: To ask RTL8711 performing site-survey
112  *
113  * Command-Event Mode
114  *
115  */
116
117 #define RTW_SSID_SCAN_AMOUNT 9 /*  for WEXT_CSCAN_AMOUNT 9 */
118 #define RTW_CHANNEL_SCAN_AMOUNT (14+37)
119 struct sitesurvey_parm {
120         int scan_mode;  /* active: 1, passive: 0 */
121         u8 ssid_num;
122         u8 ch_num;
123         struct ndis_802_11_ssid ssid[RTW_SSID_SCAN_AMOUNT];
124         struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
125 };
126
127 /*
128  * Caller Mode: Any
129  *
130  * Notes: To set the auth type of RTL8711. open/shared/802.1x
131  *
132  * Command Mode
133  *
134  */
135 struct setauth_parm {
136         u8 mode;  /* 0: legacy open, 1: legacy shared 2: 802.1x */
137         u8 _1x;   /* 0: PSK, 1: TLS */
138         u8 rsvd[2];
139 };
140
141 /*
142  * Caller Mode: Infra
143  *
144  * a. algorithm: wep40, wep104, tkip & aes
145  * b. keytype: grp key/unicast key
146  * c. key contents
147  *
148  * when shared key ==> keyid is the camid
149  * when 802.1x ==> keyid [0:1] ==> grp key
150  * when 802.1x ==> keyid > 2 ==> unicast key
151  *
152  */
153 struct setkey_parm {
154         u8      algorithm;      /* could be none, wep40, TKIP, CCMP, wep104 */
155         u8      keyid;
156         u8      grpkey;         /* 1: this is the grpkey for 802.1x.
157                                  * 0: this is the unicast key for 802.1x
158                                  */
159         u8      set_tx;         /* 1: main tx key for wep. 0: other key. */
160         u8      key[16];        /* this could be 40 or 104 */
161 };
162
163 /*
164  * When in AP or Ad-Hoc mode, this is used to
165  * allocate an sw/hw entry for a newly associated sta.
166  *
167  * Command
168  *
169  * when shared key ==> algorithm/keyid
170  *
171  */
172 struct set_stakey_parm {
173         u8      addr[ETH_ALEN];
174         u8      algorithm;
175         u8      id;/* currently for erasing cam entry if
176                     * algorithm == _NO_PRIVACY_
177                     */
178         u8      key[16];
179 };
180
181 struct set_stakey_rsp {
182         u8      addr[ETH_ALEN];
183         u8      keyid;
184         u8      rsvd;
185 };
186
187 /*
188  * Caller Ad-Hoc/AP
189  *
190  * Command -Rsp(AID == CAMID) mode
191  *
192  * This is to force fw to add an sta_data entry per driver's request.
193  *
194  * FW will write an cam entry associated with it.
195  *
196  */
197 struct set_assocsta_parm {
198         u8      addr[ETH_ALEN];
199 };
200
201 struct set_assocsta_rsp {
202         u8      cam_id;
203         u8      rsvd[3];
204 };
205
206 /*
207  *      Notes: This command is used for H2C/C2H loopback testing
208  *
209  *      mac[0] == 0
210  *      ==> CMD mode, return H2C_SUCCESS.
211  *      The following condition must be true under CMD mode
212  *              mac[1] == mac[4], mac[2] == mac[3], mac[0]=mac[5]= 0;
213  *              s0 == 0x1234, s1 == 0xabcd, w0 == 0x78563412, w1 == 0x5aa5def7;
214  *              s2 == (b1 << 8 | b0);
215  *
216  *      mac[0] == 1
217  *      ==> CMD_RSP mode, return H2C_SUCCESS_RSP
218  *
219  *      The rsp layout shall be:
220  *      rsp:                    parm:
221  *              mac[0]  =   mac[5];
222  *              mac[1]  =   mac[4];
223  *              mac[2]  =   mac[3];
224  *              mac[3]  =   mac[2];
225  *              mac[4]  =   mac[1];
226  *              mac[5]  =   mac[0];
227  *              s0              =   s1;
228  *              s1              =   swap16(s0);
229  *              w0              =       swap32(w1);
230  *              b0              =       b1
231  *              s2              =       s0 + s1
232  *              b1              =       b0
233  *              w1              =       w0
234  *
235  *      mac[0] ==       2
236  *      ==> CMD_EVENT mode, return      H2C_SUCCESS
237  *      The event layout shall be:
238  *      event:                  parm:
239  *              mac[0]  =   mac[5];
240  *              mac[1]  =   mac[4];
241  *              mac[2]  =   event's seq no, starting from 1 to parm's marc[3]
242  *              mac[2]  =   event's seq no, starting from 1 to parm's marc[3]
243  *              mac[2]  =   event's seq no, starting from 1 to parm's marc[3]
244  *              mac[3]  =   mac[2];
245  *              mac[4]  =   mac[1];
246  *              mac[5]  =   mac[0];
247  *              s0              =   swap16(s0) - event.mac[2];
248  *              s1              =   s1 + event.mac[2];
249  *              w0              =       swap32(w0);
250  *              b0              =       b1
251  *              s2              =       s0 + event.mac[2]
252  *              b1              =       b0
253  *              w1              =       swap32(w1) - event.mac[2];
254  *
255  *              parm->mac[3] is the total event counts that host requested.
256  *      event will be the same with the cmd's param.
257  */
258
259 /*  CMD param Format for driver extra cmd handler */
260 struct drvextra_cmd_parm {
261         int ec_id; /* extra cmd id */
262         int type_size; /*  Can use this field as the type id or command size */
263         unsigned char *pbuf;
264 };
265
266 struct addBaReq_parm {
267         unsigned int tid;
268         u8      addr[ETH_ALEN];
269 };
270
271 /*H2C Handler index: 46 */
272 struct set_ch_parm {
273         u8 ch;
274         u8 bw;
275         u8 ch_offset;
276 };
277
278 /*H2C Handler index: 59 */
279 struct SetChannelPlan_param {
280         u8 channel_plan;
281 };
282
283 /*
284  *
285  * Result:
286  * 0x00: success
287  * 0x01: success, and check Response.
288  * 0x02: cmd ignored due to duplicated sequcne number
289  * 0x03: cmd dropped due to invalid cmd code
290  * 0x04: reserved.
291  *
292  */
293
294 #define H2C_SUCCESS             0x00
295 #define H2C_SUCCESS_RSP         0x01
296 #define H2C_DROPPED             0x03
297 #define H2C_PARAMETERS_ERROR    0x04
298 #define H2C_REJECTED            0x05
299
300 u8 rtw_sitesurvey_cmd(struct adapter *padapter, struct ndis_802_11_ssid *ssid,
301                       int ssid_num, struct rtw_ieee80211_channel *ch,
302                       int ch_num);
303 u8 rtw_createbss_cmd(struct adapter *padapter);
304 u8 rtw_setstakey_cmd(struct adapter *padapter, u8 *psta, u8 unicast_key);
305 u8 rtw_clearstakey_cmd(struct adapter *padapter, u8 *psta, u8 entry,
306                        u8 enqueue);
307 u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network *pnetwork);
308 u8 rtw_disassoc_cmd(struct adapter *padapter, u32 deauth_timeout_ms,
309                     bool enqueue);
310 u8 rtw_setopmode_cmd(struct adapter *padapter,
311                      enum ndis_802_11_network_infra networktype);
312 u8 rtw_addbareq_cmd(struct adapter *padapter, u8 tid, u8 *addr);
313
314 u8 rtw_dynamic_chk_wk_cmd(struct adapter *adapter);
315
316 u8 rtw_lps_ctrl_wk_cmd(struct adapter *padapter, u8 lps_ctrl_type, u8 enqueue);
317 u8 rtw_rpt_timer_cfg_cmd(struct adapter *padapter, u16 minRptTime);
318
319 u8 rtw_antenna_select_cmd(struct adapter *padapter, u8 antenna, u8 enqueue);
320 u8 rtw_ps_cmd(struct adapter *padapter);
321
322 #ifdef CONFIG_88EU_AP_MODE
323 u8 rtw_chk_hi_queue_cmd(struct adapter *padapter);
324 #endif
325
326 u8 rtw_set_chplan_cmd(struct adapter *padapter, u8 chplan, u8 enqueue);
327 u8 rtw_drvextra_cmd_hdl(struct adapter *padapter, unsigned char *pbuf);
328
329 void rtw_survey_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd);
330 void rtw_disassoc_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd);
331 void rtw_joinbss_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd);
332 void rtw_createbss_cmd_callback(struct adapter *adapt, struct cmd_obj *pcmd);
333 void rtw_readtssi_cmdrsp_callback(struct adapter *adapt, struct cmd_obj *cmd);
334
335 void rtw_setstaKey_cmdrsp_callback(struct adapter *adapt, struct cmd_obj *cmd);
336 void rtw_setassocsta_cmdrsp_callback(struct adapter *adapt, struct cmd_obj *cm);
337 void rtw_getrttbl_cmdrsp_callback(struct adapter *adapt, struct cmd_obj *cmd);
338
339 struct _cmd_callback {
340         u32     cmd_code;
341         void (*callback)(struct adapter  *padapter, struct cmd_obj *cmd);
342 };
343
344 enum rtw_h2c_cmd {
345         _JoinBss_CMD_,
346         _DisConnect_CMD_,
347         _CreateBss_CMD_,
348         _SetOpMode_CMD_,
349         _SiteSurvey_CMD_,
350         _SetAuth_CMD_,
351         _SetKey_CMD_,
352         _SetStaKey_CMD_,
353         _SetAssocSta_CMD_,
354         _AddBAReq_CMD_,
355         _SetChannel_CMD_,
356         _TX_Beacon_CMD_,
357         _Set_MLME_EVT_CMD_,
358         _Set_Drv_Extra_CMD_,
359         _SetChannelPlan_CMD_,
360
361         MAX_H2CCMD
362 };
363
364 #ifdef _RTW_CMD_C_
365 static struct _cmd_callback     rtw_cmd_callback[] = {
366         {_JoinBss_CMD_, &rtw_joinbss_cmd_callback},
367         {_DisConnect_CMD_, &rtw_disassoc_cmd_callback},
368         {_CreateBss_CMD_, &rtw_createbss_cmd_callback},
369         {_SetOpMode_CMD_, NULL},
370         {_SiteSurvey_CMD_, &rtw_survey_cmd_callback},
371         {_SetAuth_CMD_, NULL},
372         {_SetKey_CMD_, NULL},
373         {_SetStaKey_CMD_, &rtw_setstaKey_cmdrsp_callback},
374         {_SetAssocSta_CMD_, &rtw_setassocsta_cmdrsp_callback},
375         {_AddBAReq_CMD_, NULL},
376         {_SetChannel_CMD_, NULL},
377         {_TX_Beacon_CMD_, NULL},
378         {_Set_MLME_EVT_CMD_, NULL},
379         {_Set_Drv_Extra_CMD_, NULL},
380         {_SetChannelPlan_CMD_, NULL},
381 };
382 #endif
383
384 #endif /*  _CMD_H_ */