OSDN Git Service

5ada574482ecb7a2773474549f632e2520043b29
[android-x86/kernel.git] / drivers / staging / rtl8723bs / include / rtw_mp.h
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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  * 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
17  *
18  *
19  ******************************************************************************/
20 #ifndef _RTW_MP_H_
21 #define _RTW_MP_H_
22
23 #define MAX_MP_XMITBUF_SZ       2048
24 #define NR_MP_XMITFRAME         8
25
26 struct mp_xmit_frame
27 {
28         _list   list;
29
30         struct pkt_attrib attrib;
31
32         _pkt *pkt;
33
34         int frame_tag;
35
36         _adapter *padapter;
37
38         uint mem[(MAX_MP_XMITBUF_SZ >> 2)];
39 };
40
41 struct mp_wiparam
42 {
43         u32 bcompleted;
44         u32 act_type;
45         u32 io_offset;
46         u32 io_value;
47 };
48
49 typedef void(*wi_act_func)(void* padapter);
50
51 struct mp_tx
52 {
53         u8 stop;
54         u32 count, sended;
55         u8 payload;
56         struct pkt_attrib attrib;
57         //struct tx_desc desc;
58         //u8 resvdtx[7];
59         u8 desc[TXDESC_SIZE];
60         u8 *pallocated_buf;
61         u8 *buf;
62         u32 buf_size, write_size;
63         void * PktTxThread;
64 };
65
66 #define MP_MAX_LINES            1000
67 #define MP_MAX_LINES_BYTES      256
68 #define u1Byte u8
69 #define s8 s8
70 #define u4Byte u32
71 #define s4Byte s32
72 #define u1Byte          u8
73 #define pu1Byte                 u8*
74
75 #define u2Byte          u16
76 #define pu2Byte                 u16*
77
78 #define u4Byte          u32
79 #define pu4Byte                 u32*
80
81 #define u8Byte          u64
82 #define pu8Byte                 u64*
83
84 #define s4Byte          s32
85 #define ps4Byte                 s32*
86
87 #define s8Byte          s64
88 #define ps8Byte                 s64*
89
90 typedef void (*MPT_WORK_ITEM_HANDLER)(IN void * Adapter);
91 typedef struct _MPT_CONTEXT
92 {
93         // Indicate if we have started Mass Production Test.
94         bool                    bMassProdTest;
95
96         // Indicate if the driver is unloading or unloaded.
97         bool                    bMptDrvUnload;
98
99         _sema                   MPh2c_Sema;
100         _timer                  MPh2c_timeout_timer;
101 // Event used to sync H2c for BT control
102
103         bool            MptH2cRspEvent;
104         bool            MptBtC2hEvent;
105         bool            bMPh2c_timeout;
106
107         /* 8190 PCI does not support NDIS_WORK_ITEM. */
108         // Work Item for Mass Production Test.
109         //NDIS_WORK_ITEM        MptWorkItem;
110 //      RT_WORK_ITEM            MptWorkItem;
111         // Event used to sync the case unloading driver and MptWorkItem is still in progress.
112 //      NDIS_EVENT              MptWorkItemEvent;
113         // To protect the following variables.
114 //      NDIS_SPIN_LOCK          MptWorkItemSpinLock;
115         // Indicate a MptWorkItem is scheduled and not yet finished.
116         bool                    bMptWorkItemInProgress;
117         // An instance which implements function and context of MptWorkItem.
118         MPT_WORK_ITEM_HANDLER   CurrMptAct;
119
120         // 1=Start, 0=Stop from UI.
121         u32                     MptTestStart;
122         // _TEST_MODE, defined in MPT_Req2.h
123         u32                     MptTestItem;
124         // Variable needed in each implementation of CurrMptAct.
125         u32                     MptActType;     // Type of action performed in CurrMptAct.
126         // The Offset of IO operation is depend of MptActType.
127         u32                     MptIoOffset;
128         // The Value of IO operation is depend of MptActType.
129         u32                     MptIoValue;
130         // The RfPath of IO operation is depend of MptActType.
131         u32                     MptRfPath;
132
133         WIRELESS_MODE           MptWirelessModeToSw;    // Wireless mode to switch.
134         u8                      MptChannelToSw;         // Channel to switch.
135         u8                      MptInitGainToSet;       // Initial gain to set.
136         //u32                   bMptAntennaA;           // true if we want to use antenna A.
137         u32                     MptBandWidth;           // bandwidth to switch.
138         u32                     MptRateIndex;           // rate index.
139         // Register value kept for Single Carrier Tx test.
140         u8                      btMpCckTxPower;
141         // Register value kept for Single Carrier Tx test.
142         u8                      btMpOfdmTxPower;
143         // For MP Tx Power index
144         u8                      TxPwrLevel[2];  // rf-A, rf-B
145         u32                     RegTxPwrLimit;
146         // Content of RCR Regsiter for Mass Production Test.
147         u32                     MptRCR;
148         // true if we only receive packets with specific pattern.
149         bool                    bMptFilterPattern;
150         // Rx OK count, statistics used in Mass Production Test.
151         u32                     MptRxOkCnt;
152         // Rx CRC32 error count, statistics used in Mass Production Test.
153         u32                     MptRxCrcErrCnt;
154
155         bool                    bCckContTx;     // true if we are in CCK Continuous Tx test.
156         bool                    bOfdmContTx;    // true if we are in OFDM Continuous Tx test.
157         bool                    bStartContTx;   // true if we have start Continuous Tx test.
158         // true if we are in Single Carrier Tx test.
159         bool                    bSingleCarrier;
160         // true if we are in Carrier Suppression Tx Test.
161         bool                    bCarrierSuppression;
162         //true if we are in Single Tone Tx test.
163         bool                    bSingleTone;
164
165         // ACK counter asked by K.Y..
166         bool                    bMptEnableAckCounter;
167         u32                     MptAckCounter;
168
169         // SD3 Willis For 8192S to save 1T/2T RF table for ACUT Only fro ACUT delete later ~~~!
170         //s8            BufOfLines[2][MAX_LINES_HWCONFIG_TXT][MAX_BYTES_LINE_HWCONFIG_TXT];
171         //s8                    BufOfLines[2][MP_MAX_LINES][MP_MAX_LINES_BYTES];
172         //s4Byte                        RfReadLine[2];
173
174         u8              APK_bound[2];   //for APK       path A/path B
175         bool            bMptIndexEven;
176
177         u8              backup0xc50;
178         u8              backup0xc58;
179         u8              backup0xc30;
180         u8              backup0x52_RF_A;
181         u8              backup0x52_RF_B;
182
183         u4Byte                  backup0x58_RF_A;
184         u4Byte                  backup0x58_RF_B;
185
186         u1Byte                  h2cReqNum;
187         u1Byte                  c2hBuf[32];
188
189     u1Byte          btInBuf[100];
190         u32                     mptOutLen;
191     u1Byte          mptOutBuf[100];
192
193 }MPT_CONTEXT, *PMPT_CONTEXT;
194 //#endif
195
196 /* E-Fuse */
197 #define EFUSE_MAP_SIZE          512
198
199 #define EFUSE_MAX_SIZE          512
200 /* end of E-Fuse */
201
202 //#define RTPRIV_IOCTL_MP                                       ( SIOCIWFIRSTPRIV + 0x17)
203 enum {
204         WRITE_REG = 1,
205         READ_REG,
206         WRITE_RF,
207         READ_RF,
208         MP_START,
209         MP_STOP,
210         MP_RATE,
211         MP_CHANNEL,
212         MP_BANDWIDTH,
213         MP_TXPOWER,
214         MP_ANT_TX,
215         MP_ANT_RX,
216         MP_CTX,
217         MP_QUERY,
218         MP_ARX,
219         MP_PSD,
220         MP_PWRTRK,
221         MP_THER,
222         MP_IOCTL,
223         EFUSE_GET,
224         EFUSE_SET,
225         MP_RESET_STATS,
226         MP_DUMP,
227         MP_PHYPARA,
228         MP_SetRFPathSwh,
229         MP_QueryDrvStats,
230         MP_SetBT,
231         CTA_TEST,
232         MP_DISABLE_BT_COEXIST,
233         MP_PwrCtlDM,
234 #ifdef CONFIG_WOWLAN
235         MP_WOW_ENABLE,
236 #endif
237 #ifdef CONFIG_AP_WOWLAN
238         MP_AP_WOW_ENABLE,
239 #endif
240         MP_NULL,
241         MP_GET_TXPOWER_INX,
242 };
243
244 struct mp_priv
245 {
246         _adapter *papdater;
247
248         //Testing Flag
249         u32 mode;//0 for normal type packet, 1 for loopback packet (16bytes TXCMD)
250
251         u32 prev_fw_state;
252
253         //OID cmd handler
254         struct mp_wiparam workparam;
255 //      u8 act_in_progress;
256
257         //Tx Section
258         u8 TID;
259         u32 tx_pktcount;
260         u32 pktInterval;
261         struct mp_tx tx;
262
263         //Rx Section
264         u32 rx_bssidpktcount;
265         u32 rx_pktcount;
266         u32 rx_pktcount_filter_out;
267         u32 rx_crcerrpktcount;
268         u32 rx_pktloss;
269         bool  rx_bindicatePkt;
270         struct recv_stat rxstat;
271
272         //RF/BB relative
273         u8 channel;
274         u8 bandwidth;
275         u8 prime_channel_offset;
276         u8 txpoweridx;
277         u8 txpoweridx_b;
278         u8 rateidx;
279         u32 preamble;
280 //      u8 modem;
281         u32 CrystalCap;
282 //      u32 curr_crystalcap;
283
284         u16 antenna_tx;
285         u16 antenna_rx;
286 //      u8 curr_rfpath;
287
288         u8 check_mp_pkt;
289
290         u8 bSetTxPower;
291 //      uint ForcedDataRate;
292         u8 mp_dm;
293         u8 mac_filter[ETH_ALEN];
294         u8 bmac_filter;
295
296         struct wlan_network mp_network;
297         NDIS_802_11_MAC_ADDRESS network_macaddr;
298
299         u8 *pallocated_mp_xmitframe_buf;
300         u8 *pmp_xmtframe_buf;
301         _queue free_mp_xmitqueue;
302         u32 free_mp_xmitframe_cnt;
303         bool bSetRxBssid;
304         bool bTxBufCkFail;
305
306         MPT_CONTEXT MptCtx;
307
308         u8              *TXradomBuffer;
309 };
310
311 typedef struct _IOCMD_STRUCT_ {
312         u8      cmdclass;
313         u16     value;
314         u8      index;
315 }IOCMD_STRUCT;
316
317 struct rf_reg_param {
318         u32 path;
319         u32 offset;
320         u32 value;
321 };
322
323 struct bb_reg_param {
324         u32 offset;
325         u32 value;
326 };
327
328 typedef struct _MP_FIRMWARE {
329         FIRMWARE_SOURCE eFWSource;
330         u8*             szFwBuffer;
331         u32             ulFwLength;
332
333         u8*             szBTFwBuffer;
334         u8              myBTFwBuffer[0x8000];
335         u32             ulBTFwLength;
336 } RT_MP_FIRMWARE, *PRT_MP_FIRMWARE;
337
338
339
340
341 //=======================================================================
342
343 #define LOWER   true
344 #define RAISE   false
345
346 /* Hardware Registers */
347 #define BB_REG_BASE_ADDR                0x800
348
349 /* MP variables */
350 typedef enum _MP_MODE_ {
351         MP_OFF,
352         MP_ON,
353         MP_ERR,
354         MP_CONTINUOUS_TX,
355         MP_SINGLE_CARRIER_TX,
356         MP_CARRIER_SUPPRISSION_TX,
357         MP_SINGLE_TONE_TX,
358         MP_PACKET_TX,
359         MP_PACKET_RX
360 } MP_MODE;
361
362
363 #define MAX_RF_PATH_NUMS        RF_PATH_MAX
364
365
366 extern u8 mpdatarate[NumRates];
367
368 /* MP set force data rate base on the definition. */
369 typedef enum _MPT_RATE_INDEX
370 {
371         /* CCK rate. */
372         MPT_RATE_1M =0 ,        /* 0 */
373         MPT_RATE_2M,
374         MPT_RATE_55M,
375         MPT_RATE_11M,   /* 3 */
376
377         /* OFDM rate. */
378         MPT_RATE_6M,    /* 4 */
379         MPT_RATE_9M,
380         MPT_RATE_12M,
381         MPT_RATE_18M,
382         MPT_RATE_24M,
383         MPT_RATE_36M,
384         MPT_RATE_48M,
385         MPT_RATE_54M,   /* 11 */
386
387         /* HT rate. */
388         MPT_RATE_MCS0,  /* 12 */
389         MPT_RATE_MCS1,
390         MPT_RATE_MCS2,
391         MPT_RATE_MCS3,
392         MPT_RATE_MCS4,
393         MPT_RATE_MCS5,
394         MPT_RATE_MCS6,
395         MPT_RATE_MCS7,  /* 19 */
396         MPT_RATE_MCS8,
397         MPT_RATE_MCS9,
398         MPT_RATE_MCS10,
399         MPT_RATE_MCS11,
400         MPT_RATE_MCS12,
401         MPT_RATE_MCS13,
402         MPT_RATE_MCS14,
403         MPT_RATE_MCS15, /* 27 */
404         /* VHT rate. Total: 20*/
405         MPT_RATE_VHT1SS_MCS0 = 100,// To reserve MCS16~MCS31, the index starts from #100.
406         MPT_RATE_VHT1SS_MCS1, // #101
407         MPT_RATE_VHT1SS_MCS2,
408         MPT_RATE_VHT1SS_MCS3,
409         MPT_RATE_VHT1SS_MCS4,
410         MPT_RATE_VHT1SS_MCS5,
411         MPT_RATE_VHT1SS_MCS6, // #106
412         MPT_RATE_VHT1SS_MCS7,
413         MPT_RATE_VHT1SS_MCS8,
414         MPT_RATE_VHT1SS_MCS9,
415         MPT_RATE_VHT2SS_MCS0,
416         MPT_RATE_VHT2SS_MCS1, // #111
417         MPT_RATE_VHT2SS_MCS2,
418         MPT_RATE_VHT2SS_MCS3,
419         MPT_RATE_VHT2SS_MCS4,
420         MPT_RATE_VHT2SS_MCS5,
421         MPT_RATE_VHT2SS_MCS6, // #116
422         MPT_RATE_VHT2SS_MCS7,
423         MPT_RATE_VHT2SS_MCS8,
424         MPT_RATE_VHT2SS_MCS9,
425         MPT_RATE_LAST
426 }MPT_RATE_E, *PMPT_RATE_E;
427
428 #define MAX_TX_PWR_INDEX_N_MODE 64      // 0x3F
429
430 typedef enum _POWER_MODE_ {
431         POWER_LOW = 0,
432         POWER_NORMAL
433 }POWER_MODE;
434
435 // The following enumeration is used to define the value of Reg0xD00[30:28] or JaguarReg0x914[18:16].
436 typedef enum _OFDM_TX_MODE {
437         OFDM_ALL_OFF            = 0,
438         OFDM_ContinuousTx       = 1,
439         OFDM_SingleCarrier      = 2,
440         OFDM_SingleTone         = 4,
441 } OFDM_TX_MODE;
442
443
444 #define RX_PKT_BROADCAST        1
445 #define RX_PKT_DEST_ADDR        2
446 #define RX_PKT_PHY_MATCH        3
447
448 #define Mac_OFDM_OK                     0x00000000
449 #define Mac_OFDM_Fail                   0x10000000
450 #define Mac_OFDM_FasleAlarm     0x20000000
451 #define Mac_CCK_OK                              0x30000000
452 #define Mac_CCK_Fail                    0x40000000
453 #define Mac_CCK_FasleAlarm              0x50000000
454 #define Mac_HT_OK                               0x60000000
455 #define Mac_HT_Fail                     0x70000000
456 #define Mac_HT_FasleAlarm               0x90000000
457 #define Mac_DropPacket                  0xA0000000
458
459 typedef enum _ENCRY_CTRL_STATE_ {
460         HW_CONTROL,             //hw encryption& decryption
461         SW_CONTROL,             //sw encryption& decryption
462         HW_ENCRY_SW_DECRY,      //hw encryption & sw decryption
463         SW_ENCRY_HW_DECRY       //sw encryption & hw decryption
464 }ENCRY_CTRL_STATE;
465
466 typedef enum    _MPT_TXPWR_DEF{
467         MPT_CCK,
468         MPT_OFDM, // L and HT OFDM
469         MPT_VHT_OFDM
470 }MPT_TXPWR_DEF;
471
472 #define         REG_RF_BB_GAIN_OFFSET   0x7f
473 #define         RF_GAIN_OFFSET_MASK     0xfffff
474
475 //=======================================================================
476 //extern struct mp_xmit_frame *alloc_mp_xmitframe(struct mp_priv *pmp_priv);
477 //extern int free_mp_xmitframe(struct xmit_priv *pxmitpriv, struct mp_xmit_frame *pmp_xmitframe);
478
479 extern s32 init_mp_priv(PADAPTER padapter);
480 extern void free_mp_priv(struct mp_priv *pmp_priv);
481 extern s32 MPT_InitializeAdapter(PADAPTER padapter, u8 Channel);
482 extern void MPT_DeInitAdapter(PADAPTER padapter);
483 extern s32 mp_start_test(PADAPTER padapter);
484 extern void mp_stop_test(PADAPTER padapter);
485
486 //=======================================================================
487 //extern void   IQCalibrateBcut(PADAPTER pAdapter);
488
489 //extern u32    bb_reg_read(PADAPTER Adapter, u16 offset);
490 //extern u8     bb_reg_write(PADAPTER Adapter, u16 offset, u32 value);
491 //extern u32    rf_reg_read(PADAPTER Adapter, u8 path, u8 offset);
492 //extern u8     rf_reg_write(PADAPTER Adapter, u8 path, u8 offset, u32 value);
493
494 //extern u32    get_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask);
495 //extern u8     set_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask, u32 value);
496 //extern u32    get_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask);
497 //extern u8     set_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask, u32 value);
498
499 extern u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask);
500 extern void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val);
501
502 extern u32 read_macreg(_adapter *padapter, u32 addr, u32 sz);
503 extern void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz);
504 extern u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask);
505 extern void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val);
506 extern u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr);
507 extern void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val);
508
509 extern void     SetChannel(PADAPTER pAdapter);
510 extern void     SetBandwidth(PADAPTER pAdapter);
511 extern int SetTxPower(PADAPTER pAdapter);
512 extern void     SetAntennaPathPower(PADAPTER pAdapter);
513 //extern void   SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset);
514 extern void     SetDataRate(PADAPTER pAdapter);
515
516 extern void     SetAntenna(PADAPTER pAdapter);
517
518 //extern void   SetCrystalCap(PADAPTER pAdapter);
519
520 extern s32      SetThermalMeter(PADAPTER pAdapter, u8 target_ther);
521 extern void     GetThermalMeter(PADAPTER pAdapter, u8 *value);
522
523 extern void     SetContinuousTx(PADAPTER pAdapter, u8 bStart);
524 extern void     SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart);
525 extern void     SetSingleToneTx(PADAPTER pAdapter, u8 bStart);
526 extern void     SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart);
527 extern void PhySetTxPowerLevel(PADAPTER pAdapter);
528
529 extern void     fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc);
530 extern void     SetPacketTx(PADAPTER padapter);
531 extern void     SetPacketRx(PADAPTER pAdapter, u8 bStartRx);
532
533 extern void     ResetPhyRxPktCount(PADAPTER pAdapter);
534 extern u32      GetPhyRxPktReceived(PADAPTER pAdapter);
535 extern u32      GetPhyRxPktCRC32Error(PADAPTER pAdapter);
536
537 extern s32      SetPowerTracking(PADAPTER padapter, u8 enable);
538 extern void     GetPowerTracking(PADAPTER padapter, u8 *enable);
539
540 extern u32      mp_query_psd(PADAPTER pAdapter, u8 *data);
541
542
543 extern void Hal_SetAntenna(PADAPTER pAdapter);
544 extern void Hal_SetBandwidth(PADAPTER pAdapter);
545
546 extern void Hal_SetTxPower(PADAPTER pAdapter);
547 extern void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart);
548 extern void Hal_SetSingleToneTx ( PADAPTER pAdapter , u8 bStart );
549 extern void Hal_SetSingleCarrierTx (PADAPTER pAdapter, u8 bStart);
550 extern void Hal_SetContinuousTx (PADAPTER pAdapter, u8 bStart);
551 extern void Hal_SetBandwidth(PADAPTER pAdapter);
552
553 extern void Hal_SetDataRate(PADAPTER pAdapter);
554 extern void Hal_SetChannel(PADAPTER pAdapter);
555 extern void Hal_SetAntennaPathPower(PADAPTER pAdapter);
556 extern s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther);
557 extern s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable);
558 extern void Hal_GetPowerTracking(PADAPTER padapter, u8 * enable);
559 extern void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value);
560 extern void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter);
561 extern void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, bool bInCH14);
562 extern void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, bool beven);
563 extern void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 * TxPower);
564 extern void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 * TxPower);
565 extern void Hal_TriggerRFThermalMeter(PADAPTER pAdapter);
566 extern u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter);
567 extern void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart);
568 extern void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart);
569 extern void Hal_ProSetCrystalCap (PADAPTER pAdapter , u32 CrystalCapVal);
570 //extern void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv);
571 extern void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter ,bool bMain);
572 extern u32 mpt_ProQueryCalTxPower(PADAPTER      pAdapter,u8 RfPath);
573 extern void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart);
574 extern u8 MptToMgntRate(u32     MptRateIdx);
575
576 #endif //_RTW_MP_H_