hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
/* SPDX-License-Identifier: GPL-2.0 */
/******************************************************************************
 *
 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
 *
 ******************************************************************************/
#ifndef __RTL8188E_HAL_H__
#define __RTL8188E_HAL_H__
 
/* include HAL Related header after HAL Related compiling flags */
#include "rtl8188e_spec.h"
#include "hal8188e_phy_reg.h"
#include "hal8188e_phy_cfg.h"
#include "rtl8188e_dm.h"
#include "rtl8188e_recv.h"
#include "rtl8188e_xmit.h"
#include "rtl8188e_cmd.h"
#include "pwrseq.h"
#include "rtw_efuse.h"
#include "rtw_sreset.h"
#include "odm_precomp.h"
 
/*  Fw Array */
#define Rtl8188E_FwImageArray        Rtl8188EFwImgArray
#define Rtl8188E_FWImgArrayLength    Rtl8188EFWImgArrayLength
 
#define RTL8188E_FW_UMC_IMG            "rtl8188E\\rtl8188efw.bin"
#define RTL8188E_PHY_REG            "rtl8188E\\PHY_REG_1T.txt"
#define RTL8188E_PHY_RADIO_A            "rtl8188E\\radio_a_1T.txt"
#define RTL8188E_PHY_RADIO_B            "rtl8188E\\radio_b_1T.txt"
#define RTL8188E_AGC_TAB            "rtl8188E\\AGC_TAB_1T.txt"
#define RTL8188E_PHY_MACREG            "rtl8188E\\MAC_REG.txt"
#define RTL8188E_PHY_REG_PG            "rtl8188E\\PHY_REG_PG.txt"
#define RTL8188E_PHY_REG_MP            "rtl8188E\\PHY_REG_MP.txt"
 
/* RTL8188E Power Configuration CMDs for USB/SDIO interfaces */
#define Rtl8188E_NIC_PWR_ON_FLOW        rtl8188E_power_on_flow
#define Rtl8188E_NIC_RF_OFF_FLOW        rtl8188E_radio_off_flow
#define Rtl8188E_NIC_DISABLE_FLOW        rtl8188E_card_disable_flow
#define Rtl8188E_NIC_ENABLE_FLOW        rtl8188E_card_enable_flow
#define Rtl8188E_NIC_SUSPEND_FLOW        rtl8188E_suspend_flow
#define Rtl8188E_NIC_RESUME_FLOW        rtl8188E_resume_flow
#define Rtl8188E_NIC_PDN_FLOW            rtl8188E_hwpdn_flow
#define Rtl8188E_NIC_LPS_ENTER_FLOW        rtl8188E_enter_lps_flow
#define Rtl8188E_NIC_LPS_LEAVE_FLOW        rtl8188E_leave_lps_flow
 
#define DRVINFO_SZ    4 /*  unit is 8bytes */
#define PageNum_128(_Len)    (u32)(((_Len) >> 7) + ((_Len) & 0x7F ? 1 : 0))
 
/*  download firmware related data structure */
#define FW_8188E_SIZE            0x4000 /* 16384,16k */
#define FW_8188E_START_ADDRESS        0x1000
#define FW_8188E_END_ADDRESS        0x1FFF /* 0x5FFF */
 
#define MAX_PAGE_SIZE            4096    /*  @ page : 4k bytes */
 
#define IS_FW_HEADER_EXIST(_pFwHdr)                 \
   ((le16_to_cpu(_pFwHdr->signature) & 0xFFF0) == 0x92C0 || \
   (le16_to_cpu(_pFwHdr->signature) & 0xFFF0) == 0x88C0 ||  \
   (le16_to_cpu(_pFwHdr->signature) & 0xFFF0) == 0x2300 ||  \
   (le16_to_cpu(_pFwHdr->signature) & 0xFFF0) == 0x88E0)
 
#define DRIVER_EARLY_INT_TIME        0x05
#define BCN_DMA_ATIME_INT_TIME        0x02
 
enum usb_rx_agg_mode {
   USB_RX_AGG_DISABLE,
   USB_RX_AGG_DMA,
   USB_RX_AGG_USB,
   USB_RX_AGG_MIX
};
 
