1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
4 *
5 * Based on the r8180 driver, which is:
6 * Copyright 2004-2005 Andrea Merello <andrea.merello@gmail.com>, et al.
7 *
8 * Contact Information: wlanfae <wlanfae@realtek.com>
9 */
10 #include "rtl_core.h"
11 #include "r8192E_phy.h"
12 #include "r8192E_phyreg.h"
13 #include "r8190P_rtl8256.h"
14 #include "r8192E_cmdpkt.h"
15 #include "rtl_dm.h"
16 #include "rtl_wx.h"
17
18 static int WDCAPARA_ADD[] = {EDCAPARA_BE, EDCAPARA_BK, EDCAPARA_VI,
19 EDCAPARA_VO};
20
rtl92e_start_beacon(struct net_device * dev)21 void rtl92e_start_beacon(struct net_device *dev)
22 {
23 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
24 struct rtllib_network *net = &priv->rtllib->current_network;
25 u16 BcnTimeCfg = 0;
26 u16 BcnCW = 6;
27 u16 BcnIFS = 0xf;
28
29 rtl92e_irq_disable(dev);
30
31 rtl92e_writew(dev, ATIMWND, 2);
32
33 rtl92e_writew(dev, BCN_INTERVAL, net->beacon_interval);
34 rtl92e_writew(dev, BCN_DRV_EARLY_INT, 10);
35 rtl92e_writew(dev, BCN_DMATIME, 256);
36
37 rtl92e_writeb(dev, BCN_ERR_THRESH, 100);
38
39 BcnTimeCfg |= BcnCW<<BCN_TCFG_CW_SHIFT;
40 BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
41 rtl92e_writew(dev, BCN_TCFG, BcnTimeCfg);
42 rtl92e_irq_enable(dev);
43 }
44
_rtl92e_update_msr(struct net_device * dev)45 static void _rtl92e_update_msr(struct net_device *dev)
46 {
47 struct r8192_priv *priv = rtllib_priv(dev);
48 u8 msr;
49 enum led_ctl_mode LedAction = LED_CTL_NO_LINK;
50
51 msr = rtl92e_readb(dev, MSR);
52 msr &= ~MSR_LINK_MASK;
53
54 switch (priv->rtllib->iw_mode) {
55 case IW_MODE_INFRA:
56 if (priv->rtllib->state == RTLLIB_LINKED)
57 msr |= (MSR_LINK_MANAGED << MSR_LINK_SHIFT);
58 else
59 msr |= (MSR_LINK_NONE << MSR_LINK_SHIFT);
60 LedAction = LED_CTL_LINK;
61 break;
62 case IW_MODE_ADHOC:
63 if (priv->rtllib->state == RTLLIB_LINKED)
64 msr |= (MSR_LINK_ADHOC << MSR_LINK_SHIFT);
65 else
66 msr |= (MSR_LINK_NONE << MSR_LINK_SHIFT);
67 break;
68 case IW_MODE_MASTER:
69 if (priv->rtllib->state == RTLLIB_LINKED)
70 msr |= (MSR_LINK_MASTER << MSR_LINK_SHIFT);
71 else
72 msr |= (MSR_LINK_NONE << MSR_LINK_SHIFT);
73 break;
74 default:
75 break;
76 }
77
78 rtl92e_writeb(dev, MSR, msr);
79 if (priv->rtllib->LedControlHandler)
80 priv->rtllib->LedControlHandler(dev, LedAction);
81 }
82
rtl92e_set_reg(struct net_device * dev,u8 variable,u8 * val)83 void rtl92e_set_reg(struct net_device *dev, u8 variable, u8 *val)
84 {
85 struct r8192_priv *priv = rtllib_priv(dev);
86
87 switch (variable) {
88 case HW_VAR_BSSID:
89 /* BSSIDR 2 byte alignment */
90 rtl92e_writew(dev, BSSIDR, *(u16 *)val);
91 rtl92e_writel(dev, BSSIDR + 2, *(u32 *)(val + 2));
92 break;
93
94 case HW_VAR_MEDIA_STATUS:
95 {
96 enum rt_op_mode OpMode = *((enum rt_op_mode *)(val));
97 u8 btMsr = rtl92e_readb(dev, MSR);
98
99 btMsr &= 0xfc;
100
101 switch (OpMode) {
102 case RT_OP_MODE_INFRASTRUCTURE:
103 btMsr |= MSR_INFRA;
104 break;
105
106 case RT_OP_MODE_IBSS:
107 btMsr |= MSR_ADHOC;
108 break;
109
110 case RT_OP_MODE_AP:
111 btMsr |= MSR_AP;
112 break;
113
114 default:
115 btMsr |= MSR_NOLINK;
116 break;
117 }
118
119 rtl92e_writeb(dev, MSR, btMsr);
120
121 }
122 break;
123
124 case HW_VAR_CECHK_BSSID:
125 {
126 u32 RegRCR, Type;
127
128 Type = val[0];
129 RegRCR = rtl92e_readl(dev, RCR);
130 priv->ReceiveConfig = RegRCR;
131
132 if (Type)
133 RegRCR |= (RCR_CBSSID);
134 else
135 RegRCR &= (~RCR_CBSSID);
136
137 rtl92e_writel(dev, RCR, RegRCR);
138 priv->ReceiveConfig = RegRCR;
139
140 }
141 break;
142
143 case HW_VAR_SLOT_TIME:
144
145 priv->slot_time = val[0];
146 rtl92e_writeb(dev, SLOT_TIME, val[0]);
147
148 break;
149
150 case HW_VAR_ACK_PREAMBLE:
151 {
152 u32 regTmp;
153
154 priv->short_preamble = (bool)*val;
155 regTmp = priv->basic_rate;
156 if (priv->short_preamble)
157 regTmp |= BRSR_AckShortPmb;
158 rtl92e_writel(dev, RRSR, regTmp);
159 break;
160 }
161
162 case HW_VAR_CPU_RST:
163 rtl92e_writel(dev, CPU_GEN, ((u32 *)(val))[0]);
164 break;
165
166 case HW_VAR_AC_PARAM:
167 {
168 u8 pAcParam = *val;
169 u32 eACI = pAcParam;
170 u8 u1bAIFS;
171 u32 u4bAcParam;
172 u8 mode = priv->rtllib->mode;
173 struct rtllib_qos_parameters *qop =
174 &priv->rtllib->current_network.qos_data.parameters;
175
176 u1bAIFS = qop->aifs[pAcParam] *
177 ((mode&(IEEE_G|IEEE_N_24G)) ? 9 : 20) + aSifsTime;
178
179 rtl92e_dm_init_edca_turbo(dev);
180
181 u4bAcParam = (le16_to_cpu(qop->tx_op_limit[pAcParam]) <<
182 AC_PARAM_TXOP_LIMIT_OFFSET) |
183 ((le16_to_cpu(qop->cw_max[pAcParam])) <<
184 AC_PARAM_ECW_MAX_OFFSET) |
185 ((le16_to_cpu(qop->cw_min[pAcParam])) <<
186 AC_PARAM_ECW_MIN_OFFSET) |
187 (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET);
188
189 switch (eACI) {
190 case AC1_BK:
191 rtl92e_writel(dev, EDCAPARA_BK, u4bAcParam);
192 break;
193
194 case AC0_BE:
195 rtl92e_writel(dev, EDCAPARA_BE, u4bAcParam);
196 break;
197
198 case AC2_VI:
199 rtl92e_writel(dev, EDCAPARA_VI, u4bAcParam);
200 break;
201
202 case AC3_VO:
203 rtl92e_writel(dev, EDCAPARA_VO, u4bAcParam);
204 break;
205
206 default:
207 netdev_info(dev, "SetHwReg8185(): invalid ACI: %d !\n",
208 eACI);
209 break;
210 }
211 priv->rtllib->SetHwRegHandler(dev, HW_VAR_ACM_CTRL,
212 &pAcParam);
213 break;
214 }
215
216 case HW_VAR_ACM_CTRL:
217 {
218 struct rtllib_qos_parameters *qos_parameters =
219 &priv->rtllib->current_network.qos_data.parameters;
220 u8 pAcParam = *val;
221 u32 eACI = pAcParam;
222 union aci_aifsn *pAciAifsn = (union aci_aifsn *)&
223 (qos_parameters->aifs[0]);
224 u8 acm = pAciAifsn->f.acm;
225 u8 AcmCtrl = rtl92e_readb(dev, AcmHwCtrl);
226
227 AcmCtrl = AcmCtrl | ((priv->AcmMethod == 2) ? 0x0 : 0x1);
228
229 if (acm) {
230 switch (eACI) {
231 case AC0_BE:
232 AcmCtrl |= AcmHw_BeqEn;
233 break;
234
235 case AC2_VI:
236 AcmCtrl |= AcmHw_ViqEn;
237 break;
238
239 case AC3_VO:
240 AcmCtrl |= AcmHw_VoqEn;
241 break;
242 }
243 } else {
244 switch (eACI) {
245 case AC0_BE:
246 AcmCtrl &= (~AcmHw_BeqEn);
247 break;
248
249 case AC2_VI:
250 AcmCtrl &= (~AcmHw_ViqEn);
251 break;
252
253 case AC3_VO:
254 AcmCtrl &= (~AcmHw_BeqEn);
255 break;
256
257 default:
258 break;
259 }
260 }
261 rtl92e_writeb(dev, AcmHwCtrl, AcmCtrl);
262 break;
263 }
264
265 case HW_VAR_SIFS:
266 rtl92e_writeb(dev, SIFS, val[0]);
267 rtl92e_writeb(dev, SIFS+1, val[0]);
268 break;
269
270 case HW_VAR_RF_TIMING:
271 {
272 u8 Rf_Timing = *val;
273
274 rtl92e_writeb(dev, rFPGA0_RFTiming1, Rf_Timing);
275 break;
276 }
277
278 default:
279 break;
280 }
281
282 }
283
_rtl92e_read_eeprom_info(struct net_device * dev)284 static void _rtl92e_read_eeprom_info(struct net_device *dev)
285 {
286 struct r8192_priv *priv = rtllib_priv(dev);
287 const u8 bMac_Tmp_Addr[ETH_ALEN] = {0x00, 0xe0, 0x4c, 0x00, 0x00, 0x01};
288 u8 tempval;
289 u8 ICVer8192, ICVer8256;
290 u16 i, usValue, IC_Version;
291 u16 EEPROMId;
292
293 EEPROMId = rtl92e_eeprom_read(dev, 0);
294 if (EEPROMId != RTL8190_EEPROM_ID) {
295 netdev_err(dev, "%s(): Invalid EEPROM ID: %x\n", __func__,
296 EEPROMId);
297 priv->AutoloadFailFlag = true;
298 } else {
299 priv->AutoloadFailFlag = false;
300 }
301
302 if (!priv->AutoloadFailFlag) {
303 priv->eeprom_vid = rtl92e_eeprom_read(dev, EEPROM_VID >> 1);
304 priv->eeprom_did = rtl92e_eeprom_read(dev, EEPROM_DID >> 1);
305
306 usValue = rtl92e_eeprom_read(dev,
307 (EEPROM_Customer_ID >> 1)) >> 8;
308 priv->eeprom_CustomerID = usValue & 0xff;
309 usValue = rtl92e_eeprom_read(dev,
310 EEPROM_ICVersion_ChannelPlan>>1);
311 priv->eeprom_ChannelPlan = usValue&0xff;
312 IC_Version = (usValue & 0xff00)>>8;
313
314 ICVer8192 = IC_Version & 0xf;
315 ICVer8256 = (IC_Version & 0xf0)>>4;
316 if (ICVer8192 == 0x2) {
317 if (ICVer8256 == 0x5)
318 priv->card_8192_version = VERSION_8190_BE;
319 }
320 switch (priv->card_8192_version) {
321 case VERSION_8190_BD:
322 case VERSION_8190_BE:
323 break;
324 default:
325 priv->card_8192_version = VERSION_8190_BD;
326 break;
327 }
328 } else {
329 priv->card_8192_version = VERSION_8190_BD;
330 priv->eeprom_vid = 0;
331 priv->eeprom_did = 0;
332 priv->eeprom_CustomerID = 0;
333 priv->eeprom_ChannelPlan = 0;
334 }
335
336 if (!priv->AutoloadFailFlag) {
337 u8 addr[ETH_ALEN];
338
339 for (i = 0; i < 6; i += 2) {
340 usValue = rtl92e_eeprom_read(dev,
341 (EEPROM_NODE_ADDRESS_BYTE_0 + i) >> 1);
342 *(u16 *)(&addr[i]) = usValue;
343 }
344 eth_hw_addr_set(dev, addr);
345 } else {
346 eth_hw_addr_set(dev, bMac_Tmp_Addr);
347 }
348
349 if (priv->card_8192_version > VERSION_8190_BD)
350 priv->bTXPowerDataReadFromEEPORM = true;
351 else
352 priv->bTXPowerDataReadFromEEPORM = false;
353
354 priv->rf_type = RTL819X_DEFAULT_RF_TYPE;
355
356 if (priv->card_8192_version > VERSION_8190_BD) {
357 if (!priv->AutoloadFailFlag) {
358 tempval = (rtl92e_eeprom_read(dev,
359 (EEPROM_RFInd_PowerDiff >> 1))) & 0xff;
360 priv->EEPROMLegacyHTTxPowerDiff = tempval & 0xf;
361
362 if (tempval&0x80)
363 priv->rf_type = RF_1T2R;
364 else
365 priv->rf_type = RF_2T4R;
366 } else {
367 priv->EEPROMLegacyHTTxPowerDiff = 0x04;
368 }
369
370 if (!priv->AutoloadFailFlag)
371 priv->EEPROMThermalMeter = ((rtl92e_eeprom_read(dev,
372 (EEPROM_ThermalMeter>>1))) &
373 0xff00) >> 8;
374 else
375 priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
376 priv->TSSI_13dBm = priv->EEPROMThermalMeter * 100;
377
378 if (priv->epromtype == EEPROM_93C46) {
379 if (!priv->AutoloadFailFlag) {
380 usValue = rtl92e_eeprom_read(dev,
381 EEPROM_TxPwDiff_CrystalCap >> 1);
382 priv->EEPROMAntPwDiff = usValue & 0x0fff;
383 priv->EEPROMCrystalCap = (usValue & 0xf000)
384 >> 12;
385 } else {
386 priv->EEPROMAntPwDiff =
387 EEPROM_Default_AntTxPowerDiff;
388 priv->EEPROMCrystalCap =
389 EEPROM_Default_TxPwDiff_CrystalCap;
390 }
391
392 for (i = 0; i < 14; i += 2) {
393 if (!priv->AutoloadFailFlag)
394 usValue = rtl92e_eeprom_read(dev,
395 (EEPROM_TxPwIndex_CCK + i) >> 1);
396 else
397 usValue = EEPROM_Default_TxPower;
398 *((u16 *)(&priv->EEPROMTxPowerLevelCCK[i])) =
399 usValue;
400 }
401 for (i = 0; i < 14; i += 2) {
402 if (!priv->AutoloadFailFlag)
403 usValue = rtl92e_eeprom_read(dev,
404 (EEPROM_TxPwIndex_OFDM_24G + i) >> 1);
405 else
406 usValue = EEPROM_Default_TxPower;
407 *((u16 *)(&priv->EEPROMTxPowerLevelOFDM24G[i]))
408 = usValue;
409 }
410 }
411 if (priv->epromtype == EEPROM_93C46) {
412 for (i = 0; i < 14; i++) {
413 priv->TxPowerLevelCCK[i] =
414 priv->EEPROMTxPowerLevelCCK[i];
415 priv->TxPowerLevelOFDM24G[i] =
416 priv->EEPROMTxPowerLevelOFDM24G[i];
417 }
418 priv->LegacyHTTxPowerDiff =
419 priv->EEPROMLegacyHTTxPowerDiff;
420 priv->AntennaTxPwDiff[0] = priv->EEPROMAntPwDiff & 0xf;
421 priv->AntennaTxPwDiff[1] = (priv->EEPROMAntPwDiff &
422 0xf0) >> 4;
423 priv->AntennaTxPwDiff[2] = (priv->EEPROMAntPwDiff &
424 0xf00) >> 8;
425 priv->CrystalCap = priv->EEPROMCrystalCap;
426 priv->ThermalMeter[0] = priv->EEPROMThermalMeter & 0xf;
427 priv->ThermalMeter[1] = (priv->EEPROMThermalMeter &
428 0xf0) >> 4;
429 } else if (priv->epromtype == EEPROM_93C56) {
430
431 for (i = 0; i < 3; i++) {
432 priv->TxPowerLevelCCK_A[i] =
433 priv->EEPROMRfACCKChnl1TxPwLevel[0];
434 priv->TxPowerLevelOFDM24G_A[i] =
435 priv->EEPROMRfAOfdmChnlTxPwLevel[0];
436 priv->TxPowerLevelCCK_C[i] =
437 priv->EEPROMRfCCCKChnl1TxPwLevel[0];
438 priv->TxPowerLevelOFDM24G_C[i] =
439 priv->EEPROMRfCOfdmChnlTxPwLevel[0];
440 }
441 for (i = 3; i < 9; i++) {
442 priv->TxPowerLevelCCK_A[i] =
443 priv->EEPROMRfACCKChnl1TxPwLevel[1];
444 priv->TxPowerLevelOFDM24G_A[i] =
445 priv->EEPROMRfAOfdmChnlTxPwLevel[1];
446 priv->TxPowerLevelCCK_C[i] =
447 priv->EEPROMRfCCCKChnl1TxPwLevel[1];
448 priv->TxPowerLevelOFDM24G_C[i] =
449 priv->EEPROMRfCOfdmChnlTxPwLevel[1];
450 }
451 for (i = 9; i < 14; i++) {
452 priv->TxPowerLevelCCK_A[i] =
453 priv->EEPROMRfACCKChnl1TxPwLevel[2];
454 priv->TxPowerLevelOFDM24G_A[i] =
455 priv->EEPROMRfAOfdmChnlTxPwLevel[2];
456 priv->TxPowerLevelCCK_C[i] =
457 priv->EEPROMRfCCCKChnl1TxPwLevel[2];
458 priv->TxPowerLevelOFDM24G_C[i] =
459 priv->EEPROMRfCOfdmChnlTxPwLevel[2];
460 }
461 priv->LegacyHTTxPowerDiff =
462 priv->EEPROMLegacyHTTxPowerDiff;
463 priv->AntennaTxPwDiff[0] = 0;
464 priv->AntennaTxPwDiff[1] = 0;
465 priv->AntennaTxPwDiff[2] = 0;
466 priv->CrystalCap = priv->EEPROMCrystalCap;
467 priv->ThermalMeter[0] = priv->EEPROMThermalMeter & 0xf;
468 priv->ThermalMeter[1] = (priv->EEPROMThermalMeter &
469 0xf0) >> 4;
470 }
471 }
472
473 rtl92e_init_adaptive_rate(dev);
474
475 priv->rf_chip = RF_8256;
476
477 if (priv->RegChannelPlan == 0xf)
478 priv->ChannelPlan = priv->eeprom_ChannelPlan;
479 else
480 priv->ChannelPlan = priv->RegChannelPlan;
481
482 if (priv->eeprom_vid == 0x1186 && priv->eeprom_did == 0x3304)
483 priv->CustomerID = RT_CID_DLINK;
484
485 switch (priv->eeprom_CustomerID) {
486 case EEPROM_CID_DEFAULT:
487 priv->CustomerID = RT_CID_DEFAULT;
488 break;
489 case EEPROM_CID_CAMEO:
490 priv->CustomerID = RT_CID_819x_CAMEO;
491 break;
492 case EEPROM_CID_RUNTOP:
493 priv->CustomerID = RT_CID_819x_RUNTOP;
494 break;
495 case EEPROM_CID_NetCore:
496 priv->CustomerID = RT_CID_819x_Netcore;
497 break;
498 case EEPROM_CID_TOSHIBA:
499 priv->CustomerID = RT_CID_TOSHIBA;
500 if (priv->eeprom_ChannelPlan&0x80)
501 priv->ChannelPlan = priv->eeprom_ChannelPlan&0x7f;
502 else
503 priv->ChannelPlan = 0x0;
504 break;
505 case EEPROM_CID_Nettronix:
506 priv->ScanDelay = 100;
507 priv->CustomerID = RT_CID_Nettronix;
508 break;
509 case EEPROM_CID_Pronet:
510 priv->CustomerID = RT_CID_PRONET;
511 break;
512 case EEPROM_CID_DLINK:
513 priv->CustomerID = RT_CID_DLINK;
514 break;
515
516 case EEPROM_CID_WHQL:
517 break;
518 default:
519 break;
520 }
521
522 if (priv->ChannelPlan > CHANNEL_PLAN_LEN - 1)
523 priv->ChannelPlan = 0;
524 priv->ChannelPlan = COUNTRY_CODE_WORLD_WIDE_13;
525
526 if (priv->eeprom_vid == 0x1186 && priv->eeprom_did == 0x3304)
527 priv->rtllib->bSupportRemoteWakeUp = true;
528 else
529 priv->rtllib->bSupportRemoteWakeUp = false;
530 }
531
rtl92e_get_eeprom_size(struct net_device * dev)532 void rtl92e_get_eeprom_size(struct net_device *dev)
533 {
534 u16 curCR;
535 struct r8192_priv *priv = rtllib_priv(dev);
536
537 curCR = rtl92e_readw(dev, EPROM_CMD);
538 priv->epromtype = (curCR & EPROM_CMD_9356SEL) ? EEPROM_93C56 :
539 EEPROM_93C46;
540 _rtl92e_read_eeprom_info(dev);
541 }
542
_rtl92e_hwconfig(struct net_device * dev)543 static void _rtl92e_hwconfig(struct net_device *dev)
544 {
545 u32 regRATR = 0, regRRSR = 0;
546 u8 regBwOpMode = 0, regTmp = 0;
547 struct r8192_priv *priv = rtllib_priv(dev);
548
549 switch (priv->rtllib->mode) {
550 case WIRELESS_MODE_B:
551 regBwOpMode = BW_OPMODE_20MHZ;
552 regRATR = RATE_ALL_CCK;
553 regRRSR = RATE_ALL_CCK;
554 break;
555 case WIRELESS_MODE_A:
556 regBwOpMode = BW_OPMODE_5G | BW_OPMODE_20MHZ;
557 regRATR = RATE_ALL_OFDM_AG;
558 regRRSR = RATE_ALL_OFDM_AG;
559 break;
560 case WIRELESS_MODE_G:
561 regBwOpMode = BW_OPMODE_20MHZ;
562 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
563 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
564 break;
565 case WIRELESS_MODE_AUTO:
566 case WIRELESS_MODE_N_24G:
567 regBwOpMode = BW_OPMODE_20MHZ;
568 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG |
569 RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
570 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
571 break;
572 case WIRELESS_MODE_N_5G:
573 regBwOpMode = BW_OPMODE_5G;
574 regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS |
575 RATE_ALL_OFDM_2SS;
576 regRRSR = RATE_ALL_OFDM_AG;
577 break;
578 default:
579 regBwOpMode = BW_OPMODE_20MHZ;
580 regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
581 regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
582 break;
583 }
584
585 rtl92e_writeb(dev, BW_OPMODE, regBwOpMode);
586 {
587 u32 ratr_value;
588
589 ratr_value = regRATR;
590 if (priv->rf_type == RF_1T2R)
591 ratr_value &= ~(RATE_ALL_OFDM_2SS);
592 rtl92e_writel(dev, RATR0, ratr_value);
593 rtl92e_writeb(dev, UFWP, 1);
594 }
595 regTmp = rtl92e_readb(dev, 0x313);
596 regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
597 rtl92e_writel(dev, RRSR, regRRSR);
598
599 rtl92e_writew(dev, RETRY_LIMIT,
600 priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT |
601 priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
602 }
603
rtl92e_start_adapter(struct net_device * dev)604 bool rtl92e_start_adapter(struct net_device *dev)
605 {
606 struct r8192_priv *priv = rtllib_priv(dev);
607 u32 ulRegRead;
608 bool rtStatus = true;
609 u8 tmpvalue;
610 u8 ICVersion, SwitchingRegulatorOutput;
611 bool bfirmwareok = true;
612 u32 tmpRegA, TempCCk;
613 int i = 0;
614 u32 retry_times = 0;
615
616 priv->being_init_adapter = true;
617
618 start:
619 rtl92e_reset_desc_ring(dev);
620 priv->Rf_Mode = RF_OP_By_SW_3wire;
621 if (priv->ResetProgress == RESET_TYPE_NORESET) {
622 rtl92e_writeb(dev, ANAPAR, 0x37);
623 mdelay(500);
624 }
625 priv->pFirmware->status = FW_STATUS_0_INIT;
626
627 if (priv->RegRfOff)
628 priv->rtllib->rf_power_state = rf_off;
629
630 ulRegRead = rtl92e_readl(dev, CPU_GEN);
631 if (priv->pFirmware->status == FW_STATUS_0_INIT)
632 ulRegRead |= CPU_GEN_SYSTEM_RESET;
633 else if (priv->pFirmware->status == FW_STATUS_5_READY)
634 ulRegRead |= CPU_GEN_FIRMWARE_RESET;
635 else
636 netdev_err(dev, "%s(): undefined firmware state: %d.\n",
637 __func__, priv->pFirmware->status);
638
639 rtl92e_writel(dev, CPU_GEN, ulRegRead);
640
641 ICVersion = rtl92e_readb(dev, IC_VERRSION);
642 if (ICVersion >= 0x4) {
643 SwitchingRegulatorOutput = rtl92e_readb(dev, SWREGULATOR);
644 if (SwitchingRegulatorOutput != 0xb8) {
645 rtl92e_writeb(dev, SWREGULATOR, 0xa8);
646 mdelay(1);
647 rtl92e_writeb(dev, SWREGULATOR, 0xb8);
648 }
649 }
650 rtStatus = rtl92e_config_bb(dev);
651 if (!rtStatus) {
652 netdev_warn(dev, "%s(): Failed to configure BB\n", __func__);
653 return rtStatus;
654 }
655
656 priv->LoopbackMode = RTL819X_NO_LOOPBACK;
657 if (priv->ResetProgress == RESET_TYPE_NORESET) {
658 ulRegRead = rtl92e_readl(dev, CPU_GEN);
659 if (priv->LoopbackMode == RTL819X_NO_LOOPBACK)
660 ulRegRead = (ulRegRead & CPU_GEN_NO_LOOPBACK_MSK) |
661 CPU_GEN_NO_LOOPBACK_SET;
662 else if (priv->LoopbackMode == RTL819X_MAC_LOOPBACK)
663 ulRegRead |= CPU_CCK_LOOPBACK;
664 else
665 netdev_err(dev, "%s: Invalid loopback mode setting.\n",
666 __func__);
667
668 rtl92e_writel(dev, CPU_GEN, ulRegRead);
669
670 udelay(500);
671 }
672 _rtl92e_hwconfig(dev);
673 rtl92e_writeb(dev, CMDR, CR_RE | CR_TE);
674
675 rtl92e_writeb(dev, PCIF, ((MXDMA2_NoLimit<<MXDMA2_RX_SHIFT) |
676 (MXDMA2_NoLimit<<MXDMA2_TX_SHIFT)));
677 rtl92e_writel(dev, MAC0, ((u32 *)dev->dev_addr)[0]);
678 rtl92e_writew(dev, MAC4, ((u16 *)(dev->dev_addr + 4))[0]);
679 rtl92e_writel(dev, RCR, priv->ReceiveConfig);
680
681 rtl92e_writel(dev, RQPN1, NUM_OF_PAGE_IN_FW_QUEUE_BK <<
682 RSVD_FW_QUEUE_PAGE_BK_SHIFT |
683 NUM_OF_PAGE_IN_FW_QUEUE_BE <<
684 RSVD_FW_QUEUE_PAGE_BE_SHIFT |
685 NUM_OF_PAGE_IN_FW_QUEUE_VI <<
686 RSVD_FW_QUEUE_PAGE_VI_SHIFT |
687 NUM_OF_PAGE_IN_FW_QUEUE_VO <<
688 RSVD_FW_QUEUE_PAGE_VO_SHIFT);
689 rtl92e_writel(dev, RQPN2, NUM_OF_PAGE_IN_FW_QUEUE_MGNT <<
690 RSVD_FW_QUEUE_PAGE_MGNT_SHIFT);
691 rtl92e_writel(dev, RQPN3, APPLIED_RESERVED_QUEUE_IN_FW |
692 NUM_OF_PAGE_IN_FW_QUEUE_BCN <<
693 RSVD_FW_QUEUE_PAGE_BCN_SHIFT|
694 NUM_OF_PAGE_IN_FW_QUEUE_PUB <<
695 RSVD_FW_QUEUE_PAGE_PUB_SHIFT);
696
697 rtl92e_tx_enable(dev);
698 rtl92e_rx_enable(dev);
699 ulRegRead = (0xFFF00000 & rtl92e_readl(dev, RRSR)) |
700 RATE_ALL_OFDM_AG | RATE_ALL_CCK;
701 rtl92e_writel(dev, RRSR, ulRegRead);
702 rtl92e_writel(dev, RATR0+4*7, (RATE_ALL_OFDM_AG | RATE_ALL_CCK));
703
704 rtl92e_writeb(dev, ACK_TIMEOUT, 0x30);
705
706 if (priv->ResetProgress == RESET_TYPE_NORESET)
707 rtl92e_set_wireless_mode(dev, priv->rtllib->mode);
708 rtl92e_cam_reset(dev);
709 {
710 u8 SECR_value = 0x0;
711
712 SECR_value |= SCR_TxEncEnable;
713 SECR_value |= SCR_RxDecEnable;
714 SECR_value |= SCR_NoSKMC;
715 rtl92e_writeb(dev, SECR, SECR_value);
716 }
717 rtl92e_writew(dev, ATIMWND, 2);
718 rtl92e_writew(dev, BCN_INTERVAL, 100);
719
720 for (i = 0; i < QOS_QUEUE_NUM; i++)
721 rtl92e_writel(dev, WDCAPARA_ADD[i], 0x005e4332);
722
723 rtl92e_writeb(dev, 0xbe, 0xc0);
724
725 rtl92e_config_mac(dev);
726
727 if (priv->card_8192_version > VERSION_8190_BD) {
728 rtl92e_get_tx_power(dev);
729 rtl92e_set_tx_power(dev, priv->chan);
730 }
731
732 tmpvalue = rtl92e_readb(dev, IC_VERRSION);
733 priv->IC_Cut = tmpvalue;
734
735 bfirmwareok = rtl92e_init_fw(dev);
736 if (!bfirmwareok) {
737 if (retry_times < 10) {
738 retry_times++;
739 goto start;
740 } else {
741 rtStatus = false;
742 goto end;
743 }
744 }
745
746 if (priv->ResetProgress == RESET_TYPE_NORESET) {
747 rtStatus = rtl92e_config_phy(dev);
748 if (!rtStatus) {
749 netdev_info(dev, "RF Config failed\n");
750 return rtStatus;
751 }
752 }
753
754 rtl92e_set_bb_reg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
755 rtl92e_set_bb_reg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
756
757 rtl92e_writeb(dev, 0x87, 0x0);
758
759 if (priv->RegRfOff) {
760 rtl92e_set_rf_state(dev, rf_off, RF_CHANGE_BY_SW);
761 } else if (priv->rtllib->rf_off_reason > RF_CHANGE_BY_PS) {
762 rtl92e_set_rf_state(dev, rf_off, priv->rtllib->rf_off_reason);
763 } else if (priv->rtllib->rf_off_reason >= RF_CHANGE_BY_IPS) {
764 rtl92e_set_rf_state(dev, rf_off, priv->rtllib->rf_off_reason);
765 } else {
766 priv->rtllib->rf_power_state = rf_on;
767 priv->rtllib->rf_off_reason = 0;
768 }
769
770 if (priv->rtllib->FwRWRF)
771 priv->Rf_Mode = RF_OP_By_FW;
772 else
773 priv->Rf_Mode = RF_OP_By_SW_3wire;
774
775 if (priv->ResetProgress == RESET_TYPE_NORESET) {
776 rtl92e_dm_init_txpower_tracking(dev);
777
778 if (priv->IC_Cut >= IC_VersionCut_D) {
779 tmpRegA = rtl92e_get_bb_reg(dev, rOFDM0_XATxIQImbalance,
780 bMaskDWord);
781 rtl92e_get_bb_reg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord);
782
783 for (i = 0; i < TxBBGainTableLength; i++) {
784 if (tmpRegA == dm_tx_bb_gain[i]) {
785 priv->rfa_txpowertrackingindex = i;
786 priv->rfa_txpowertrackingindex_real = i;
787 priv->rfa_txpowertracking_default =
788 priv->rfa_txpowertrackingindex;
789 break;
790 }
791 }
792
793 TempCCk = rtl92e_get_bb_reg(dev, rCCK0_TxFilter1,
794 bMaskByte2);
795
796 for (i = 0; i < CCKTxBBGainTableLength; i++) {
797 if (TempCCk == dm_cck_tx_bb_gain[i][0]) {
798 priv->CCKPresentAttentuation_20Mdefault = i;
799 break;
800 }
801 }
802 priv->CCKPresentAttentuation_40Mdefault = 0;
803 priv->CCKPresentAttentuation_difference = 0;
804 priv->CCKPresentAttentuation =
805 priv->CCKPresentAttentuation_20Mdefault;
806 priv->btxpower_tracking = false;
807 }
808 }
809 rtl92e_irq_enable(dev);
810 end:
811 priv->being_init_adapter = false;
812 return rtStatus;
813 }
814
_rtl92e_net_update(struct net_device * dev)815 static void _rtl92e_net_update(struct net_device *dev)
816 {
817
818 struct r8192_priv *priv = rtllib_priv(dev);
819 struct rtllib_network *net;
820 u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
821 u16 rate_config = 0;
822
823 net = &priv->rtllib->current_network;
824 rtl92e_config_rate(dev, &rate_config);
825 priv->dot11_current_preamble_mode = PREAMBLE_AUTO;
826 priv->basic_rate = rate_config &= 0x15f;
827 rtl92e_writew(dev, BSSIDR, *(u16 *)net->bssid);
828 rtl92e_writel(dev, BSSIDR + 2, *(u32 *)(net->bssid + 2));
829
830 if (priv->rtllib->iw_mode == IW_MODE_ADHOC) {
831 rtl92e_writew(dev, ATIMWND, 2);
832 rtl92e_writew(dev, BCN_DMATIME, 256);
833 rtl92e_writew(dev, BCN_INTERVAL, net->beacon_interval);
834 rtl92e_writew(dev, BCN_DRV_EARLY_INT, 10);
835 rtl92e_writeb(dev, BCN_ERR_THRESH, 100);
836
837 BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
838 BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
839
840 rtl92e_writew(dev, BCN_TCFG, BcnTimeCfg);
841 }
842 }
843
rtl92e_link_change(struct net_device * dev)844 void rtl92e_link_change(struct net_device *dev)
845 {
846 struct r8192_priv *priv = rtllib_priv(dev);
847 struct rtllib_device *ieee = priv->rtllib;
848
849 if (!priv->up)
850 return;
851
852 if (ieee->state == RTLLIB_LINKED) {
853 _rtl92e_net_update(dev);
854 priv->ops->update_ratr_table(dev);
855 if ((ieee->pairwise_key_type == KEY_TYPE_WEP40) ||
856 (ieee->pairwise_key_type == KEY_TYPE_WEP104))
857 rtl92e_enable_hw_security_config(dev);
858 } else {
859 rtl92e_writeb(dev, 0x173, 0);
860 }
861 _rtl92e_update_msr(dev);
862
863 if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC) {
864 u32 reg;
865
866 reg = rtl92e_readl(dev, RCR);
867 if (priv->rtllib->state == RTLLIB_LINKED) {
868 if (ieee->IntelPromiscuousModeInfo.bPromiscuousOn)
869 ;
870 else
871 priv->ReceiveConfig = reg |= RCR_CBSSID;
872 } else
873 priv->ReceiveConfig = reg &= ~RCR_CBSSID;
874
875 rtl92e_writel(dev, RCR, reg);
876 }
877 }
878
rtl92e_set_monitor_mode(struct net_device * dev,bool bAllowAllDA,bool WriteIntoReg)879 void rtl92e_set_monitor_mode(struct net_device *dev, bool bAllowAllDA,
880 bool WriteIntoReg)
881 {
882 struct r8192_priv *priv = rtllib_priv(dev);
883
884 if (bAllowAllDA)
885 priv->ReceiveConfig |= RCR_AAP;
886 else
887 priv->ReceiveConfig &= ~RCR_AAP;
888
889 if (WriteIntoReg)
890 rtl92e_writel(dev, RCR, priv->ReceiveConfig);
891 }
892
_rtl92e_rate_mgn_to_hw(u8 rate)893 static u8 _rtl92e_rate_mgn_to_hw(u8 rate)
894 {
895 u8 ret = DESC90_RATE1M;
896
897 switch (rate) {
898 case MGN_1M:
899 ret = DESC90_RATE1M;
900 break;
901 case MGN_2M:
902 ret = DESC90_RATE2M;
903 break;
904 case MGN_5_5M:
905 ret = DESC90_RATE5_5M;
906 break;
907 case MGN_11M:
908 ret = DESC90_RATE11M;
909 break;
910 case MGN_6M:
911 ret = DESC90_RATE6M;
912 break;
913 case MGN_9M:
914 ret = DESC90_RATE9M;
915 break;
916 case MGN_12M:
917 ret = DESC90_RATE12M;
918 break;
919 case MGN_18M:
920 ret = DESC90_RATE18M;
921 break;
922 case MGN_24M:
923 ret = DESC90_RATE24M;
924 break;
925 case MGN_36M:
926 ret = DESC90_RATE36M;
927 break;
928 case MGN_48M:
929 ret = DESC90_RATE48M;
930 break;
931 case MGN_54M:
932 ret = DESC90_RATE54M;
933 break;
934 case MGN_MCS0:
935 ret = DESC90_RATEMCS0;
936 break;
937 case MGN_MCS1:
938 ret = DESC90_RATEMCS1;
939 break;
940 case MGN_MCS2:
941 ret = DESC90_RATEMCS2;
942 break;
943 case MGN_MCS3:
944 ret = DESC90_RATEMCS3;
945 break;
946 case MGN_MCS4:
947 ret = DESC90_RATEMCS4;
948 break;
949 case MGN_MCS5:
950 ret = DESC90_RATEMCS5;
951 break;
952 case MGN_MCS6:
953 ret = DESC90_RATEMCS6;
954 break;
955 case MGN_MCS7:
956 ret = DESC90_RATEMCS7;
957 break;
958 case MGN_MCS8:
959 ret = DESC90_RATEMCS8;
960 break;
961 case MGN_MCS9:
962 ret = DESC90_RATEMCS9;
963 break;
964 case MGN_MCS10:
965 ret = DESC90_RATEMCS10;
966 break;
967 case MGN_MCS11:
968 ret = DESC90_RATEMCS11;
969 break;
970 case MGN_MCS12:
971 ret = DESC90_RATEMCS12;
972 break;
973 case MGN_MCS13:
974 ret = DESC90_RATEMCS13;
975 break;
976 case MGN_MCS14:
977 ret = DESC90_RATEMCS14;
978 break;
979 case MGN_MCS15:
980 ret = DESC90_RATEMCS15;
981 break;
982 case (0x80|0x20):
983 ret = DESC90_RATEMCS32;
984 break;
985 default:
986 break;
987 }
988 return ret;
989 }
990
_rtl92e_hw_queue_to_fw_queue(struct net_device * dev,u8 QueueID,u8 priority)991 static u8 _rtl92e_hw_queue_to_fw_queue(struct net_device *dev, u8 QueueID,
992 u8 priority)
993 {
994 u8 QueueSelect = 0x0;
995
996 switch (QueueID) {
997 case BE_QUEUE:
998 QueueSelect = QSLT_BE;
999 break;
1000
1001 case BK_QUEUE:
1002 QueueSelect = QSLT_BK;
1003 break;
1004
1005 case VO_QUEUE:
1006 QueueSelect = QSLT_VO;
1007 break;
1008
1009 case VI_QUEUE:
1010 QueueSelect = QSLT_VI;
1011 break;
1012 case MGNT_QUEUE:
1013 QueueSelect = QSLT_MGNT;
1014 break;
1015 case BEACON_QUEUE:
1016 QueueSelect = QSLT_BEACON;
1017 break;
1018 case TXCMD_QUEUE:
1019 QueueSelect = QSLT_CMD;
1020 break;
1021 case HIGH_QUEUE:
1022 QueueSelect = QSLT_HIGH;
1023 break;
1024 default:
1025 netdev_warn(dev, "%s(): Impossible Queue Selection: %d\n",
1026 __func__, QueueID);
1027 break;
1028 }
1029 return QueueSelect;
1030 }
1031
_rtl92e_query_is_short(u8 TxHT,u8 TxRate,struct cb_desc * tcb_desc)1032 static u8 _rtl92e_query_is_short(u8 TxHT, u8 TxRate, struct cb_desc *tcb_desc)
1033 {
1034 u8 tmp_Short;
1035
1036 tmp_Short = (TxHT == 1) ? ((tcb_desc->bUseShortGI) ? 1 : 0) :
1037 ((tcb_desc->bUseShortPreamble) ? 1 : 0);
1038 if (TxHT == 1 && TxRate != DESC90_RATEMCS15)
1039 tmp_Short = 0;
1040
1041 return tmp_Short;
1042 }
1043
rtl92e_fill_tx_desc(struct net_device * dev,struct tx_desc * pdesc,struct cb_desc * cb_desc,struct sk_buff * skb)1044 void rtl92e_fill_tx_desc(struct net_device *dev, struct tx_desc *pdesc,
1045 struct cb_desc *cb_desc, struct sk_buff *skb)
1046 {
1047 struct r8192_priv *priv = rtllib_priv(dev);
1048 dma_addr_t mapping;
1049 struct tx_fwinfo_8190pci *pTxFwInfo;
1050
1051 pTxFwInfo = (struct tx_fwinfo_8190pci *)skb->data;
1052 memset(pTxFwInfo, 0, sizeof(struct tx_fwinfo_8190pci));
1053 pTxFwInfo->TxHT = (cb_desc->data_rate & 0x80) ? 1 : 0;
1054 pTxFwInfo->TxRate = _rtl92e_rate_mgn_to_hw(cb_desc->data_rate);
1055 pTxFwInfo->EnableCPUDur = cb_desc->bTxEnableFwCalcDur;
1056 pTxFwInfo->Short = _rtl92e_query_is_short(pTxFwInfo->TxHT,
1057 pTxFwInfo->TxRate, cb_desc);
1058
1059 if (cb_desc->bAMPDUEnable) {
1060 pTxFwInfo->AllowAggregation = 1;
1061 pTxFwInfo->RxMF = cb_desc->ampdu_factor;
1062 pTxFwInfo->RxAMD = cb_desc->ampdu_density;
1063 } else {
1064 pTxFwInfo->AllowAggregation = 0;
1065 pTxFwInfo->RxMF = 0;
1066 pTxFwInfo->RxAMD = 0;
1067 }
1068
1069 pTxFwInfo->RtsEnable = (cb_desc->bRTSEnable) ? 1 : 0;
1070 pTxFwInfo->CtsEnable = (cb_desc->bCTSEnable) ? 1 : 0;
1071 pTxFwInfo->RtsSTBC = (cb_desc->bRTSSTBC) ? 1 : 0;
1072 pTxFwInfo->RtsHT = (cb_desc->rts_rate&0x80) ? 1 : 0;
1073 pTxFwInfo->RtsRate = _rtl92e_rate_mgn_to_hw(cb_desc->rts_rate);
1074 pTxFwInfo->RtsBandwidth = 0;
1075 pTxFwInfo->RtsSubcarrier = cb_desc->RTSSC;
1076 pTxFwInfo->RtsShort = (pTxFwInfo->RtsHT == 0) ?
1077 (cb_desc->bRTSUseShortPreamble ? 1 : 0) :
1078 (cb_desc->bRTSUseShortGI ? 1 : 0);
1079 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40) {
1080 if (cb_desc->bPacketBW) {
1081 pTxFwInfo->TxBandwidth = 1;
1082 pTxFwInfo->TxSubCarrier = 0;
1083 } else {
1084 pTxFwInfo->TxBandwidth = 0;
1085 pTxFwInfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
1086 }
1087 } else {
1088 pTxFwInfo->TxBandwidth = 0;
1089 pTxFwInfo->TxSubCarrier = 0;
1090 }
1091
1092 memset((u8 *)pdesc, 0, 12);
1093
1094 mapping = dma_map_single(&priv->pdev->dev, skb->data, skb->len,
1095 DMA_TO_DEVICE);
1096 if (dma_mapping_error(&priv->pdev->dev, mapping)) {
1097 netdev_err(dev, "%s(): DMA Mapping error\n", __func__);
1098 return;
1099 }
1100
1101 pdesc->LINIP = 0;
1102 pdesc->CmdInit = 1;
1103 pdesc->Offset = sizeof(struct tx_fwinfo_8190pci) + 8;
1104 pdesc->PktSize = skb->len - sizeof(struct tx_fwinfo_8190pci);
1105
1106 pdesc->SecCAMID = 0;
1107 pdesc->RATid = cb_desc->RATRIndex;
1108
1109
1110 pdesc->NoEnc = 1;
1111 pdesc->SecType = 0x0;
1112 if (cb_desc->bHwSec) {
1113 static u8 tmp;
1114
1115 if (!tmp) {
1116 tmp = 1;
1117 }
1118 switch (priv->rtllib->pairwise_key_type) {
1119 case KEY_TYPE_WEP40:
1120 case KEY_TYPE_WEP104:
1121 pdesc->SecType = 0x1;
1122 pdesc->NoEnc = 0;
1123 break;
1124 case KEY_TYPE_TKIP:
1125 pdesc->SecType = 0x2;
1126 pdesc->NoEnc = 0;
1127 break;
1128 case KEY_TYPE_CCMP:
1129 pdesc->SecType = 0x3;
1130 pdesc->NoEnc = 0;
1131 break;
1132 case KEY_TYPE_NA:
1133 pdesc->SecType = 0x0;
1134 pdesc->NoEnc = 1;
1135 break;
1136 }
1137 }
1138
1139 pdesc->PktId = 0x0;
1140
1141 pdesc->QueueSelect = _rtl92e_hw_queue_to_fw_queue(dev,
1142 cb_desc->queue_index,
1143 cb_desc->priority);
1144 pdesc->TxFWInfoSize = sizeof(struct tx_fwinfo_8190pci);
1145
1146 pdesc->DISFB = cb_desc->bTxDisableRateFallBack;
1147 pdesc->USERATE = cb_desc->bTxUseDriverAssingedRate;
1148
1149 pdesc->FirstSeg = 1;
1150 pdesc->LastSeg = 1;
1151 pdesc->TxBufferSize = skb->len;
1152
1153 pdesc->TxBuffAddr = mapping;
1154 }
1155
rtl92e_fill_tx_cmd_desc(struct net_device * dev,struct tx_desc_cmd * entry,struct cb_desc * cb_desc,struct sk_buff * skb)1156 void rtl92e_fill_tx_cmd_desc(struct net_device *dev, struct tx_desc_cmd *entry,
1157 struct cb_desc *cb_desc, struct sk_buff *skb)
1158 {
1159 struct r8192_priv *priv = rtllib_priv(dev);
1160 dma_addr_t mapping = dma_map_single(&priv->pdev->dev, skb->data,
1161 skb->len, DMA_TO_DEVICE);
1162
1163 if (dma_mapping_error(&priv->pdev->dev, mapping))
1164 netdev_err(dev, "%s(): DMA Mapping error\n", __func__);
1165 memset(entry, 0, 12);
1166 entry->LINIP = cb_desc->bLastIniPkt;
1167 entry->FirstSeg = 1;
1168 entry->LastSeg = 1;
1169 if (cb_desc->bCmdOrInit == DESC_PACKET_TYPE_INIT) {
1170 entry->CmdInit = DESC_PACKET_TYPE_INIT;
1171 } else {
1172 struct tx_desc *entry_tmp = (struct tx_desc *)entry;
1173
1174 entry_tmp->CmdInit = DESC_PACKET_TYPE_NORMAL;
1175 entry_tmp->Offset = sizeof(struct tx_fwinfo_8190pci) + 8;
1176 entry_tmp->PktSize = cb_desc->pkt_size + entry_tmp->Offset;
1177 entry_tmp->QueueSelect = QSLT_CMD;
1178 entry_tmp->TxFWInfoSize = 0x08;
1179 entry_tmp->RATid = DESC_PACKET_TYPE_INIT;
1180 }
1181 entry->TxBufferSize = skb->len;
1182 entry->TxBuffAddr = mapping;
1183 entry->OWN = 1;
1184 }
1185
_rtl92e_rate_hw_to_mgn(bool bIsHT,u8 rate)1186 static u8 _rtl92e_rate_hw_to_mgn(bool bIsHT, u8 rate)
1187 {
1188 u8 ret_rate = 0x02;
1189
1190 if (!bIsHT) {
1191 switch (rate) {
1192 case DESC90_RATE1M:
1193 ret_rate = MGN_1M;
1194 break;
1195 case DESC90_RATE2M:
1196 ret_rate = MGN_2M;
1197 break;
1198 case DESC90_RATE5_5M:
1199 ret_rate = MGN_5_5M;
1200 break;
1201 case DESC90_RATE11M:
1202 ret_rate = MGN_11M;
1203 break;
1204 case DESC90_RATE6M:
1205 ret_rate = MGN_6M;
1206 break;
1207 case DESC90_RATE9M:
1208 ret_rate = MGN_9M;
1209 break;
1210 case DESC90_RATE12M:
1211 ret_rate = MGN_12M;
1212 break;
1213 case DESC90_RATE18M:
1214 ret_rate = MGN_18M;
1215 break;
1216 case DESC90_RATE24M:
1217 ret_rate = MGN_24M;
1218 break;
1219 case DESC90_RATE36M:
1220 ret_rate = MGN_36M;
1221 break;
1222 case DESC90_RATE48M:
1223 ret_rate = MGN_48M;
1224 break;
1225 case DESC90_RATE54M:
1226 ret_rate = MGN_54M;
1227 break;
1228 }
1229
1230 } else {
1231 switch (rate) {
1232 case DESC90_RATEMCS0:
1233 ret_rate = MGN_MCS0;
1234 break;
1235 case DESC90_RATEMCS1:
1236 ret_rate = MGN_MCS1;
1237 break;
1238 case DESC90_RATEMCS2:
1239 ret_rate = MGN_MCS2;
1240 break;
1241 case DESC90_RATEMCS3:
1242 ret_rate = MGN_MCS3;
1243 break;
1244 case DESC90_RATEMCS4:
1245 ret_rate = MGN_MCS4;
1246 break;
1247 case DESC90_RATEMCS5:
1248 ret_rate = MGN_MCS5;
1249 break;
1250 case DESC90_RATEMCS6:
1251 ret_rate = MGN_MCS6;
1252 break;
1253 case DESC90_RATEMCS7:
1254 ret_rate = MGN_MCS7;
1255 break;
1256 case DESC90_RATEMCS8:
1257 ret_rate = MGN_MCS8;
1258 break;
1259 case DESC90_RATEMCS9:
1260 ret_rate = MGN_MCS9;
1261 break;
1262 case DESC90_RATEMCS10:
1263 ret_rate = MGN_MCS10;
1264 break;
1265 case DESC90_RATEMCS11:
1266 ret_rate = MGN_MCS11;
1267 break;
1268 case DESC90_RATEMCS12:
1269 ret_rate = MGN_MCS12;
1270 break;
1271 case DESC90_RATEMCS13:
1272 ret_rate = MGN_MCS13;
1273 break;
1274 case DESC90_RATEMCS14:
1275 ret_rate = MGN_MCS14;
1276 break;
1277 case DESC90_RATEMCS15:
1278 ret_rate = MGN_MCS15;
1279 break;
1280 case DESC90_RATEMCS32:
1281 ret_rate = 0x80 | 0x20;
1282 break;
1283 }
1284 }
1285
1286 return ret_rate;
1287 }
1288
_rtl92e_signal_scale_mapping(struct r8192_priv * priv,long currsig)1289 static long _rtl92e_signal_scale_mapping(struct r8192_priv *priv, long currsig)
1290 {
1291 long retsig;
1292
1293 if (currsig >= 61 && currsig <= 100)
1294 retsig = 90 + ((currsig - 60) / 4);
1295 else if (currsig >= 41 && currsig <= 60)
1296 retsig = 78 + ((currsig - 40) / 2);
1297 else if (currsig >= 31 && currsig <= 40)
1298 retsig = 66 + (currsig - 30);
1299 else if (currsig >= 21 && currsig <= 30)
1300 retsig = 54 + (currsig - 20);
1301 else if (currsig >= 5 && currsig <= 20)
1302 retsig = 42 + (((currsig - 5) * 2) / 3);
1303 else if (currsig == 4)
1304 retsig = 36;
1305 else if (currsig == 3)
1306 retsig = 27;
1307 else if (currsig == 2)
1308 retsig = 18;
1309 else if (currsig == 1)
1310 retsig = 9;
1311 else
1312 retsig = currsig;
1313
1314 return retsig;
1315 }
1316
1317
1318 #define rx_hal_is_cck_rate(_pdrvinfo)\
1319 ((_pdrvinfo->RxRate == DESC90_RATE1M ||\
1320 _pdrvinfo->RxRate == DESC90_RATE2M ||\
1321 _pdrvinfo->RxRate == DESC90_RATE5_5M ||\
1322 _pdrvinfo->RxRate == DESC90_RATE11M) &&\
1323 !_pdrvinfo->RxHT)
1324
_rtl92e_query_rxphystatus(struct r8192_priv * priv,struct rtllib_rx_stats * pstats,struct rx_desc * pdesc,struct rx_fwinfo * pdrvinfo,struct rtllib_rx_stats * precord_stats,bool bpacket_match_bssid,bool bpacket_toself,bool bPacketBeacon,bool bToSelfBA)1325 static void _rtl92e_query_rxphystatus(
1326 struct r8192_priv *priv,
1327 struct rtllib_rx_stats *pstats,
1328 struct rx_desc *pdesc,
1329 struct rx_fwinfo *pdrvinfo,
1330 struct rtllib_rx_stats *precord_stats,
1331 bool bpacket_match_bssid,
1332 bool bpacket_toself,
1333 bool bPacketBeacon,
1334 bool bToSelfBA
1335 )
1336 {
1337 struct phy_sts_ofdm_819xpci *pofdm_buf;
1338 struct phy_sts_cck_819xpci *pcck_buf;
1339 struct phy_ofdm_rx_status_rxsc_sgien_exintfflag *prxsc;
1340 u8 *prxpkt;
1341 u8 i, max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
1342 s8 rx_pwr[4], rx_pwr_all = 0;
1343 s8 rx_snrX, rx_evmX;
1344 u8 evm, pwdb_all;
1345 u32 RSSI, total_rssi = 0;
1346 u8 is_cck_rate = 0;
1347 u8 rf_rx_num = 0;
1348 static u8 check_reg824;
1349 static u32 reg824_bit9;
1350
1351 priv->stats.numqry_phystatus++;
1352
1353 is_cck_rate = rx_hal_is_cck_rate(pdrvinfo);
1354 memset(precord_stats, 0, sizeof(struct rtllib_rx_stats));
1355 pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID =
1356 bpacket_match_bssid;
1357 pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
1358 pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;
1359 pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
1360 pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
1361 if (check_reg824 == 0) {
1362 reg824_bit9 = rtl92e_get_bb_reg(priv->rtllib->dev,
1363 rFPGA0_XA_HSSIParameter2,
1364 0x200);
1365 check_reg824 = 1;
1366 }
1367
1368
1369 prxpkt = (u8 *)pdrvinfo;
1370
1371 prxpkt += sizeof(struct rx_fwinfo);
1372
1373 pcck_buf = (struct phy_sts_cck_819xpci *)prxpkt;
1374 pofdm_buf = (struct phy_sts_ofdm_819xpci *)prxpkt;
1375
1376 pstats->RxMIMOSignalQuality[0] = -1;
1377 pstats->RxMIMOSignalQuality[1] = -1;
1378 precord_stats->RxMIMOSignalQuality[0] = -1;
1379 precord_stats->RxMIMOSignalQuality[1] = -1;
1380
1381 if (is_cck_rate) {
1382 u8 report;
1383
1384 priv->stats.numqry_phystatusCCK++;
1385 if (!reg824_bit9) {
1386 report = pcck_buf->cck_agc_rpt & 0xc0;
1387 report >>= 6;
1388 switch (report) {
1389 case 0x3:
1390 rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt &
1391 0x3e);
1392 break;
1393 case 0x2:
1394 rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt &
1395 0x3e);
1396 break;
1397 case 0x1:
1398 rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt &
1399 0x3e);
1400 break;
1401 case 0x0:
1402 rx_pwr_all = 8 - (pcck_buf->cck_agc_rpt & 0x3e);
1403 break;
1404 }
1405 } else {
1406 report = pcck_buf->cck_agc_rpt & 0x60;
1407 report >>= 5;
1408 switch (report) {
1409 case 0x3:
1410 rx_pwr_all = -35 -
1411 ((pcck_buf->cck_agc_rpt &
1412 0x1f) << 1);
1413 break;
1414 case 0x2:
1415 rx_pwr_all = -23 -
1416 ((pcck_buf->cck_agc_rpt &
1417 0x1f) << 1);
1418 break;
1419 case 0x1:
1420 rx_pwr_all = -11 -
1421 ((pcck_buf->cck_agc_rpt &
1422 0x1f) << 1);
1423 break;
1424 case 0x0:
1425 rx_pwr_all = -8 -
1426 ((pcck_buf->cck_agc_rpt &
1427 0x1f) << 1);
1428 break;
1429 }
1430 }
1431
1432 pwdb_all = rtl92e_rx_db_to_percent(rx_pwr_all);
1433 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
1434 pstats->RecvSignalPower = rx_pwr_all;
1435
1436 if (bpacket_match_bssid) {
1437 u8 sq;
1438
1439 if (pstats->RxPWDBAll > 40) {
1440 sq = 100;
1441 } else {
1442 sq = pcck_buf->sq_rpt;
1443
1444 if (pcck_buf->sq_rpt > 64)
1445 sq = 0;
1446 else if (pcck_buf->sq_rpt < 20)
1447 sq = 100;
1448 else
1449 sq = ((64-sq) * 100) / 44;
1450 }
1451 pstats->SignalQuality = sq;
1452 precord_stats->SignalQuality = sq;
1453 pstats->RxMIMOSignalQuality[0] = sq;
1454 precord_stats->RxMIMOSignalQuality[0] = sq;
1455 pstats->RxMIMOSignalQuality[1] = -1;
1456 precord_stats->RxMIMOSignalQuality[1] = -1;
1457 }
1458 } else {
1459 priv->stats.numqry_phystatusHT++;
1460 for (i = RF90_PATH_A; i < RF90_PATH_MAX; i++) {
1461 if (priv->brfpath_rxenable[i])
1462 rf_rx_num++;
1463
1464 rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i] & 0x3F) *
1465 2) - 110;
1466
1467 tmp_rxsnr = pofdm_buf->rxsnr_X[i];
1468 rx_snrX = (s8)(tmp_rxsnr);
1469 rx_snrX /= 2;
1470 priv->stats.rxSNRdB[i] = (long)rx_snrX;
1471
1472 RSSI = rtl92e_rx_db_to_percent(rx_pwr[i]);
1473 if (priv->brfpath_rxenable[i])
1474 total_rssi += RSSI;
1475
1476 if (bpacket_match_bssid) {
1477 pstats->RxMIMOSignalStrength[i] = RSSI;
1478 precord_stats->RxMIMOSignalStrength[i] = RSSI;
1479 }
1480 }
1481
1482
1483 rx_pwr_all = (((pofdm_buf->pwdb_all) >> 1) & 0x7f) - 106;
1484 pwdb_all = rtl92e_rx_db_to_percent(rx_pwr_all);
1485
1486 pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
1487 pstats->RxPower = precord_stats->RxPower = rx_pwr_all;
1488 pstats->RecvSignalPower = rx_pwr_all;
1489 if (pdrvinfo->RxHT && pdrvinfo->RxRate >= DESC90_RATEMCS8 &&
1490 pdrvinfo->RxRate <= DESC90_RATEMCS15)
1491 max_spatial_stream = 2;
1492 else
1493 max_spatial_stream = 1;
1494
1495 for (i = 0; i < max_spatial_stream; i++) {
1496 tmp_rxevm = pofdm_buf->rxevm_X[i];
1497 rx_evmX = (s8)(tmp_rxevm);
1498
1499 rx_evmX /= 2;
1500
1501 evm = rtl92e_evm_db_to_percent(rx_evmX);
1502 if (bpacket_match_bssid) {
1503 if (i == 0) {
1504 pstats->SignalQuality = evm & 0xff;
1505 precord_stats->SignalQuality = evm & 0xff;
1506 }
1507 pstats->RxMIMOSignalQuality[i] = evm & 0xff;
1508 precord_stats->RxMIMOSignalQuality[i] = evm & 0xff;
1509 }
1510 }
1511
1512
1513 rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
1514 prxsc = (struct phy_ofdm_rx_status_rxsc_sgien_exintfflag *)
1515 &rxsc_sgien_exflg;
1516 if (pdrvinfo->BW)
1517 priv->stats.received_bwtype[1+prxsc->rxsc]++;
1518 else
1519 priv->stats.received_bwtype[0]++;
1520 }
1521
1522 if (is_cck_rate) {
1523 pstats->SignalStrength = precord_stats->SignalStrength =
1524 _rtl92e_signal_scale_mapping(priv,
1525 (long)pwdb_all);
1526
1527 } else {
1528 if (rf_rx_num != 0)
1529 pstats->SignalStrength = precord_stats->SignalStrength =
1530 _rtl92e_signal_scale_mapping(priv,
1531 (long)(total_rssi /= rf_rx_num));
1532 }
1533 }
1534
_rtl92e_process_phyinfo(struct r8192_priv * priv,u8 * buffer,struct rtllib_rx_stats * prev_st,struct rtllib_rx_stats * curr_st)1535 static void _rtl92e_process_phyinfo(struct r8192_priv *priv, u8 *buffer,
1536 struct rtllib_rx_stats *prev_st,
1537 struct rtllib_rx_stats *curr_st)
1538 {
1539 bool bcheck = false;
1540 u8 rfpath;
1541 u32 ij, tmp_val;
1542 static u32 slide_rssi_index, slide_rssi_statistics;
1543 static u32 slide_evm_index, slide_evm_statistics;
1544 static u32 last_rssi, last_evm;
1545 static u32 slide_beacon_adc_pwdb_index;
1546 static u32 slide_beacon_adc_pwdb_statistics;
1547 static u32 last_beacon_adc_pwdb;
1548 struct rtllib_hdr_3addr *hdr;
1549 u16 sc;
1550 unsigned int seq;
1551
1552 hdr = (struct rtllib_hdr_3addr *)buffer;
1553 sc = le16_to_cpu(hdr->seq_ctl);
1554 seq = WLAN_GET_SEQ_SEQ(sc);
1555 curr_st->Seq_Num = seq;
1556 if (!prev_st->bIsAMPDU)
1557 bcheck = true;
1558
1559 if (slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX) {
1560 slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
1561 last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
1562 priv->stats.slide_rssi_total -= last_rssi;
1563 }
1564 priv->stats.slide_rssi_total += prev_st->SignalStrength;
1565
1566 priv->stats.slide_signal_strength[slide_rssi_index++] =
1567 prev_st->SignalStrength;
1568 if (slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
1569 slide_rssi_index = 0;
1570
1571 tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
1572 priv->stats.signal_strength = rtl92e_translate_to_dbm(priv, tmp_val);
1573 curr_st->rssi = priv->stats.signal_strength;
1574 if (!prev_st->bPacketMatchBSSID) {
1575 if (!prev_st->bToSelfBA)
1576 return;
1577 }
1578
1579 if (!bcheck)
1580 return;
1581
1582 priv->stats.num_process_phyinfo++;
1583 if (!prev_st->bIsCCK && prev_st->bPacketToSelf) {
1584 for (rfpath = RF90_PATH_A; rfpath < RF90_PATH_C; rfpath++) {
1585 if (!rtl92e_is_legal_rf_path(priv->rtllib->dev, rfpath))
1586 continue;
1587 if (priv->stats.rx_rssi_percentage[rfpath] == 0) {
1588 priv->stats.rx_rssi_percentage[rfpath] =
1589 prev_st->RxMIMOSignalStrength[rfpath];
1590 }
1591 if (prev_st->RxMIMOSignalStrength[rfpath] >
1592 priv->stats.rx_rssi_percentage[rfpath]) {
1593 priv->stats.rx_rssi_percentage[rfpath] =
1594 ((priv->stats.rx_rssi_percentage[rfpath]
1595 * (RX_SMOOTH - 1)) +
1596 (prev_st->RxMIMOSignalStrength
1597 [rfpath])) / (RX_SMOOTH);
1598 priv->stats.rx_rssi_percentage[rfpath] =
1599 priv->stats.rx_rssi_percentage[rfpath]
1600 + 1;
1601 } else {
1602 priv->stats.rx_rssi_percentage[rfpath] =
1603 ((priv->stats.rx_rssi_percentage[rfpath] *
1604 (RX_SMOOTH-1)) +
1605 (prev_st->RxMIMOSignalStrength[rfpath])) /
1606 (RX_SMOOTH);
1607 }
1608 }
1609 }
1610
1611
1612 if (prev_st->bPacketBeacon) {
1613 if (slide_beacon_adc_pwdb_statistics++ >=
1614 PHY_Beacon_RSSI_SLID_WIN_MAX) {
1615 slide_beacon_adc_pwdb_statistics =
1616 PHY_Beacon_RSSI_SLID_WIN_MAX;
1617 last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb
1618 [slide_beacon_adc_pwdb_index];
1619 priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
1620 }
1621 priv->stats.Slide_Beacon_Total += prev_st->RxPWDBAll;
1622 priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] =
1623 prev_st->RxPWDBAll;
1624 slide_beacon_adc_pwdb_index++;
1625 if (slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
1626 slide_beacon_adc_pwdb_index = 0;
1627 prev_st->RxPWDBAll = priv->stats.Slide_Beacon_Total /
1628 slide_beacon_adc_pwdb_statistics;
1629 if (prev_st->RxPWDBAll >= 3)
1630 prev_st->RxPWDBAll -= 3;
1631 }
1632 if (prev_st->bPacketToSelf || prev_st->bPacketBeacon ||
1633 prev_st->bToSelfBA) {
1634 if (priv->undecorated_smoothed_pwdb < 0)
1635 priv->undecorated_smoothed_pwdb = prev_st->RxPWDBAll;
1636 if (prev_st->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb) {
1637 priv->undecorated_smoothed_pwdb =
1638 (((priv->undecorated_smoothed_pwdb) *
1639 (RX_SMOOTH-1)) +
1640 (prev_st->RxPWDBAll)) / (RX_SMOOTH);
1641 priv->undecorated_smoothed_pwdb =
1642 priv->undecorated_smoothed_pwdb + 1;
1643 } else {
1644 priv->undecorated_smoothed_pwdb =
1645 (((priv->undecorated_smoothed_pwdb) *
1646 (RX_SMOOTH-1)) +
1647 (prev_st->RxPWDBAll)) / (RX_SMOOTH);
1648 }
1649 rtl92e_update_rx_statistics(priv, prev_st);
1650 }
1651
1652 if (prev_st->SignalQuality != 0) {
1653 if (prev_st->bPacketToSelf || prev_st->bPacketBeacon ||
1654 prev_st->bToSelfBA) {
1655 if (slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX) {
1656 slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
1657 last_evm =
1658 priv->stats.slide_evm[slide_evm_index];
1659 priv->stats.slide_evm_total -= last_evm;
1660 }
1661
1662 priv->stats.slide_evm_total += prev_st->SignalQuality;
1663
1664 priv->stats.slide_evm[slide_evm_index++] =
1665 prev_st->SignalQuality;
1666 if (slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
1667 slide_evm_index = 0;
1668
1669 tmp_val = priv->stats.slide_evm_total /
1670 slide_evm_statistics;
1671 priv->stats.signal_quality = tmp_val;
1672 priv->stats.last_signal_strength_inpercent = tmp_val;
1673 }
1674
1675 if (prev_st->bPacketToSelf ||
1676 prev_st->bPacketBeacon ||
1677 prev_st->bToSelfBA) {
1678 for (ij = 0; ij < 2; ij++) {
1679 if (prev_st->RxMIMOSignalQuality[ij] != -1) {
1680 if (priv->stats.rx_evm_percentage[ij] == 0)
1681 priv->stats.rx_evm_percentage[ij] =
1682 prev_st->RxMIMOSignalQuality[ij];
1683 priv->stats.rx_evm_percentage[ij] =
1684 ((priv->stats.rx_evm_percentage[ij] *
1685 (RX_SMOOTH - 1)) +
1686 (prev_st->RxMIMOSignalQuality[ij])) /
1687 (RX_SMOOTH);
1688 }
1689 }
1690 }
1691 }
1692 }
1693
_rtl92e_translate_rx_signal_stats(struct net_device * dev,struct sk_buff * skb,struct rtllib_rx_stats * pstats,struct rx_desc * pdesc,struct rx_fwinfo * pdrvinfo)1694 static void _rtl92e_translate_rx_signal_stats(struct net_device *dev,
1695 struct sk_buff *skb,
1696 struct rtllib_rx_stats *pstats,
1697 struct rx_desc *pdesc,
1698 struct rx_fwinfo *pdrvinfo)
1699 {
1700 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
1701 bool bpacket_match_bssid, bpacket_toself;
1702 bool bPacketBeacon = false;
1703 struct rtllib_hdr_3addr *hdr;
1704 bool bToSelfBA = false;
1705 static struct rtllib_rx_stats previous_stats;
1706 u16 fc, type;
1707 u8 *tmp_buf;
1708 u8 *praddr;
1709
1710 tmp_buf = skb->data + pstats->RxDrvInfoSize + pstats->RxBufShift;
1711
1712 hdr = (struct rtllib_hdr_3addr *)tmp_buf;
1713 fc = le16_to_cpu(hdr->frame_ctl);
1714 type = WLAN_FC_GET_TYPE(fc);
1715 praddr = hdr->addr1;
1716
1717 bpacket_match_bssid =
1718 ((type != RTLLIB_FTYPE_CTL) &&
1719 ether_addr_equal(priv->rtllib->current_network.bssid,
1720 (fc & RTLLIB_FCTL_TODS) ? hdr->addr1 :
1721 (fc & RTLLIB_FCTL_FROMDS) ? hdr->addr2 :
1722 hdr->addr3) &&
1723 (!pstats->bHwError) && (!pstats->bCRC) && (!pstats->bICV));
1724 bpacket_toself = bpacket_match_bssid && /* check this */
1725 ether_addr_equal(praddr, priv->rtllib->dev->dev_addr);
1726 if (WLAN_FC_GET_FRAMETYPE(fc) == RTLLIB_STYPE_BEACON)
1727 bPacketBeacon = true;
1728 if (bpacket_match_bssid)
1729 priv->stats.numpacket_matchbssid++;
1730 if (bpacket_toself)
1731 priv->stats.numpacket_toself++;
1732 _rtl92e_process_phyinfo(priv, tmp_buf, &previous_stats, pstats);
1733 _rtl92e_query_rxphystatus(priv, pstats, pdesc, pdrvinfo,
1734 &previous_stats, bpacket_match_bssid,
1735 bpacket_toself, bPacketBeacon, bToSelfBA);
1736 rtl92e_copy_mpdu_stats(pstats, &previous_stats);
1737 }
1738
_rtl92e_update_received_rate_histogram_stats(struct net_device * dev,struct rtllib_rx_stats * pstats)1739 static void _rtl92e_update_received_rate_histogram_stats(
1740 struct net_device *dev,
1741 struct rtllib_rx_stats *pstats)
1742 {
1743 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
1744 u32 rcvType = 1;
1745 u32 rateIndex;
1746 u32 preamble_guardinterval;
1747
1748 if (pstats->bCRC)
1749 rcvType = 2;
1750 else if (pstats->bICV)
1751 rcvType = 3;
1752
1753 if (pstats->bShortPreamble)
1754 preamble_guardinterval = 1;
1755 else
1756 preamble_guardinterval = 0;
1757
1758 switch (pstats->rate) {
1759 case MGN_1M:
1760 rateIndex = 0;
1761 break;
1762 case MGN_2M:
1763 rateIndex = 1;
1764 break;
1765 case MGN_5_5M:
1766 rateIndex = 2;
1767 break;
1768 case MGN_11M:
1769 rateIndex = 3;
1770 break;
1771 case MGN_6M:
1772 rateIndex = 4;
1773 break;
1774 case MGN_9M:
1775 rateIndex = 5;
1776 break;
1777 case MGN_12M:
1778 rateIndex = 6;
1779 break;
1780 case MGN_18M:
1781 rateIndex = 7;
1782 break;
1783 case MGN_24M:
1784 rateIndex = 8;
1785 break;
1786 case MGN_36M:
1787 rateIndex = 9;
1788 break;
1789 case MGN_48M:
1790 rateIndex = 10;
1791 break;
1792 case MGN_54M:
1793 rateIndex = 11;
1794 break;
1795 case MGN_MCS0:
1796 rateIndex = 12;
1797 break;
1798 case MGN_MCS1:
1799 rateIndex = 13;
1800 break;
1801 case MGN_MCS2:
1802 rateIndex = 14;
1803 break;
1804 case MGN_MCS3:
1805 rateIndex = 15;
1806 break;
1807 case MGN_MCS4:
1808 rateIndex = 16;
1809 break;
1810 case MGN_MCS5:
1811 rateIndex = 17;
1812 break;
1813 case MGN_MCS6:
1814 rateIndex = 18;
1815 break;
1816 case MGN_MCS7:
1817 rateIndex = 19;
1818 break;
1819 case MGN_MCS8:
1820 rateIndex = 20;
1821 break;
1822 case MGN_MCS9:
1823 rateIndex = 21;
1824 break;
1825 case MGN_MCS10:
1826 rateIndex = 22;
1827 break;
1828 case MGN_MCS11:
1829 rateIndex = 23;
1830 break;
1831 case MGN_MCS12:
1832 rateIndex = 24;
1833 break;
1834 case MGN_MCS13:
1835 rateIndex = 25;
1836 break;
1837 case MGN_MCS14:
1838 rateIndex = 26;
1839 break;
1840 case MGN_MCS15:
1841 rateIndex = 27;
1842 break;
1843 default:
1844 rateIndex = 28;
1845 break;
1846 }
1847 priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++;
1848 priv->stats.received_rate_histogram[0][rateIndex]++;
1849 priv->stats.received_rate_histogram[rcvType][rateIndex]++;
1850 }
1851
rtl92e_get_rx_stats(struct net_device * dev,struct rtllib_rx_stats * stats,struct rx_desc * pdesc,struct sk_buff * skb)1852 bool rtl92e_get_rx_stats(struct net_device *dev, struct rtllib_rx_stats *stats,
1853 struct rx_desc *pdesc, struct sk_buff *skb)
1854 {
1855 struct r8192_priv *priv = rtllib_priv(dev);
1856 struct rx_fwinfo *pDrvInfo = NULL;
1857
1858 stats->bICV = pdesc->ICV;
1859 stats->bCRC = pdesc->CRC32;
1860 stats->bHwError = pdesc->CRC32 | pdesc->ICV;
1861
1862 stats->Length = pdesc->Length;
1863 if (stats->Length < 24)
1864 stats->bHwError |= 1;
1865
1866 if (stats->bHwError) {
1867 stats->bShift = false;
1868
1869 if (pdesc->CRC32) {
1870 if (pdesc->Length < 500)
1871 priv->stats.rxcrcerrmin++;
1872 else if (pdesc->Length > 1000)
1873 priv->stats.rxcrcerrmax++;
1874 else
1875 priv->stats.rxcrcerrmid++;
1876 }
1877 return false;
1878 }
1879
1880 stats->RxDrvInfoSize = pdesc->RxDrvInfoSize;
1881 stats->RxBufShift = (pdesc->Shift) & 0x03;
1882 stats->Decrypted = !pdesc->SWDec;
1883
1884 pDrvInfo = (struct rx_fwinfo *)(skb->data + stats->RxBufShift);
1885
1886 stats->rate = _rtl92e_rate_hw_to_mgn((bool)pDrvInfo->RxHT,
1887 pDrvInfo->RxRate);
1888 stats->bShortPreamble = pDrvInfo->SPLCP;
1889
1890 _rtl92e_update_received_rate_histogram_stats(dev, stats);
1891
1892 stats->bIsAMPDU = (pDrvInfo->PartAggr == 1);
1893 stats->bFirstMPDU = (pDrvInfo->PartAggr == 1) &&
1894 (pDrvInfo->FirstAGGR == 1);
1895
1896 stats->TimeStampLow = pDrvInfo->TSFL;
1897 stats->TimeStampHigh = rtl92e_readl(dev, TSFR+4);
1898
1899 rtl92e_update_rx_pkt_timestamp(dev, stats);
1900
1901 if ((stats->RxBufShift + stats->RxDrvInfoSize) > 0)
1902 stats->bShift = 1;
1903
1904 stats->RxIs40MHzPacket = pDrvInfo->BW;
1905
1906 _rtl92e_translate_rx_signal_stats(dev, skb, stats, pdesc, pDrvInfo);
1907 skb_trim(skb, skb->len - 4/*sCrcLng*/);
1908
1909
1910 stats->packetlength = stats->Length-4;
1911 stats->fraglength = stats->packetlength;
1912 stats->fragoffset = 0;
1913 stats->ntotalfrag = 1;
1914 return true;
1915 }
1916
rtl92e_stop_adapter(struct net_device * dev,bool reset)1917 void rtl92e_stop_adapter(struct net_device *dev, bool reset)
1918 {
1919 struct r8192_priv *priv = rtllib_priv(dev);
1920 int i;
1921 u8 OpMode;
1922 u8 u1bTmp;
1923 u32 ulRegRead;
1924
1925 OpMode = RT_OP_MODE_NO_LINK;
1926 priv->rtllib->SetHwRegHandler(dev, HW_VAR_MEDIA_STATUS, &OpMode);
1927
1928 if (!priv->rtllib->bSupportRemoteWakeUp) {
1929 u1bTmp = 0x0;
1930 rtl92e_writeb(dev, CMDR, u1bTmp);
1931 }
1932
1933 mdelay(20);
1934
1935 if (!reset) {
1936 mdelay(150);
1937
1938 priv->bHwRfOffAction = 2;
1939
1940 if (!priv->rtllib->bSupportRemoteWakeUp) {
1941 rtl92e_set_rf_off(dev);
1942 ulRegRead = rtl92e_readl(dev, CPU_GEN);
1943 ulRegRead |= CPU_GEN_SYSTEM_RESET;
1944 rtl92e_writel(dev, CPU_GEN, ulRegRead);
1945 } else {
1946 rtl92e_writel(dev, WFCRC0, 0xffffffff);
1947 rtl92e_writel(dev, WFCRC1, 0xffffffff);
1948 rtl92e_writel(dev, WFCRC2, 0xffffffff);
1949
1950
1951 rtl92e_writeb(dev, PMR, 0x5);
1952 rtl92e_writeb(dev, MacBlkCtrl, 0xa);
1953 }
1954 }
1955
1956 for (i = 0; i < MAX_QUEUE_SIZE; i++)
1957 skb_queue_purge(&priv->rtllib->skb_waitQ[i]);
1958 for (i = 0; i < MAX_QUEUE_SIZE; i++)
1959 skb_queue_purge(&priv->rtllib->skb_aggQ[i]);
1960
1961 skb_queue_purge(&priv->skb_queue);
1962 }
1963
rtl92e_update_ratr_table(struct net_device * dev)1964 void rtl92e_update_ratr_table(struct net_device *dev)
1965 {
1966 struct r8192_priv *priv = rtllib_priv(dev);
1967 struct rtllib_device *ieee = priv->rtllib;
1968 u8 *pMcsRate = ieee->dot11HTOperationalRateSet;
1969 u32 ratr_value = 0;
1970 u16 rate_config = 0;
1971 u8 rate_index = 0;
1972
1973 rtl92e_config_rate(dev, &rate_config);
1974 ratr_value = rate_config | *pMcsRate << 12;
1975 switch (ieee->mode) {
1976 case IEEE_A:
1977 ratr_value &= 0x00000FF0;
1978 break;
1979 case IEEE_B:
1980 ratr_value &= 0x0000000F;
1981 break;
1982 case IEEE_G:
1983 case IEEE_G|IEEE_B:
1984 ratr_value &= 0x00000FF7;
1985 break;
1986 case IEEE_N_24G:
1987 case IEEE_N_5G:
1988 if (ieee->pHTInfo->peer_mimo_ps == 0) {
1989 ratr_value &= 0x0007F007;
1990 } else {
1991 if (priv->rf_type == RF_1T2R)
1992 ratr_value &= 0x000FF007;
1993 else
1994 ratr_value &= 0x0F81F007;
1995 }
1996 break;
1997 default:
1998 break;
1999 }
2000 ratr_value &= 0x0FFFFFFF;
2001 if (ieee->pHTInfo->cur_tx_bw40mhz &&
2002 ieee->pHTInfo->bCurShortGI40MHz)
2003 ratr_value |= 0x80000000;
2004 else if (!ieee->pHTInfo->cur_tx_bw40mhz &&
2005 ieee->pHTInfo->bCurShortGI20MHz)
2006 ratr_value |= 0x80000000;
2007 rtl92e_writel(dev, RATR0+rate_index*4, ratr_value);
2008 rtl92e_writeb(dev, UFWP, 1);
2009 }
2010
2011 void
rtl92e_init_variables(struct net_device * dev)2012 rtl92e_init_variables(struct net_device *dev)
2013 {
2014 struct r8192_priv *priv = rtllib_priv(dev);
2015
2016 strscpy(priv->nick, "rtl8192E", sizeof(priv->nick));
2017
2018 priv->rtllib->softmac_features = IEEE_SOFTMAC_SCAN |
2019 IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
2020 IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE;
2021
2022 priv->rtllib->tx_headroom = sizeof(struct tx_fwinfo_8190pci);
2023
2024 priv->ShortRetryLimit = 0x30;
2025 priv->LongRetryLimit = 0x30;
2026
2027 priv->ReceiveConfig = RCR_ADD3 |
2028 RCR_AMF | RCR_ADF |
2029 RCR_AICV |
2030 RCR_AB | RCR_AM | RCR_APM |
2031 RCR_AAP | ((u32)7<<RCR_MXDMA_OFFSET) |
2032 ((u32)7 << RCR_FIFO_OFFSET) | RCR_ONLYERLPKT;
2033
2034 priv->irq_mask[0] = (u32)(IMR_ROK | IMR_VODOK | IMR_VIDOK |
2035 IMR_BEDOK | IMR_BKDOK | IMR_HCCADOK |
2036 IMR_MGNTDOK | IMR_COMDOK | IMR_HIGHDOK |
2037 IMR_BDOK | IMR_RXCMDOK | IMR_TIMEOUT0 |
2038 IMR_RDU | IMR_RXFOVW | IMR_TXFOVW |
2039 IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
2040
2041 priv->PwrDomainProtect = false;
2042
2043 priv->bfirst_after_down = false;
2044 }
2045
rtl92e_enable_irq(struct net_device * dev)2046 void rtl92e_enable_irq(struct net_device *dev)
2047 {
2048 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
2049
2050 priv->irq_enabled = 1;
2051
2052 rtl92e_writel(dev, INTA_MASK, priv->irq_mask[0]);
2053
2054 }
2055
rtl92e_disable_irq(struct net_device * dev)2056 void rtl92e_disable_irq(struct net_device *dev)
2057 {
2058 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
2059
2060 rtl92e_writel(dev, INTA_MASK, 0);
2061
2062 priv->irq_enabled = 0;
2063 }
2064
rtl92e_clear_irq(struct net_device * dev)2065 void rtl92e_clear_irq(struct net_device *dev)
2066 {
2067 u32 tmp;
2068
2069 tmp = rtl92e_readl(dev, ISR);
2070 rtl92e_writel(dev, ISR, tmp);
2071 }
2072
2073
rtl92e_enable_rx(struct net_device * dev)2074 void rtl92e_enable_rx(struct net_device *dev)
2075 {
2076 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
2077
2078 rtl92e_writel(dev, RDQDA, priv->rx_ring_dma[RX_MPDU_QUEUE]);
2079 }
2080
2081 static const u32 TX_DESC_BASE[] = {
2082 BKQDA, BEQDA, VIQDA, VOQDA, HCCAQDA, CQDA, MQDA, HQDA, BQDA
2083 };
2084
rtl92e_enable_tx(struct net_device * dev)2085 void rtl92e_enable_tx(struct net_device *dev)
2086 {
2087 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
2088 u32 i;
2089
2090 for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
2091 rtl92e_writel(dev, TX_DESC_BASE[i], priv->tx_ring[i].dma);
2092 }
2093
2094
rtl92e_ack_irq(struct net_device * dev,u32 * p_inta,u32 * p_intb)2095 void rtl92e_ack_irq(struct net_device *dev, u32 *p_inta, u32 *p_intb)
2096 {
2097 *p_inta = rtl92e_readl(dev, ISR);
2098 rtl92e_writel(dev, ISR, *p_inta);
2099 }
2100
rtl92e_is_rx_stuck(struct net_device * dev)2101 bool rtl92e_is_rx_stuck(struct net_device *dev)
2102 {
2103 struct r8192_priv *priv = rtllib_priv(dev);
2104 u16 RegRxCounter = rtl92e_readw(dev, 0x130);
2105 bool bStuck = false;
2106 static u8 rx_chk_cnt;
2107 u32 SlotIndex = 0, TotalRxStuckCount = 0;
2108 u8 i;
2109 u8 SilentResetRxSoltNum = 4;
2110
2111 rx_chk_cnt++;
2112 if (priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5)) {
2113 rx_chk_cnt = 0;
2114 } else if ((priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High + 5))
2115 && (((priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) &&
2116 (priv->undecorated_smoothed_pwdb >= RateAdaptiveTH_Low_40M))
2117 || ((priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20) &&
2118 (priv->undecorated_smoothed_pwdb >= RateAdaptiveTH_Low_20M)))) {
2119 if (rx_chk_cnt < 2)
2120 return bStuck;
2121 rx_chk_cnt = 0;
2122 } else if ((((priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) &&
2123 (priv->undecorated_smoothed_pwdb < RateAdaptiveTH_Low_40M)) ||
2124 ((priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20) &&
2125 (priv->undecorated_smoothed_pwdb < RateAdaptiveTH_Low_20M))) &&
2126 priv->undecorated_smoothed_pwdb >= VeryLowRSSI) {
2127 if (rx_chk_cnt < 4)
2128 return bStuck;
2129 rx_chk_cnt = 0;
2130 } else {
2131 if (rx_chk_cnt < 8)
2132 return bStuck;
2133 rx_chk_cnt = 0;
2134 }
2135
2136
2137 SlotIndex = (priv->SilentResetRxSlotIndex++)%SilentResetRxSoltNum;
2138
2139 if (priv->RxCounter == RegRxCounter) {
2140 priv->SilentResetRxStuckEvent[SlotIndex] = 1;
2141
2142 for (i = 0; i < SilentResetRxSoltNum; i++)
2143 TotalRxStuckCount += priv->SilentResetRxStuckEvent[i];
2144
2145 if (TotalRxStuckCount == SilentResetRxSoltNum) {
2146 bStuck = true;
2147 for (i = 0; i < SilentResetRxSoltNum; i++)
2148 TotalRxStuckCount +=
2149 priv->SilentResetRxStuckEvent[i];
2150 }
2151
2152
2153 } else {
2154 priv->SilentResetRxStuckEvent[SlotIndex] = 0;
2155 }
2156
2157 priv->RxCounter = RegRxCounter;
2158
2159 return bStuck;
2160 }
2161
rtl92e_is_tx_stuck(struct net_device * dev)2162 bool rtl92e_is_tx_stuck(struct net_device *dev)
2163 {
2164 struct r8192_priv *priv = rtllib_priv(dev);
2165 bool bStuck = false;
2166 u16 RegTxCounter = rtl92e_readw(dev, 0x128);
2167
2168 if (priv->TxCounter == RegTxCounter)
2169 bStuck = true;
2170
2171 priv->TxCounter = RegTxCounter;
2172
2173 return bStuck;
2174 }
2175
rtl92e_get_nmode_support_by_sec(struct net_device * dev)2176 bool rtl92e_get_nmode_support_by_sec(struct net_device *dev)
2177 {
2178 struct r8192_priv *priv = rtllib_priv(dev);
2179 struct rtllib_device *ieee = priv->rtllib;
2180
2181 if (ieee->rtllib_ap_sec_type &&
2182 (ieee->rtllib_ap_sec_type(priv->rtllib)&(SEC_ALG_WEP |
2183 SEC_ALG_TKIP))) {
2184 return false;
2185 } else {
2186 return true;
2187 }
2188 }
2189
rtl92e_is_halfn_supported_by_ap(struct net_device * dev)2190 bool rtl92e_is_halfn_supported_by_ap(struct net_device *dev)
2191 {
2192 struct r8192_priv *priv = rtllib_priv(dev);
2193 struct rtllib_device *ieee = priv->rtllib;
2194
2195 return ieee->bHalfWirelessN24GMode;
2196 }
2197