Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_mp.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2007 - 2017 Realtek Corporation.
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of version 2 of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
*****************************************************************************/
15
#define _RTW_MP_C_
16
#include <drv_types.h>
17
#ifdef PLATFORM_FREEBSD
18
#include <sys/unistd.h> /* for RFHIGHPID */
19
#endif
20
21
#include "../hal/phydm/phydm_precomp.h"
22
#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A)
23
#include <rtw_bt_mp.h>
24
#endif
25
26
#ifdef CONFIG_MP_VHT_HW_TX_MODE
27
#define CEILING_POS(X) ((X - (int)(X)) > 0 ? (int)(X + 1) : (int)(X))
28
#define CEILING_NEG(X) ((X - (int)(X)) < 0 ? (int)(X - 1) : (int)(X))
29
#define ceil(X) (((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X))
30
31
int rtfloor(float x)
32
{
33
int i = x - 2;
34
while
35
(++i <= x - 1)
36
;
37
return i;
38
}
39
#endif
40
41
#ifdef CONFIG_MP_INCLUDED
42
u32 read_macreg(_adapter *padapter, u32 addr, u32 sz)
43
{
44
u32 val = 0;
45
46
switch (sz) {
47
case 1:
48
val = rtw_read8(padapter, addr);
49
break;
50
case 2:
51
val = rtw_read16(padapter, addr);
52
break;
53
case 4:
54
val = rtw_read32(padapter, addr);
55
break;
56
default:
57
val = 0xffffffff;
58
break;
59
}
60
61
return val;
62
63
}
64
65
void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz)
66
{
67
switch (sz) {
68
case 1:
69
rtw_write8(padapter, addr, (u8)val);
70
break;
71
case 2:
72
rtw_write16(padapter, addr, (u16)val);
73
break;
74
case 4:
75
rtw_write32(padapter, addr, val);
76
break;
77
default:
78
break;
79
}
80
81
}
82
83
u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask)
84
{
85
return rtw_hal_read_bbreg(padapter, addr, bitmask);
86
}
87
88
void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val)
89
{
90
rtw_hal_write_bbreg(padapter, addr, bitmask, val);
91
}
92
93
u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask)
94
{
95
return rtw_hal_read_rfreg(padapter, rfpath, addr, bitmask);
96
}
97
98
void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val)
99
{
100
rtw_hal_write_rfreg(padapter, rfpath, addr, bitmask, val);
101
}
102
103
u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr)
104
{
105
return _read_rfreg(padapter, rfpath, addr, bRFRegOffsetMask);
106
}
107
108
void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val)
109
{
110
_write_rfreg(padapter, rfpath, addr, bRFRegOffsetMask, val);
111
}
112
113
static void _init_mp_priv_(struct mp_priv *pmp_priv)
114
{
115
WLAN_BSSID_EX *pnetwork;
116
117
_rtw_memset(pmp_priv, 0, sizeof(struct mp_priv));
118
119
pmp_priv->mode = MP_OFF;
120
121
pmp_priv->channel = 1;
122
pmp_priv->bandwidth = CHANNEL_WIDTH_20;
123
pmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
124
pmp_priv->rateidx = RATE_1M;
125
pmp_priv->txpoweridx = 0x2A;
126
127
pmp_priv->antenna_tx = ANTENNA_A;
128
pmp_priv->antenna_rx = ANTENNA_AB;
129
130
pmp_priv->check_mp_pkt = 0;
131
132
pmp_priv->tx_pktcount = 0;
133
134
pmp_priv->rx_bssidpktcount = 0;
135
pmp_priv->rx_pktcount = 0;
136
pmp_priv->rx_crcerrpktcount = 0;
137
138
pmp_priv->network_macaddr[0] = 0x00;
139
pmp_priv->network_macaddr[1] = 0xE0;
140
pmp_priv->network_macaddr[2] = 0x4C;
141
pmp_priv->network_macaddr[3] = 0x87;
142
pmp_priv->network_macaddr[4] = 0x66;
143
pmp_priv->network_macaddr[5] = 0x55;
144
145
pmp_priv->bSetRxBssid = _FALSE;
146
pmp_priv->bRTWSmbCfg = _FALSE;
147
pmp_priv->bloopback = _FALSE;
148
149
pmp_priv->bloadefusemap = _FALSE;
150
pmp_priv->brx_filter_beacon = _FALSE;
151
pmp_priv->mplink_brx = _FALSE;
152
153
pnetwork = &pmp_priv->mp_network.network;
154
_rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN);
155
156
pnetwork->Ssid.SsidLength = 8;
157
_rtw_memcpy(pnetwork->Ssid.Ssid, "mp_871x", pnetwork->Ssid.SsidLength);
158
159
pmp_priv->tx.payload = MP_TX_Payload_default_random;
160
#ifdef CONFIG_80211N_HT
161
pmp_priv->tx.attrib.ht_en = 1;
162
#endif
163
164
pmp_priv->mpt_ctx.mpt_rate_index = 1;
165
166
}
167
168
169
static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter)
170
{
171
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
172
173
struct pkt_attrib *pattrib;
174
175
/* init xmitframe attribute */
176
pattrib = &pmptx->attrib;
177
_rtw_memset(pattrib, 0, sizeof(struct pkt_attrib));
178
_rtw_memset(pmptx->desc, 0, TXDESC_SIZE);
179
180
pattrib->ether_type = 0x8712;
181
#if 0
182
_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
183
_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
184
#endif
185
_rtw_memset(pattrib->dst, 0xFF, ETH_ALEN);
186
187
/* pattrib->dhcp_pkt = 0;
188
* pattrib->pktlen = 0; */
189
pattrib->ack_policy = 0;
190
/* pattrib->pkt_hdrlen = ETH_HLEN; */
191
pattrib->hdrlen = WLAN_HDR_A3_LEN;
192
pattrib->subtype = WIFI_DATA;
193
pattrib->priority = 0;
194
pattrib->qsel = pattrib->priority;
195
/* do_queue_select(padapter, pattrib); */
196
pattrib->nr_frags = 1;
197
pattrib->encrypt = 0;
198
pattrib->bswenc = _FALSE;
199
pattrib->qos_en = _FALSE;
200
201
pattrib->pktlen = 1500;
202
203
if (pHalData->rf_type == RF_2T2R)
204
pattrib->raid = RATEID_IDX_BGN_40M_2SS;
205
else
206
pattrib->raid = RATEID_IDX_BGN_40M_1SS;
207
208
#ifdef CONFIG_80211AC_VHT
209
if (pHalData->rf_type == RF_1T1R)
210
pattrib->raid = RATEID_IDX_VHT_1SS;
211
else if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_2T4R)
212
pattrib->raid = RATEID_IDX_VHT_2SS;
213
else if (pHalData->rf_type == RF_3T3R)
214
pattrib->raid = RATEID_IDX_VHT_3SS;
215
else
216
pattrib->raid = RATEID_IDX_BGN_40M_1SS;
217
#endif
218
}
219
220
s32 init_mp_priv(PADAPTER padapter)
221
{
222
struct mp_priv *pmppriv = &padapter->mppriv;
223
PHAL_DATA_TYPE pHalData;
224
225
pHalData = GET_HAL_DATA(padapter);
226
227
_init_mp_priv_(pmppriv);
228
pmppriv->papdater = padapter;
229
if (IS_HARDWARE_TYPE_8822C(padapter))
230
pmppriv->mp_dm = 1;/* default enable dpk tracking */
231
else
232
pmppriv->mp_dm = 0;
233
234
pmppriv->tx.stop = 1;
235
pmppriv->bSetTxPower = 0; /*for manually set tx power*/
236
pmppriv->bTxBufCkFail = _FALSE;
237
pmppriv->pktInterval = 0;
238
pmppriv->pktLength = 1000;
239
pmppriv->bprocess_mp_mode = _FALSE;
240
241
mp_init_xmit_attrib(&pmppriv->tx, padapter);
242
243
switch (GET_HAL_RFPATH(padapter)) {
244
case RF_1T1R:
245
pmppriv->antenna_tx = ANTENNA_A;
246
pmppriv->antenna_rx = ANTENNA_A;
247
break;
248
case RF_1T2R:
249
default:
250
pmppriv->antenna_tx = ANTENNA_A;
251
pmppriv->antenna_rx = ANTENNA_AB;
252
break;
253
case RF_2T2R:
254
pmppriv->antenna_tx = ANTENNA_AB;
255
pmppriv->antenna_rx = ANTENNA_AB;
256
break;
257
case RF_2T4R:
258
pmppriv->antenna_tx = ANTENNA_BC;
259
pmppriv->antenna_rx = ANTENNA_ABCD;
260
break;
261
}
262
263
pHalData->AntennaRxPath = pmppriv->antenna_rx;
264
pHalData->antenna_tx_path = pmppriv->antenna_tx;
265
266
return _SUCCESS;
267
}
268
269
void free_mp_priv(struct mp_priv *pmp_priv)
270
{
271
if (pmp_priv->pallocated_mp_xmitframe_buf) {
272
rtw_mfree(pmp_priv->pallocated_mp_xmitframe_buf, 0);
273
pmp_priv->pallocated_mp_xmitframe_buf = NULL;
274
}
275
pmp_priv->pmp_xmtframe_buf = NULL;
276
}
277
278
#if 0
279
static void PHY_IQCalibrate_default(
280
PADAPTER pAdapter,
281
BOOLEAN bReCovery
282
)
283
{
284
RTW_INFO("%s\n", __func__);
285
}
286
287
static void PHY_LCCalibrate_default(
288
PADAPTER pAdapter
289
)
290
{
291
RTW_INFO("%s\n", __func__);
292
}
293
294
static void PHY_SetRFPathSwitch_default(
295
PADAPTER pAdapter,
296
BOOLEAN bMain
297
)
298
{
299
RTW_INFO("%s\n", __func__);
300
}
301
#endif
302
303
void mpt_InitHWConfig(PADAPTER Adapter)
304
{
305
PHAL_DATA_TYPE hal;
306
307
hal = GET_HAL_DATA(Adapter);
308
309
if (IS_HARDWARE_TYPE_8723B(Adapter)) {
310
/* TODO: <20130114, Kordan> The following setting is only for DPDT and Fixed board type. */
311
/* TODO: A better solution is configure it according EFUSE during the run-time. */
312
313
phy_set_mac_reg(Adapter, 0x64, BIT20, 0x0); /* 0x66[4]=0 */
314
phy_set_mac_reg(Adapter, 0x64, BIT24, 0x0); /* 0x66[8]=0 */
315
phy_set_mac_reg(Adapter, 0x40, BIT4, 0x0); /* 0x40[4]=0 */
316
phy_set_mac_reg(Adapter, 0x40, BIT3, 0x1); /* 0x40[3]=1 */
317
phy_set_mac_reg(Adapter, 0x4C, BIT24, 0x1); /* 0x4C[24:23]=10 */
318
phy_set_mac_reg(Adapter, 0x4C, BIT23, 0x0); /* 0x4C[24:23]=10 */
319
phy_set_bb_reg(Adapter, 0x944, BIT1 | BIT0, 0x3); /* 0x944[1:0]=11 */
320
phy_set_bb_reg(Adapter, 0x930, bMaskByte0, 0x77);/* 0x930[7:0]=77 */
321
phy_set_mac_reg(Adapter, 0x38, BIT11, 0x1);/* 0x38[11]=1 */
322
323
/* TODO: <20130206, Kordan> The default setting is wrong, hard-coded here. */
324
phy_set_mac_reg(Adapter, 0x778, 0x3, 0x3); /* Turn off hardware PTA control (Asked by Scott) */
325
phy_set_mac_reg(Adapter, 0x64, bMaskDWord, 0x36000000);/* Fix BT S0/S1 */
326
phy_set_mac_reg(Adapter, 0x948, bMaskDWord, 0x0); /* Fix BT can't Tx */
327
328
/* <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou) */
329
phy_set_bb_reg(Adapter, 0xA00, BIT8, 0x0); /*0xA01[0] = 0*/
330
} else if (IS_HARDWARE_TYPE_8821(Adapter)) {
331
/* <20131121, VincentL> Add for 8821AU DPDT setting and fix switching antenna issue (Asked by Rock)
332
<20131122, VincentL> Enable for all 8821A/8811AU (Asked by Alex)*/
333
phy_set_mac_reg(Adapter, 0x4C, BIT23, 0x0); /*0x4C[23:22]=01*/
334
phy_set_mac_reg(Adapter, 0x4C, BIT22, 0x1); /*0x4C[23:22]=01*/
335
} else if (IS_HARDWARE_TYPE_8188ES(Adapter))
336
phy_set_mac_reg(Adapter, 0x4C , BIT23, 0); /*select DPDT_P and DPDT_N as output pin*/
337
#ifdef CONFIG_RTL8814A
338
else if (IS_HARDWARE_TYPE_8814A(Adapter))
339
PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8814A, 0x2000);
340
#endif
341
342
#ifdef CONFIG_RTL8812A
343
else if (IS_HARDWARE_TYPE_8812(Adapter)) {
344
rtw_write32(Adapter, 0x520, rtw_read32(Adapter, 0x520) | 0x8000);
345
rtw_write32(Adapter, 0x524, rtw_read32(Adapter, 0x524) & (~0x800));
346
}
347
#endif
348
349
350
#ifdef CONFIG_RTL8822B
351
else if (IS_HARDWARE_TYPE_8822B(Adapter)) {
352
u32 tmp_reg = 0;
353
354
PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8822B, 0x2000);
355
/* fixed wifi can't 2.4g tx suggest by Szuyitasi 20160504 */
356
phy_set_bb_reg(Adapter, 0x70, bMaskByte3, 0x0e);
357
RTW_INFO(" 0x73 = 0x%x\n", phy_query_bb_reg(Adapter, 0x70, bMaskByte3));
358
phy_set_bb_reg(Adapter, 0x1704, bMaskDWord, 0x0000ff00);
359
RTW_INFO(" 0x1704 = 0x%x\n", phy_query_bb_reg(Adapter, 0x1704, bMaskDWord));
360
phy_set_bb_reg(Adapter, 0x1700, bMaskDWord, 0xc00f0038);
361
RTW_INFO(" 0x1700 = 0x%x\n", phy_query_bb_reg(Adapter, 0x1700, bMaskDWord));
362
}
363
#endif /* CONFIG_RTL8822B */
364
#ifdef CONFIG_RTL8821C
365
else if (IS_HARDWARE_TYPE_8821C(Adapter))
366
PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8821C, 0x2000);
367
#endif /* CONFIG_RTL8821C */
368
#if defined(CONFIG_RTL8188F) || defined(CONFIG_RTL8188GTV)
369
else if (IS_HARDWARE_TYPE_8188F(Adapter) || IS_HARDWARE_TYPE_8188GTV(Adapter)) {
370
if (IS_A_CUT(hal->version_id) || IS_B_CUT(hal->version_id)) {
371
RTW_INFO("%s() Active large power detection\n", __func__);
372
phy_active_large_power_detection_8188f(&(GET_HAL_DATA(Adapter)->odmpriv));
373
}
374
}
375
#endif
376
#if defined(CONFIG_RTL8822C)
377
else if( IS_HARDWARE_TYPE_8822C(Adapter)) {
378
rtw_write16(Adapter, REG_RXFLTMAP1_8822C, 0x2000);
379
/* 0x7D8[31] : time out enable when cca is not assert
380
0x60D[7:0] : time out value (Unit : us)*/
381
rtw_write8(Adapter, 0x7db, 0xc0);
382
RTW_INFO(" 0x7d8 = 0x%x\n", rtw_read8(Adapter, 0x7d8));
383
rtw_write8(Adapter, 0x60d, 0x0c);
384
RTW_INFO(" 0x60d = 0x%x\n", rtw_read8(Adapter, 0x60d));
385
phy_set_bb_reg(Adapter, 0x1c44, BIT10, 0x1);
386
RTW_INFO(" 0x1c44 = 0x%x\n", phy_query_bb_reg(Adapter, 0x1c44, bMaskDWord));
387
}
388
#endif
389
390
}
391
392
static void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery)
393
{
394
halrf_iqk_trigger(&(GET_HAL_DATA(padapter)->odmpriv), bReCovery);
395
}
396
397
static void PHY_LCCalibrate(PADAPTER padapter)
398
{
399
halrf_lck_trigger(&(GET_HAL_DATA(padapter)->odmpriv));
400
}
401
402
static u8 PHY_QueryRFPathSwitch(PADAPTER padapter)
403
{
404
u8 bmain = 0;
405
/*
406
if (IS_HARDWARE_TYPE_8723B(padapter)) {
407
#ifdef CONFIG_RTL8723B
408
bmain = PHY_QueryRFPathSwitch_8723B(padapter);
409
#endif
410
} else if (IS_HARDWARE_TYPE_8188E(padapter)) {
411
#ifdef CONFIG_RTL8188E
412
bmain = PHY_QueryRFPathSwitch_8188E(padapter);
413
#endif
414
} else if (IS_HARDWARE_TYPE_8814A(padapter)) {
415
#ifdef CONFIG_RTL8814A
416
bmain = PHY_QueryRFPathSwitch_8814A(padapter);
417
#endif
418
} else if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) {
419
#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
420
bmain = PHY_QueryRFPathSwitch_8812A(padapter);
421
#endif
422
} else if (IS_HARDWARE_TYPE_8192E(padapter)) {
423
#ifdef CONFIG_RTL8192E
424
bmain = PHY_QueryRFPathSwitch_8192E(padapter);
425
#endif
426
} else if (IS_HARDWARE_TYPE_8703B(padapter)) {
427
#ifdef CONFIG_RTL8703B
428
bmain = PHY_QueryRFPathSwitch_8703B(padapter);
429
#endif
430
} else if (IS_HARDWARE_TYPE_8188F(padapter)) {
431
#ifdef CONFIG_RTL8188F
432
bmain = PHY_QueryRFPathSwitch_8188F(padapter);
433
#endif
434
} else if (IS_HARDWARE_TYPE_8188GTV(padapter)) {
435
#ifdef CONFIG_RTL8188GTV
436
bmain = PHY_QueryRFPathSwitch_8188GTV(padapter);
437
#endif
438
} else if (IS_HARDWARE_TYPE_8822B(padapter)) {
439
#ifdef CONFIG_RTL8822B
440
bmain = PHY_QueryRFPathSwitch_8822B(padapter);
441
#endif
442
} else if (IS_HARDWARE_TYPE_8723D(padapter)) {
443
#ifdef CONFIG_RTL8723D
444
bmain = PHY_QueryRFPathSwitch_8723D(padapter);
445
#endif
446
} else
447
*/
448
449
if (IS_HARDWARE_TYPE_8821C(padapter)) {
450
#ifdef CONFIG_RTL8821C
451
bmain = phy_query_rf_path_switch_8821c(padapter);
452
#endif
453
}
454
455
return bmain;
456
}
457
458
static void PHY_SetRFPathSwitch(PADAPTER padapter , BOOLEAN bMain) {
459
460
PHAL_DATA_TYPE hal = GET_HAL_DATA(padapter);
461
struct dm_struct *phydm = &hal->odmpriv;
462
463
if (IS_HARDWARE_TYPE_8723B(padapter)) {
464
#ifdef CONFIG_RTL8723B
465
phy_set_rf_path_switch_8723b(phydm, bMain);
466
#endif
467
} else if (IS_HARDWARE_TYPE_8188E(padapter)) {
468
#ifdef CONFIG_RTL8188E
469
phy_set_rf_path_switch_8188e(phydm, bMain);
470
#endif
471
} else if (IS_HARDWARE_TYPE_8814A(padapter)) {
472
#ifdef CONFIG_RTL8814A
473
phy_set_rf_path_switch_8814a(phydm, bMain);
474
#endif
475
} else if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) {
476
#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
477
phy_set_rf_path_switch_8812a(phydm, bMain);
478
#endif
479
} else if (IS_HARDWARE_TYPE_8192E(padapter)) {
480
#ifdef CONFIG_RTL8192E
481
phy_set_rf_path_switch_8192e(phydm, bMain);
482
#endif
483
} else if (IS_HARDWARE_TYPE_8703B(padapter)) {
484
#ifdef CONFIG_RTL8703B
485
phy_set_rf_path_switch_8703b(phydm, bMain);
486
#endif
487
} else if (IS_HARDWARE_TYPE_8188F(padapter) || IS_HARDWARE_TYPE_8188GTV(padapter)) {
488
#if defined(CONFIG_RTL8188F) || defined(CONFIG_RTL8188GTV)
489
phy_set_rf_path_switch_8188f(phydm, bMain);
490
#endif
491
} else if (IS_HARDWARE_TYPE_8192F(padapter)) {
492
#ifdef CONFIG_RTL8192F
493
phy_set_rf_path_switch_8192f(padapter, bMain);
494
#endif
495
} else if (IS_HARDWARE_TYPE_8822B(padapter)) {
496
#ifdef CONFIG_RTL8822B
497
phy_set_rf_path_switch_8822b(phydm, bMain);
498
#endif
499
} else if (IS_HARDWARE_TYPE_8723D(padapter)) {
500
#ifdef CONFIG_RTL8723D
501
phy_set_rf_path_switch_8723d(phydm, bMain);
502
#endif
503
} else if (IS_HARDWARE_TYPE_8821C(padapter)) {
504
#ifdef CONFIG_RTL8821C
505
phy_set_rf_path_switch_8821c(phydm, bMain);
506
#endif
507
} else if (IS_HARDWARE_TYPE_8822C(padapter)) {
508
#ifdef CONFIG_RTL8822C
509
/* remove for MP EVM Fail, need to review by willis 20180809
510
phy_set_rf_path_switch_8822c(phydm, bMain);
511
*/
512
#endif
513
} else if (IS_HARDWARE_TYPE_8814B(padapter)) {
514
#ifdef CONFIG_RTL8814B
515
/* phy_set_rf_path_switch_8814b(phydm, bMain); */
516
#endif
517
}
518
}
519
520
521
static void phy_switch_rf_path_set(PADAPTER padapter , u8 *prf_set_State) {
522
#ifdef CONFIG_RTL8821C
523
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
524
struct dm_struct *p_dm = &pHalData->odmpriv;
525
526
if (IS_HARDWARE_TYPE_8821C(padapter)) {
527
config_phydm_set_ant_path(p_dm, *prf_set_State, p_dm->current_ant_num_8821c);
528
/* Do IQK when switching to BTG/WLG, requested by RF Binson */
529
if (*prf_set_State == SWITCH_TO_BTG || *prf_set_State == SWITCH_TO_WLG)
530
PHY_IQCalibrate(padapter, FALSE);
531
}
532
#endif
533
534
}
535
536
537
#ifdef CONFIG_ANTENNA_DIVERSITY
538
u8 rtw_mp_set_antdiv(PADAPTER padapter, BOOLEAN bMain)
539
{
540
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
541
u8 cur_ant, change_ant;
542
543
if (!pHalData->AntDivCfg)
544
return _FALSE;
545
/*rtw_hal_get_odm_var(padapter, HAL_ODM_ANTDIV_SELECT, &cur_ant, NULL);*/
546
change_ant = (bMain == MAIN_ANT) ? MAIN_ANT : AUX_ANT;
547
548
RTW_INFO("%s: config %s\n", __func__, (bMain == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
549
rtw_antenna_select_cmd(padapter, change_ant, _FALSE);
550
551
return _TRUE;
552
}
553
#endif
554
555
s32
556
MPT_InitializeAdapter(
557
PADAPTER pAdapter,
558
u8 Channel
559
)
560
{
561
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
562
s32 rtStatus = _SUCCESS;
563
PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.mpt_ctx;
564
u32 ledsetting;
565
566
pMptCtx->bMptDrvUnload = _FALSE;
567
pMptCtx->bMassProdTest = _FALSE;
568
pMptCtx->bMptIndexEven = _TRUE; /* default gain index is -6.0db */
569
pMptCtx->h2cReqNum = 0x0;
570
/* init for BT MP */
571
#if defined(CONFIG_RTL8723B)
572
pMptCtx->bMPh2c_timeout = _FALSE;
573
pMptCtx->MptH2cRspEvent = _FALSE;
574
pMptCtx->MptBtC2hEvent = _FALSE;
575
_rtw_init_sema(&pMptCtx->MPh2c_Sema, 0);
576
rtw_init_timer(&pMptCtx->MPh2c_timeout_timer, pAdapter, MPh2c_timeout_handle, pAdapter);
577
#endif
578
579
mpt_InitHWConfig(pAdapter);
580
581
#ifdef CONFIG_RTL8723B
582
rtl8723b_InitAntenna_Selection(pAdapter);
583
if (IS_HARDWARE_TYPE_8723B(pAdapter)) {
584
585
/* <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou)*/
586
phy_set_bb_reg(pAdapter, 0xA00, BIT8, 0x0);
587
PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); /*default use Main*/
588
589
if (pHalData->PackageType == PACKAGE_DEFAULT)
590
phy_set_rf_reg(pAdapter, RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E);
591
else
592
phy_set_rf_reg(pAdapter, RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6F10E);
593
594
}
595
/*set ant to wifi side in mp mode*/
596
rtw_write16(pAdapter, 0x870, 0x300);
597
rtw_write16(pAdapter, 0x860, 0x110);
598
#endif
599
600
pMptCtx->bMptWorkItemInProgress = _FALSE;
601
pMptCtx->CurrMptAct = NULL;
602
pMptCtx->mpt_rf_path = RF_PATH_A;
603
/* ------------------------------------------------------------------------- */
604
/* Don't accept any packets */
605
rtw_write32(pAdapter, REG_RCR, 0);
606
607
/* ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); */
608
/* rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS); */
609
610
/* rtw_write32(pAdapter, REG_LEDCFG0, 0x08080); */
611
ledsetting = rtw_read32(pAdapter, REG_LEDCFG0);
612
613
614
PHY_LCCalibrate(pAdapter);
615
PHY_IQCalibrate(pAdapter, _FALSE);
616
/* dm_check_txpowertracking(&pHalData->odmpriv); */ /* trigger thermal meter */
617
618
PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); /* default use Main */
619
620
pMptCtx->backup0xc50 = (u8)phy_query_bb_reg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0);
621
pMptCtx->backup0xc58 = (u8)phy_query_bb_reg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0);
622
pMptCtx->backup0xc30 = (u8)phy_query_bb_reg(pAdapter, rOFDM0_RxDetector1, bMaskByte0);
623
pMptCtx->backup0x52_RF_A = (u8)phy_query_rf_reg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0);
624
pMptCtx->backup0x52_RF_B = (u8)phy_query_rf_reg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0);
625
#ifdef CONFIG_RTL8188E
626
rtw_write32(pAdapter, REG_MACID_NO_LINK_0, 0x0);
627
rtw_write32(pAdapter, REG_MACID_NO_LINK_1, 0x0);
628
#endif
629
#ifdef CONFIG_RTL8814A
630
if (IS_HARDWARE_TYPE_8814A(pAdapter)) {
631
pHalData->BackUp_IG_REG_4_Chnl_Section[0] = (u8)phy_query_bb_reg(pAdapter, rA_IGI_Jaguar, bMaskByte0);
632
pHalData->BackUp_IG_REG_4_Chnl_Section[1] = (u8)phy_query_bb_reg(pAdapter, rB_IGI_Jaguar, bMaskByte0);
633
pHalData->BackUp_IG_REG_4_Chnl_Section[2] = (u8)phy_query_bb_reg(pAdapter, rC_IGI_Jaguar2, bMaskByte0);
634
pHalData->BackUp_IG_REG_4_Chnl_Section[3] = (u8)phy_query_bb_reg(pAdapter, rD_IGI_Jaguar2, bMaskByte0);
635
}
636
#endif
637
return rtStatus;
638
}
639
640
/*-----------------------------------------------------------------------------
641
* Function: MPT_DeInitAdapter()
642
*
643
* Overview: Extra DeInitialization for Mass Production Test.
644
*
645
* Input: PADAPTER pAdapter
646
*
647
* Output: NONE
648
*
649
* Return: NONE
650
*
651
* Revised History:
652
* When Who Remark
653
* 05/08/2007 MHC Create Version 0.
654
* 05/18/2007 MHC Add normal driver MPHalt code.
655
*
656
*---------------------------------------------------------------------------*/
657
void
658
MPT_DeInitAdapter(
659
PADAPTER pAdapter
660
)
661
{
662
PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.mpt_ctx;
663
664
pMptCtx->bMptDrvUnload = _TRUE;
665
#if defined(CONFIG_RTL8723B)
666
_rtw_free_sema(&(pMptCtx->MPh2c_Sema));
667
_cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer);
668
#endif
669
#if defined(CONFIG_RTL8723B)
670
phy_set_bb_reg(pAdapter, 0xA01, BIT0, 1); /* /suggestion by jerry for MP Rx. */
671
#endif
672
#if 0 /* for Windows */
673
PlatformFreeWorkItem(&(pMptCtx->MptWorkItem));
674
675
while (pMptCtx->bMptWorkItemInProgress) {
676
if (NdisWaitEvent(&(pMptCtx->MptWorkItemEvent), 50))
677
break;
678
}
679
NdisFreeSpinLock(&(pMptCtx->MptWorkItemSpinLock));
680
#endif
681
}
682
683
static u8 mpt_ProStartTest(PADAPTER padapter)
684
{
685
PMPT_CONTEXT pMptCtx = &padapter->mppriv.mpt_ctx;
686
687
pMptCtx->bMassProdTest = _TRUE;
688
pMptCtx->is_start_cont_tx = _FALSE;
689
pMptCtx->bCckContTx = _FALSE;
690
pMptCtx->bOfdmContTx = _FALSE;
691
pMptCtx->bSingleCarrier = _FALSE;
692
pMptCtx->is_carrier_suppression = _FALSE;
693
pMptCtx->is_single_tone = _FALSE;
694
pMptCtx->HWTxmode = PACKETS_TX;
695
696
return _SUCCESS;
697
}
698
699
/*
700
* General use
701
*/
702
s32 SetPowerTracking(PADAPTER padapter, u8 enable)
703
{
704
705
hal_mpt_SetPowerTracking(padapter, enable);
706
return 0;
707
}
708
709
void GetPowerTracking(PADAPTER padapter, u8 *enable)
710
{
711
hal_mpt_GetPowerTracking(padapter, enable);
712
}
713
714
void rtw_mp_trigger_iqk(PADAPTER padapter)
715
{
716
PHY_IQCalibrate(padapter, _FALSE);
717
}
718
719
void rtw_mp_trigger_lck(PADAPTER padapter)
720
{
721
PHY_LCCalibrate(padapter);
722
}
723
724
void rtw_mp_trigger_dpk(PADAPTER padapter)
725
{
726
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
727
struct dm_struct *pDM_Odm = &pHalData->odmpriv;
728
729
halrf_dpk_trigger(pDM_Odm);
730
}
731
732
static void init_mp_data(PADAPTER padapter)
733
{
734
u8 v8;
735
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
736
struct dm_struct *pDM_Odm = &pHalData->odmpriv;
737
738
/*disable BCN*/
739
#ifdef CONFIG_PROTSEL_PORT
740
rtw_hal_hw_port_disable(padapter);
741
#else
742
v8 = rtw_read8(padapter, REG_BCN_CTRL);
743
v8 &= ~EN_BCN_FUNCTION;
744
rtw_write8(padapter, REG_BCN_CTRL, v8);
745
#endif
746
747
pDM_Odm->rf_calibrate_info.txpowertrack_control = _FALSE;
748
}
749
750
void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
751
{
752
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
753
struct dm_struct *pDM_Odm = &pHalData->odmpriv;
754
u32 rf_ability;
755
756
if (bstart == 1) {
757
RTW_INFO("in MPT_PwrCtlDM start\n");
758
759
rf_ability = ((u32)halrf_cmn_info_get(pDM_Odm, HALRF_CMNINFO_ABILITY)) | HAL_RF_TX_PWR_TRACK;
760
halrf_cmn_info_set(pDM_Odm, HALRF_CMNINFO_ABILITY, rf_ability);
761
halrf_set_pwr_track(pDM_Odm, true);
762
pDM_Odm->rf_calibrate_info.txpowertrack_control = _TRUE;
763
padapter->mppriv.mp_dm = 1;
764
765
} else {
766
RTW_INFO("in MPT_PwrCtlDM stop\n");
767
rf_ability = ((u32)halrf_cmn_info_get(pDM_Odm, HALRF_CMNINFO_ABILITY)) & ~HAL_RF_TX_PWR_TRACK;
768
halrf_cmn_info_set(pDM_Odm, HALRF_CMNINFO_ABILITY, rf_ability);
769
halrf_set_pwr_track(pDM_Odm, false);
770
pDM_Odm->rf_calibrate_info.txpowertrack_control = _FALSE;
771
if (IS_HARDWARE_TYPE_8822C(padapter))
772
padapter->mppriv.mp_dm = 1; /* default enable dpk tracking */
773
else
774
padapter->mppriv.mp_dm = 0;
775
{
776
struct txpwrtrack_cfg c;
777
u8 chnl = 0 ;
778
_rtw_memset(&c, 0, sizeof(struct txpwrtrack_cfg));
779
configure_txpower_track(pDM_Odm, &c);
780
odm_clear_txpowertracking_state(pDM_Odm);
781
if (*c.odm_tx_pwr_track_set_pwr) {
782
if (pDM_Odm->support_ic_type == ODM_RTL8188F)
783
(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, MIX_MODE, RF_PATH_A, chnl);
784
else if (pDM_Odm->support_ic_type == ODM_RTL8723D) {
785
(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_A, chnl);
786
SetTxPower(padapter);
787
} else if (pDM_Odm->support_ic_type == ODM_RTL8192F) {
788
(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, MIX_MODE, RF_PATH_A, chnl);
789
(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, MIX_MODE, RF_PATH_B, chnl);
790
} else {
791
(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_A, chnl);
792
(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_B, chnl);
793
}
794
}
795
}
796
}
797
798
}
799
800
801
u32 mp_join(PADAPTER padapter, u8 mode)
802
{
803
WLAN_BSSID_EX bssid;
804
struct sta_info *psta;
805
u32 length;
806
_irqL irqL;
807
s32 res = _SUCCESS;
808
809
struct mp_priv *pmppriv = &padapter->mppriv;
810
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
811
struct wlan_network *tgt_network = &pmlmepriv->cur_network;
812
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
813
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
814
WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network));
815
816
/* 1. initialize a new WLAN_BSSID_EX */
817
_rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX));
818
RTW_INFO("%s ,pmppriv->network_macaddr=%x %x %x %x %x %x\n", __func__,
819
pmppriv->network_macaddr[0], pmppriv->network_macaddr[1], pmppriv->network_macaddr[2], pmppriv->network_macaddr[3], pmppriv->network_macaddr[4],
820
pmppriv->network_macaddr[5]);
821
_rtw_memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN);
822
823
if (mode == WIFI_FW_ADHOC_STATE) {
824
bssid.Ssid.SsidLength = strlen("mp_pseudo_adhoc");
825
_rtw_memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_adhoc", bssid.Ssid.SsidLength);
826
bssid.InfrastructureMode = Ndis802_11IBSS;
827
bssid.IELength = 0;
828
bssid.Configuration.DSConfig = pmppriv->channel;
829
830
} else if (mode == WIFI_FW_STATION_STATE) {
831
bssid.Ssid.SsidLength = strlen("mp_pseudo_STATION");
832
_rtw_memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_STATION", bssid.Ssid.SsidLength);
833
bssid.InfrastructureMode = Ndis802_11Infrastructure;
834
bssid.IELength = 0;
835
}
836
837
length = get_WLAN_BSSID_EX_sz(&bssid);
838
if (length % 4)
839
bssid.Length = ((length >> 2) + 1) << 2; /* round up to multiple of 4 bytes. */
840
else
841
bssid.Length = length;
842
843
_enter_critical_bh(&pmlmepriv->lock, &irqL);
844
845
if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
846
goto end_of_mp_start_test;
847
848
/* init mp_start_test status */
849
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
850
rtw_disassoc_cmd(padapter, 500, 0);
851
rtw_indicate_disconnect(padapter, 0, _FALSE);
852
rtw_free_assoc_resources_cmd(padapter, _TRUE, 0);
853
}
854
pmppriv->prev_fw_state = get_fwstate(pmlmepriv);
855
/*pmlmepriv->fw_state = WIFI_MP_STATE;*/
856
init_fwstate(pmlmepriv, WIFI_MP_STATE);
857
858
set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
859
860
/* 3 2. create a new psta for mp driver */
861
/* clear psta in the cur_network, if any */
862
psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);
863
if (psta)
864
rtw_free_stainfo(padapter, psta);
865
866
psta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress);
867
if (psta == NULL) {
868
/*pmlmepriv->fw_state = pmppriv->prev_fw_state;*/
869
init_fwstate(pmlmepriv, pmppriv->prev_fw_state);
870
res = _FAIL;
871
goto end_of_mp_start_test;
872
}
873
if (mode == WIFI_FW_ADHOC_STATE)
874
set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
875
else
876
set_fwstate(pmlmepriv, WIFI_STATION_STATE);
877
/* 3 3. join psudo AdHoc */
878
tgt_network->join_res = 1;
879
tgt_network->aid = psta->cmn.aid = 1;
880
881
_rtw_memcpy(&padapter->registrypriv.dev_network, &bssid, length);
882
rtw_update_registrypriv_dev_network(padapter);
883
_rtw_memcpy(&tgt_network->network, &padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length);
884
_rtw_memcpy(pnetwork, &padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length);
885
886
rtw_indicate_connect(padapter);
887
_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
888
set_fwstate(pmlmepriv, _FW_LINKED);
889
890
end_of_mp_start_test:
891
892
_exit_critical_bh(&pmlmepriv->lock, &irqL);
893
894
if (1) { /* (res == _SUCCESS) */
895
/* set MSR to WIFI_FW_ADHOC_STATE */
896
if (mode == WIFI_FW_ADHOC_STATE) {
897
/* set msr to WIFI_FW_ADHOC_STATE */
898
pmlmeinfo->state = WIFI_FW_ADHOC_STATE;
899
Set_MSR(padapter, (pmlmeinfo->state & 0x3));
900
rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress);
901
rtw_hal_rcr_set_chk_bssid(padapter, MLME_ADHOC_STARTED);
902
pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;
903
} else {
904
Set_MSR(padapter, WIFI_FW_STATION_STATE);
905
906
RTW_INFO("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n", __func__,
907
pmppriv->network_macaddr[0], pmppriv->network_macaddr[1], pmppriv->network_macaddr[2], pmppriv->network_macaddr[3], pmppriv->network_macaddr[4],
908
pmppriv->network_macaddr[5]);
909
910
rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr);
911
}
912
}
913
914
return res;
915
}
916
/* This function initializes the DUT to the MP test mode */
917
s32 mp_start_test(PADAPTER padapter)
918
{
919
struct mp_priv *pmppriv = &padapter->mppriv;
920
#ifdef CONFIG_PCI_HCI
921
PHAL_DATA_TYPE hal;
922
#endif
923
s32 res = _SUCCESS;
924
925
padapter->registrypriv.mp_mode = 1;
926
927
init_mp_data(padapter);
928
#ifdef CONFIG_RTL8814A
929
rtl8814_InitHalDm(padapter);
930
#endif /* CONFIG_RTL8814A */
931
#ifdef CONFIG_RTL8812A
932
rtl8812_InitHalDm(padapter);
933
#endif /* CONFIG_RTL8812A */
934
#ifdef CONFIG_RTL8723B
935
rtl8723b_InitHalDm(padapter);
936
#endif /* CONFIG_RTL8723B */
937
#ifdef CONFIG_RTL8703B
938
rtl8703b_InitHalDm(padapter);
939
#endif /* CONFIG_RTL8703B */
940
#ifdef CONFIG_RTL8192E
941
rtl8192e_InitHalDm(padapter);
942
#endif
943
#ifdef CONFIG_RTL8188F
944
rtl8188f_InitHalDm(padapter);
945
#endif
946
#ifdef CONFIG_RTL8188GTV
947
rtl8188gtv_InitHalDm(padapter);
948
#endif
949
#ifdef CONFIG_RTL8188E
950
rtl8188e_InitHalDm(padapter);
951
#endif
952
#ifdef CONFIG_RTL8723D
953
rtl8723d_InitHalDm(padapter);
954
#endif /* CONFIG_RTL8723D */
955
956
#ifdef CONFIG_PCI_HCI
957
hal = GET_HAL_DATA(padapter);
958
hal->pci_backdoor_ctrl = 0;
959
rtw_pci_aspm_config(padapter);
960
#endif
961
962
963
/* 3 0. update mp_priv */
964
switch (GET_HAL_RFPATH(padapter)) {
965
case RF_1T1R:
966
pmppriv->antenna_tx = ANTENNA_A;
967
pmppriv->antenna_rx = ANTENNA_A;
968
break;
969
case RF_1T2R:
970
default:
971
pmppriv->antenna_tx = ANTENNA_A;
972
pmppriv->antenna_rx = ANTENNA_AB;
973
break;
974
case RF_2T2R:
975
pmppriv->antenna_tx = ANTENNA_AB;
976
pmppriv->antenna_rx = ANTENNA_AB;
977
break;
978
case RF_2T4R:
979
pmppriv->antenna_tx = ANTENNA_AB;
980
pmppriv->antenna_rx = ANTENNA_ABCD;
981
break;
982
}
983
984
mpt_ProStartTest(padapter);
985
986
mp_join(padapter, WIFI_FW_ADHOC_STATE);
987
988
return res;
989
}
990
/* ------------------------------------------------------------------------------
991
* This function change the DUT from the MP test mode into normal mode */
992
void mp_stop_test(PADAPTER padapter)
993
{
994
struct mp_priv *pmppriv = &padapter->mppriv;
995
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
996
struct wlan_network *tgt_network = &pmlmepriv->cur_network;
997
struct sta_info *psta;
998
#ifdef CONFIG_PCI_HCI
999
struct registry_priv *registry_par = &padapter->registrypriv;
1000
PHAL_DATA_TYPE hal;
1001
#endif
1002
1003
_irqL irqL;
1004
1005
if (pmppriv->mode == MP_ON) {
1006
pmppriv->bSetTxPower = 0;
1007
_enter_critical_bh(&pmlmepriv->lock, &irqL);
1008
if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)
1009
goto end_of_mp_stop_test;
1010
1011
/* 3 1. disconnect psudo AdHoc */
1012
rtw_indicate_disconnect(padapter, 0, _FALSE);
1013
1014
/* 3 2. clear psta used in mp test mode.
1015
* rtw_free_assoc_resources(padapter, _TRUE); */
1016
psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);
1017
if (psta)
1018
rtw_free_stainfo(padapter, psta);
1019
1020
/* 3 3. return to normal state (default:station mode) */
1021
/*pmlmepriv->fw_state = pmppriv->prev_fw_state; */ /* WIFI_STATION_STATE;*/
1022
init_fwstate(pmlmepriv, pmppriv->prev_fw_state);
1023
1024
/* flush the cur_network */
1025
_rtw_memset(tgt_network, 0, sizeof(struct wlan_network));
1026
1027
_clr_fwstate_(pmlmepriv, WIFI_MP_STATE);
1028
1029
end_of_mp_stop_test:
1030
1031
_exit_critical_bh(&pmlmepriv->lock, &irqL);
1032
1033
#ifdef CONFIG_PCI_HCI
1034
hal = GET_HAL_DATA(padapter);
1035
hal->pci_backdoor_ctrl = registry_par->pci_aspm_config;
1036
rtw_pci_aspm_config(padapter);
1037
#endif
1038
1039
#ifdef CONFIG_RTL8812A
1040
rtl8812_InitHalDm(padapter);
1041
#endif
1042
#ifdef CONFIG_RTL8723B
1043
rtl8723b_InitHalDm(padapter);
1044
#endif
1045
#ifdef CONFIG_RTL8703B
1046
rtl8703b_InitHalDm(padapter);
1047
#endif
1048
#ifdef CONFIG_RTL8192E
1049
rtl8192e_InitHalDm(padapter);
1050
#endif
1051
#ifdef CONFIG_RTL8188F
1052
rtl8188f_InitHalDm(padapter);
1053
#endif
1054
#ifdef CONFIG_RTL8188GTV
1055
rtl8188gtv_InitHalDm(padapter);
1056
#endif
1057
#ifdef CONFIG_RTL8723D
1058
rtl8723d_InitHalDm(padapter);
1059
#endif
1060
}
1061
}
1062
/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/
1063
#if 0
1064
/* #ifdef CONFIG_USB_HCI */
1065
static void mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Channel, u8 BandWidthID)
1066
{
1067
u8 eRFPath;
1068
u32 rfReg0x26;
1069
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1070
1071
1072
if (RateIdx < MPT_RATE_6M) /* CCK rate,for 88cu */
1073
rfReg0x26 = 0xf400;
1074
else if ((RateIdx >= MPT_RATE_6M) && (RateIdx <= MPT_RATE_54M)) {/* OFDM rate,for 88cu */
1075
if ((4 == Channel) || (8 == Channel) || (12 == Channel))
1076
rfReg0x26 = 0xf000;
1077
else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel))
1078
rfReg0x26 = 0xf400;
1079
else
1080
rfReg0x26 = 0x4f200;
1081
} else if ((RateIdx >= MPT_RATE_MCS0) && (RateIdx <= MPT_RATE_MCS15)) {
1082
/* MCS 20M ,for 88cu */ /* MCS40M rate,for 88cu */
1083
1084
if (CHANNEL_WIDTH_20 == BandWidthID) {
1085
if ((4 == Channel) || (8 == Channel))
1086
rfReg0x26 = 0xf000;
1087
else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel))
1088
rfReg0x26 = 0xf400;
1089
else
1090
rfReg0x26 = 0x4f200;
1091
} else {
1092
if ((4 == Channel) || (8 == Channel))
1093
rfReg0x26 = 0xf000;
1094
else if ((5 == Channel) || (7 == Channel))
1095
rfReg0x26 = 0xf400;
1096
else
1097
rfReg0x26 = 0x4f200;
1098
}
1099
}
1100
1101
for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++)
1102
write_rfreg(pAdapter, eRFPath, RF_SYN_G2, rfReg0x26);
1103
}
1104
#endif
1105
/*-----------------------------------------------------------------------------
1106
* Function: mpt_SwitchRfSetting
1107
*
1108
* Overview: Change RF Setting when we siwthc channel/rate/BW for MP.
1109
*
1110
* Input: PADAPTER pAdapter
1111
*
1112
* Output: NONE
1113
*
1114
* Return: NONE
1115
*
1116
* Revised History:
1117
* When Who Remark
1118
* 01/08/2009 MHC Suggestion from SD3 Willis for 92S series.
1119
* 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3.
1120
*
1121
*---------------------------------------------------------------------------*/
1122
#if 0
1123
static void mpt_SwitchRfSetting(PADAPTER pAdapter)
1124
{
1125
hal_mpt_SwitchRfSetting(pAdapter);
1126
}
1127
1128
/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/
1129
/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/
1130
static void MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14)
1131
{
1132
hal_mpt_CCKTxPowerAdjust(Adapter, bInCH14);
1133
}
1134
#endif
1135
1136
/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/
1137
1138
/*
1139
* SetChannel
1140
* Description
1141
* Use H2C command to change channel,
1142
* not only modify rf register, but also other setting need to be done.
1143
*/
1144
void SetChannel(PADAPTER pAdapter)
1145
{
1146
hal_mpt_SetChannel(pAdapter);
1147
}
1148
1149
/*
1150
* Notice
1151
* Switch bandwitdth may change center frequency(channel)
1152
*/
1153
void SetBandwidth(PADAPTER pAdapter)
1154
{
1155
hal_mpt_SetBandwidth(pAdapter);
1156
1157
}
1158
1159
void SetAntenna(PADAPTER pAdapter)
1160
{
1161
hal_mpt_SetAntenna(pAdapter);
1162
}
1163
1164
int SetTxPower(PADAPTER pAdapter)
1165
{
1166
1167
hal_mpt_SetTxPower(pAdapter);
1168
return _TRUE;
1169
}
1170
1171
void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)
1172
{
1173
u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D, tmpAGC;
1174
1175
TxAGCOffset_B = (ulTxAGCOffset & 0x000000ff);
1176
TxAGCOffset_C = ((ulTxAGCOffset & 0x0000ff00) >> 8);
1177
TxAGCOffset_D = ((ulTxAGCOffset & 0x00ff0000) >> 16);
1178
1179
tmpAGC = (TxAGCOffset_D << 8 | TxAGCOffset_C << 4 | TxAGCOffset_B);
1180
write_bbreg(pAdapter, rFPGA0_TxGainStage,
1181
(bXBTxAGC | bXCTxAGC | bXDTxAGC), tmpAGC);
1182
}
1183
1184
void SetDataRate(PADAPTER pAdapter)
1185
{
1186
hal_mpt_SetDataRate(pAdapter);
1187
}
1188
1189
void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter , BOOLEAN bMain)
1190
{
1191
1192
PHY_SetRFPathSwitch(pAdapter, bMain);
1193
1194
}
1195
1196
void mp_phy_switch_rf_path_set(PADAPTER pAdapter , u8 *pstate)
1197
{
1198
1199
phy_switch_rf_path_set(pAdapter, pstate);
1200
1201
}
1202
1203
u8 MP_PHY_QueryRFPathSwitch(PADAPTER pAdapter)
1204
{
1205
return PHY_QueryRFPathSwitch(pAdapter);
1206
}
1207
1208
s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther)
1209
{
1210
return hal_mpt_SetThermalMeter(pAdapter, target_ther);
1211
}
1212
1213
#if 0
1214
static void TriggerRFThermalMeter(PADAPTER pAdapter)
1215
{
1216
hal_mpt_TriggerRFThermalMeter(pAdapter);
1217
}
1218
1219
static u8 ReadRFThermalMeter(PADAPTER pAdapter)
1220
{
1221
return hal_mpt_ReadRFThermalMeter(pAdapter);
1222
}
1223
#endif
1224
1225
void GetThermalMeter(PADAPTER pAdapter, u8 rfpath ,u8 *value)
1226
{
1227
hal_mpt_GetThermalMeter(pAdapter, rfpath, value);
1228
}
1229
1230
void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart)
1231
{
1232
PhySetTxPowerLevel(pAdapter);
1233
hal_mpt_SetSingleCarrierTx(pAdapter, bStart);
1234
}
1235
1236
void SetSingleToneTx(PADAPTER pAdapter, u8 bStart)
1237
{
1238
PhySetTxPowerLevel(pAdapter);
1239
hal_mpt_SetSingleToneTx(pAdapter, bStart);
1240
}
1241
1242
void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart)
1243
{
1244
PhySetTxPowerLevel(pAdapter);
1245
hal_mpt_SetCarrierSuppressionTx(pAdapter, bStart);
1246
}
1247
1248
void SetContinuousTx(PADAPTER pAdapter, u8 bStart)
1249
{
1250
PhySetTxPowerLevel(pAdapter);
1251
hal_mpt_SetContinuousTx(pAdapter, bStart);
1252
}
1253
1254
1255
void PhySetTxPowerLevel(PADAPTER pAdapter)
1256
{
1257
struct mp_priv *pmp_priv = &pAdapter->mppriv;
1258
1259
1260
if (pmp_priv->bSetTxPower == 0) /* for NO manually set power index */
1261
rtw_hal_set_tx_power_level(pAdapter, pmp_priv->channel);
1262
}
1263
1264
/* ------------------------------------------------------------------------------ */
1265
static void dump_mpframe(PADAPTER padapter, struct xmit_frame *pmpframe)
1266
{
1267
rtw_hal_mgnt_xmit(padapter, pmpframe);
1268
}
1269
1270
static struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv)
1271
{
1272
struct xmit_frame *pmpframe;
1273
struct xmit_buf *pxmitbuf;
1274
1275
pmpframe = rtw_alloc_xmitframe(pxmitpriv);
1276
if (pmpframe == NULL)
1277
return NULL;
1278
1279
pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);
1280
if (pxmitbuf == NULL) {
1281
rtw_free_xmitframe(pxmitpriv, pmpframe);
1282
return NULL;
1283
}
1284
1285
pmpframe->frame_tag = MP_FRAMETAG;
1286
1287
pmpframe->pxmitbuf = pxmitbuf;
1288
1289
pmpframe->buf_addr = pxmitbuf->pbuf;
1290
1291
pxmitbuf->priv_data = pmpframe;
1292
1293
return pmpframe;
1294
1295
}
1296
1297
#ifdef CONFIG_PCI_HCI
1298
static u8 check_nic_enough_desc(_adapter *padapter, struct pkt_attrib *pattrib)
1299
{
1300
u32 prio;
1301
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1302
struct rtw_tx_ring *ring;
1303
1304
switch (pattrib->qsel) {
1305
case 0:
1306
case 3:
1307
prio = BE_QUEUE_INX;
1308
break;
1309
case 1:
1310
case 2:
1311
prio = BK_QUEUE_INX;
1312
break;
1313
case 4:
1314
case 5:
1315
prio = VI_QUEUE_INX;
1316
break;
1317
case 6:
1318
case 7:
1319
prio = VO_QUEUE_INX;
1320
break;
1321
default:
1322
prio = BE_QUEUE_INX;
1323
break;
1324
}
1325
1326
ring = &pxmitpriv->tx_ring[prio];
1327
1328
/*
1329
* for now we reserve two free descriptor as a safety boundary
1330
* between the tail and the head
1331
*/
1332
if ((ring->entries - ring->qlen) >= 2)
1333
return _TRUE;
1334
else
1335
return _FALSE;
1336
}
1337
#endif
1338
1339
static thread_return mp_xmit_packet_thread(thread_context context)
1340
{
1341
struct xmit_frame *pxmitframe;
1342
struct mp_tx *pmptx;
1343
struct mp_priv *pmp_priv;
1344
struct xmit_priv *pxmitpriv;
1345
PADAPTER padapter;
1346
1347
pmp_priv = (struct mp_priv *)context;
1348
pmptx = &pmp_priv->tx;
1349
padapter = pmp_priv->papdater;
1350
pxmitpriv = &(padapter->xmitpriv);
1351
1352
thread_enter("RTW_MP_THREAD");
1353
1354
RTW_INFO("%s:pkTx Start\n", __func__);
1355
while (1) {
1356
pxmitframe = alloc_mp_xmitframe(pxmitpriv);
1357
#ifdef CONFIG_PCI_HCI
1358
if(check_nic_enough_desc(padapter, &pmptx->attrib) == _FALSE) {
1359
rtw_usleep_os(1000);
1360
continue;
1361
}
1362
#endif
1363
if (pxmitframe == NULL) {
1364
if (pmptx->stop ||
1365
RTW_CANNOT_RUN(padapter))
1366
goto exit;
1367
else {
1368
rtw_usleep_os(10);
1369
continue;
1370
}
1371
}
1372
_rtw_memcpy((u8 *)(pxmitframe->buf_addr + TXDESC_OFFSET), pmptx->buf, pmptx->write_size);
1373
_rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib));
1374
1375
1376
rtw_usleep_os(padapter->mppriv.pktInterval);
1377
dump_mpframe(padapter, pxmitframe);
1378
1379
pmptx->sended++;
1380
pmp_priv->tx_pktcount++;
1381
1382
if (pmptx->stop ||
1383
RTW_CANNOT_RUN(padapter))
1384
goto exit;
1385
if ((pmptx->count != 0) &&
1386
(pmptx->count == pmptx->sended))
1387
goto exit;
1388
1389
flush_signals_thread();
1390
}
1391
1392
exit:
1393
/* RTW_INFO("%s:pkTx Exit\n", __func__); */
1394
rtw_mfree(pmptx->pallocated_buf, pmptx->buf_size);
1395
pmptx->pallocated_buf = NULL;
1396
pmptx->stop = 1;
1397
1398
thread_exit(NULL);
1399
return 0;
1400
}
1401
1402
void fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc)
1403
{
1404
struct mp_priv *pmp_priv = &padapter->mppriv;
1405
_rtw_memcpy(ptxdesc, pmp_priv->tx.desc, TXDESC_SIZE);
1406
}
1407
1408
#if defined(CONFIG_RTL8188E)
1409
void fill_tx_desc_8188e(PADAPTER padapter)
1410
{
1411
struct mp_priv *pmp_priv = &padapter->mppriv;
1412
struct tx_desc *desc = (struct tx_desc *)&(pmp_priv->tx.desc);
1413
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1414
u32 pkt_size = pattrib->last_txcmdsz;
1415
s32 bmcast = IS_MCAST(pattrib->ra);
1416
/* offset 0 */
1417
#if !defined(CONFIG_RTL8188E_SDIO) && !defined(CONFIG_PCI_HCI)
1418
desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);
1419
desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); /* packet size */
1420
desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); /* 32 bytes for TX Desc */
1421
if (bmcast)
1422
desc->txdw0 |= cpu_to_le32(BMC); /* broadcast packet */
1423
1424
desc->txdw1 |= cpu_to_le32((0x01 << 26) & 0xff000000);
1425
#endif
1426
1427
desc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x3F); /* CAM_ID(MAC_ID) */
1428
desc->txdw1 |= cpu_to_le32((pattrib->qsel << QSEL_SHT) & 0x00001F00); /* Queue Select, TID */
1429
desc->txdw1 |= cpu_to_le32((pattrib->raid << RATE_ID_SHT) & 0x000F0000); /* Rate Adaptive ID */
1430
/* offset 8 */
1431
/* desc->txdw2 |= cpu_to_le32(AGG_BK); */ /* AGG BK */
1432
1433
desc->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0x0fff0000);
1434
desc->txdw4 |= cpu_to_le32(HW_SSN);
1435
1436
desc->txdw4 |= cpu_to_le32(USERATE);
1437
desc->txdw4 |= cpu_to_le32(DISDATAFB);
1438
1439
if (pmp_priv->preamble) {
1440
if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
1441
desc->txdw4 |= cpu_to_le32(DATA_SHORT); /* CCK Short Preamble */
1442
}
1443
1444
if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
1445
desc->txdw4 |= cpu_to_le32(DATA_BW);
1446
1447
/* offset 20 */
1448
desc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F);
1449
1450
if (pmp_priv->preamble) {
1451
if (HwRateToMPTRate(pmp_priv->rateidx) > MPT_RATE_54M)
1452
desc->txdw5 |= cpu_to_le32(SGI); /* MCS Short Guard Interval */
1453
}
1454
1455
desc->txdw5 |= cpu_to_le32(RTY_LMT_EN); /* retry limit enable */
1456
desc->txdw5 |= cpu_to_le32(0x00180000); /* DATA/RTS Rate Fallback Limit */
1457
1458
1459
}
1460
#endif
1461
1462
#if defined(CONFIG_RTL8814A)
1463
void fill_tx_desc_8814a(PADAPTER padapter)
1464
{
1465
struct mp_priv *pmp_priv = &padapter->mppriv;
1466
u8 *pDesc = (u8 *)&(pmp_priv->tx.desc);
1467
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1468
1469
u32 pkt_size = pattrib->last_txcmdsz;
1470
s32 bmcast = IS_MCAST(pattrib->ra);
1471
u8 offset;
1472
1473
/* SET_TX_DESC_FIRST_SEG_8814A(pDesc, 1); */
1474
SET_TX_DESC_LAST_SEG_8814A(pDesc, 1);
1475
/* SET_TX_DESC_OWN_(pDesc, 1); */
1476
1477
SET_TX_DESC_PKT_SIZE_8814A(pDesc, pkt_size);
1478
1479
offset = TXDESC_SIZE + OFFSET_SZ;
1480
1481
SET_TX_DESC_OFFSET_8814A(pDesc, offset);
1482
#if defined(CONFIG_PCI_HCI)
1483
SET_TX_DESC_PKT_OFFSET_8814A(pDesc, 0); /* 8814AE pkt_offset is 0 */
1484
#else
1485
SET_TX_DESC_PKT_OFFSET_8814A(pDesc, 1);
1486
#endif
1487
1488
if (bmcast)
1489
SET_TX_DESC_BMC_8814A(pDesc, 1);
1490
1491
SET_TX_DESC_MACID_8814A(pDesc, pattrib->mac_id);
1492
SET_TX_DESC_RATE_ID_8814A(pDesc, pattrib->raid);
1493
1494
/* SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G); */
1495
SET_TX_DESC_QUEUE_SEL_8814A(pDesc, pattrib->qsel);
1496
/* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */
1497
1498
if (pmp_priv->preamble)
1499
SET_TX_DESC_DATA_SHORT_8814A(pDesc, 1);
1500
1501
if (!pattrib->qos_en) {
1502
SET_TX_DESC_HWSEQ_EN_8814A(pDesc, 1); /* Hw set sequence number */
1503
} else
1504
SET_TX_DESC_SEQ_8814A(pDesc, pattrib->seqnum);
1505
1506
if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160)
1507
SET_TX_DESC_DATA_BW_8814A(pDesc, pmp_priv->bandwidth);
1508
else {
1509
RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth);
1510
SET_TX_DESC_DATA_BW_8814A(pDesc, CHANNEL_WIDTH_20);
1511
}
1512
1513
SET_TX_DESC_DISABLE_FB_8814A(pDesc, 1);
1514
SET_TX_DESC_USE_RATE_8814A(pDesc, 1);
1515
SET_TX_DESC_TX_RATE_8814A(pDesc, pmp_priv->rateidx);
1516
1517
}
1518
#endif
1519
1520
#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
1521
void fill_tx_desc_8812a(PADAPTER padapter)
1522
{
1523
struct mp_priv *pmp_priv = &padapter->mppriv;
1524
u8 *pDesc = (u8 *)&(pmp_priv->tx.desc);
1525
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1526
1527
u32 pkt_size = pattrib->last_txcmdsz;
1528
s32 bmcast = IS_MCAST(pattrib->ra);
1529
u8 data_rate, pwr_status, offset;
1530
1531
SET_TX_DESC_FIRST_SEG_8812(pDesc, 1);
1532
SET_TX_DESC_LAST_SEG_8812(pDesc, 1);
1533
SET_TX_DESC_OWN_8812(pDesc, 1);
1534
1535
SET_TX_DESC_PKT_SIZE_8812(pDesc, pkt_size);
1536
1537
offset = TXDESC_SIZE + OFFSET_SZ;
1538
1539
SET_TX_DESC_OFFSET_8812(pDesc, offset);
1540
1541
#if defined(CONFIG_PCI_HCI)
1542
SET_TX_DESC_PKT_OFFSET_8812(pDesc, 0);
1543
#else
1544
SET_TX_DESC_PKT_OFFSET_8812(pDesc, 1);
1545
#endif
1546
if (bmcast)
1547
SET_TX_DESC_BMC_8812(pDesc, 1);
1548
1549
SET_TX_DESC_MACID_8812(pDesc, pattrib->mac_id);
1550
SET_TX_DESC_RATE_ID_8812(pDesc, pattrib->raid);
1551
1552
/* SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G); */
1553
SET_TX_DESC_QUEUE_SEL_8812(pDesc, pattrib->qsel);
1554
/* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */
1555
1556
if (!pattrib->qos_en) {
1557
SET_TX_DESC_HWSEQ_EN_8812(pDesc, 1); /* Hw set sequence number */
1558
} else
1559
SET_TX_DESC_SEQ_8812(pDesc, pattrib->seqnum);
1560
1561
if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160)
1562
SET_TX_DESC_DATA_BW_8812(pDesc, pmp_priv->bandwidth);
1563
else {
1564
RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth);
1565
SET_TX_DESC_DATA_BW_8812(pDesc, CHANNEL_WIDTH_20);
1566
}
1567
1568
SET_TX_DESC_DISABLE_FB_8812(pDesc, 1);
1569
SET_TX_DESC_USE_RATE_8812(pDesc, 1);
1570
SET_TX_DESC_TX_RATE_8812(pDesc, pmp_priv->rateidx);
1571
1572
}
1573
#endif
1574
#if defined(CONFIG_RTL8192E)
1575
void fill_tx_desc_8192e(PADAPTER padapter)
1576
{
1577
struct mp_priv *pmp_priv = &padapter->mppriv;
1578
u8 *pDesc = (u8 *)&(pmp_priv->tx.desc);
1579
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1580
1581
u32 pkt_size = pattrib->last_txcmdsz;
1582
s32 bmcast = IS_MCAST(pattrib->ra);
1583
u8 data_rate, pwr_status, offset;
1584
1585
1586
SET_TX_DESC_PKT_SIZE_92E(pDesc, pkt_size);
1587
1588
offset = TXDESC_SIZE + OFFSET_SZ;
1589
1590
SET_TX_DESC_OFFSET_92E(pDesc, offset);
1591
#if defined(CONFIG_PCI_HCI) /* 8192EE */
1592
1593
SET_TX_DESC_PKT_OFFSET_92E(pDesc, 0); /* 8192EE pkt_offset is 0 */
1594
#else /* 8192EU 8192ES */
1595
SET_TX_DESC_PKT_OFFSET_92E(pDesc, 1);
1596
#endif
1597
1598
if (bmcast)
1599
SET_TX_DESC_BMC_92E(pDesc, 1);
1600
1601
SET_TX_DESC_MACID_92E(pDesc, pattrib->mac_id);
1602
SET_TX_DESC_RATE_ID_92E(pDesc, pattrib->raid);
1603
1604
1605
SET_TX_DESC_QUEUE_SEL_92E(pDesc, pattrib->qsel);
1606
/* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */
1607
1608
if (!pattrib->qos_en) {
1609
SET_TX_DESC_EN_HWSEQ_92E(pDesc, 1);/* Hw set sequence number */
1610
SET_TX_DESC_HWSEQ_SEL_92E(pDesc, pattrib->hw_ssn_sel);
1611
} else
1612
SET_TX_DESC_SEQ_92E(pDesc, pattrib->seqnum);
1613
1614
if ((pmp_priv->bandwidth == CHANNEL_WIDTH_20) || (pmp_priv->bandwidth == CHANNEL_WIDTH_40))
1615
SET_TX_DESC_DATA_BW_92E(pDesc, pmp_priv->bandwidth);
1616
else {
1617
RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth);
1618
SET_TX_DESC_DATA_BW_92E(pDesc, CHANNEL_WIDTH_20);
1619
}
1620
1621
/* SET_TX_DESC_DATA_SC_92E(pDesc, SCMapping_92E(padapter,pattrib)); */
1622
1623
SET_TX_DESC_DISABLE_FB_92E(pDesc, 1);
1624
SET_TX_DESC_USE_RATE_92E(pDesc, 1);
1625
SET_TX_DESC_TX_RATE_92E(pDesc, pmp_priv->rateidx);
1626
1627
}
1628
#endif
1629
1630
#if defined(CONFIG_RTL8723B)
1631
void fill_tx_desc_8723b(PADAPTER padapter)
1632
{
1633
struct mp_priv *pmp_priv = &padapter->mppriv;
1634
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1635
u8 *ptxdesc = pmp_priv->tx.desc;
1636
1637
SET_TX_DESC_AGG_BREAK_8723B(ptxdesc, 1);
1638
SET_TX_DESC_MACID_8723B(ptxdesc, pattrib->mac_id);
1639
SET_TX_DESC_QUEUE_SEL_8723B(ptxdesc, pattrib->qsel);
1640
1641
SET_TX_DESC_RATE_ID_8723B(ptxdesc, pattrib->raid);
1642
SET_TX_DESC_SEQ_8723B(ptxdesc, pattrib->seqnum);
1643
SET_TX_DESC_HWSEQ_EN_8723B(ptxdesc, 1);
1644
SET_TX_DESC_USE_RATE_8723B(ptxdesc, 1);
1645
SET_TX_DESC_DISABLE_FB_8723B(ptxdesc, 1);
1646
1647
if (pmp_priv->preamble) {
1648
if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
1649
SET_TX_DESC_DATA_SHORT_8723B(ptxdesc, 1);
1650
}
1651
1652
if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
1653
SET_TX_DESC_DATA_BW_8723B(ptxdesc, 1);
1654
1655
SET_TX_DESC_TX_RATE_8723B(ptxdesc, pmp_priv->rateidx);
1656
1657
SET_TX_DESC_DATA_RATE_FB_LIMIT_8723B(ptxdesc, 0x1F);
1658
SET_TX_DESC_RTS_RATE_FB_LIMIT_8723B(ptxdesc, 0xF);
1659
}
1660
#endif
1661
1662
#if defined(CONFIG_RTL8703B)
1663
void fill_tx_desc_8703b(PADAPTER padapter)
1664
{
1665
struct mp_priv *pmp_priv = &padapter->mppriv;
1666
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1667
u8 *ptxdesc = pmp_priv->tx.desc;
1668
1669
SET_TX_DESC_AGG_BREAK_8703B(ptxdesc, 1);
1670
SET_TX_DESC_MACID_8703B(ptxdesc, pattrib->mac_id);
1671
SET_TX_DESC_QUEUE_SEL_8703B(ptxdesc, pattrib->qsel);
1672
1673
SET_TX_DESC_RATE_ID_8703B(ptxdesc, pattrib->raid);
1674
SET_TX_DESC_SEQ_8703B(ptxdesc, pattrib->seqnum);
1675
SET_TX_DESC_HWSEQ_EN_8703B(ptxdesc, 1);
1676
SET_TX_DESC_USE_RATE_8703B(ptxdesc, 1);
1677
SET_TX_DESC_DISABLE_FB_8703B(ptxdesc, 1);
1678
1679
if (pmp_priv->preamble) {
1680
if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
1681
SET_TX_DESC_DATA_SHORT_8703B(ptxdesc, 1);
1682
}
1683
1684
if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
1685
SET_TX_DESC_DATA_BW_8703B(ptxdesc, 1);
1686
1687
SET_TX_DESC_TX_RATE_8703B(ptxdesc, pmp_priv->rateidx);
1688
1689
SET_TX_DESC_DATA_RATE_FB_LIMIT_8703B(ptxdesc, 0x1F);
1690
SET_TX_DESC_RTS_RATE_FB_LIMIT_8703B(ptxdesc, 0xF);
1691
}
1692
#endif
1693
1694
#if defined(CONFIG_RTL8188F)
1695
void fill_tx_desc_8188f(PADAPTER padapter)
1696
{
1697
struct mp_priv *pmp_priv = &padapter->mppriv;
1698
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1699
u8 *ptxdesc = pmp_priv->tx.desc;
1700
1701
SET_TX_DESC_AGG_BREAK_8188F(ptxdesc, 1);
1702
SET_TX_DESC_MACID_8188F(ptxdesc, pattrib->mac_id);
1703
SET_TX_DESC_QUEUE_SEL_8188F(ptxdesc, pattrib->qsel);
1704
1705
SET_TX_DESC_RATE_ID_8188F(ptxdesc, pattrib->raid);
1706
SET_TX_DESC_SEQ_8188F(ptxdesc, pattrib->seqnum);
1707
SET_TX_DESC_HWSEQ_EN_8188F(ptxdesc, 1);
1708
SET_TX_DESC_USE_RATE_8188F(ptxdesc, 1);
1709
SET_TX_DESC_DISABLE_FB_8188F(ptxdesc, 1);
1710
1711
if (pmp_priv->preamble)
1712
if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
1713
SET_TX_DESC_DATA_SHORT_8188F(ptxdesc, 1);
1714
1715
if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
1716
SET_TX_DESC_DATA_BW_8188F(ptxdesc, 1);
1717
1718
SET_TX_DESC_TX_RATE_8188F(ptxdesc, pmp_priv->rateidx);
1719
1720
SET_TX_DESC_DATA_RATE_FB_LIMIT_8188F(ptxdesc, 0x1F);
1721
SET_TX_DESC_RTS_RATE_FB_LIMIT_8188F(ptxdesc, 0xF);
1722
}
1723
#endif
1724
1725
#if defined(CONFIG_RTL8188GTV)
1726
void fill_tx_desc_8188gtv(PADAPTER padapter)
1727
{
1728
struct mp_priv *pmp_priv = &padapter->mppriv;
1729
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1730
u8 *ptxdesc = pmp_priv->tx.desc;
1731
1732
SET_TX_DESC_AGG_BREAK_8188GTV(ptxdesc, 1);
1733
SET_TX_DESC_MACID_8188GTV(ptxdesc, pattrib->mac_id);
1734
SET_TX_DESC_QUEUE_SEL_8188GTV(ptxdesc, pattrib->qsel);
1735
1736
SET_TX_DESC_RATE_ID_8188GTV(ptxdesc, pattrib->raid);
1737
SET_TX_DESC_SEQ_8188GTV(ptxdesc, pattrib->seqnum);
1738
SET_TX_DESC_HWSEQ_EN_8188GTV(ptxdesc, 1);
1739
SET_TX_DESC_USE_RATE_8188GTV(ptxdesc, 1);
1740
SET_TX_DESC_DISABLE_FB_8188GTV(ptxdesc, 1);
1741
1742
if (pmp_priv->preamble)
1743
if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
1744
SET_TX_DESC_DATA_SHORT_8188GTV(ptxdesc, 1);
1745
1746
if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
1747
SET_TX_DESC_DATA_BW_8188GTV(ptxdesc, 1);
1748
1749
SET_TX_DESC_TX_RATE_8188GTV(ptxdesc, pmp_priv->rateidx);
1750
1751
SET_TX_DESC_DATA_RATE_FB_LIMIT_8188GTV(ptxdesc, 0x1F);
1752
SET_TX_DESC_RTS_RATE_FB_LIMIT_8188GTV(ptxdesc, 0xF);
1753
}
1754
#endif
1755
1756
#if defined(CONFIG_RTL8723D)
1757
void fill_tx_desc_8723d(PADAPTER padapter)
1758
{
1759
struct mp_priv *pmp_priv = &padapter->mppriv;
1760
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1761
u8 *ptxdesc = pmp_priv->tx.desc;
1762
1763
SET_TX_DESC_BK_8723D(ptxdesc, 1);
1764
SET_TX_DESC_MACID_8723D(ptxdesc, pattrib->mac_id);
1765
SET_TX_DESC_QUEUE_SEL_8723D(ptxdesc, pattrib->qsel);
1766
1767
SET_TX_DESC_RATE_ID_8723D(ptxdesc, pattrib->raid);
1768
SET_TX_DESC_SEQ_8723D(ptxdesc, pattrib->seqnum);
1769
SET_TX_DESC_HWSEQ_EN_8723D(ptxdesc, 1);
1770
SET_TX_DESC_USE_RATE_8723D(ptxdesc, 1);
1771
SET_TX_DESC_DISABLE_FB_8723D(ptxdesc, 1);
1772
1773
if (pmp_priv->preamble) {
1774
if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
1775
SET_TX_DESC_DATA_SHORT_8723D(ptxdesc, 1);
1776
}
1777
1778
if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
1779
SET_TX_DESC_DATA_BW_8723D(ptxdesc, 1);
1780
1781
SET_TX_DESC_TX_RATE_8723D(ptxdesc, pmp_priv->rateidx);
1782
1783
SET_TX_DESC_DATA_RATE_FB_LIMIT_8723D(ptxdesc, 0x1F);
1784
SET_TX_DESC_RTS_RATE_FB_LIMIT_8723D(ptxdesc, 0xF);
1785
}
1786
#endif
1787
1788
#if defined(CONFIG_RTL8710B)
1789
void fill_tx_desc_8710b(PADAPTER padapter)
1790
{
1791
struct mp_priv *pmp_priv = &padapter->mppriv;
1792
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1793
u8 *ptxdesc = pmp_priv->tx.desc;
1794
1795
SET_TX_DESC_BK_8710B(ptxdesc, 1);
1796
SET_TX_DESC_MACID_8710B(ptxdesc, pattrib->mac_id);
1797
SET_TX_DESC_QUEUE_SEL_8710B(ptxdesc, pattrib->qsel);
1798
1799
SET_TX_DESC_RATE_ID_8710B(ptxdesc, pattrib->raid);
1800
SET_TX_DESC_SEQ_8710B(ptxdesc, pattrib->seqnum);
1801
SET_TX_DESC_HWSEQ_EN_8710B(ptxdesc, 1);
1802
SET_TX_DESC_USE_RATE_8710B(ptxdesc, 1);
1803
SET_TX_DESC_DISABLE_FB_8710B(ptxdesc, 1);
1804
1805
if (pmp_priv->preamble) {
1806
if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
1807
SET_TX_DESC_DATA_SHORT_8710B(ptxdesc, 1);
1808
}
1809
1810
if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
1811
SET_TX_DESC_DATA_BW_8710B(ptxdesc, 1);
1812
1813
SET_TX_DESC_TX_RATE_8710B(ptxdesc, pmp_priv->rateidx);
1814
1815
SET_TX_DESC_DATA_RATE_FB_LIMIT_8710B(ptxdesc, 0x1F);
1816
SET_TX_DESC_RTS_RATE_FB_LIMIT_8710B(ptxdesc, 0xF);
1817
}
1818
#endif
1819
1820
#if defined(CONFIG_RTL8192F)
1821
void fill_tx_desc_8192f(PADAPTER padapter)
1822
{
1823
struct mp_priv *pmp_priv = &padapter->mppriv;
1824
struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
1825
u8 *ptxdesc = pmp_priv->tx.desc;
1826
1827
SET_TX_DESC_BK_8192F(ptxdesc, 1);
1828
SET_TX_DESC_MACID_8192F(ptxdesc, pattrib->mac_id);
1829
SET_TX_DESC_QUEUE_SEL_8192F(ptxdesc, pattrib->qsel);
1830
1831
SET_TX_DESC_RATE_ID_8192F(ptxdesc, pattrib->raid);
1832
SET_TX_DESC_SEQ_8192F(ptxdesc, pattrib->seqnum);
1833
SET_TX_DESC_HWSEQ_EN_8192F(ptxdesc, 1);
1834
SET_TX_DESC_USE_RATE_8192F(ptxdesc, 1);
1835
SET_TX_DESC_DISABLE_FB_8192F(ptxdesc, 1);
1836
1837
if (pmp_priv->preamble) {
1838
if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
1839
SET_TX_DESC_DATA_SHORT_8192F(ptxdesc, 1);
1840
}
1841
1842
if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
1843
SET_TX_DESC_DATA_BW_8192F(ptxdesc, 1);
1844
1845
SET_TX_DESC_TX_RATE_8192F(ptxdesc, pmp_priv->rateidx);
1846
1847
SET_TX_DESC_DATA_RATE_FB_LIMIT_8192F(ptxdesc, 0x1F);
1848
SET_TX_DESC_RTS_RATE_FB_LIMIT_8192F(ptxdesc, 0xF);
1849
}
1850
1851
#endif
1852
static void Rtw_MPSetMacTxEDCA(PADAPTER padapter)
1853
{
1854
1855
rtw_write32(padapter, 0x508 , 0x00a422); /* Disable EDCA BE Txop for MP pkt tx adjust Packet interval */
1856
/* RTW_INFO("%s:write 0x508~~~~~~ 0x%x\n", __func__,rtw_read32(padapter, 0x508)); */
1857
phy_set_mac_reg(padapter, 0x458 , bMaskDWord , 0x0);
1858
/*RTW_INFO("%s()!!!!! 0x460 = 0x%x\n" ,__func__, phy_query_bb_reg(padapter, 0x460, bMaskDWord));*/
1859
phy_set_mac_reg(padapter, 0x460 , bMaskLWord , 0x0); /* fast EDCA queue packet interval & time out value*/
1860
/*phy_set_mac_reg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C);*/
1861
/*phy_set_mac_reg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C);*/
1862
/*phy_set_mac_reg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C);*/
1863
RTW_INFO("%s()!!!!! 0x460 = 0x%x\n" , __func__, phy_query_bb_reg(padapter, 0x460, bMaskDWord));
1864
1865
}
1866
1867
void SetPacketTx(PADAPTER padapter)
1868
{
1869
u8 *ptr, *pkt_start, *pkt_end;
1870
u32 pkt_size = 0, i = 0, idx = 0, tmp_idx = 0;
1871
struct rtw_ieee80211_hdr *hdr;
1872
u8 payload;
1873
s32 bmcast;
1874
struct pkt_attrib *pattrib;
1875
struct mp_priv *pmp_priv;
1876
1877
pmp_priv = &padapter->mppriv;
1878
1879
if (pmp_priv->tx.stop)
1880
return;
1881
pmp_priv->tx.sended = 0;
1882
pmp_priv->tx.stop = 0;
1883
pmp_priv->tx_pktcount = 0;
1884
1885
/* 3 1. update_attrib() */
1886
pattrib = &pmp_priv->tx.attrib;
1887
_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
1888
_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
1889
_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
1890
bmcast = IS_MCAST(pattrib->ra);
1891
if (bmcast)
1892
pattrib->psta = rtw_get_bcmc_stainfo(padapter);
1893
else
1894
pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
1895
1896
pattrib->mac_id = pattrib->psta->cmn.mac_id;
1897
pattrib->mbssid = 0;
1898
1899
pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen;
1900
1901
/* 3 2. allocate xmit buffer */
1902
pkt_size = pattrib->last_txcmdsz;
1903
1904
if (pmp_priv->tx.pallocated_buf)
1905
rtw_mfree(pmp_priv->tx.pallocated_buf, pmp_priv->tx.buf_size);
1906
pmp_priv->tx.write_size = pkt_size;
1907
pmp_priv->tx.buf_size = pkt_size + XMITBUF_ALIGN_SZ;
1908
pmp_priv->tx.pallocated_buf = rtw_zmalloc(pmp_priv->tx.buf_size);
1909
if (pmp_priv->tx.pallocated_buf == NULL) {
1910
RTW_INFO("%s: malloc(%d) fail!!\n", __func__, pmp_priv->tx.buf_size);
1911
return;
1912
}
1913
pmp_priv->tx.buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pmp_priv->tx.pallocated_buf), XMITBUF_ALIGN_SZ);
1914
ptr = pmp_priv->tx.buf;
1915
1916
_rtw_memset(pmp_priv->tx.desc, 0, TXDESC_SIZE);
1917
pkt_start = ptr;
1918
pkt_end = pkt_start + pkt_size;
1919
1920
/* 3 3. init TX descriptor */
1921
#if defined(CONFIG_RTL8188E)
1922
if (IS_HARDWARE_TYPE_8188E(padapter))
1923
fill_tx_desc_8188e(padapter);
1924
#endif
1925
1926
#if defined(CONFIG_RTL8814A)
1927
if (IS_HARDWARE_TYPE_8814A(padapter))
1928
fill_tx_desc_8814a(padapter);
1929
#endif /* defined(CONFIG_RTL8814A) */
1930
1931
#if defined(CONFIG_RTL8822B)
1932
if (IS_HARDWARE_TYPE_8822B(padapter))
1933
rtl8822b_prepare_mp_txdesc(padapter, pmp_priv);
1934
#endif /* CONFIG_RTL8822B */
1935
1936
#if defined(CONFIG_RTL8822C)
1937
if (IS_HARDWARE_TYPE_8822C(padapter))
1938
rtl8822c_prepare_mp_txdesc(padapter, pmp_priv);
1939
#endif /* CONFIG_RTL8822C */
1940
1941
#if defined(CONFIG_RTL8821C)
1942
if (IS_HARDWARE_TYPE_8821C(padapter))
1943
rtl8821c_prepare_mp_txdesc(padapter, pmp_priv);
1944
#endif /* CONFIG_RTL8821C */
1945
1946
#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
1947
if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter))
1948
fill_tx_desc_8812a(padapter);
1949
#endif
1950
1951
#if defined(CONFIG_RTL8192E)
1952
if (IS_HARDWARE_TYPE_8192E(padapter))
1953
fill_tx_desc_8192e(padapter);
1954
#endif
1955
#if defined(CONFIG_RTL8723B)
1956
if (IS_HARDWARE_TYPE_8723B(padapter))
1957
fill_tx_desc_8723b(padapter);
1958
#endif
1959
#if defined(CONFIG_RTL8703B)
1960
if (IS_HARDWARE_TYPE_8703B(padapter))
1961
fill_tx_desc_8703b(padapter);
1962
#endif
1963
1964
#if defined(CONFIG_RTL8188F)
1965
if (IS_HARDWARE_TYPE_8188F(padapter))
1966
fill_tx_desc_8188f(padapter);
1967
#endif
1968
1969
#if defined(CONFIG_RTL8188GTV)
1970
if (IS_HARDWARE_TYPE_8188GTV(padapter))
1971
fill_tx_desc_8188gtv(padapter);
1972
#endif
1973
1974
#if defined(CONFIG_RTL8723D)
1975
if (IS_HARDWARE_TYPE_8723D(padapter))
1976
fill_tx_desc_8723d(padapter);
1977
#endif
1978
#if defined(CONFIG_RTL8192F)
1979
if (IS_HARDWARE_TYPE_8192F(padapter))
1980
fill_tx_desc_8192f(padapter);
1981
#endif
1982
1983
#if defined(CONFIG_RTL8710B)
1984
if (IS_HARDWARE_TYPE_8710B(padapter))
1985
fill_tx_desc_8710b(padapter);
1986
#endif
1987
1988
#if defined(CONFIG_RTL8814B)
1989
if (IS_HARDWARE_TYPE_8814B(padapter))
1990
rtl8814b_prepare_mp_txdesc(padapter, pmp_priv);
1991
#endif /* CONFIG_RTL8814B */
1992
1993
/* 3 4. make wlan header, make_wlanhdr() */
1994
hdr = (struct rtw_ieee80211_hdr *)pkt_start;
1995
set_frame_sub_type(&hdr->frame_ctl, pattrib->subtype);
1996
1997
_rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); /* DA */
1998
_rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); /* SA */
1999
_rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); /* RA, BSSID */
2000
2001
/* 3 5. make payload */
2002
ptr = pkt_start + pattrib->hdrlen;
2003
2004
if (pmp_priv->mplink_btx == _TRUE) {
2005
_rtw_memcpy(ptr, pmp_priv->mplink_buf, pkt_end - ptr);
2006
} else {
2007
switch (pmp_priv->tx.payload) {
2008
case MP_TX_Payload_00:
2009
RTW_INFO("MP packet tx 0x00 payload!\n");
2010
payload = 0x00;
2011
_rtw_memset(ptr, 0x00, pkt_end - ptr);
2012
break;
2013
case MP_TX_Payload_5a:
2014
RTW_INFO("MP packet tx 0x5a payload!\n");
2015
payload = 0x5a;
2016
_rtw_memset(ptr, 0x5a, pkt_end - ptr);
2017
break;
2018
case MP_TX_Payload_a5:
2019
RTW_INFO("MP packet tx 0xa5 payload!\n");
2020
payload = 0xa5;
2021
_rtw_memset(ptr, 0xa5, pkt_end - ptr);
2022
break;
2023
case MP_TX_Payload_ff:
2024
RTW_INFO("MP packet tx 0xff payload!\n");
2025
payload = 0xff;
2026
_rtw_memset(ptr, 0xff, pkt_end - ptr);
2027
break;
2028
case MP_TX_Payload_prbs9:
2029
RTW_INFO("MP packet tx PRBS9 payload!\n");
2030
while (idx <= pkt_end - ptr) {
2031
int start = 0x02;
2032
int a = start;
2033
2034
for (i = 0;; i++) {
2035
int newbit = (((a >> 8) ^ (a >> 4)) & 1);
2036
a = ((a << 1) | newbit) & 0x1ff;
2037
RTW_DBG("%x ", a);
2038
ptr[idx + i] = a;
2039
2040
if (a == start) {
2041
RTW_INFO("payload repetition period is %d , end %d\n", i , idx);
2042
tmp_idx += i;
2043
break;
2044
}
2045
if (idx + i >= (pkt_end - ptr)) {
2046
tmp_idx += (idx + i);
2047
RTW_INFO(" repetition period payload end curr ptr %d\n", idx + i);
2048
break;
2049
}
2050
}
2051
idx = tmp_idx;
2052
}
2053
break;
2054
case MP_TX_Payload_default_random:
2055
RTW_INFO("MP packet tx default random payload!\n");
2056
for (i = 0; i < pkt_end - ptr; i++)
2057
ptr[i] = rtw_random32() % 0xFF;
2058
break;
2059
default:
2060
RTW_INFO("Config payload type default use 0x%x\n!", pmp_priv->tx.payload);
2061
_rtw_memset(ptr, pmp_priv->tx.payload, pkt_end - ptr);
2062
break;
2063
}
2064
}
2065
/* 3 6. start thread */
2066
#ifdef PLATFORM_LINUX
2067
pmp_priv->tx.PktTxThread = kthread_run(mp_xmit_packet_thread, pmp_priv, "RTW_MP_THREAD");
2068
if (IS_ERR(pmp_priv->tx.PktTxThread)) {
2069
RTW_ERR("Create PktTx Thread Fail !!!!!\n");
2070
pmp_priv->tx.PktTxThread = NULL;
2071
}
2072
#endif
2073
#ifdef PLATFORM_FREEBSD
2074
{
2075
struct proc *p;
2076
struct thread *td;
2077
pmp_priv->tx.PktTxThread = kproc_kthread_add(mp_xmit_packet_thread, pmp_priv,
2078
&p, &td, RFHIGHPID, 0, "MPXmitThread", "MPXmitThread");
2079
2080
if (pmp_priv->tx.PktTxThread < 0)
2081
RTW_INFO("Create PktTx Thread Fail !!!!!\n");
2082
}
2083
#endif
2084
2085
Rtw_MPSetMacTxEDCA(padapter);
2086
return;
2087
}
2088
2089
void SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB)
2090
{
2091
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
2092
struct mp_priv *pmppriv = &pAdapter->mppriv;
2093
2094
2095
if (bStartRx) {
2096
#ifdef CONFIG_RTL8723B
2097
phy_set_mac_reg(pAdapter, 0xe70, BIT23 | BIT22, 0x3); /* Power on adc (in RX_WAIT_CCA state) */
2098
write_bbreg(pAdapter, 0xa01, BIT0, bDisable);/* improve Rx performance by jerry */
2099
#endif
2100
pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AMF | RCR_HTC_LOC_CTRL;
2101
pHalData->ReceiveConfig |= RCR_ACRC32;
2102
pHalData->ReceiveConfig |= RCR_APP_PHYST_RXFF | RCR_APP_ICV | RCR_APP_MIC;
2103
2104
if (pmppriv->bSetRxBssid == _TRUE) {
2105
RTW_INFO("%s: pmppriv->network_macaddr=" MAC_FMT "\n", __func__,
2106
MAC_ARG(pmppriv->network_macaddr));
2107
pHalData->ReceiveConfig = 0;
2108
pHalData->ReceiveConfig |= RCR_CBSSID_DATA | RCR_CBSSID_BCN |RCR_APM | RCR_AM | RCR_AB |RCR_AMF;
2109
pHalData->ReceiveConfig |= RCR_APP_PHYST_RXFF;
2110
2111
#if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8822C)
2112
write_bbreg(pAdapter, 0x550, BIT3, bEnable);
2113
#endif
2114
rtw_write16(pAdapter, REG_RXFLTMAP0, 0xFFEF); /* REG_RXFLTMAP0 (RX Filter Map Group 0) */
2115
pmppriv->brx_filter_beacon = _TRUE;
2116
2117
} else {
2118
pHalData->ReceiveConfig |= RCR_ADF;
2119
/* Accept all data frames */
2120
rtw_write16(pAdapter, REG_RXFLTMAP2, 0xFFFF);
2121
}
2122
2123
if (bAB)
2124
pHalData->ReceiveConfig |= RCR_AB;
2125
} else {
2126
#ifdef CONFIG_RTL8723B
2127
phy_set_mac_reg(pAdapter, 0xe70, BIT23 | BIT22, 0x00); /* Power off adc (in RX_WAIT_CCA state)*/
2128
write_bbreg(pAdapter, 0xa01, BIT0, bEnable);/* improve Rx performance by jerry */
2129
#endif
2130
pHalData->ReceiveConfig = 0;
2131
rtw_write16(pAdapter, REG_RXFLTMAP0, 0xFFFF); /* REG_RXFLTMAP0 (RX Filter Map Group 0) */
2132
}
2133
2134
rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig);
2135
}
2136
2137
void ResetPhyRxPktCount(PADAPTER pAdapter)
2138
{
2139
u32 i, phyrx_set = 0;
2140
2141
for (i = 0; i <= 0xF; i++) {
2142
phyrx_set = 0;
2143
phyrx_set |= _RXERR_RPT_SEL(i); /* select */
2144
phyrx_set |= RXERR_RPT_RST; /* set counter to zero */
2145
rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set);
2146
}
2147
}
2148
2149
static u32 GetPhyRxPktCounts(PADAPTER pAdapter, u32 selbit)
2150
{
2151
/* selection */
2152
u32 phyrx_set = 0, count = 0;
2153
2154
phyrx_set = _RXERR_RPT_SEL(selbit & 0xF);
2155
rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set);
2156
2157
/* Read packet count */
2158
count = rtw_read32(pAdapter, REG_RXERR_RPT) & RXERR_COUNTER_MASK;
2159
2160
return count;
2161
}
2162
2163
u32 GetPhyRxPktReceived(PADAPTER pAdapter)
2164
{
2165
u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;
2166
2167
OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_OK);
2168
CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_OK);
2169
HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_OK);
2170
2171
return OFDM_cnt + CCK_cnt + HT_cnt;
2172
}
2173
2174
u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter)
2175
{
2176
u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;
2177
2178
OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_FAIL);
2179
CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_FAIL);
2180
HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_FAIL);
2181
2182
return OFDM_cnt + CCK_cnt + HT_cnt;
2183
}
2184
2185
struct psd_init_regs {
2186
/* 3 wire */
2187
int reg_88c;
2188
int reg_c00;
2189
int reg_e00;
2190
int reg_1800;
2191
int reg_1a00;
2192
/* cck */
2193
int reg_800;
2194
int reg_808;
2195
};
2196
2197
static int rtw_mp_psd_init(PADAPTER padapter, struct psd_init_regs *regs)
2198
{
2199
HAL_DATA_TYPE *phal_data = GET_HAL_DATA(padapter);
2200
2201
switch (phal_data->rf_type) {
2202
/* 1R */
2203
case RF_1T1R:
2204
if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {
2205
/* 11AC 1R PSD Setting 3wire & cck off */
2206
regs->reg_c00 = rtw_read32(padapter, 0xC00);
2207
phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);
2208
regs->reg_808 = rtw_read32(padapter, 0x808);
2209
phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);
2210
} else {
2211
/* 11N 3-wire off 1 */
2212
regs->reg_88c = rtw_read32(padapter, 0x88C);
2213
phy_set_bb_reg(padapter, 0x88C, 0x300000, 0x3);
2214
/* 11N CCK off */
2215
regs->reg_800 = rtw_read32(padapter, 0x800);
2216
phy_set_bb_reg(padapter, 0x800, 0x1000000, 0x0);
2217
}
2218
break;
2219
2220
/* 2R */
2221
case RF_1T2R:
2222
case RF_2T2R:
2223
if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {
2224
/* 11AC 2R PSD Setting 3wire & cck off */
2225
regs->reg_c00 = rtw_read32(padapter, 0xC00);
2226
regs->reg_e00 = rtw_read32(padapter, 0xE00);
2227
phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);
2228
phy_set_bb_reg(padapter, 0xE00, 0x3, 0x00);
2229
regs->reg_808 = rtw_read32(padapter, 0x808);
2230
phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);
2231
} else {
2232
/* 11N 3-wire off 2 */
2233
regs->reg_88c = rtw_read32(padapter, 0x88C);
2234
phy_set_bb_reg(padapter, 0x88C, 0xF00000, 0xF);
2235
/* 11N CCK off */
2236
regs->reg_800 = rtw_read32(padapter, 0x800);
2237
phy_set_bb_reg(padapter, 0x800, 0x1000000, 0x0);
2238
}
2239
break;
2240
2241
/* 3R */
2242
case RF_2T3R:
2243
case RF_3T3R:
2244
if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {
2245
/* 11AC 3R PSD Setting 3wire & cck off */
2246
regs->reg_c00 = rtw_read32(padapter, 0xC00);
2247
regs->reg_e00 = rtw_read32(padapter, 0xE00);
2248
regs->reg_1800 = rtw_read32(padapter, 0x1800);
2249
phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);
2250
phy_set_bb_reg(padapter, 0xE00, 0x3, 0x00);
2251
phy_set_bb_reg(padapter, 0x1800, 0x3, 0x00);
2252
regs->reg_808 = rtw_read32(padapter, 0x808);
2253
phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);
2254
} else {
2255
RTW_ERR("%s: 11n don't support 3R\n", __func__);
2256
return -1;
2257
}
2258
break;
2259
2260
/* 4R */
2261
case RF_2T4R:
2262
case RF_3T4R:
2263
case RF_4T4R:
2264
if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {
2265
/* 11AC 4R PSD Setting 3wire & cck off */
2266
regs->reg_c00 = rtw_read32(padapter, 0xC00);
2267
regs->reg_e00 = rtw_read32(padapter, 0xE00);
2268
regs->reg_1800 = rtw_read32(padapter, 0x1800);
2269
regs->reg_1a00 = rtw_read32(padapter, 0x1A00);
2270
phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);
2271
phy_set_bb_reg(padapter, 0xE00, 0x3, 0x00);
2272
phy_set_bb_reg(padapter, 0x1800, 0x3, 0x00);
2273
phy_set_bb_reg(padapter, 0x1A00, 0x3, 0x00);
2274
regs->reg_808 = rtw_read32(padapter, 0x808);
2275
phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);
2276
} else {
2277
RTW_ERR("%s: 11n don't support 4R\n", __func__);
2278
return -1;
2279
}
2280
break;
2281
2282
default:
2283
RTW_ERR("%s: unknown %d rf type\n", __func__, phal_data->rf_type);
2284
return -1;
2285
}
2286
2287
/* Set PSD points, 0=128, 1=256, 2=512, 3=1024 */
2288
if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC))
2289
phy_set_bb_reg(padapter, 0x910, 0xC000, 3);
2290
else
2291
phy_set_bb_reg(padapter, 0x808, 0xC000, 3);
2292
2293
RTW_INFO("%s: set %d rf type done\n", __func__, phal_data->rf_type);
2294
return 0;
2295
}
2296
2297
static int rtw_mp_psd_close(PADAPTER padapter, struct psd_init_regs *regs)
2298
{
2299
HAL_DATA_TYPE *phal_data = GET_HAL_DATA(padapter);
2300
2301
2302
if (!hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {
2303
/* 11n 3wire restore */
2304
rtw_write32(padapter, 0x88C, regs->reg_88c);
2305
/* 11n cck restore */
2306
rtw_write32(padapter, 0x800, regs->reg_800);
2307
RTW_INFO("%s: restore %d rf type\n", __func__, phal_data->rf_type);
2308
return 0;
2309
}
2310
2311
/* 11ac 3wire restore */
2312
switch (phal_data->rf_type) {
2313
case RF_1T1R:
2314
rtw_write32(padapter, 0xC00, regs->reg_c00);
2315
break;
2316
case RF_1T2R:
2317
case RF_2T2R:
2318
rtw_write32(padapter, 0xC00, regs->reg_c00);
2319
rtw_write32(padapter, 0xE00, regs->reg_e00);
2320
break;
2321
case RF_2T3R:
2322
case RF_3T3R:
2323
rtw_write32(padapter, 0xC00, regs->reg_c00);
2324
rtw_write32(padapter, 0xE00, regs->reg_e00);
2325
rtw_write32(padapter, 0x1800, regs->reg_1800);
2326
break;
2327
case RF_2T4R:
2328
case RF_3T4R:
2329
case RF_4T4R:
2330
rtw_write32(padapter, 0xC00, regs->reg_c00);
2331
rtw_write32(padapter, 0xE00, regs->reg_e00);
2332
rtw_write32(padapter, 0x1800, regs->reg_1800);
2333
rtw_write32(padapter, 0x1A00, regs->reg_1a00);
2334
break;
2335
default:
2336
RTW_WARN("%s: unknown %d rf type\n", __func__, phal_data->rf_type);
2337
break;
2338
}
2339
2340
/* 11ac cck restore */
2341
rtw_write32(padapter, 0x808, regs->reg_808);
2342
RTW_INFO("%s: restore %d rf type done\n", __func__, phal_data->rf_type);
2343
return 0;
2344
}
2345
2346
/* reg 0x808[9:0]: FFT data x
2347
* reg 0x808[22]: 0 --> 1 to get 1 FFT data y
2348
* reg 0x8B4[15:0]: FFT data y report */
2349
static u32 rtw_GetPSDData(PADAPTER pAdapter, u32 point)
2350
{
2351
u32 psd_val = 0;
2352
2353
#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8822C)
2354
u16 psd_reg = 0x910;
2355
u16 psd_regL = 0xF44;
2356
#else
2357
u16 psd_reg = 0x808;
2358
u16 psd_regL = 0x8B4;
2359
#endif
2360
2361
psd_val = rtw_read32(pAdapter, psd_reg);
2362
2363
psd_val &= 0xFFBFFC00;
2364
psd_val |= point;
2365
2366
rtw_write32(pAdapter, psd_reg, psd_val);
2367
rtw_mdelay_os(1);
2368
psd_val |= 0x00400000;
2369
2370
rtw_write32(pAdapter, psd_reg, psd_val);
2371
rtw_mdelay_os(1);
2372
2373
psd_val = rtw_read32(pAdapter, psd_regL);
2374
#if defined(CONFIG_RTL8821C)
2375
psd_val = (psd_val & 0x00FFFFFF) / 32;
2376
#else
2377
psd_val &= 0x0000FFFF;
2378
#endif
2379
2380
return psd_val;
2381
}
2382
2383
/*
2384
* pts start_point_min stop_point_max
2385
* 128 64 64 + 128 = 192
2386
* 256 128 128 + 256 = 384
2387
* 512 256 256 + 512 = 768
2388
* 1024 512 512 + 1024 = 1536
2389
*
2390
*/
2391
u32 mp_query_psd(PADAPTER pAdapter, u8 *data)
2392
{
2393
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2394
struct dm_struct *p_dm = adapter_to_phydm(pAdapter);
2395
2396
u32 i, psd_pts = 0, psd_start = 0, psd_stop = 0;
2397
u32 psd_data = 0;
2398
struct psd_init_regs regs = {};
2399
int psd_analysis = 0;
2400
2401
2402
#ifdef PLATFORM_LINUX
2403
if (!netif_running(pAdapter->pnetdev)) {
2404
return 0;
2405
}
2406
#endif
2407
2408
if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {
2409
return 0;
2410
}
2411
2412
if (strlen(data) == 0) { /* default value */
2413
psd_pts = 128;
2414
psd_start = 64;
2415
psd_stop = 128;
2416
} else if (strncmp(data, "analysis,", 9) == 0) {
2417
if (rtw_mp_psd_init(pAdapter, &regs) != 0)
2418
return 0;
2419
psd_analysis = 1;
2420
sscanf(data + 9, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop);
2421
} else
2422
sscanf(data, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop);
2423
2424
data[0] = '\0';
2425
2426
if (IS_HARDWARE_TYPE_8822C(pAdapter)) {
2427
u32 *psdbuf = rtw_zmalloc(sizeof(u32)*256);
2428
2429
if (psdbuf == NULL) {
2430
RTW_INFO("%s: psd buf malloc fail!!\n", __func__);
2431
return 0;
2432
}
2433
2434
halrf_cmn_info_set(p_dm, HALRF_CMNINFO_MP_PSD_POINT, psd_pts);
2435
halrf_cmn_info_set(p_dm, HALRF_CMNINFO_MP_PSD_START_POINT, psd_start);
2436
halrf_cmn_info_set(p_dm, HALRF_CMNINFO_MP_PSD_STOP_POINT, psd_stop);
2437
halrf_cmn_info_set(p_dm, HALRF_CMNINFO_MP_PSD_AVERAGE, 0x20000);
2438
2439
halrf_psd_init(p_dm);
2440
#ifdef CONFIG_LONG_DELAY_ISSUE
2441
rtw_msleep_os(100);
2442
#else
2443
rtw_mdelay_os(100);
2444
#endif
2445
halrf_psd_query(p_dm, psdbuf, 256);
2446
2447
i = 0;
2448
while (i < 256) {
2449
sprintf(data, "%s%x ", data, (psdbuf[i]));
2450
i++;
2451
}
2452
2453
if (psdbuf)
2454
rtw_mfree(psdbuf, sizeof(u32)*256);
2455
2456
} else {
2457
i = psd_start;
2458
while (i < psd_stop) {
2459
if (i >= psd_pts)
2460
psd_data = rtw_GetPSDData(pAdapter, i - psd_pts);
2461
else
2462
psd_data = rtw_GetPSDData(pAdapter, i);
2463
2464
sprintf(data, "%s%x ", data, psd_data);
2465
i++;
2466
}
2467
2468
}
2469
2470
#ifdef CONFIG_LONG_DELAY_ISSUE
2471
rtw_msleep_os(100);
2472
#else
2473
rtw_mdelay_os(100);
2474
#endif
2475
2476
if (psd_analysis)
2477
rtw_mp_psd_close(pAdapter, &regs);
2478
2479
return strlen(data) + 1;
2480
}
2481
2482
2483
#if 0
2484
void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv)
2485
{
2486
int i, res;
2487
_adapter *padapter = pxmitpriv->adapter;
2488
struct xmit_frame *pxmitframe = (struct xmit_frame *) pxmitpriv->pxmit_frame_buf;
2489
struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
2490
2491
u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
2492
u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
2493
if (padapter->registrypriv.mp_mode == 0) {
2494
max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
2495
num_xmit_extbuf = NR_XMIT_EXTBUFF;
2496
} else {
2497
max_xmit_extbuf_size = 6000;
2498
num_xmit_extbuf = 8;
2499
}
2500
2501
pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
2502
for (i = 0; i < num_xmit_extbuf; i++) {
2503
rtw_os_xmit_resource_free(padapter, pxmitbuf, (max_xmit_extbuf_size + XMITBUF_ALIGN_SZ), _FALSE);
2504
2505
pxmitbuf++;
2506
}
2507
2508
if (pxmitpriv->pallocated_xmit_extbuf)
2509
rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
2510
2511
if (padapter->registrypriv.mp_mode == 0) {
2512
max_xmit_extbuf_size = 6000;
2513
num_xmit_extbuf = 8;
2514
} else {
2515
max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
2516
num_xmit_extbuf = NR_XMIT_EXTBUFF;
2517
}
2518
2519
/* Init xmit extension buff */
2520
_rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);
2521
2522
pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
2523
2524
if (pxmitpriv->pallocated_xmit_extbuf == NULL) {
2525
res = _FAIL;
2526
goto exit;
2527
}
2528
2529
pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4);
2530
2531
pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
2532
2533
for (i = 0; i < num_xmit_extbuf; i++) {
2534
_rtw_init_listhead(&pxmitbuf->list);
2535
2536
pxmitbuf->priv_data = NULL;
2537
pxmitbuf->padapter = padapter;
2538
pxmitbuf->buf_tag = XMITBUF_MGNT;
2539
2540
res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE);
2541
if (res == _FAIL) {
2542
res = _FAIL;
2543
goto exit;
2544
}
2545
2546
#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2547
pxmitbuf->phead = pxmitbuf->pbuf;
2548
pxmitbuf->pend = pxmitbuf->pbuf + max_xmit_extbuf_size;
2549
pxmitbuf->len = 0;
2550
pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
2551
#endif
2552
2553
rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue));
2554
#ifdef DBG_XMIT_BUF_EXT
2555
pxmitbuf->no = i;
2556
#endif
2557
pxmitbuf++;
2558
2559
}
2560
2561
pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf;
2562
2563
exit:
2564
;
2565
}
2566
#endif
2567
2568
u8
2569
mpt_to_mgnt_rate(
2570
u32 MptRateIdx
2571
)
2572
{
2573
/* Mapped to MGN_XXX defined in MgntGen.h */
2574
switch (MptRateIdx) {
2575
/* CCK rate. */
2576
case MPT_RATE_1M:
2577
return MGN_1M;
2578
case MPT_RATE_2M:
2579
return MGN_2M;
2580
case MPT_RATE_55M:
2581
return MGN_5_5M;
2582
case MPT_RATE_11M:
2583
return MGN_11M;
2584
2585
/* OFDM rate. */
2586
case MPT_RATE_6M:
2587
return MGN_6M;
2588
case MPT_RATE_9M:
2589
return MGN_9M;
2590
case MPT_RATE_12M:
2591
return MGN_12M;
2592
case MPT_RATE_18M:
2593
return MGN_18M;
2594
case MPT_RATE_24M:
2595
return MGN_24M;
2596
case MPT_RATE_36M:
2597
return MGN_36M;
2598
case MPT_RATE_48M:
2599
return MGN_48M;
2600
case MPT_RATE_54M:
2601
return MGN_54M;
2602
2603
/* HT rate. */
2604
case MPT_RATE_MCS0:
2605
return MGN_MCS0;
2606
case MPT_RATE_MCS1:
2607
return MGN_MCS1;
2608
case MPT_RATE_MCS2:
2609
return MGN_MCS2;
2610
case MPT_RATE_MCS3:
2611
return MGN_MCS3;
2612
case MPT_RATE_MCS4:
2613
return MGN_MCS4;
2614
case MPT_RATE_MCS5:
2615
return MGN_MCS5;
2616
case MPT_RATE_MCS6:
2617
return MGN_MCS6;
2618
case MPT_RATE_MCS7:
2619
return MGN_MCS7;
2620
case MPT_RATE_MCS8:
2621
return MGN_MCS8;
2622
case MPT_RATE_MCS9:
2623
return MGN_MCS9;
2624
case MPT_RATE_MCS10:
2625
return MGN_MCS10;
2626
case MPT_RATE_MCS11:
2627
return MGN_MCS11;
2628
case MPT_RATE_MCS12:
2629
return MGN_MCS12;
2630
case MPT_RATE_MCS13:
2631
return MGN_MCS13;
2632
case MPT_RATE_MCS14:
2633
return MGN_MCS14;
2634
case MPT_RATE_MCS15:
2635
return MGN_MCS15;
2636
case MPT_RATE_MCS16:
2637
return MGN_MCS16;
2638
case MPT_RATE_MCS17:
2639
return MGN_MCS17;
2640
case MPT_RATE_MCS18:
2641
return MGN_MCS18;
2642
case MPT_RATE_MCS19:
2643
return MGN_MCS19;
2644
case MPT_RATE_MCS20:
2645
return MGN_MCS20;
2646
case MPT_RATE_MCS21:
2647
return MGN_MCS21;
2648
case MPT_RATE_MCS22:
2649
return MGN_MCS22;
2650
case MPT_RATE_MCS23:
2651
return MGN_MCS23;
2652
case MPT_RATE_MCS24:
2653
return MGN_MCS24;
2654
case MPT_RATE_MCS25:
2655
return MGN_MCS25;
2656
case MPT_RATE_MCS26:
2657
return MGN_MCS26;
2658
case MPT_RATE_MCS27:
2659
return MGN_MCS27;
2660
case MPT_RATE_MCS28:
2661
return MGN_MCS28;
2662
case MPT_RATE_MCS29:
2663
return MGN_MCS29;
2664
case MPT_RATE_MCS30:
2665
return MGN_MCS30;
2666
case MPT_RATE_MCS31:
2667
return MGN_MCS31;
2668
2669
/* VHT rate. */
2670
case MPT_RATE_VHT1SS_MCS0:
2671
return MGN_VHT1SS_MCS0;
2672
case MPT_RATE_VHT1SS_MCS1:
2673
return MGN_VHT1SS_MCS1;
2674
case MPT_RATE_VHT1SS_MCS2:
2675
return MGN_VHT1SS_MCS2;
2676
case MPT_RATE_VHT1SS_MCS3:
2677
return MGN_VHT1SS_MCS3;
2678
case MPT_RATE_VHT1SS_MCS4:
2679
return MGN_VHT1SS_MCS4;
2680
case MPT_RATE_VHT1SS_MCS5:
2681
return MGN_VHT1SS_MCS5;
2682
case MPT_RATE_VHT1SS_MCS6:
2683
return MGN_VHT1SS_MCS6;
2684
case MPT_RATE_VHT1SS_MCS7:
2685
return MGN_VHT1SS_MCS7;
2686
case MPT_RATE_VHT1SS_MCS8:
2687
return MGN_VHT1SS_MCS8;
2688
case MPT_RATE_VHT1SS_MCS9:
2689
return MGN_VHT1SS_MCS9;
2690
case MPT_RATE_VHT2SS_MCS0:
2691
return MGN_VHT2SS_MCS0;
2692
case MPT_RATE_VHT2SS_MCS1:
2693
return MGN_VHT2SS_MCS1;
2694
case MPT_RATE_VHT2SS_MCS2:
2695
return MGN_VHT2SS_MCS2;
2696
case MPT_RATE_VHT2SS_MCS3:
2697
return MGN_VHT2SS_MCS3;
2698
case MPT_RATE_VHT2SS_MCS4:
2699
return MGN_VHT2SS_MCS4;
2700
case MPT_RATE_VHT2SS_MCS5:
2701
return MGN_VHT2SS_MCS5;
2702
case MPT_RATE_VHT2SS_MCS6:
2703
return MGN_VHT2SS_MCS6;
2704
case MPT_RATE_VHT2SS_MCS7:
2705
return MGN_VHT2SS_MCS7;
2706
case MPT_RATE_VHT2SS_MCS8:
2707
return MGN_VHT2SS_MCS8;
2708
case MPT_RATE_VHT2SS_MCS9:
2709
return MGN_VHT2SS_MCS9;
2710
case MPT_RATE_VHT3SS_MCS0:
2711
return MGN_VHT3SS_MCS0;
2712
case MPT_RATE_VHT3SS_MCS1:
2713
return MGN_VHT3SS_MCS1;
2714
case MPT_RATE_VHT3SS_MCS2:
2715
return MGN_VHT3SS_MCS2;
2716
case MPT_RATE_VHT3SS_MCS3:
2717
return MGN_VHT3SS_MCS3;
2718
case MPT_RATE_VHT3SS_MCS4:
2719
return MGN_VHT3SS_MCS4;
2720
case MPT_RATE_VHT3SS_MCS5:
2721
return MGN_VHT3SS_MCS5;
2722
case MPT_RATE_VHT3SS_MCS6:
2723
return MGN_VHT3SS_MCS6;
2724
case MPT_RATE_VHT3SS_MCS7:
2725
return MGN_VHT3SS_MCS7;
2726
case MPT_RATE_VHT3SS_MCS8:
2727
return MGN_VHT3SS_MCS8;
2728
case MPT_RATE_VHT3SS_MCS9:
2729
return MGN_VHT3SS_MCS9;
2730
case MPT_RATE_VHT4SS_MCS0:
2731
return MGN_VHT4SS_MCS0;
2732
case MPT_RATE_VHT4SS_MCS1:
2733
return MGN_VHT4SS_MCS1;
2734
case MPT_RATE_VHT4SS_MCS2:
2735
return MGN_VHT4SS_MCS2;
2736
case MPT_RATE_VHT4SS_MCS3:
2737
return MGN_VHT4SS_MCS3;
2738
case MPT_RATE_VHT4SS_MCS4:
2739
return MGN_VHT4SS_MCS4;
2740
case MPT_RATE_VHT4SS_MCS5:
2741
return MGN_VHT4SS_MCS5;
2742
case MPT_RATE_VHT4SS_MCS6:
2743
return MGN_VHT4SS_MCS6;
2744
case MPT_RATE_VHT4SS_MCS7:
2745
return MGN_VHT4SS_MCS7;
2746
case MPT_RATE_VHT4SS_MCS8:
2747
return MGN_VHT4SS_MCS8;
2748
case MPT_RATE_VHT4SS_MCS9:
2749
return MGN_VHT4SS_MCS9;
2750
2751
case MPT_RATE_LAST: /* fully automatiMGN_VHT2SS_MCS1; */
2752
default:
2753
RTW_INFO("<===mpt_to_mgnt_rate(), Invalid Rate: %d!!\n", MptRateIdx);
2754
return 0x0;
2755
}
2756
}
2757
2758
2759
u8 HwRateToMPTRate(u8 rate)
2760
{
2761
u8 ret_rate = MGN_1M;
2762
2763
switch (rate) {
2764
case DESC_RATE1M:
2765
ret_rate = MPT_RATE_1M;
2766
break;
2767
case DESC_RATE2M:
2768
ret_rate = MPT_RATE_2M;
2769
break;
2770
case DESC_RATE5_5M:
2771
ret_rate = MPT_RATE_55M;
2772
break;
2773
case DESC_RATE11M:
2774
ret_rate = MPT_RATE_11M;
2775
break;
2776
case DESC_RATE6M:
2777
ret_rate = MPT_RATE_6M;
2778
break;
2779
case DESC_RATE9M:
2780
ret_rate = MPT_RATE_9M;
2781
break;
2782
case DESC_RATE12M:
2783
ret_rate = MPT_RATE_12M;
2784
break;
2785
case DESC_RATE18M:
2786
ret_rate = MPT_RATE_18M;
2787
break;
2788
case DESC_RATE24M:
2789
ret_rate = MPT_RATE_24M;
2790
break;
2791
case DESC_RATE36M:
2792
ret_rate = MPT_RATE_36M;
2793
break;
2794
case DESC_RATE48M:
2795
ret_rate = MPT_RATE_48M;
2796
break;
2797
case DESC_RATE54M:
2798
ret_rate = MPT_RATE_54M;
2799
break;
2800
case DESC_RATEMCS0:
2801
ret_rate = MPT_RATE_MCS0;
2802
break;
2803
case DESC_RATEMCS1:
2804
ret_rate = MPT_RATE_MCS1;
2805
break;
2806
case DESC_RATEMCS2:
2807
ret_rate = MPT_RATE_MCS2;
2808
break;
2809
case DESC_RATEMCS3:
2810
ret_rate = MPT_RATE_MCS3;
2811
break;
2812
case DESC_RATEMCS4:
2813
ret_rate = MPT_RATE_MCS4;
2814
break;
2815
case DESC_RATEMCS5:
2816
ret_rate = MPT_RATE_MCS5;
2817
break;
2818
case DESC_RATEMCS6:
2819
ret_rate = MPT_RATE_MCS6;
2820
break;
2821
case DESC_RATEMCS7:
2822
ret_rate = MPT_RATE_MCS7;
2823
break;
2824
case DESC_RATEMCS8:
2825
ret_rate = MPT_RATE_MCS8;
2826
break;
2827
case DESC_RATEMCS9:
2828
ret_rate = MPT_RATE_MCS9;
2829
break;
2830
case DESC_RATEMCS10:
2831
ret_rate = MPT_RATE_MCS10;
2832
break;
2833
case DESC_RATEMCS11:
2834
ret_rate = MPT_RATE_MCS11;
2835
break;
2836
case DESC_RATEMCS12:
2837
ret_rate = MPT_RATE_MCS12;
2838
break;
2839
case DESC_RATEMCS13:
2840
ret_rate = MPT_RATE_MCS13;
2841
break;
2842
case DESC_RATEMCS14:
2843
ret_rate = MPT_RATE_MCS14;
2844
break;
2845
case DESC_RATEMCS15:
2846
ret_rate = MPT_RATE_MCS15;
2847
break;
2848
case DESC_RATEMCS16:
2849
ret_rate = MPT_RATE_MCS16;
2850
break;
2851
case DESC_RATEMCS17:
2852
ret_rate = MPT_RATE_MCS17;
2853
break;
2854
case DESC_RATEMCS18:
2855
ret_rate = MPT_RATE_MCS18;
2856
break;
2857
case DESC_RATEMCS19:
2858
ret_rate = MPT_RATE_MCS19;
2859
break;
2860
case DESC_RATEMCS20:
2861
ret_rate = MPT_RATE_MCS20;
2862
break;
2863
case DESC_RATEMCS21:
2864
ret_rate = MPT_RATE_MCS21;
2865
break;
2866
case DESC_RATEMCS22:
2867
ret_rate = MPT_RATE_MCS22;
2868
break;
2869
case DESC_RATEMCS23:
2870
ret_rate = MPT_RATE_MCS23;
2871
break;
2872
case DESC_RATEMCS24:
2873
ret_rate = MPT_RATE_MCS24;
2874
break;
2875
case DESC_RATEMCS25:
2876
ret_rate = MPT_RATE_MCS25;
2877
break;
2878
case DESC_RATEMCS26:
2879
ret_rate = MPT_RATE_MCS26;
2880
break;
2881
case DESC_RATEMCS27:
2882
ret_rate = MPT_RATE_MCS27;
2883
break;
2884
case DESC_RATEMCS28:
2885
ret_rate = MPT_RATE_MCS28;
2886
break;
2887
case DESC_RATEMCS29:
2888
ret_rate = MPT_RATE_MCS29;
2889
break;
2890
case DESC_RATEMCS30:
2891
ret_rate = MPT_RATE_MCS30;
2892
break;
2893
case DESC_RATEMCS31:
2894
ret_rate = MPT_RATE_MCS31;
2895
break;
2896
case DESC_RATEVHTSS1MCS0:
2897
ret_rate = MPT_RATE_VHT1SS_MCS0;
2898
break;
2899
case DESC_RATEVHTSS1MCS1:
2900
ret_rate = MPT_RATE_VHT1SS_MCS1;
2901
break;
2902
case DESC_RATEVHTSS1MCS2:
2903
ret_rate = MPT_RATE_VHT1SS_MCS2;
2904
break;
2905
case DESC_RATEVHTSS1MCS3:
2906
ret_rate = MPT_RATE_VHT1SS_MCS3;
2907
break;
2908
case DESC_RATEVHTSS1MCS4:
2909
ret_rate = MPT_RATE_VHT1SS_MCS4;
2910
break;
2911
case DESC_RATEVHTSS1MCS5:
2912
ret_rate = MPT_RATE_VHT1SS_MCS5;
2913
break;
2914
case DESC_RATEVHTSS1MCS6:
2915
ret_rate = MPT_RATE_VHT1SS_MCS6;
2916
break;
2917
case DESC_RATEVHTSS1MCS7:
2918
ret_rate = MPT_RATE_VHT1SS_MCS7;
2919
break;
2920
case DESC_RATEVHTSS1MCS8:
2921
ret_rate = MPT_RATE_VHT1SS_MCS8;
2922
break;
2923
case DESC_RATEVHTSS1MCS9:
2924
ret_rate = MPT_RATE_VHT1SS_MCS9;
2925
break;
2926
case DESC_RATEVHTSS2MCS0:
2927
ret_rate = MPT_RATE_VHT2SS_MCS0;
2928
break;
2929
case DESC_RATEVHTSS2MCS1:
2930
ret_rate = MPT_RATE_VHT2SS_MCS1;
2931
break;
2932
case DESC_RATEVHTSS2MCS2:
2933
ret_rate = MPT_RATE_VHT2SS_MCS2;
2934
break;
2935
case DESC_RATEVHTSS2MCS3:
2936
ret_rate = MPT_RATE_VHT2SS_MCS3;
2937
break;
2938
case DESC_RATEVHTSS2MCS4:
2939
ret_rate = MPT_RATE_VHT2SS_MCS4;
2940
break;
2941
case DESC_RATEVHTSS2MCS5:
2942
ret_rate = MPT_RATE_VHT2SS_MCS5;
2943
break;
2944
case DESC_RATEVHTSS2MCS6:
2945
ret_rate = MPT_RATE_VHT2SS_MCS6;
2946
break;
2947
case DESC_RATEVHTSS2MCS7:
2948
ret_rate = MPT_RATE_VHT2SS_MCS7;
2949
break;
2950
case DESC_RATEVHTSS2MCS8:
2951
ret_rate = MPT_RATE_VHT2SS_MCS8;
2952
break;
2953
case DESC_RATEVHTSS2MCS9:
2954
ret_rate = MPT_RATE_VHT2SS_MCS9;
2955
break;
2956
case DESC_RATEVHTSS3MCS0:
2957
ret_rate = MPT_RATE_VHT3SS_MCS0;
2958
break;
2959
case DESC_RATEVHTSS3MCS1:
2960
ret_rate = MPT_RATE_VHT3SS_MCS1;
2961
break;
2962
case DESC_RATEVHTSS3MCS2:
2963
ret_rate = MPT_RATE_VHT3SS_MCS2;
2964
break;
2965
case DESC_RATEVHTSS3MCS3:
2966
ret_rate = MPT_RATE_VHT3SS_MCS3;
2967
break;
2968
case DESC_RATEVHTSS3MCS4:
2969
ret_rate = MPT_RATE_VHT3SS_MCS4;
2970
break;
2971
case DESC_RATEVHTSS3MCS5:
2972
ret_rate = MPT_RATE_VHT3SS_MCS5;
2973
break;
2974
case DESC_RATEVHTSS3MCS6:
2975
ret_rate = MPT_RATE_VHT3SS_MCS6;
2976
break;
2977
case DESC_RATEVHTSS3MCS7:
2978
ret_rate = MPT_RATE_VHT3SS_MCS7;
2979
break;
2980
case DESC_RATEVHTSS3MCS8:
2981
ret_rate = MPT_RATE_VHT3SS_MCS8;
2982
break;
2983
case DESC_RATEVHTSS3MCS9:
2984
ret_rate = MPT_RATE_VHT3SS_MCS9;
2985
break;
2986
case DESC_RATEVHTSS4MCS0:
2987
ret_rate = MPT_RATE_VHT4SS_MCS0;
2988
break;
2989
case DESC_RATEVHTSS4MCS1:
2990
ret_rate = MPT_RATE_VHT4SS_MCS1;
2991
break;
2992
case DESC_RATEVHTSS4MCS2:
2993
ret_rate = MPT_RATE_VHT4SS_MCS2;
2994
break;
2995
case DESC_RATEVHTSS4MCS3:
2996
ret_rate = MPT_RATE_VHT4SS_MCS3;
2997
break;
2998
case DESC_RATEVHTSS4MCS4:
2999
ret_rate = MPT_RATE_VHT4SS_MCS4;
3000
break;
3001
case DESC_RATEVHTSS4MCS5:
3002
ret_rate = MPT_RATE_VHT4SS_MCS5;
3003
break;
3004
case DESC_RATEVHTSS4MCS6:
3005
ret_rate = MPT_RATE_VHT4SS_MCS6;
3006
break;
3007
case DESC_RATEVHTSS4MCS7:
3008
ret_rate = MPT_RATE_VHT4SS_MCS7;
3009
break;
3010
case DESC_RATEVHTSS4MCS8:
3011
ret_rate = MPT_RATE_VHT4SS_MCS8;
3012
break;
3013
case DESC_RATEVHTSS4MCS9:
3014
ret_rate = MPT_RATE_VHT4SS_MCS9;
3015
break;
3016
3017
default:
3018
RTW_INFO("hw_rate_to_m_rate(): Non supported Rate [%x]!!!\n", rate);
3019
break;
3020
}
3021
return ret_rate;
3022
}
3023
3024
u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr)
3025
{
3026
u16 i = 0;
3027
u8 *rateindex_Array[] = { "1M", "2M", "5.5M", "11M", "6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M",
3028
"HTMCS0", "HTMCS1", "HTMCS2", "HTMCS3", "HTMCS4", "HTMCS5", "HTMCS6", "HTMCS7",
3029
"HTMCS8", "HTMCS9", "HTMCS10", "HTMCS11", "HTMCS12", "HTMCS13", "HTMCS14", "HTMCS15",
3030
"HTMCS16", "HTMCS17", "HTMCS18", "HTMCS19", "HTMCS20", "HTMCS21", "HTMCS22", "HTMCS23",
3031
"HTMCS24", "HTMCS25", "HTMCS26", "HTMCS27", "HTMCS28", "HTMCS29", "HTMCS30", "HTMCS31",
3032
"VHT1MCS0", "VHT1MCS1", "VHT1MCS2", "VHT1MCS3", "VHT1MCS4", "VHT1MCS5", "VHT1MCS6", "VHT1MCS7", "VHT1MCS8", "VHT1MCS9",
3033
"VHT2MCS0", "VHT2MCS1", "VHT2MCS2", "VHT2MCS3", "VHT2MCS4", "VHT2MCS5", "VHT2MCS6", "VHT2MCS7", "VHT2MCS8", "VHT2MCS9",
3034
"VHT3MCS0", "VHT3MCS1", "VHT3MCS2", "VHT3MCS3", "VHT3MCS4", "VHT3MCS5", "VHT3MCS6", "VHT3MCS7", "VHT3MCS8", "VHT3MCS9",
3035
"VHT4MCS0", "VHT4MCS1", "VHT4MCS2", "VHT4MCS3", "VHT4MCS4", "VHT4MCS5", "VHT4MCS6", "VHT4MCS7", "VHT4MCS8", "VHT4MCS9"
3036
};
3037
3038
for (i = 0; i <= 83; i++) {
3039
if (strcmp(targetStr, rateindex_Array[i]) == 0) {
3040
RTW_INFO("%s , index = %d\n", __func__ , i);
3041
return i;
3042
}
3043
}
3044
3045
printk("%s ,please input a Data RATE String as:", __func__);
3046
for (i = 0; i <= 83; i++) {
3047
printk("%s ", rateindex_Array[i]);
3048
if (i % 10 == 0)
3049
printk("\n");
3050
}
3051
return _FAIL;
3052
}
3053
3054
u8 rtw_mp_mode_check(PADAPTER pAdapter)
3055
{
3056
PADAPTER primary_adapter = GET_PRIMARY_ADAPTER(pAdapter);
3057
3058
if (primary_adapter->registrypriv.mp_mode == 1 || primary_adapter->mppriv.bprocess_mp_mode == _TRUE)
3059
return _TRUE;
3060
else
3061
return _FALSE;
3062
}
3063
3064
3065
u32 mpt_ProQueryCalTxPower(
3066
PADAPTER pAdapter,
3067
u8 RfPath
3068
)
3069
{
3070
3071
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
3072
PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx);
3073
3074
u32 TxPower = 1;
3075
struct txpwr_idx_comp tic;
3076
u8 mgn_rate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index);
3077
3078
TxPower = rtw_hal_get_tx_power_index(pAdapter, RfPath, mgn_rate, pHalData->current_channel_bw, pHalData->current_channel, &tic);
3079
3080
RTW_INFO("TXPWR: [%c][%s]ch:%u, %s %uT, pwr_idx:%u(0x%02x) = %u + (%d=%d:%d) + (%d) + (%d) + (%d) + (%d)\n"
3081
, rf_path_char(RfPath), ch_width_str(pHalData->current_channel_bw), pHalData->current_channel, MGN_RATE_STR(mgn_rate), tic.ntx_idx + 1
3082
, TxPower, TxPower, tic.pg, (tic.by_rate > tic.limit ? tic.limit : tic.by_rate), tic.by_rate, tic.limit, tic.tpt
3083
, tic.ebias, tic.btc, tic.dpd);
3084
3085
pAdapter->mppriv.txpoweridx = (u8)TxPower;
3086
if (RfPath == RF_PATH_A)
3087
pMptCtx->TxPwrLevel[RF_PATH_A] = (u8)TxPower;
3088
else if (RfPath == RF_PATH_B)
3089
pMptCtx->TxPwrLevel[RF_PATH_B] = (u8)TxPower;
3090
else if (RfPath == RF_PATH_C)
3091
pMptCtx->TxPwrLevel[RF_PATH_C] = (u8)TxPower;
3092
else if (RfPath == RF_PATH_D)
3093
pMptCtx->TxPwrLevel[RF_PATH_D] = (u8)TxPower;
3094
hal_mpt_SetTxPower(pAdapter);
3095
3096
return TxPower;
3097
}
3098
3099
#ifdef CONFIG_MP_VHT_HW_TX_MODE
3100
static inline void dump_buf(u8 *buf, u32 len)
3101
{
3102
u32 i;
3103
3104
RTW_INFO("-----------------Len %d----------------\n", len);
3105
for (i = 0; i < len; i++)
3106
RTW_INFO("%2.2x-", *(buf + i));
3107
RTW_INFO("\n");
3108
}
3109
3110
void ByteToBit(
3111
u8 *out,
3112
bool *in,
3113
u8 in_size)
3114
{
3115
u8 i = 0, j = 0;
3116
3117
for (i = 0; i < in_size; i++) {
3118
for (j = 0; j < 8; j++) {
3119
if (in[8 * i + j])
3120
out[i] |= (1 << j);
3121
}
3122
}
3123
}
3124
3125
3126
void CRC16_generator(
3127
bool *out,
3128
bool *in,
3129
u8 in_size
3130
)
3131
{
3132
u8 i = 0;
3133
bool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
3134
3135
for (i = 0; i < in_size; i++) {/* take one's complement and bit reverse*/
3136
temp = in[i] ^ reg[15];
3137
reg[15] = reg[14];
3138
reg[14] = reg[13];
3139
reg[13] = reg[12];
3140
reg[12] = reg[11];
3141
reg[11] = reg[10];
3142
reg[10] = reg[9];
3143
reg[9] = reg[8];
3144
reg[8] = reg[7];
3145
3146
reg[7] = reg[6];
3147
reg[6] = reg[5];
3148
reg[5] = reg[4];
3149
reg[4] = reg[3];
3150
reg[3] = reg[2];
3151
reg[2] = reg[1];
3152
reg[1] = reg[0];
3153
reg[12] = reg[12] ^ temp;
3154
reg[5] = reg[5] ^ temp;
3155
reg[0] = temp;
3156
}
3157
for (i = 0; i < 16; i++) /* take one's complement and bit reverse*/
3158
out[i] = 1 - reg[15 - i];
3159
}
3160
3161
3162
3163
/*========================================
3164
SFD SIGNAL SERVICE LENGTH CRC
3165
16 bit 8 bit 8 bit 16 bit 16 bit
3166
========================================*/
3167
void CCK_generator(
3168
PRT_PMAC_TX_INFO pPMacTxInfo,
3169
PRT_PMAC_PKT_INFO pPMacPktInfo
3170
)
3171
{
3172
double ratio = 0;
3173
bool crc16_in[32] = {0}, crc16_out[16] = {0};
3174
bool LengthExtBit;
3175
double LengthExact;
3176
double LengthPSDU;
3177
u8 i;
3178
u32 PacketLength = pPMacTxInfo->PacketLength;
3179
3180
if (pPMacTxInfo->bSPreamble)
3181
pPMacTxInfo->SFD = 0x05CF;
3182
else
3183
pPMacTxInfo->SFD = 0xF3A0;
3184
3185
switch (pPMacPktInfo->MCS) {
3186
case 0:
3187
pPMacTxInfo->SignalField = 0xA;
3188
ratio = 8;
3189
/*CRC16_in(1,0:7)=[0 1 0 1 0 0 0 0]*/
3190
crc16_in[1] = crc16_in[3] = 1;
3191
break;
3192
case 1:
3193
pPMacTxInfo->SignalField = 0x14;
3194
ratio = 4;
3195
/*CRC16_in(1,0:7)=[0 0 1 0 1 0 0 0];*/
3196
crc16_in[2] = crc16_in[4] = 1;
3197
break;
3198
case 2:
3199
pPMacTxInfo->SignalField = 0x37;
3200
ratio = 8.0 / 5.5;
3201
/*CRC16_in(1,0:7)=[1 1 1 0 1 1 0 0];*/
3202
crc16_in[0] = crc16_in[1] = crc16_in[2] = crc16_in[4] = crc16_in[5] = 1;
3203
break;
3204
case 3:
3205
pPMacTxInfo->SignalField = 0x6E;
3206
ratio = 8.0 / 11.0;
3207
/*CRC16_in(1,0:7)=[0 1 1 1 0 1 1 0];*/
3208
crc16_in[1] = crc16_in[2] = crc16_in[3] = crc16_in[5] = crc16_in[6] = 1;
3209
break;
3210
}
3211
3212
LengthExact = PacketLength * ratio;
3213
LengthPSDU = ceil(LengthExact);
3214
3215
if ((pPMacPktInfo->MCS == 3) &&
3216
((LengthPSDU - LengthExact) >= 0.727 || (LengthPSDU - LengthExact) <= -0.727))
3217
LengthExtBit = 1;
3218
else
3219
LengthExtBit = 0;
3220
3221
3222
pPMacTxInfo->LENGTH = (u32)LengthPSDU;
3223
/* CRC16_in(1,16:31) = LengthPSDU[0:15]*/
3224
for (i = 0; i < 16; i++)
3225
crc16_in[i + 16] = (pPMacTxInfo->LENGTH >> i) & 0x1;
3226
3227
if (LengthExtBit == 0) {
3228
pPMacTxInfo->ServiceField = 0x0;
3229
/* CRC16_in(1,8:15) = [0 0 0 0 0 0 0 0];*/
3230
} else {
3231
pPMacTxInfo->ServiceField = 0x80;
3232
/*CRC16_in(1,8:15)=[0 0 0 0 0 0 0 1];*/
3233
crc16_in[15] = 1;
3234
}
3235
3236
CRC16_generator(crc16_out, crc16_in, 32);
3237
3238
_rtw_memset(pPMacTxInfo->CRC16, 0, 2);
3239
ByteToBit(pPMacTxInfo->CRC16, crc16_out, 2);
3240
3241
}
3242
3243
3244
void PMAC_Get_Pkt_Param(
3245
PRT_PMAC_TX_INFO pPMacTxInfo,
3246
PRT_PMAC_PKT_INFO pPMacPktInfo)
3247
{
3248
3249
u8 TX_RATE_HEX = 0, MCS = 0;
3250
u8 TX_RATE = pPMacTxInfo->TX_RATE;
3251
3252
/* TX_RATE & Nss */
3253
if (MPT_IS_2SS_RATE(TX_RATE))
3254
pPMacPktInfo->Nss = 2;
3255
else if (MPT_IS_3SS_RATE(TX_RATE))
3256
pPMacPktInfo->Nss = 3;
3257
else if (MPT_IS_4SS_RATE(TX_RATE))
3258
pPMacPktInfo->Nss = 4;
3259
else
3260
pPMacPktInfo->Nss = 1;
3261
3262
RTW_INFO("PMacTxInfo.Nss =%d\n", pPMacPktInfo->Nss);
3263
3264
/* MCS & TX_RATE_HEX*/
3265
if (MPT_IS_CCK_RATE(TX_RATE)) {
3266
switch (TX_RATE) {
3267
case MPT_RATE_1M:
3268
TX_RATE_HEX = MCS = 0;
3269
break;
3270
case MPT_RATE_2M:
3271
TX_RATE_HEX = MCS = 1;
3272
break;
3273
case MPT_RATE_55M:
3274
TX_RATE_HEX = MCS = 2;
3275
break;
3276
case MPT_RATE_11M:
3277
TX_RATE_HEX = MCS = 3;
3278
break;
3279
}
3280
} else if (MPT_IS_OFDM_RATE(TX_RATE)) {
3281
MCS = TX_RATE - MPT_RATE_6M;
3282
TX_RATE_HEX = MCS + 4;
3283
} else if (MPT_IS_HT_RATE(TX_RATE)) {
3284
MCS = TX_RATE - MPT_RATE_MCS0;
3285
TX_RATE_HEX = MCS + 12;
3286
} else if (MPT_IS_VHT_RATE(TX_RATE)) {
3287
TX_RATE_HEX = TX_RATE - MPT_RATE_VHT1SS_MCS0 + 44;
3288
3289
if (MPT_IS_VHT_2S_RATE(TX_RATE))
3290
MCS = TX_RATE - MPT_RATE_VHT2SS_MCS0;
3291
else if (MPT_IS_VHT_3S_RATE(TX_RATE))
3292
MCS = TX_RATE - MPT_RATE_VHT3SS_MCS0;
3293
else if (MPT_IS_VHT_4S_RATE(TX_RATE))
3294
MCS = TX_RATE - MPT_RATE_VHT4SS_MCS0;
3295
else
3296
MCS = TX_RATE - MPT_RATE_VHT1SS_MCS0;
3297
}
3298
3299
pPMacPktInfo->MCS = MCS;
3300
pPMacTxInfo->TX_RATE_HEX = TX_RATE_HEX;
3301
3302
RTW_INFO(" MCS=%d, TX_RATE_HEX =0x%x\n", MCS, pPMacTxInfo->TX_RATE_HEX);
3303
/* mSTBC & Nsts*/
3304
pPMacPktInfo->Nsts = pPMacPktInfo->Nss;
3305
if (pPMacTxInfo->bSTBC) {
3306
if (pPMacPktInfo->Nss == 1) {
3307
pPMacTxInfo->m_STBC = 2;
3308
pPMacPktInfo->Nsts = pPMacPktInfo->Nss * 2;
3309
} else
3310
pPMacTxInfo->m_STBC = 1;
3311
} else
3312
pPMacTxInfo->m_STBC = 1;
3313
}
3314
3315
3316
u32 LDPC_parameter_generator(
3317
u32 N_pld_int,
3318
u32 N_CBPSS,
3319
u32 N_SS,
3320
u32 R,
3321
u32 m_STBC,
3322
u32 N_TCB_int
3323
)
3324
{
3325
double CR = 0.;
3326
double N_pld = (double)N_pld_int;
3327
double N_TCB = (double)N_TCB_int;
3328
double N_CW = 0., N_shrt = 0., N_spcw = 0., N_fshrt = 0.;
3329
double L_LDPC = 0., K_LDPC = 0., L_LDPC_info = 0.;
3330
double N_punc = 0., N_ppcw = 0., N_fpunc = 0., N_rep = 0., N_rpcw = 0., N_frep = 0.;
3331
double R_eff = 0.;
3332
u32 VHTSIGA2B3 = 0;/* extra symbol from VHT-SIG-A2 Bit 3*/
3333
3334
if (R == 0)
3335
CR = 0.5;
3336
else if (R == 1)
3337
CR = 2. / 3.;
3338
else if (R == 2)
3339
CR = 3. / 4.;
3340
else if (R == 3)
3341
CR = 5. / 6.;
3342
3343
if (N_TCB <= 648.) {
3344
N_CW = 1.;
3345
if (N_TCB >= N_pld + 912.*(1. - CR))
3346
L_LDPC = 1296.;
3347
else
3348
L_LDPC = 648.;
3349
} else if (N_TCB <= 1296.) {
3350
N_CW = 1.;
3351
if (N_TCB >= (double)N_pld + 1464.*(1. - CR))
3352
L_LDPC = 1944.;
3353
else
3354
L_LDPC = 1296.;
3355
} else if (N_TCB <= 1944.) {
3356
N_CW = 1.;
3357
L_LDPC = 1944.;
3358
} else if (N_TCB <= 2592.) {
3359
N_CW = 2.;
3360
if (N_TCB >= N_pld + 2916.*(1. - CR))
3361
L_LDPC = 1944.;
3362
else
3363
L_LDPC = 1296.;
3364
} else {
3365
N_CW = ceil(N_pld / 1944. / CR);
3366
L_LDPC = 1944.;
3367
}
3368
/* Number of information bits per CW*/
3369
K_LDPC = L_LDPC * CR;
3370
/* Number of shortening bits max(0, (N_CW * L_LDPC * R) - N_pld)*/
3371
N_shrt = (N_CW * K_LDPC - N_pld) > 0. ? (N_CW * K_LDPC - N_pld) : 0.;
3372
/* Number of shortening bits per CW N_spcw = rtfloor(N_shrt/N_CW)*/
3373
N_spcw = rtfloor(N_shrt / N_CW);
3374
/* The first N_fshrt CWs shorten 1 bit more*/
3375
N_fshrt = (double)((int)N_shrt % (int)N_CW);
3376
/* Number of data bits for the last N_CW-N_fshrt CWs*/
3377
L_LDPC_info = K_LDPC - N_spcw;
3378
/* Number of puncturing bits*/
3379
N_punc = (N_CW * L_LDPC - N_TCB - N_shrt) > 0. ? (N_CW * L_LDPC - N_TCB - N_shrt) : 0.;
3380
if (((N_punc > .1 * N_CW * L_LDPC * (1. - CR)) && (N_shrt < 1.2 * N_punc * CR / (1. - CR))) ||
3381
(N_punc > 0.3 * N_CW * L_LDPC * (1. - CR))) {
3382
/*cout << "*** N_TCB and N_punc are Recomputed ***" << endl;*/
3383
VHTSIGA2B3 = 1;
3384
N_TCB += (double)N_CBPSS * N_SS * m_STBC;
3385
N_punc = (N_CW * L_LDPC - N_TCB - N_shrt) > 0. ? (N_CW * L_LDPC - N_TCB - N_shrt) : 0.;
3386
} else
3387
VHTSIGA2B3 = 0;
3388
3389
return VHTSIGA2B3;
3390
} /* function end of LDPC_parameter_generator */
3391
3392
/*========================================
3393
Data field of PPDU
3394
Get N_sym and SIGA2BB3
3395
========================================*/
3396
void PMAC_Nsym_generator(
3397
PRT_PMAC_TX_INFO pPMacTxInfo,
3398
PRT_PMAC_PKT_INFO pPMacPktInfo)
3399
{
3400
u32 SIGA2B3 = 0;
3401
u8 TX_RATE = pPMacTxInfo->TX_RATE;
3402
3403
u32 R, R_list[10] = {0, 0, 2, 0, 2, 1, 2, 3, 2, 3};
3404
double CR = 0;
3405
u32 N_SD, N_BPSC_list[10] = {1, 2, 2, 4, 4, 6, 6, 6, 8, 8};
3406
u32 N_BPSC = 0, N_CBPS = 0, N_DBPS = 0, N_ES = 0, N_SYM = 0, N_pld = 0, N_TCB = 0;
3407
int D_R = 0;
3408
3409
RTW_INFO("TX_RATE = %d\n", TX_RATE);
3410
/* N_SD*/
3411
if (pPMacTxInfo->BandWidth == 0)
3412
N_SD = 52;
3413
else if (pPMacTxInfo->BandWidth == 1)
3414
N_SD = 108;
3415
else
3416
N_SD = 234;
3417
3418
if (MPT_IS_HT_RATE(TX_RATE)) {
3419
u8 MCS_temp;
3420
3421
if (pPMacPktInfo->MCS > 23)
3422
MCS_temp = pPMacPktInfo->MCS - 24;
3423
else if (pPMacPktInfo->MCS > 15)
3424
MCS_temp = pPMacPktInfo->MCS - 16;
3425
else if (pPMacPktInfo->MCS > 7)
3426
MCS_temp = pPMacPktInfo->MCS - 8;
3427
else
3428
MCS_temp = pPMacPktInfo->MCS;
3429
3430
R = R_list[MCS_temp];
3431
3432
switch (R) {
3433
case 0:
3434
CR = .5;
3435
break;
3436
case 1:
3437
CR = 2. / 3.;
3438
break;
3439
case 2:
3440
CR = 3. / 4.;
3441
break;
3442
case 3:
3443
CR = 5. / 6.;
3444
break;
3445
}
3446
3447
N_BPSC = N_BPSC_list[MCS_temp];
3448
N_CBPS = N_BPSC * N_SD * pPMacPktInfo->Nss;
3449
N_DBPS = (u32)((double)N_CBPS * CR);
3450
3451
if (pPMacTxInfo->bLDPC == FALSE) {
3452
N_ES = (u32)ceil((double)(N_DBPS * pPMacPktInfo->Nss) / 4. / 300.);
3453
RTW_INFO("N_ES = %d\n", N_ES);
3454
3455
/* N_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/
3456
N_SYM = pPMacTxInfo->m_STBC * (u32)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16 + N_ES * 6) /
3457
(double)(N_DBPS * pPMacTxInfo->m_STBC));
3458
3459
} else {
3460
N_ES = 1;
3461
/* N_pld = length * 8 + 16*/
3462
N_pld = pPMacTxInfo->PacketLength * 8 + 16;
3463
RTW_INFO("N_pld = %d\n", N_pld);
3464
N_SYM = pPMacTxInfo->m_STBC * (u32)ceil((double)(N_pld) /
3465
(double)(N_DBPS * pPMacTxInfo->m_STBC));
3466
RTW_INFO("N_SYM = %d\n", N_SYM);
3467
/* N_avbits = N_CBPS *m_STBC *(N_pld/N_CBPS*R*m_STBC)*/
3468
N_TCB = N_CBPS * N_SYM;
3469
RTW_INFO("N_TCB = %d\n", N_TCB);
3470
SIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB);
3471
RTW_INFO("SIGA2B3 = %d\n", SIGA2B3);
3472
N_SYM = N_SYM + SIGA2B3 * pPMacTxInfo->m_STBC;
3473
RTW_INFO("N_SYM = %d\n", N_SYM);
3474
}
3475
} else if (MPT_IS_VHT_RATE(TX_RATE)) {
3476
R = R_list[pPMacPktInfo->MCS];
3477
3478
switch (R) {
3479
case 0:
3480
CR = .5;
3481
break;
3482
case 1:
3483
CR = 2. / 3.;
3484
break;
3485
case 2:
3486
CR = 3. / 4.;
3487
break;
3488
case 3:
3489
CR = 5. / 6.;
3490
break;
3491
}
3492
N_BPSC = N_BPSC_list[pPMacPktInfo->MCS];
3493
N_CBPS = N_BPSC * N_SD * pPMacPktInfo->Nss;
3494
N_DBPS = (u32)((double)N_CBPS * CR);
3495
if (pPMacTxInfo->bLDPC == FALSE) {
3496
if (pPMacTxInfo->bSGI)
3497
N_ES = (u32)ceil((double)(N_DBPS) / 3.6 / 600.);
3498
else
3499
N_ES = (u32)ceil((double)(N_DBPS) / 4. / 600.);
3500
/* N_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/
3501
N_SYM = pPMacTxInfo->m_STBC * (u32)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16 + N_ES * 6) / (double)(N_DBPS * pPMacTxInfo->m_STBC));
3502
SIGA2B3 = 0;
3503
} else {
3504
N_ES = 1;
3505
/* N_SYM = m_STBC* (8*length+N_service) / (m_STBC*N_DBPS)*/
3506
N_SYM = pPMacTxInfo->m_STBC * (u32)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16) / (double)(N_DBPS * pPMacTxInfo->m_STBC));
3507
/* N_avbits = N_sys_init * N_CBPS*/
3508
N_TCB = N_CBPS * N_SYM;
3509
/* N_pld = N_sys_init * N_DBPS*/
3510
N_pld = N_SYM * N_DBPS;
3511
SIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB);
3512
N_SYM = N_SYM + SIGA2B3 * pPMacTxInfo->m_STBC;
3513
}
3514
3515
switch (R) {
3516
case 0:
3517
D_R = 2;
3518
break;
3519
case 1:
3520
D_R = 3;
3521
break;
3522
case 2:
3523
D_R = 4;
3524
break;
3525
case 3:
3526
D_R = 6;
3527
break;
3528
}
3529
3530
if (((N_CBPS / N_ES) % D_R) != 0) {
3531
RTW_INFO("MCS= %d is not supported when Nss=%d and BW= %d !!\n", pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth);
3532
return;
3533
}
3534
3535
RTW_INFO("MCS= %d Nss=%d and BW= %d !!\n", pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth);
3536
}
3537
3538
pPMacPktInfo->N_sym = N_SYM;
3539
pPMacPktInfo->SIGA2B3 = SIGA2B3;
3540
}
3541
3542
/*========================================
3543
L-SIG Rate R Length P Tail
3544
4b 1b 12b 1b 6b
3545
========================================*/
3546
3547
void L_SIG_generator(
3548
u32 N_SYM, /* Max: 750*/
3549
PRT_PMAC_TX_INFO pPMacTxInfo,
3550
PRT_PMAC_PKT_INFO pPMacPktInfo)
3551
{
3552
u8 sig_bi[24] = {0}; /* 24 BIT*/
3553
u32 mode, LENGTH;
3554
int i;
3555
3556
if (MPT_IS_OFDM_RATE(pPMacTxInfo->TX_RATE)) {
3557
mode = pPMacPktInfo->MCS;
3558
LENGTH = pPMacTxInfo->PacketLength;
3559
} else {
3560
u8 N_LTF;
3561
double T_data;
3562
u32 OFDM_symbol;
3563
3564
mode = 0;
3565
3566
/* Table 20-13 Num of HT-DLTFs request*/
3567
if (pPMacPktInfo->Nsts <= 2)
3568
N_LTF = pPMacPktInfo->Nsts;
3569
else
3570
N_LTF = 4;
3571
3572
if (pPMacTxInfo->bSGI)
3573
T_data = 3.6;
3574
else
3575
T_data = 4.0;
3576
3577
/*(L-SIG, HT-SIG, HT-STF, HT-LTF....HT-LTF, Data)*/
3578
if (MPT_IS_VHT_RATE(pPMacTxInfo->TX_RATE))
3579
OFDM_symbol = (u32)ceil((double)(8 + 4 + N_LTF * 4 + N_SYM * T_data + 4) / 4.);
3580
else
3581
OFDM_symbol = (u32)ceil((double)(8 + 4 + N_LTF * 4 + N_SYM * T_data) / 4.);
3582
3583
RTW_INFO("%s , OFDM_symbol =%d\n", __func__, OFDM_symbol);
3584
LENGTH = OFDM_symbol * 3 - 3;
3585
RTW_INFO("%s , LENGTH =%d\n", __func__, LENGTH);
3586
3587
}
3588
/* Rate Field*/
3589
switch (mode) {
3590
case 0:
3591
sig_bi[0] = 1;
3592
sig_bi[1] = 1;
3593
sig_bi[2] = 0;
3594
sig_bi[3] = 1;
3595
break;
3596
case 1:
3597
sig_bi[0] = 1;
3598
sig_bi[1] = 1;
3599
sig_bi[2] = 1;
3600
sig_bi[3] = 1;
3601
break;
3602
case 2:
3603
sig_bi[0] = 0;
3604
sig_bi[1] = 1;
3605
sig_bi[2] = 0;
3606
sig_bi[3] = 1;
3607
break;
3608
case 3:
3609
sig_bi[0] = 0;
3610
sig_bi[1] = 1;
3611
sig_bi[2] = 1;
3612
sig_bi[3] = 1;
3613
break;
3614
case 4:
3615
sig_bi[0] = 1;
3616
sig_bi[1] = 0;
3617
sig_bi[2] = 0;
3618
sig_bi[3] = 1;
3619
break;
3620
case 5:
3621
sig_bi[0] = 1;
3622
sig_bi[1] = 0;
3623
sig_bi[2] = 1;
3624
sig_bi[3] = 1;
3625
break;
3626
case 6:
3627
sig_bi[0] = 0;
3628
sig_bi[1] = 0;
3629
sig_bi[2] = 0;
3630
sig_bi[3] = 1;
3631
break;
3632
case 7:
3633
sig_bi[0] = 0;
3634
sig_bi[1] = 0;
3635
sig_bi[2] = 1;
3636
sig_bi[3] = 1;
3637
break;
3638
}
3639
/*Reserved bit*/
3640
sig_bi[4] = 0;
3641
3642
/* Length Field*/
3643
for (i = 0; i < 12; i++)
3644
sig_bi[i + 5] = (LENGTH >> i) & 1;
3645
3646
/* Parity Bit*/
3647
sig_bi[17] = 0;
3648
for (i = 0; i < 17; i++)
3649
sig_bi[17] = sig_bi[17] + sig_bi[i];
3650
3651
sig_bi[17] %= 2;
3652
3653
/* Tail Field*/
3654
for (i = 18; i < 24; i++)
3655
sig_bi[i] = 0;
3656
3657
/* dump_buf(sig_bi,24);*/
3658
_rtw_memset(pPMacTxInfo->LSIG, 0, 3);
3659
ByteToBit(pPMacTxInfo->LSIG, (bool *)sig_bi, 3);
3660
}
3661
3662
3663
void CRC8_generator(
3664
bool *out,
3665
bool *in,
3666
u8 in_size
3667
)
3668
{
3669
u8 i = 0;
3670
bool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1};
3671
3672
for (i = 0; i < in_size; i++) { /* take one's complement and bit reverse*/
3673
temp = in[i] ^ reg[7];
3674
reg[7] = reg[6];
3675
reg[6] = reg[5];
3676
reg[5] = reg[4];
3677
reg[4] = reg[3];
3678
reg[3] = reg[2];
3679
reg[2] = reg[1] ^ temp;
3680
reg[1] = reg[0] ^ temp;
3681
reg[0] = temp;
3682
}
3683
for (i = 0; i < 8; i++)/* take one's complement and bit reverse*/
3684
out[i] = reg[7 - i] ^ 1;
3685
}
3686
3687
/*/================================================================================
3688
HT-SIG1 MCS CW Length 24BIT + 24BIT
3689
7b 1b 16b
3690
HT-SIG2 Smoothing Not sounding Rsvd AGG STBC FEC SGI N_ELTF CRC Tail
3691
1b 1b 1b 1b 2b 1b 1b 2b 8b 6b
3692
================================================================================*/
3693
void HT_SIG_generator(
3694
PRT_PMAC_TX_INFO pPMacTxInfo,
3695
PRT_PMAC_PKT_INFO pPMacPktInfo
3696
)
3697
{
3698
u32 i;
3699
bool sig_bi[48] = {0}, crc8[8] = {0};
3700
/* MCS Field*/
3701
for (i = 0; i < 7; i++)
3702
sig_bi[i] = (pPMacPktInfo->MCS >> i) & 0x1;
3703
/* Packet BW Setting*/
3704
sig_bi[7] = pPMacTxInfo->BandWidth;
3705
/* HT-Length Field*/
3706
for (i = 0; i < 16; i++)
3707
sig_bi[i + 8] = (pPMacTxInfo->PacketLength >> i) & 0x1;
3708
/* Smoothing; 1->allow smoothing*/
3709
sig_bi[24] = 1;
3710
/*Not Sounding*/
3711
sig_bi[25] = 1 - pPMacTxInfo->NDP_sound;
3712
/*Reserved bit*/
3713
sig_bi[26] = 1;
3714
/*/Aggregate*/
3715
sig_bi[27] = 0;
3716
/*STBC Field*/
3717
if (pPMacTxInfo->bSTBC) {
3718
sig_bi[28] = 1;
3719
sig_bi[29] = 0;
3720
} else {
3721
sig_bi[28] = 0;
3722
sig_bi[29] = 0;
3723
}
3724
/*Advance Coding, 0: BCC, 1: LDPC*/
3725
sig_bi[30] = pPMacTxInfo->bLDPC;
3726
/* Short GI*/
3727
sig_bi[31] = pPMacTxInfo->bSGI;
3728
/* N_ELTFs*/
3729
if (pPMacTxInfo->NDP_sound == FALSE) {
3730
sig_bi[32] = 0;
3731
sig_bi[33] = 0;
3732
} else {
3733
int N_ELTF = pPMacTxInfo->Ntx - pPMacPktInfo->Nss;
3734
3735
for (i = 0; i < 2; i++)
3736
sig_bi[32 + i] = (N_ELTF >> i) % 2;
3737
}
3738
/* CRC-8*/
3739
CRC8_generator(crc8, sig_bi, 34);
3740
3741
for (i = 0; i < 8; i++)
3742
sig_bi[34 + i] = crc8[i];
3743
3744
/*Tail*/
3745
for (i = 42; i < 48; i++)
3746
sig_bi[i] = 0;
3747
3748
_rtw_memset(pPMacTxInfo->HT_SIG, 0, 6);
3749
ByteToBit(pPMacTxInfo->HT_SIG, sig_bi, 6);
3750
}
3751
3752
3753
/*======================================================================================
3754
VHT-SIG-A1
3755
BW Reserved STBC G_ID SU_Nsts P_AID TXOP_PS_NOT_ALLOW Reserved
3756
2b 1b 1b 6b 3b 9b 1b 2b 1b
3757
VHT-SIG-A2
3758
SGI SGI_Nsym SU/MU coding LDPC_Extra SU_NCS Beamformed Reserved CRC Tail
3759
1b 1b 1b 1b 4b 1b 1b 8b 6b
3760
======================================================================================*/
3761
void VHT_SIG_A_generator(
3762
PRT_PMAC_TX_INFO pPMacTxInfo,
3763
PRT_PMAC_PKT_INFO pPMacPktInfo)
3764
{
3765
u32 i;
3766
bool sig_bi[48], crc8[8];
3767
3768
_rtw_memset(sig_bi, 0, 48);
3769
_rtw_memset(crc8, 0, 8);
3770
3771
/* BW Setting*/
3772
for (i = 0; i < 2; i++)
3773
sig_bi[i] = (pPMacTxInfo->BandWidth >> i) & 0x1;
3774
/* Reserved Bit*/
3775
sig_bi[2] = 1;
3776
/*STBC Field*/
3777
sig_bi[3] = pPMacTxInfo->bSTBC;
3778
/*Group ID: Single User->A value of 0 or 63 indicates an SU PPDU. */
3779
for (i = 0; i < 6; i++)
3780
sig_bi[4 + i] = 0;
3781
/* N_STS/Partial AID*/
3782
for (i = 0; i < 12; i++) {
3783
if (i < 3)
3784
sig_bi[10 + i] = ((pPMacPktInfo->Nsts - 1) >> i) & 0x1;
3785
else
3786
sig_bi[10 + i] = 0;
3787
}
3788
/*TXOP_PS_NOT_ALLPWED*/
3789
sig_bi[22] = 0;
3790
/*Reserved Bits*/
3791
sig_bi[23] = 1;
3792
/*Short GI*/
3793
sig_bi[24] = pPMacTxInfo->bSGI;
3794
if (pPMacTxInfo->bSGI > 0 && (pPMacPktInfo->N_sym % 10) == 9)
3795
sig_bi[25] = 1;
3796
else
3797
sig_bi[25] = 0;
3798
/* SU/MU[0] Coding*/
3799
sig_bi[26] = pPMacTxInfo->bLDPC; /* 0:BCC, 1:LDPC */
3800
sig_bi[27] = pPMacPktInfo->SIGA2B3; /*/ Record Extra OFDM Symols is added or not when LDPC is used*/
3801
/*SU MCS/MU[1-3] Coding*/
3802
for (i = 0; i < 4; i++)
3803
sig_bi[28 + i] = (pPMacPktInfo->MCS >> i) & 0x1;
3804
/*SU Beamform */
3805
sig_bi[32] = 0; /*packet.TXBF_en;*/
3806
/*Reserved Bit*/
3807
sig_bi[33] = 1;
3808
/*CRC-8*/
3809
CRC8_generator(crc8, sig_bi, 34);
3810
for (i = 0; i < 8; i++)
3811
sig_bi[34 + i] = crc8[i];
3812
/*Tail*/
3813
for (i = 42; i < 48; i++)
3814
sig_bi[i] = 0;
3815
3816
_rtw_memset(pPMacTxInfo->VHT_SIG_A, 0, 6);
3817
ByteToBit(pPMacTxInfo->VHT_SIG_A, sig_bi, 6);
3818
}
3819
3820
/*======================================================================================
3821
VHT-SIG-B
3822
Length Resesrved Trail
3823
17/19/21 BIT 3/2/2 BIT 6b
3824
======================================================================================*/
3825
void VHT_SIG_B_generator(
3826
PRT_PMAC_TX_INFO pPMacTxInfo)
3827
{
3828
bool sig_bi[32], crc8_bi[8];
3829
u32 i, len, res, tail = 6, total_len, crc8_in_len;
3830
u32 sigb_len;
3831
3832
_rtw_memset(sig_bi, 0, 32);
3833
_rtw_memset(crc8_bi, 0, 8);
3834
3835
/*Sounding Packet*/
3836
if (pPMacTxInfo->NDP_sound == 1) {
3837
if (pPMacTxInfo->BandWidth == 0) {
3838
bool sigb_temp[26] = {0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0};
3839
3840
_rtw_memcpy(sig_bi, sigb_temp, 26);
3841
} else if (pPMacTxInfo->BandWidth == 1) {
3842
bool sigb_temp[27] = {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0};
3843
3844
_rtw_memcpy(sig_bi, sigb_temp, 27);
3845
} else if (pPMacTxInfo->BandWidth == 2) {
3846
bool sigb_temp[29] = {0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0};
3847
3848
_rtw_memcpy(sig_bi, sigb_temp, 29);
3849
}
3850
} else { /* Not NDP Sounding*/
3851
bool *sigb_temp[29] = {0};
3852
3853
if (pPMacTxInfo->BandWidth == 0) {
3854
len = 17;
3855
res = 3;
3856
} else if (pPMacTxInfo->BandWidth == 1) {
3857
len = 19;
3858
res = 2;
3859
} else if (pPMacTxInfo->BandWidth == 2) {
3860
len = 21;
3861
res = 2;
3862
} else {
3863
len = 21;
3864
res = 2;
3865
}
3866
total_len = len + res + tail;
3867
crc8_in_len = len + res;
3868
3869
/*Length Field*/
3870
sigb_len = (pPMacTxInfo->PacketLength + 3) >> 2;
3871
3872
for (i = 0; i < len; i++)
3873
sig_bi[i] = (sigb_len >> i) & 0x1;
3874
/*Reserved Field*/
3875
for (i = 0; i < res; i++)
3876
sig_bi[len + i] = 1;
3877
/* CRC-8*/
3878
CRC8_generator(crc8_bi, sig_bi, crc8_in_len);
3879
3880
/* Tail */
3881
for (i = 0; i < tail; i++)
3882
sig_bi[len + res + i] = 0;
3883
}
3884
3885
_rtw_memset(pPMacTxInfo->VHT_SIG_B, 0, 4);
3886
ByteToBit(pPMacTxInfo->VHT_SIG_B, sig_bi, 4);
3887
3888
pPMacTxInfo->VHT_SIG_B_CRC = 0;
3889
ByteToBit(&(pPMacTxInfo->VHT_SIG_B_CRC), crc8_bi, 1);
3890
}
3891
3892
/*=======================
3893
VHT Delimiter
3894
=======================*/
3895
void VHT_Delimiter_generator(
3896
PRT_PMAC_TX_INFO pPMacTxInfo
3897
)
3898
{
3899
bool sig_bi[32] = {0}, crc8[8] = {0};
3900
u32 crc8_in_len = 16;
3901
u32 PacketLength = pPMacTxInfo->PacketLength;
3902
int j;
3903
3904
/* Delimiter[0]: EOF*/
3905
sig_bi[0] = 1;
3906
/* Delimiter[1]: Reserved*/
3907
sig_bi[1] = 0;
3908
/* Delimiter[3:2]: MPDU Length High*/
3909
sig_bi[2] = ((PacketLength - 4) >> 12) % 2;
3910
sig_bi[3] = ((PacketLength - 4) >> 13) % 2;
3911
/* Delimiter[15:4]: MPDU Length Low*/
3912
for (j = 4; j < 16; j++)
3913
sig_bi[j] = ((PacketLength - 4) >> (j - 4)) % 2;
3914
CRC8_generator(crc8, sig_bi, crc8_in_len);
3915
for (j = 16; j < 24; j++) /* Delimiter[23:16]: CRC 8*/
3916
sig_bi[j] = crc8[j - 16];
3917
for (j = 24; j < 32; j++) /* Delimiter[31:24]: Signature ('4E' in Hex, 78 in Dec)*/
3918
sig_bi[j] = (78 >> (j - 24)) % 2;
3919
3920
_rtw_memset(pPMacTxInfo->VHT_Delimiter, 0, 4);
3921
ByteToBit(pPMacTxInfo->VHT_Delimiter, sig_bi, 4);
3922
}
3923
3924
#endif
3925
#endif
3926
3927