#define MAX_RX_DMA_BUFFER_SIZE_88E                \
      0x2400 /* 9k for 88E nornal chip , MaxRxBuff=10k-max(TxReportSize(64*8),
         * WOLPattern(16*24))
         */
 
#define MAX_TX_REPORT_BUFFER_SIZE        0x0400 /*  1k */
 
/*  BK, BE, VI, VO, HCCA, MANAGEMENT, COMMAND, HIGH, BEACON. */
#define MAX_TX_QUEUE            9
 
#define TX_SELE_HQ            BIT(0)        /*  High Queue */
#define TX_SELE_LQ            BIT(1)        /*  Low Queue */
#define TX_SELE_NQ            BIT(2)        /*  Normal Queue */
 
/*  Note: We will divide number of page equally for each queue other
 *  than public queue!
 */
/*  22k = 22528 bytes = 176 pages (@page =  128 bytes) */
/*  must reserved about 7 pages for LPS =>  176-7 = 169 (0xA9) */
/*  2*BCN / 1*ps-poll / 1*null-data /1*prob_rsp /1*QOS null-data /1*BT QOS
 *  null-data
 */
 
#define TX_TOTAL_PAGE_NUMBER_88E        0xA9/*   169 (21632=> 21k) */
 
#define TX_PAGE_BOUNDARY_88E (TX_TOTAL_PAGE_NUMBER_88E + 1)
 
/* Note: For Normal Chip Setting ,modify later */
#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER            \
   TX_TOTAL_PAGE_NUMBER_88E  /* 0xA9 , 0xb0=>176=>22k */
#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E            \
   (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER + 1) /* 0xA9 */
 
/* Chip specific */
#define CHIP_BONDING_IDENTIFIER(_value)    (((_value) >> 22) & 0x3)
#define CHIP_BONDING_92C_1T2R    0x1
#define CHIP_BONDING_88C_USB_MCARD    0x2
#define CHIP_BONDING_88C_USB_HP    0x1
#include "HalVerDef.h"
#include "hal_com.h"
 
/* Channel Plan */
enum ChannelPlan {
   CHPL_FCC    = 0,
   CHPL_IC        = 1,
   CHPL_ETSI    = 2,
   CHPL_SPA    = 3,
   CHPL_FRANCE    = 4,
   CHPL_MKK    = 5,
   CHPL_MKK1    = 6,
   CHPL_ISRAEL    = 7,
   CHPL_TELEC    = 8,
   CHPL_GLOBAL    = 9,
   CHPL_WORLD    = 10,
};
 
struct txpowerinfo24g {
   u8 IndexCCK_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G];
   u8 IndexBW40_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G];
   /* If only one tx, only BW20 and OFDM are used. */
   s8 CCK_Diff[MAX_RF_PATH][MAX_TX_COUNT];
   s8 OFDM_Diff[MAX_RF_PATH][MAX_TX_COUNT];
   s8 BW20_Diff[MAX_RF_PATH][MAX_TX_COUNT];
   s8 BW40_Diff[MAX_RF_PATH][MAX_TX_COUNT];
};
 
#define EFUSE_REAL_CONTENT_LEN        512
#define EFUSE_MAX_SECTION        16
#define EFUSE_IC_ID_OFFSET        506 /* For some inferior IC purpose*/
#define AVAILABLE_EFUSE_ADDR(addr)    (addr < EFUSE_REAL_CONTENT_LEN)
/*  To prevent out of boundary programming case, */
/*  leave 1byte and program full section */
/*  9bytes + 1byt + 5bytes and pre 1byte. */
/*  For worst case: */
/*  | 1byte|----8bytes----|1byte|--5bytes--| */
/*  |         |            Reserved(14bytes)          | */
 
/*  PG data exclude header, dummy 6 bytes from CP test and reserved 1byte. */
#define EFUSE_OOB_PROTECT_BYTES            15
 
#define        HWSET_MAX_SIZE_88E        512
 
#define        EFUSE_REAL_CONTENT_LEN_88E    256
#define        EFUSE_MAP_LEN_88E        512
#define EFUSE_MAP_LEN            EFUSE_MAP_LEN_88E
#define        EFUSE_MAX_SECTION_88E        64
#define        EFUSE_MAX_WORD_UNIT_88E        4
#define        EFUSE_IC_ID_OFFSET_88E        506
#define        AVAILABLE_EFUSE_ADDR_88E(addr)            \
   (addr < EFUSE_REAL_CONTENT_LEN_88E)
