xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852bs/os_dep/linux/ioctl_mp.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2019 Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  *****************************************************************************/
15 #if defined(CONFIG_MP_INCLUDED)
16 
17 #include <drv_types.h>
18 #include <rtw_mp.h>
19 
20 #define RTW_IWD_MAX_LEN	128
21 
22 /*
23  * Input Format: %s,%d,%d
24  *	%s is width, could be
25  *		"b" for 1 byte
26  *		"w" for WORD (2 bytes)
27  *		"dw" for DWORD (4 bytes)
28  *	1st %d is address(offset)
29  *	2st %d is data to write
30  */
31 
rtw_mp_write_reg(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)32 int rtw_mp_write_reg(struct net_device *dev,
33 		     struct iw_request_info *info,
34 		     struct iw_point *wrqu, char *extra)
35 {
36 	char *pch, *pnext;
37 	char *width_str;
38 	char width;
39 	u32 addr, data;
40 	int ret;
41 	_adapter *padapter = rtw_netdev_priv(dev);
42 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
43 	char input[RTW_IWD_MAX_LEN];
44 	struct rtw_mp_reg_arg	reg_arg;
45 
46 	_rtw_memset(input, 0, sizeof(input));
47 
48 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
49 		return -EFAULT;
50 
51 	input[wrqu->length] = '\0';
52 
53 	_rtw_memset(extra, 0, wrqu->length);
54 
55 	pch = input;
56 
57 	pnext = strpbrk(pch, " ,.-");
58 	if (pnext == NULL)
59 		return -EINVAL;
60 	*pnext = 0;
61 	width_str = pch;
62 
63 	pch = pnext + 1;
64 	pnext = strpbrk(pch, " ,.-");
65 	if (pnext == NULL)
66 		return -EINVAL;
67 	*pnext = 0;
68 
69 	ret = sscanf(pch, "%x", &addr);
70 
71 	pch = pnext + 1;
72 	pnext = strpbrk(pch, " ,.-");
73 	if ((pch - input) >= wrqu->length)
74 		return -EINVAL;
75 
76 	ret = sscanf(pch, "%x", &data);
77 	RTW_INFO("data=%x,addr=%x\n", (u32)data, (u32)addr);
78 	ret = 0;
79 	width = width_str[0];
80 	switch (width) {
81 	case 'b':
82 		/* 1 byte*/
83 		if (data > 0xFF) {
84 			ret = -EINVAL;
85 			break;
86 		}
87 		reg_arg.io_offset = addr;
88 		reg_arg.io_type = 1;
89 		reg_arg.io_value = (u8)data;
90 
91 		if (rtw_mp_phl_reg(padapter, &reg_arg, RTW_MP_REG_CMD_WRITE_BB))
92 			RTW_INFO("write data=%x,addr=%x OK\n", (u8)data, addr);
93 		else
94 			RTW_INFO("write data=%x,addr=%x fail\n", (u8)data, addr);
95 		break;
96 	case 'w':
97 		/* 2 bytes*/
98 		if (data > 0xFFFF) {
99 			ret = -EINVAL;
100 			break;
101 		}
102 		reg_arg.io_offset = addr;
103 		reg_arg.io_type = 2;
104 		reg_arg.io_value = (u16)data;
105 
106 		if (rtw_mp_phl_reg(padapter, &reg_arg, RTW_MP_REG_CMD_WRITE_BB))
107 			RTW_INFO("write data=%x,addr=%x OK\n", (u16)data, addr);
108 		else
109 			RTW_INFO("write data=%x,addr=%x fail\n", (u16)data, addr);
110 		break;
111 	case 'd':
112 		/* 4 bytes*/
113 		reg_arg.io_offset = addr;
114 		reg_arg.io_type = 4;
115 		reg_arg.io_value = data;
116 
117 		if (rtw_mp_phl_reg(padapter, &reg_arg, RTW_MP_REG_CMD_WRITE_BB))
118 			RTW_INFO("write data=%x,addr=%x OK\n", data, addr);
119 		else
120 			RTW_INFO("write data=%x,addr=%x fail\n", data, addr);
121 		break;
122 	default:
123 		ret = -EINVAL;
124 		break;
125 	}
126 
127 	return ret;
128 }
129 
130 
131 /*
132  * Input Format: %s,%d
133  *	%s is width, could be
134  *		"b" for 1 byte
135  *		"w" for WORD (2 bytes)
136  *		"dw" for DWORD (4 bytes)
137  *	%d is address(offset)
138  *
139  * Return:
140  *	%d for data readed
141  */
rtw_mp_read_reg(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)142 int rtw_mp_read_reg(struct net_device *dev,
143 		    struct iw_request_info *info,
144 		    struct iw_point *wrqu, char *extra)
145 {
146 	char input[RTW_IWD_MAX_LEN];
147 	char *pch, *pnext;
148 	char *width_str;
149 	char width;
150 	char data[20], tmp[20];
151 	u32 addr = 0, strtout = 0;
152 	u32 i = 0, j = 0, ret = 0, data32 = 0;
153 	_adapter *padapter = rtw_netdev_priv(dev);
154 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
155 	struct rtw_mp_reg_arg	reg_arg;
156 
157 	char *pextra = extra;
158 
159 	if (wrqu->length > 128)
160 		return -EFAULT;
161 
162 	_rtw_memset(input, 0, sizeof(input));
163 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
164 		return -EFAULT;
165 
166 	input[wrqu->length] = '\0';
167 	_rtw_memset(extra, 0, wrqu->length);
168 	_rtw_memset(data, '\0', sizeof(data));
169 	_rtw_memset(tmp, '\0', sizeof(tmp));
170 	pch = input;
171 	pnext = strpbrk(pch, " ,.-");
172 	if (pnext == NULL)
173 		return -EINVAL;
174 	*pnext = 0;
175 	width_str = pch;
176 
177 	pch = pnext + 1;
178 
179 	ret = sscanf(pch, "%x", &addr);
180 
181 	ret = 0;
182 	width = width_str[0];
183 
184 	switch (width) {
185 	case 'b':
186 		reg_arg.io_offset = addr;
187 		reg_arg.io_type = 1;
188 
189 		if (rtw_mp_phl_reg(padapter, &reg_arg, RTW_MP_REG_CMD_READ_BB)) {
190 			data32 = reg_arg.io_value; //rtw_phl_read8(dvobj->phl, addr);
191 			RTW_INFO("reg=%x\n", data32);
192 			sprintf(extra, "%d", data32);
193 		} else
194 			sprintf(extra, "reg io fail\n");
195 
196 		wrqu->length = strlen(extra);
197 		break;
198 	case 'w':
199 		/* 2 bytes*/
200 		reg_arg.io_offset = addr;
201 		reg_arg.io_type = 2;
202 
203 		if (rtw_mp_phl_reg(padapter, &reg_arg, RTW_MP_REG_CMD_READ_BB)) {
204 			sprintf(data, "%04x", reg_arg.io_value);
205 			RTW_INFO("reg=%s\n", data);
206 		} else
207 			sprintf(extra, "reg io fail\n");
208 
209 		for (i = 0 ; i <= strlen(data) ; i++) {
210 			if (i % 2 == 0) {
211 				tmp[j] = ' ';
212 				j++;
213 			}
214 			if (data[i] != '\0')
215 				tmp[j] = data[i];
216 
217 			j++;
218 		}
219 		tmp[j]='\0';
220 
221 		pch = tmp;
222 		RTW_INFO("pch=%s", pch);
223 
224 		while (*pch != '\0') {
225 			pnext = strpbrk(pch, " ");
226 			if (!pnext || ((pnext - tmp) > 4))
227 				break;
228 
229 			pnext++;
230 			if (*pnext != '\0') {
231 				/*strtout = simple_strtoul(pnext , &ptmp, 16);*/
232 				ret = sscanf(pnext, "%x", &strtout);
233 				pextra += sprintf(pextra, " %d", strtout);
234 			} else
235 				break;
236 			pch = pnext;
237 		}
238 		wrqu->length = strlen(extra);
239 		break;
240 	case 'd':
241 		/* 4 bytes */
242 		reg_arg.io_offset = addr;
243 		reg_arg.io_type = 4;
244 
245 		if (rtw_mp_phl_reg(padapter, &reg_arg, RTW_MP_REG_CMD_READ_BB)) {
246 			sprintf(data, "%08x", reg_arg.io_value);
247 			RTW_INFO("reg=%s\n", data);
248 		} else
249 			sprintf(extra, "reg io fail\n");
250 
251 		/*add read data format blank*/
252 		for (i = 0 ; i <= strlen(data) ; i++) {
253 			if (i % 2 == 0) {
254 				tmp[j] = ' ';
255 				j++;
256 			}
257 			if (data[i] != '\0')
258 				tmp[j] = data[i];
259 
260 			j++;
261 		}
262 
263 		pch = tmp;
264 		RTW_INFO("pch=%s", pch);
265 
266 		while (*pch != '\0') {
267 			pnext = strpbrk(pch, " ");
268 			if (!pnext)
269 				break;
270 
271 			pnext++;
272 			if (*pnext != '\0') {
273 				ret = sscanf(pnext, "%x", &strtout);
274 				pextra += sprintf(pextra, " %d", strtout);
275 			} else
276 				break;
277 			pch = pnext;
278 		}
279 		wrqu->length = strlen(extra);
280 		break;
281 
282 	default:
283 		wrqu->length = 0;
284 		ret = -EINVAL;
285 		break;
286 	}
287 
288 	return ret;
289 }
290 
291 
292 /*
293  * Input Format: %d,%x,%x
294  *	%d is RF path, should be smaller than MAX_RF_PATH_NUMS
295  *	1st %x is address(offset)
296  *	2st %x is data to write
297  */
rtw_mp_write_rf(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)298 int rtw_mp_write_rf(struct net_device *dev,
299 		    struct iw_request_info *info,
300 		    struct iw_point *wrqu, char *extra)
301 {
302 
303 	u32 path, addr, data;
304 	int ret;
305 	_adapter *padapter = rtw_netdev_priv(dev);
306 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
307 	char input[RTW_IWD_MAX_LEN];
308 
309 
310 	_rtw_memset(input, 0, wrqu->length);
311 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
312 		return -EFAULT;
313 
314 
315 	ret = sscanf(input, "%d,%x,%x", &path, &addr, &data);
316 	if (ret < 3)
317 		return -EINVAL;
318 
319 	if (path >= GET_HAL_RFPATH_NUM(adapter_to_dvobj(padapter)))
320 		return -EINVAL;
321 	if (addr > 0xFF)
322 		return -EINVAL;
323 	if (data > 0xFFFFF)
324 		return -EINVAL;
325 
326 	_rtw_memset(extra, 0, wrqu->length);
327 
328 	rtw_phl_write_rfreg(GET_PHL_INFO(dvobj), path, addr, 0xFFFFF, data);
329 
330 	sprintf(extra, "write_rf completed\n");
331 	wrqu->length = strlen(extra);
332 
333 	return 0;
334 }
335 
336 
337 /*
338  * Input Format: %d,%x
339  *	%d is RF path, should be smaller than MAX_RF_PATH_NUMS
340  *	%x is address(offset)
341  *
342  * Return:
343  *	%d for data readed
344  */
rtw_mp_read_rf(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)345 int rtw_mp_read_rf(struct net_device *dev,
346 		   struct iw_request_info *info,
347 		   struct iw_point *wrqu, char *extra)
348 {
349 	char input[RTW_IWD_MAX_LEN];
350 	char *pch, *pnext;
351 	char data[20], tmp[20];
352 	u32 path, addr, strtou;
353 	u32 ret, i = 0 , j = 0;
354 	_adapter *padapter = rtw_netdev_priv(dev);
355 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
356 	char *pextra = extra;
357 
358 	if (wrqu->length > 128)
359 		return -EFAULT;
360 	_rtw_memset(input, 0, wrqu->length);
361 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
362 		return -EFAULT;
363 
364 	ret = sscanf(input, "%d,%x", &path, &addr);
365 	if (ret < 2)
366 		return -EINVAL;
367 
368 	if (path >= GET_HAL_RFPATH_NUM(adapter_to_dvobj(padapter)))
369 		return -EINVAL;
370 
371 	_rtw_memset(extra, 0, wrqu->length);
372 
373 	sprintf(data, "%08x",  rtw_phl_read_rfreg(GET_PHL_INFO(dvobj), path, addr , 0xFFFFF));
374 	/*add read data format blank*/
375 	for (i = 0 ; i <= strlen(data) ; i++) {
376 		if (i % 2 == 0) {
377 			tmp[j] = ' ';
378 			j++;
379 		}
380 		tmp[j] = data[i];
381 		j++;
382 	}
383 	pch = tmp;
384 	RTW_INFO("pch=%s", pch);
385 
386 	while (*pch != '\0') {
387 		pnext = strpbrk(pch, " ");
388 		if (!pnext)
389 			break;
390 		pnext++;
391 		if (*pnext != '\0') {
392 			/*strtou =simple_strtoul(pnext , &ptmp, 16);*/
393 			ret = sscanf(pnext, "%x", &strtou);
394 			pextra += sprintf(pextra, " %d", strtou);
395 		} else
396 			break;
397 		pch = pnext;
398 	}
399 	wrqu->length = strlen(extra);
400 
401 	return 0;
402 }
403 
404 
rtw_mp_start(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)405 int rtw_mp_start(struct net_device *dev,
406 		 struct iw_request_info *info,
407 		 struct iw_point *wrqu, char *extra)
408 {
409 	int ret = 0;
410 	_adapter *padapter = rtw_netdev_priv(dev);
411 	struct mp_priv *pmppriv = &padapter->mppriv;
412 	char *pextra = NULL;
413 
414 	pmppriv->bprocess_mp_mode = _TRUE;
415 
416 	if (pmppriv->mode == MP_ON) {
417 		sprintf(extra, "Already mp_start\n");
418 		wrqu->length = strlen(extra);
419 		return ret;
420 	}
421 
422 	rtw_set_scan_deny(padapter, 5000);
423 	rtw_mi_scan_abort(padapter, _TRUE);
424 
425 	if (rtw_mp_cmd(padapter, MP_START, RTW_CMDF_WAIT_ACK) != _SUCCESS)
426 		ret = -EPERM;
427 
428 	_rtw_memset(extra, 0, wrqu->length);
429 	pextra = extra;
430 	pextra += sprintf(extra, "mp_start %s\n", ret == 0 ? "ok" : "fail");
431 	pextra += sprintf(pextra, "EFUSE:%s\n",
432 		RTW_EFUSE_FROM2STR(rtw_efuse_get_map_from(padapter)));
433 	wrqu->length = strlen(extra);
434 
435 	return ret;
436 }
437 
rtw_mp_stop(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)438 int rtw_mp_stop(struct net_device *dev,
439 		struct iw_request_info *info,
440 		struct iw_point *wrqu, char *extra)
441 {
442 	int ret = 0;
443 	u8 status = 0;
444 	_adapter *padapter = rtw_netdev_priv(dev);
445 	struct mp_priv *pmppriv = &padapter->mppriv;
446 
447 
448 	if (rtw_mp_cmd(padapter, MP_STOP, RTW_CMDF_WAIT_ACK) != _SUCCESS)
449 		ret = -EPERM;
450 
451 	if (pmppriv->mode != MP_OFF)
452 		return -EPERM;
453 
454 	_rtw_memset(extra, 0, wrqu->length);
455 	sprintf(extra, "mp_stop ok\n");
456 	wrqu->length = strlen(extra);
457 
458 	pmppriv->bprocess_mp_mode = _FALSE;
459 
460 	return ret;
461 }
462 
463 
rtw_mp_rate(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)464 int rtw_mp_rate(struct net_device *dev,
465 		struct iw_request_info *info,
466 		struct iw_point *wrqu, char *extra)
467 {
468 	u16 rate = MPT_RATE_1M;
469 	u8		input[RTW_IWD_MAX_LEN];
470 	_adapter *padapter = rtw_netdev_priv(dev);
471 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
472 	PMPT_CONTEXT		pMptCtx = &(padapter->mppriv.mpt_ctx);
473 	u8 tx_nss = get_phy_tx_nss(padapter);
474 	char *pextra = extra;
475 	u8 path_i = 0, i = 0;
476 	u16 pwr_dbm = 0;
477 
478 	_rtw_memset(input, 0, sizeof(input));
479 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
480 		return -EFAULT;
481 
482 	input[wrqu->length] = '\0';
483 	rate = rtw_mp_rate_parse(padapter, input);
484 	padapter->mppriv.rateidx = rate;
485 
486 	if (rate == 0 && strcmp(input, "1M") != 0) {
487 		rate = rtw_atoi(input);
488 #ifndef CONFIG_80211AX_HE
489 		padapter->mppriv.rateidx = mrate_to_hwrate(rate);
490 #endif
491 		/*if (rate <= 0x7f)
492 			rate = wifirate2_ratetbl_inx((u8)rate);
493 		else if (rate < 0xC8)
494 			rate = (rate - 0x79 + MPT_RATE_MCS0);
495 		HT  rate 0x80(MCS0)  ~ 0x8F(MCS15) ~ 0x9F(MCS31) 128~159
496 		VHT1SS~2SS rate 0xA0 (VHT1SS_MCS0 44) ~ 0xB3 (VHT2SS_MCS9 #63) 160~179
497 		VHT rate 0xB4 (VHT3SS_MCS0 64) ~ 0xC7 (VHT2SS_MCS9 #83) 180~199
498 		else
499 		VHT rate 0x90(VHT1SS_MCS0) ~ 0x99(VHT1SS_MCS9) 144~153
500 		rate =(rate - MPT_RATE_VHT1SS_MCS0);
501 		*/
502 	}
503 	_rtw_memset(extra, 0, wrqu->length);
504 
505 	pextra += sprintf(pextra, "Set data rate to %s index %d\n" , input, padapter->mppriv.rateidx);
506 	RTW_INFO("%s: %s rate index=%d\n", __func__, input, padapter->mppriv.rateidx);
507 	pextra += sprintf(pextra, "PPDU Type %s\n",
508 								PPDU_TYPE_STR(pmp_priv->rtw_mp_pmact_ppdu_type));
509 	pextra += sprintf(pextra, "CMD: [mp_plcp_datappdu=%%d]\nPLCP (PPDU Type):\n");
510 	for (i = pmp_priv->rtw_mp_pmact_ppdu_type; i <= RTW_MP_TYPE_HE_TB; i++)
511 		pextra += sprintf(pextra, "%d:%s\n", i,PPDU_TYPE_STR(i));
512 
513 	SetDataRate(padapter);
514 #if 0
515 	for (path_i = 0 ; path_i < tx_nss; path_i++) {
516 		pwr_dbm = rtw_mp_get_pwrtab_dbm(padapter, path_i);
517 		pextra += sprintf(pextra, "Path%d Pwrdbm:%d" , path_i, pwr_dbm);
518 	}
519 #endif
520 	wrqu->length = strlen(extra);
521 	return 0;
522 }
523 
524 
rtw_mp_channel(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)525 int rtw_mp_channel(struct net_device *dev,
526 		   struct iw_request_info *info,
527 		   struct iw_point *wrqu, char *extra)
528 {
529 	_adapter *padapter = rtw_netdev_priv(dev);
530 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
531 	u8		input[RTW_IWD_MAX_LEN];
532 	u32	channel = 1;
533 
534 	_rtw_memset(input, 0, sizeof(input));
535 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
536 		return -EFAULT;
537 
538 	input[wrqu->length] = '\0';
539 	channel = rtw_atoi(input);
540 
541 	_rtw_memset(extra, 0, wrqu->length);
542 	sprintf(extra, "Change channel %d to channel %d", pmp_priv->channel, channel);
543 	pmp_priv->channel = channel;
544 	//pHalData->current_channel = channel; //aka struct rtw_phl_com_t
545 	SetChannel(padapter);
546 
547 	wrqu->length = strlen(extra);
548 	return 0;
549 }
550 
rtw_mp_update_trxsc(_adapter * padapter)551 static void rtw_mp_update_trxsc(_adapter *padapter) {
552 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
553 	u8 trxsc_offset = pmp_priv->rtw_mp_trxsc;
554 
555 	switch (trxsc_offset) {
556 	case 0:
557 		pmp_priv->rtw_mp_data_bandwidth = pmp_priv->bandwidth;
558 		RTW_INFO("%s:TRXSC %d, MP bandwidth = %d\n", __func__, trxsc_offset, pmp_priv->bandwidth);
559 		break;
560 	case 1:
561 	case 2:
562 	case 3:
563 	case 4:
564 		pmp_priv->rtw_mp_data_bandwidth = CHANNEL_WIDTH_20;
565 		RTW_INFO("%s:TRXSC %d, MP bandwidth = %d\n", __func__, trxsc_offset, pmp_priv->bandwidth);
566 		break;
567 	case 9:
568 	case 10:
569 	case 11:
570 	case 12:
571 		pmp_priv->rtw_mp_data_bandwidth = CHANNEL_WIDTH_40;
572 		RTW_INFO("%s:TRXSC %d, MP bandwidth = %d\n", __func__, trxsc_offset, pmp_priv->bandwidth);
573 		break;
574 	case 13:
575 	case 14:
576 		pmp_priv->rtw_mp_data_bandwidth = CHANNEL_WIDTH_40;
577 		RTW_INFO("%s:TRXSC %d, MP bandwidth = %d\n", __func__, trxsc_offset, pmp_priv->bandwidth);
578 		break;
579 	}
580 }
581 
rtw_mp_trxsc_offset(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)582 int rtw_mp_trxsc_offset(struct net_device *dev,
583 		   struct iw_request_info *info,
584 		   struct iw_point *wrqu, char *extra)
585 {
586 
587 	_adapter *padapter = rtw_netdev_priv(dev);
588 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
589 	u8		input[RTW_IWD_MAX_LEN];
590 	u32	trxsc_offset = 0;
591 
592 	_rtw_memset(input, 0, sizeof(input));
593 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
594 		return -EFAULT;
595 
596 	input[wrqu->length] = '\0';
597 	trxsc_offset = rtw_atoi(input);
598 	RTW_INFO("%s: ch offset = %d\n", __func__, trxsc_offset);
599 
600 	pmp_priv->rtw_mp_trxsc = trxsc_offset;
601 	rtw_mp_update_trxsc(padapter);
602 	_rtw_memset(extra, 0, wrqu->length);
603 	sprintf(extra, "change TRXSC to %d, current Bandwidth=%d\n",
604 						pmp_priv->rtw_mp_trxsc, pmp_priv->bandwidth);
605 
606 	wrqu->length = strlen(extra);
607 	return 0;
608 }
609 
610 
rtw_mp_bandwidth(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)611 int rtw_mp_bandwidth(struct net_device *dev,
612 		     struct iw_request_info *info,
613 		     struct iw_point *wrqu, char *extra)
614 {
615 	u8 bandwidth = 0, sg = 0;
616 	_adapter *padapter = rtw_netdev_priv(dev);
617 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
618 	u8		input[RTW_IWD_MAX_LEN];
619 
620 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
621 		return -EFAULT;
622 
623 	if (sscanf(input, "40M=%hhd,shortGI=%hhd", &bandwidth, &sg) > 0)
624 		RTW_INFO("%s: bw=%d sg=%d\n", __func__, bandwidth , sg);
625 #if 0
626 	if (bandwidth == 1 && rtw_hw_chk_bw_cap(adapter_to_dvobj(padapter), BW_CAP_40M))
627 		bandwidth = CHANNEL_WIDTH_40;
628 	else if (bandwidth == 2 && rtw_hw_chk_bw_cap(adapter_to_dvobj(padapter), BW_CAP_80M))
629 		bandwidth = CHANNEL_WIDTH_80;
630 	else
631 		bandwidth = CHANNEL_WIDTH_20;
632 #else
633 	rtw_adjust_chbw(padapter, pmp_priv->channel, &bandwidth, &pmp_priv->prime_channel_offset);
634 
635 	pmp_priv->bandwidth = (u8)bandwidth;
636 	pmp_priv->preamble = sg;
637 	_rtw_memset(extra, 0, wrqu->length);
638 	sprintf(extra, "Change BW %d to BW %d\n", pmp_priv->bandwidth , bandwidth);
639 
640 	SetBandwidth(padapter);
641 	rtw_mp_update_trxsc(padapter);
642 #endif
643 	wrqu->length = strlen(extra);
644 
645 	return 0;
646 }
647 
648 
rtw_mp_txpower_index(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)649 int rtw_mp_txpower_index(struct net_device *dev,
650 			 struct iw_request_info *info,
651 			 struct iw_point *wrqu, char *extra)
652 {
653 	_adapter *padapter = rtw_netdev_priv(dev);
654 	char input[RTW_IWD_MAX_LEN];
655 	u32 rfpath = 0 ;
656 	u32 txpower_inx = 0, tarpowerdbm = 0;
657 	char *pextra = extra;
658 	u8 rf_type = GET_HAL_RFPATH(adapter_to_dvobj(padapter));
659 
660 	if (wrqu->length > 128)
661 		return -EFAULT;
662 
663 	_rtw_memset(input, 0, sizeof(input));
664 
665 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
666 		return -EFAULT;
667 
668 	input[wrqu->length] = '\0';
669 	_rtw_memset(extra, 0, strlen(extra));
670 
671 	if (wrqu->length == 2) {
672 #ifndef CONFIG_80211AX_HE
673 		if (input[0] != '\0' ) {
674 			rfpath = rtw_atoi(input);
675 			txpower_inx = mpt_ProQueryCalTxPower(padapter, rfpath);
676 		}
677 #endif
678 		pextra += sprintf(pextra, " %d\n", txpower_inx);
679 		tarpowerdbm = mpt_get_tx_power_finalabs_val(padapter, rfpath);
680 		if (tarpowerdbm > 0)
681 			pextra += sprintf(pextra, "\t\t dBm:%d", tarpowerdbm);
682 	} else {
683 #ifndef CONFIG_80211AX_HE
684 		txpower_inx = mpt_ProQueryCalTxPower(padapter, 0);
685 		pextra += sprintf(pextra, "patha=%d", txpower_inx);
686 		if (rf_type > RF_1T2R) {
687 			txpower_inx = mpt_ProQueryCalTxPower(padapter, 1);
688 			pextra += sprintf(pextra, ",pathb=%d", txpower_inx);
689 		}
690 		if (rf_type > RF_2T4R) {
691 			txpower_inx = mpt_ProQueryCalTxPower(padapter, 2);
692 			pextra += sprintf(pextra, ",pathc=%d", txpower_inx);
693 		}
694 		if (rf_type > RF_3T4R) {
695 			txpower_inx = mpt_ProQueryCalTxPower(padapter, 3);
696 			pextra += sprintf(pextra, ",pathd=%d", txpower_inx);
697 		}
698 #endif
699 		tarpowerdbm = mpt_get_tx_power_finalabs_val(padapter, 0);
700 		pextra += sprintf(pextra, "\n\t\t\tpatha dBm=%d", tarpowerdbm);
701 		if (rf_type > RF_1T2R) {
702 			tarpowerdbm = mpt_get_tx_power_finalabs_val(padapter, 1);
703 			pextra += sprintf(pextra, ",pathb dBm=%d", tarpowerdbm);
704 		}
705 		if (rf_type > RF_2T4R) {
706 			tarpowerdbm = mpt_get_tx_power_finalabs_val(padapter, 2);
707 			pextra += sprintf(pextra, ",pathc dBm=%d", tarpowerdbm);
708 		}
709 		if (rf_type > RF_3T4R) {
710 			tarpowerdbm = mpt_get_tx_power_finalabs_val(padapter, 3);
711 			pextra += sprintf(pextra, ",pathd dBm=%d", tarpowerdbm);
712 		}
713 	}
714 
715 	wrqu->length = strlen(extra);
716 
717 	return 0;
718 }
719 
720 
rtw_mp_txpower(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)721 int rtw_mp_txpower(struct net_device *dev,
722 		   struct iw_request_info *info,
723 		   struct iw_point *wrqu, char *extra)
724 {
725 	u32 idx_a = 0, idx_b = 0, idx_c = 0, idx_d = 0;
726 	int MsetPower = 1;
727 	char pout_str_buf[7];
728 	u8		input[RTW_IWD_MAX_LEN];
729 	u8 rfpath_i = 0;
730 	u16 agc_cw_val = 0;
731 	_adapter *padapter = rtw_netdev_priv(dev);
732 	struct mp_priv *pmppriv = &padapter ->mppriv;
733 	u8 tx_nss = get_phy_tx_nss(padapter);
734 	char *pextra = extra;
735 
736 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
737 		return -EFAULT;
738 
739 	MsetPower = strncmp(input, "off", 3);
740 	if (MsetPower == 0) {
741 		pmppriv->bSetTxPower = 0;
742 		sprintf(pextra, "MP Set power off");
743 	} else {
744 		if (sscanf(input, "patha=%d,pathb=%d,pathc=%d,pathd=%d", &idx_a, &idx_b, &idx_c, &idx_d) >= 1) {
745 				pextra += sprintf(pextra, "Set power offset path_A:%d path_B:%d path_C:%d path_D:%d\n", idx_a , idx_b , idx_c , idx_d);
746 				pmppriv->path_pwr_offset[RF_PATH_A] = (u8)idx_a;
747 				pmppriv->path_pwr_offset[RF_PATH_B] = (u8)idx_b;
748 				pmppriv->path_pwr_offset[RF_PATH_C] = (u8)idx_c;
749 				pmppriv->path_pwr_offset[RF_PATH_D]  = (u8)idx_d;
750 				pmppriv->bSetTxPower = 1;
751 		} else if (strncmp(input, "dbm", 3) == 0) {
752 			u8 signed_flag = 0;
753 			u8 ret = 0xff;
754 			int int_num = 0;
755 			u32 dec_num = 0;
756 			s16 pout = 0;
757 			int i;
758 			u32 poutdbm = 0;
759 			s32 db_temp = 0;
760 			s16 pset = 0;
761 			u8 rfpath;
762 
763 			if (sscanf(input, "dbm=%7s", pout_str_buf) == 1) {
764 				ret = 0;
765 			} else {
766 				sprintf(extra, "[dbm = -30 ~ 30.00]");
767 				goto invalid_param_format;
768 			}
769 
770 			if(pout_str_buf[0] == '-')
771 				signed_flag = 1;
772 			i = sscanf(pout_str_buf, "%d.%3u", &int_num, &dec_num);
773 			RTW_INFO("%s: pars input =%d.%d\n", __func__, int_num, dec_num);
774 
775 			if(i == 2)
776 				dec_num = (dec_num < 10) ? dec_num * 10 : dec_num;
777 
778 			if (int_num >= 30 || ret == 0xff || dec_num > 99 || (dec_num % 25 != 0)) {
779 				sprintf(extra, "CMD Format:[dbm= -30.00 ~ 30.00]\n"
780 					" each scale step value must 0.25 or -0.25\n");
781 				goto invalid_param_format;
782 			}
783 
784 			pset = int_num * TX_POWER_BASE + ((dec_num * TX_POWER_BASE) / 100);
785 			RTW_INFO("%s: pset=%d\n", __func__, pset);
786 			pset = ((pset < 0 || signed_flag == 1) ? -pset : pset);
787 
788 
789 			pextra += sprintf(pextra, "Set power dbm :%d.%d\n", int_num, dec_num);
790 			pmppriv->txpowerdbm = pset;
791 			pmppriv->bSetTxPower = 1;
792 		} else {
793 			pextra += sprintf(pextra, "Invalid format on line %s\n", input);
794 			RTW_INFO("Invalid format on line %s\n", input );
795 			wrqu->length = strlen(extra);
796 			return 0;
797 		}
798 
799 		for (rfpath_i = 0 ; rfpath_i < tx_nss; rfpath_i ++) {
800 				agc_cw_val = rtw_mp_txpower_dbm(padapter, rfpath_i);
801 				pextra += sprintf(pextra, "Path:%d PwrAGC:%d\n", rfpath_i,agc_cw_val);
802 		}
803 	}
804 
805 invalid_param_format:
806 	wrqu->length = strlen(extra);
807 	return 0;
808 }
809 
810 
rtw_mp_ant_tx(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)811 int rtw_mp_ant_tx(struct net_device *dev,
812 		  struct iw_request_info *info,
813 		  struct iw_point *wrqu, char *extra)
814 {
815 	u8 i;
816 	u8		input[RTW_IWD_MAX_LEN];
817 	u8 antenna = 0;
818 	u16 pwr_dbm = 0;
819 	_adapter *padapter = rtw_netdev_priv(dev);
820 	char *pextra = extra;
821 
822 	_rtw_memset(input, 0, sizeof(input));
823 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
824 		return -EFAULT;
825 
826 	input[wrqu->length] = '\0';
827 	pextra += sprintf(pextra, "switch Tx antenna to %s\n", input);
828 
829 	for (i = 0; i < strlen(input); i++) {
830 		switch (input[i]) {
831 		case 'a':
832 			antenna |= MP_ANTENNA_A;
833 			break;
834 		case 'b':
835 			antenna |= MP_ANTENNA_B;
836 			break;
837 		case 'c':
838 			antenna |= MP_ANTENNA_C;
839 			break;
840 		case 'd':
841 			antenna |= MP_ANTENNA_D;
842 			break;
843 		}
844 	}
845 	/*antenna |= BIT(extra[i]-'a');*/
846 	RTW_INFO("%s: antenna=0x%x\n", __func__, antenna);
847 	padapter->mppriv.antenna_trx = antenna;
848 
849 	SetAntenna(padapter);
850 	pwr_dbm = rtw_mp_get_pwrtab_dbm(padapter, antenna);
851 	pextra += sprintf(pextra, "read pwr dbm:%d", pwr_dbm);
852 
853 	wrqu->length = strlen(extra);
854 	return 0;
855 }
856 
857 
rtw_mp_ant_rx(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)858 int rtw_mp_ant_rx(struct net_device *dev,
859 		  struct iw_request_info *info,
860 		  struct iw_point *wrqu, char *extra)
861 {
862 	u8 i;
863 	u16 antenna = 0;
864 	u8		input[RTW_IWD_MAX_LEN];
865 	_adapter *padapter = rtw_netdev_priv(dev);
866 
867 	_rtw_memset(input, 0, sizeof(input));
868 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
869 		return -EFAULT;
870 
871 	input[wrqu->length] = '\0';
872 	/*RTW_INFO("%s: input=%s\n", __func__, input);*/
873 	_rtw_memset(extra, 0, wrqu->length);
874 
875 	sprintf(extra, "switch Rx antenna to %s", input);
876 	for (i = 0; i < strlen(input); i++) {
877 		switch (input[i]) {
878 		case 'a':
879 			antenna |= MP_ANTENNA_A;
880 			break;
881 		case 'b':
882 			antenna |= MP_ANTENNA_B;
883 			break;
884 		case 'c':
885 			antenna |= MP_ANTENNA_C;
886 			break;
887 		case 'd':
888 			antenna |= MP_ANTENNA_D;
889 			break;
890 		}
891 	}
892 	RTW_INFO("%s: antenna=0x%x\n", __func__, antenna);
893 
894 	padapter->mppriv.antenna_trx = antenna;
895 	SetAntenna(padapter);
896 	wrqu->length = strlen(extra);
897 
898 	return 0;
899 }
900 
901 
rtw_set_ctx_destAddr(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)902 int rtw_set_ctx_destAddr(struct net_device *dev,
903 			 struct iw_request_info *info,
904 			 struct iw_point *wrqu, char *extra)
905 {
906 	int jj, kk = 0;
907 
908 	struct pkt_attrib *pattrib;
909 	struct mp_priv *pmp_priv;
910 	_adapter *padapter = rtw_netdev_priv(dev);
911 
912 	pmp_priv = &padapter->mppriv;
913 	pattrib = &pmp_priv->tx.attrib;
914 
915 	if (strlen(extra) < 5)
916 		return _FAIL;
917 
918 	RTW_INFO("%s: in=%s\n", __func__, extra);
919 	for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3)
920 		pattrib->dst[jj] = key_2char2num(extra[kk], extra[kk + 1]);
921 
922 	RTW_INFO("pattrib->dst:%x %x %x %x %x %x\n", pattrib->dst[0], pattrib->dst[1], pattrib->dst[2], pattrib->dst[3], pattrib->dst[4], pattrib->dst[5]);
923 	return 0;
924 }
925 
926 
927 
rtw_mp_ctx(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)928 int rtw_mp_ctx(struct net_device *dev,
929 	       struct iw_request_info *info,
930 	       struct iw_point *wrqu, char *extra)
931 {
932 	u32 pkTx = 1;
933 	int countPkTx = 1, cotuTx = 1, CarrSprTx = 1, scTx = 1, sgleTx = 1, stop = 1, payload = 1;
934 	u32 bStartTest = 1;
935 	u32 count = 0, pktinterval = 0, pktlen = 0;
936 	u8 status;
937 	struct mp_priv *pmp_priv;
938 	struct pkt_attrib *pattrib;
939 	_adapter *padapter = rtw_netdev_priv(dev);
940 
941 	pmp_priv = &padapter->mppriv;
942 	pattrib = &pmp_priv->tx.attrib;
943 
944 	if (padapter->registrypriv.mp_mode != 1 ) {
945 		sprintf(extra, "Error: can't tx ,not in MP mode. \n");
946 		wrqu->length = strlen(extra);
947 		return 0;
948 	}
949 
950 	if (copy_from_user(extra, wrqu->pointer, wrqu->length))
951 		return -EFAULT;
952 
953 	*(extra + wrqu->length) = '\0';
954 	RTW_INFO("%s: in=%s\n", __func__, extra);
955 #ifdef CONFIG_CONCURRENT_MODE
956 	if (!is_primary_adapter(padapter)) {
957 		sprintf(extra, "Error: MP mode can't support Virtual adapter, Please to use main adapter.\n");
958 		wrqu->length = strlen(extra);
959 		return 0;
960 	}
961 #endif
962 	countPkTx = strncmp(extra, "count=", 5); /* strncmp TRUE is 0*/
963 	cotuTx = strncmp(extra, "background", 20);
964 	CarrSprTx = strncmp(extra, "background,cs", 20);
965 	scTx = strncmp(extra, "background,sc", 20);
966 	sgleTx = strncmp(extra, "background,stone", 20);
967 	pkTx = strncmp(extra, "background,pkt", 20);
968 	stop = strncmp(extra, "stop", 4);
969 	payload = strncmp(extra, "payload=", 8);
970 
971 	if (sscanf(extra, "count=%d,pkt", &count) > 0)
972 		RTW_INFO("count= %d\n", count);
973 	if (sscanf(extra, "pktinterval=%d", &pktinterval) > 0)
974 		RTW_INFO("pktinterval= %d\n", pktinterval);
975 	if (sscanf(extra, "pktlen=%d", &pktlen) > 0)
976 		RTW_INFO("pktlen= %d\n", pktlen);
977 
978 	if (payload == 0) {
979 			payload = MP_TX_Payload_default_random;
980 			if (strncmp(extra, "payload=prbs9", 14) == 0) {
981 				payload = MP_TX_Payload_prbs9;
982 				sprintf(extra, "config payload PRBS9\n");
983 			} else {
984 				if (sscanf(extra, "payload=%x", &payload) > 0){
985 					RTW_INFO("payload= %x\n", payload);
986 					sprintf(extra, "config payload setting = %x\n"
987 									"1. input payload=[]:\n		"
988 									"[0]: 00, [1]: A5, [2]: 5A, [3]: FF, [4]: PRBS-9, [5]: Random\n"
989 									"2. specified a hex payload: payload=0xee\n", payload);
990 				 }
991 			}
992 			pmp_priv->tx.payload = payload;
993 			wrqu->length = strlen(extra);
994 			return 0;
995 	}
996 
997 	if (_rtw_memcmp(extra, "destmac=", 8)) {
998 		wrqu->length -= 8;
999 		rtw_set_ctx_destAddr(dev, info, wrqu, &extra[8]);
1000 		sprintf(extra, "Set dest mac OK !\n");
1001 		return 0;
1002 	}
1003 	/*RTW_INFO("%s: count=%d countPkTx=%d cotuTx=%d CarrSprTx=%d scTx=%d sgleTx=%d pkTx=%d stop=%d\n", __func__, count, countPkTx, cotuTx, CarrSprTx, pkTx, sgleTx, scTx, stop);*/
1004 	_rtw_memset(extra, '\0', strlen(extra));
1005 
1006 	if (pktinterval != 0) {
1007 		sprintf(extra, "Pkt Interval = %d", pktinterval);
1008 		padapter->mppriv.pktInterval = pktinterval;
1009 		wrqu->length = strlen(extra);
1010 		return 0;
1011 
1012 	} else if (pktlen != 0) {
1013 		sprintf(extra, "Pkt len = %d", pktlen);
1014 		pattrib->pktlen = pktlen;
1015 		wrqu->length = strlen(extra);
1016 		return 0;
1017 
1018 	} else if (stop == 0) {
1019 		bStartTest = 0; /* To set Stop*/
1020 		pmp_priv->tx.stop = 1;
1021 		sprintf(extra, "Stop continuous Tx");
1022 	} else {
1023 		bStartTest = 1;
1024 
1025 		if (pmp_priv->mode != MP_ON) {
1026 			if (pmp_priv->tx.stop != 1) {
1027 				RTW_INFO("%s:Error MP_MODE %d != ON\n", __func__, pmp_priv->mode);
1028 				return	-EFAULT;
1029 			}
1030 		}
1031 	}
1032 
1033 	pmp_priv->tx.count = count;
1034 
1035 	if (pkTx == 0 || countPkTx == 0)
1036 		pmp_priv->mode = MP_PACKET_TX;
1037 	if (sgleTx == 0)
1038 		pmp_priv->mode = MP_SINGLE_TONE_TX;
1039 	if (cotuTx == 0)
1040 		pmp_priv->mode = MP_CONTINUOUS_TX;
1041 	if (CarrSprTx == 0)
1042 		pmp_priv->mode = MP_CARRIER_SUPPRISSION_TX;
1043 	if (scTx == 0)
1044 		pmp_priv->mode = MP_SINGLE_CARRIER_TX;
1045 
1046 	status = rtw_mp_pretx_proc(padapter, bStartTest, extra);
1047 
1048 	if (stop == 0)
1049 		pmp_priv->mode = MP_ON;
1050 
1051 	wrqu->length = strlen(extra);
1052 	return status;
1053 }
1054 
1055 
1056 
rtw_mp_disable_bt_coexist(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)1057 int rtw_mp_disable_bt_coexist(struct net_device *dev,
1058 			      struct iw_request_info *info,
1059 			      union iwreq_data *wrqu, char *extra)
1060 {
1061 #ifdef CONFIG_BTC
1062 	_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
1063 
1064 #endif
1065 	u8 input[RTW_IWD_MAX_LEN];
1066 	u32 bt_coexist;
1067 
1068 	_rtw_memset(input, 0, sizeof(input));
1069 
1070 	if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
1071 		return -EFAULT;
1072 
1073 	input[wrqu->data.length] = '\0';
1074 
1075 	bt_coexist = rtw_atoi(input);
1076 
1077 #if 0
1078 	if (bt_coexist == 0) {
1079 		RTW_INFO("Set OID_RT_SET_DISABLE_BT_COEXIST: disable BT_COEXIST\n");
1080 #ifdef CONFIG_BTC
1081 		rtw_btcoex_HaltNotify(padapter);
1082 		rtw_btcoex_SetManualControl(padapter, _TRUE);
1083 		/* Force to switch Antenna to WiFi*/
1084 		rtw_write16(padapter, 0x870, 0x300);
1085 		rtw_write16(padapter, 0x860, 0x110);
1086 #endif
1087 		/* CONFIG_BTC */
1088 	} else {
1089 #ifdef CONFIG_BTC
1090 		rtw_btcoex_SetManualControl(padapter, _FALSE);
1091 #endif
1092 	}
1093 #endif
1094 
1095 	return 0;
1096 }
1097 
1098 
rtw_mp_arx(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1099 int rtw_mp_arx(struct net_device *dev,
1100 				struct iw_request_info *info,
1101 				struct iw_point *wrqu, char *extra)
1102 {
1103 	_adapter *padapter = rtw_netdev_priv(dev);
1104 	struct mp_priv *pmppriv = &padapter->mppriv;
1105 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1106 	u8	input[RTW_IWD_MAX_LEN];
1107 	u32	ret;
1108 	char *pch, *token, *tmp[2] = {0x00, 0x00};
1109 	u32 i = 0, jj = 0, kk = 0, cnts = 0;
1110 
1111 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
1112 		return -EFAULT;
1113 
1114 	RTW_INFO("%s: %s\n", __func__, input);
1115 	if (strncmp(input, "setbssid=", 8) == 0) {
1116 		pch = input;
1117 		while ((token = strsep(&pch, "=")) != NULL) {
1118 			if (i > 1)
1119 				break;
1120 			tmp[i] = token;
1121 			i++;
1122 		}
1123 		if ((tmp[0] != NULL) && (tmp[1] != NULL)) {
1124 			cnts = strlen(tmp[1]) / 2;
1125 			if (cnts < 1)
1126 				return -EFAULT;
1127 			RTW_INFO("%s: cnts=%d\n", __func__, cnts);
1128 			RTW_INFO("%s: data=%s\n", __func__, tmp[1]);
1129 			for (jj = 0, kk = 0; jj < cnts ; jj++, kk += 2) {
1130 				pmppriv->network_macaddr[jj] =
1131 					key_2char2num(tmp[1][kk], tmp[1][kk + 1]);
1132 				RTW_INFO("network_macaddr[%d]=%x\n",
1133 					jj, pmppriv->network_macaddr[jj]);
1134 			}
1135 		} else
1136 			return -EFAULT;
1137 
1138 		pmppriv->bSetRxBssid = _TRUE;
1139 	} else if (strncmp(input, "frametype", 9) == 0) {
1140 		if (strncmp(input, "frametype beacon", 16) == 0)
1141 			pmppriv->brx_filter_beacon = _TRUE;
1142 		else
1143 			pmppriv->brx_filter_beacon = _FALSE;
1144 
1145 	} else if (strncmp(input, "accept_mac", 10) == 0) {
1146 		pmppriv->bmac_filter = _TRUE;
1147 		pch = input;
1148 		while ((token = strsep(&pch, "=")) != NULL) {
1149 			if (i > 1)
1150 				break;
1151 			tmp[i] = token;
1152 			i++;
1153 		}
1154 		if ((tmp[0] != NULL) && (tmp[1] != NULL)) {
1155 			cnts = strlen(tmp[1]) / 2;
1156 			if (cnts < 1)
1157 				return -EFAULT;
1158 			RTW_INFO("%s: cnts=%d\n", __func__, cnts);
1159 			RTW_INFO("%s: data=%s\n", __func__, tmp[1]);
1160 			for (jj = 0, kk = 0; jj < cnts ; jj++, kk += 2) {
1161 				pmppriv->mac_filter[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]);
1162 				RTW_INFO("%s mac_filter[%d]=%x\n", __func__, jj, pmppriv->mac_filter[jj]);
1163 			}
1164 		} else
1165 			return -EFAULT;
1166 
1167 	} else if (strncmp(input, "start", 5) == 0) {
1168 		sprintf(extra, "start");
1169 
1170 	} else if (strncmp(input, "stop", 5) == 0) {
1171 		struct rtw_mp_rx_arg rx_arg;
1172 
1173 		_rtw_memset((void *)&rx_arg, 0, sizeof(struct rtw_mp_rx_arg));
1174 		rtw_mp_phl_query_rx(padapter, &rx_arg, 2);
1175 		if (rx_arg.cmd_ok) {
1176 			pmppriv->rx_pktcount = rx_arg.rx_ok;
1177 			pmppriv->rx_crcerrpktcount = rx_arg.rx_err;
1178 			RTW_INFO("phl_query_rx rx_ok=%d rx_err=%d\n",
1179 				pmppriv->rx_pktcount, pmppriv->rx_crcerrpktcount);
1180 		} else
1181 			RTW_WARN("phl_query_rx Fail !!!");
1182 
1183 		pmppriv->bmac_filter = _FALSE;
1184 		pmppriv->bSetRxBssid = _FALSE;
1185 		sprintf(extra, "Received packet OK:%d CRC error:%d ,Filter out:%d",
1186 			pmppriv->rx_pktcount, pmppriv->rx_crcerrpktcount,
1187 			pmppriv->rx_pktcount_filter_out);
1188 
1189 	} else if (strncmp(input, "phy", 3) == 0) {
1190 		struct rtw_mp_rx_arg rx_arg;
1191 
1192 		_rtw_memset((void *)&rx_arg, 0, sizeof(struct rtw_mp_rx_arg));
1193 		rtw_mp_phl_query_rx(padapter, &rx_arg, 0);
1194 		if (rx_arg.cmd_ok)
1195 			sprintf(extra, "Phy Received packet OK:%d CRC error:%d",
1196 					rx_arg.rx_ok, rx_arg.rx_err);
1197 		else
1198 			sprintf(extra, "PHL Phy Query Fail !!!");
1199 
1200 	} else if (strncmp(input, "mac", 3) == 0) {
1201 		struct rtw_mp_rx_arg rx_arg;
1202 
1203 		_rtw_memset((void *)&rx_arg, 0, sizeof(struct rtw_mp_rx_arg));
1204 		rtw_mp_phl_query_rx(padapter, &rx_arg, 1);
1205 		if (rx_arg.cmd_ok)
1206 			sprintf(extra, "Mac Received packet OK:%d CRC error:%d",
1207 					rx_arg.rx_ok, rx_arg.rx_err);
1208 		else
1209 			sprintf(extra, "Mac Phy Query Fail !!!");
1210 
1211 	} else if (strncmp(input, "mon=", 4) == 0) {
1212 		int bmon = 0;
1213 		ret = sscanf(input, "mon=%d", &bmon);
1214 
1215 		if (bmon == 1) {
1216 			pmppriv->rx_bindicatePkt = _TRUE;
1217 			sprintf(extra, "Indicating Receive Packet to network start\n");
1218 		} else {
1219 			pmppriv->rx_bindicatePkt = _FALSE;
1220 			sprintf(extra, "Indicating Receive Packet to network Stop\n");
1221 		}
1222 	} else if (strncmp(input, "loopbk", 6) == 0) {
1223 		u32 val32 = rtw_phl_read32(dvobj->phl, 0xCC20);
1224 		val32 |= BIT0;
1225 		rtw_phl_write32(dvobj->phl, 0xCC20 , val32);
1226 		pmppriv->bloopback = _TRUE;
1227 		sprintf(extra , "Enter MAC LoopBack mode\n");
1228 
1229 	} else if (strncmp(input, "gain", 4) == 0) {
1230 		struct rtw_mp_rx_arg rx_arg;
1231 		u32 gain_val = 0xff;
1232 		u8 path_num = 0;
1233 		u8 rf_path = 0xff;
1234 		u8 iscck = 0xff;
1235 		u8 *pch = extra;
1236 
1237 		switch (input[4]) {
1238 		case 'a':
1239 			rf_path = RF_PATH_A;
1240 			break;
1241 		case 'b':
1242 			rf_path = RF_PATH_B;
1243 			break;
1244 		case 'c':
1245 			rf_path = RF_PATH_C;
1246 			break;
1247 		case 'd':
1248 			rf_path = RF_PATH_D;
1249 			break;
1250 		}
1251 
1252 		if ((sscanf(input + 5, "=0x%x,iscck=%hhd", &gain_val, &iscck) == 2) ||
1253 			(sscanf(input + 5, "=%d,iscck=%hhd", &gain_val, &iscck) == 2))
1254 			RTW_INFO("%s: read gain = %d , is cck =%d\n", __func__, gain_val, iscck);
1255 
1256 		else if ((sscanf(input + 4, "=0x%x", &gain_val) == 1) ||
1257 				(sscanf(input + 4, "=%d", &gain_val) == 1))
1258 				iscck = (u8)rtw_mp_is_cck_rate(pmppriv->rateidx);
1259 		else {
1260 				sprintf(pch, "error format: gain=[Dec/Hex]\n"
1261 						"\t\tgaina or gainb=[Dec/Hex],iscck=0/1\n");
1262 				wrqu->length = strlen(pch) + 1;
1263 				return 0;
1264 		}
1265 
1266 		if (rf_path == 0xff) {
1267 			rf_path = RF_PATH_A;
1268 			path_num = GET_HAL_RFPATH_NUM(adapter_to_dvobj(padapter)) - 1;
1269 		} else
1270 			path_num = rf_path;
1271 
1272 		if (gain_val == 0xff || iscck == 0xff) {
1273 			sprintf(extra, "error format: gaina or gainb=%d,iscck=%d\n", gain_val, iscck);
1274 			wrqu->length = strlen(extra) + 1;
1275 			return 0;
1276 		}
1277 
1278 		for (; rf_path <= path_num ; rf_path++) {
1279 			RTW_INFO("%s:set Path:%d gain_offset=%d iscck=%d\n",
1280 					__func__, rf_path, gain_val, iscck);
1281 
1282 			_rtw_memset((void *)&rx_arg, 0, sizeof(struct rtw_mp_rx_arg));
1283 			rx_arg.offset = (s8)gain_val;
1284 			rx_arg.iscck = iscck;
1285 			rtw_mp_phl_rx_gain_offset(padapter, &rx_arg, rf_path);
1286 
1287 			if (rx_arg.cmd_ok)
1288 				pch += sprintf(pch, "Path %s: 0x%hhx Rx Gain offset OK\n\t\t",
1289 				(rf_path == RF_PATH_A) ? "A":(rf_path == RF_PATH_B) ? "B":
1290 				(rf_path == RF_PATH_C) ? "C":"D", gain_val);
1291 		}
1292 	} else if (strncmp(input, "rssi", 4) == 0) {
1293 		struct rtw_mp_rx_arg rx_arg;
1294 		u8 rssi_path = 0, all_path_num = 0;
1295 		char *pcar = extra;
1296 		u8 i = 0;
1297 
1298 		if (strncmp(input, "rssi a", 6) == 0)
1299 			rssi_path = 0;
1300 		else if (strncmp(input, "rssi b", 6) == 0)
1301 			rssi_path = 1;
1302 		else
1303 			all_path_num = GET_HAL_RFPATH_NUM(adapter_to_dvobj(padapter));
1304 
1305 		if (all_path_num > 1) {
1306 			rssi_path = 0;
1307 			all_path_num = all_path_num - 1;
1308 		} else
1309 			all_path_num = rssi_path;
1310 
1311 		RTW_INFO("%s:Query RSSI Path:%d to %d\n", __func__, rssi_path, all_path_num);
1312 		_rtw_memset((void *)&rx_arg, 0, sizeof(struct rtw_mp_rx_arg));
1313 
1314 		for (i = rssi_path ; i <= all_path_num; i++) {
1315 			rx_arg.rf_path = i;
1316 
1317 			rtw_mp_phl_rx_rssi(padapter, &rx_arg);
1318 			if (rx_arg.cmd_ok) {
1319 				int result_int = 0;
1320 				int result_dec = 0;
1321 
1322 				result_int = (rx_arg.rssi / 2) -110;
1323 				result_dec = (rx_arg.rssi % 2);
1324 				if (result_dec == 1) {
1325 					result_dec = (result_dec * 10) / 2;
1326 					result_int += 1;
1327 				}
1328 				pcar += sprintf(pcar, "Path%d RSSI=%d.%d ", i, result_int, result_dec);
1329 			} else
1330 				pcar += sprintf(pcar, "Path%d RSSI Fail\n", i);
1331 
1332 		}
1333 	} else if (strncmp(input, "physts", 6) == 0) {
1334 		struct rtw_mp_rx_arg rx_arg;
1335 		bool bon;
1336 
1337 		if (strncmp(input, "physts on", 9) == 0)
1338 			bon = true;
1339 		else
1340 			bon = false;
1341 
1342 		_rtw_memset((void *)&rx_arg, 0, sizeof(struct rtw_mp_rx_arg));
1343 		rtw_mp_phl_rx_physts(padapter, &rx_arg, bon);
1344 		if (rx_arg.cmd_ok)
1345 			sprintf(extra, "start OK" );
1346 		else
1347 			sprintf(extra, "start Fail");
1348 	}
1349 
1350 	wrqu->length = strlen(extra) + 1;
1351 
1352 	return 0;
1353 }
1354 
1355 
rtw_mp_trx_query(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1356 int rtw_mp_trx_query(struct net_device *dev,
1357 		     struct iw_request_info *info,
1358 		     struct iw_point *wrqu, char *extra)
1359 {
1360 	u32 txok, txfail, rxok, rxfail, rxfilterout;
1361 	_adapter *padapter = rtw_netdev_priv(dev);
1362 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
1363 
1364 
1365 	if (pmp_priv->rtw_mp_tx_method == RTW_MP_PMACT_TX)
1366 		rtw_phl_mp_tx_cmd(padapter, RTW_MP_TX_CMD_PHY_OK, pmp_priv->rtw_mp_tx_method, _FALSE);
1367 
1368 	txok = padapter->mppriv.tx.sended;
1369 	txfail = 0;
1370 	rxok = padapter->mppriv.rx_pktcount;
1371 	rxfail = padapter->mppriv.rx_crcerrpktcount;
1372 	rxfilterout = padapter->mppriv.rx_pktcount_filter_out;
1373 
1374 	_rtw_memset(extra, '\0', 128);
1375 
1376 	sprintf(extra, "Tx OK:%d, Tx Fail:%d, Rx OK:%d, CRC error:%d ,Rx Filter out:%d\n", txok, txfail, rxok, rxfail, rxfilterout);
1377 
1378 	wrqu->length = strlen(extra) + 1;
1379 
1380 	return 0;
1381 }
1382 
1383 
rtw_mp_pwrtrk(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1384 int rtw_mp_pwrtrk(struct net_device *dev,
1385 		  struct iw_request_info *info,
1386 		  struct iw_point *wrqu, char *extra)
1387 {
1388 	u8 enable;
1389 	u32 thermal;
1390 	s32 ret = 0;
1391 	_adapter *padapter = rtw_netdev_priv(dev);
1392 	u8 input[RTW_IWD_MAX_LEN];
1393 
1394 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
1395 		return -EFAULT;
1396 
1397 	_rtw_memset(extra, 0, wrqu->length);
1398 
1399 	enable = RTW_MP_TSSI_OFF;
1400 	if (wrqu->length > 1) {
1401 		/* not empty string*/
1402 		if (strncmp(input, "off", 3) == 0) {
1403 			enable = RTW_MP_TSSI_OFF;
1404 			sprintf(extra, "TSSI power tracking off");
1405 		} else if (strncmp(input, "on", 2) == 0) {
1406 			enable = RTW_MP_TSSI_ON;
1407 			sprintf(extra, "TSSI power tracking on");
1408 		} else if (strncmp(input, "cal", 3) == 0) {
1409 			enable = RTW_MP_TSSI_CAL;
1410 			sprintf(extra, "TSSI cal");
1411 		} else {
1412 			input[wrqu->length] = '\0';
1413 			enable = rtw_atoi(input);
1414 			sprintf(extra, "TSSI power tracking %d", enable);
1415 		}
1416 		if (enable <= RTW_MP_TSSI_CAL)
1417 			ret = rtw_mp_set_tssi_pwrtrk(padapter, enable);
1418 		if (ret == false)
1419 			sprintf(extra, "set TSSI power tracking fail");
1420 	} else {
1421 		enable = rtw_mp_get_tssi_pwrtrk(padapter);
1422 		sprintf(extra, "Get TSSI state: %d\n\
1423 		incput (int/str): [0]:off / [1]:on / [2]:cal for TSSI Tracking", enable);
1424 	}
1425 	wrqu->length = strlen(extra);
1426 
1427 	return 0;
1428 }
1429 
rtw_mp_psd(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1430 int rtw_mp_psd(struct net_device *dev,
1431 	       struct iw_request_info *info,
1432 	       struct iw_point *wrqu, char *extra)
1433 {
1434 	_adapter *padapter = rtw_netdev_priv(dev);
1435 	u8		input[RTW_IWD_MAX_LEN];
1436 
1437 	_rtw_memset(input, 0, sizeof(input));
1438 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
1439 		return -EFAULT;
1440 
1441 	input[wrqu->length] = '\0';
1442 	strcpy(extra, input);
1443 
1444 	wrqu->length = mp_query_psd(padapter, extra);
1445 
1446 	return 0;
1447 }
1448 
1449 
rtw_mp_thermal(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1450 int rtw_mp_thermal(struct net_device *dev,
1451 		   struct iw_request_info *info,
1452 		   struct iw_point *wrqu, char *extra)
1453 {
1454 	u8 val[4] = {0};
1455 	u8 ret = 0;
1456 	u16 ther_path_addr[4] = {0};
1457 	u16 cnt = 1;
1458 	_adapter *padapter = rtw_netdev_priv(dev);
1459 	int rfpath = RF_PATH_A;
1460 
1461 	if (copy_from_user(extra, wrqu->pointer, wrqu->length))
1462 		return -EFAULT;
1463 
1464 	if ((strncmp(extra, "write", 6) == 0)) {
1465 #if 0
1466 		int i;
1467 		u16 raw_cursize = 0, raw_maxsize = 0;
1468 
1469 		raw_maxsize = efuse_GetavailableSize(padapter);
1470 		RTW_INFO("[eFuse available raw size]= %d bytes\n", raw_maxsize - raw_cursize);
1471 		if (2 > raw_maxsize - raw_cursize) {
1472 			RTW_INFO("no available efuse!\n");
1473 			return -EFAULT;
1474 		}
1475 
1476 		for (i = 0; i < GET_HAL_RFPATH_NUM(adapter_to_dvobj(padapter)); i++) {
1477 				GetThermalMeter(padapter, i , &val[i]);
1478 				if (ther_path_addr[i] != 0 && val[i] != 0) {
1479 					if (rtw_efuse_map_write(padapter, ther_path_addr[i], cnt, &val[i]) == _FAIL) {
1480 						RTW_INFO("Error efuse write thermal addr 0x%x ,val = 0x%x\n", ther_path_addr[i], val[i]);
1481 						return -EFAULT;
1482 					}
1483 				} else {
1484 						RTW_INFO("Error efuse write thermal Null addr,val \n");
1485 						return -EFAULT;
1486 				}
1487 		}
1488 #endif
1489 		_rtw_memset(extra, 0, wrqu->length);
1490 		sprintf(extra, " efuse write ok :%d", val[0]);
1491 	} else {
1492 		ret = sscanf(extra, "%d", &rfpath);
1493 		if (ret < 1) {
1494 			rfpath = RF_PATH_A;
1495 			RTW_INFO("default thermal of path(%d)\n", rfpath);
1496 		}
1497 		if (rfpath >= GET_HAL_RFPATH_NUM(adapter_to_dvobj(padapter)))
1498 			return -EINVAL;
1499 
1500 		RTW_INFO("read thermal of path(%d)\n", rfpath);
1501 		GetThermalMeter(padapter, rfpath, &val[0]);
1502 
1503 		_rtw_memset(extra, 0, wrqu->length);
1504 		sprintf(extra, "%d [0x%hhx]", val[0], val[0]);
1505 	}
1506 
1507 	wrqu->length = strlen(extra);
1508 
1509 	return 0;
1510 }
1511 
1512 
1513 
rtw_mp_reset_stats(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1514 int rtw_mp_reset_stats(struct net_device *dev,
1515 		       struct iw_request_info *info,
1516 		       struct iw_point *wrqu, char *extra)
1517 {
1518 	struct mp_priv *pmp_priv;
1519 	_adapter *padapter = rtw_netdev_priv(dev);
1520 
1521 	pmp_priv = &padapter->mppriv;
1522 
1523 	pmp_priv->tx.sended = 0;
1524 	pmp_priv->tx_pktcount = 0;
1525 	pmp_priv->rx_pktcount = 0;
1526 	pmp_priv->rx_pktcount_filter_out = 0;
1527 	pmp_priv->rx_crcerrpktcount = 0;
1528 
1529 	rtw_mp_reset_phy_count(padapter);
1530 
1531 	_rtw_memset(extra, 0, wrqu->length);
1532 	sprintf(extra, "mp_reset_stats ok\n");
1533 	wrqu->length = strlen(extra);
1534 
1535 	return 0;
1536 }
1537 
1538 
rtw_mp_dump(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1539 int rtw_mp_dump(struct net_device *dev,
1540 		struct iw_request_info *info,
1541 		struct iw_point *wrqu, char *extra)
1542 {
1543 	struct mp_priv *pmp_priv;
1544 	u8		input[RTW_IWD_MAX_LEN];
1545 	_adapter *padapter = rtw_netdev_priv(dev);
1546 
1547 	pmp_priv = &padapter->mppriv;
1548 
1549 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
1550 		return -EFAULT;
1551 
1552 	if (strncmp(input, "all", 4) == 0) {
1553 		//mac_reg_dump(RTW_DBGDUMP, padapter);
1554 		//bb_reg_dump(RTW_DBGDUMP, padapter);
1555 		//rf_reg_dump(RTW_DBGDUMP, padapter);
1556 	}
1557 	return 0;
1558 }
1559 
1560 
rtw_mp_phypara(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1561 int rtw_mp_phypara(struct net_device *dev,
1562 		   struct iw_request_info *info,
1563 		   struct iw_point *wrqu, char *extra)
1564 {
1565 
1566 	_adapter *padapter = rtw_netdev_priv(dev);
1567 	char	input[RTW_IWD_MAX_LEN];
1568 	u32		invalxcap = 0, ret = 0;
1569 
1570 
1571 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
1572 		return -EFAULT;
1573 
1574 	RTW_INFO("%s:priv in=%s\n", __func__, input);
1575 
1576 	if (strncmp(input, "xcap=", 5) == 0) {
1577 		if ((sscanf(input+4, "=0x%x", &invalxcap) == 1) ||
1578 			(sscanf(input+4, "=%d", &invalxcap) == 1)) {
1579 			if (invalxcap < 255) {
1580 				rtw_mp_set_crystal_cap(padapter, invalxcap);
1581 				sprintf(extra, "Set xcap = %d [0x%hhx]", invalxcap, invalxcap);
1582 			} else
1583 				sprintf(extra, "Error formats , inpunt value over 255 !\n");
1584 
1585 			wrqu->length = strlen(extra);
1586 			return ret;
1587 		}
1588 	}
1589 
1590 	sprintf(extra, "Error formats , inpunt [xcap=%%d/0x%%x]\n");
1591 
1592 	wrqu->length = strlen(extra);
1593 	return ret;
1594 }
1595 
1596 
rtw_mp_SetRFPath(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1597 int rtw_mp_SetRFPath(struct net_device *dev,
1598 		     struct iw_request_info *info,
1599 		     struct iw_point *wrqu, char *extra)
1600 {
1601 	_adapter *padapter = rtw_netdev_priv(dev);
1602 	char	input[RTW_IWD_MAX_LEN];
1603 	int		bMain = 1, bTurnoff = 1;
1604 #ifdef CONFIG_ANTENNA_DIVERSITY
1605 	u8 ret = _TRUE;
1606 #endif
1607 
1608 	RTW_INFO("%s:iwpriv in=%s\n", __func__, input);
1609 
1610 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
1611 		return -EFAULT;
1612 #if 0
1613 	bMain = strncmp(input, "1", 2); /* strncmp TRUE is 0*/
1614 	bTurnoff = strncmp(input, "0", 3); /* strncmp TRUE is 0*/
1615 
1616 	_rtw_memset(extra, 0, wrqu->length);
1617 #ifdef CONFIG_ANTENNA_DIVERSITY
1618 	if (bMain == 0)
1619 		ret = rtw_mp_set_antdiv(padapter, _TRUE);
1620 	else
1621 		ret = rtw_mp_set_antdiv(padapter, _FALSE);
1622 	if (ret == _FALSE)
1623 		RTW_INFO("%s:ANTENNA_DIVERSITY FAIL\n", __func__);
1624 #endif
1625 
1626 	if (bMain == 0) {
1627 		MP_PHY_SetRFPathSwitch(padapter, _TRUE);
1628 		RTW_INFO("%s:PHY_SetRFPathSwitch=TRUE\n", __func__);
1629 		sprintf(extra, "mp_setrfpath Main\n");
1630 
1631 	} else if (bTurnoff == 0) {
1632 		MP_PHY_SetRFPathSwitch(padapter, _FALSE);
1633 		RTW_INFO("%s:PHY_SetRFPathSwitch=FALSE\n", __func__);
1634 		sprintf(extra, "mp_setrfpath Aux\n");
1635 	} else {
1636 		bMain = MP_PHY_QueryRFPathSwitch(padapter);
1637 		RTW_INFO("%s:Query RF Path = %s\n", __func__, (bMain ? "Main":"Aux"));
1638 		sprintf(extra, "RF Path %s\n" , (bMain ? "1":"0"));
1639 	}
1640 #endif
1641 	wrqu->length = strlen(extra);
1642 
1643 	return 0;
1644 }
1645 
1646 
rtw_mp_switch_rf_path(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1647 int rtw_mp_switch_rf_path(struct net_device *dev,
1648 			struct iw_request_info *info,
1649 			struct iw_point *wrqu, char *extra)
1650 {
1651 	_adapter *padapter = rtw_netdev_priv(dev);
1652 	struct mp_priv *pmp_priv;
1653 	char	input[RTW_IWD_MAX_LEN];
1654 	int		bwlg = 1, bwla = 1, btg = 1, bbt=1;
1655 	u8 ret = 0;
1656 
1657 
1658 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
1659 		return -EFAULT;
1660 
1661 	pmp_priv = &padapter->mppriv;
1662 
1663 	RTW_INFO("%s: in=%s\n", __func__, input);
1664 
1665 #ifdef CONFIG_RTL8821C /* only support for 8821c wlg/wla/btg/bt RF switch path */
1666 	if ((strncmp(input, "WLG", 3) == 0) || (strncmp(input, "1", 1) == 0)) {
1667 		pmp_priv->rf_path_cfg = SWITCH_TO_WLG;
1668 		sprintf(extra, "switch rf path WLG\n");
1669 
1670 	} else if ((strncmp(input, "WLA", 3) == 0) || (strncmp(input, "2", 1) == 0)) {
1671 		pmp_priv->rf_path_cfg = SWITCH_TO_WLA;
1672 		sprintf(extra, "switch rf path WLA\n");
1673 
1674 	} else if ((strncmp(input, "BTG", 3) == 0) || (strncmp(input, "0", 1) == 0)) {
1675 		pmp_priv->rf_path_cfg = SWITCH_TO_BTG;
1676 		sprintf(extra, "switch rf path BTG\n");
1677 
1678 	} else if ((strncmp(input, "BT", 3) == 0) || (strncmp(input, "3", 1) == 0)) {
1679 		pmp_priv->rf_path_cfg = SWITCH_TO_BT;
1680 		sprintf(extra, "switch rf path BT\n");
1681 	} else {
1682 		pmp_priv->rf_path_cfg = SWITCH_TO_WLG;
1683 		sprintf(extra, "Error input, default set WLG\n");
1684 		return -EFAULT;
1685 	}
1686 
1687 	mp_phy_switch_rf_path_set(padapter, &pmp_priv->rf_path_cfg);
1688 #endif
1689 	wrqu->length = strlen(extra);
1690 
1691 	return ret;
1692 
1693 }
rtw_mp_QueryDrv(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)1694 int rtw_mp_QueryDrv(struct net_device *dev,
1695 		    struct iw_request_info *info,
1696 		    union iwreq_data *wrqu, char *extra)
1697 {
1698 	_adapter *padapter = rtw_netdev_priv(dev);
1699 	char	input[RTW_IWD_MAX_LEN];
1700 	int	qAutoLoad = 1;
1701 	//struct efuse_info *efuse = adapter_to_efuse(padapter);
1702 
1703 	if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
1704 		return -EFAULT;
1705 	RTW_INFO("%s:iwpriv in=%s\n", __func__, input);
1706 
1707 	qAutoLoad = strncmp(input, "autoload", 8); /* strncmp TRUE is 0*/
1708 
1709 	if (qAutoLoad == 0) {
1710 		RTW_INFO("%s:qAutoLoad\n", __func__);
1711 
1712 		//if (efuse->is_autoload_fail)
1713 		//	sprintf(extra, "fail");
1714 		//else
1715 		//	sprintf(extra, "ok");
1716 	}
1717 	wrqu->data.length = strlen(extra) + 1;
1718 	return 0;
1719 }
1720 
1721 
rtw_mp_PwrCtlDM(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1722 int rtw_mp_PwrCtlDM(struct net_device *dev,
1723 		    struct iw_request_info *info,
1724 		    struct iw_point *wrqu, char *extra)
1725 {
1726 	_adapter *padapter = rtw_netdev_priv(dev);
1727 	u8		input[RTW_IWD_MAX_LEN];
1728 	u8		pwrtrk_state = 0;
1729 	u8		pwtk_type[5][25] = {"Thermal tracking off","Thermal tracking on",
1730 					"TSSI tracking off","TSSI tracking on","TSSI calibration"};
1731 
1732 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
1733 		return -EFAULT;
1734 
1735 	input[wrqu->length] = '\0';
1736 	RTW_INFO("%s: in=%s\n", __func__, input);
1737 
1738 	if (wrqu->length == 2) {
1739 		if(input[0] >= '0' && input[0] <= '4') {
1740 			pwrtrk_state = rtw_atoi(input);
1741 			/*MPT_PwrCtlDM(padapter, pwrtrk_state);*/
1742 			sprintf(extra, "PwrCtlDM start %s\n" , pwtk_type[pwrtrk_state]);
1743 		} else {
1744 			sprintf(extra, "Error unknown number ! Please check your input number\n"
1745 				" 0 : Thermal tracking off\n 1 : Thermal tracking on\n 2 : TSSI tracking off\n"
1746 				" 3 : TSSI tracking on\n 4 : TSSI calibration\n");
1747 		}
1748 		wrqu->length = strlen(extra);
1749 
1750 		return 0;
1751 	}
1752 	if (strncmp(input, "start", 5) == 0 || strncmp(input, "thertrk on", 10) == 0) {/* strncmp TRUE is 0*/
1753 		pwrtrk_state = 1;
1754 		sprintf(extra, "PwrCtlDM start %s\n" , pwtk_type[pwrtrk_state]);
1755 	} else if (strncmp(input, "thertrk off", 11) == 0 || strncmp(input, "stop", 5) == 0) {
1756 		pwrtrk_state = 0;
1757 		sprintf(extra, "PwrCtlDM stop %s\n" , pwtk_type[pwrtrk_state]);
1758 	} else if (strncmp(input, "tssitrk off", 11) == 0){
1759 		pwrtrk_state = 2;
1760 		sprintf(extra, "PwrCtlDM stop %s\n" , pwtk_type[pwrtrk_state]);
1761 	} else if (strncmp(input, "tssitrk on", 10) == 0){
1762 		pwrtrk_state = 3;
1763 		sprintf(extra, "PwrCtlDM start %s\n" , pwtk_type[pwrtrk_state]);
1764 	} else if (strncmp(input, "tssik", 5) == 0){
1765 		pwrtrk_state = 4;
1766 		sprintf(extra, "PwrCtlDM start %s\n" , pwtk_type[pwrtrk_state]);
1767 	} else {
1768 		pwrtrk_state = 0;
1769 		sprintf(extra, "Error input, default PwrCtlDM stop\n"
1770 			" thertrk off : Thermal tracking off\n thertrk on : Thermal tracking on\n"
1771 			" tssitrk off : TSSI tracking off\n tssitrk on : TSSI tracking on\n tssik : TSSI calibration\n\n"
1772 			" 0 : Thermal tracking off\n 1 : Thermal tracking on\n 2 : TSSI tracking off\n"
1773 			" 3 : TSSI tracking on\n 4 : TSSI calibration\n");
1774 	}
1775 
1776 	/*MPT_PwrCtlDM(padapter, pwrtrk_state);*/
1777 	wrqu->length = strlen(extra);
1778 
1779 	return 0;
1780 }
1781 
rtw_mp_iqk(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1782 int rtw_mp_iqk(struct net_device *dev,
1783 		 struct iw_request_info *info,
1784 		 struct iw_point *wrqu, char *extra)
1785 {
1786 	_adapter *padapter = rtw_netdev_priv(dev);
1787 
1788 	rtw_mp_trigger_iqk(padapter);
1789 
1790 	return 0;
1791 }
1792 
rtw_mp_lck(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1793 int rtw_mp_lck(struct net_device *dev,
1794 		 struct iw_request_info *info,
1795 		 struct iw_point *wrqu, char *extra)
1796 {
1797 	_adapter *padapter = rtw_netdev_priv(dev);
1798 
1799 	rtw_mp_trigger_lck(padapter);
1800 
1801 	return 0;
1802 }
1803 
rtw_mp_dpk(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)1804 int rtw_mp_dpk(struct net_device *dev,
1805 			struct iw_request_info *info,
1806 			union iwreq_data *wrqu, char *extra)
1807 {
1808 	_adapter *padapter = rtw_netdev_priv(dev);
1809 	//struct dm_struct *phydm = adapter_to_phydm(padapter);
1810 	struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
1811 
1812 	u8 ips_mode = IPS_NUM; /* init invalid value */
1813 	u8 lps_mode = PM_PS_MODE_NUM; /* init invalid value */
1814 
1815 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
1816 		return -EFAULT;
1817 
1818 	*(extra + wrqu->data.length) = '\0';
1819 
1820 	if (strncmp(extra, "off", 3) == 0 && strlen(extra) < 4) {
1821 			//phydm->dpk_info.is_dpk_enable = 0;
1822 			//halrf_dpk_enable_disable(phydm);
1823 			sprintf(extra, "set dpk off\n");
1824 
1825 	} else if (strncmp(extra, "on", 2) == 0 && strlen(extra) < 3) {
1826 			//phydm->dpk_info.is_dpk_enable = 1;
1827 			//halrf_dpk_enable_disable(phydm);
1828 			sprintf(extra, "set dpk on\n");
1829 	} else	{
1830 #ifdef CONFIG_LPS
1831 			lps_mode = pwrctrlpriv->power_mgnt;/* keep org value */
1832 			rtw_pm_set_lps(padapter, PM_PS_MODE_ACTIVE);
1833 #endif
1834 #ifdef CONFIG_IPS
1835 			ips_mode = pwrctrlpriv->ips_mode;/* keep org value */
1836 			rtw_pm_set_ips(padapter, IPS_NONE);
1837 #endif
1838 			rtw_mp_trigger_dpk(padapter);
1839 	if (padapter->registrypriv.mp_mode == 0) {
1840 #ifdef CONFIG_IPS
1841 			rtw_pm_set_ips(padapter, ips_mode);
1842 #endif /* CONFIG_IPS */
1843 
1844 #ifdef CONFIG_LPS
1845 			rtw_pm_set_lps(padapter, lps_mode);
1846 #endif /* CONFIG_LPS */
1847 	}
1848 			sprintf(extra, "set dpk trigger\n");
1849 	}
1850 
1851 	wrqu->data.length = strlen(extra);
1852 
1853 	return 0;
1854 }
1855 
rtw_mp_get_tsside(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1856 int rtw_mp_get_tsside(struct net_device *dev,
1857 			 struct iw_request_info *info,
1858 			 struct iw_point *wrqu, char *extra)
1859 {
1860 	_adapter *padapter = rtw_netdev_priv(dev);
1861 	char input[RTW_IWD_MAX_LEN];
1862 	u8 rfpath = 0xff;
1863 	s8 tssi_de = 0;
1864 	char pout_str_buf[7];
1865 	char tgr_str_buf[7];
1866 	u8 pout_signed_flag = 0 , tgrpwr_signed_flag = 0;
1867 	int int_num = 0;
1868 	u32 dec_num = 0;
1869 	s32 pout = 0;
1870 	s32 tgrpwr = 0;
1871 	int i;
1872 
1873 	if (wrqu->length > 128)
1874 		return -EFAULT;
1875 
1876 	_rtw_memset(input, 0, sizeof(input));
1877 
1878 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
1879 		return -EFAULT;
1880 	input[wrqu->length] = '\0';
1881 
1882 	if (wrqu->length == 2) {
1883 		rfpath = rtw_atoi(input);
1884 		if (rfpath >= 0 && rfpath <= 3) {
1885 			tssi_de = rtw_mp_get_tssi_de(padapter, rfpath);
1886 		} else
1887 			sprintf(extra, "Invalid command format, please indicate RF path 0/1/2/3");
1888 
1889 	} else if (sscanf(input + 1, "dbm=%7s pwr=%7s", tgr_str_buf , pout_str_buf) == 2) {
1890 		/*
1891 		* rtwpriv wlan0 mp_get_tsside adbm=12 pwr=12
1892 		* [adbm] target power [pwr] output power
1893 		* rf_path : 0 = adbm , 1 = bdbm
1894 		* dbm : -15.00 ~ 25.00
1895 		* pwr : -15.00 ~ 25.00
1896 		* ex : rtwpriv wlan0 mp_get_tsside adbm=16 pwr=14.25
1897 		*/
1898 		RTW_INFO("%s: in=tgr_str %s  pout_str %s\n", __func__, tgr_str_buf , pout_str_buf);
1899 		switch (input[0]) {
1900 		case 'a':
1901 			rfpath = RF_PATH_A;
1902 			break;
1903 		case 'b':
1904 			rfpath = RF_PATH_B;
1905 			break;
1906 		case 'c':
1907 			rfpath = RF_PATH_C;
1908 			break;
1909 		case 'd':
1910 			rfpath = RF_PATH_D;
1911 			break;
1912 		default:
1913 			goto error;
1914 			break;
1915 		}
1916 
1917 		if(pout_str_buf[0] == '-')
1918 			pout_signed_flag = 1;
1919 
1920 		i = sscanf(pout_str_buf, "%d.%2u", &int_num, &dec_num);
1921 		pout = int_num * 100;
1922 		RTW_DBG("%s:pout %d int %d dec %d\n", __func__, pout, int_num , dec_num);
1923 
1924 		if (i == 2) {
1925 			/* Convert decimal number
1926 			 * ex : 0.1 => 100, -0.1 => 100*/
1927 			dec_num = (dec_num < 1) ? dec_num * 10 : dec_num;
1928 			dec_num = (dec_num < 10) ? dec_num * 1 : dec_num;
1929 			pout += ((pout < 0 || pout_signed_flag == 1) ? -dec_num : dec_num);
1930 		}
1931 		if (pout < -1500 || 2500 < pout)
1932 			goto error;
1933 		RTW_INFO("%s:pout %d\n", __func__, pout);
1934 
1935 		if (tgr_str_buf[0] == '-')
1936 			tgrpwr_signed_flag = 1;
1937 
1938 		int_num = 0;
1939 		dec_num = 0;
1940 
1941 		i = sscanf(tgr_str_buf, "%d.%2u", &int_num, &dec_num);
1942 		tgrpwr = int_num * 100;
1943 		RTW_DBG("%s:tgrpwr %d int %d dec %d\n", __func__, tgrpwr, int_num , dec_num);
1944 
1945 		if (i == 2) {
1946 			/* Convert decimal number
1947 			 * ex : 0.1 => 100, -0.1 => 100*/
1948 			dec_num = (dec_num < 1) ? dec_num * 10 : dec_num;
1949 			dec_num = (dec_num < 10) ? dec_num * 1 : dec_num;
1950 			tgrpwr += ((tgrpwr < 0 || tgrpwr_signed_flag == 1) ? -dec_num : dec_num);
1951 		}
1952 		if (tgrpwr < -1500 || 2500 < tgrpwr)
1953 			goto error;
1954 		RTW_INFO("%s:tgrpwr %d\n", __func__, tgrpwr);
1955 
1956 		tssi_de = (s8)rtw_mp_get_online_tssi_de(padapter, pout, tgrpwr, rfpath);
1957 	}
1958 
1959 	if (rfpath == 0)
1960 		sprintf(extra, "patha=%d hex:%x", tssi_de, (u8)tssi_de);
1961 	else if (rfpath == 1)
1962 		sprintf(extra, "pathb=%d hex:%x", tssi_de, (u8)tssi_de);
1963 	else if (rfpath == 2)
1964 		sprintf(extra, "pathc=%d hex:%x", tssi_de, (u8)tssi_de);
1965 	else if (rfpath == 3)
1966 		sprintf(extra, "pathd=%d hex:%x", tssi_de, (u8)tssi_de);
1967 	else
1968 		goto error;
1969 
1970 	wrqu->length = strlen(extra);
1971 	return 0;
1972 error:
1973 
1974 	sprintf(extra, "Invalid command format, please indicate RF path mp_get_tsside [0/1/2/3]\n\
1975 			GET ONLINE TSSI DE:\n\
1976 			mp_get_tsside adbm=-15.00 ~ 25.00 pwr=-15.00 ~ 25.00\n\
1977 			mp_get_tsside bdbm=-15.00 ~ 25.00 pwr=-15.00 ~ 25.00\n");
1978 	wrqu->length = strlen(extra);
1979 
1980 	return 0;
1981 }
1982 
rtw_mp_set_tsside(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)1983 int rtw_mp_set_tsside(struct net_device *dev,
1984 		   struct iw_request_info *info,
1985 		   struct iw_point *wrqu, char *extra)
1986 {
1987 	u32 tsside_val = 0;
1988 	u8 rf_path = RF_PATH_A;
1989 	char input[RTW_IWD_MAX_LEN];
1990 
1991 	_adapter *padapter = rtw_netdev_priv(dev);
1992 
1993 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
1994 		return -EFAULT;
1995 
1996 	RTW_INFO("%s:input =[%s]\n", __func__, input);
1997 
1998 	switch (input[4]) {
1999 	case 'a':
2000 		rf_path = RF_PATH_A;
2001 		break;
2002 	case 'b':
2003 		rf_path = RF_PATH_B;
2004 		break;
2005 	case 'c':
2006 		rf_path = RF_PATH_C;
2007 		break;
2008 	case 'd':
2009 		rf_path = RF_PATH_D;
2010 		break;
2011 	default:
2012 		goto exit_err;
2013 	}
2014 
2015 	if ((sscanf(input+5, "=0x%x", &tsside_val) == 1) ||
2016 		(sscanf(input+5, "=%d", &tsside_val) == 1)) {
2017 		if (tsside_val > 255)
2018 			sprintf(extra, "Error TSSI DE value: %d over 255" , tsside_val);
2019 		else {
2020 			sprintf(extra, "Set TSSI DE path_%s: %d",
2021 				rf_path == RF_PATH_A ? "A" : rf_path == RF_PATH_B ? "B" :
2022 				rf_path == RF_PATH_C ? "C":"D", tsside_val);
2023 			rtw_mp_set_tsside2verify(padapter, tsside_val, rf_path);
2024 		}
2025 	} else
2026 		goto exit_err;
2027 
2028 	wrqu->length = strlen(extra);
2029 
2030 	return 0;
2031 
2032 exit_err:
2033 	sprintf(extra, "Invalid command format,\n\t\t"
2034 			"please input TSSI DE value within patha/b/c/d=[decimal] or [hex:0xXX]");
2035 
2036 	wrqu->length = strlen(extra);
2037 
2038 	return 0;
2039 }
2040 
rtw_mp_getver(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)2041 int rtw_mp_getver(struct net_device *dev,
2042 		  struct iw_request_info *info,
2043 		  union iwreq_data *wrqu, char *extra)
2044 {
2045 	_adapter *padapter = rtw_netdev_priv(dev);
2046 	struct mp_priv *pmp_priv;
2047 
2048 	pmp_priv = &padapter->mppriv;
2049 
2050 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2051 		return -EFAULT;
2052 
2053 	sprintf(extra, "rtwpriv=%d\n", RTWPRIV_VER_INFO);
2054 	wrqu->data.length = strlen(extra);
2055 	return 0;
2056 }
2057 
2058 
rtw_mp_mon(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)2059 int rtw_mp_mon(struct net_device *dev,
2060 	       struct iw_request_info *info,
2061 	       union iwreq_data *wrqu, char *extra)
2062 {
2063 	_adapter *padapter = rtw_netdev_priv(dev);
2064 	struct mp_priv *pmp_priv = &padapter->mppriv;
2065 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2066 	//struct hal_ops *pHalFunc = &hal->hal_func;
2067 	NDIS_802_11_NETWORK_INFRASTRUCTURE networkType;
2068 	int bstart = 1, bstop = 1;
2069 
2070 	networkType = Ndis802_11Infrastructure;
2071 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2072 		return -EFAULT;
2073 
2074 	*(extra + wrqu->data.length) = '\0';
2075 	rtw_pm_set_ips(padapter, IPS_NONE);
2076 	LeaveAllPowerSaveMode(padapter);
2077 
2078 #if 0 //def CONFIG_MP_INCLUDED
2079 	if (init_mp_priv(padapter) == _FAIL)
2080 		RTW_INFO("%s: initialize MP private data Fail!\n", __func__);
2081 	padapter->mppriv.channel = 6;
2082 
2083 	bstart = strncmp(extra, "start", 5); /* strncmp TRUE is 0*/
2084 	bstop = strncmp(extra, "stop", 4); /* strncmp TRUE is 0*/
2085 	if (bstart == 0) {
2086 		mp_join(padapter, WIFI_FW_ADHOC_STATE);
2087 		SetPacketRx(padapter, _TRUE, _FALSE);
2088 		SetChannel(padapter);
2089 		pmp_priv->rx_bindicatePkt = _TRUE;
2090 		pmp_priv->bRTWSmbCfg = _TRUE;
2091 		sprintf(extra, "monitor mode start\n");
2092 	} else if (bstop == 0) {
2093 		SetPacketRx(padapter, _FALSE, _FALSE);
2094 		pmp_priv->rx_bindicatePkt = _FALSE;
2095 		pmp_priv->bRTWSmbCfg = _FALSE;
2096 		padapter->registrypriv.mp_mode = 1;
2097 		pHalFunc->hal_deinit(padapter);
2098 		padapter->registrypriv.mp_mode = 0;
2099 		pHalFunc->hal_init(padapter);
2100 		/*rtw_disassoc_cmd(padapter, 0, 0);*/
2101 		if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE) == _TRUE) {
2102 			rtw_disassoc_cmd(padapter, 500, 0);
2103 			rtw_indicate_disconnect(padapter, 0, _FALSE);
2104 			/*rtw_free_assoc_resources_cmd(padapter, _TRUE, 0);*/
2105 		}
2106 		rtw_pm_set_ips(padapter, IPS_NORMAL);
2107 		sprintf(extra, "monitor mode Stop\n");
2108 	}
2109 #endif
2110 	wrqu->data.length = strlen(extra);
2111 	return 0;
2112 }
2113 
rtw_mp_pretx_proc(_adapter * padapter,u8 bstart,char * extra)2114 int rtw_mp_pretx_proc(_adapter *padapter, u8 bstart, char *extra)
2115 {
2116 	struct mp_priv *pmp_priv = &padapter->mppriv;
2117 	char *pextra = extra;
2118 
2119 	switch (pmp_priv->mode) {
2120 
2121 	case MP_PACKET_TX:
2122 		if (bstart == 0) {
2123 			pmp_priv->tx.stop = 1;
2124 			pmp_priv->mode = MP_ON;
2125 			sprintf(extra, "Stop continuous Tx");
2126 		} else if (pmp_priv->tx.stop == 1) {
2127 			pextra = extra + strlen(extra);
2128 			pextra += sprintf(pextra, "\nStart continuous DA=ffffffffffff len=1500 count=%u\n", pmp_priv->tx.count);
2129 			pmp_priv->tx.stop = 0;
2130 			/*SetPacketTx(padapter);*/
2131 		} else
2132 			return -EFAULT;
2133 		rtw_set_phl_packet_tx(padapter, bstart);
2134 		return 0;
2135 	case MP_SINGLE_TONE_TX:
2136 		if (bstart != 0)
2137 			strcat(extra, "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.");
2138 
2139 		rtw_mp_singletone_tx(padapter, (u8)bstart);
2140 		break;
2141 	case MP_CONTINUOUS_TX:
2142 		if (bstart != 0)
2143 			strcat(extra, "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.");
2144 		rtw_mp_continuous_tx(padapter, (u8)bstart);
2145 		break;
2146 	case MP_CARRIER_SUPPRISSION_TX:
2147 		if (bstart != 0) {
2148 			if (rtw_mp_hwrate2mptrate(pmp_priv->rateidx) <= MPT_RATE_11M)
2149 				strcat(extra, "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.");
2150 			else
2151 				strcat(extra, "\nSpecify carrier suppression but not CCK rate");
2152 		}
2153 		rtw_mp_carriersuppr_tx(padapter, (u8)bstart);
2154 		break;
2155 	case MP_SINGLE_CARRIER_TX:
2156 		if (bstart != 0)
2157 			strcat(extra, "\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.");
2158 		rtw_mp_singlecarrier_tx(padapter, (u8)bstart);
2159 		break;
2160 	default:
2161 		sprintf(extra, "Error! Continuous-Tx is not on-going.");
2162 		return -EFAULT;
2163 	}
2164 
2165 	if (bstart == 1 && pmp_priv->mode != MP_ON) {
2166 		struct mp_priv *pmp_priv = &padapter->mppriv;
2167 
2168 		if (pmp_priv->tx.stop == 0) {
2169 			pmp_priv->tx.stop = 1;
2170 			rtw_msleep_os(5);
2171 		}
2172 #ifdef CONFIG_80211N_HT
2173 		if(padapter->registrypriv.ht_enable &&
2174 			is_supported_ht(padapter->registrypriv.wireless_mode))
2175 			pmp_priv->tx.attrib.ht_en = 1;
2176 #endif
2177 		pmp_priv->tx.stop = 0;
2178 		pmp_priv->tx.count = 1;
2179 		if (pmp_priv->rtw_mp_tx_method == RTW_MP_PMACT_TX) {
2180 			pmp_priv->rtw_mp_tx_method = RTW_MP_TMACT_TX;
2181 			rtw_set_phl_packet_tx(padapter, bstart); /* send 1 pkt for trigger HW non-pkt Tx*/
2182 			pmp_priv->rtw_mp_tx_method = RTW_MP_PMACT_TX;
2183 		}
2184 		/*SetPacketTx(padapter);*/
2185 	} else
2186 		pmp_priv->mode = MP_ON;
2187 
2188 	return 0;
2189 }
2190 
2191 
rtw_mp_tx(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)2192 int rtw_mp_tx(struct net_device *dev,
2193 	      struct iw_request_info *info,
2194 	      union iwreq_data *wrqu, char *extra)
2195 {
2196 	_adapter *padapter = rtw_netdev_priv(dev);
2197 	struct mp_priv *pmp_priv = &padapter->mppriv;
2198 	PMPT_CONTEXT		pMptCtx = &(padapter->mppriv.mpt_ctx);
2199 	char *pextra = extra;
2200 	u32 bandwidth = 0, sg = 0, channel = 6, txpower = 40, rate = 108, ant = 0, txmode = 1, count = 0;
2201 	u8 bStartTest = 1, status = 0;
2202 #ifdef CONFIG_MP_VHT_HW_TX_MODE
2203 	u8 Idx = 0, tmpU1B;
2204 #endif
2205 	u16 antenna = 0;
2206 
2207 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2208 		return -EFAULT;
2209 	RTW_INFO("extra = %s\n", extra);
2210 #if 0
2211 #ifdef CONFIG_CONCURRENT_MODE
2212 	if (!is_primary_adapter(padapter)) {
2213 		sprintf(extra, "Error: MP mode can't support Virtual adapter, Please to use main adapter.\n");
2214 		wrqu->data.length = strlen(extra);
2215 		return 0;
2216 	}
2217 #endif
2218 
2219 	if (strncmp(extra, "stop", 3) == 0) {
2220 		bStartTest = 0; /* To set Stop*/
2221 		pmp_priv->tx.stop = 1;
2222 		sprintf(extra, "Stop continuous Tx");
2223 		status = rtw_mp_pretx_proc(padapter, bStartTest, extra);
2224 		wrqu->data.length = strlen(extra);
2225 		return status;
2226 	} else if (strncmp(extra, "count", 5) == 0) {
2227 		if (sscanf(extra, "count=%d", &count) < 1)
2228 			RTW_INFO("Got Count=%d]\n", count);
2229 		pmp_priv->tx.count = count;
2230 		return 0;
2231 	} else if (strncmp(extra, "setting", 7) == 0) {
2232 		_rtw_memset(extra, 0, wrqu->data.length);
2233 		pextra += sprintf(pextra, "Current Setting :\n Channel:%d", pmp_priv->channel);
2234 		pextra += sprintf(pextra, "\n Bandwidth:%d", pmp_priv->bandwidth);
2235 		pextra += sprintf(pextra, "\n Rate index:%d", pmp_priv->rateidx);
2236 		pextra += sprintf(pextra, "\n TxPower index:%d", pmp_priv->txpoweridx);
2237 		pextra += sprintf(pextra, "\n Antenna TxPath:%d", pmp_priv->antenna_tx);
2238 		pextra += sprintf(pextra, "\n Antenna RxPath:%d", pmp_priv->antenna_rx);
2239 		pextra += sprintf(pextra, "\n MP Mode:%d", pmp_priv->mode);
2240 		wrqu->data.length = strlen(extra);
2241 		return 0;
2242 #ifdef CONFIG_MP_VHT_HW_TX_MODE
2243 	} else if (strncmp(extra, "pmact", 5) == 0) {
2244 		if (strncmp(extra, "pmact=", 6) == 0) {
2245 			_rtw_memset(&pMptCtx->PMacTxInfo, 0, sizeof(pMptCtx->PMacTxInfo));
2246 			if (strncmp(extra, "pmact=start", 11) == 0) {
2247 				pMptCtx->PMacTxInfo.bEnPMacTx = _TRUE;
2248 				sprintf(extra, "Set PMac Tx Mode start\n");
2249 			} else {
2250 				pMptCtx->PMacTxInfo.bEnPMacTx = _FALSE;
2251 				sprintf(extra, "Set PMac Tx Mode Stop\n");
2252 			}
2253 			if (pMptCtx->bldpc == TRUE)
2254 				pMptCtx->PMacTxInfo.bLDPC = _TRUE;
2255 
2256 			if (pMptCtx->bstbc == TRUE)
2257 				pMptCtx->PMacTxInfo.bSTBC = _TRUE;
2258 
2259 			pMptCtx->PMacTxInfo.bSPreamble = pmp_priv->preamble;
2260 			pMptCtx->PMacTxInfo.bSGI = pmp_priv->preamble;
2261 			pMptCtx->PMacTxInfo.BandWidth = pmp_priv->bandwidth;
2262 			pMptCtx->PMacTxInfo.TX_RATE = HwRateToMPTRate(pmp_priv->rateidx);
2263 
2264 			pMptCtx->PMacTxInfo.Mode = pMptCtx->HWTxmode;
2265 
2266 			pMptCtx->PMacTxInfo.NDP_sound = FALSE;/*(adapter.PacketType == NDP_PKT)?TRUE:FALSE;*/
2267 
2268 			if (padapter->mppriv.pktInterval == 0)
2269 				pMptCtx->PMacTxInfo.PacketPeriod = 100;
2270 			else
2271 				pMptCtx->PMacTxInfo.PacketPeriod = padapter->mppriv.pktInterval;
2272 
2273 			if (padapter->mppriv.pktLength < 1000)
2274 				pMptCtx->PMacTxInfo.PacketLength = 1000;
2275 			else
2276 				pMptCtx->PMacTxInfo.PacketLength = padapter->mppriv.pktLength;
2277 
2278 			pMptCtx->PMacTxInfo.PacketPattern  = rtw_random32() % 0xFF;
2279 
2280 			if (padapter->mppriv.tx_pktcount != 0)
2281 				pMptCtx->PMacTxInfo.PacketCount = padapter->mppriv.tx_pktcount;
2282 
2283 			pMptCtx->PMacTxInfo.Ntx = 0;
2284 			for (Idx = 16; Idx < 20; Idx++) {
2285 				tmpU1B = (padapter->mppriv.antenna_tx >> Idx) & 1;
2286 				if (tmpU1B)
2287 					pMptCtx->PMacTxInfo.Ntx++;
2288 			}
2289 
2290 			_rtw_memset(pMptCtx->PMacTxInfo.MacAddress, 0xFF, ETH_ALEN);
2291 
2292 			PMAC_Get_Pkt_Param(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
2293 
2294 			if (MPT_IS_CCK_RATE(pMptCtx->PMacTxInfo.TX_RATE))
2295 
2296 				CCK_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
2297 			else {
2298 				PMAC_Nsym_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
2299 				/* 24 BIT*/
2300 				L_SIG_generator(pMptCtx->PMacPktInfo.N_sym, &pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
2301 			}
2302 			/*	48BIT*/
2303 			if (MPT_IS_HT_RATE(pMptCtx->PMacTxInfo.TX_RATE))
2304 				HT_SIG_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
2305 			else if (MPT_IS_VHT_RATE(pMptCtx->PMacTxInfo.TX_RATE)) {
2306 				/*	48BIT*/
2307 				VHT_SIG_A_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
2308 
2309 				/*	26/27/29 BIT  & CRC 8 BIT*/
2310 				VHT_SIG_B_generator(&pMptCtx->PMacTxInfo);
2311 
2312 				/* 32 BIT*/
2313 				VHT_Delimiter_generator(&pMptCtx->PMacTxInfo);
2314 			}
2315 
2316 			mpt_ProSetPMacTx(padapter);
2317 
2318 		} else if (strncmp(extra, "pmact,mode=", 11) == 0) {
2319 			int txmode = 0;
2320 
2321 			if (sscanf(extra, "pmact,mode=%d", &txmode) > 0) {
2322 				if (txmode == 1) {
2323 					pMptCtx->HWTxmode = CONTINUOUS_TX;
2324 					sprintf(extra, "\t Config HW Tx mode = CONTINUOUS_TX\n");
2325 				} else if (txmode == 2) {
2326 					pMptCtx->HWTxmode = OFDM_Single_Tone_TX;
2327 					sprintf(extra, "\t Config HW Tx mode = OFDM_Single_Tone_TX\n");
2328 				} else {
2329 					pMptCtx->HWTxmode = PACKETS_TX;
2330 					sprintf(extra, "\t Config HW Tx mode = PACKETS_TX\n");
2331 				}
2332 			} else {
2333 				pMptCtx->HWTxmode = PACKETS_TX;
2334 				sprintf(extra, "\t Config HW Tx mode=\n 0 = PACKETS_TX\n 1 = CONTINUOUS_TX\n 2 = OFDM_Single_Tone_TX");
2335 			}
2336 		} else if (strncmp(extra, "pmact,", 6) == 0) {
2337 			int PacketPeriod = 0, PacketLength = 0, PacketCout = 0;
2338 			int bldpc = 0, bstbc = 0;
2339 
2340 			if (sscanf(extra, "pmact,period=%d", &PacketPeriod) > 0) {
2341 				padapter->mppriv.pktInterval = PacketPeriod;
2342 				RTW_INFO("PacketPeriod=%d\n", padapter->mppriv.pktInterval);
2343 				sprintf(extra, "PacketPeriod [1~255]= %d\n", padapter->mppriv.pktInterval);
2344 
2345 			} else if (sscanf(extra, "pmact,length=%d", &PacketLength) > 0) {
2346 				padapter->mppriv.pktLength = PacketLength;
2347 				RTW_INFO("PacketPeriod=%d\n", padapter->mppriv.pktLength);
2348 				sprintf(extra, "PacketLength[~65535]=%d\n", padapter->mppriv.pktLength);
2349 
2350 			} else if (sscanf(extra, "pmact,count=%d", &PacketCout) > 0) {
2351 				padapter->mppriv.tx_pktcount = PacketCout;
2352 				RTW_INFO("Packet Cout =%d\n", padapter->mppriv.tx_pktcount);
2353 				sprintf(extra, "Packet Cout =%d\n", padapter->mppriv.tx_pktcount);
2354 
2355 			} else if (sscanf(extra, "pmact,ldpc=%d", &bldpc) > 0) {
2356 				pMptCtx->bldpc = bldpc;
2357 				RTW_INFO("Set LDPC =%d\n", pMptCtx->bldpc);
2358 				sprintf(extra, "Set LDPC =%d\n", pMptCtx->bldpc);
2359 
2360 			} else if (sscanf(extra, "pmact,stbc=%d", &bstbc) > 0) {
2361 				pMptCtx->bstbc = bstbc;
2362 				RTW_INFO("Set STBC =%d\n", pMptCtx->bstbc);
2363 				sprintf(extra, "Set STBC =%d\n", pMptCtx->bstbc);
2364 			} else
2365 				sprintf(extra, "\n period={1~255}\n length={1000~65535}\n count={0~}\n ldpc={0/1}\n stbc={0/1}");
2366 
2367 		}
2368 
2369 		wrqu->data.length = strlen(extra);
2370 		return 0;
2371 #endif
2372 	} else {
2373 
2374 		if (sscanf(extra, "ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d", &channel, &bandwidth, &rate, &txpower, &ant, &txmode) < 6) {
2375 			RTW_INFO("Invalid format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode);
2376 			_rtw_memset(extra, 0, wrqu->data.length);
2377 			pextra += sprintf(pextra, "\n Please input correct format as bleow:\n");
2378 			pextra += sprintf(pextra, "\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", channel, bandwidth, rate, txpower, ant, txmode);
2379 			pextra += sprintf(pextra, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]");
2380 			pextra += sprintf(pextra, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]");
2381 			pextra += sprintf(pextra, "\n [ rate :	CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]");
2382 			pextra += sprintf(pextra, "\n [		OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>");
2383 			pextra += sprintf(pextra, "\n [		HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >");
2384 			pextra += sprintf(pextra, "\n [		HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >");
2385 			pextra += sprintf(pextra, "\n [		VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >");
2386 			pextra += sprintf(pextra, "\n [ txpower : 1~63 power index");
2387 			pextra += sprintf(pextra, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12");
2388 			pextra += sprintf(pextra, "\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n");
2389 			wrqu->data.length = strlen(extra);
2390 			return status;
2391 
2392 		} else {
2393 			char *pextra = extra;
2394 			RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode);
2395 			_rtw_memset(extra, 0, wrqu->data.length);
2396 			sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel);
2397 			padapter->mppriv.channel = channel;
2398 			SetChannel(padapter);
2399 			pHalData->current_channel = channel;
2400 
2401 			if (bandwidth == 1)
2402 				bandwidth = CHANNEL_WIDTH_40;
2403 			else if (bandwidth == 2)
2404 				bandwidth = CHANNEL_WIDTH_80;
2405 			pextra = extra + strlen(pextra);
2406 			pextra += sprintf(pextra, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth, bandwidth);
2407 			padapter->mppriv.bandwidth = (u8)bandwidth;
2408 			padapter->mppriv.preamble = sg;
2409 			SetBandwidth(padapter);
2410 			pHalData->current_channel_bw = bandwidth;
2411 
2412 			pextra += sprintf(pextra, "\nSet power level :%d", txpower);
2413 			padapter->mppriv.txpoweridx = (u8)txpower;
2414 			pMptCtx->TxPwrLevel[RF_PATH_A] = (u8)txpower;
2415 			pMptCtx->TxPwrLevel[RF_PATH_B] = (u8)txpower;
2416 			pMptCtx->TxPwrLevel[RF_PATH_C] = (u8)txpower;
2417 			pMptCtx->TxPwrLevel[RF_PATH_D]  = (u8)txpower;
2418 			SetTxPower(padapter);
2419 
2420 			RTW_INFO("%s: bw=%d sg=%d\n", __func__, bandwidth, sg);
2421 
2422 			if (rate <= 0x7f)
2423 				rate = wifirate2_ratetbl_inx((u8)rate);
2424 			else if (rate < 0xC8)
2425 				rate = (rate - 0x80 + MPT_RATE_MCS0);
2426 			/*HT  rate 0x80(MCS0)  ~ 0x8F(MCS15) ~ 0x9F(MCS31) 128~159
2427 			VHT1SS~2SS rate 0xA0 (VHT1SS_MCS0 44) ~ 0xB3 (VHT2SS_MCS9 #63) 160~179
2428 			VHT rate 0xB4 (VHT3SS_MCS0 64) ~ 0xC7 (VHT2SS_MCS9 #83) 180~199
2429 			else
2430 			VHT rate 0x90(VHT1SS_MCS0) ~ 0x99(VHT1SS_MCS9) 144~153
2431 			rate =(rate - MPT_RATE_VHT1SS_MCS0);
2432 			*/
2433 			RTW_INFO("%s: rate index=%d\n", __func__, rate);
2434 			if (rate >= MPT_RATE_LAST)
2435 				return -EINVAL;
2436 			pextra += sprintf(pextra, "\nSet data rate to %d index %d", padapter->mppriv.rateidx, rate);
2437 
2438 			padapter->mppriv.rateidx = rate;
2439 			pMptCtx->mpt_rate_index = rate;
2440 			SetDataRate(padapter);
2441 
2442 			pextra += sprintf(pextra, "\nSet Antenna Path :%d", ant);
2443 			switch (ant) {
2444 			case 1:
2445 				antenna = ANTENNA_A;
2446 				break;
2447 			case 2:
2448 				antenna = ANTENNA_B;
2449 				break;
2450 			case 4:
2451 				antenna = ANTENNA_C;
2452 				break;
2453 			case 8:
2454 				antenna = ANTENNA_D;
2455 				break;
2456 			case 3:
2457 				antenna = ANTENNA_AB;
2458 				break;
2459 			case 5:
2460 				antenna = ANTENNA_AC;
2461 				break;
2462 			case 9:
2463 				antenna = ANTENNA_AD;
2464 				break;
2465 			case 6:
2466 				antenna = ANTENNA_BC;
2467 				break;
2468 			case 10:
2469 				antenna = ANTENNA_BD;
2470 				break;
2471 			case 12:
2472 				antenna = ANTENNA_CD;
2473 				break;
2474 			case 7:
2475 				antenna = ANTENNA_ABC;
2476 				break;
2477 			case 14:
2478 				antenna = ANTENNA_BCD;
2479 				break;
2480 			case 11:
2481 				antenna = ANTENNA_ABD;
2482 				break;
2483 			case 15:
2484 				antenna = ANTENNA_ABCD;
2485 				break;
2486 			}
2487 			RTW_INFO("%s: antenna=0x%x\n", __func__, antenna);
2488 			padapter->mppriv.antenna_tx = antenna;
2489 			padapter->mppriv.antenna_rx = antenna;
2490 			pHalData->antenna_tx_path = antenna;
2491 			SetAntenna(padapter);
2492 
2493 			if (txmode == 0)
2494 				pmp_priv->mode = MP_CONTINUOUS_TX;
2495 			else if (txmode == 1) {
2496 				pmp_priv->mode = MP_PACKET_TX;
2497 				pmp_priv->tx.count = count;
2498 			} else if (txmode == 2)
2499 				pmp_priv->mode = MP_SINGLE_TONE_TX;
2500 			else if (txmode == 3)
2501 				pmp_priv->mode = MP_CARRIER_SUPPRISSION_TX;
2502 			else if (txmode == 4)
2503 				pmp_priv->mode = MP_SINGLE_CARRIER_TX;
2504 
2505 			status = rtw_mp_pretx_proc(padapter, bStartTest, extra);
2506 		}
2507 
2508 	}
2509 #endif
2510 	wrqu->data.length = strlen(extra);
2511 	return status;
2512 }
2513 
2514 
rtw_mp_rx(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)2515 int rtw_mp_rx(struct net_device *dev,
2516 	      struct iw_request_info *info,
2517 	      union iwreq_data *wrqu, char *extra)
2518 {
2519 	_adapter *padapter = rtw_netdev_priv(dev);
2520 	struct mp_priv *pmp_priv = &padapter->mppriv;
2521 	char *pextra = extra;
2522 	u32 bandwidth = 0, sg = 0, channel = 6, ant = 0;
2523 	u16 antenna = 0;
2524 	u8 bStartRx = 0;
2525 
2526 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2527 		return -EFAULT;
2528 #if 0
2529 #ifdef CONFIG_CONCURRENT_MODE
2530 	if (!is_primary_adapter(padapter)) {
2531 		sprintf(extra, "Error: MP mode can't support Virtual adapter, Please to use main adapter.\n");
2532 		wrqu->data.length = strlen(extra);
2533 		return 0;
2534 	}
2535 #endif
2536 
2537 	if (strncmp(extra, "stop", 4) == 0) {
2538 		_rtw_memset(extra, 0, wrqu->data.length);
2539 		SetPacketRx(padapter, bStartRx, _FALSE);
2540 		pmp_priv->bmac_filter = _FALSE;
2541 		sprintf(extra, "Received packet OK:%d CRC error:%d ,Filter out:%d", padapter->mppriv.rx_pktcount, padapter->mppriv.rx_crcerrpktcount, padapter->mppriv.rx_pktcount_filter_out);
2542 		wrqu->data.length = strlen(extra);
2543 		return 0;
2544 
2545 	} else if (sscanf(extra, "ch=%d,bw=%d,ant=%d", &channel, &bandwidth, &ant) < 3) {
2546 		RTW_INFO("Invalid format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant);
2547 		_rtw_memset(extra, 0, wrqu->data.length);
2548 		pextra += sprintf(pextra, "\n Please input correct format as bleow:\n");
2549 		pextra += sprintf(pextra, "\t ch=%d,bw=%d,ant=%d\n", channel, bandwidth, ant);
2550 		pextra += sprintf(pextra, "\n [ ch : BGN = <1~14> , A or AC = <36~165> ]");
2551 		pextra += sprintf(pextra, "\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]");
2552 		pextra += sprintf(pextra, "\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12");
2553 		wrqu->data.length = strlen(extra);
2554 		return 0;
2555 
2556 	} else {
2557 		char *pextra = extra;
2558 		bStartRx = 1;
2559 		RTW_INFO("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant);
2560 		_rtw_memset(extra, 0, wrqu->data.length);
2561 		sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel);
2562 		padapter->mppriv.channel = channel;
2563 		SetChannel(padapter);
2564 		pHalData->current_channel = channel;
2565 
2566 		if (bandwidth == 1)
2567 			bandwidth = CHANNEL_WIDTH_40;
2568 		else if (bandwidth == 2)
2569 			bandwidth = CHANNEL_WIDTH_80;
2570 		pextra = extra + strlen(extra);
2571 		pextra += sprintf(pextra, "\nChange Current Bandwidth %d to Bandwidth %d", padapter->mppriv.bandwidth, bandwidth);
2572 		padapter->mppriv.bandwidth = (u8)bandwidth;
2573 		padapter->mppriv.preamble = sg;
2574 		SetBandwidth(padapter);
2575 		pHalData->current_channel_bw = bandwidth;
2576 
2577 		pextra += sprintf(pextra, "\nSet Antenna Path :%d", ant);
2578 		switch (ant) {
2579 		case 1:
2580 			antenna = ANTENNA_A;
2581 			break;
2582 		case 2:
2583 			antenna = ANTENNA_B;
2584 			break;
2585 		case 4:
2586 			antenna = ANTENNA_C;
2587 			break;
2588 		case 8:
2589 			antenna = ANTENNA_D;
2590 			break;
2591 		case 3:
2592 			antenna = ANTENNA_AB;
2593 			break;
2594 		case 5:
2595 			antenna = ANTENNA_AC;
2596 			break;
2597 		case 9:
2598 			antenna = ANTENNA_AD;
2599 			break;
2600 		case 6:
2601 			antenna = ANTENNA_BC;
2602 			break;
2603 		case 10:
2604 			antenna = ANTENNA_BD;
2605 			break;
2606 		case 12:
2607 			antenna = ANTENNA_CD;
2608 			break;
2609 		case 7:
2610 			antenna = ANTENNA_ABC;
2611 			break;
2612 		case 14:
2613 			antenna = ANTENNA_BCD;
2614 			break;
2615 		case 11:
2616 			antenna = ANTENNA_ABD;
2617 			break;
2618 		case 15:
2619 			antenna = ANTENNA_ABCD;
2620 			break;
2621 		}
2622 		RTW_INFO("%s: antenna=0x%x\n", __func__, antenna);
2623 		padapter->mppriv.antenna_tx = antenna;
2624 		padapter->mppriv.antenna_rx = antenna;
2625 		pHalData->antenna_tx_path = antenna;
2626 		SetAntenna(padapter);
2627 
2628 		strcat(extra, "\nstart Rx");
2629 		SetPacketRx(padapter, bStartRx, _FALSE);
2630 	}
2631 #endif
2632 	wrqu->data.length = strlen(extra);
2633 	return 0;
2634 }
2635 
2636 
rtw_mp_hwtx(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)2637 int rtw_mp_hwtx(struct net_device *dev,
2638 		struct iw_request_info *info,
2639 		union iwreq_data *wrqu, char *extra)
2640 {
2641 	_adapter *padapter = rtw_netdev_priv(dev);
2642 	struct mp_priv *pmp_priv = &padapter->mppriv;
2643 	PMPT_CONTEXT mpt_ctx = &(padapter->mppriv.mpt_ctx);
2644 
2645 #if defined(CONFIG_RTL8821B) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8822C)
2646 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2647 		return -EFAULT;
2648 	*(extra + wrqu->data.length) = '\0';
2649 
2650 	_rtw_memset(&mpt_ctx->PMacTxInfo, 0, sizeof(RT_PMAC_TX_INFO));
2651 	_rtw_memcpy((void *)&mpt_ctx->PMacTxInfo, (void *)extra, sizeof(RT_PMAC_TX_INFO));
2652 	_rtw_memset(extra, 0, wrqu->data.length);
2653 
2654 	if (mpt_ctx->PMacTxInfo.bEnPMacTx == 1 && pmp_priv->mode != MP_ON) {
2655 		sprintf(extra, "MP Tx Running, Please Set PMac Tx Mode Stop\n");
2656 		RTW_INFO("Error !!! MP Tx Running, Please Set PMac Tx Mode Stop\n");
2657 	} else {
2658 		RTW_INFO("To set MAC Tx mode\n");
2659 		mpt_ProSetPMacTx(padapter);
2660 		sprintf(extra, "Set PMac Tx Mode OK\n");
2661 	}
2662 	wrqu->data.length = strlen(extra);
2663 #endif
2664 	return 0;
2665 
2666 }
2667 
rtw_mp_pwrlmt(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)2668 int rtw_mp_pwrlmt(struct net_device *dev,
2669 			struct iw_request_info *info,
2670 			union iwreq_data *wrqu, char *extra)
2671 {
2672 	_adapter *padapter = rtw_netdev_priv(dev);
2673 	struct registry_priv  *registry_par = &padapter->registrypriv;
2674 	u8 pwrlimtstat = 0;
2675 
2676 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2677 		return -EFAULT;
2678 
2679 	*(extra + wrqu->data.length) = '\0';
2680 #if CONFIG_TXPWR_LIMIT
2681 	if (strncmp(extra, "off", 3) == 0 && strlen(extra) < 4) {
2682 		if (rtw_mpt_set_power_limit_en(padapter, _FALSE))
2683 			sprintf(extra, "Turn off Power Limit\n");
2684 		else
2685 			sprintf(extra, "Turn off Power Limit Fail\n");
2686 	} else if (strncmp(extra, "on", 2) == 0 && strlen(extra) < 3) {
2687 		if (rtw_mpt_set_power_limit_en(padapter, _TRUE))
2688 			sprintf(extra, "Turn on Power Limit\n");
2689 		else
2690 			sprintf(extra, "Turn on Power Limit Fail\n");
2691 	} else
2692 #endif
2693 	{
2694 		sprintf(extra, "PHL PWRLMT:%s\n",
2695 			(rtw_mpt_get_power_limit_en(padapter) == _TRUE) ?"ON" :"OFF");
2696 	}
2697 	wrqu->data.length = strlen(extra);
2698 	return 0;
2699 }
2700 
rtw_mp_dpk_track(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)2701 int rtw_mp_dpk_track(struct net_device *dev,
2702 			struct iw_request_info *info,
2703 			union iwreq_data *wrqu, char *extra)
2704 {
2705 	_adapter *padapter = rtw_netdev_priv(dev);
2706 	//struct dm_struct *phydm = adapter_to_phydm(padapter);
2707 
2708 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2709 		return -EFAULT;
2710 
2711 	*(extra + wrqu->data.length) = '\0';
2712 
2713 	if (strncmp(extra, "off", 3) == 0 && strlen(extra) < 4) {
2714 		//halrf_set_dpk_track(phydm, FALSE);
2715 		sprintf(extra, "set dpk track off\n");
2716 
2717 	} else if (strncmp(extra, "on", 2) == 0 && strlen(extra) < 3) {
2718 		//halrf_set_dpk_track(phydm, TRUE);
2719 		sprintf(extra, "set dpk track on\n");
2720 	}
2721 
2722 	wrqu->data.length = strlen(extra);
2723 	return 0;
2724 }
2725 
rtw_mp_set_phl_io(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)2726 int rtw_mp_set_phl_io(struct net_device *dev,
2727 			 struct iw_request_info *info,
2728 			 struct iw_point *wrqu, char *extra)
2729 {
2730 	_adapter *padapter = rtw_netdev_priv(dev);
2731 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
2732 	struct phl_info_t *phl_info = (struct phl_info_t *)(dvobj->phl);
2733 	struct rtw_mp_cmd_arg *cmd_arg = NULL;
2734 	struct rtw_mp_test_cmdbuf *pcmdbuf = NULL;
2735 	u16 i = 0;
2736 
2737 	if (copy_from_user(extra, wrqu->pointer, wrqu->length))
2738 			return -EFAULT;
2739 
2740 	RTW_INFO("%s, wrqu->length %d !!!\n", __func__, wrqu->length);
2741 
2742 	rtw_phl_test_submodule_cmd_process(rtw_phl_get_com(phl_info), (void*)extra, wrqu->length);
2743 	pcmdbuf = (struct rtw_mp_test_cmdbuf *)extra;
2744 	while (1) {
2745 		if (pcmdbuf) {
2746 			cmd_arg = (struct rtw_mp_cmd_arg *)pcmdbuf->buf;
2747 			rtw_phl_test_submodule_get_rpt(rtw_phl_get_com(phl_info), (void *)extra, wrqu->length);
2748 		}
2749 		if (cmd_arg != NULL && cmd_arg->cmd_ok) {
2750 			RTW_INFO("%s,GET CMD OK !!!\n", __func__);
2751 			break;
2752 		} else {
2753 			i++;
2754 			rtw_msleep_os(100);
2755 			if (i == 3) {
2756 				RTW_INFO("%s,GET CMD FAIL !!!\n", __func__);
2757 				break;
2758 			}
2759 		}
2760 	}
2761 
2762 	if (copy_to_user(wrqu->pointer, extra, wrqu->length))
2763 		return -EFAULT;
2764 
2765 	return 0;
2766 }
2767 
rtw_mp_get_phl_io(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)2768 int rtw_mp_get_phl_io(struct net_device *dev,
2769 			 struct iw_request_info *info,
2770 			 struct iw_point *wrqu, char *extra)
2771 {
2772 	_adapter *padapter = rtw_netdev_priv(dev);
2773 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
2774 	struct phl_info_t *phl_info = (struct phl_info_t *)(padapter->dvobj->phl);
2775 
2776 	if (copy_from_user(extra, wrqu->pointer, wrqu->length))
2777 			return -EFAULT;
2778 	*(extra + wrqu->length) = '\0';
2779 
2780 	rtw_phl_test_submodule_get_rpt(rtw_phl_get_com(phl_info), (void *)&extra, wrqu->length);
2781 
2782 	wrqu->length = strlen(extra);
2783 
2784 	return 0;
2785 }
2786 
rtw_mp_tx_pattern_idx(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)2787 int rtw_mp_tx_pattern_idx(struct net_device *dev,
2788 			 struct iw_request_info *info,
2789 			 union iwreq_data *wrqu, char *extra)
2790 {
2791 	_adapter *padapter = rtw_netdev_priv(dev);
2792 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
2793 
2794 	u32 tx_patt_idx = 0;
2795 	u32 ppdu_type = 0;
2796 
2797 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2798 		return -EFAULT;
2799 
2800 	if (sscanf(extra, "index=%d,type=%d", &tx_patt_idx, &ppdu_type) > 0) {
2801 		RTW_INFO("%s: tx_patt_idx=%d ,ppdu_type=%d\n", __func__, tx_patt_idx , ppdu_type);
2802 		pmp_priv->rtw_mp_pmact_patt_idx = tx_patt_idx;
2803 		pmp_priv->rtw_mp_pmact_ppdu_type = ppdu_type;
2804 		rtw_phl_mp_tx_cmd(padapter, RTW_MP_TX_CONFIG_PLCP_PATTERN, pmp_priv->rtw_mp_tx_method, _TRUE);
2805 		_rtw_memset(extra, 0, wrqu->data.length);
2806 		sprintf(extra, "Config Tx Pattern idx %d to %d", pmp_priv->rtw_mp_pmact_patt_idx, tx_patt_idx);
2807 	} else if ((strncmp(extra, "stop", 4) == 0)) {
2808 		rtw_phl_mp_tx_cmd(padapter, RTW_MP_TX_CONFIG_PLCP_PATTERN, pmp_priv->rtw_mp_tx_method, _FALSE);
2809 		_rtw_memset(extra, 0, wrqu->data.length);
2810 		sprintf(extra, "Config Tx Pattern Stop");
2811 	} else {
2812 		u8 *pstr = extra;
2813 		_rtw_memset(pstr, 0, wrqu->data.length);
2814 	}
2815 	wrqu->data.length = strlen(extra);
2816 	return 0;
2817 }
2818 
rtw_mp_tx_plcp_tx_data(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)2819 int rtw_mp_tx_plcp_tx_data(struct net_device *dev,
2820 			 struct iw_request_info *info,
2821 			 union iwreq_data *wrqu, char *extra)
2822 {
2823 	_adapter *padapter = rtw_netdev_priv(dev);
2824 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
2825 	u8 user_idx = pmp_priv->mp_plcp_useridx;
2826 
2827 
2828 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2829 		return -EFAULT;
2830 
2831 	if ((strncmp(extra, "ppdu", 4) == 0)) {
2832 		u32 ppdu_type = 0;
2833 
2834 		if (sscanf(extra, "ppdu=%d", &ppdu_type) > 0) {
2835 				u8 *pextra = extra;
2836 
2837 				RTW_INFO("%s: ppdu_type=%d\n", __func__, ppdu_type);
2838 				_rtw_memset(extra, 0, wrqu->data.length);
2839 
2840 				pextra += sprintf(pextra, "Config PPDU Type %s to %s\n",
2841 						PPDU_TYPE_STR(pmp_priv->rtw_mp_pmact_ppdu_type), PPDU_TYPE_STR(ppdu_type));
2842 				pmp_priv->rtw_mp_pmact_ppdu_type = ppdu_type;
2843 
2844 				rtw_update_giltf(padapter);
2845 				rtw_mp_update_coding(padapter);
2846 
2847 				if (ppdu_type >= RTW_MP_TYPE_HE_MU_OFDMA) {
2848 					u8 ru_num = 0 , rualloc_num = 0 ,i = 0;
2849 
2850 					ru_num = rtw_mp_update_ru_tone(padapter);
2851 					rualloc_num = rtw_mp_update_ru_alloc(padapter);
2852 					pextra += sprintf(pextra, "\nCurrent [%s] RU Alloc index:%d\n",
2853 												RU_TONE_STR(pmp_priv->rtw_mp_ru_tone),
2854 												pmp_priv->mp_plcp_user[user_idx].ru_alloc);
2855 
2856 					pextra += sprintf(pextra, "RU Alloc list:[");
2857 					for (i = 0;i <= rualloc_num - 1; i++)
2858 						pextra += sprintf(pextra, "%d ", pmp_priv->ru_alloc_list[i]);
2859 					pextra += sprintf(pextra, "]\n");
2860 
2861 					pextra += sprintf(pextra, "\nRU Tone support list(Refer Coding:%s):\n",
2862 												(pmp_priv->mp_plcp_user[user_idx].coding ? "LDPC":"BCC"));
2863 					for (i = 0;i <= ru_num; i++)
2864 						pextra += sprintf(pextra, "%d : [%s]\n",
2865 												pmp_priv->ru_tone_sel_list[i],
2866 												RU_TONE_STR(pmp_priv->ru_tone_sel_list[i]));
2867 					pextra += sprintf(pextra, "\n\nCodingCMD:[mp_plcp_user coding=%%d] (0:BCC 1:LDPC )");
2868 					pextra += sprintf(pextra, "\nRU Tone CMD:[ mp_plcp_user ru_tone=%%d ]");
2869 					pextra += sprintf(pextra, "\nRU Alloc CMD:[ mp_plcp_user ru_alloc=%%d ]");
2870 				}
2871 		} else {
2872 			u8 *pstr = extra;
2873 			_rtw_memset(pstr, 0, wrqu->data.length);
2874 			pstr += sprintf(pstr, "CMD: [mp_plcp_datappdu=%%d]\nPLCP (PPDU Type):\n\
2875 0:CCK\n1:LEGACY\n2:HT_MF\n3:HT_GF\n4:VHT\n5:HE_SU\n6:HE_ER_SU\n7:HE_MU_OFDMA\n8:HE_TB\n");
2876 			}
2877 	}else if ((strncmp(extra, "preamble", 8) == 0)) {
2878 		u8 preamble = 0;
2879 
2880 		if (sscanf(extra, "preamble=%hhd", &preamble) > 0) {
2881 			RTW_INFO("%s: preamble=%d\n", __func__, preamble);
2882 			_rtw_memset(extra, 0, wrqu->data.length);
2883 
2884 			if (rtw_mp_is_cck_rate(pmp_priv->rateidx)) {
2885 				pmp_priv->preamble = preamble;
2886 				sprintf(extra, "Config Preamble %d to %d", pmp_priv->preamble, preamble);
2887 			} else
2888 				sprintf(extra, "Error !!! only B mode Rate for Preamble!\n");
2889 		} else
2890 			sprintf(extra, "Error format ! input 'preamble=[num]'\n");
2891 
2892 	} else if ((strncmp(extra, "stbc", 4) == 0)) {
2893 		u8 stbc = 0;
2894 
2895 		if (sscanf(extra, "stbc=%hhd", &stbc) > 0) {
2896 				RTW_INFO("%s: stbc=%d\n", __func__, stbc);
2897 				_rtw_memset(extra, 0, wrqu->data.length);
2898 				sprintf(extra, "Config STBC enable: %d to %d", pmp_priv->rtw_mp_stbc, stbc);
2899 				pmp_priv->rtw_mp_stbc = stbc;
2900 				if (pmp_priv->rtw_mp_stbc)
2901 					pmp_priv->mp_plcp_user[user_idx].dcm = 0;
2902 		} else {
2903 			_rtw_memset(extra, 0, wrqu->data.length);
2904 			sprintf(extra, "input [stbc=0/1]");
2905 		}
2906 
2907 	} else if ((strncmp(extra, "giltf", 5) == 0)) {
2908 		u8 idx = 0;
2909 		u8 giltf_num = rtw_update_giltf(padapter);
2910 
2911 		if (sscanf(extra, "giltf=%hhd", &idx) > 0) {
2912 			u8 gi = 0, ltf = 0;
2913 
2914 			RTW_INFO("%s: gi+ltf=%d\n", __func__, idx);
2915 			_rtw_memset(extra, 0, wrqu->data.length);
2916 
2917 			if (giltf_num != 0 && idx <= giltf_num) {
2918 				gi = pmp_priv->st_giltf[idx].gi;
2919 				ltf = pmp_priv->st_giltf[idx].ltf;
2920 				sprintf(extra, "Config GI+LTF to %s ", pmp_priv->st_giltf[idx].type_str);
2921 				pmp_priv->rtw_mp_plcp_gi = gi;
2922 				pmp_priv->rtw_mp_plcp_ltf = ltf;
2923 				RTW_INFO("%s: gi=%d ltf=%d\n", __func__, gi, ltf);
2924 			} else
2925 				sprintf(extra, "Not support GI+LTF index\n");
2926 
2927 		} else {
2928 			u8 *pextra = extra;
2929 			u8 i = 0;
2930 
2931 			if (giltf_num > 0) {
2932 				pextra += sprintf(pextra, "GI + LTF list:\n");
2933 				for (i = 0;i <= giltf_num; i++)
2934 							pextra += sprintf(pextra, "%d:[%s]\n", i, pmp_priv->st_giltf[i].type_str);
2935 			}
2936 			sprintf(pextra, "PPDU Type Not support GI+LTF.");
2937 		}
2938 
2939 	} else if ((strncmp(extra, "tx_time", 7) == 0)) {
2940 			u32 tx_time = 0;
2941 
2942 			if (sscanf(extra, "tx_time=%d", &tx_time) > 0) {
2943 				u32 tmp_tx_time = (tx_time * 10) / 4;
2944 
2945 				pmp_priv->rtw_mp_plcp_tx_time = tmp_tx_time;
2946 				pmp_priv->rtw_mp_plcp_tx_mode = 1;
2947 				sprintf(extra, "Config Tx Time:%d us", pmp_priv->rtw_mp_plcp_tx_time);
2948 			}
2949 
2950 	} else if ((strncmp(extra, "tx_len", 6) == 0)) {
2951 			u32 tx_len = 0;
2952 
2953 			if (sscanf(extra, "tx_len=%d", &tx_len) > 0) {
2954 				pmp_priv->mp_plcp_user[user_idx].plcp_txlen = tx_len;
2955 				pmp_priv->rtw_mp_plcp_tx_mode = 0;
2956 				sprintf(extra, "Config Tx Len:%d", pmp_priv->mp_plcp_user[user_idx].plcp_txlen);
2957 		}
2958 
2959 	} else if ((strncmp(extra, "he_sigb", 7) == 0)) {
2960 			u32 he_sigb = 0;
2961 
2962 			if (sscanf(extra, "he_sigb=%d", &he_sigb) > 0) {
2963 				if (he_sigb <= 5) {
2964 					pmp_priv->rtw_mp_he_sigb = he_sigb;
2965 					sprintf(extra, "Config HE SIGB:%d", he_sigb);
2966 				} else
2967 					sprintf(extra, "Error Config HE SIGB:[%d] (0~5)", he_sigb);
2968 			} else {
2969 				u8 *pstr = extra;
2970 
2971 				_rtw_memset(pstr, 0, wrqu->data.length);
2972 				pstr += sprintf(pstr, "invalid CMD Format! input: he_sigb=[Num]\n\
2973 					PLCP (HE SIGB):\n0\n\1\n2\n\3\n\4\n\5\n");
2974 			}
2975 
2976 	} else if ((strncmp(extra, "he_sigb_dcm", 7) == 0)) {
2977 			u32 he_sigb_dcm = 0;
2978 
2979 			if (sscanf(extra, "he_sigb_dcm=%d", &he_sigb_dcm) > 0) {
2980 				if (he_sigb_dcm <= 1) {
2981 					pmp_priv->rtw_mp_he_sigb_dcm = he_sigb_dcm;
2982 					sprintf(extra, "Config HE SIGB DCM:%d", he_sigb_dcm);
2983 				} else
2984 					sprintf(extra, "Error Config HE SIGB:[%d] (0:Disable 1:Enable)", he_sigb_dcm);
2985 
2986 			} else {
2987 				u8 *pstr = extra;
2988 
2989 				_rtw_memset(pstr, 0, wrqu->data.length);
2990 				pstr += sprintf(pstr, "invalid CMD Format! input: he_sigb_dcm=[Num]\n\
2991 					PLCP (HE SIGB DCM):\n0:Disable\n1:Enable");
2992 			}
2993 
2994 	} else if ((strncmp(extra, "er_su_ru106en", 7) == 0)) {
2995 			u32 ru106en = 0;
2996 
2997 			if (sscanf(extra, "er_su_ru106en=%d", &ru106en) > 0) {
2998 				if (ru106en <= 1) {
2999 					pmp_priv->rtw_mp_he_er_su_ru_106_en = ru106en;
3000 					sprintf(extra, "Config he_er_su_ru106:%d", ru106en);
3001 				} else
3002 					sprintf(extra, "Error!!! Config HE ER SU RU106 Enable:[%d] (0:Disable 1:Enable)",
3003 										ru106en);
3004 			} else {
3005 				u8 *pstr = extra;
3006 
3007 				_rtw_memset(pstr, 0, wrqu->data.length);
3008 				pstr += sprintf(pstr, "Error!!! Config HE ER SU RU106 Enable: Input number[ 0:Disable 1:Enable ]");
3009 			}
3010 
3011 	} else if ((strncmp(extra, "ru_tone", 7) == 0)) {
3012 		u32 ru_tone = 0;
3013 
3014 		if (sscanf(extra, "ru_tone=%d", &ru_tone) > 0) {
3015 				RTW_INFO("%s: RU Tone=%d\n", __func__, ru_tone);
3016 				_rtw_memset(extra, 0, wrqu->data.length);
3017 				sprintf(extra, "Config RU tone %d to %d", pmp_priv->rtw_mp_ru_tone, ru_tone);
3018 				pmp_priv->rtw_mp_ru_tone = ru_tone;
3019 		} else {
3020 			_rtw_memset(extra, 0, wrqu->data.length);
3021 			sprintf(extra, "Error!!!\tinput , [ru_tone= number]");
3022 		}
3023 
3024 	} else {
3025 				char *pstr = extra;
3026 				u8 ppdu_idx = pmp_priv->rtw_mp_pmact_ppdu_type;
3027 
3028 				if (ppdu_idx < RTW_MP_TYPE_HT_MF) {
3029 						pstr += sprintf(pstr, "invalid PPDU Type ! input :ppdu=[Num] over the HT\n");
3030 				} else {
3031 					u8 i = 0;
3032 					u8 num = rtw_update_giltf(padapter);
3033 
3034 					_rtw_memset(extra, 0, wrqu->data.length);
3035 					pstr += sprintf(pstr, "invalid CMD Format !! please input: giltf=[Num]\n");
3036 					pstr += sprintf(pstr, "PPDU %s GI+LTF:\n", PPDU_TYPE_STR(ppdu_idx));
3037 					for (i = 0; i <= num; i++)
3038 						pstr += sprintf(pstr, "[%d]: %s\n" ,i , pmp_priv->st_giltf[i].type_str);
3039 				}
3040 		}
3041 	wrqu->data.length = strlen(extra);
3042 	return 0;
3043 }
3044 
rtw_mp_tx_plcp_tx_user(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)3045 int rtw_mp_tx_plcp_tx_user(struct net_device *dev,
3046 			 struct iw_request_info *info,
3047 			 union iwreq_data *wrqu, char *extra)
3048 {
3049 	_adapter *padapter = rtw_netdev_priv(dev);
3050 	struct mp_priv *mpprv = (struct mp_priv *)&padapter->mppriv;
3051 
3052 	u32 tx_mcs = 0;
3053 	u8 user_idx = mpprv->mp_plcp_useridx;
3054 
3055 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
3056 		return -EFAULT;
3057 
3058 	if (sscanf(extra, "mcs=%d", &tx_mcs) > 0) {
3059 		RTW_INFO("%s: mcs=%d\n", __func__, tx_mcs);
3060 		mpprv->mp_plcp_user[user_idx].plcp_mcs = tx_mcs;
3061 		_rtw_memset(extra, 0, wrqu->data.length);
3062 		sprintf(extra, "Config PLCP MCS idx %d to %d",
3063 						mpprv->mp_plcp_user[user_idx].plcp_mcs, tx_mcs);
3064 
3065 	} else if ((strncmp(extra, "dcm", 3) == 0)) {
3066 		u8 dcm = 0;
3067 
3068 		if (sscanf(extra, "dcm=%hhd", &dcm) > 0) {
3069 				RTW_INFO("%s: dcm=%d\n", __func__, dcm);
3070 				_rtw_memset(extra, 0, wrqu->data.length);
3071 				sprintf(extra, "Config DCM enable: %d to %d", mpprv->mp_plcp_user[user_idx].dcm, dcm);
3072 				mpprv->mp_plcp_user[user_idx].dcm = dcm;
3073 
3074 				if (mpprv->mp_plcp_user[user_idx].dcm)
3075 						mpprv->rtw_mp_stbc = 0;
3076 		} else {
3077 			_rtw_memset(extra, 0, wrqu->data.length);
3078 			sprintf(extra, "Error !!! input [dcm=0/1]");
3079 		}
3080 
3081 	} else if ((strncmp(extra, "coding", 6) == 0)) {
3082 		u8 coding = 0;
3083 
3084 		if (sscanf(extra, "coding=%hhd", &coding) > 0) {
3085 
3086 				RTW_INFO("%s: coding=%d\n", __func__, coding);
3087 				_rtw_memset(extra, 0, wrqu->data.length);
3088 				mpprv->mp_plcp_user[user_idx].coding = coding;
3089 				rtw_mp_update_coding(padapter);
3090 				sprintf(extra, "Config coding to %s",
3091 								(mpprv->mp_plcp_user[user_idx].coding?"LDPC":"BCC"));
3092 		} else {
3093 			_rtw_memset(extra, 0, wrqu->data.length);
3094 			sprintf(extra, "Error !!!\n0:BCC 1:LDPC \t input Number [coding=0/1]");
3095 		}
3096 
3097 	} else if ((strncmp(extra, "ru_alloc", 8) == 0)) {
3098 		u32 ru_alloc = 0;
3099 
3100 		if (sscanf(extra, "ru_alloc=%d", &ru_alloc) > 0) {
3101 
3102 				RTW_INFO("%s: RU alloc=%d\n", __func__, ru_alloc);
3103 				_rtw_memset(extra, 0, wrqu->data.length);
3104 				sprintf(extra, "Config RU alloc %d to %d",
3105 								mpprv->mp_plcp_user[user_idx].ru_alloc, ru_alloc);
3106 				mpprv->mp_plcp_user[user_idx].ru_alloc = ru_alloc;
3107 		} else {
3108 			_rtw_memset(extra, 0, wrqu->data.length);
3109 			sprintf(extra, "Error!!!\tinput , [ru_alloc= number]");
3110 		}
3111 
3112 	} else if ((strncmp(extra, "txuser", 6) == 0)) {
3113 		u32 txuser = 0;
3114 
3115 		if (sscanf(extra, "txuser=%d", &txuser) > 0) {
3116 				RTW_INFO("%s: Sel User idx=%d\n", __func__, txuser);
3117 				_rtw_memset(extra, 0, wrqu->data.length);
3118 				sprintf(extra, "config Tx User %d to %d", mpprv->rtw_mp_plcp_tx_user, txuser);
3119 				mpprv->rtw_mp_plcp_tx_user = txuser;
3120 		} else {
3121 			_rtw_memset(extra, 0, wrqu->data.length);
3122 			sprintf(extra, "Error!!!\tinput , [txuser= number]");
3123 		}
3124 
3125 	} else if ((strncmp(extra, "user", 4) == 0)) {
3126 		u32 user_idx = 0;
3127 
3128 		if (sscanf(extra, "user=%d", &user_idx) > 0) {
3129 				RTW_INFO("%s: Sel User idx=%d\n", __func__, user_idx);
3130 				_rtw_memset(extra, 0, wrqu->data.length);
3131 				sprintf(extra, "select User idx %d to %d", mpprv->mp_plcp_useridx, user_idx);
3132 				mpprv->mp_plcp_useridx = user_idx;
3133 		} else {
3134 			_rtw_memset(extra, 0, wrqu->data.length);
3135 			sprintf(extra, "Error!!!\tinput , [user= number]");
3136 		}
3137 
3138 	} else if ((strncmp(extra, "tx_len", 6) == 0)) {
3139 			u32 tx_len = 0;
3140 
3141 			if (sscanf(extra, "tx_len=%d", &tx_len) > 0) {
3142 				mpprv->mp_plcp_user[user_idx].plcp_txlen = tx_len;
3143 				mpprv->rtw_mp_plcp_tx_mode = 0;
3144 				sprintf(extra, "Config Tx Len:%d", mpprv->mp_plcp_user[user_idx].plcp_txlen);
3145 		}
3146 
3147 	} else {
3148 		u8 *pstr = extra;
3149 		_rtw_memset(pstr, 0, wrqu->data.length);
3150 
3151 		pstr += sprintf(pstr, "invalid CMD Format!\n \
3152 		\t input :\n\
3153 		\t user=%%d\n\
3154 		\t mcs=%%d\n\
3155 		\t dcm=%%d,\n\
3156 		\t coding=%%d\n\
3157 		\t ru_alloc=%%d\n");
3158 	}
3159 	wrqu->data.length = strlen(extra);
3160 	return 0;
3161 }
3162 
rtw_mp_tx_method(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)3163 int rtw_mp_tx_method(struct net_device *dev,
3164 			 struct iw_request_info *info,
3165 			 union iwreq_data *wrqu, char *extra)
3166 {
3167 	_adapter *padapter = rtw_netdev_priv(dev);
3168 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
3169 
3170 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
3171 		return -EFAULT;
3172 
3173 	if ((strncmp(extra, "PMACT", 5) == 0)) {
3174 		pmp_priv->rtw_mp_tx_method = RTW_MP_PMACT_TX;
3175 		sprintf(extra, "set PMACT OK");
3176 	} else if ((strncmp(extra, "TMACT", 5) == 0)) {
3177 		pmp_priv->rtw_mp_tx_method = RTW_MP_TMACT_TX;
3178 		rtw_phl_mp_tx_cmd(padapter, RTW_MP_TX_MODE_SWITCH, pmp_priv->rtw_mp_tx_method, _FALSE);
3179 		sprintf(extra, "set TMACT OK");
3180 	} else if ((strncmp(extra, "FWPMACT", 7) == 0)) {
3181 		pmp_priv->rtw_mp_tx_method = RTW_MP_FW_PMACT_TX;
3182 		rtw_phl_mp_tx_cmd(padapter, RTW_MP_TX_MODE_SWITCH, pmp_priv->rtw_mp_tx_method, _FALSE);
3183 		sprintf(extra, "set FWPMACT OK");
3184 	}
3185 	wrqu->data.length = strlen(extra);
3186 	return 0;
3187 }
3188 
rtw_mp_config_phy(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)3189 int rtw_mp_config_phy(struct net_device *dev,
3190 			 struct iw_request_info *info,
3191 			 union iwreq_data *wrqu, char *extra)
3192 {
3193 	_adapter *padapter = rtw_netdev_priv(dev);
3194 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
3195 	u8	set_phy = 0;
3196 
3197 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
3198 		return -EFAULT;
3199 
3200 	extra[wrqu->data.length] = '\0';
3201 	set_phy = rtw_atoi(extra);
3202 
3203 	if (set_phy < 2) {
3204 		sprintf(extra, "set current phy %d to %d", pmp_priv->rtw_mp_cur_phy, set_phy);
3205 		pmp_priv->rtw_mp_cur_phy = set_phy;
3206 		rtw_mp_phl_config_arg(padapter, RTW_MP_CONFIG_CMD_SET_PHY_INDEX);
3207 	} else
3208 		sprintf(extra, "Not suuport phy %d", set_phy);
3209 
3210 	wrqu->data.length = strlen(extra);
3211 	return 0;
3212 }
3213 
rtw_mp_phl_rfk(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)3214 int rtw_mp_phl_rfk(struct net_device *dev,
3215 			 struct iw_request_info *info,
3216 			 union iwreq_data *wrqu, char *extra)
3217 {
3218 	_adapter *padapter = rtw_netdev_priv(dev);
3219 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
3220 	u8 k_type = RTW_MP_CAL_MAX;
3221 	u8 k_cap_ctrl = false;
3222 	u8 k_cap_on = false;
3223 
3224 	if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
3225 		return -EFAULT;
3226 
3227 	if (strncmp(extra, "iqk", 3) == 0) {
3228 		k_type = RTW_MP_CAL_IQK;
3229 
3230 		if (strncmp(extra, "iqk on", 6) == 0) {
3231 			k_cap_ctrl = true;
3232 			k_cap_on = true;
3233 			sprintf(extra, "set iqk on");
3234 
3235 		} else if ((strncmp(extra, "iqk off", 7) == 0)) {
3236 			k_cap_ctrl = true;
3237 			k_cap_on = false;
3238 			sprintf(extra, "set iqk off");
3239 		} else
3240 			sprintf(extra, "set iqk trigger");
3241 
3242 	} else if (strncmp(extra, "dpk", 3) == 0) {
3243 		k_type = RTW_MP_CAL_DPK;
3244 		if (strncmp(extra, "dpk on", 6) == 0) {
3245 			k_cap_ctrl = true;
3246 			k_cap_on = true;
3247 			sprintf(extra, "set dpk on");
3248 		} else if ((strncmp(extra, "dpk off", 7) == 0)) {
3249 			k_cap_ctrl = true;
3250 			k_cap_on = false;
3251 			sprintf(extra, "set dpk off");
3252 		} else
3253 			sprintf(extra, "set dpk trigger");
3254 
3255 	} else if (strncmp(extra, "chk", 3) == 0) {
3256 		k_type = RTW_MP_CAL_CHL_RFK;
3257 		if (strncmp(extra, "chk on", 6) == 0) {
3258 			k_cap_ctrl = true;
3259 			k_cap_on = true;
3260 			sprintf(extra, "set chk on");
3261 		} else if ((strncmp(extra, "chk off", 7) == 0)) {
3262 			k_cap_ctrl = true;
3263 			k_cap_on = false;
3264 			sprintf(extra, "set chk off");
3265 		} else
3266 			sprintf(extra, "set chk trigger");
3267 
3268 	} else if (strncmp(extra, "dack", 3) == 0) {
3269 		k_type = RTW_MP_CAL_DACK;
3270 		if (strncmp(extra, "dack on", 6) == 0) {
3271 			k_cap_ctrl = true;
3272 			k_cap_on = true;
3273 			sprintf(extra, "set dack on");
3274 		} else if ((strncmp(extra, "dack off", 7) == 0)) {
3275 			k_cap_ctrl = true;
3276 			k_cap_on = false;
3277 			sprintf(extra, "set dack off");
3278 		} else
3279 			sprintf(extra, "set dack trigger");
3280 
3281 	} else if (strncmp(extra, "lck", 3) == 0) {
3282 		k_type = RTW_MP_CAL_LCK;
3283 		if (strncmp(extra, "lck on", 6) == 0) {
3284 			k_cap_ctrl = true;
3285 			k_cap_on = true;
3286 			sprintf(extra, "set lck on");
3287 		} else if ((strncmp(extra, "lck off", 7) == 0)) {
3288 			k_cap_ctrl = true;
3289 			k_cap_on = false;
3290 			sprintf(extra, "set lck off");
3291 		} else
3292 			sprintf(extra, "set lck trigger");
3293 
3294 	} else if (strncmp(extra, "dpk_trk", 7) == 0) {
3295 		k_type = RTW_MP_CAL_DPK_TRACK;
3296 		if (strncmp(extra, "dpk_trk on", 10) == 0) {
3297 			k_cap_ctrl = true;
3298 			k_cap_on = true;
3299 			sprintf(extra, "set dpk_trk on");
3300 		} else if ((strncmp(extra, "dpk_trk off", 11) == 0)) {
3301 			k_cap_ctrl = true;
3302 			k_cap_on = false;
3303 			sprintf(extra, "set dpk_trk off");
3304 		}
3305 
3306 	} else if (strncmp(extra, "tssi", 4) == 0) {
3307 		k_type = RTW_MP_CAL_TSSI;
3308 		if (strncmp(extra, "tssi on", 7) == 0) {
3309 			k_cap_ctrl = true;
3310 			k_cap_on = true;
3311 			sprintf(extra, "set tssi on");
3312 		} else if ((strncmp(extra, "tssi off", 8) == 0)) {
3313 			k_cap_ctrl = true;
3314 			k_cap_on = false;
3315 			sprintf(extra, "set tssi off");
3316 		} else
3317 			sprintf(extra, "set tssi trigger");
3318 
3319 	} else if (strncmp(extra, "gapk", 4) == 0) {
3320 		k_type = RTW_MP_CAL_GAPK;
3321 		if (strncmp(extra, "gapk on", 7) == 0) {
3322 			k_cap_ctrl = true;
3323 			k_cap_on = true;
3324 			sprintf(extra, "set gapk on");
3325 		} else if ((strncmp(extra, "gapk off", 8) == 0)) {
3326 			k_cap_ctrl = true;
3327 			k_cap_on = false;
3328 			sprintf(extra, "set gapk off");
3329 		} else
3330 			sprintf(extra, "set gapk trigger");
3331 
3332 	} else
3333 		sprintf(extra, "Error! CMD Format:\n\
3334 				[trigger K] or Set K on/off\n\
3335 				chk\\chk on/off\n\
3336 				dack\\dack on/off\n\
3337 				iqk\\iqk on/off\n\
3338 				lck\\lck on/off\n\
3339 				dpk\\dpk on/off\n\
3340 				dpk_trk on/off\n\
3341 				tssi\\tssi on/off\n\
3342 				gapk\\gapk on/off\n");
3343 
3344 	if (k_cap_ctrl) {
3345 		rtw_mp_cal_capab(padapter, k_type, k_cap_on);
3346 	} else if (k_type < RTW_MP_CAL_MAX)
3347 		rtw_mp_cal_trigger(padapter, k_type);
3348 
3349 	wrqu->data.length = strlen(extra);
3350 	return 0;
3351 }
3352 
rtw_mp_phl_btc_path(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)3353 int rtw_mp_phl_btc_path(struct net_device *dev,
3354 			 struct iw_request_info *info,
3355 			 union iwreq_data *wrqu, char *extra)
3356 {
3357 	_adapter *padapter = rtw_netdev_priv(dev);
3358 	struct mp_priv *pmp_priv = (struct mp_priv *)&padapter->mppriv;
3359 	u8 btc_mode = 0;
3360 
3361 	if (strncmp(extra, "normal", 6) == 0) {
3362 
3363 		btc_mode = BTC_MODE_NORMAL;
3364 		RTW_INFO("set BTC Path Normal");
3365 	} else if (strncmp(extra, "wl", 2) == 0 || strncmp(extra, "WL", 2) == 0) {
3366 
3367 		btc_mode = BTC_MODE_WL;
3368 		RTW_INFO("set BTC Path WL");
3369 	} else if (strncmp(extra, "bt", 2) == 0 || strncmp(extra, "BT", 2) == 0) {
3370 
3371 		btc_mode = BTC_MODE_BT;
3372 		RTW_INFO("set BTC Path BT");
3373 	} else {
3374 		btc_mode = BTC_MODE_WL;
3375 		RTW_INFO("Default set BTC Path WL");
3376 	}
3377 
3378 	pmp_priv->btc_path = btc_mode;
3379 	if (rtw_mp_phl_config_arg(padapter, RTW_MP_CONFIG_CMD_SWITCH_BT_PATH)) {
3380 		sprintf(extra, "set BTC Path %s",
3381 				(btc_mode == 0)? "Normal":((btc_mode == 1)? "WL":
3382 				((btc_mode == 2)? "BT":"DEFAULT WL")));
3383 
3384 	} else
3385 		sprintf(extra, "set BTC Path Fail");
3386 	wrqu->data.length = strlen(extra);
3387 	return 0;
3388 }
3389 
rtw_mp_get_he(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)3390 int rtw_mp_get_he(struct net_device *dev,
3391 			 struct iw_request_info *info,
3392 			 union iwreq_data *wrqu, char *extra)
3393 {
3394 	_adapter *padapter = rtw_netdev_priv(dev);
3395 	struct registry_priv *regsty = &padapter->registrypriv;
3396 #ifdef CONFIG_80211AX_HE
3397 	if (!REGSTY_IS_11AX_ENABLE(regsty) ||
3398 		!is_supported_he(regsty->wireless_mode))
3399 		sprintf(extra, "false");
3400 	 else
3401 		sprintf(extra, "true");
3402 #endif
3403 	wrqu->data.length = strlen(extra);
3404 	return 0;
3405 }
3406 
dump_buf(u8 * buf,u32 len)3407 static inline void dump_buf(u8 *buf, u32 len)
3408 {
3409 	u32 i;
3410 
3411 	RTW_INFO("-----------------Len %d----------------\n", len);
3412 	for (i = 0; i < len; i++)
3413 		RTW_INFO("%2.2x-", *(buf + i));
3414 	RTW_INFO("\n");
3415 }
3416 
rtw_mp_link(struct net_device * dev,struct iw_request_info * info,struct iw_point * wrqu,char * extra)3417 int rtw_mp_link(struct net_device *dev,
3418 			struct iw_request_info *info,
3419 			struct iw_point *wrqu, char *extra)
3420 {
3421 	_adapter *padapter = rtw_netdev_priv(dev);
3422 	struct mp_priv *pmp_priv;
3423 	char	input[RTW_IWD_MAX_LEN];
3424 	int		bgetrxdata = 0, btxdata = 0, bsetbt = 0;
3425 	int err = 0;
3426 	u32 i = 0, datalen = 0,jj, kk, waittime = 0;
3427 	u16 val = 0x00, ret = 0;
3428 	char *pextra = NULL;
3429 	u8 *setdata = NULL;
3430 	char *pch, *ptmp, *token, *tmp[4] = {0x00, 0x00, 0x00};
3431 
3432 	pmp_priv = &padapter->mppriv;
3433 
3434 	if (copy_from_user(input, wrqu->pointer, wrqu->length))
3435 		return -EFAULT;
3436 
3437 	_rtw_memset(extra, 0, wrqu->length);
3438 
3439 	RTW_INFO("%s: in=%s\n", __func__, input);
3440 
3441 	bgetrxdata =  (strncmp(input, "rxdata", 6) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
3442 	btxdata =  (strncmp(input, "txdata", 6) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
3443 	bsetbt =  (strncmp(input, "setbt", 5) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
3444 
3445 	if (bgetrxdata) {
3446 		RTW_INFO("%s: in= 1 \n", __func__);
3447 		if (pmp_priv->mplink_brx == _TRUE) {
3448 
3449 				while (waittime < 100 && pmp_priv->mplink_brx == _FALSE) {
3450 						if (pmp_priv->mplink_brx == _FALSE)
3451 							rtw_msleep_os(10);
3452 						else
3453 							break;
3454 						waittime++;
3455 				}
3456 				if (pmp_priv->mplink_brx == _TRUE) {
3457 					sprintf(extra, "\n");
3458 					pextra = extra + strlen(extra);
3459 					for (i = 0; i < pmp_priv->mplink_rx_len; i ++) {
3460 						pextra += sprintf(pextra, "%02x:", pmp_priv->mplink_buf[i]);
3461 					}
3462 					_rtw_memset(pmp_priv->mplink_buf, '\0' , sizeof(pmp_priv->mplink_buf));
3463 					pmp_priv->mplink_brx = _FALSE;
3464 				}
3465 		}
3466 	} else if (btxdata) {
3467 		struct pkt_attrib *pattrib;
3468 
3469 		pch = input;
3470 		setdata = rtw_zmalloc(1024);
3471 		if (setdata == NULL) {
3472 			err = -ENOMEM;
3473 			goto exit;
3474 		}
3475 
3476 		i = 0;
3477 		while ((token = strsep(&pch, ",")) != NULL) {
3478 			if (i > 2)
3479 				break;
3480 			tmp[i] = token;
3481 			i++;
3482 		}
3483 
3484 		/* tmp[0],[1],[2] */
3485 		/* txdata,00e04c871200........... */
3486 		if (strcmp(tmp[0], "txdata") == 0) {
3487 			if (tmp[1] == NULL) {
3488 				err = -EINVAL;
3489 				goto exit;
3490 			}
3491 		}
3492 
3493 		datalen = strlen(tmp[1]);
3494 		if (datalen % 2) {
3495 			err = -EINVAL;
3496 			goto exit;
3497 		}
3498 		datalen /= 2;
3499 		if (datalen == 0) {
3500 			err = -EINVAL;
3501 			goto exit;
3502 		}
3503 
3504 		RTW_INFO("%s: data len=%d\n", __FUNCTION__, datalen);
3505 		RTW_INFO("%s: tx data=%s\n", __FUNCTION__, tmp[1]);
3506 
3507 		for (jj = 0, kk = 0; jj < datalen; jj++, kk += 2)
3508 			setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]);
3509 
3510 		dump_buf(setdata, datalen);
3511 		_rtw_memset(pmp_priv->mplink_buf, '\0' , sizeof(pmp_priv->mplink_buf));
3512 		_rtw_memcpy(pmp_priv->mplink_buf, setdata, datalen);
3513 
3514 		pattrib = &pmp_priv->tx.attrib;
3515 		pattrib->pktlen = datalen;
3516 		pmp_priv->tx.count = 1;
3517 		pmp_priv->tx.stop = 0;
3518 		pmp_priv->mplink_btx = _TRUE;
3519 		rtw_mp_set_packet_tx(padapter);
3520 		pmp_priv->mode = MP_PACKET_TX;
3521 
3522 	} else if (bsetbt) {
3523 
3524 #if 0
3525 #ifdef CONFIG_BTC
3526 		pch = input;
3527 		i = 0;
3528 
3529 		while ((token = strsep(&pch, ",")) != NULL) {
3530 			if (i > 3)
3531 				break;
3532 			tmp[i] = token;
3533 			i++;
3534 		}
3535 
3536 		if (tmp[1] == NULL) {
3537 			err = -EINVAL;
3538 			goto exit;
3539 		}
3540 
3541 		if (strcmp(tmp[1], "scbd") == 0) {
3542 			u16 org_val = 0x8002, pre_val, read_score_board_val;
3543 			u8 state;
3544 
3545 			pre_val = (rtw_read16(padapter,(0xaa))) & 0x7fff;
3546 
3547 			if (tmp[2] != NULL) {
3548 				state = simple_strtoul(tmp[2], &ptmp, 10);
3549 
3550 				if (state)
3551 						org_val = org_val | BIT6;
3552 				else
3553 						org_val = org_val & (~BIT6);
3554 
3555 				if (org_val != pre_val) {
3556 					pre_val = org_val;
3557 					rtw_write16(padapter, 0xaa, org_val);
3558 					RTW_INFO("%s,setbt scbd write org_val = 0x%x , pre_val = 0x%x\n", __func__, org_val, pre_val);
3559 				} else {
3560 					RTW_INFO("%s,setbt scbd org_val = 0x%x ,pre_val = 0x%x\n", __func__, org_val, pre_val);
3561 				}
3562 			} else {
3563 					read_score_board_val = (rtw_read16(padapter,(0xaa))) & 0x7fff;
3564 					RTW_INFO("%s,read_score_board_val = 0x%x\n", __func__, read_score_board_val);
3565 			}
3566 			goto exit;
3567 
3568 		} else if (strcmp(tmp[1], "testmode") == 0) {
3569 
3570 			if (tmp[2] == NULL) {
3571 				err = -EINVAL;
3572 				goto exit;
3573 			}
3574 
3575 			val = simple_strtoul(tmp[2], &ptmp, 16);
3576 			RTW_INFO("get tmp, type  %s, val =0x%x!\n", tmp[1], val);
3577 
3578 			if (tmp[2] != NULL) {
3579 				_rtw_memset(extra, 0, wrqu->length);
3580 				ret = rtw_btcoex_btset_testmode(padapter, val);
3581 				if (!CHECK_STATUS_CODE_FROM_BT_MP_OPER_RET(ret, BT_STATUS_BT_OP_SUCCESS)) {
3582 					RTW_INFO("%s: BT_OP fail = 0x%x!\n", __FUNCTION__, val);
3583 					sprintf(extra, "BT_OP fail  0x%x!\n", val);
3584 				} else
3585 					sprintf(extra, "Set BT_OP 0x%x done!\n", val);
3586 			}
3587 
3588 		}
3589 #endif /* CONFIG_BTC */
3590 #endif
3591 	}
3592 
3593 exit:
3594 	if (setdata)
3595 		rtw_mfree(setdata, 1024);
3596 
3597 	wrqu->length = strlen(extra);
3598 	return err;
3599 
3600 }
3601 
3602 
rtw_priv_mp_get(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wdata,char * extra)3603 int rtw_priv_mp_get(struct net_device *dev,
3604 			   struct iw_request_info *info,
3605 			   union iwreq_data *wdata, char *extra)
3606 {
3607 
3608 	struct iw_point *wrqu = (struct iw_point *)wdata;
3609 	u32 subcmd = wrqu->flags;
3610 	_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
3611 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
3612 	int status = 0;
3613 	u8 i = 0;
3614 	char *pch = extra;
3615 
3616 	if (!is_primary_adapter(padapter)) {
3617 		RTW_INFO("MP mode only primary Adapter support, iface id = %d,\n", padapter->iface_id);
3618 		RTW_INFO("***Please use Primary Adapter:["ADPT_FMT"]***\n", ADPT_ARG(GET_PRIMARY_ADAPTER(padapter)));
3619 		pch +=sprintf(pch, "Only primary Adapter support MP CMD\n");
3620 		pch +=sprintf(pch, "Please use Primary Adapter:"ADPT_FMT"", ADPT_ARG(GET_PRIMARY_ADAPTER(padapter)));
3621 		wrqu->length = strlen(extra);
3622 		return status;
3623 	}
3624 	for (i = 0; i < dvobj->iface_nums; i++) {
3625 		_adapter *iface = dvobj->padapters[i];
3626 
3627 		if (iface == NULL)
3628 			continue;
3629 		if (rtw_is_adapter_up(iface) == _FALSE)
3630 			continue;
3631 		if (MLME_IS_AP(iface)) {
3632 			RTW_INFO("Adapter:["ADPT_FMT"], Please Leave AP mode or Down Interface\n", ADPT_ARG(iface));
3633 			pch += sprintf(pch, "Check Adapter:"ADPT_FMT",\n\
3634 								Please Leave AP mode or Down Interface\n", ADPT_ARG(iface));
3635 			wrqu->length = strlen(extra);
3636 			return status;
3637 		}
3638 	}
3639 
3640 	RTW_INFO("%s mutx in %d\n", __func__, subcmd);
3641 
3642 	switch (subcmd) {
3643 	case MP_START:
3644 		RTW_INFO("set case mp_start\n");
3645 		status = rtw_mp_start(dev, info, wrqu, extra);
3646 		break;
3647 	case MP_STOP:
3648 		RTW_INFO("set case mp_stop\n");
3649 		status = rtw_mp_stop(dev, info, wrqu, extra);
3650 		break;
3651 	case MP_BANDWIDTH:
3652 		RTW_INFO("set case mp_bandwidth\n");
3653 		status = rtw_mp_bandwidth(dev, info, wrqu, extra);
3654 		break;
3655 	case MP_RESET_STATS:
3656 		RTW_INFO("set case MP_RESET_STATS\n");
3657 		status = rtw_mp_reset_stats(dev, info, wrqu, extra);
3658 		break;
3659 	case MP_SetRFPathSwh:
3660 		RTW_INFO("set MP_SetRFPathSwitch\n");
3661 		status = rtw_mp_SetRFPath(dev, info, wrqu, extra);
3662 		break;
3663 	case WRITE_REG:
3664 		status = rtw_mp_write_reg(dev, info, wrqu, extra);
3665 		break;
3666 	case WRITE_RF:
3667 		status = rtw_mp_write_rf(dev, info, wrqu, extra);
3668 		break;
3669 	case MP_PHYPARA:
3670 		RTW_INFO("mp_get  MP_PHYPARA\n");
3671 		status = rtw_mp_phypara(dev, info, wrqu, extra);
3672 		break;
3673 	case MP_CHANNEL:
3674 		RTW_INFO("set case mp_channel\n");
3675 		status = rtw_mp_channel(dev , info, wrqu, extra);
3676 		break;
3677 	case MP_TRXSC_OFFSET:
3678 		RTW_INFO("set case rtw_mp_trxsc_offset\n");
3679 		status = rtw_mp_trxsc_offset(dev , info, wrqu, extra);
3680 		break;
3681 	case READ_REG:
3682 		RTW_INFO("mp_get  READ_REG\n");
3683 		status = rtw_mp_read_reg(dev, info, wrqu, extra);
3684 		break;
3685 	case READ_RF:
3686 		RTW_INFO("mp_get  READ_RF\n");
3687 		status = rtw_mp_read_rf(dev, info, wrqu, extra);
3688 		break;
3689 	case MP_RATE:
3690 		RTW_INFO("set case mp_rate\n");
3691 		status = rtw_mp_rate(dev, info, wrqu, extra);
3692 		break;
3693 	case MP_TXPOWER:
3694 		RTW_INFO("set case MP_TXPOWER\n");
3695 		status = rtw_mp_txpower(dev, info, wrqu, extra);
3696 		break;
3697 	case MP_ANT_TX:
3698 		RTW_INFO("set case MP_ANT_TX\n");
3699 		status = rtw_mp_ant_tx(dev, info, wrqu, extra);
3700 		break;
3701 	case MP_ANT_RX:
3702 		RTW_INFO("set case MP_ANT_RX\n");
3703 		status = rtw_mp_ant_rx(dev, info, wrqu, extra);
3704 		break;
3705 	case MP_QUERY:
3706 		status = rtw_mp_trx_query(dev, info, wrqu, extra);
3707 		break;
3708 	case MP_CTX:
3709 		RTW_INFO("set case MP_CTX\n");
3710 		status = rtw_mp_ctx(dev, info, wrqu, extra);
3711 		break;
3712 	case MP_ARX:
3713 		RTW_INFO("set case MP_ARX\n");
3714 		status = rtw_mp_arx(dev, info, wrqu, extra);
3715 		break;
3716 	case MP_DUMP:
3717 		RTW_INFO("set case MP_DUMP\n");
3718 		status = rtw_mp_dump(dev, info, wrqu, extra);
3719 		break;
3720 	case MP_PSD:
3721 		RTW_INFO("set case MP_PSD\n");
3722 		status = rtw_mp_psd(dev, info, wrqu, extra);
3723 		break;
3724 	case MP_THER:
3725 		RTW_INFO("set case MP_THER\n");
3726 		status = rtw_mp_thermal(dev, info, wrqu, extra);
3727 		break;
3728 	case MP_PwrCtlDM:
3729 		RTW_INFO("set MP_PwrCtlDM\n");
3730 		status = rtw_mp_PwrCtlDM(dev, info, wrqu, extra);
3731 		break;
3732 	case MP_QueryDrvStats:
3733 		RTW_INFO("mp_get MP_QueryDrvStats\n");
3734 		status = rtw_mp_QueryDrv(dev, info, wdata, extra);
3735 		break;
3736 	case MP_PWRTRK:
3737 		RTW_INFO("set case MP_PWRTRK\n");
3738 		status = rtw_mp_pwrtrk(dev, info, wrqu, extra);
3739 		break;
3740 	case MP_SET_TSSIDE:
3741 		RTW_INFO("set case MP_TSSI_DE\n");
3742 		status = rtw_mp_set_tsside(dev, info, wrqu, extra);
3743 		break;
3744 	case EFUSE_SET:
3745 		RTW_INFO("set case efuse set\n");
3746 		status = rtw_ioctl_efuse_set(dev, info, wdata, extra);
3747 		break;
3748 	case EFUSE_GET:
3749 		RTW_INFO("efuse get EFUSE_GET\n");
3750 		status = rtw_ioctl_efuse_get(dev, info, wdata, extra);
3751 		break;
3752 	case MP_GET_TXPOWER_INX:
3753 		RTW_INFO("mp_get MP_GET_TXPOWER_INX\n");
3754 		status = rtw_mp_txpower_index(dev, info, wrqu, extra);
3755 		break;
3756 	case MP_GETVER:
3757 		RTW_INFO("mp_get MP_GETVER\n");
3758 		status = rtw_mp_getver(dev, info, wdata, extra);
3759 		break;
3760 	case MP_MON:
3761 		RTW_INFO("mp_get MP_MON\n");
3762 		status = rtw_mp_mon(dev, info, wdata, extra);
3763 		break;
3764 	case EFUSE_BT_MASK:
3765 		RTW_INFO("mp_get EFUSE_BT_MASK\n");
3766 		status = rtw_ioctl_efuse_bt_file_mask_load(dev, info, wdata, extra);
3767 		break;
3768 	case EFUSE_MASK:
3769 		RTW_INFO("mp_get EFUSE_MASK\n");
3770 		status = rtw_ioctl_efuse_file_mask_load(dev, info, wdata, extra);
3771 		break;
3772 	case EFUSE_FILE:
3773 		RTW_INFO("mp_get EFUSE_FILE\n");
3774 		status = rtw_ioctl_efuse_file_map_load(dev, info, wdata, extra);
3775 		break;
3776 	case EFUSE_FILE_STORE:
3777 		RTW_INFO("mp_get EFUSE_FILE_STORE\n");
3778 		/*status = rtw_efuse_file_map_store(dev, info, wdata, extra);*/
3779 		break;
3780 	case MP_TX:
3781 		RTW_INFO("mp_get MP_TX\n");
3782 		status = rtw_mp_tx(dev, info, wdata, extra);
3783 		break;
3784 	case MP_RX:
3785 		RTW_INFO("mp_get MP_RX\n");
3786 		status = rtw_mp_rx(dev, info, wdata, extra);
3787 		break;
3788 	case MP_HW_TX_MODE:
3789 		RTW_INFO("mp_get MP_HW_TX_MODE\n");
3790 		status = rtw_mp_hwtx(dev, info, wdata, extra);
3791 		break;
3792 	case MP_GET_TSSIDE:
3793 		RTW_INFO("mp_get TSSI_DE\n");
3794 		status = rtw_mp_get_tsside(dev, info, wrqu, extra);
3795 		break;
3796 #ifdef CONFIG_RTW_CUSTOMER_STR
3797 	case MP_CUSTOMER_STR:
3798 		RTW_INFO("customer str\n");
3799 		status = rtw_mp_customer_str(dev, info, wdata, extra);
3800 		break;
3801 #endif
3802 	case MP_PWRLMT:
3803 		RTW_INFO("mp_get MP_SETPWRLMT\n");
3804 		status = rtw_mp_pwrlmt(dev, info, wdata, extra);
3805 		break;
3806 	case  BT_EFUSE_FILE:
3807 		RTW_INFO("mp_get BT EFUSE_FILE\n");
3808 		status = rtw_ioctl_efuse_bt_file_map_load(dev, info, wdata, extra);
3809 		break;
3810 	case MP_SWRFPath:
3811 		RTW_INFO("mp_get MP_SWRFPath\n");
3812 		status = rtw_mp_switch_rf_path(dev, info, wrqu, extra);
3813 		break;
3814 	case MP_LINK:
3815 		RTW_INFO("mp_get MP_LINK\n");
3816 		status = rtw_mp_link(dev, info, wrqu, extra);
3817 		break;
3818 	case MP_DPK_TRK:
3819 		RTW_INFO("mp_get MP_DPK_TRK\n");
3820 		status = rtw_mp_dpk_track(dev, info, wdata, extra);
3821 		break;
3822 	case MP_DPK:
3823 		RTW_INFO("set MP_DPK\n");
3824 		status = rtw_mp_dpk(dev, info, wdata, extra);
3825 		break;
3826 	case MP_GET_PHL_TEST:
3827 		RTW_INFO("mp_get MP_GET_PHL_TEST\n");
3828 		status = rtw_mp_get_phl_io(dev, info, wrqu, extra);
3829 		break;
3830 	case MP_SET_PHL_TEST:
3831 		RTW_INFO("mp_get MP_SET_PHL_TEST\n");
3832 		status = rtw_mp_set_phl_io(dev, info, wrqu, extra);
3833 		break;
3834 	case MP_SET_PHL_TX_PATTERN:
3835 		RTW_INFO("mp_get MP_SET_PHL_TEST\n");
3836 		status = rtw_mp_tx_pattern_idx(dev, info, wdata, extra);
3837 		break;
3838 	case MP_SET_PHL_PLCP_TX_DATA:
3839 		RTW_INFO("mp_get MP_SET_PHL_PLCP_TX_DATA\n");
3840 		status = rtw_mp_tx_plcp_tx_data(dev, info, wdata, extra);
3841 		break;
3842 	case MP_SET_PHL_PLCP_TX_USER:
3843 		RTW_INFO("mp_get MP_SET_PHL_PLCP_TX_USER\n");
3844 		status = rtw_mp_tx_plcp_tx_user(dev, info, wdata, extra);
3845 		break;
3846 	case MP_SET_PHL_TX_METHOD:
3847 		RTW_INFO("mp_get MP_SET_PHL_TX_METHOD\n");
3848 		status = rtw_mp_tx_method(dev, info, wdata, extra);
3849 		break;
3850 	case MP_SET_PHL_CONIFG_PHY_NUM:
3851 		RTW_INFO("mp_get MP_SET_PHL_CONIFG_PHY_NUM\n");
3852 		status = rtw_mp_config_phy(dev, info, wdata, extra);
3853 		break;
3854 	case MP_PHL_RFK:
3855 		RTW_INFO("mp_get MP_PHL_RFK\n");
3856 		status = rtw_mp_phl_rfk(dev, info, wdata, extra);
3857 		break;
3858 	case MP_PHL_BTC_PATH:
3859 		RTW_INFO("mp_get MP_PHL_BTC_PATH\n");
3860 		status = rtw_mp_phl_btc_path(dev, info, wdata, extra);
3861 		break;
3862 	case MP_GET_HE:
3863 		RTW_INFO("mp_get MP_GET_HE\n");
3864 		status = rtw_mp_get_he(dev, info, wdata, extra);
3865 		break;
3866 	default:
3867 		status = -EIO;
3868 	}
3869 
3870 	return status;
3871 }
3872 
rtw_priv_mp_set(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wdata,char * extra)3873 int rtw_priv_mp_set(struct net_device *dev,
3874 			   struct iw_request_info *info,
3875 			   union iwreq_data *wdata, char *extra)
3876 {
3877 
3878 	struct iw_point *wrqu = (struct iw_point *)wdata;
3879 	u32 subcmd = wrqu->flags;
3880 	_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
3881 	int status = 0;
3882 
3883 #ifdef CONFIG_CONCURRENT_MODE
3884 	if (!is_primary_adapter(padapter)) {
3885 		RTW_INFO("MP mode only primary Adapter support\n");
3886 		return -EIO;
3887 	}
3888 #endif
3889 
3890 	RTW_INFO("%s mutx in %d\n", __func__, subcmd);
3891 	//_enter_critical_mutex(&(adapter_to_dvobj(padapter)->ioctrl_mutex), NULL);
3892 	switch (subcmd) {
3893 	case MP_DISABLE_BT_COEXIST:
3894 		RTW_INFO("set case MP_DISABLE_BT_COEXIST\n");
3895 		status = rtw_mp_disable_bt_coexist(dev, info, wdata, extra);
3896 		break;
3897 	case MP_IQK:
3898 		RTW_INFO("set MP_IQK\n");
3899 		status = rtw_mp_iqk(dev, info, wrqu, extra);
3900 		break;
3901 	case MP_LCK:
3902 		RTW_INFO("set MP_LCK\n");
3903 		status = rtw_mp_lck(dev, info, wrqu, extra);
3904 	break;
3905 
3906 	default:
3907 		status = -EIO;
3908 	}
3909 	//_exit_critical_mutex(&(adapter_to_dvobj(padapter)->ioctrl_mutex), NULL);
3910 	RTW_INFO("%s mutx done %d\n", __func__, subcmd);
3911 
3912 	return status;
3913 }
3914 
3915 #endif
3916