1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 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 ******************************************************************************/
25 #define MPT_READ_MAC_1BYTE 1
26 #define MPT_READ_MAC_2BYTE 2
27 #define MPT_READ_MAC_4BYTE 3
28 #define MPT_WRITE_MAC_1BYTE 4
29 #define MPT_WRITE_MAC_2BYTE 5
30 #define MPT_WRITE_MAC_4BYTE 6
31 #define MPT_READ_BB_CCK 7
32 #define MPT_WRITE_BB_CCK 8
33 #define MPT_READ_BB_OFDM 9
34 #define MPT_WRITE_BB_OFDM 10
35 #define MPT_READ_RF 11
36 #define MPT_WRITE_RF 12
37 #define MPT_READ_EEPROM_1BYTE 13
38 #define MPT_WRITE_EEPROM_1BYTE 14
39 #define MPT_READ_EEPROM_2BYTE 15
40 #define MPT_WRITE_EEPROM_2BYTE 16
41 #define MPT_SET_CSTHRESHOLD 21
42 #define MPT_SET_INITGAIN 22
43 #define MPT_SWITCH_BAND 23
44 #define MPT_SWITCH_CHANNEL 24
45 #define MPT_SET_DATARATE 25
46 #define MPT_SWITCH_ANTENNA 26
47 #define MPT_SET_TX_POWER 27
48 #define MPT_SET_CONT_TX 28
49 #define MPT_SET_SINGLE_CARRIER 29
50 #define MPT_SET_CARRIER_SUPPRESSION 30
51 #define MPT_GET_RATE_TABLE 31
52 #define MPT_READ_TSSI 32
53 #define MPT_GET_THERMAL_METER 33
56 #define RTWPRIV_VER_INFO 1
58 #define MAX_MP_XMITBUF_SZ 2048
59 #define NR_MP_XMITFRAME 8
65 struct pkt_attrib attrib;
75 //insert urb, irp, and irpcnt info below...
81 #if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX)
94 #endif /* CONFIG_USB_HCI */
96 uint mem[(MAX_MP_XMITBUF_SZ >> 2)];
107 typedef void(*wi_act_func)(void* padapter);
109 #ifdef PLATFORM_WINDOWS
115 NDIS_WORK_ITEM mp_wi;
116 NDIS_EVENT mp_wi_evt;
119 wi_act_func curractfunc;
120 // Variable needed in each implementation of CurrActFunc.
121 struct mp_wiparam param;
130 struct pkt_attrib attrib;
131 //struct tx_desc desc;
133 u8 desc[TXDESC_SIZE];
136 u32 buf_size, write_size;
137 _thread_hdl_ PktTxThread;
140 #define MP_MAX_LINES 1000
141 #define MP_MAX_LINES_BYTES 256
178 typedef VOID (*MPT_WORK_ITEM_HANDLER)(IN PVOID Adapter);
179 typedef struct _MPT_CONTEXT
181 // Indicate if we have started Mass Production Test.
182 BOOLEAN bMassProdTest;
184 // Indicate if the driver is unloading or unloaded.
185 BOOLEAN bMptDrvUnload;
188 _timer MPh2c_timeout_timer;
189 // Event used to sync H2c for BT control
191 BOOLEAN MptH2cRspEvent;
192 BOOLEAN MptBtC2hEvent;
193 BOOLEAN bMPh2c_timeout;
195 /* 8190 PCI does not support NDIS_WORK_ITEM. */
196 // Work Item for Mass Production Test.
197 //NDIS_WORK_ITEM MptWorkItem;
198 // RT_WORK_ITEM MptWorkItem;
199 // Event used to sync the case unloading driver and MptWorkItem is still in progress.
200 // NDIS_EVENT MptWorkItemEvent;
201 // To protect the following variables.
202 // NDIS_SPIN_LOCK MptWorkItemSpinLock;
203 // Indicate a MptWorkItem is scheduled and not yet finished.
204 BOOLEAN bMptWorkItemInProgress;
205 // An instance which implements function and context of MptWorkItem.
206 MPT_WORK_ITEM_HANDLER CurrMptAct;
208 // 1=Start, 0=Stop from UI.
210 // _TEST_MODE, defined in MPT_Req2.h
212 // Variable needed in each implementation of CurrMptAct.
213 ULONG MptActType; // Type of action performed in CurrMptAct.
214 // The Offset of IO operation is depend of MptActType.
216 // The Value of IO operation is depend of MptActType.
218 // The RfPath of IO operation is depend of MptActType.
221 WIRELESS_MODE MptWirelessModeToSw; // Wireless mode to switch.
222 u8 MptChannelToSw; // Channel to switch.
223 u8 MptInitGainToSet; // Initial gain to set.
224 //ULONG bMptAntennaA; // TRUE if we want to use antenna A.
225 ULONG MptBandWidth; // bandwidth to switch.
226 ULONG MptRateIndex; // rate index.
227 // Register value kept for Single Carrier Tx test.
229 // Register value kept for Single Carrier Tx test.
231 // For MP Tx Power index
232 u8 TxPwrLevel[4]; /* rf-A, rf-B*/
234 // Content of RCR Regsiter for Mass Production Test.
236 // TRUE if we only receive packets with specific pattern.
237 BOOLEAN bMptFilterPattern;
238 // Rx OK count, statistics used in Mass Production Test.
240 // Rx CRC32 error count, statistics used in Mass Production Test.
241 ULONG MptRxCrcErrCnt;
243 BOOLEAN bCckContTx; // TRUE if we are in CCK Continuous Tx test.
244 BOOLEAN bOfdmContTx; // TRUE if we are in OFDM Continuous Tx test.
245 BOOLEAN bStartContTx; // TRUE if we have start Continuous Tx test.
246 // TRUE if we are in Single Carrier Tx test.
247 BOOLEAN bSingleCarrier;
248 // TRUE if we are in Carrier Suppression Tx Test.
249 BOOLEAN bCarrierSuppression;
250 //TRUE if we are in Single Tone Tx test.
253 // ACK counter asked by K.Y..
254 BOOLEAN bMptEnableAckCounter;
257 // SD3 Willis For 8192S to save 1T/2T RF table for ACUT Only fro ACUT delete later ~~~!
258 //s1Byte BufOfLines[2][MAX_LINES_HWCONFIG_TXT][MAX_BYTES_LINE_HWCONFIG_TXT];
259 //s1Byte BufOfLines[2][MP_MAX_LINES][MP_MAX_LINES_BYTES];
260 //s4Byte RfReadLine[2];
262 u8 APK_bound[2]; //for APK path A/path B
263 BOOLEAN bMptIndexEven;
271 u4Byte backup0x58_RF_A;
272 u4Byte backup0x58_RF_B;
279 u1Byte mptOutBuf[100];
281 }MPT_CONTEXT, *PMPT_CONTEXT;
285 #ifdef CONFIG_RTL8188E
286 #define EFUSE_MAP_SIZE 512
288 #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A)
289 #define EFUSE_MAP_SIZE 512
291 #ifdef CONFIG_RTL8192E
292 #define EFUSE_MAP_SIZE 512
294 #ifdef CONFIG_RTL8723B
295 #define EFUSE_MAP_SIZE 512
297 #ifdef CONFIG_RTL8814A
298 #define EFUSE_MAP_SIZE 512
301 #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A)
302 #define EFUSE_MAX_SIZE 1024
303 #elif defined(CONFIG_RTL8188E)
304 #define EFUSE_MAX_SIZE 256
306 #define EFUSE_MAX_SIZE 512
310 //#define RTPRIV_IOCTL_MP ( SIOCIWFIRSTPRIV + 0x17)
340 MP_DISABLE_BT_COEXIST,
349 #ifdef CONFIG_AP_WOWLAN
361 u32 mode;//0 for normal type packet, 1 for loopback packet (16bytes TXCMD)
366 struct mp_wiparam workparam;
367 // u8 act_in_progress;
376 u32 rx_bssidpktcount;
378 u32 rx_pktcount_filter_out;
379 u32 rx_crcerrpktcount;
381 BOOLEAN rx_bindicatePkt;
382 struct recv_stat rxstat;
387 u8 prime_channel_offset;
396 // u32 curr_crystalcap;
405 // uint ForcedDataRate;
407 u8 mac_filter[ETH_ALEN];
410 struct wlan_network mp_network;
411 NDIS_802_11_MAC_ADDRESS network_macaddr;
413 #ifdef PLATFORM_WINDOWS
420 struct mp_wi_cntx wi_cntx;
425 u8 h2c_resp_parambuf[512];
429 NDIS_EVENT h2c_cmd_evt;
434 NDIS_EVENT scsir_full_evt;
435 NDIS_EVENT scsiw_empty_evt;
438 u8 *pallocated_mp_xmitframe_buf;
439 u8 *pmp_xmtframe_buf;
440 _queue free_mp_xmitqueue;
441 u32 free_mp_xmitframe_cnt;
443 BOOLEAN bTxBufCkFail;
450 typedef struct _IOCMD_STRUCT_ {
456 struct rf_reg_param {
462 struct bb_reg_param {
467 typedef struct _MP_FIRMWARE {
468 FIRMWARE_SOURCE eFWSource;
469 #ifdef CONFIG_EMBEDDED_FWIMG
472 u8 szFwBuffer[0x8000];
475 } RT_MP_FIRMWARE, *PRT_MP_FIRMWARE;
480 //=======================================================================
485 /* Hardware Registers */
488 #define IOCMD_CTRL_REG 0x102502C0
489 #define IOCMD_DATA_REG 0x102502C4
491 #define IOCMD_CTRL_REG 0x10250370
492 #define IOCMD_DATA_REG 0x10250374
495 #define IOCMD_GET_THERMAL_METER 0xFD000028
497 #define IOCMD_CLASS_BB_RF 0xF0
498 #define IOCMD_BB_READ_IDX 0x00
499 #define IOCMD_BB_WRITE_IDX 0x01
500 #define IOCMD_RF_READ_IDX 0x02
501 #define IOCMD_RF_WRIT_IDX 0x03
503 #define BB_REG_BASE_ADDR 0x800
507 #define _2MAC_MODE_ 0
508 #define _LOOPBOOK_MODE_ 1
510 typedef enum _MP_MODE_ {
515 MP_SINGLE_CARRIER_TX,
516 MP_CARRIER_SUPPRISSION_TX,
523 #define MAX_RF_PATH_NUMS RF_PATH_MAX
526 extern u8 mpdatarate[NumRates];
528 /* MP set force data rate base on the definition. */
529 typedef enum _MPT_RATE_INDEX
532 MPT_RATE_1M =0 , /* 0 */
535 MPT_RATE_11M, /* 3 */
545 MPT_RATE_54M, /* 11 */
548 MPT_RATE_MCS0, /* 12 */
555 MPT_RATE_MCS7, /* 19 */
563 MPT_RATE_MCS15, /* 27 */
565 MPT_RATE_MCS17, // #29
570 MPT_RATE_MCS22, // #34
575 MPT_RATE_MCS27, // #39
576 MPT_RATE_MCS28, // #40
577 MPT_RATE_MCS29, // #41
578 MPT_RATE_MCS30, // #42
579 MPT_RATE_MCS31, // #43
580 /* VHT rate. Total: 20*/
581 MPT_RATE_VHT1SS_MCS0,// #44
582 MPT_RATE_VHT1SS_MCS1, // #
583 MPT_RATE_VHT1SS_MCS2,
584 MPT_RATE_VHT1SS_MCS3,
585 MPT_RATE_VHT1SS_MCS4,
586 MPT_RATE_VHT1SS_MCS5,
587 MPT_RATE_VHT1SS_MCS6, // #
588 MPT_RATE_VHT1SS_MCS7,
589 MPT_RATE_VHT1SS_MCS8,
590 MPT_RATE_VHT1SS_MCS9, //#53
591 MPT_RATE_VHT2SS_MCS0, //#54
592 MPT_RATE_VHT2SS_MCS1,
593 MPT_RATE_VHT2SS_MCS2,
594 MPT_RATE_VHT2SS_MCS3,
595 MPT_RATE_VHT2SS_MCS4,
596 MPT_RATE_VHT2SS_MCS5,
597 MPT_RATE_VHT2SS_MCS6,
598 MPT_RATE_VHT2SS_MCS7,
599 MPT_RATE_VHT2SS_MCS8,
600 MPT_RATE_VHT2SS_MCS9, //#63
601 MPT_RATE_VHT3SS_MCS0,
602 MPT_RATE_VHT3SS_MCS1,
603 MPT_RATE_VHT3SS_MCS2,
604 MPT_RATE_VHT3SS_MCS3,
605 MPT_RATE_VHT3SS_MCS4,
606 MPT_RATE_VHT3SS_MCS5,
607 MPT_RATE_VHT3SS_MCS6, // #126
608 MPT_RATE_VHT3SS_MCS7,
609 MPT_RATE_VHT3SS_MCS8,
610 MPT_RATE_VHT3SS_MCS9,
611 MPT_RATE_VHT4SS_MCS0,
612 MPT_RATE_VHT4SS_MCS1, // #131
613 MPT_RATE_VHT4SS_MCS2,
614 MPT_RATE_VHT4SS_MCS3,
615 MPT_RATE_VHT4SS_MCS4,
616 MPT_RATE_VHT4SS_MCS5,
617 MPT_RATE_VHT4SS_MCS6, // #136
618 MPT_RATE_VHT4SS_MCS7,
619 MPT_RATE_VHT4SS_MCS8,
620 MPT_RATE_VHT4SS_MCS9,
622 }MPT_RATE_E, *PMPT_RATE_E;
624 #define MAX_TX_PWR_INDEX_N_MODE 64 // 0x3F
626 typedef enum _POWER_MODE_ {
631 // The following enumeration is used to define the value of Reg0xD00[30:28] or JaguarReg0x914[18:16].
632 typedef enum _OFDM_TX_MODE {
634 OFDM_ContinuousTx = 1,
635 OFDM_SingleCarrier = 2,
640 #define RX_PKT_BROADCAST 1
641 #define RX_PKT_DEST_ADDR 2
642 #define RX_PKT_PHY_MATCH 3
645 #define RPTMaxCount 0x000FFFFF;
647 // parameter 1 : BitMask
649 // bit 1 : OFDM False Alarm
650 // bit 2 : OFDM MPDU OK
651 // bit 3 : OFDM MPDU Fail
653 // bit 5 : CCK False Alarm
654 // bit 6 : CCK MPDU ok
655 // bit 7 : CCK MPDU fail
656 // bit 8 : HT PPDU counter
657 // bit 9 : HT false alarm
658 // bit 10 : HT MPDU total
659 // bit 11 : HT MPDU OK
660 // bit 12 : HT MPDU fail
661 // bit 15 : RX full drop
662 typedef enum _RXPHY_BITMASK_
680 #define Mac_OFDM_OK 0x00000000
681 #define Mac_OFDM_Fail 0x10000000
682 #define Mac_OFDM_FasleAlarm 0x20000000
683 #define Mac_CCK_OK 0x30000000
684 #define Mac_CCK_Fail 0x40000000
685 #define Mac_CCK_FasleAlarm 0x50000000
686 #define Mac_HT_OK 0x60000000
687 #define Mac_HT_Fail 0x70000000
688 #define Mac_HT_FasleAlarm 0x90000000
689 #define Mac_DropPacket 0xA0000000
691 typedef enum _ENCRY_CTRL_STATE_ {
692 HW_CONTROL, //hw encryption& decryption
693 SW_CONTROL, //sw encryption& decryption
694 HW_ENCRY_SW_DECRY, //hw encryption & sw decryption
695 SW_ENCRY_HW_DECRY //sw encryption & hw decryption
698 typedef enum _MPT_TXPWR_DEF{
700 MPT_OFDM, // L and HT OFDM
706 #ifdef CONFIG_RF_GAIN_OFFSET
708 #if defined(CONFIG_RTL8723B)
709 #define REG_RF_BB_GAIN_OFFSET 0x7f
710 #define RF_GAIN_OFFSET_MASK 0xfffff
711 #elif defined(CONFIG_RTL8188E)
712 #define REG_RF_BB_GAIN_OFFSET 0x55
713 #define RF_GAIN_OFFSET_MASK 0xfffff
715 #define REG_RF_BB_GAIN_OFFSET 0x55
716 #define RF_GAIN_OFFSET_MASK 0xfffff
717 #endif //CONFIG_RTL8723B
719 #endif //CONFIG_RF_GAIN_OFFSET
721 //=======================================================================
722 //extern struct mp_xmit_frame *alloc_mp_xmitframe(struct mp_priv *pmp_priv);
723 //extern int free_mp_xmitframe(struct xmit_priv *pxmitpriv, struct mp_xmit_frame *pmp_xmitframe);
725 extern s32 init_mp_priv(PADAPTER padapter);
726 extern void free_mp_priv(struct mp_priv *pmp_priv);
727 extern s32 MPT_InitializeAdapter(PADAPTER padapter, u8 Channel);
728 extern void MPT_DeInitAdapter(PADAPTER padapter);
729 extern s32 mp_start_test(PADAPTER padapter);
730 extern void mp_stop_test(PADAPTER padapter);
732 //=======================================================================
733 //extern void IQCalibrateBcut(PADAPTER pAdapter);
735 //extern u32 bb_reg_read(PADAPTER Adapter, u16 offset);
736 //extern u8 bb_reg_write(PADAPTER Adapter, u16 offset, u32 value);
737 //extern u32 rf_reg_read(PADAPTER Adapter, u8 path, u8 offset);
738 //extern u8 rf_reg_write(PADAPTER Adapter, u8 path, u8 offset, u32 value);
740 //extern u32 get_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask);
741 //extern u8 set_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask, u32 value);
742 //extern u32 get_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask);
743 //extern u8 set_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask, u32 value);
745 extern u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask);
746 extern void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val);
748 extern u32 read_macreg(_adapter *padapter, u32 addr, u32 sz);
749 extern void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz);
750 extern u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask);
751 extern void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val);
752 extern u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr);
753 extern void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val);
755 void SetChannel(PADAPTER pAdapter);
756 void SetBandwidth(PADAPTER pAdapter);
757 int SetTxPower(PADAPTER pAdapter);
758 void SetAntennaPathPower(PADAPTER pAdapter);
759 //extern void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset);
760 void SetDataRate(PADAPTER pAdapter);
762 void SetAntenna(PADAPTER pAdapter);
764 //extern void SetCrystalCap(PADAPTER pAdapter);
766 s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther);
767 void GetThermalMeter(PADAPTER pAdapter, u8 *value);
769 void SetContinuousTx(PADAPTER pAdapter, u8 bStart);
770 void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart);
771 void SetSingleToneTx(PADAPTER pAdapter, u8 bStart);
772 void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart);
773 void PhySetTxPowerLevel(PADAPTER pAdapter);
775 void fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc);
776 void SetPacketTx(PADAPTER padapter);
777 void SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB);
779 void ResetPhyRxPktCount(PADAPTER pAdapter);
780 u32 GetPhyRxPktReceived(PADAPTER pAdapter);
781 u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter);
783 s32 SetPowerTracking(PADAPTER padapter, u8 enable);
784 void GetPowerTracking(PADAPTER padapter, u8 *enable);
786 u32 mp_query_psd(PADAPTER pAdapter, u8 *data);
789 void Hal_SetAntenna(PADAPTER pAdapter);
790 void Hal_SetBandwidth(PADAPTER pAdapter);
792 void Hal_SetTxPower(PADAPTER pAdapter);
793 void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart);
794 void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart);
795 void Hal_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart);
796 void Hal_SetContinuousTx(PADAPTER pAdapter, u8 bStart);
797 void Hal_SetBandwidth(PADAPTER pAdapter);
799 void Hal_SetDataRate(PADAPTER pAdapter);
800 void Hal_SetChannel(PADAPTER pAdapter);
801 void Hal_SetAntennaPathPower(PADAPTER pAdapter);
802 s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther);
803 s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable);
804 void Hal_GetPowerTracking(PADAPTER padapter, u8 *enable);
805 void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value);
806 void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter);
807 void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14);
808 void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven);
809 void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower);
810 void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower);
811 void Hal_TriggerRFThermalMeter(PADAPTER pAdapter);
812 u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter);
813 void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart);
814 void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart);
815 void Hal_ProSetCrystalCap(PADAPTER pAdapter , u32 CrystalCapVal);
816 //extern void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv);
817 void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter , BOOLEAN bMain);
818 ULONG mpt_ProQueryCalTxPower(PADAPTER pAdapter, u8 RfPath);
819 void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart);
820 u8 MptToMgntRate(u32 MptRateIdx);
821 u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr);
822 u32 mp_join(PADAPTER padapter, u8 mode);