/*  To prevent out of boundary programming case, leave 1byte and program
 *  full section
 */
/*  9bytes + 1byt + 5bytes and pre 1byte. */
/*  For worst case: */
/*  | 2byte|----8bytes----|1byte|--7bytes--| 92D */
/*  PG data exclude header, dummy 7 bytes from CP test and reserved 1byte. */
#define        EFUSE_OOB_PROTECT_BYTES_88E    18
#define        EFUSE_PROTECT_BYTES_BANK_88E    16
 
/* EFUSE for BT definition */
#define EFUSE_BT_REAL_CONTENT_LEN    1536    /*  512*3 */
#define EFUSE_BT_MAP_LEN        1024    /*  1k bytes */
#define EFUSE_BT_MAX_SECTION        128    /*  1024/8 */
 
#define EFUSE_PROTECT_BYTES_BANK    16
 
struct hal_data_8188e {
   struct HAL_VERSION    VersionID;
   u16    CustomerID;
   u16    FirmwareVersion;
   u16    FirmwareVersionRev;
   u16    FirmwareSubVersion;
   u16    FirmwareSignature;
   u8    PGMaxGroup;
   /* current WIFI_PHY values */
   u32    ReceiveConfig;
   enum wireless_mode CurrentWirelessMode;
   enum ht_channel_width CurrentChannelBW;
   u8    CurrentChannel;
   u8    nCur40MhzPrimeSC;/*  Control channel sub-carrier */
 
   u16    BasicRateSet;
 
   u8    BoardType;
 
   /*  EEPROM setting. */
   u16    EEPROMVID;
   u16    EEPROMPID;
   u16    EEPROMSVID;
   u16    EEPROMSDID;
   u8    EEPROMCustomerID;
   u8    EEPROMSubCustomerID;
   u8    EEPROMVersion;
   u8    EEPROMRegulatory;
 
   u8    bTXPowerDataReadFromEEPORM;
   u8    EEPROMThermalMeter;
   u8    bAPKThermalMeterIgnore;
 
   bool    EepromOrEfuse;
   /* 92C:256bytes, 88E:512bytes, we use union set (512bytes) */
   u8    EfuseMap[2][HWSET_MAX_SIZE_512];
   u8    EfuseUsedPercentage;
   struct efuse_hal    EfuseHal;
 
