1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
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.
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
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
20 #if defined(CONFIG_MP_INCLUDED)
22 #include <drv_types.h>
24 #include <rtw_mp_ioctl.h>
25 #include "../../hal/phydm/phydm_precomp.h"
28 #if defined(CONFIG_RTL8723B)
29 #include <rtw_bt_mp.h>
33 * Input Format: %s,%d,%d
34 * %s is width, could be
36 * "w" for WORD (2 bytes)
37 * "dw" for DWORD (4 bytes)
38 * 1st %d is address(offset)
39 * 2st %d is data to write
41 int rtw_mp_write_reg(struct net_device *dev,
42 struct iw_request_info *info,
43 struct iw_point *wrqu, char *extra)
45 char *pch, *pnext, *ptmp;
50 PADAPTER padapter = rtw_netdev_priv(dev);
51 char input[wrqu->length];
53 if (copy_from_user(input, wrqu->pointer, wrqu->length))
56 _rtw_memset(extra, 0, wrqu->length);
60 pnext = strpbrk(pch, " ,.-");
67 pnext = strpbrk(pch, " ,.-");
71 /*addr = simple_strtoul(pch, &ptmp, 16);
72 _rtw_memset(buf, '\0', sizeof(buf));
73 _rtw_memcpy(buf, pch, pnext-pch);
74 ret = kstrtoul(buf, 16, &addr);*/
75 ret = sscanf(pch, "%x", &addr);
80 pnext = strpbrk(pch, " ,.-");
81 if ((pch - input) >= wrqu->length)
83 /*data = simple_strtoul(pch, &ptmp, 16);*/
84 ret = sscanf(pch, "%x", &data);
85 RTW_INFO("data=%x,addr=%x\n", (u32)data, (u32)addr);
95 rtw_write8(padapter, addr, data);
103 rtw_write16(padapter, addr, data);
107 rtw_write32(padapter, addr, data);
119 * Input Format: %s,%d
120 * %s is width, could be
122 * "w" for WORD (2 bytes)
123 * "dw" for DWORD (4 bytes)
124 * %d is address(offset)
129 int rtw_mp_read_reg(struct net_device *dev,
130 struct iw_request_info *info,
131 struct iw_point *wrqu, char *extra)
133 char input[wrqu->length];
134 char *pch, *pnext, *ptmp;
137 char data[20], tmp[20], buf[3];
138 u32 addr = 0, strtout = 0;
139 u32 i = 0, j = 0, ret = 0, data32 = 0;
140 PADAPTER padapter = rtw_netdev_priv(dev);
143 if (wrqu->length > 128)
146 if (copy_from_user(input, wrqu->pointer, wrqu->length))
149 _rtw_memset(extra, 0, wrqu->length);
150 _rtw_memset(data, '\0', sizeof(data));
151 _rtw_memset(tmp, '\0', sizeof(tmp));
153 pnext = strpbrk(pch, " ,.-");
161 ret = sscanf(pch, "%x", &addr);
166 width = width_str[0];
170 data32 = rtw_read8(padapter, addr);
171 RTW_INFO("%x\n", data32);
172 sprintf(extra, "%d", data32);
173 wrqu->length = strlen(extra);
177 sprintf(data, "%04x\n", rtw_read16(padapter, addr));
179 for (i = 0 ; i <= strlen(data) ; i++) {
190 RTW_INFO("pch=%s", pch);
192 while (*pch != '\0') {
193 pnext = strpbrk(pch, " ");
194 if (!pnext || ((pnext - tmp) > 4))
198 if (*pnext != '\0') {
199 /*strtout = simple_strtoul(pnext , &ptmp, 16);*/
200 ret = sscanf(pnext, "%x", &strtout);
201 sprintf(extra, "%s %d" , extra , strtout);
206 wrqu->length = strlen(extra);
210 sprintf(data, "%08x", rtw_read32(padapter, addr));
211 /*add read data format blank*/
212 for (i = 0 ; i <= strlen(data) ; i++) {
223 RTW_INFO("pch=%s", pch);
225 while (*pch != '\0') {
226 pnext = strpbrk(pch, " ");
231 if (*pnext != '\0') {
232 ret = sscanf(pnext, "%x", &strtout);
233 sprintf(extra, "%s %d" , extra , strtout);
238 wrqu->length = strlen(extra);
252 * Input Format: %d,%x,%x
253 * %d is RF path, should be smaller than MAX_RF_PATH_NUMS
254 * 1st %x is address(offset)
255 * 2st %x is data to write
257 int rtw_mp_write_rf(struct net_device *dev,
258 struct iw_request_info *info,
259 struct iw_point *wrqu, char *extra)
262 u32 path, addr, data;
264 PADAPTER padapter = rtw_netdev_priv(dev);
265 char input[wrqu->length];
268 _rtw_memset(input, 0, wrqu->length);
269 if (copy_from_user(input, wrqu->pointer, wrqu->length))
273 ret = sscanf(input, "%d,%x,%x", &path, &addr, &data);
277 if (path >= GET_HAL_RFPATH_NUM(padapter))
284 _rtw_memset(extra, 0, wrqu->length);
286 write_rfreg(padapter, path, addr, data);
288 sprintf(extra, "write_rf completed\n");
289 wrqu->length = strlen(extra);
296 * Input Format: %d,%x
297 * %d is RF path, should be smaller than MAX_RF_PATH_NUMS
298 * %x is address(offset)
303 int rtw_mp_read_rf(struct net_device *dev,
304 struct iw_request_info *info,
305 struct iw_point *wrqu, char *extra)
307 char input[wrqu->length];
308 char *pch, *pnext, *ptmp;
309 char data[20], tmp[20], buf[3];
310 u32 path, addr, strtou;
311 u32 ret, i = 0 , j = 0;
312 PADAPTER padapter = rtw_netdev_priv(dev);
314 if (wrqu->length > 128)
316 _rtw_memset(input, 0, wrqu->length);
317 if (copy_from_user(input, wrqu->pointer, wrqu->length))
320 ret = sscanf(input, "%d,%x", &path, &addr);
324 if (path >= GET_HAL_RFPATH_NUM(padapter))
329 _rtw_memset(extra, 0, wrqu->length);
331 sprintf(data, "%08x", read_rfreg(padapter, path, addr));
332 /*add read data format blank*/
333 for (i = 0 ; i <= strlen(data) ; i++) {
342 RTW_INFO("pch=%s", pch);
344 while (*pch != '\0') {
345 pnext = strpbrk(pch, " ");
349 if (*pnext != '\0') {
350 /*strtou =simple_strtoul(pnext , &ptmp, 16);*/
351 ret = sscanf(pnext, "%x", &strtou);
352 sprintf(extra, "%s %d" , extra , strtou);
357 wrqu->length = strlen(extra);
363 int rtw_mp_start(struct net_device *dev,
364 struct iw_request_info *info,
365 struct iw_point *wrqu, char *extra)
368 PADAPTER padapter = rtw_netdev_priv(dev);
369 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
370 struct hal_ops *pHalFunc = &padapter->HalFunc;
372 rtw_pm_set_ips(padapter, IPS_NONE);
373 LeaveAllPowerSaveMode(padapter);
375 if (rtw_mi_check_fwstate(padapter, _FW_UNDER_SURVEY))
376 rtw_mi_scan_abort(padapter, _FALSE);
378 if (padapter->registrypriv.mp_mode == 0) {
379 rtw_hal_deinit(padapter);
380 padapter->registrypriv.mp_mode = 1;
381 #ifdef CONFIG_RF_POWER_TRIM
382 if (!IS_HARDWARE_TYPE_8814A(padapter) && !IS_HARDWARE_TYPE_8822B(padapter)) {
383 padapter->registrypriv.RegPwrTrimEnable = 1;
384 rtw_hal_read_chip_info(padapter);
386 #endif /*CONFIG_RF_POWER_TRIM*/
387 rtw_hal_init(padapter);
390 if (padapter->registrypriv.mp_mode == 0)
393 if (padapter->mppriv.mode == MP_OFF) {
394 if (mp_start_test(padapter) == _FAIL)
396 padapter->mppriv.mode = MP_ON;
397 MPT_PwrCtlDM(padapter, 0);
399 padapter->mppriv.bmac_filter = _FALSE;
400 #ifdef CONFIG_RTL8723B
401 #ifdef CONFIG_USB_HCI
402 rtw_write32(padapter, 0x765, 0x0000);
403 rtw_write32(padapter, 0x948, 0x0280);
405 rtw_write32(padapter, 0x765, 0x0000);
406 rtw_write32(padapter, 0x948, 0x0000);
408 #ifdef CONFIG_FOR_RTL8723BS_VQ0
409 rtw_write32(padapter, 0x765, 0x0000);
410 rtw_write32(padapter, 0x948, 0x0280);
412 rtw_write8(padapter, 0x66, 0x27); /*Open BT uart Log*/
413 rtw_write8(padapter, 0xc50, 0x20); /*for RX init Gain*/
415 ODM_Write_DIG(&pHalData->odmpriv, 0x20);
417 _rtw_memset(extra, 0, wrqu->length);
418 sprintf(extra, "mp_start ok\n");
419 wrqu->length = strlen(extra);
426 int rtw_mp_stop(struct net_device *dev,
427 struct iw_request_info *info,
428 struct iw_point *wrqu, char *extra)
430 PADAPTER padapter = rtw_netdev_priv(dev);
431 struct hal_ops *pHalFunc = &padapter->HalFunc;
433 if (padapter->registrypriv.mp_mode == 1) {
435 MPT_DeInitAdapter(padapter);
436 pHalFunc->hal_deinit(padapter);
437 padapter->registrypriv.mp_mode = 0;
438 pHalFunc->hal_init(padapter);
441 if (padapter->mppriv.mode != MP_OFF) {
442 mp_stop_test(padapter);
443 padapter->mppriv.mode = MP_OFF;
445 _rtw_memset(extra, 0, wrqu->length);
446 sprintf(extra, "mp_stop ok\n");
447 wrqu->length = strlen(extra);
453 int rtw_mp_rate(struct net_device *dev,
454 struct iw_request_info *info,
455 struct iw_point *wrqu, char *extra)
457 u32 rate = MPT_RATE_1M;
458 u8 input[wrqu->length];
459 PADAPTER padapter = rtw_netdev_priv(dev);
460 PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx);
462 if (copy_from_user(input, wrqu->pointer, wrqu->length))
465 rate = rtw_mpRateParseFunc(padapter, input);
466 padapter->mppriv.rateidx = rate;
468 if (rate == 0 && strcmp(input, "1M") != 0) {
469 rate = rtw_atoi(input);
470 padapter->mppriv.rateidx = MRateToHwRate(rate);
472 rate = wifirate2_ratetbl_inx((u8)rate);
473 else if (rate < 0xC8)
474 rate = (rate - 0x79 + MPT_RATE_MCS0);
475 HT rate 0x80(MCS0) ~ 0x8F(MCS15) ~ 0x9F(MCS31) 128~159
476 VHT1SS~2SS rate 0xA0 (VHT1SS_MCS0 44) ~ 0xB3 (VHT2SS_MCS9 #63) 160~179
477 VHT rate 0xB4 (VHT3SS_MCS0 64) ~ 0xC7 (VHT2SS_MCS9 #83) 180~199
479 VHT rate 0x90(VHT1SS_MCS0) ~ 0x99(VHT1SS_MCS9) 144~153
480 rate =(rate - MPT_RATE_VHT1SS_MCS0);
483 _rtw_memset(extra, 0, wrqu->length);
485 sprintf(extra, "Set data rate to %s index %d" , input, padapter->mppriv.rateidx);
486 RTW_INFO("%s: %s rate index=%d\n", __func__, input, padapter->mppriv.rateidx);
488 if (padapter->mppriv.rateidx >= DESC_RATEVHTSS4MCS9)
491 pMptCtx->MptRateIndex = HwRateToMPTRate(padapter->mppriv.rateidx);
492 SetDataRate(padapter);
494 wrqu->length = strlen(extra);
499 int rtw_mp_channel(struct net_device *dev,
500 struct iw_request_info *info,
501 struct iw_point *wrqu, char *extra)
504 PADAPTER padapter = rtw_netdev_priv(dev);
505 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
506 u8 input[wrqu->length];
510 if (copy_from_user(input, wrqu->pointer, wrqu->length))
513 channel = rtw_atoi(input);
514 /*RTW_INFO("%s: channel=%d\n", __func__, channel);*/
515 _rtw_memset(extra, 0, wrqu->length);
516 sprintf(extra, "Change channel %d to channel %d", padapter->mppriv.channel , channel);
517 padapter->mppriv.channel = channel;
518 SetChannel(padapter);
519 pHalData->CurrentChannel = channel;
521 wrqu->length = strlen(extra);
526 int rtw_mp_bandwidth(struct net_device *dev,
527 struct iw_request_info *info,
528 struct iw_point *wrqu, char *extra)
530 u32 bandwidth = 0, sg = 0;
532 PADAPTER padapter = rtw_netdev_priv(dev);
533 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
534 u8 input[wrqu->length];
536 if (copy_from_user(input, wrqu->pointer, wrqu->length))
539 if (sscanf(input, "40M=%d,shortGI=%d", &bandwidth, &sg) > 0)
540 RTW_INFO("%s: bw=%d sg=%d\n", __func__, bandwidth , sg);
543 bandwidth = CHANNEL_WIDTH_40;
544 else if (bandwidth == 2)
545 bandwidth = CHANNEL_WIDTH_80;
547 padapter->mppriv.bandwidth = (u8)bandwidth;
548 padapter->mppriv.preamble = sg;
549 _rtw_memset(extra, 0, wrqu->length);
550 sprintf(extra, "Change BW %d to BW %d\n", pHalData->CurrentChannelBW , bandwidth);
552 SetBandwidth(padapter);
553 pHalData->CurrentChannelBW = bandwidth;
554 /*cur_ch_offset = rtw_get_offset_by_ch(padapter->mppriv.channel);*/
555 /*set_channel_bwmode(padapter, padapter->mppriv.channel, cur_ch_offset, bandwidth);*/
556 wrqu->length = strlen(extra);
562 int rtw_mp_txpower_index(struct net_device *dev,
563 struct iw_request_info *info,
564 struct iw_point *wrqu, char *extra)
566 PADAPTER padapter = rtw_netdev_priv(dev);
567 char input[wrqu->length];
571 if (wrqu->length > 128)
574 if (copy_from_user(input, wrqu->pointer, wrqu->length))
577 rfpath = rtw_atoi(input);
578 txpower_inx = mpt_ProQueryCalTxPower(padapter, rfpath);
579 sprintf(extra, " %d", txpower_inx);
580 wrqu->length = strlen(extra);
586 int rtw_mp_txpower(struct net_device *dev,
587 struct iw_request_info *info,
588 struct iw_point *wrqu, char *extra)
590 u32 idx_a = 0, idx_b = 0, idx_c = 0, idx_d = 0, status = 0;
592 u8 input[wrqu->length];
594 PADAPTER padapter = rtw_netdev_priv(dev);
595 PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx);
597 if (copy_from_user(input, wrqu->pointer, wrqu->length))
600 MsetPower = strncmp(input, "off", 3);
601 if (MsetPower == 0) {
602 padapter->mppriv.bSetTxPower = 0;
603 sprintf(extra, "MP Set power off");
605 if (sscanf(input, "patha=%d,pathb=%d,pathc=%d,pathd=%d", &idx_a, &idx_b, &idx_c, &idx_d) < 3)
606 RTW_INFO("Invalid format on line %s ,patha=%d,pathb=%d,pathc=%d,pathd=%d\n", input , idx_a , idx_b , idx_c , idx_d);
608 sprintf(extra, "Set power level path_A:%d path_B:%d path_C:%d path_D:%d", idx_a , idx_b , idx_c , idx_d);
609 padapter->mppriv.txpoweridx = (u8)idx_a;
611 pMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)idx_a;
612 pMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)idx_b;
613 pMptCtx->TxPwrLevel[ODM_RF_PATH_C] = (u8)idx_c;
614 pMptCtx->TxPwrLevel[ODM_RF_PATH_D] = (u8)idx_d;
615 padapter->mppriv.bSetTxPower = 1;
617 SetTxPower(padapter);
620 wrqu->length = strlen(extra);
625 int rtw_mp_ant_tx(struct net_device *dev,
626 struct iw_request_info *info,
627 struct iw_point *wrqu, char *extra)
630 u8 input[wrqu->length];
632 PADAPTER padapter = rtw_netdev_priv(dev);
633 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
635 if (copy_from_user(input, wrqu->pointer, wrqu->length))
638 sprintf(extra, "switch Tx antenna to %s", input);
640 for (i = 0; i < strlen(input); i++) {
643 antenna |= ANTENNA_A;
646 antenna |= ANTENNA_B;
649 antenna |= ANTENNA_C;
652 antenna |= ANTENNA_D;
656 /*antenna |= BIT(extra[i]-'a');*/
657 RTW_INFO("%s: antenna=0x%x\n", __func__, antenna);
658 padapter->mppriv.antenna_tx = antenna;
659 padapter->mppriv.antenna_rx = antenna;
660 /*RTW_INFO("%s:mppriv.antenna_rx=%d\n", __func__, padapter->mppriv.antenna_tx);*/
661 pHalData->AntennaTxPath = antenna;
663 SetAntenna(padapter);
665 wrqu->length = strlen(extra);
670 int rtw_mp_ant_rx(struct net_device *dev,
671 struct iw_request_info *info,
672 struct iw_point *wrqu, char *extra)
676 u8 input[wrqu->length];
677 PADAPTER padapter = rtw_netdev_priv(dev);
678 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
680 if (copy_from_user(input, wrqu->pointer, wrqu->length))
682 /*RTW_INFO("%s: input=%s\n", __func__, input);*/
683 _rtw_memset(extra, 0, wrqu->length);
685 sprintf(extra, "switch Rx antenna to %s", input);
687 for (i = 0; i < strlen(input); i++) {
690 antenna |= ANTENNA_A;
693 antenna |= ANTENNA_B;
696 antenna |= ANTENNA_C;
699 antenna |= ANTENNA_D;
704 RTW_INFO("%s: antenna=0x%x\n", __func__, antenna);
705 padapter->mppriv.antenna_tx = antenna;
706 padapter->mppriv.antenna_rx = antenna;
707 pHalData->AntennaRxPath = antenna;
708 /*RTW_INFO("%s:mppriv.antenna_rx=%d\n", __func__, padapter->mppriv.antenna_rx);*/
709 SetAntenna(padapter);
710 wrqu->length = strlen(extra);
716 int rtw_set_ctx_destAddr(struct net_device *dev,
717 struct iw_request_info *info,
718 struct iw_point *wrqu, char *extra)
722 struct pkt_attrib *pattrib;
723 struct mp_priv *pmp_priv;
724 PADAPTER padapter = rtw_netdev_priv(dev);
726 pmp_priv = &padapter->mppriv;
727 pattrib = &pmp_priv->tx.attrib;
729 if (strlen(extra) < 5)
732 RTW_INFO("%s: in=%s\n", __func__, extra);
733 for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3)
734 pattrib->dst[jj] = key_2char2num(extra[kk], extra[kk + 1]);
736 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]);
742 int rtw_mp_ctx(struct net_device *dev,
743 struct iw_request_info *info,
744 struct iw_point *wrqu, char *extra)
747 int countPkTx = 1, cotuTx = 1, CarrSprTx = 1, scTx = 1, sgleTx = 1, stop = 1;
749 u32 count = 0, pktinterval = 0, pktlen = 0;
751 struct mp_priv *pmp_priv;
752 struct pkt_attrib *pattrib;
753 PADAPTER padapter = rtw_netdev_priv(dev);
754 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
756 pmp_priv = &padapter->mppriv;
757 pattrib = &pmp_priv->tx.attrib;
759 if (copy_from_user(extra, wrqu->pointer, wrqu->length))
762 RTW_INFO("%s: in=%s\n", __func__, extra);
763 #ifdef CONFIG_CONCURRENT_MODE
764 if (!is_primary_adapter(padapter)) {
765 sprintf(extra, "Error: MP mode can't support Virtual Adapter, Please to use main Adapter.\n");
766 wrqu->length = strlen(extra);
770 countPkTx = strncmp(extra, "count=", 5); /* strncmp TRUE is 0*/
771 cotuTx = strncmp(extra, "background", 20);
772 CarrSprTx = strncmp(extra, "background,cs", 20);
773 scTx = strncmp(extra, "background,sc", 20);
774 sgleTx = strncmp(extra, "background,stone", 20);
775 pkTx = strncmp(extra, "background,pkt", 20);
776 stop = strncmp(extra, "stop", 4);
777 if (sscanf(extra, "count=%d,pkt", &count) > 0)
778 RTW_INFO("count= %d\n", count);
779 if (sscanf(extra, "pktinterval=%d", &pktinterval) > 0)
780 RTW_INFO("pktinterval= %d\n", pktinterval);
782 if (sscanf(extra, "pktlen=%d", &pktlen) > 0)
783 RTW_INFO("pktlen= %d\n", pktlen);
785 if (_rtw_memcmp(extra, "destmac=", 8)) {
787 rtw_set_ctx_destAddr(dev, info, wrqu, &extra[8]);
788 sprintf(extra, "Set dest mac OK !\n");
792 /*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);*/
793 _rtw_memset(extra, '\0', strlen(extra));
795 if (pktinterval != 0) {
796 sprintf(extra, "Pkt Interval = %d", pktinterval);
797 padapter->mppriv.pktInterval = pktinterval;
798 wrqu->length = strlen(extra);
802 sprintf(extra, "Pkt len = %d", pktlen);
803 pattrib->pktlen = pktlen;
804 wrqu->length = strlen(extra);
808 bStartTest = 0; /* To set Stop*/
809 pmp_priv->tx.stop = 1;
810 sprintf(extra, "Stop continuous Tx");
811 ODM_Write_DIG(&pHalData->odmpriv, 0x20);
814 ODM_Write_DIG(&pHalData->odmpriv, 0x7f);
815 if (pmp_priv->mode != MP_ON) {
816 if (pmp_priv->tx.stop != 1) {
817 RTW_INFO("%s: MP_MODE != ON %d\n", __func__, pmp_priv->mode);
823 pmp_priv->tx.count = count;
825 if (pkTx == 0 || countPkTx == 0)
826 pmp_priv->mode = MP_PACKET_TX;
828 pmp_priv->mode = MP_SINGLE_TONE_TX;
830 pmp_priv->mode = MP_CONTINUOUS_TX;
832 pmp_priv->mode = MP_CARRIER_SUPPRISSION_TX;
834 pmp_priv->mode = MP_SINGLE_CARRIER_TX;
836 status = rtw_mp_pretx_proc(padapter, bStartTest, extra);
838 wrqu->length = strlen(extra);
844 int rtw_mp_disable_bt_coexist(struct net_device *dev,
845 struct iw_request_info *info,
846 union iwreq_data *wrqu, char *extra)
848 PADAPTER padapter = (PADAPTER)rtw_netdev_priv(dev);
849 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
850 struct hal_ops *pHalFunc = &padapter->HalFunc;
852 u8 input[wrqu->data.length];
855 if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
858 bt_coexist = rtw_atoi(input);
860 if (bt_coexist == 0) {
861 RTW_INFO("Set OID_RT_SET_DISABLE_BT_COEXIST: disable BT_COEXIST\n");
862 #ifdef CONFIG_BT_COEXIST
863 rtw_btcoex_HaltNotify(padapter);
864 rtw_btcoex_SetManualControl(padapter, _TRUE);
865 /* Force to switch Antenna to WiFi*/
866 rtw_write16(padapter, 0x870, 0x300);
867 rtw_write16(padapter, 0x860, 0x110);
869 /* CONFIG_BT_COEXIST */
871 #ifdef CONFIG_BT_COEXIST
872 rtw_btcoex_SetManualControl(padapter, _FALSE);
880 int rtw_mp_arx(struct net_device *dev,
881 struct iw_request_info *info,
882 struct iw_point *wrqu, char *extra)
884 int bStartRx = 0, bStopRx = 0, bQueryPhy = 0, bQueryMac = 0, bSetBssid = 0;
885 int bmac_filter = 0, bfilter_init = 0, bmon = 0, bSmpCfg = 0, bloopbk = 0;
886 u8 input[wrqu->length];
887 char *pch, *ptmp, *token, *tmp[2] = {0x00, 0x00};
888 u32 i = 0, ii = 0, jj = 0, kk = 0, cnts = 0, ret;
889 PADAPTER padapter = rtw_netdev_priv(dev);
890 struct mp_priv *pmppriv = &padapter->mppriv;
891 struct dbg_rx_counter rx_counter;
893 if (copy_from_user(input, wrqu->pointer, wrqu->length))
896 RTW_INFO("%s: %s\n", __func__, input);
897 #ifdef CONFIG_CONCURRENT_MODE
898 if (!is_primary_adapter(padapter)) {
899 sprintf(extra, "Error: MP mode can't support Virtual Adapter, Please to use main Adapter.\n");
900 wrqu->length = strlen(extra);
904 bStartRx = (strncmp(input, "start", 5) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
905 bStopRx = (strncmp(input, "stop", 5) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
906 bQueryPhy = (strncmp(input, "phy", 3) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
907 bQueryMac = (strncmp(input, "mac", 3) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
908 bSetBssid = (strncmp(input, "setbssid=", 8) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
909 /*bfilter_init = (strncmp(input, "filter_init",11)==0)?1:0;*/
910 bmac_filter = (strncmp(input, "accept_mac", 10) == 0) ? 1 : 0;
911 bmon = (strncmp(input, "mon=", 4) == 0) ? 1 : 0;
912 bSmpCfg = (strncmp(input , "smpcfg=" , 7) == 0) ? 1 : 0;
913 pmppriv->bloopback = (strncmp(input, "loopbk", 6) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
915 if (bSetBssid == 1) {
917 while ((token = strsep(&pch, "=")) != NULL) {
923 if ((tmp[0] != NULL) && (tmp[1] != NULL)) {
924 cnts = strlen(tmp[1]) / 2;
927 RTW_INFO("%s: cnts=%d\n", __func__, cnts);
928 RTW_INFO("%s: data=%s\n", __func__, tmp[1]);
929 for (jj = 0, kk = 0; jj < cnts ; jj++, kk += 2) {
930 pmppriv->network_macaddr[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]);
931 RTW_INFO("network_macaddr[%d]=%x\n", jj, pmppriv->network_macaddr[jj]);
936 pmppriv->bSetRxBssid = _TRUE;
940 pmppriv->bmac_filter = bmac_filter;
942 while ((token = strsep(&pch, "=")) != NULL) {
948 if ((tmp[0] != NULL) && (tmp[1] != NULL)) {
949 cnts = strlen(tmp[1]) / 2;
952 RTW_INFO("%s: cnts=%d\n", __func__, cnts);
953 RTW_INFO("%s: data=%s\n", __func__, tmp[1]);
954 for (jj = 0, kk = 0; jj < cnts ; jj++, kk += 2) {
955 pmppriv->mac_filter[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]);
956 RTW_INFO("%s mac_filter[%d]=%x\n", __func__, jj, pmppriv->mac_filter[jj]);
964 sprintf(extra, "start");
965 SetPacketRx(padapter, bStartRx, _FALSE);
966 } else if (bStopRx) {
967 SetPacketRx(padapter, bStartRx, _FALSE);
968 pmppriv->bmac_filter = _FALSE;
969 pmppriv->bSetRxBssid = _FALSE;
970 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);
971 } else if (bQueryPhy) {
972 _rtw_memset(&rx_counter, 0, sizeof(struct dbg_rx_counter));
973 rtw_dump_phy_rx_counters(padapter, &rx_counter);
975 RTW_INFO("%s: OFDM_FA =%d\n", __func__, rx_counter.rx_ofdm_fa);
976 RTW_INFO("%s: CCK_FA =%d\n", __func__, rx_counter.rx_cck_fa);
977 sprintf(extra, "Phy Received packet OK:%d CRC error:%d FA Counter: %d", rx_counter.rx_pkt_ok, rx_counter.rx_pkt_crc_error, rx_counter.rx_cck_fa + rx_counter.rx_ofdm_fa);
980 } else if (bQueryMac) {
981 _rtw_memset(&rx_counter, 0, sizeof(struct dbg_rx_counter));
982 rtw_dump_mac_rx_counters(padapter, &rx_counter);
983 sprintf(extra, "Mac Received packet OK: %d , CRC error: %d , Drop Packets: %d\n",
984 rx_counter.rx_pkt_ok, rx_counter.rx_pkt_crc_error, rx_counter.rx_pkt_drop);
989 ret = sscanf(input, "mon=%d", &bmon);
992 pmppriv->rx_bindicatePkt = _TRUE;
993 sprintf(extra, "Indicating Receive Packet to network start\n");
995 pmppriv->rx_bindicatePkt = _FALSE;
996 sprintf(extra, "Indicating Receive Packet to network Stop\n");
1000 ret = sscanf(input, "smpcfg=%d", &bSmpCfg);
1003 pmppriv->bRTWSmbCfg = _TRUE;
1004 sprintf(extra , "Indicate By Simple Config Format\n");
1005 SetPacketRx(padapter, _TRUE, _TRUE);
1007 pmppriv->bRTWSmbCfg = _FALSE;
1008 sprintf(extra , "Indicate By Normal Format\n");
1009 SetPacketRx(padapter, _TRUE, _FALSE);
1013 if (pmppriv->bloopback == _TRUE) {
1014 sprintf(extra , "Enter MAC LoopBack mode\n");
1015 _rtw_write32(padapter, 0x100, 0xB0106FF);
1016 RTW_INFO("0x100 :0x%x" , _rtw_read32(padapter, 0x100));
1017 _rtw_write16(padapter, 0x608, 0x30c);
1018 RTW_INFO("0x100 :0x%x" , _rtw_read32(padapter, 0x608));
1021 wrqu->length = strlen(extra) + 1;
1027 int rtw_mp_trx_query(struct net_device *dev,
1028 struct iw_request_info *info,
1029 struct iw_point *wrqu, char *extra)
1031 u32 txok, txfail, rxok, rxfail, rxfilterout;
1032 PADAPTER padapter = rtw_netdev_priv(dev);
1033 PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx);
1034 RT_PMAC_TX_INFO PMacTxInfo = pMptCtx->PMacTxInfo;
1036 if (PMacTxInfo.bEnPMacTx == TRUE)
1037 txok = hal_mpt_query_phytxok(padapter);
1039 txok = padapter->mppriv.tx.sended;
1042 rxok = padapter->mppriv.rx_pktcount;
1043 rxfail = padapter->mppriv.rx_crcerrpktcount;
1044 rxfilterout = padapter->mppriv.rx_pktcount_filter_out;
1046 _rtw_memset(extra, '\0', 128);
1048 sprintf(extra, "Tx OK:%d, Tx Fail:%d, Rx OK:%d, CRC error:%d ,Rx Filter out:%d\n", txok, txfail, rxok, rxfail, rxfilterout);
1050 wrqu->length = strlen(extra) + 1;
1056 int rtw_mp_pwrtrk(struct net_device *dev,
1057 struct iw_request_info *info,
1058 struct iw_point *wrqu, char *extra)
1063 PADAPTER padapter = rtw_netdev_priv(dev);
1064 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
1065 u8 input[wrqu->length];
1067 if (copy_from_user(input, wrqu->pointer, wrqu->length))
1070 _rtw_memset(extra, 0, wrqu->length);
1073 if (wrqu->length > 1) {
1074 /* not empty string*/
1075 if (strncmp(input, "stop", 4) == 0) {
1077 sprintf(extra, "mp tx power tracking stop");
1078 } else if (sscanf(input, "ther=%d", &thermal) == 1) {
1079 ret = SetThermalMeter(padapter, (u8)thermal);
1082 sprintf(extra, "mp tx power tracking start,target value=%d ok", thermal);
1087 ret = SetPowerTracking(padapter, enable);
1091 wrqu->length = strlen(extra);
1098 int rtw_mp_psd(struct net_device *dev,
1099 struct iw_request_info *info,
1100 struct iw_point *wrqu, char *extra)
1102 PADAPTER padapter = rtw_netdev_priv(dev);
1103 u8 input[wrqu->length];
1105 if (copy_from_user(input, wrqu->pointer, wrqu->length))
1108 strcpy(extra, input);
1110 wrqu->length = mp_query_psd(padapter, extra);
1116 int rtw_mp_thermal(struct net_device *dev,
1117 struct iw_request_info *info,
1118 struct iw_point *wrqu, char *extra)
1123 #ifdef CONFIG_RTL8188E
1124 u16 addr = EEPROM_THERMAL_METER_88E;
1126 #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A)
1127 u16 addr = EEPROM_THERMAL_METER_8812;
1129 #ifdef CONFIG_RTL8192E
1130 u16 addr = EEPROM_THERMAL_METER_8192E;
1132 #ifdef CONFIG_RTL8723B
1133 u16 addr = EEPROM_THERMAL_METER_8723B;
1135 #ifdef CONFIG_RTL8703B
1136 u16 addr = EEPROM_THERMAL_METER_8703B;
1138 #ifdef CONFIG_RTL8723D
1139 u16 addr = EEPROM_THERMAL_METER_8723D;
1141 #ifdef CONFIG_RTL8188F
1142 u16 addr = EEPROM_THERMAL_METER_8188F;
1144 #ifdef CONFIG_RTL8822B
1145 u16 addr = EEPROM_THERMAL_METER_8822B;
1147 #ifdef CONFIG_RTL8821C
1148 u16 addr = EEPROM_THERMAL_METER_8821C;
1151 u16 max_available_size = 0;
1152 PADAPTER padapter = rtw_netdev_priv(dev);
1154 if (copy_from_user(extra, wrqu->pointer, wrqu->length))
1157 bwrite = strncmp(extra, "write", 6);/* strncmp TRUE is 0*/
1159 GetThermalMeter(padapter, &val);
1162 /*RTW_INFO("to write val:%d",val);*/
1163 EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
1164 if (2 > max_available_size) {
1165 RTW_INFO("no available efuse!\n");
1168 if (rtw_efuse_map_write(padapter, addr, cnt, &val) == _FAIL) {
1169 RTW_INFO("rtw_efuse_map_write error\n");
1172 sprintf(extra, " efuse write ok :%d", val);
1174 sprintf(extra, "%d", val);
1175 wrqu->length = strlen(extra);
1182 int rtw_mp_reset_stats(struct net_device *dev,
1183 struct iw_request_info *info,
1184 struct iw_point *wrqu, char *extra)
1186 struct mp_priv *pmp_priv;
1187 struct pkt_attrib *pattrib;
1188 PADAPTER padapter = rtw_netdev_priv(dev);
1190 pmp_priv = &padapter->mppriv;
1192 pmp_priv->tx.sended = 0;
1193 pmp_priv->tx_pktcount = 0;
1194 pmp_priv->rx_pktcount = 0;
1195 pmp_priv->rx_pktcount_filter_out = 0;
1196 pmp_priv->rx_crcerrpktcount = 0;
1198 rtw_reset_phy_rx_counters(padapter);
1199 rtw_reset_mac_rx_counters(padapter);
1201 _rtw_memset(extra, 0, wrqu->length);
1202 sprintf(extra, "mp_reset_stats ok\n");
1203 wrqu->length = strlen(extra);
1209 int rtw_mp_dump(struct net_device *dev,
1210 struct iw_request_info *info,
1211 struct iw_point *wrqu, char *extra)
1213 struct mp_priv *pmp_priv;
1214 struct pkt_attrib *pattrib;
1216 u8 input[wrqu->length];
1217 u8 rf_type, path_nums = 0;
1219 PADAPTER padapter = rtw_netdev_priv(dev);
1221 pmp_priv = &padapter->mppriv;
1223 if (copy_from_user(input, wrqu->pointer, wrqu->length))
1226 if (strncmp(input, "all", 4) == 0) {
1227 mac_reg_dump(RTW_DBGDUMP, padapter);
1228 bb_reg_dump(RTW_DBGDUMP, padapter);
1229 rf_reg_dump(RTW_DBGDUMP, padapter);
1235 int rtw_mp_phypara(struct net_device *dev,
1236 struct iw_request_info *info,
1237 struct iw_point *wrqu, char *extra)
1240 PADAPTER padapter = rtw_netdev_priv(dev);
1241 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
1242 char input[wrqu->length];
1245 if (copy_from_user(input, wrqu->pointer, wrqu->length))
1248 RTW_INFO("%s:iwpriv in=%s\n", __func__, input);
1250 ret = sscanf(input, "xcap=%d", &valxcap);
1252 pHalData->CrystalCap = (u8)valxcap;
1253 hal_set_crystal_cap(padapter , valxcap);
1255 sprintf(extra, "Set xcap=%d", valxcap);
1256 wrqu->length = strlen(extra) + 1;
1263 int rtw_mp_SetRFPath(struct net_device *dev,
1264 struct iw_request_info *info,
1265 struct iw_point *wrqu, char *extra)
1267 PADAPTER padapter = rtw_netdev_priv(dev);
1268 char input[wrqu->length];
1269 int bMain = 1, bTurnoff = 1;
1271 RTW_INFO("%s:iwpriv in=%s\n", __func__, input);
1273 if (copy_from_user(input, wrqu->pointer, wrqu->length))
1276 bMain = strncmp(input, "1", 2); /* strncmp TRUE is 0*/
1277 bTurnoff = strncmp(input, "0", 3); /* strncmp TRUE is 0*/
1279 _rtw_memset(extra, 0, wrqu->length);
1282 MP_PHY_SetRFPathSwitch(padapter, _TRUE);
1283 RTW_INFO("%s:PHY_SetRFPathSwitch=TRUE\n", __func__);
1284 sprintf(extra, "mp_setrfpath Main\n");
1286 } else if (bTurnoff == 0) {
1287 MP_PHY_SetRFPathSwitch(padapter, _FALSE);
1288 RTW_INFO("%s:PHY_SetRFPathSwitch=FALSE\n", __func__);
1289 sprintf(extra, "mp_setrfpath Aux\n");
1292 wrqu->length = strlen(extra);
1298 int rtw_mp_QueryDrv(struct net_device *dev,
1299 struct iw_request_info *info,
1300 union iwreq_data *wrqu, char *extra)
1302 PADAPTER padapter = rtw_netdev_priv(dev);
1303 char input[wrqu->data.length];
1306 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
1308 if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
1310 RTW_INFO("%s:iwpriv in=%s\n", __func__, input);
1312 qAutoLoad = strncmp(input, "autoload", 8); /* strncmp TRUE is 0*/
1314 if (qAutoLoad == 0) {
1315 RTW_INFO("%s:qAutoLoad\n", __func__);
1317 if (pHalData->bautoload_fail_flag)
1318 sprintf(extra, "fail");
1320 sprintf(extra, "ok");
1322 wrqu->data.length = strlen(extra) + 1;
1327 int rtw_mp_PwrCtlDM(struct net_device *dev,
1328 struct iw_request_info *info,
1329 struct iw_point *wrqu, char *extra)
1331 PADAPTER padapter = rtw_netdev_priv(dev);
1332 u8 input[wrqu->length];
1335 if (copy_from_user(input, wrqu->pointer, wrqu->length))
1338 bstart = strncmp(input, "start", 5); /* strncmp TRUE is 0*/
1340 sprintf(extra, "PwrCtlDM start\n");
1341 MPT_PwrCtlDM(padapter, 1);
1343 sprintf(extra, "PwrCtlDM stop\n");
1344 MPT_PwrCtlDM(padapter, 0);
1346 wrqu->length = strlen(extra);
1351 int rtw_mp_iqk(struct net_device *dev,
1352 struct iw_request_info *info,
1353 struct iw_point *wrqu, char *extra)
1355 PADAPTER padapter = rtw_netdev_priv(dev);
1357 rtw_mp_trigger_iqk(padapter);
1362 int rtw_mp_lck(struct net_device *dev,
1363 struct iw_request_info *info,
1364 struct iw_point *wrqu, char *extra)
1366 PADAPTER padapter = rtw_netdev_priv(dev);
1368 rtw_mp_trigger_lck(padapter);
1373 int rtw_mp_getver(struct net_device *dev,
1374 struct iw_request_info *info,
1375 union iwreq_data *wrqu, char *extra)
1377 PADAPTER padapter = rtw_netdev_priv(dev);
1378 struct mp_priv *pmp_priv;
1380 pmp_priv = &padapter->mppriv;
1382 if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
1385 sprintf(extra, "rtwpriv=%d\n", RTWPRIV_VER_INFO);
1386 wrqu->data.length = strlen(extra);
1391 int rtw_mp_mon(struct net_device *dev,
1392 struct iw_request_info *info,
1393 union iwreq_data *wrqu, char *extra)
1395 PADAPTER padapter = rtw_netdev_priv(dev);
1396 struct mp_priv *pmp_priv = &padapter->mppriv;
1397 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1398 struct hal_ops *pHalFunc = &padapter->HalFunc;
1399 NDIS_802_11_NETWORK_INFRASTRUCTURE networkType;
1400 int bstart = 1, bstop = 1;
1402 networkType = Ndis802_11Infrastructure;
1403 if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
1406 rtw_pm_set_ips(padapter, IPS_NONE);
1407 LeaveAllPowerSaveMode(padapter);
1409 #ifdef CONFIG_MP_INCLUDED
1410 if (init_mp_priv(padapter) == _FAIL)
1411 RTW_INFO("%s: initialize MP private data Fail!\n", __func__);
1412 padapter->mppriv.channel = 6;
1414 bstart = strncmp(extra, "start", 5); /* strncmp TRUE is 0*/
1415 bstop = strncmp(extra, "stop", 4); /* strncmp TRUE is 0*/
1417 mp_join(padapter, WIFI_FW_ADHOC_STATE);
1418 SetPacketRx(padapter, _TRUE, _FALSE);
1419 SetChannel(padapter);
1420 pmp_priv->rx_bindicatePkt = _TRUE;
1421 pmp_priv->bRTWSmbCfg = _TRUE;
1422 sprintf(extra, "monitor mode start\n");
1423 } else if (bstop == 0) {
1424 SetPacketRx(padapter, _FALSE, _FALSE);
1425 pmp_priv->rx_bindicatePkt = _FALSE;
1426 pmp_priv->bRTWSmbCfg = _FALSE;
1427 padapter->registrypriv.mp_mode = 1;
1428 pHalFunc->hal_deinit(padapter);
1429 padapter->registrypriv.mp_mode = 0;
1430 pHalFunc->hal_init(padapter);
1431 /*rtw_disassoc_cmd(padapter, 0, _TRUE);*/
1432 if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
1433 rtw_disassoc_cmd(padapter, 500, _TRUE);
1434 rtw_indicate_disconnect(padapter, 0, _FALSE);
1435 /*rtw_free_assoc_resources(padapter, 1);*/
1437 rtw_pm_set_ips(padapter, IPS_NORMAL);
1438 sprintf(extra, "monitor mode Stop\n");
1441 wrqu->data.length = strlen(extra);
1445 int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra)
1447 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
1448 struct mp_priv *pmp_priv = &padapter->mppriv;
1449 PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx);
1451 switch (pmp_priv->mode) {
1454 if (bStartTest == 0) {
1455 pmp_priv->tx.stop = 1;
1456 pmp_priv->mode = MP_ON;
1457 sprintf(extra, "Stop continuous Tx");
1458 } else if (pmp_priv->tx.stop == 1) {
1459 sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500 count=%u\n", extra, pmp_priv->tx.count);
1460 pmp_priv->tx.stop = 0;
1461 SetPacketTx(padapter);
1465 case MP_SINGLE_TONE_TX:
1466 if (bStartTest != 0)
1467 sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra);
1468 SetSingleToneTx(padapter, (u8)bStartTest);
1470 case MP_CONTINUOUS_TX:
1471 if (bStartTest != 0)
1472 sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra);
1473 SetContinuousTx(padapter, (u8)bStartTest);
1475 case MP_CARRIER_SUPPRISSION_TX:
1476 if (bStartTest != 0) {
1477 if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_11M)
1478 sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra);
1480 sprintf(extra, "%s\nSpecify carrier suppression but not CCK rate", extra);
1482 SetCarrierSuppressionTx(padapter, (u8)bStartTest);
1484 case MP_SINGLE_CARRIER_TX:
1485 if (bStartTest != 0)
1486 sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra);
1487 SetSingleCarrierTx(padapter, (u8)bStartTest);
1491 sprintf(extra, "Error! Continuous-Tx is not on-going.");
1495 if (bStartTest == 1 && pmp_priv->mode != MP_ON) {
1496 struct mp_priv *pmp_priv = &padapter->mppriv;
1498 if (pmp_priv->tx.stop == 0) {
1499 pmp_priv->tx.stop = 1;
1502 #ifdef CONFIG_80211N_HT
1503 pmp_priv->tx.attrib.ht_en = 1;
1505 pmp_priv->tx.stop = 0;
1506 pmp_priv->tx.count = 1;
1507 SetPacketTx(padapter);
1509 pmp_priv->mode = MP_ON;
1511 #if defined(CONFIG_RTL8812A)
1512 if (IS_HARDWARE_TYPE_8812AU(padapter)) {
1513 /* <20130425, Kordan> Turn off OFDM Rx to prevent from CCA causing Tx hang.*/
1514 if (pmp_priv->mode == MP_PACKET_TX)
1515 PHY_SetBBReg(padapter, rCCAonSec_Jaguar, BIT3, 1);
1517 PHY_SetBBReg(padapter, rCCAonSec_Jaguar, BIT3, 0);
1525 int rtw_mp_tx(struct net_device *dev,
1526 struct iw_request_info *info,
1527 union iwreq_data *wrqu, char *extra)
1529 PADAPTER padapter = rtw_netdev_priv(dev);
1530 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
1531 struct mp_priv *pmp_priv = &padapter->mppriv;
1532 PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx);
1533 struct registry_priv *pregistrypriv = &padapter->registrypriv;
1535 u32 bandwidth = 0, sg = 0, channel = 6, txpower = 40, rate = 108, ant = 0, txmode = 1, count = 0;
1536 u8 i = 0, j = 0, bStartTest = 1, status = 0, Idx = 0, tmpU1B = 0;
1539 if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
1541 RTW_INFO("extra = %s\n", extra);
1542 #ifdef CONFIG_CONCURRENT_MODE
1543 if (!is_primary_adapter(padapter)) {
1544 sprintf(extra, "Error: MP mode can't support Virtual Adapter, Please to use main Adapter.\n");
1545 wrqu->data.length = strlen(extra);
1550 if (strncmp(extra, "stop", 3) == 0) {
1551 bStartTest = 0; /* To set Stop*/
1552 pmp_priv->tx.stop = 1;
1553 sprintf(extra, "Stop continuous Tx");
1554 status = rtw_mp_pretx_proc(padapter, bStartTest, extra);
1555 wrqu->data.length = strlen(extra);
1557 } else if (strncmp(extra, "count", 5) == 0) {
1558 if (sscanf(extra, "count=%d", &count) < 1)
1559 RTW_INFO("Got Count=%d]\n", count);
1560 pmp_priv->tx.count = count;
1562 } else if (strncmp(extra, "setting", 7) == 0) {
1563 _rtw_memset(extra, 0, wrqu->data.length);
1564 sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel);
1565 sprintf(extra, "%s\n Bandwidth:%d", extra, pmp_priv->bandwidth);
1566 sprintf(extra, "%s\n Rate index:%d", extra, pmp_priv->rateidx);
1567 sprintf(extra, "%s\n TxPower index:%d", extra, pmp_priv->txpoweridx);
1568 sprintf(extra, "%s\n Antenna TxPath:%d", extra, pmp_priv->antenna_tx);
1569 sprintf(extra, "%s\n Antenna RxPath:%d", extra, pmp_priv->antenna_rx);
1570 sprintf(extra, "%s\n MP Mode:%d", extra, pmp_priv->mode);
1571 wrqu->data.length = strlen(extra);
1573 #ifdef CONFIG_MP_VHT_HW_TX_MODE
1574 } else if (strncmp(extra, "pmact", 5) == 0) {
1575 if (strncmp(extra, "pmact=", 6) == 0) {
1576 _rtw_memset(&pMptCtx->PMacTxInfo, 0, sizeof(pMptCtx->PMacTxInfo));
1577 if (strncmp(extra, "pmact=start", 11) == 0) {
1578 pMptCtx->PMacTxInfo.bEnPMacTx = _TRUE;
1579 sprintf(extra, "Set PMac Tx Mode start\n");
1581 pMptCtx->PMacTxInfo.bEnPMacTx = _FALSE;
1582 sprintf(extra, "Set PMac Tx Mode Stop\n");
1584 if (pMptCtx->bldpc == TRUE)
1585 pMptCtx->PMacTxInfo.bLDPC = _TRUE;
1587 if (pMptCtx->bstbc == TRUE)
1588 pMptCtx->PMacTxInfo.bSTBC = _TRUE;
1590 pMptCtx->PMacTxInfo.bSPreamble = pmp_priv->preamble;
1591 pMptCtx->PMacTxInfo.bSGI = pmp_priv->preamble;
1592 pMptCtx->PMacTxInfo.BandWidth = pmp_priv->bandwidth;
1593 pMptCtx->PMacTxInfo.TX_RATE = HwRateToMPTRate(pmp_priv->rateidx);
1595 pMptCtx->PMacTxInfo.Mode = pMptCtx->HWTxmode;
1597 pMptCtx->PMacTxInfo.NDP_sound = FALSE;/*(Adapter.PacketType == NDP_PKT)?TRUE:FALSE;*/
1599 if (padapter->mppriv.pktInterval == 0)
1600 pMptCtx->PMacTxInfo.PacketPeriod = 100;
1602 pMptCtx->PMacTxInfo.PacketPeriod = padapter->mppriv.pktInterval;
1604 if (padapter->mppriv.pktLength < 1000)
1605 pMptCtx->PMacTxInfo.PacketLength = 1000;
1607 pMptCtx->PMacTxInfo.PacketLength = padapter->mppriv.pktLength;
1609 pMptCtx->PMacTxInfo.PacketPattern = rtw_random32() % 0xFF;
1611 if (padapter->mppriv.tx_pktcount != 0)
1612 pMptCtx->PMacTxInfo.PacketCount = padapter->mppriv.tx_pktcount;
1614 pMptCtx->PMacTxInfo.Ntx = 0;
1615 for (Idx = 16; Idx < 20; Idx++) {
1616 tmpU1B = (padapter->mppriv.antenna_tx >> Idx) & 1;
1618 pMptCtx->PMacTxInfo.Ntx++;
1621 _rtw_memset(pMptCtx->PMacTxInfo.MacAddress, 0xFF, ETH_ALEN);
1623 PMAC_Get_Pkt_Param(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
1625 if (MPT_IS_CCK_RATE(pMptCtx->PMacTxInfo.TX_RATE))
1627 CCK_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
1629 PMAC_Nsym_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
1631 L_SIG_generator(pMptCtx->PMacPktInfo.N_sym, &pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
1634 if (MPT_IS_HT_RATE(pMptCtx->PMacTxInfo.TX_RATE))
1635 HT_SIG_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
1636 else if (MPT_IS_VHT_RATE(pMptCtx->PMacTxInfo.TX_RATE)) {
1638 VHT_SIG_A_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);
1640 /* 26/27/29 BIT & CRC 8 BIT*/
1641 VHT_SIG_B_generator(&pMptCtx->PMacTxInfo);
1644 VHT_Delimiter_generator(&pMptCtx->PMacTxInfo);
1647 mpt_ProSetPMacTx(padapter);
1649 } else if (strncmp(extra, "pmact,mode=", 11) == 0) {
1652 if (sscanf(extra, "pmact,mode=%d", &txmode) > 0) {
1654 pMptCtx->HWTxmode = CONTINUOUS_TX;
1655 sprintf(extra, "\t Config HW Tx mode = CONTINUOUS_TX\n");
1656 } else if (txmode == 2) {
1657 pMptCtx->HWTxmode = OFDM_Single_Tone_TX;
1658 sprintf(extra, "\t Config HW Tx mode = OFDM_Single_Tone_TX\n");
1660 pMptCtx->HWTxmode = PACKETS_TX;
1661 sprintf(extra, "\t Config HW Tx mode = PACKETS_TX\n");
1664 pMptCtx->HWTxmode = PACKETS_TX;
1665 sprintf(extra, "\t Config HW Tx mode=\n 0 = PACKETS_TX\n 1 = CONTINUOUS_TX\n 2 = OFDM_Single_Tone_TX");
1667 } else if (strncmp(extra, "pmact,", 6) == 0) {
1668 int PacketPeriod = 0, PacketLength = 0, PacketCout = 0;
1669 int bldpc = 0, bstbc = 0;
1671 if (sscanf(extra, "pmact,period=%d", &PacketPeriod) > 0) {
1672 padapter->mppriv.pktInterval = PacketPeriod;
1673 RTW_INFO("PacketPeriod=%d\n", padapter->mppriv.pktInterval);
1674 sprintf(extra, "PacketPeriod [1~255]= %d\n", padapter->mppriv.pktInterval);
1676 } else if (sscanf(extra, "pmact,length=%d", &PacketLength) > 0) {
1677 padapter->mppriv.pktLength = PacketLength;
1678 RTW_INFO("PacketPeriod=%d\n", padapter->mppriv.pktLength);
1679 sprintf(extra, "PacketLength[~65535]=%d\n", padapter->mppriv.pktLength);
1681 } else if (sscanf(extra, "pmact,count=%d", &PacketCout) > 0) {
1682 padapter->mppriv.tx_pktcount = PacketCout;
1683 RTW_INFO("Packet Cout =%d\n", padapter->mppriv.tx_pktcount);
1684 sprintf(extra, "Packet Cout =%d\n", padapter->mppriv.tx_pktcount);
1686 } else if (sscanf(extra, "pmact,ldpc=%d", &bldpc) > 0) {
1687 pMptCtx->bldpc = bldpc;
1688 RTW_INFO("Set LDPC =%d\n", pMptCtx->bldpc);
1689 sprintf(extra, "Set LDPC =%d\n", pMptCtx->bldpc);
1691 } else if (sscanf(extra, "pmact,stbc=%d", &bstbc) > 0) {
1692 pMptCtx->bstbc = bstbc;
1693 RTW_INFO("Set STBC =%d\n", pMptCtx->bstbc);
1694 sprintf(extra, "Set STBC =%d\n", pMptCtx->bstbc);
1696 sprintf(extra, "\n period={1~255}\n length={1000~65535}\n count={0~}\n ldpc={0/1}\n stbc={0/1}");
1700 wrqu->data.length = strlen(extra);
1705 if (sscanf(extra, "ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d", &channel, &bandwidth, &rate, &txpower, &ant, &txmode) < 6) {
1706 RTW_INFO("Invalid format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode);
1707 _rtw_memset(extra, 0, wrqu->data.length);
1708 sprintf(extra, "\n Please input correct format as bleow:\n");
1709 sprintf(extra, "%s\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\n", extra, channel, bandwidth, rate, txpower, ant, txmode);
1710 sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra);
1711 sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra);
1712 sprintf(extra, "%s\n [ rate : CCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]", extra);
1713 sprintf(extra, "%s\n [ OFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>", extra);
1714 sprintf(extra, "%s\n [ HT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >", extra);
1715 sprintf(extra, "%s\n [ HT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >", extra);
1716 sprintf(extra, "%s\n [ VHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >", extra);
1717 sprintf(extra, "%s\n [ txpower : 1~63 power index", extra);
1718 sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra);
1719 sprintf(extra, "%s\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\n", extra);
1720 wrqu->data.length = strlen(extra);
1724 RTW_INFO("Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\n", channel, bandwidth, rate, txpower, ant, txmode);
1725 _rtw_memset(extra, 0, wrqu->data.length);
1726 sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel);
1727 padapter->mppriv.channel = channel;
1728 SetChannel(padapter);
1729 pHalData->CurrentChannel = channel;
1732 bandwidth = CHANNEL_WIDTH_40;
1733 else if (bandwidth == 2)
1734 bandwidth = CHANNEL_WIDTH_80;
1735 sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth);
1736 padapter->mppriv.bandwidth = (u8)bandwidth;
1737 padapter->mppriv.preamble = sg;
1738 SetBandwidth(padapter);
1739 pHalData->CurrentChannelBW = bandwidth;
1741 sprintf(extra, "%s\nSet power level :%d", extra, txpower);
1742 padapter->mppriv.txpoweridx = (u8)txpower;
1743 pMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)txpower;
1744 pMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)txpower;
1745 pMptCtx->TxPwrLevel[ODM_RF_PATH_C] = (u8)txpower;
1746 pMptCtx->TxPwrLevel[ODM_RF_PATH_D] = (u8)txpower;
1748 RTW_INFO("%s: bw=%d sg=%d\n", __func__, bandwidth, sg);
1751 rate = wifirate2_ratetbl_inx((u8)rate);
1752 else if (rate < 0xC8)
1753 rate = (rate - 0x80 + MPT_RATE_MCS0);
1754 /*HT rate 0x80(MCS0) ~ 0x8F(MCS15) ~ 0x9F(MCS31) 128~159
1755 VHT1SS~2SS rate 0xA0 (VHT1SS_MCS0 44) ~ 0xB3 (VHT2SS_MCS9 #63) 160~179
1756 VHT rate 0xB4 (VHT3SS_MCS0 64) ~ 0xC7 (VHT2SS_MCS9 #83) 180~199
1758 VHT rate 0x90(VHT1SS_MCS0) ~ 0x99(VHT1SS_MCS9) 144~153
1759 rate =(rate - MPT_RATE_VHT1SS_MCS0);
1761 RTW_INFO("%s: rate index=%d\n", __func__, rate);
1762 if (rate >= MPT_RATE_LAST)
1764 sprintf(extra, "%s\nSet data rate to %d index %d", extra, padapter->mppriv.rateidx, rate);
1766 padapter->mppriv.rateidx = rate;
1767 pMptCtx->MptRateIndex = rate;
1768 SetDataRate(padapter);
1770 sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant);
1773 antenna = ANTENNA_A;
1776 antenna = ANTENNA_B;
1779 antenna = ANTENNA_C;
1782 antenna = ANTENNA_D;
1785 antenna = ANTENNA_AB;
1788 antenna = ANTENNA_AC;
1791 antenna = ANTENNA_AD;
1794 antenna = ANTENNA_BC;
1797 antenna = ANTENNA_BD;
1800 antenna = ANTENNA_CD;
1803 antenna = ANTENNA_ABC;
1806 antenna = ANTENNA_BCD;
1809 antenna = ANTENNA_ABD;
1812 antenna = ANTENNA_ABCD;
1815 RTW_INFO("%s: antenna=0x%x\n", __func__, antenna);
1816 padapter->mppriv.antenna_tx = antenna;
1817 padapter->mppriv.antenna_rx = antenna;
1818 pHalData->AntennaTxPath = antenna;
1819 SetAntenna(padapter);
1822 pmp_priv->mode = MP_CONTINUOUS_TX;
1823 else if (txmode == 1) {
1824 pmp_priv->mode = MP_PACKET_TX;
1825 pmp_priv->tx.count = count;
1826 } else if (txmode == 2)
1827 pmp_priv->mode = MP_SINGLE_TONE_TX;
1828 else if (txmode == 3)
1829 pmp_priv->mode = MP_CARRIER_SUPPRISSION_TX;
1830 else if (txmode == 4)
1831 pmp_priv->mode = MP_SINGLE_CARRIER_TX;
1833 status = rtw_mp_pretx_proc(padapter, bStartTest, extra);
1838 wrqu->data.length = strlen(extra);
1843 int rtw_mp_rx(struct net_device *dev,
1844 struct iw_request_info *info,
1845 union iwreq_data *wrqu, char *extra)
1847 PADAPTER padapter = rtw_netdev_priv(dev);
1848 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
1849 struct mp_priv *pmp_priv = &padapter->mppriv;
1850 PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx);
1852 u32 bandwidth = 0, sg = 0, channel = 6, ant = 0;
1856 if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
1859 #ifdef CONFIG_CONCURRENT_MODE
1860 if (!is_primary_adapter(padapter)) {
1861 sprintf(extra, "Error: MP mode can't support Virtual Adapter, Please to use main Adapter.\n");
1862 wrqu->data.length = strlen(extra);
1867 if (strncmp(extra, "stop", 4) == 0) {
1868 _rtw_memset(extra, 0, wrqu->data.length);
1869 SetPacketRx(padapter, bStartRx, _FALSE);
1870 pmp_priv->bmac_filter = _FALSE;
1871 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);
1872 wrqu->data.length = strlen(extra);
1875 } else if (sscanf(extra, "ch=%d,bw=%d,ant=%d", &channel, &bandwidth, &ant) < 3) {
1876 RTW_INFO("Invalid format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant);
1877 _rtw_memset(extra, 0, wrqu->data.length);
1878 sprintf(extra, "\n Please input correct format as bleow:\n");
1879 sprintf(extra, "%s\t ch=%d,bw=%d,ant=%d\n", extra, channel, bandwidth, ant);
1880 sprintf(extra, "%s\n [ ch : BGN = <1~14> , A or AC = <36~165> ]", extra);
1881 sprintf(extra, "%s\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]", extra);
1882 sprintf(extra, "%s\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12", extra);
1883 wrqu->data.length = strlen(extra);
1888 RTW_INFO("Got format [ch=%d,bw=%d,ant=%d]\n", channel, bandwidth, ant);
1889 _rtw_memset(extra, 0, wrqu->data.length);
1890 sprintf(extra, "Change Current channel %d to channel %d", padapter->mppriv.channel , channel);
1891 padapter->mppriv.channel = channel;
1892 SetChannel(padapter);
1893 pHalData->CurrentChannel = channel;
1896 bandwidth = CHANNEL_WIDTH_40;
1897 else if (bandwidth == 2)
1898 bandwidth = CHANNEL_WIDTH_80;
1899 sprintf(extra, "%s\nChange Current Bandwidth %d to Bandwidth %d", extra, padapter->mppriv.bandwidth , bandwidth);
1900 padapter->mppriv.bandwidth = (u8)bandwidth;
1901 padapter->mppriv.preamble = sg;
1902 SetBandwidth(padapter);
1903 pHalData->CurrentChannelBW = bandwidth;
1905 sprintf(extra, "%s\nSet Antenna Path :%d", extra, ant);
1908 antenna = ANTENNA_A;
1911 antenna = ANTENNA_B;
1914 antenna = ANTENNA_C;
1917 antenna = ANTENNA_D;
1920 antenna = ANTENNA_AB;
1923 antenna = ANTENNA_AC;
1926 antenna = ANTENNA_AD;
1929 antenna = ANTENNA_BC;
1932 antenna = ANTENNA_BD;
1935 antenna = ANTENNA_CD;
1938 antenna = ANTENNA_ABC;
1941 antenna = ANTENNA_BCD;
1944 antenna = ANTENNA_ABD;
1947 antenna = ANTENNA_ABCD;
1950 RTW_INFO("%s: antenna=0x%x\n", __func__, antenna);
1951 padapter->mppriv.antenna_tx = antenna;
1952 padapter->mppriv.antenna_rx = antenna;
1953 pHalData->AntennaTxPath = antenna;
1954 SetAntenna(padapter);
1956 sprintf(extra, "%s\nstart Rx", extra);
1957 SetPacketRx(padapter, bStartRx, _FALSE);
1959 wrqu->data.length = strlen(extra);
1964 int rtw_mp_hwtx(struct net_device *dev,
1965 struct iw_request_info *info,
1966 union iwreq_data *wrqu, char *extra)
1968 PADAPTER padapter = rtw_netdev_priv(dev);
1969 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
1970 struct mp_priv *pmp_priv = &padapter->mppriv;
1971 PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx);
1973 #if defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8821B) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C)
1974 u8 input[wrqu->data.length];
1976 if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
1979 _rtw_memset(&pMptCtx->PMacTxInfo, 0, sizeof(RT_PMAC_TX_INFO));
1980 _rtw_memcpy((void *)&pMptCtx->PMacTxInfo, (void *)input, sizeof(RT_PMAC_TX_INFO));
1982 mpt_ProSetPMacTx(padapter);
1983 sprintf(extra, "Set PMac Tx Mode start\n");
1985 wrqu->data.length = strlen(extra);
1991 int rtw_efuse_mask_file(struct net_device *dev,
1992 struct iw_request_info *info,
1993 union iwreq_data *wrqu, char *extra)
1995 char *rtw_efuse_mask_file_path;
1997 PADAPTER padapter = rtw_netdev_priv(dev);
1999 _rtw_memset(maskfileBuffer, 0x00, sizeof(maskfileBuffer));
2001 if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2004 if (strncmp(extra, "off", 3) == 0 && strlen(extra) < 4) {
2005 padapter->registrypriv.boffefusemask = 1;
2006 sprintf(extra, "Turn off Efuse Mask\n");
2007 wrqu->data.length = strlen(extra);
2010 if (strncmp(extra, "on", 2) == 0 && strlen(extra) < 3) {
2011 padapter->registrypriv.boffefusemask = 0;
2012 sprintf(extra, "Turn on Efuse Mask\n");
2013 wrqu->data.length = strlen(extra);
2016 rtw_efuse_mask_file_path = extra;
2018 if (rtw_is_file_readable(rtw_efuse_mask_file_path) == _TRUE) {
2019 RTW_INFO("%s do rtw_efuse_mask_file_read = %s! ,sizeof maskfileBuffer %zu\n", __func__, rtw_efuse_mask_file_path, sizeof(maskfileBuffer));
2020 Status = rtw_efuse_file_read(padapter, rtw_efuse_mask_file_path, maskfileBuffer, sizeof(maskfileBuffer));
2021 if (Status == _TRUE)
2022 padapter->registrypriv.bFileMaskEfuse = _TRUE;
2023 sprintf(extra, "efuse mask file read OK\n");
2025 padapter->registrypriv.bFileMaskEfuse = _FALSE;
2026 sprintf(extra, "efuse mask file readable FAIL\n");
2027 RTW_INFO("%s rtw_is_file_readable fail!\n", __func__);
2029 wrqu->data.length = strlen(extra);
2034 int rtw_efuse_file_map(struct net_device *dev,
2035 struct iw_request_info *info,
2036 union iwreq_data *wrqu, char *extra)
2038 char *rtw_efuse_file_map_path;
2040 PEFUSE_HAL pEfuseHal;
2041 PADAPTER padapter = rtw_netdev_priv(dev);
2042 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
2043 struct mp_priv *pmp_priv = &padapter->mppriv;
2045 pEfuseHal = &pHalData->EfuseHal;
2046 if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2049 rtw_efuse_file_map_path = extra;
2051 _rtw_memset(pEfuseHal->fakeEfuseModifiedMap, 0xFF, EFUSE_MAX_MAP_LEN);
2053 if (rtw_is_file_readable(rtw_efuse_file_map_path) == _TRUE) {
2054 RTW_INFO("%s do rtw_efuse_mask_file_read = %s!\n", __func__, rtw_efuse_file_map_path);
2055 Status = rtw_efuse_file_read(padapter, rtw_efuse_file_map_path, pEfuseHal->fakeEfuseModifiedMap, sizeof(pEfuseHal->fakeEfuseModifiedMap));
2056 if (Status == _TRUE) {
2057 pmp_priv->bloadefusemap = _TRUE;
2058 sprintf(extra, "efuse file file_read OK\n");
2060 pmp_priv->bloadefusemap = _FALSE;
2061 sprintf(extra, "efuse file file_read FAIL\n");
2064 sprintf(extra, "efuse file readable FAIL\n");
2065 RTW_INFO("%s rtw_is_file_readable fail!\n", __func__);
2067 wrqu->data.length = strlen(extra);
2071 #if defined(CONFIG_RTL8723B)
2072 int rtw_mp_SetBT(struct net_device *dev,
2073 struct iw_request_info *info,
2074 union iwreq_data *wrqu, char *extra)
2076 PADAPTER padapter = rtw_netdev_priv(dev);
2077 struct hal_ops *pHalFunc = &padapter->HalFunc;
2078 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
2081 PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx);
2082 PBT_RSP_CMD pBtRsp = (PBT_RSP_CMD)&pMptCtx->mptOutBuf[0];
2084 char *pch, *ptmp, *token, *tmp[2] = {0x00, 0x00};
2087 u8 tempval, BTStatus;
2089 u8 u1H2CBtMpOperParm[4] = {0x01};
2090 int testmode = 1, ready = 1, trxparam = 1, setgen = 1, getgen = 1, testctrl = 1, testbt = 1, readtherm = 1, setbtmac = 1;
2091 u32 i = 0, ii = 0, jj = 0, kk = 0, cnts = 0, status = 0;
2092 PRT_MP_FIRMWARE pBTFirmware = NULL;
2094 if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
2096 if (strlen(extra) < 1)
2099 RTW_INFO("%s:iwpriv in=%s\n", __func__, extra);
2100 ready = strncmp(extra, "ready", 5);
2101 testmode = strncmp(extra, "testmode", 8); /* strncmp TRUE is 0*/
2102 trxparam = strncmp(extra, "trxparam", 8);
2103 setgen = strncmp(extra, "setgen", 6);
2104 getgen = strncmp(extra, "getgen", 6);
2105 testctrl = strncmp(extra, "testctrl", 8);
2106 testbt = strncmp(extra, "testbt", 6);
2107 readtherm = strncmp(extra, "readtherm", 9);
2108 setbtmac = strncmp(extra, "setbtmac", 8);
2110 if (strncmp(extra, "dlbt", 4) == 0) {
2111 pHalData->LastHMEBoxNum = 0;
2112 padapter->bBTFWReady = _FALSE;
2113 rtw_write8(padapter, 0xa3, 0x05);
2114 BTStatus = rtw_read8(padapter, 0xa0);
2115 RTW_INFO("%s: btwmap before read 0xa0 BT Status =0x%x\n", __func__, BTStatus);
2116 if (BTStatus != 0x04) {
2117 sprintf(extra, "BT Status not Active DLFW FAIL\n");
2121 tempval = rtw_read8(padapter, 0x6B);
2123 rtw_write8(padapter, 0x6B, tempval);
2125 /* Attention!! Between 0x6A[14] and 0x6A[15] setting need 100us delay*/
2126 /* So don't write 0x6A[14]=1 and 0x6A[15]=0 together!*/
2128 /* disable BT power cut*/
2130 tempval = rtw_read8(padapter, 0x6B);
2132 rtw_write8(padapter, 0x6B, tempval);
2134 MPT_PwrCtlDM(padapter, 0);
2135 rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) | 0x00000004));
2136 rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) & 0xFFFFFFEF));
2138 rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) | 0x00000010));
2139 rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) & 0xFFFFFFFB));
2140 rtw_msleep_os(1200);
2141 pBTFirmware = (PRT_MP_FIRMWARE)rtw_zmalloc(sizeof(RT_MP_FIRMWARE));
2142 if (pBTFirmware == NULL)
2144 padapter->bBTFWReady = _FALSE;
2145 FirmwareDownloadBT(padapter, pBTFirmware);
2147 rtw_mfree((u8 *)pBTFirmware, sizeof(RT_MP_FIRMWARE));
2149 RTW_INFO("Wait for FirmwareDownloadBT fw boot!\n");
2150 rtw_msleep_os(2000);
2151 _rtw_memset(extra, '\0', wrqu->data.length);
2152 BtReq.opCodeVer = 1;
2154 BtReq.paraLength = 0;
2155 mptbt_BtControlProcess(padapter, &BtReq);
2158 RTW_INFO("FirmwareDownloadBT ready = 0x%x 0x%x", pMptCtx->mptOutBuf[4], pMptCtx->mptOutBuf[5]);
2159 if ((pMptCtx->mptOutBuf[4] == 0x00) && (pMptCtx->mptOutBuf[5] == 0x00)) {
2161 if (padapter->mppriv.bTxBufCkFail == _TRUE)
2162 sprintf(extra, "check TxBuf Fail.\n");
2164 sprintf(extra, "download FW Fail.\n");
2166 sprintf(extra, "download FW OK.\n");
2171 if (strncmp(extra, "dlfw", 4) == 0) {
2172 pHalData->LastHMEBoxNum = 0;
2173 padapter->bBTFWReady = _FALSE;
2174 rtw_write8(padapter, 0xa3, 0x05);
2175 BTStatus = rtw_read8(padapter, 0xa0);
2176 RTW_INFO("%s: btwmap before read 0xa0 BT Status =0x%x\n", __func__, BTStatus);
2177 if (BTStatus != 0x04) {
2178 sprintf(extra, "BT Status not Active DLFW FAIL\n");
2182 tempval = rtw_read8(padapter, 0x6B);
2184 rtw_write8(padapter, 0x6B, tempval);
2186 /* Attention!! Between 0x6A[14] and 0x6A[15] setting need 100us delay*/
2187 /* So don't write 0x6A[14]=1 and 0x6A[15]=0 together!*/
2189 /* disable BT power cut*/
2191 tempval = rtw_read8(padapter, 0x6B);
2193 rtw_write8(padapter, 0x6B, tempval);
2196 MPT_PwrCtlDM(padapter, 0);
2197 rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) | 0x00000004));
2198 rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) & 0xFFFFFFEF));
2200 rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) | 0x00000010));
2201 rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) & 0xFFFFFFFB));
2202 rtw_msleep_os(1200);
2204 #if defined(CONFIG_PLATFORM_SPRD) && (MP_DRIVER == 1)
2205 /* Pull up BT reset pin.*/
2206 RTW_INFO("%s: pull up BT reset pin when bt start mp test\n", __func__);
2207 rtw_wifi_gpio_wlan_ctrl(WLAN_BT_PWDN_ON);
2209 RTW_INFO(" FirmwareDownload!\n");
2211 #if defined(CONFIG_RTL8723B)
2212 status = rtl8723b_FirmwareDownload(padapter, _FALSE);
2214 RTW_INFO("Wait for FirmwareDownloadBT fw boot!\n");
2215 rtw_msleep_os(1000);
2216 #ifdef CONFIG_BT_COEXIST
2217 rtw_btcoex_HaltNotify(padapter);
2218 RTW_INFO("SetBT btcoex HaltNotify !\n");
2219 /*hal_btcoex1ant_SetAntPath(padapter);*/
2220 rtw_btcoex_SetManualControl(padapter, _TRUE);
2222 _rtw_memset(extra, '\0', wrqu->data.length);
2223 BtReq.opCodeVer = 1;
2225 BtReq.paraLength = 0;
2226 mptbt_BtControlProcess(padapter, &BtReq);
2229 RTW_INFO("FirmwareDownloadBT ready = 0x%x 0x%x", pMptCtx->mptOutBuf[4], pMptCtx->mptOutBuf[5]);
2230 if ((pMptCtx->mptOutBuf[4] == 0x00) && (pMptCtx->mptOutBuf[5] == 0x00)) {
2231 if (padapter->mppriv.bTxBufCkFail == _TRUE)
2232 sprintf(extra, "check TxBuf Fail.\n");
2234 sprintf(extra, "download FW Fail.\n");
2236 #ifdef CONFIG_BT_COEXIST
2237 rtw_btcoex_SwitchBtTRxMask(padapter);
2240 sprintf(extra, "download FW OK.\n");
2246 if (strncmp(extra, "down", 4) == 0) {
2247 RTW_INFO("SetBT down for to hal_init !\n");
2248 #ifdef CONFIG_BT_COEXIST
2249 rtw_btcoex_SetManualControl(padapter, _FALSE);
2250 rtw_btcoex_Initialize(padapter);
2252 pHalFunc->read_adapter_info(padapter);
2253 pHalFunc->hal_deinit(padapter);
2254 pHalFunc->hal_init(padapter);
2255 rtw_pm_set_ips(padapter, IPS_NONE);
2256 LeaveAllPowerSaveMode(padapter);
2257 MPT_PwrCtlDM(padapter, 0);
2258 rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) | 0x00000004));
2259 rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) & 0xFFFFFFEF));
2261 /*rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)& 0xFFFFFFFE));*/
2262 rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) | 0x00000010));
2263 rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) & 0xFFFFFFFB));
2264 rtw_msleep_os(1200);
2267 if (strncmp(extra, "disable", 7) == 0) {
2268 RTW_INFO("SetBT disable !\n");
2269 rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a) & 0xFFFFFFFB));
2273 if (strncmp(extra, "enable", 6) == 0) {
2274 RTW_INFO("SetBT enable !\n");
2275 rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a) | 0x00000004));
2279 if (strncmp(extra, "h2c", 3) == 0) {
2280 RTW_INFO("SetBT h2c !\n");
2281 padapter->bBTFWReady = _TRUE;
2282 rtw_hal_fill_h2c_cmd(padapter, 0x63, 1, u1H2CBtMpOperParm);
2285 if (strncmp(extra, "2ant", 4) == 0) {
2286 RTW_INFO("Set BT 2ant use!\n");
2287 PHY_SetMacReg(padapter, 0x67, BIT5, 0x1);
2288 rtw_write32(padapter, 0x948, 0000);
2293 if (ready != 0 && testmode != 0 && trxparam != 0 && setgen != 0 && getgen != 0 && testctrl != 0 && testbt != 0 && readtherm != 0 && setbtmac != 0)
2297 BtReq.opCodeVer = 1;
2299 BtReq.paraLength = cnts / 2;
2303 BtReq.opCodeVer = 1;
2305 BtReq.paraLength = 0;
2311 while ((token = strsep(&pch, ",")) != NULL) {
2318 if ((tmp[0] != NULL) && (tmp[1] != NULL)) {
2319 cnts = strlen(tmp[1]);
2323 RTW_INFO("%s: cnts=%d\n", __func__, cnts);
2324 RTW_INFO("%s: data=%s\n", __func__, tmp[1]);
2326 for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) {
2327 BtReq.pParamStart[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]);
2328 /* RTW_INFO("BtReq.pParamStart[%d]=0x%02x\n", jj, BtReq.pParamStart[jj]);*/
2333 if (testmode == 0) {
2334 BtReq.opCodeVer = 1;
2336 BtReq.paraLength = 1;
2338 if (trxparam == 0) {
2339 BtReq.opCodeVer = 1;
2341 BtReq.paraLength = cnts / 2;
2344 RTW_INFO("%s: BT_SET_GENERAL\n", __func__);
2345 BtReq.opCodeVer = 1;
2346 BtReq.OpCode = 3;/*BT_SET_GENERAL 3*/
2347 BtReq.paraLength = cnts / 2;
2350 RTW_INFO("%s: BT_GET_GENERAL\n", __func__);
2351 BtReq.opCodeVer = 1;
2352 BtReq.OpCode = 4;/*BT_GET_GENERAL 4*/
2353 BtReq.paraLength = cnts / 2;
2355 if (readtherm == 0) {
2356 RTW_INFO("%s: BT_GET_GENERAL\n", __func__);
2357 BtReq.opCodeVer = 1;
2358 BtReq.OpCode = 4;/*BT_GET_GENERAL 4*/
2359 BtReq.paraLength = cnts / 2;
2362 if (testctrl == 0) {
2363 RTW_INFO("%s: BT_TEST_CTRL\n", __func__);
2364 BtReq.opCodeVer = 1;
2365 BtReq.OpCode = 5;/*BT_TEST_CTRL 5*/
2366 BtReq.paraLength = cnts / 2;
2369 RTW_INFO("%s: Req opCodeVer=%d OpCode=%d paraLength=%d\n",
2370 __func__, BtReq.opCodeVer, BtReq.OpCode, BtReq.paraLength);
2372 if (BtReq.paraLength < 1)
2374 for (i = 0; i < BtReq.paraLength; i++) {
2375 RTW_INFO("%s: BtReq.pParamStart[%d] = 0x%02x\n",
2376 __func__, i, BtReq.pParamStart[i]);
2380 _rtw_memset(extra, '\0', wrqu->data.length);
2382 if (padapter->bBTFWReady == _FALSE) {
2383 sprintf(extra, "BTFWReady = FALSE.\n");
2387 mptbt_BtControlProcess(padapter, &BtReq);
2389 if (readtherm == 0) {
2390 sprintf(extra, "BT thermal=");
2391 for (i = 4; i < pMptCtx->mptOutLen; i++) {
2392 if ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00))
2395 sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i] & 0x1f));
2398 for (i = 4; i < pMptCtx->mptOutLen; i++)
2399 sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]);
2403 wrqu->data.length = strlen(extra) + 1;
2404 RTW_INFO("-%s: output len=%d data=%s\n", __func__, wrqu->data.length, extra);
2409 #endif /*#ifdef CONFIG_RTL8723B*/