   u8    Index24G_CCK_Base[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
   u8    Index24G_BW40_Base[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
   /* If only one tx, only BW20 and OFDM are used. */
   s8    CCK_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT];
   s8    OFDM_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT];
   s8    BW20_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT];
   s8    BW40_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT];
 
   u8    TxPwrLevelCck[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
   /*  For HT 40MHZ pwr */
   u8    TxPwrLevelHT40_1S[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
   /*  For HT 40MHZ pwr */
   u8    TxPwrLevelHT40_2S[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
   /*  HT 20<->40 Pwr diff */
   u8    TxPwrHt20Diff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
   /*  For HT<->legacy pwr diff */
   u8    TxPwrLegacyHtDiff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
   /*  For power group */
   u8    PwrGroupHT20[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
   u8    PwrGroupHT40[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
 
   u8    LegacyHTTxPowerDiff;/*  Legacy to HT rate power diff */
   /*  The current Tx Power Level */
   u8    CurrentCckTxPwrIdx;
   u8    CurrentOfdm24GTxPwrIdx;
   u8    CurrentBW2024GTxPwrIdx;
   u8    CurrentBW4024GTxPwrIdx;
 
   /*  Read/write are allow for following hardware information variables */
   u8    framesync;
   u32    framesyncC34;
   u8    framesyncMonitor;
   u8    DefaultInitialGain[4];
   u8    pwrGroupCnt;
   u32    MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16];
   u32    CCKTxPowerLevelOriginalOffset;
 
   u8    CrystalCap;
 
   u32    AcParam_BE; /* Original parameter for BE, use for EDCA turbo. */
 
   struct bb_reg_def PHYRegDef[4];    /* Radio A/B/C/D */
 
   u32    RfRegChnlVal[2];
 
   /* RDG enable */
   bool     bRDGEnable;
 
   /* for host message to fw */
   u8    LastHMEBoxNum;
 
   u8    RegTxPause;
   /*  Beacon function related global variable. */
   u32    RegBcnCtrlVal;
   u8    RegFwHwTxQCtrl;
   u8    RegReg542;
   u8    RegCR_1;
 
   struct dm_priv    dmpriv;
   struct odm_dm_struct odmpriv;
   struct sreset_priv srestpriv;
 
   u8    CurAntenna;
   u8    AntDivCfg;
   u8    TRxAntDivType;
 
   u8    bDumpRxPkt;/* for debug */
   u8    bDumpTxPkt;/* for debug */
   u8    FwRsvdPageStartOffset; /* Reserve page start offset except
                   *  beacon in TxQ.
                   */
 
   /*  2010/08/09 MH Add CU power down mode. */
   bool        pwrdown;
 
   /*  Add for dual MAC  0--Mac0 1--Mac1 */
   u32    interfaceIndex;
 
   u8    OutEpQueueSel;
   u8    OutEpNumber;
 
   u16    EfuseUsedBytes;
 
   /*  Auto FSM to Turn On, include clock, isolation, power control
    *  for MAC only
    */
   u8    bMacPwrCtrlOn;
 
   u32    UsbBulkOutSize;
 
   /*  Interrupt relatd register information. */
   u32    IntArray[3];/* HISR0,HISR1,HSISR */
   u32    IntrMask[3];
   u8    C2hArray[16];
   u8    UsbTxAggMode;
   u8    UsbTxAggDescNum;
   u16    HwRxPageSize;        /*  Hardware setting */
   u32    MaxUsbRxAggBlock;
 
   enum usb_rx_agg_mode UsbRxAggMode;
   u8    UsbRxAggBlockCount;    /*  USB Block count. Block size is
                    * 512-byte in high speed and 64-byte
                    * in full speed
                    */
   u8    UsbRxAggBlockTimeout;
   u8    UsbRxAggPageCount;    /*  8192C DMA page count */
   u8    UsbRxAggPageTimeout;
};
 
void Hal_GetChnlGroup88E(u8 chnl, u8 *group);
 
/*  rtl8188e_hal_init.c */
void _8051Reset88E(struct adapter *padapter);
void rtl8188e_InitializeFirmwareVars(struct adapter *padapter);
 
s32 InitLLTTable(struct adapter *padapter, u8 txpktbuf_bndy);
 
/*  EFuse */
void Hal_InitPGData88E(struct adapter *padapter);
void Hal_EfuseParseIDCode88E(struct adapter *padapter, u8 *hwinfo);
void Hal_ReadTxPowerInfo88E(struct adapter *padapter, u8 *hwinfo,
               bool AutoLoadFail);
 
void Hal_EfuseParseEEPROMVer88E(struct adapter *padapter, u8 *hwinfo,
               bool AutoLoadFail);
void rtl8188e_EfuseParseChnlPlan(struct adapter *padapter, u8 *hwinfo,
                bool AutoLoadFail);
void Hal_EfuseParseCustomerID88E(struct adapter *padapter, u8 *hwinfo,
                bool AutoLoadFail);
void Hal_ReadAntennaDiversity88E(struct adapter *pAdapter, u8 *PROMContent,
                bool AutoLoadFail);
void Hal_ReadThermalMeter_88E(struct adapter *dapter, u8 *PROMContent,
                 bool AutoloadFail);
void Hal_EfuseParseXtal_8188E(struct adapter *pAdapter, u8 *hwinfo,
                 bool AutoLoadFail);
void Hal_EfuseParseBoardType88E(struct adapter *pAdapter, u8 *hwinfo,
               bool AutoLoadFail);
void Hal_ReadPowerSavingMode88E(struct adapter *pAdapter, u8 *hwinfo,
               bool AutoLoadFail);
 
/*  register */
 
void rtl8188e_start_thread(struct adapter *padapter);
void rtl8188e_stop_thread(struct adapter *padapter);
 
s32 iol_execute(struct adapter *padapter, u8 control);
void iol_mode_enable(struct adapter *padapter, u8 enable);
s32 rtl8188e_iol_efuse_patch(struct adapter *padapter);
void rtw_cancel_all_timer(struct adapter *padapter);
 
#endif /* __RTL8188E_HAL_H__ */