1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Copyright(c) 2016 - 2017 Realtek Corporation.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun * published by the Free Software Foundation.
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun * more details.
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun *****************************************************************************/
15*4882a593Smuzhiyun #define _RTL8821C_OPS_C_
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #include <drv_types.h> /* basic_types.h, rtw_io.h and etc. */
18*4882a593Smuzhiyun #include <rtw_xmit.h> /* struct xmit_priv */
19*4882a593Smuzhiyun #ifdef DBG_CONFIG_ERROR_DETECT
20*4882a593Smuzhiyun #include <rtw_sreset.h>
21*4882a593Smuzhiyun #endif /* DBG_CONFIG_ERROR_DETECT */
22*4882a593Smuzhiyun #include <hal_data.h> /* PHAL_DATA_TYPE, GET_HAL_DATA() */
23*4882a593Smuzhiyun #include <hal_com.h> /* dump_chip_info() and etc. */
24*4882a593Smuzhiyun #include "../hal_halmac.h" /* GET_RX_DESC_XXX_8821C() */
25*4882a593Smuzhiyun #include "rtl8821c.h"
26*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
27*4882a593Smuzhiyun #include "rtl8821ce_hal.h"
28*4882a593Smuzhiyun #endif
29*4882a593Smuzhiyun #include "rtl8821c_dm.h"
30*4882a593Smuzhiyun #ifdef CONFIG_SDIO_HCI
31*4882a593Smuzhiyun #include "sdio/rtl8821cs.h"
32*4882a593Smuzhiyun #endif
33*4882a593Smuzhiyun
read_chip_version(PADAPTER adapter)34*4882a593Smuzhiyun static void read_chip_version(PADAPTER adapter)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun PHAL_DATA_TYPE hal;
37*4882a593Smuzhiyun u32 value32;
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun hal = GET_HAL_DATA(adapter);
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun value32 = rtw_read32(adapter, REG_SYS_CFG1_8821C);
43*4882a593Smuzhiyun hal->version_id.ICType = CHIP_8821C;
44*4882a593Smuzhiyun hal->version_id.ChipType = ((value32 & BIT_RTL_ID_8821C) ? TEST_CHIP : NORMAL_CHIP);
45*4882a593Smuzhiyun hal->version_id.CUTVersion = BIT_GET_CHIP_VER_8821C(value32);
46*4882a593Smuzhiyun hal->version_id.VendorType = BIT_GET_VENDOR_ID_8821C(value32);
47*4882a593Smuzhiyun hal->version_id.VendorType >>= 2;
48*4882a593Smuzhiyun switch (hal->version_id.VendorType) {
49*4882a593Smuzhiyun case 0:
50*4882a593Smuzhiyun hal->version_id.VendorType = CHIP_VENDOR_TSMC;
51*4882a593Smuzhiyun break;
52*4882a593Smuzhiyun case 1:
53*4882a593Smuzhiyun hal->version_id.VendorType = CHIP_VENDOR_SMIC;
54*4882a593Smuzhiyun break;
55*4882a593Smuzhiyun case 2:
56*4882a593Smuzhiyun hal->version_id.VendorType = CHIP_VENDOR_UMC;
57*4882a593Smuzhiyun break;
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun hal->version_id.RFType = ((value32 & BIT_RF_TYPE_ID_8821C) ? RF_TYPE_2T2R : RF_TYPE_1T1R);
60*4882a593Smuzhiyun hal->RegulatorMode = ((value32 & BIT_SPSLDO_SEL_8821C) ? RT_LDO_REGULATOR : RT_SWITCHING_REGULATOR);
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun value32 = rtw_read32(adapter, REG_SYS_STATUS1_8821C);
63*4882a593Smuzhiyun hal->version_id.ROMVer = BIT_GET_RF_RL_ID_8821C(value32);
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun /* For multi-function consideration. */
66*4882a593Smuzhiyun hal->MultiFunc = RT_MULTI_FUNC_NONE;
67*4882a593Smuzhiyun value32 = rtw_read32(adapter, REG_WL_BT_PWR_CTRL_8821C);
68*4882a593Smuzhiyun hal->MultiFunc |= ((value32 & BIT_WL_FUNC_EN_8821C) ? RT_MULTI_FUNC_WIFI : 0);
69*4882a593Smuzhiyun hal->MultiFunc |= ((value32 & BIT_BT_FUNC_EN_8821C) ? RT_MULTI_FUNC_BT : 0);
70*4882a593Smuzhiyun hal->PolarityCtl = ((value32 & BIT_WL_HWPDN_SL_8821C) ? RT_POLARITY_HIGH_ACT : RT_POLARITY_LOW_ACT);
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun dump_chip_info(hal->version_id);
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun /*
76*4882a593Smuzhiyun * Return:
77*4882a593Smuzhiyun * _TRUE valid ID
78*4882a593Smuzhiyun * _FALSE invalid ID
79*4882a593Smuzhiyun */
Hal_EfuseParseIDCode(PADAPTER adapter,u8 * map)80*4882a593Smuzhiyun static u8 Hal_EfuseParseIDCode(PADAPTER adapter, u8 *map)
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun u16 EEPROMId;
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun /* Check 0x8129 again for making sure autoload status!! */
86*4882a593Smuzhiyun EEPROMId = le16_to_cpu(*(u16 *)map);
87*4882a593Smuzhiyun RTW_INFO("EEPROM ID = 0x%04x\n", EEPROMId);
88*4882a593Smuzhiyun if (EEPROMId == RTL_EEPROM_ID)
89*4882a593Smuzhiyun return _TRUE;
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun RTW_INFO("<WARN> EEPROM ID is invalid!!\n");
92*4882a593Smuzhiyun return _FALSE;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun
Hal_EfuseParseEEPROMVer(PADAPTER adapter,u8 * map,u8 mapvalid)95*4882a593Smuzhiyun static void Hal_EfuseParseEEPROMVer(PADAPTER adapter, u8 *map, u8 mapvalid)
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun if (_TRUE == mapvalid)
101*4882a593Smuzhiyun hal->EEPROMVersion = map[EEPROM_VERSION_8821C];
102*4882a593Smuzhiyun else
103*4882a593Smuzhiyun hal->EEPROMVersion = 1;
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun RTW_INFO("EEPROM Version = %d\n", hal->EEPROMVersion);
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun
Hal_EfuseParseTxPowerInfo(PADAPTER adapter,u8 * map,u8 mapvalid)108*4882a593Smuzhiyun static void Hal_EfuseParseTxPowerInfo(PADAPTER adapter, u8 *map, u8 mapvalid)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun hal->txpwr_pg_mode = TXPWR_PG_WITH_PWR_IDX;
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun if ((_TRUE == mapvalid) && (map[EEPROM_RF_BOARD_OPTION_8821C] != 0xFF))
115*4882a593Smuzhiyun hal->EEPROMRegulatory = map[EEPROM_RF_BOARD_OPTION_8821C] & 0x7; /* bit0~2 */
116*4882a593Smuzhiyun else
117*4882a593Smuzhiyun hal->EEPROMRegulatory = EEPROM_DEFAULT_BOARD_OPTION & 0x7; /* bit0~2 */
118*4882a593Smuzhiyun RTW_INFO("EEPROM Regulatory=0x%02x\n", hal->EEPROMRegulatory);
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun
Hal_EfuseParseBoardType(PADAPTER adapter,u8 * map,u8 mapvalid)121*4882a593Smuzhiyun static void Hal_EfuseParseBoardType(PADAPTER adapter, u8 *map, u8 mapvalid)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun if ((_TRUE == mapvalid) && (map[EEPROM_RF_BOARD_OPTION_8821C] != 0xFF))
127*4882a593Smuzhiyun hal->InterfaceSel = (map[EEPROM_RF_BOARD_OPTION_8821C] & 0xE0) >> 5;
128*4882a593Smuzhiyun else
129*4882a593Smuzhiyun hal->InterfaceSel = (EEPROM_DEFAULT_BOARD_OPTION & 0xE0) >> 5;
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun RTW_INFO("EEPROM Board Type=0x%02x\n", hal->InterfaceSel);
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
Hal_EfuseParseBTCoexistInfo(PADAPTER adapter,u8 * map,u8 mapvalid)134*4882a593Smuzhiyun static void Hal_EfuseParseBTCoexistInfo(PADAPTER adapter, u8 *map, u8 mapvalid)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
137*4882a593Smuzhiyun u8 setting;
138*4882a593Smuzhiyun u32 tmpu4;
139*4882a593Smuzhiyun u32 tmp_u32;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun if ((mapvalid == _TRUE) && (map[EEPROM_RF_BOARD_OPTION_8821C] != 0xFF)) {
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun tmp_u32 = rtw_read32(adapter, REG_WL_BT_PWR_CTRL_8821C);
144*4882a593Smuzhiyun /* 0xc1[7:5] = 0x01 (Combo card) */
145*4882a593Smuzhiyun if ((((map[EEPROM_RF_BOARD_OPTION_8821C] & 0xe0) >> 5) == 0x01) && (tmp_u32 & BIT_BT_FUNC_EN_8821C))
146*4882a593Smuzhiyun hal->EEPROMBluetoothCoexist = _TRUE;
147*4882a593Smuzhiyun else
148*4882a593Smuzhiyun hal->EEPROMBluetoothCoexist = _FALSE;
149*4882a593Smuzhiyun } else
150*4882a593Smuzhiyun hal->EEPROMBluetoothCoexist = _FALSE;
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun hal->EEPROMBluetoothType = BT_RTL8821C;
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun setting = map[EEPROM_RF_BT_SETTING_8821C];
155*4882a593Smuzhiyun if ((_TRUE == mapvalid) && (setting != 0xFF)) {
156*4882a593Smuzhiyun /* Bit[0]: Total antenna number
157*4882a593Smuzhiyun * 0: 2-Antenna (WL BT not share Ant, concurrent mode)
158*4882a593Smuzhiyun * 1: 1-Antenna (WL BT share Ant, TDMA mode)
159*4882a593Smuzhiyun */
160*4882a593Smuzhiyun hal->EEPROMBluetoothAntNum = setting & BIT(0);
161*4882a593Smuzhiyun /*
162*4882a593Smuzhiyun * Bit[6]: One-Ant structure use Ant2(aux.) path or Ant1(main) path
163*4882a593Smuzhiyun * 0: Ant2(aux.)
164*4882a593Smuzhiyun * 1: Ant1(main), default
165*4882a593Smuzhiyun */
166*4882a593Smuzhiyun hal->ant_path = (setting & BIT(6)) ? RF_PATH_B : RF_PATH_A;
167*4882a593Smuzhiyun } else {
168*4882a593Smuzhiyun hal->EEPROMBluetoothAntNum = Ant_x1;
169*4882a593Smuzhiyun hal->ant_path = RF_PATH_A;
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun RTW_INFO("EEPROM %s BT-coex, ant_num=%d\n",
173*4882a593Smuzhiyun hal->EEPROMBluetoothCoexist == _TRUE ? "Enable" : "Disable",
174*4882a593Smuzhiyun hal->EEPROMBluetoothAntNum == Ant_x2 ? 2 : 1);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun
Hal_EfuseParseChnlPlan(PADAPTER adapter,u8 * map,u8 autoloadfail)177*4882a593Smuzhiyun static void Hal_EfuseParseChnlPlan(PADAPTER adapter, u8 *map, u8 autoloadfail)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun hal_com_config_channel_plan(
180*4882a593Smuzhiyun adapter,
181*4882a593Smuzhiyun map ? &map[EEPROM_COUNTRY_CODE_8821C] : NULL,
182*4882a593Smuzhiyun map ? map[EEPROM_CHANNEL_PLAN_8821C] : 0xFF,
183*4882a593Smuzhiyun RTW_CHPLAN_6G_NULL,
184*4882a593Smuzhiyun autoloadfail
185*4882a593Smuzhiyun );
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
Hal_EfuseParseXtal(PADAPTER adapter,u8 * map,u8 mapvalid)188*4882a593Smuzhiyun static void Hal_EfuseParseXtal(PADAPTER adapter, u8 *map, u8 mapvalid)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun if ((_TRUE == mapvalid) && map[EEPROM_XTAL_8821C] != 0xFF)
194*4882a593Smuzhiyun hal->crystal_cap = map[EEPROM_XTAL_8821C];
195*4882a593Smuzhiyun else
196*4882a593Smuzhiyun hal->crystal_cap = EEPROM_Default_CrystalCap;
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun RTW_INFO("EEPROM crystal_cap=0x%02x\n", hal->crystal_cap);
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun
Hal_EfuseParseThermalMeter(PADAPTER adapter,u8 * map,u8 mapvalid)201*4882a593Smuzhiyun static void Hal_EfuseParseThermalMeter(PADAPTER adapter, u8 *map, u8 mapvalid)
202*4882a593Smuzhiyun {
203*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun /* ThermalMeter from EEPROM */
207*4882a593Smuzhiyun if ((_TRUE == mapvalid) && (map[EEPROM_THERMAL_METER_8821C] != 0xFF))
208*4882a593Smuzhiyun hal->eeprom_thermal_meter = map[EEPROM_THERMAL_METER_8821C];
209*4882a593Smuzhiyun else {
210*4882a593Smuzhiyun hal->eeprom_thermal_meter = EEPROM_Default_ThermalMeter;
211*4882a593Smuzhiyun hal->odmpriv.rf_calibrate_info.is_apk_thermal_meter_ignore = _TRUE;
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun RTW_INFO("EEPROM ThermalMeter=0x%02x\n", hal->eeprom_thermal_meter);
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun
Hal_EfuseParseAntennaDiversity(PADAPTER adapter,u8 * map,u8 mapvalid)217*4882a593Smuzhiyun static void Hal_EfuseParseAntennaDiversity(PADAPTER adapter, u8 *map, u8 mapvalid)
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun #ifdef CONFIG_ANTENNA_DIVERSITY
220*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
221*4882a593Smuzhiyun struct registry_priv *registry_par = &adapter->registrypriv;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun if (hal->EEPROMBluetoothCoexist == _TRUE && hal->EEPROMBluetoothAntNum == Ant_x1)
225*4882a593Smuzhiyun hal->AntDivCfg = 0;
226*4882a593Smuzhiyun else {
227*4882a593Smuzhiyun if (registry_par->antdiv_cfg == 2)/* 0:OFF , 1:ON, 2:By EFUSE */
228*4882a593Smuzhiyun hal->AntDivCfg = (map[EEPROM_RF_BOARD_OPTION_8821C] & BIT3) ? _TRUE : _FALSE;
229*4882a593Smuzhiyun else
230*4882a593Smuzhiyun hal->AntDivCfg = registry_par->antdiv_cfg;
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun /*hal->TRxAntDivType = S0S1_TRX_HW_ANTDIV;*/
233*4882a593Smuzhiyun hal->with_extenal_ant_switch = ((map[EEPROM_RF_BT_SETTING_8821C] & BIT7) >> 7);
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun RTW_INFO("%s:EEPROM AntDivCfg=%d, AntDivType=%d, external_ant_switch:%d\n",
236*4882a593Smuzhiyun __func__, hal->AntDivCfg, hal->TRxAntDivType, hal->with_extenal_ant_switch);
237*4882a593Smuzhiyun #endif /* CONFIG_ANTENNA_DIVERSITY */
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun
Hal_EfuseTxBBSwing(PADAPTER adapter,u8 * map,u8 mapvalid)240*4882a593Smuzhiyun static void Hal_EfuseTxBBSwing(PADAPTER adapter, u8 *map, u8 mapvalid)
241*4882a593Smuzhiyun {
242*4882a593Smuzhiyun PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun if (_TRUE == mapvalid) {
245*4882a593Smuzhiyun hal_data->tx_bbswing_24G = map[EEPROM_TX_BBSWING_2G_8821C];
246*4882a593Smuzhiyun if (0xFF == hal_data->tx_bbswing_24G)
247*4882a593Smuzhiyun hal_data->tx_bbswing_24G = 0;
248*4882a593Smuzhiyun hal_data->tx_bbswing_5G = map[EEPROM_TX_BBSWING_5G_8821C];
249*4882a593Smuzhiyun if (0xFF == hal_data->tx_bbswing_5G)
250*4882a593Smuzhiyun hal_data->tx_bbswing_5G = 0;
251*4882a593Smuzhiyun } else {
252*4882a593Smuzhiyun hal_data->tx_bbswing_24G = 0;
253*4882a593Smuzhiyun hal_data->tx_bbswing_5G = 0;
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun RTW_INFO("EEPROM tx_bbswing_24G =0x%02x\n", hal_data->tx_bbswing_24G);
256*4882a593Smuzhiyun RTW_INFO("EEPROM tx_bbswing_5G =0x%02x\n", hal_data->tx_bbswing_5G);
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun
Hal_EfuseParseCustomerID(PADAPTER adapter,u8 * map,u8 mapvalid)259*4882a593Smuzhiyun static void Hal_EfuseParseCustomerID(PADAPTER adapter, u8 *map, u8 mapvalid)
260*4882a593Smuzhiyun {
261*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun if (_TRUE == mapvalid)
265*4882a593Smuzhiyun hal->EEPROMCustomerID = map[EEPROM_CUSTOMER_ID_8821C];
266*4882a593Smuzhiyun else
267*4882a593Smuzhiyun hal->EEPROMCustomerID = 0;
268*4882a593Smuzhiyun RTW_INFO("EEPROM Customer ID=0x%02x\n", hal->EEPROMCustomerID);
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun
Hal_DetectWoWMode(PADAPTER adapter)271*4882a593Smuzhiyun static void Hal_DetectWoWMode(PADAPTER adapter)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
274*4882a593Smuzhiyun adapter_to_pwrctl(adapter)->bSupportRemoteWakeup = _TRUE;
275*4882a593Smuzhiyun #else /* !(CONFIG_WOWLAN || CONFIG_AP_WOWLAN) */
276*4882a593Smuzhiyun adapter_to_pwrctl(adapter)->bSupportRemoteWakeup = _FALSE;
277*4882a593Smuzhiyun #endif /* !(CONFIG_WOWLAN || CONFIG_AP_WOWLAN) */
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun RTW_INFO("EEPROM SupportRemoteWakeup=%d\n", adapter_to_pwrctl(adapter)->bSupportRemoteWakeup);
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun
hal_ReadPAType(PADAPTER adapter,u8 * map,u8 mapvalid)282*4882a593Smuzhiyun static void hal_ReadPAType(PADAPTER adapter, u8 *map, u8 mapvalid)
283*4882a593Smuzhiyun {
284*4882a593Smuzhiyun PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun if (mapvalid) {
287*4882a593Smuzhiyun /* AUTO - Get INFO from eFuse*/
288*4882a593Smuzhiyun if (GetRegAmplifierType2G(adapter) == 0) {
289*4882a593Smuzhiyun switch (hal_data->rfe_type) {
290*4882a593Smuzhiyun default:
291*4882a593Smuzhiyun hal_data->PAType_2G = 0;
292*4882a593Smuzhiyun hal_data->LNAType_2G = 0;
293*4882a593Smuzhiyun hal_data->ExternalPA_2G = 0;
294*4882a593Smuzhiyun hal_data->ExternalLNA_2G = 0;
295*4882a593Smuzhiyun break;
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun } else {
298*4882a593Smuzhiyun hal_data->ExternalPA_2G = (GetRegAmplifierType2G(adapter) & ODM_BOARD_EXT_PA) ? 1 : 0;
299*4882a593Smuzhiyun hal_data->ExternalLNA_2G = (GetRegAmplifierType2G(adapter) & ODM_BOARD_EXT_LNA) ? 1 : 0;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun /* AUTO */
303*4882a593Smuzhiyun if (GetRegAmplifierType5G(adapter) == 0) {
304*4882a593Smuzhiyun switch (hal_data->rfe_type) {
305*4882a593Smuzhiyun default:
306*4882a593Smuzhiyun hal_data->PAType_5G = 0;
307*4882a593Smuzhiyun hal_data->LNAType_5G = 0;
308*4882a593Smuzhiyun hal_data->external_pa_5g = 0;
309*4882a593Smuzhiyun hal_data->external_lna_5g = 0;
310*4882a593Smuzhiyun break;
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun } else {
313*4882a593Smuzhiyun hal_data->external_pa_5g = (GetRegAmplifierType5G(adapter) & ODM_BOARD_EXT_PA_5G) ? 1 : 0;
314*4882a593Smuzhiyun hal_data->external_lna_5g = (GetRegAmplifierType5G(adapter) & ODM_BOARD_EXT_LNA_5G) ? 1 : 0;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun } else {
317*4882a593Smuzhiyun /*Get INFO from registry*/
318*4882a593Smuzhiyun hal_data->ExternalPA_2G = EEPROM_Default_PAType;
319*4882a593Smuzhiyun hal_data->external_pa_5g = 0xFF;
320*4882a593Smuzhiyun hal_data->ExternalLNA_2G = EEPROM_Default_LNAType;
321*4882a593Smuzhiyun hal_data->external_lna_5g = 0xFF;
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun if (GetRegAmplifierType2G(adapter) == 0) {
324*4882a593Smuzhiyun hal_data->ExternalPA_2G = 0;
325*4882a593Smuzhiyun hal_data->ExternalLNA_2G = 0;
326*4882a593Smuzhiyun } else {
327*4882a593Smuzhiyun hal_data->ExternalPA_2G = (GetRegAmplifierType2G(adapter) & ODM_BOARD_EXT_PA) ? 1 : 0;
328*4882a593Smuzhiyun hal_data->ExternalLNA_2G = (GetRegAmplifierType2G(adapter) & ODM_BOARD_EXT_LNA) ? 1 : 0;
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun if (GetRegAmplifierType5G(adapter) == 0) {
332*4882a593Smuzhiyun hal_data->external_pa_5g = 0;
333*4882a593Smuzhiyun hal_data->external_lna_5g = 0;
334*4882a593Smuzhiyun } else {
335*4882a593Smuzhiyun hal_data->external_pa_5g = (GetRegAmplifierType5G(adapter) & ODM_BOARD_EXT_PA_5G) ? 1 : 0;
336*4882a593Smuzhiyun hal_data->external_lna_5g = (GetRegAmplifierType5G(adapter) & ODM_BOARD_EXT_LNA_5G) ? 1 : 0;
337*4882a593Smuzhiyun }
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun RTW_INFO("EEPROM PAType_2G is 0x%x, ExternalPA_2G = %d\n", hal_data->PAType_2G, hal_data->ExternalPA_2G);
341*4882a593Smuzhiyun RTW_INFO("EEPROM PAType_5G is 0x%x, external_pa_5g = %d\n", hal_data->PAType_5G, hal_data->external_pa_5g);
342*4882a593Smuzhiyun RTW_INFO("EEPROM LNAType_2G is 0x%x, ExternalLNA_2G = %d\n", hal_data->LNAType_2G, hal_data->ExternalLNA_2G);
343*4882a593Smuzhiyun RTW_INFO("EEPROM LNAType_5G is 0x%x, external_lna_5g = %d\n", hal_data->LNAType_5G, hal_data->external_lna_5g);
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun
Hal_ReadAmplifierType(PADAPTER adapter,u8 * map,u8 mapvalid)346*4882a593Smuzhiyun static void Hal_ReadAmplifierType(PADAPTER adapter, u8 *map, u8 mapvalid)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun if (hal_data->rfe_type < 8) { /*According to RF-EFUSE DOC : R15]*/
351*4882a593Smuzhiyun RTW_INFO("WIFI Module is iPA/iLNA\n");
352*4882a593Smuzhiyun return;
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun hal_ReadPAType(adapter, map, mapvalid);
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun /* [2.4G] extPA */
358*4882a593Smuzhiyun hal_data->TypeGPA = hal_data->PAType_2G;
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun /* [5G] extPA */
361*4882a593Smuzhiyun hal_data->TypeAPA = hal_data->PAType_5G;
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun /* [2.4G] extLNA */
364*4882a593Smuzhiyun hal_data->TypeGLNA = hal_data->LNAType_2G;
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun /* [5G] extLNA */
367*4882a593Smuzhiyun hal_data->TypeALNA = hal_data->LNAType_5G;
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun RTW_INFO("EEPROM TypeGPA = 0x%X\n", hal_data->TypeGPA);
370*4882a593Smuzhiyun RTW_INFO("EEPROM TypeAPA = 0x%X\n", hal_data->TypeAPA);
371*4882a593Smuzhiyun RTW_INFO("EEPROM TypeGLNA = 0x%X\n", hal_data->TypeGLNA);
372*4882a593Smuzhiyun RTW_INFO("EEPROM TypeALNA = 0x%X\n", hal_data->TypeALNA);
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun
Hal_ReadRFEType(PADAPTER adapter,u8 * map,u8 mapvalid)375*4882a593Smuzhiyun static u8 Hal_ReadRFEType(PADAPTER adapter, u8 *map, u8 mapvalid)
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun /* [20160-06-22 -R15]
378*4882a593Smuzhiyun Type 0 - (2-Ant, DPDT), (2G_WLG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
379*4882a593Smuzhiyun Type 1 - (1-Ant, SPDT@Ant1), (2G_WLG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
380*4882a593Smuzhiyun Type 2 -(1-Ant, SPDT@Ant1) , (2G_BTG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
381*4882a593Smuzhiyun Type 3 - (1-Ant, DPDT@Ant2), (2G_WLG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
382*4882a593Smuzhiyun Type 4 - (1-Ant, DPDT@Ant2), (2G_BTG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
383*4882a593Smuzhiyun Type 5 - (2-Ant), (2G_WLG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
384*4882a593Smuzhiyun Type 6 - (2-Ant), (2G_WLG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
385*4882a593Smuzhiyun Type 7 - (1-Ant), (2G_BTG, iPA, iLNA, iSW), (5G, iPA, iLNA, iSW)
386*4882a593Smuzhiyun */
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun /* check registry valye */
391*4882a593Smuzhiyun if (GetRegRFEType(adapter) != CONFIG_RTW_RFE_TYPE) {
392*4882a593Smuzhiyun hal->rfe_type = GetRegRFEType(adapter);
393*4882a593Smuzhiyun goto exit;
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun if (mapvalid) {
397*4882a593Smuzhiyun /* check efuse map */
398*4882a593Smuzhiyun hal->rfe_type = map[EEPROM_RFE_OPTION_8821C];
399*4882a593Smuzhiyun if (0xFF != hal->rfe_type)
400*4882a593Smuzhiyun goto exit;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun /* error handle */
404*4882a593Smuzhiyun hal->rfe_type = 0;
405*4882a593Smuzhiyun RTW_ERR("\n\nEmpty EFUSE with unknown REF type!!\n\n");
406*4882a593Smuzhiyun RTW_ERR("please program efuse or specify correct RFE type.\n");
407*4882a593Smuzhiyun RTW_ERR("cmd: insmod rtl8821cx.ko rtw_RFE_type=<rfe_type>\n\n");
408*4882a593Smuzhiyun return _FAIL;
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun exit:
411*4882a593Smuzhiyun RTW_INFO("EEPROM rfe_type=0x%x\n", hal->rfe_type);
412*4882a593Smuzhiyun return _SUCCESS;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun
Hal_EfuseParsePackageType(PADAPTER adapter,u8 * map,u8 mapvalid)416*4882a593Smuzhiyun static void Hal_EfuseParsePackageType(PADAPTER adapter, u8 *map, u8 mapvalid)
417*4882a593Smuzhiyun {
418*4882a593Smuzhiyun }
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
Hal_ReadUsbModeSwitch(PADAPTER adapter,u8 * map,u8 mapvalid)421*4882a593Smuzhiyun static void Hal_ReadUsbModeSwitch(PADAPTER adapter, u8 *map, u8 mapvalid)
422*4882a593Smuzhiyun {
423*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun if (_TRUE == mapvalid)
426*4882a593Smuzhiyun /* check efuse 0x06 bit7 */
427*4882a593Smuzhiyun hal->EEPROMUsbSwitch = (map[EEPROM_USB_MODE_8821CU] & BIT7) >> 7;
428*4882a593Smuzhiyun else
429*4882a593Smuzhiyun hal->EEPROMUsbSwitch = _FALSE;
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun RTW_INFO("EEPROM USB Switch=%d\n", hal->EEPROMUsbSwitch);
432*4882a593Smuzhiyun }
433*4882a593Smuzhiyun
hal_read_usb_pid_vid(PADAPTER adapter,u8 * map,u8 mapvalid)434*4882a593Smuzhiyun static void hal_read_usb_pid_vid(PADAPTER adapter, u8 *map, u8 mapvalid)
435*4882a593Smuzhiyun {
436*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun if (mapvalid == _TRUE) {
439*4882a593Smuzhiyun /* VID, PID */
440*4882a593Smuzhiyun hal->EEPROMVID = ReadLE2Byte(&map[EEPROM_VID_8821CU]);
441*4882a593Smuzhiyun hal->EEPROMPID = ReadLE2Byte(&map[EEPROM_PID_8821CU]);
442*4882a593Smuzhiyun } else {
443*4882a593Smuzhiyun hal->EEPROMVID = EEPROM_Default_VID;
444*4882a593Smuzhiyun hal->EEPROMPID = EEPROM_Default_PID;
445*4882a593Smuzhiyun }
446*4882a593Smuzhiyun
447*4882a593Smuzhiyun RTW_INFO("EEPROM VID = 0x%04X, PID = 0x%04X\n", hal->EEPROMVID, hal->EEPROMPID);
448*4882a593Smuzhiyun }
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun #endif /* CONFIG_USB_HCI */
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun /*
453*4882a593Smuzhiyun * Description:
454*4882a593Smuzhiyun * Collect all information from efuse or files.
455*4882a593Smuzhiyun * This function will do
456*4882a593Smuzhiyun * 1. Read registers to check hardware efuse available or not
457*4882a593Smuzhiyun * 2. Read Efuse/EEPROM
458*4882a593Smuzhiyun * 3. Read file if necessary
459*4882a593Smuzhiyun * 4. Parsing Efuse data
460*4882a593Smuzhiyun */
rtl8821c_read_efuse(PADAPTER adapter)461*4882a593Smuzhiyun u8 rtl8821c_read_efuse(PADAPTER adapter)
462*4882a593Smuzhiyun {
463*4882a593Smuzhiyun PHAL_DATA_TYPE hal;
464*4882a593Smuzhiyun u8 val8;
465*4882a593Smuzhiyun u8 *efuse_map = NULL;
466*4882a593Smuzhiyun u8 valid;
467*4882a593Smuzhiyun u8 ret = _FAIL;
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun hal = GET_HAL_DATA(adapter);
470*4882a593Smuzhiyun efuse_map = hal->efuse_eeprom_data;
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun /* 1. Read registers to check hardware eFuse available or not */
473*4882a593Smuzhiyun val8 = rtw_read8(adapter, REG_SYS_EEPROM_CTRL_8821C);
474*4882a593Smuzhiyun hal->bautoload_fail_flag = (val8 & BIT_AUTOLOAD_SUS_8821C) ? _FALSE : _TRUE;
475*4882a593Smuzhiyun /*
476*4882a593Smuzhiyun * In 8821C, bautoload_fail_flag is used to present eFuse map is valid
477*4882a593Smuzhiyun * or not, no matter the map comes from hardware or files.
478*4882a593Smuzhiyun */
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun /* 2. Read eFuse */
481*4882a593Smuzhiyun EFUSE_ShadowMapUpdate(adapter, EFUSE_WIFI, 0);
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun /* 3. Read Efuse file if necessary */
484*4882a593Smuzhiyun #ifdef CONFIG_EFUSE_CONFIG_FILE
485*4882a593Smuzhiyun if (check_phy_efuse_tx_power_info_valid(adapter) == _FALSE)
486*4882a593Smuzhiyun if (Hal_readPGDataFromConfigFile(adapter) != _SUCCESS)
487*4882a593Smuzhiyun RTW_INFO("%s: <WARN> invalid phy efuse and read from file fail, will use driver default!!\n", __FUNCTION__);
488*4882a593Smuzhiyun #endif /* CONFIG_EFUSE_CONFIG_FILE */
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun /* 4. Parse Efuse data */
491*4882a593Smuzhiyun valid = Hal_EfuseParseIDCode(adapter, efuse_map);
492*4882a593Smuzhiyun if (_TRUE == valid)
493*4882a593Smuzhiyun hal->bautoload_fail_flag = _FALSE;
494*4882a593Smuzhiyun else
495*4882a593Smuzhiyun hal->bautoload_fail_flag = _TRUE;
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun Hal_EfuseParseEEPROMVer(adapter, efuse_map, valid);
498*4882a593Smuzhiyun hal_config_macaddr(adapter, hal->bautoload_fail_flag);
499*4882a593Smuzhiyun Hal_EfuseParseTxPowerInfo(adapter, efuse_map, valid);
500*4882a593Smuzhiyun Hal_EfuseParseBoardType(adapter, efuse_map, valid);
501*4882a593Smuzhiyun Hal_EfuseParseBTCoexistInfo(adapter, efuse_map, valid);
502*4882a593Smuzhiyun Hal_EfuseParseChnlPlan(adapter, efuse_map, hal->bautoload_fail_flag);
503*4882a593Smuzhiyun Hal_EfuseParseXtal(adapter, efuse_map, valid);
504*4882a593Smuzhiyun Hal_EfuseParseThermalMeter(adapter, efuse_map, valid);
505*4882a593Smuzhiyun Hal_EfuseParseAntennaDiversity(adapter, efuse_map, valid);
506*4882a593Smuzhiyun Hal_EfuseParseCustomerID(adapter, efuse_map, valid);
507*4882a593Smuzhiyun Hal_DetectWoWMode(adapter);
508*4882a593Smuzhiyun if (Hal_ReadRFEType(adapter, efuse_map, valid) != _SUCCESS)
509*4882a593Smuzhiyun goto exit;
510*4882a593Smuzhiyun Hal_ReadAmplifierType(adapter, efuse_map, valid);
511*4882a593Smuzhiyun Hal_EfuseTxBBSwing(adapter, efuse_map, valid);
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun /* Data out of Efuse Map */
514*4882a593Smuzhiyun Hal_EfuseParsePackageType(adapter, efuse_map, valid);
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
517*4882a593Smuzhiyun Hal_ReadUsbModeSwitch(adapter, efuse_map, valid);
518*4882a593Smuzhiyun hal_read_usb_pid_vid(adapter, efuse_map, valid);
519*4882a593Smuzhiyun #endif /* CONFIG_USB_HCI */
520*4882a593Smuzhiyun
521*4882a593Smuzhiyun /* set coex. ant info once efuse parsing is done */
522*4882a593Smuzhiyun rtw_btcoex_set_ant_info(adapter);
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun if (hal_read_mac_hidden_rpt(adapter) != _SUCCESS)
525*4882a593Smuzhiyun goto exit;
526*4882a593Smuzhiyun {
527*4882a593Smuzhiyun struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun if (hal_spec->hci_type <= 3 && hal_spec->hci_type >= 1) {
530*4882a593Smuzhiyun hal->EEPROMBluetoothCoexist = _FALSE;
531*4882a593Smuzhiyun RTW_INFO("EEPROM Disable BT-coex by hal_spec\n");
532*4882a593Smuzhiyun rtw_btcoex_wifionly_AntInfoSetting(adapter);
533*4882a593Smuzhiyun }
534*4882a593Smuzhiyun }
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun rtw_phydm_read_efuse(adapter);
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun ret = _SUCCESS;
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun exit:
541*4882a593Smuzhiyun return ret;
542*4882a593Smuzhiyun }
543*4882a593Smuzhiyun
rtl8821c_run_thread(PADAPTER adapter)544*4882a593Smuzhiyun void rtl8821c_run_thread(PADAPTER adapter)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun }
547*4882a593Smuzhiyun
rtl8821c_cancel_thread(PADAPTER adapter)548*4882a593Smuzhiyun void rtl8821c_cancel_thread(PADAPTER adapter)
549*4882a593Smuzhiyun {
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun /*
553*4882a593Smuzhiyun * Description:
554*4882a593Smuzhiyun * Using 0x100 to check the power status of FW.
555*4882a593Smuzhiyun */
check_ips_status(PADAPTER adapter)556*4882a593Smuzhiyun static u8 check_ips_status(PADAPTER adapter)
557*4882a593Smuzhiyun {
558*4882a593Smuzhiyun u8 val8;
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun RTW_INFO(FUNC_ADPT_FMT ": Read 0x100=0x%02x 0x86=0x%02x\n",
562*4882a593Smuzhiyun FUNC_ADPT_ARG(adapter),
563*4882a593Smuzhiyun rtw_read8(adapter, 0x100), rtw_read8(adapter, 0x86));
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun val8 = rtw_read8(adapter, 0x100);
566*4882a593Smuzhiyun if (val8 == 0xEA)
567*4882a593Smuzhiyun return _TRUE;
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun return _FALSE;
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun #ifdef DBG_CONFIG_ERROR_DETECT
xmit_status_check(PADAPTER p)573*4882a593Smuzhiyun static void xmit_status_check(PADAPTER p)
574*4882a593Smuzhiyun {
575*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(p);
576*4882a593Smuzhiyun struct sreset_priv *psrtpriv = &hal->srestpriv;
577*4882a593Smuzhiyun struct xmit_priv *pxmitpriv = &p->xmitpriv;
578*4882a593Smuzhiyun systime current_time = 0;
579*4882a593Smuzhiyun unsigned int diff_time = 0;
580*4882a593Smuzhiyun u32 txdma_status = 0;
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun txdma_status = rtw_read32(p, REG_TXDMA_STATUS_8821C);
583*4882a593Smuzhiyun if (txdma_status != 0x00) {
584*4882a593Smuzhiyun RTW_INFO("%s REG_TXDMA_STATUS:0x%08x\n", __FUNCTION__, txdma_status);
585*4882a593Smuzhiyun psrtpriv->tx_dma_status_cnt++;
586*4882a593Smuzhiyun psrtpriv->self_dect_case = 4;
587*4882a593Smuzhiyun rtw_hal_sreset_reset(p);
588*4882a593Smuzhiyun }
589*4882a593Smuzhiyun #ifdef DBG_PRE_TX_HANG
590*4882a593Smuzhiyun #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
591*4882a593Smuzhiyun {
592*4882a593Smuzhiyun u8 hisr = rtw_read8(p, REG_HISR1_8821C + 3);
593*4882a593Smuzhiyun if (hisr & BIT_PRETXERR) {
594*4882a593Smuzhiyun RTW_ERR("PRE_TX_HANG\n");
595*4882a593Smuzhiyun rtw_write8(p, REG_HISR1_8821C + 3, BIT_PRETXERR);
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun }
598*4882a593Smuzhiyun #endif
599*4882a593Smuzhiyun #endif/*DBG_PRE_TX_HANG*/
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
602*4882a593Smuzhiyun current_time = rtw_get_current_time();
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun if (0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) {
605*4882a593Smuzhiyun diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_time);
606*4882a593Smuzhiyun
607*4882a593Smuzhiyun if (diff_time > 2000) {
608*4882a593Smuzhiyun if (psrtpriv->last_tx_complete_time == 0)
609*4882a593Smuzhiyun psrtpriv->last_tx_complete_time = current_time;
610*4882a593Smuzhiyun else {
611*4882a593Smuzhiyun diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time);
612*4882a593Smuzhiyun if (diff_time > 4000) {
613*4882a593Smuzhiyun
614*4882a593Smuzhiyun RTW_INFO("%s tx hang %s\n", __FUNCTION__,
615*4882a593Smuzhiyun !adapter_to_rfctl(p)->adaptivity_en ? "" :
616*4882a593Smuzhiyun rtw_edcca_mode_str(rtw_get_edcca_mode(adapter_to_dvobj(p), hal->current_band_type)));
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun if (!adapter_to_rfctl(p)->adaptivity_en) {
619*4882a593Smuzhiyun psrtpriv->self_dect_tx_cnt++;
620*4882a593Smuzhiyun psrtpriv->self_dect_case = 1;
621*4882a593Smuzhiyun rtw_hal_sreset_reset(p);
622*4882a593Smuzhiyun }
623*4882a593Smuzhiyun }
624*4882a593Smuzhiyun }
625*4882a593Smuzhiyun }
626*4882a593Smuzhiyun }
627*4882a593Smuzhiyun
628*4882a593Smuzhiyun #endif /* CONFIG_USB_HCI */
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun if (psrtpriv->dbg_trigger_point == SRESET_TGP_XMIT_STATUS) {
631*4882a593Smuzhiyun psrtpriv->dbg_trigger_point = SRESET_TGP_NULL;
632*4882a593Smuzhiyun rtw_hal_sreset_reset(p);
633*4882a593Smuzhiyun return;
634*4882a593Smuzhiyun }
635*4882a593Smuzhiyun }
636*4882a593Smuzhiyun
637*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
check_rx_count(PADAPTER p)638*4882a593Smuzhiyun static void check_rx_count(PADAPTER p)
639*4882a593Smuzhiyun {
640*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(p);
641*4882a593Smuzhiyun struct sreset_priv *psrtpriv = &hal->srestpriv;
642*4882a593Smuzhiyun u16 cur_mac_rxff_ptr;
643*4882a593Smuzhiyun
644*4882a593Smuzhiyun cur_mac_rxff_ptr = rtw_read16(p, REG_RXFF_PTR_V1_8821C);
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun #if 0
647*4882a593Smuzhiyun RTW_INFO("%s,psrtpriv->last_mac_rxff_ptr = %d , cur_mac_rxff_ptr = %d\n", __func__, psrtpriv->last_mac_rxff_ptr, cur_mac_rxff_ptr);
648*4882a593Smuzhiyun #endif
649*4882a593Smuzhiyun
650*4882a593Smuzhiyun if (psrtpriv->last_mac_rxff_ptr == cur_mac_rxff_ptr) {
651*4882a593Smuzhiyun psrtpriv->rx_cnt++;
652*4882a593Smuzhiyun #if 0
653*4882a593Smuzhiyun RTW_INFO("%s,MAC case rx_cnt=%d\n", __func__, psrtpriv->rx_cnt);
654*4882a593Smuzhiyun #endif
655*4882a593Smuzhiyun goto exit;
656*4882a593Smuzhiyun }
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun psrtpriv->rx_cnt = 0;
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun exit:
661*4882a593Smuzhiyun
662*4882a593Smuzhiyun psrtpriv->last_mac_rxff_ptr = cur_mac_rxff_ptr;
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun if (psrtpriv->rx_cnt > 3) {
665*4882a593Smuzhiyun psrtpriv->self_dect_case = 2;
666*4882a593Smuzhiyun psrtpriv->self_dect_rx_cnt++;
667*4882a593Smuzhiyun rtw_hal_sreset_reset(p);
668*4882a593Smuzhiyun }
669*4882a593Smuzhiyun }
670*4882a593Smuzhiyun #endif/*#ifdef CONFIG_USB_HCI*/
671*4882a593Smuzhiyun
linked_status_check(PADAPTER p)672*4882a593Smuzhiyun static void linked_status_check(PADAPTER p)
673*4882a593Smuzhiyun {
674*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(p);
675*4882a593Smuzhiyun struct sreset_priv *psrtpriv = &hal->srestpriv;
676*4882a593Smuzhiyun struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(p);
677*4882a593Smuzhiyun u32 rx_dma_status = 0;
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun rx_dma_status = rtw_read32(p, REG_RXDMA_STATUS_8821C);
680*4882a593Smuzhiyun if (rx_dma_status != 0x00) {
681*4882a593Smuzhiyun RTW_INFO("%s REG_RXDMA_STATUS:0x%08x\n", __FUNCTION__, rx_dma_status);
682*4882a593Smuzhiyun psrtpriv->rx_dma_status_cnt++;
683*4882a593Smuzhiyun psrtpriv->self_dect_case = 5;
684*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
685*4882a593Smuzhiyun rtw_hal_sreset_reset(p);
686*4882a593Smuzhiyun #endif /* CONFIG_USB_HCI */
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun if (psrtpriv->self_dect_fw) {
690*4882a593Smuzhiyun psrtpriv->self_dect_case = 3;
691*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
692*4882a593Smuzhiyun rtw_hal_sreset_reset(p);
693*4882a593Smuzhiyun #endif /* CONFIG_USB_HCI */
694*4882a593Smuzhiyun }
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
697*4882a593Smuzhiyun check_rx_count(p);
698*4882a593Smuzhiyun #endif /* CONFIG_USB_HCI */
699*4882a593Smuzhiyun
700*4882a593Smuzhiyun if (psrtpriv->dbg_trigger_point == SRESET_TGP_LINK_STATUS) {
701*4882a593Smuzhiyun psrtpriv->dbg_trigger_point = SRESET_TGP_NULL;
702*4882a593Smuzhiyun rtw_hal_sreset_reset(p);
703*4882a593Smuzhiyun return;
704*4882a593Smuzhiyun }
705*4882a593Smuzhiyun }
706*4882a593Smuzhiyun #endif /* DBG_CONFIG_ERROR_DETECT */
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun static const struct hw_port_reg port_cfg[] = {
709*4882a593Smuzhiyun /*port 0*/
710*4882a593Smuzhiyun {
711*4882a593Smuzhiyun .net_type = (REG_CR_8821C + 2),
712*4882a593Smuzhiyun .net_type_shift = 0,
713*4882a593Smuzhiyun .macaddr = REG_MACID,
714*4882a593Smuzhiyun .bssid = REG_BSSID,
715*4882a593Smuzhiyun .bcn_ctl = REG_BCN_CTRL,
716*4882a593Smuzhiyun .tsf_rst = REG_DUAL_TSF_RST,
717*4882a593Smuzhiyun .tsf_rst_bit = BIT_TSFTR_RST,
718*4882a593Smuzhiyun .bcn_space = REG_MBSSID_BCN_SPACE,
719*4882a593Smuzhiyun .bcn_space_shift = 0,
720*4882a593Smuzhiyun .bcn_space_mask = 0xffff,
721*4882a593Smuzhiyun .ps_aid = REG_BCN_PSR_RPT_8821C,
722*4882a593Smuzhiyun .ta = REG_TRANSMIT_ADDRSS_0_8821C,
723*4882a593Smuzhiyun },
724*4882a593Smuzhiyun /*port 1*/
725*4882a593Smuzhiyun {
726*4882a593Smuzhiyun .net_type = (REG_CR_8821C + 2),
727*4882a593Smuzhiyun .net_type_shift = 2,
728*4882a593Smuzhiyun .macaddr = REG_MACID1,
729*4882a593Smuzhiyun .bssid = REG_BSSID1,
730*4882a593Smuzhiyun .bcn_ctl = REG_BCN_CTRL_CLINT0,
731*4882a593Smuzhiyun .tsf_rst = REG_DUAL_TSF_RST,
732*4882a593Smuzhiyun .tsf_rst_bit = BIT_TSFTR_CLI0_RST,
733*4882a593Smuzhiyun .bcn_space = REG_MBSSID_BCN_SPACE,
734*4882a593Smuzhiyun .bcn_space_shift = 16,
735*4882a593Smuzhiyun .bcn_space_mask = 0xfff,
736*4882a593Smuzhiyun .ps_aid = REG_BCN_PSR_RPT1_8821C,
737*4882a593Smuzhiyun .ta = REG_TRANSMIT_ADDRSS_1_8821C,
738*4882a593Smuzhiyun },
739*4882a593Smuzhiyun /*port 2*/
740*4882a593Smuzhiyun {
741*4882a593Smuzhiyun .net_type = REG_CR_EXT_8821C,
742*4882a593Smuzhiyun .net_type_shift = 0,
743*4882a593Smuzhiyun .macaddr = REG_MACID2,
744*4882a593Smuzhiyun .bssid = REG_BSSID2,
745*4882a593Smuzhiyun .bcn_ctl = REG_BCN_CTRL_CLINT1,
746*4882a593Smuzhiyun .tsf_rst = REG_DUAL_TSF_RST,
747*4882a593Smuzhiyun .tsf_rst_bit = BIT_TSFTR_CLI1_RST,
748*4882a593Smuzhiyun .bcn_space = REG_MBSSID_BCN_SPACE2,
749*4882a593Smuzhiyun .bcn_space_shift = 0,
750*4882a593Smuzhiyun .bcn_space_mask = 0xfff,
751*4882a593Smuzhiyun .ps_aid = REG_BCN_PSR_RPT2_8821C,
752*4882a593Smuzhiyun .ta = REG_TRANSMIT_ADDRSS_2_8821C,
753*4882a593Smuzhiyun },
754*4882a593Smuzhiyun /*port 3*/
755*4882a593Smuzhiyun {
756*4882a593Smuzhiyun .net_type = REG_CR_EXT_8821C,
757*4882a593Smuzhiyun .net_type_shift = 2,
758*4882a593Smuzhiyun .macaddr = REG_MACID3,
759*4882a593Smuzhiyun .bssid = REG_BSSID3,
760*4882a593Smuzhiyun .bcn_ctl = REG_BCN_CTRL_CLINT2,
761*4882a593Smuzhiyun .tsf_rst = REG_DUAL_TSF_RST,
762*4882a593Smuzhiyun .tsf_rst_bit = BIT_TSFTR_CLI2_RST,
763*4882a593Smuzhiyun .bcn_space = REG_MBSSID_BCN_SPACE2,
764*4882a593Smuzhiyun .bcn_space_shift = 16,
765*4882a593Smuzhiyun .bcn_space_mask = 0xfff,
766*4882a593Smuzhiyun .ps_aid = REG_BCN_PSR_RPT3_8821C,
767*4882a593Smuzhiyun .ta = REG_TRANSMIT_ADDRSS_3_8821C,
768*4882a593Smuzhiyun },
769*4882a593Smuzhiyun /*port 4*/
770*4882a593Smuzhiyun {
771*4882a593Smuzhiyun .net_type = REG_CR_EXT_8821C,
772*4882a593Smuzhiyun .net_type_shift = 4,
773*4882a593Smuzhiyun .macaddr = REG_MACID4,
774*4882a593Smuzhiyun .bssid = REG_BSSID4,
775*4882a593Smuzhiyun .bcn_ctl = REG_BCN_CTRL_CLINT3,
776*4882a593Smuzhiyun .tsf_rst = REG_DUAL_TSF_RST,
777*4882a593Smuzhiyun .tsf_rst_bit = BIT_TSFTR_CLI3_RST,
778*4882a593Smuzhiyun .bcn_space = REG_MBSSID_BCN_SPACE3,
779*4882a593Smuzhiyun .bcn_space_shift = 0,
780*4882a593Smuzhiyun .bcn_space_mask = 0xfff,
781*4882a593Smuzhiyun .ps_aid = REG_BCN_PSR_RPT4_8821C,
782*4882a593Smuzhiyun .ta = REG_TRANSMIT_ADDRSS_4_8821C,
783*4882a593Smuzhiyun },
784*4882a593Smuzhiyun };
785*4882a593Smuzhiyun
hw_bcn_ctrl_addr(_adapter * adapter,u8 hw_port)786*4882a593Smuzhiyun static u32 hw_bcn_ctrl_addr(_adapter *adapter, u8 hw_port)
787*4882a593Smuzhiyun {
788*4882a593Smuzhiyun struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
789*4882a593Smuzhiyun u32 addr = 0;
790*4882a593Smuzhiyun
791*4882a593Smuzhiyun if (hw_port >= hal_spec->port_num) {
792*4882a593Smuzhiyun RTW_ERR(FUNC_ADPT_FMT" HW Port(%d) invalid\n", FUNC_ADPT_ARG(adapter), hw_port);
793*4882a593Smuzhiyun rtw_warn_on(1);
794*4882a593Smuzhiyun goto exit;
795*4882a593Smuzhiyun }
796*4882a593Smuzhiyun
797*4882a593Smuzhiyun addr = port_cfg[hw_port].bcn_ctl;
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun exit:
800*4882a593Smuzhiyun return addr;
801*4882a593Smuzhiyun }
802*4882a593Smuzhiyun
hw_bcn_ctrl_set(_adapter * adapter,u8 hw_port,u8 bcn_ctl_val)803*4882a593Smuzhiyun static void hw_bcn_ctrl_set(_adapter *adapter, u8 hw_port, u8 bcn_ctl_val)
804*4882a593Smuzhiyun {
805*4882a593Smuzhiyun u32 bcn_ctl_addr = 0;
806*4882a593Smuzhiyun
807*4882a593Smuzhiyun if (hw_port >= MAX_HW_PORT) {
808*4882a593Smuzhiyun RTW_ERR(FUNC_ADPT_FMT" HW Port(%d) invalid\n", FUNC_ADPT_ARG(adapter), hw_port);
809*4882a593Smuzhiyun rtw_warn_on(1);
810*4882a593Smuzhiyun return;
811*4882a593Smuzhiyun }
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun bcn_ctl_addr = port_cfg[hw_port].bcn_ctl;
814*4882a593Smuzhiyun rtw_write8(adapter, bcn_ctl_addr, bcn_ctl_val);
815*4882a593Smuzhiyun }
816*4882a593Smuzhiyun
hw_bcn_ctrl_add(_adapter * adapter,u8 hw_port,u8 bcn_ctl_val)817*4882a593Smuzhiyun static void hw_bcn_ctrl_add(_adapter *adapter, u8 hw_port, u8 bcn_ctl_val)
818*4882a593Smuzhiyun {
819*4882a593Smuzhiyun u32 bcn_ctl_addr = 0;
820*4882a593Smuzhiyun u8 val8 = 0;
821*4882a593Smuzhiyun
822*4882a593Smuzhiyun if (hw_port >= MAX_HW_PORT) {
823*4882a593Smuzhiyun RTW_ERR(FUNC_ADPT_FMT" HW Port(%d) invalid\n", FUNC_ADPT_ARG(adapter), hw_port);
824*4882a593Smuzhiyun rtw_warn_on(1);
825*4882a593Smuzhiyun return;
826*4882a593Smuzhiyun }
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun bcn_ctl_addr = port_cfg[hw_port].bcn_ctl;
829*4882a593Smuzhiyun val8 = rtw_read8(adapter, bcn_ctl_addr) | bcn_ctl_val;
830*4882a593Smuzhiyun rtw_write8(adapter, bcn_ctl_addr, val8);
831*4882a593Smuzhiyun }
832*4882a593Smuzhiyun
hw_bcn_ctrl_clr(_adapter * adapter,u8 hw_port,u8 bcn_ctl_val)833*4882a593Smuzhiyun static void hw_bcn_ctrl_clr(_adapter *adapter, u8 hw_port, u8 bcn_ctl_val)
834*4882a593Smuzhiyun {
835*4882a593Smuzhiyun u32 bcn_ctl_addr = 0;
836*4882a593Smuzhiyun u8 val8 = 0;
837*4882a593Smuzhiyun
838*4882a593Smuzhiyun if (hw_port >= MAX_HW_PORT) {
839*4882a593Smuzhiyun RTW_ERR(FUNC_ADPT_FMT" HW Port(%d) invalid\n", FUNC_ADPT_ARG(adapter), hw_port);
840*4882a593Smuzhiyun rtw_warn_on(1);
841*4882a593Smuzhiyun return;
842*4882a593Smuzhiyun }
843*4882a593Smuzhiyun
844*4882a593Smuzhiyun bcn_ctl_addr = port_cfg[hw_port].bcn_ctl;
845*4882a593Smuzhiyun val8 = rtw_read8(adapter, bcn_ctl_addr);
846*4882a593Smuzhiyun val8 &= ~bcn_ctl_val;
847*4882a593Smuzhiyun rtw_write8(adapter, bcn_ctl_addr, val8);
848*4882a593Smuzhiyun }
849*4882a593Smuzhiyun
850*4882a593Smuzhiyun
hw_bcn_func(_adapter * adapter,u8 enable)851*4882a593Smuzhiyun static void hw_bcn_func(_adapter *adapter, u8 enable)
852*4882a593Smuzhiyun {
853*4882a593Smuzhiyun if (enable)
854*4882a593Smuzhiyun hw_bcn_ctrl_add(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION);
855*4882a593Smuzhiyun else
856*4882a593Smuzhiyun hw_bcn_ctrl_clr(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION);
857*4882a593Smuzhiyun }
858*4882a593Smuzhiyun
hw_port0_tsf_sync(_adapter * adapter)859*4882a593Smuzhiyun void hw_port0_tsf_sync(_adapter *adapter)
860*4882a593Smuzhiyun {
861*4882a593Smuzhiyun rtw_write8(adapter, REG_SCHEDULER_RST, rtw_read8(adapter, REG_SCHEDULER_RST) | BIT_SYNC_CLI_ONCE_BY_TBTT_8821C);
862*4882a593Smuzhiyun }
863*4882a593Smuzhiyun
hw_tsf_reset(_adapter * adapter)864*4882a593Smuzhiyun void hw_tsf_reset(_adapter *adapter)
865*4882a593Smuzhiyun {
866*4882a593Smuzhiyun u8 hw_port = rtw_hal_get_port(adapter);
867*4882a593Smuzhiyun u32 tsf_rst_addr = 0;
868*4882a593Smuzhiyun u8 tsf_rst_bit = 0;
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun if (hw_port >= MAX_HW_PORT) {
871*4882a593Smuzhiyun RTW_ERR(FUNC_ADPT_FMT" HW Port(%d) invalid\n", FUNC_ADPT_ARG(adapter), hw_port);
872*4882a593Smuzhiyun rtw_warn_on(1);
873*4882a593Smuzhiyun return;
874*4882a593Smuzhiyun }
875*4882a593Smuzhiyun
876*4882a593Smuzhiyun tsf_rst_addr = port_cfg[hw_port].tsf_rst;
877*4882a593Smuzhiyun tsf_rst_bit = port_cfg[hw_port].tsf_rst_bit;
878*4882a593Smuzhiyun rtw_write8(adapter, tsf_rst_addr, tsf_rst_bit);
879*4882a593Smuzhiyun }
880*4882a593Smuzhiyun
hw_var_set_monitor(PADAPTER adapter)881*4882a593Smuzhiyun static void hw_var_set_monitor(PADAPTER adapter)
882*4882a593Smuzhiyun {
883*4882a593Smuzhiyun #ifdef CONFIG_WIFI_MONITOR
884*4882a593Smuzhiyun u8 tmp_8bit;
885*4882a593Smuzhiyun u32 tmp_32bit;
886*4882a593Smuzhiyun struct net_device *ndev = adapter->pnetdev;
887*4882a593Smuzhiyun struct mon_reg_backup *mon = &GET_HAL_DATA(adapter)->mon_backup;
888*4882a593Smuzhiyun
889*4882a593Smuzhiyun mon->known_rcr = 1;
890*4882a593Smuzhiyun rtw_hal_get_hwreg(adapter, HW_VAR_RCR, (u8 *)& mon->rcr);
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun /* Receive all type */
893*4882a593Smuzhiyun tmp_32bit = BIT_AAP_8821C | BIT_APP_PHYSTS_8821C;
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun if (ndev->type == ARPHRD_IEEE80211_RADIOTAP) {
896*4882a593Smuzhiyun /* Append FCS */
897*4882a593Smuzhiyun tmp_32bit |= BIT_APP_FCS_8821C;
898*4882a593Smuzhiyun }
899*4882a593Smuzhiyun
900*4882a593Smuzhiyun rtw_hal_set_hwreg(adapter, HW_VAR_RCR, (u8 *)& tmp_32bit);
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun if (1)
903*4882a593Smuzhiyun rtw_halmac_config_rx_info(adapter_to_dvobj(adapter),
904*4882a593Smuzhiyun HALMAC_DRV_INFO_PHY_SNIFFER);
905*4882a593Smuzhiyun else
906*4882a593Smuzhiyun rtw_halmac_config_rx_info(adapter_to_dvobj(adapter),
907*4882a593Smuzhiyun HALMAC_DRV_INFO_PHY_PLCP);
908*4882a593Smuzhiyun
909*4882a593Smuzhiyun tmp_8bit = rtw_read8(adapter, REG_RX_DRVINFO_SZ_8821C);
910*4882a593Smuzhiyun rtw_write8(adapter, REG_RX_DRVINFO_SZ_8821C, (tmp_8bit | 0x80));
911*4882a593Smuzhiyun
912*4882a593Smuzhiyun /* Receive all data frames */
913*4882a593Smuzhiyun mon->known_rxfilter = 1;
914*4882a593Smuzhiyun mon->rxfilter0 = rtw_read16(adapter, REG_RXFLTMAP0_8821C);
915*4882a593Smuzhiyun mon->rxfilter1 = rtw_read16(adapter, REG_RXFLTMAP1_8821C);
916*4882a593Smuzhiyun mon->rxfilter2 = rtw_read16(adapter, REG_RXFLTMAP2_8821C);
917*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP0_8821C, 0xFFFF);
918*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP1_8821C, 0xFFFF);
919*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0xFFFF);
920*4882a593Smuzhiyun #endif /* CONFIG_WIFI_MONITOR */
921*4882a593Smuzhiyun }
922*4882a593Smuzhiyun
hw_set_ta(_adapter * adapter,u8 hw_port,u8 * val)923*4882a593Smuzhiyun void hw_set_ta(_adapter *adapter, u8 hw_port, u8 *val)
924*4882a593Smuzhiyun {
925*4882a593Smuzhiyun u8 idx = 0;
926*4882a593Smuzhiyun u32 reg = port_cfg[hw_port].ta;
927*4882a593Smuzhiyun
928*4882a593Smuzhiyun for (idx = 0 ; idx < ETH_ALEN; idx++)
929*4882a593Smuzhiyun rtw_write8(adapter, (reg + idx), val[idx]);
930*4882a593Smuzhiyun
931*4882a593Smuzhiyun RTW_INFO("%s("ADPT_FMT") hw port -%d TA: "MAC_FMT"\n",
932*4882a593Smuzhiyun __func__, ADPT_ARG(adapter), hw_port, MAC_ARG(val));
933*4882a593Smuzhiyun }
hw_set_aid(_adapter * adapter,u8 hw_port,u8 aid)934*4882a593Smuzhiyun void hw_set_aid(_adapter *adapter, u8 hw_port, u8 aid)
935*4882a593Smuzhiyun {
936*4882a593Smuzhiyun rtw_write16(adapter, port_cfg[hw_port].ps_aid, (0xF800 | aid));
937*4882a593Smuzhiyun RTW_INFO("%s("ADPT_FMT") hw port -%d AID: %d\n",
938*4882a593Smuzhiyun __func__, ADPT_ARG(adapter), hw_port, aid);
939*4882a593Smuzhiyun }
940*4882a593Smuzhiyun #ifdef CONFIG_CLIENT_PORT_CFG
rtw_hw_client_port_cfg(_adapter * adapter)941*4882a593Smuzhiyun void rtw_hw_client_port_cfg(_adapter *adapter)
942*4882a593Smuzhiyun {
943*4882a593Smuzhiyun struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
944*4882a593Smuzhiyun struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
945*4882a593Smuzhiyun u8 clt_port = get_clt_port(adapter);
946*4882a593Smuzhiyun
947*4882a593Smuzhiyun if (clt_port == CLT_PORT_INVALID)
948*4882a593Smuzhiyun return;
949*4882a593Smuzhiyun RTW_INFO("%s ("ADPT_FMT")\n", __func__, ADPT_ARG(adapter));
950*4882a593Smuzhiyun
951*4882a593Smuzhiyun /*Network type*/
952*4882a593Smuzhiyun rtw_halmac_set_network_type(adapter_to_dvobj(adapter), clt_port, _HW_STATE_STATION_);
953*4882a593Smuzhiyun /*A1*/
954*4882a593Smuzhiyun rtw_halmac_set_mac_address(adapter_to_dvobj(adapter), clt_port, adapter_mac_addr(adapter));
955*4882a593Smuzhiyun /*A2*/
956*4882a593Smuzhiyun hw_set_ta(adapter, clt_port, pmlmeinfo->network.MacAddress);
957*4882a593Smuzhiyun /*A3*/
958*4882a593Smuzhiyun rtw_halmac_set_bssid(adapter_to_dvobj(adapter), clt_port, pmlmeinfo->network.MacAddress);
959*4882a593Smuzhiyun /*Beacon space*/
960*4882a593Smuzhiyun rtw_halmac_set_bcn_interval(adapter_to_dvobj(adapter), clt_port, pmlmeinfo->bcn_interval);
961*4882a593Smuzhiyun /*AID*/
962*4882a593Smuzhiyun hw_set_aid(adapter, clt_port, pmlmeinfo->aid);
963*4882a593Smuzhiyun /*Beacon control*/
964*4882a593Smuzhiyun hw_bcn_ctrl_set(adapter, clt_port, (BIT_P0_EN_RXBCN_RPT | BIT_EN_BCN_FUNCTION));
965*4882a593Smuzhiyun
966*4882a593Smuzhiyun RTW_INFO("%s ("ADPT_FMT") clt_port:%d\n", __func__, ADPT_ARG(adapter), clt_port);
967*4882a593Smuzhiyun }
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun /*#define DBG_TSF_MONITOR*/
rtw_hw_client_port_clr(_adapter * adapter)970*4882a593Smuzhiyun void rtw_hw_client_port_clr(_adapter *adapter)
971*4882a593Smuzhiyun {
972*4882a593Smuzhiyun u8 null_addr[ETH_ALEN] = {0};
973*4882a593Smuzhiyun u8 clt_port = get_clt_port(adapter);
974*4882a593Smuzhiyun
975*4882a593Smuzhiyun if (clt_port == CLT_PORT_INVALID)
976*4882a593Smuzhiyun return;
977*4882a593Smuzhiyun RTW_INFO("%s ("ADPT_FMT") ==> \n", __func__, ADPT_ARG(adapter));
978*4882a593Smuzhiyun #ifdef DBG_TSF_MONITOR
979*4882a593Smuzhiyun /*Beacon control*/
980*4882a593Smuzhiyun hw_bcn_ctrl_clr(adapter, clt_port, BIT_EN_BCN_FUNCTION);
981*4882a593Smuzhiyun hw_tsf_reset(adapter);
982*4882a593Smuzhiyun #endif
983*4882a593Smuzhiyun /*Network type*/
984*4882a593Smuzhiyun rtw_halmac_set_network_type(adapter_to_dvobj(adapter), clt_port, _HW_STATE_NOLINK_);
985*4882a593Smuzhiyun /*A1*/
986*4882a593Smuzhiyun rtw_halmac_set_mac_address(adapter_to_dvobj(adapter), clt_port, null_addr);
987*4882a593Smuzhiyun /*A2*/
988*4882a593Smuzhiyun hw_set_ta(adapter, clt_port, null_addr);
989*4882a593Smuzhiyun /*A3*/
990*4882a593Smuzhiyun rtw_halmac_set_bssid(adapter_to_dvobj(adapter), clt_port, null_addr);
991*4882a593Smuzhiyun #ifdef DBG_TSF_MONITOR
992*4882a593Smuzhiyun if (0)
993*4882a593Smuzhiyun #endif
994*4882a593Smuzhiyun /*Beacon control*/
995*4882a593Smuzhiyun hw_bcn_ctrl_set(adapter, clt_port, (BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION));
996*4882a593Smuzhiyun /*AID*/
997*4882a593Smuzhiyun hw_set_aid(adapter, clt_port, 0);
998*4882a593Smuzhiyun RTW_INFO("%s("ADPT_FMT") clt_port:%d\n", __func__, ADPT_ARG(adapter), clt_port);
999*4882a593Smuzhiyun }
1000*4882a593Smuzhiyun #endif
1001*4882a593Smuzhiyun
hw_var_set_opmode(PADAPTER Adapter,u8 * val)1002*4882a593Smuzhiyun static void hw_var_set_opmode(PADAPTER Adapter, u8 *val)
1003*4882a593Smuzhiyun {
1004*4882a593Smuzhiyun u8 mode = *((u8 *)val);
1005*4882a593Smuzhiyun static u8 isMonitor = _FALSE;
1006*4882a593Smuzhiyun HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun if (isMonitor == _TRUE) {
1009*4882a593Smuzhiyun #ifdef CONFIG_WIFI_MONITOR
1010*4882a593Smuzhiyun struct mon_reg_backup *backup = &GET_HAL_DATA(Adapter)->mon_backup;
1011*4882a593Smuzhiyun
1012*4882a593Smuzhiyun if (backup->known_rcr) {
1013*4882a593Smuzhiyun backup->known_rcr = 0;
1014*4882a593Smuzhiyun rtw_hal_set_hwreg(Adapter, HW_VAR_RCR, (u8 *)&backup->rcr);
1015*4882a593Smuzhiyun
1016*4882a593Smuzhiyun if (!!(backup->rcr &= BIT_APP_PHYSTS_8821C))
1017*4882a593Smuzhiyun rtw_halmac_config_rx_info(adapter_to_dvobj(Adapter),
1018*4882a593Smuzhiyun HALMAC_DRV_INFO_PHY_STATUS);
1019*4882a593Smuzhiyun else
1020*4882a593Smuzhiyun rtw_halmac_config_rx_info(adapter_to_dvobj(Adapter),
1021*4882a593Smuzhiyun HALMAC_DRV_INFO_NONE);
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun rtw_hal_rcr_set_chk_bssid(Adapter, MLME_ACTION_NONE);
1024*4882a593Smuzhiyun }
1025*4882a593Smuzhiyun if (backup->known_rxfilter) {
1026*4882a593Smuzhiyun backup->known_rxfilter = 0;
1027*4882a593Smuzhiyun rtw_write16(Adapter, REG_RXFLTMAP0_8821C, backup->rxfilter0);
1028*4882a593Smuzhiyun rtw_write16(Adapter, REG_RXFLTMAP1_8821C, backup->rxfilter1);
1029*4882a593Smuzhiyun rtw_write16(Adapter, REG_RXFLTMAP2_8821C, backup->rxfilter2);
1030*4882a593Smuzhiyun }
1031*4882a593Smuzhiyun #endif /* CONFIG_WIFI_MONITOR */
1032*4882a593Smuzhiyun isMonitor = _FALSE;
1033*4882a593Smuzhiyun }
1034*4882a593Smuzhiyun
1035*4882a593Smuzhiyun if (mode == _HW_STATE_MONITOR_) {
1036*4882a593Smuzhiyun isMonitor = _TRUE;
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun /* set net_type */
1039*4882a593Smuzhiyun Set_MSR(Adapter, _HW_STATE_NOLINK_);
1040*4882a593Smuzhiyun hw_var_set_monitor(Adapter);
1041*4882a593Smuzhiyun return;
1042*4882a593Smuzhiyun }
1043*4882a593Smuzhiyun
1044*4882a593Smuzhiyun rtw_hal_set_hwreg(Adapter, HW_VAR_MAC_ADDR, adapter_mac_addr(Adapter)); /* set mac addr to mac register */
1045*4882a593Smuzhiyun RTW_INFO(ADPT_FMT ": hw_port(%d) set mode=%d\n", ADPT_ARG(Adapter), get_hw_port(Adapter), mode);
1046*4882a593Smuzhiyun
1047*4882a593Smuzhiyun #ifdef CONFIG_MI_WITH_MBSSID_CAM /*For Port0 - MBSS CAM*/
1048*4882a593Smuzhiyun if (Adapter->hw_port != HW_PORT0) {
1049*4882a593Smuzhiyun RTW_ERR(ADPT_FMT ": Configure MBSSID cam on HW_PORT%d\n", ADPT_ARG(Adapter), Adapter->hw_port);
1050*4882a593Smuzhiyun rtw_warn_on(1);
1051*4882a593Smuzhiyun } else
1052*4882a593Smuzhiyun hw_var_set_opmode_mbid(Adapter, mode);
1053*4882a593Smuzhiyun #else
1054*4882a593Smuzhiyun
1055*4882a593Smuzhiyun rtw_iface_disable_tsf_update(Adapter);
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun /* set net_type */
1058*4882a593Smuzhiyun Set_MSR(Adapter, mode);
1059*4882a593Smuzhiyun
1060*4882a593Smuzhiyun if ((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) {
1061*4882a593Smuzhiyun #ifdef CONFIG_INTERRUPT_BASED_TXBCN
1062*4882a593Smuzhiyun if (!rtw_mi_get_ap_num(Adapter) && !rtw_mi_get_mesh_num(Adapter)) {
1063*4882a593Smuzhiyun /*CONFIG_INTERRUPT_BASED_TXBCN*/
1064*4882a593Smuzhiyun #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
1065*4882a593Smuzhiyun rtw_write8(Adapter, REG_DRVERLYINT, 0x05);/* restore early int time to 5ms */
1066*4882a593Smuzhiyun #if defined(CONFIG_SDIO_HCI)
1067*4882a593Smuzhiyun rtl8821cs_update_interrupt_mask(Adapter, 0, SDIO_HIMR_BCNERLY_INT_MSK);
1068*4882a593Smuzhiyun #endif
1069*4882a593Smuzhiyun #endif/* CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT */
1070*4882a593Smuzhiyun
1071*4882a593Smuzhiyun #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR
1072*4882a593Smuzhiyun #if defined(CONFIG_SDIO_HCI)
1073*4882a593Smuzhiyun rtl8821cs_update_interrupt_mask(Adapter, 0, (SDIO_HIMR_TXBCNOK_MSK | SDIO_HIMR_TXBCNERR_MSK));
1074*4882a593Smuzhiyun #endif
1075*4882a593Smuzhiyun #endif /* CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR */
1076*4882a593Smuzhiyun }
1077*4882a593Smuzhiyun #endif /* CONFIG_INTERRUPT_BASED_TXBCN */
1078*4882a593Smuzhiyun
1079*4882a593Smuzhiyun if (!rtw_mi_get_ap_num(Adapter) && !rtw_mi_get_mesh_num(Adapter))
1080*4882a593Smuzhiyun StopTxBeacon(Adapter);
1081*4882a593Smuzhiyun hw_bcn_ctrl_set(Adapter, get_hw_port(Adapter), BIT_EN_BCN_FUNCTION_8821C | BIT_DIS_TSF_UDT_8821C);
1082*4882a593Smuzhiyun
1083*4882a593Smuzhiyun } else if (mode == _HW_STATE_ADHOC_) {
1084*4882a593Smuzhiyun ResumeTxBeacon(Adapter);
1085*4882a593Smuzhiyun hw_bcn_ctrl_set(Adapter, get_hw_port(Adapter), BIT_EN_BCN_FUNCTION_8821C | BIT_DIS_TSF_UDT_8821C);
1086*4882a593Smuzhiyun
1087*4882a593Smuzhiyun } else if (mode == _HW_STATE_AP_) {
1088*4882a593Smuzhiyun
1089*4882a593Smuzhiyun if (Adapter->hw_port == HW_PORT0) {
1090*4882a593Smuzhiyun #ifdef CONFIG_INTERRUPT_BASED_TXBCN
1091*4882a593Smuzhiyun #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
1092*4882a593Smuzhiyun #if defined(CONFIG_SDIO_HCI)
1093*4882a593Smuzhiyun rtl8821cs_update_interrupt_mask(Adapter, SDIO_HIMR_BCNERLY_INT_MSK, 0);
1094*4882a593Smuzhiyun #endif
1095*4882a593Smuzhiyun #endif/* CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT */
1096*4882a593Smuzhiyun
1097*4882a593Smuzhiyun #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR
1098*4882a593Smuzhiyun #if defined(CONFIG_SDIO_HCI)
1099*4882a593Smuzhiyun rtl8821cs_update_interrupt_mask(Adapter, (SDIO_HIMR_TXBCNOK_MSK | SDIO_HIMR_TXBCNERR_MSK), 0);
1100*4882a593Smuzhiyun #endif
1101*4882a593Smuzhiyun #endif/* CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR */
1102*4882a593Smuzhiyun #endif /* CONFIG_INTERRUPT_BASED_TXBCN */
1103*4882a593Smuzhiyun
1104*4882a593Smuzhiyun /* enable to rx data frame */
1105*4882a593Smuzhiyun rtw_write16(Adapter, REG_RXFLTMAP2_8821C, 0xFFFF);
1106*4882a593Smuzhiyun
1107*4882a593Smuzhiyun /* Beacon Control related register for first time */
1108*4882a593Smuzhiyun rtw_write8(Adapter, REG_BCNDMATIM_8821C, 0x02); /* 2ms */
1109*4882a593Smuzhiyun
1110*4882a593Smuzhiyun rtw_write8(Adapter, REG_ATIMWND_8821C, 0x0c); /* ATIM:12ms */
1111*4882a593Smuzhiyun
1112*4882a593Smuzhiyun /*rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET_8821C, 0x7fff);*//* +32767 (~32ms) */
1113*4882a593Smuzhiyun hw_tsf_reset(Adapter);
1114*4882a593Smuzhiyun /* don't enable update TSF0 for if1 (due to TSF update when beacon/probe rsp are received) */
1115*4882a593Smuzhiyun #if defined(CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR)
1116*4882a593Smuzhiyun hw_bcn_ctrl_set(Adapter, get_hw_port(Adapter), BIT_EN_BCN_FUNCTION_8821C | BIT_DIS_TSF_UDT_8821C | BIT_P0_EN_TXBCN_RPT_8821C);
1117*4882a593Smuzhiyun #else
1118*4882a593Smuzhiyun hw_bcn_ctrl_set(Adapter, get_hw_port(Adapter), BIT_EN_BCN_FUNCTION_8821C | BIT_DIS_TSF_UDT_8821C);
1119*4882a593Smuzhiyun #endif
1120*4882a593Smuzhiyun } else {
1121*4882a593Smuzhiyun RTW_ERR(ADPT_FMT ": set AP mode on HW_PORT%d\n", ADPT_ARG(Adapter), Adapter->hw_port);
1122*4882a593Smuzhiyun rtw_warn_on(1);
1123*4882a593Smuzhiyun }
1124*4882a593Smuzhiyun }
1125*4882a593Smuzhiyun #endif
1126*4882a593Smuzhiyun }
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun #ifdef CONFIG_AP_PORT_SWAP
rtw_hal_port_reconfig(_adapter * adapter,u8 port)1129*4882a593Smuzhiyun void rtw_hal_port_reconfig(_adapter *adapter, u8 port)
1130*4882a593Smuzhiyun {
1131*4882a593Smuzhiyun struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
1132*4882a593Smuzhiyun u32 bssid_offset = 0;
1133*4882a593Smuzhiyun u8 bssid[6] = {0};
1134*4882a593Smuzhiyun u8 vnet_type = 0;
1135*4882a593Smuzhiyun u8 vbcn_ctrl = 0;
1136*4882a593Smuzhiyun u8 i;
1137*4882a593Smuzhiyun
1138*4882a593Smuzhiyun if (port > (hal_spec->port_num - 1)) {
1139*4882a593Smuzhiyun RTW_INFO("[WARN] "ADPT_FMT"- hw_port : %d,will switch to invalid port-%d\n",
1140*4882a593Smuzhiyun ADPT_ARG(adapter), adapter->hw_port, port);
1141*4882a593Smuzhiyun rtw_warn_on(1);
1142*4882a593Smuzhiyun }
1143*4882a593Smuzhiyun
1144*4882a593Smuzhiyun RTW_PRINT(ADPT_FMT" - hw_port : %d,will switch to port-%d\n",
1145*4882a593Smuzhiyun ADPT_ARG(adapter), adapter->hw_port, port);
1146*4882a593Smuzhiyun
1147*4882a593Smuzhiyun /*backup*/
1148*4882a593Smuzhiyun vnet_type = (rtw_read8(adapter, port_cfg[adapter->hw_port].net_type) >> port_cfg[adapter->hw_port].net_type_shift) & 0x03;
1149*4882a593Smuzhiyun vbcn_ctrl = rtw_read8(adapter, port_cfg[adapter->hw_port].bcn_ctl);
1150*4882a593Smuzhiyun if (is_client_associated_to_ap(adapter)) {
1151*4882a593Smuzhiyun RTW_INFO("port0-iface is STA mode and linked\n");
1152*4882a593Smuzhiyun bssid_offset = port_cfg[adapter->hw_port].bssid;
1153*4882a593Smuzhiyun for (i = 0; i < 6; i++)
1154*4882a593Smuzhiyun bssid[i] = rtw_read8(adapter, bssid_offset + i);
1155*4882a593Smuzhiyun }
1156*4882a593Smuzhiyun /*reconfigure*/
1157*4882a593Smuzhiyun adapter->hw_port = port;
1158*4882a593Smuzhiyun rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter_mac_addr(adapter));
1159*4882a593Smuzhiyun Set_MSR(adapter, vnet_type);
1160*4882a593Smuzhiyun
1161*4882a593Smuzhiyun if (is_client_associated_to_ap(adapter)) {
1162*4882a593Smuzhiyun rtw_hal_set_hwreg(adapter, HW_VAR_BSSID, bssid);
1163*4882a593Smuzhiyun hw_tsf_reset(adapter);
1164*4882a593Smuzhiyun #ifdef CONFIG_FW_MULTI_PORT_SUPPORT
1165*4882a593Smuzhiyun rtw_set_default_port_id(adapter);
1166*4882a593Smuzhiyun #endif
1167*4882a593Smuzhiyun }
1168*4882a593Smuzhiyun #if defined(CONFIG_BT_COEXIST) && defined(CONFIG_FW_MULTI_PORT_SUPPORT)
1169*4882a593Smuzhiyun if (GET_HAL_DATA(adapter)->EEPROMBluetoothCoexist == _TRUE)
1170*4882a593Smuzhiyun rtw_hal_set_wifi_btc_port_id_cmd(adapter);
1171*4882a593Smuzhiyun #endif
1172*4882a593Smuzhiyun
1173*4882a593Smuzhiyun rtw_write8(adapter, port_cfg[adapter->hw_port].bcn_ctl, vbcn_ctrl);
1174*4882a593Smuzhiyun }
rtl8821c_ap_port_switch(_adapter * adapter,u8 mode)1175*4882a593Smuzhiyun static void rtl8821c_ap_port_switch(_adapter *adapter, u8 mode)
1176*4882a593Smuzhiyun {
1177*4882a593Smuzhiyun u8 hw_port = get_hw_port(adapter);
1178*4882a593Smuzhiyun struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1179*4882a593Smuzhiyun u8 ap_nums = 0;
1180*4882a593Smuzhiyun _adapter *if_port0 = NULL;
1181*4882a593Smuzhiyun int i;
1182*4882a593Smuzhiyun
1183*4882a593Smuzhiyun RTW_INFO(ADPT_FMT ": hw_port(%d) will set mode to %d\n", ADPT_ARG(adapter), hw_port, mode);
1184*4882a593Smuzhiyun #if 0
1185*4882a593Smuzhiyun #ifdef CONFIG_P2P
1186*4882a593Smuzhiyun if (!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) {
1187*4882a593Smuzhiyun RTW_INFO("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__,
1188*4882a593Smuzhiyun rtw_p2p_role(&adapter->wdinfo), rtw_p2p_state(&adapter->wdinfo), rtw_p2p_pre_state(&adapter->wdinfo));
1189*4882a593Smuzhiyun }
1190*4882a593Smuzhiyun #endif
1191*4882a593Smuzhiyun #endif
1192*4882a593Smuzhiyun
1193*4882a593Smuzhiyun if (mode != _HW_STATE_AP_)
1194*4882a593Smuzhiyun return;
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun if ((mode == _HW_STATE_AP_) && (hw_port == HW_PORT0))
1197*4882a593Smuzhiyun return;
1198*4882a593Smuzhiyun
1199*4882a593Smuzhiyun /*check and prepare switch port to port0 for AP mode's BCN function*/
1200*4882a593Smuzhiyun ap_nums = rtw_mi_get_ap_num(adapter);
1201*4882a593Smuzhiyun if (ap_nums > 0) {
1202*4882a593Smuzhiyun RTW_ERR("SortAP mode numbers:%d, must move setting to MBSSID CAM, not support yet\n", ap_nums);
1203*4882a593Smuzhiyun rtw_warn_on(1);
1204*4882a593Smuzhiyun return;
1205*4882a593Smuzhiyun }
1206*4882a593Smuzhiyun
1207*4882a593Smuzhiyun /*Get iface of port-0*/
1208*4882a593Smuzhiyun for (i = 0; i < dvobj->iface_nums; i++) {
1209*4882a593Smuzhiyun if (get_hw_port(dvobj->padapters[i]) == HW_PORT0) {
1210*4882a593Smuzhiyun if_port0 = dvobj->padapters[i];
1211*4882a593Smuzhiyun break;
1212*4882a593Smuzhiyun }
1213*4882a593Smuzhiyun }
1214*4882a593Smuzhiyun
1215*4882a593Smuzhiyun if (if_port0 == NULL) {
1216*4882a593Smuzhiyun RTW_ERR("%s if_port0 == NULL\n", __func__);
1217*4882a593Smuzhiyun rtw_warn_on(1);
1218*4882a593Smuzhiyun return;
1219*4882a593Smuzhiyun }
1220*4882a593Smuzhiyun rtw_hal_port_reconfig(if_port0, hw_port);
1221*4882a593Smuzhiyun
1222*4882a593Smuzhiyun adapter->hw_port = HW_PORT0;
1223*4882a593Smuzhiyun RTW_INFO(ADPT_FMT ": Cfg SoftAP mode to hw_port(%d) done\n", ADPT_ARG(adapter), adapter->hw_port);
1224*4882a593Smuzhiyun
1225*4882a593Smuzhiyun }
1226*4882a593Smuzhiyun #endif
hw_var_hw_port_cfg(_adapter * adapter,u8 enable)1227*4882a593Smuzhiyun static void hw_var_hw_port_cfg(_adapter *adapter, u8 enable)
1228*4882a593Smuzhiyun {
1229*4882a593Smuzhiyun if (enable)
1230*4882a593Smuzhiyun hw_bcn_ctrl_add(adapter, get_hw_port(adapter), (BIT_P0_EN_RXBCN_RPT | BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION));
1231*4882a593Smuzhiyun else
1232*4882a593Smuzhiyun hw_bcn_ctrl_clr(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION);
1233*4882a593Smuzhiyun }
hw_var_set_bcn_func(PADAPTER adapter,u8 enable)1234*4882a593Smuzhiyun static void hw_var_set_bcn_func(PADAPTER adapter, u8 enable)
1235*4882a593Smuzhiyun {
1236*4882a593Smuzhiyun u8 val8;
1237*4882a593Smuzhiyun
1238*4882a593Smuzhiyun if (enable) {
1239*4882a593Smuzhiyun /* enable TX BCN report
1240*4882a593Smuzhiyun * Reg REG_FWHW_TXQ_CTRL_8821C[2] = 1
1241*4882a593Smuzhiyun * Reg REG_BCN_CTRL_8821C[3][5] = 1
1242*4882a593Smuzhiyun */
1243*4882a593Smuzhiyun val8 = rtw_read8(adapter, REG_FWHW_TXQ_CTRL_8821C);
1244*4882a593Smuzhiyun val8 |= BIT_EN_BCN_TRXRPT_V1_8821C;
1245*4882a593Smuzhiyun rtw_write8(adapter, REG_FWHW_TXQ_CTRL_8821C, val8);
1246*4882a593Smuzhiyun
1247*4882a593Smuzhiyun if (adapter->hw_port == HW_PORT0)
1248*4882a593Smuzhiyun hw_bcn_ctrl_add(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION_8821C | BIT_P0_EN_TXBCN_RPT_8821C);
1249*4882a593Smuzhiyun else
1250*4882a593Smuzhiyun hw_bcn_ctrl_add(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION_8821C);
1251*4882a593Smuzhiyun } else {
1252*4882a593Smuzhiyun if (adapter->hw_port == HW_PORT0) {
1253*4882a593Smuzhiyun val8 = BIT_EN_BCN_FUNCTION_8821C | BIT_P0_EN_TXBCN_RPT_8821C;
1254*4882a593Smuzhiyun
1255*4882a593Smuzhiyun #ifdef CONFIG_BT_COEXIST
1256*4882a593Smuzhiyun /* Always enable port0 beacon function for PSTDMA */
1257*4882a593Smuzhiyun if (GET_HAL_DATA(adapter)->EEPROMBluetoothCoexist)
1258*4882a593Smuzhiyun val8 = BIT_P0_EN_TXBCN_RPT_8821C;
1259*4882a593Smuzhiyun #endif
1260*4882a593Smuzhiyun hw_bcn_ctrl_clr(adapter, get_hw_port(adapter), val8);
1261*4882a593Smuzhiyun } else
1262*4882a593Smuzhiyun hw_bcn_ctrl_clr(adapter, get_hw_port(adapter), BIT_EN_BCN_FUNCTION_8821C);
1263*4882a593Smuzhiyun }
1264*4882a593Smuzhiyun }
1265*4882a593Smuzhiyun
hw_var_set_mlme_disconnect(PADAPTER adapter)1266*4882a593Smuzhiyun static void hw_var_set_mlme_disconnect(PADAPTER adapter)
1267*4882a593Smuzhiyun {
1268*4882a593Smuzhiyun u8 val8;
1269*4882a593Smuzhiyun
1270*4882a593Smuzhiyun #ifdef DBG_IFACE_STATUS
1271*4882a593Smuzhiyun DBG_IFACE_STATUS_DUMP(adapter);
1272*4882a593Smuzhiyun #endif
1273*4882a593Smuzhiyun
1274*4882a593Smuzhiyun #ifdef CONFIG_CONCURRENT_MODE
1275*4882a593Smuzhiyun if (rtw_mi_check_status(adapter, MI_LINKED) == _FALSE)
1276*4882a593Smuzhiyun #endif
1277*4882a593Smuzhiyun /* reject all data frames under not link state */
1278*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0);
1279*4882a593Smuzhiyun
1280*4882a593Smuzhiyun /* reset TSF*/
1281*4882a593Smuzhiyun hw_tsf_reset(adapter);
1282*4882a593Smuzhiyun
1283*4882a593Smuzhiyun /* disable update TSF*/
1284*4882a593Smuzhiyun rtw_iface_disable_tsf_update(adapter);
1285*4882a593Smuzhiyun
1286*4882a593Smuzhiyun #ifdef CONFIG_CLIENT_PORT_CFG
1287*4882a593Smuzhiyun if (MLME_IS_STA(adapter))
1288*4882a593Smuzhiyun rtw_hw_client_port_clr(adapter);
1289*4882a593Smuzhiyun #endif
1290*4882a593Smuzhiyun }
1291*4882a593Smuzhiyun
hw_var_set_mlme_sitesurvey(PADAPTER adapter,u8 enable)1292*4882a593Smuzhiyun static void hw_var_set_mlme_sitesurvey(PADAPTER adapter, u8 enable)
1293*4882a593Smuzhiyun {
1294*4882a593Smuzhiyun struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1295*4882a593Smuzhiyun u16 value_rxfltmap2;
1296*4882a593Smuzhiyun u8 val8;
1297*4882a593Smuzhiyun PHAL_DATA_TYPE hal;
1298*4882a593Smuzhiyun struct mlme_priv *pmlmepriv;
1299*4882a593Smuzhiyun int i;
1300*4882a593Smuzhiyun _adapter *iface;
1301*4882a593Smuzhiyun
1302*4882a593Smuzhiyun
1303*4882a593Smuzhiyun #ifdef DBG_IFACE_STATUS
1304*4882a593Smuzhiyun DBG_IFACE_STATUS_DUMP(adapter);
1305*4882a593Smuzhiyun #endif
1306*4882a593Smuzhiyun
1307*4882a593Smuzhiyun hal = GET_HAL_DATA(adapter);
1308*4882a593Smuzhiyun pmlmepriv = &adapter->mlmepriv;
1309*4882a593Smuzhiyun
1310*4882a593Smuzhiyun #ifdef CONFIG_FIND_BEST_CHANNEL
1311*4882a593Smuzhiyun /* Receive all data frames */
1312*4882a593Smuzhiyun value_rxfltmap2 = 0xFFFF;
1313*4882a593Smuzhiyun #else
1314*4882a593Smuzhiyun /* not to receive data frame */
1315*4882a593Smuzhiyun value_rxfltmap2 = 0;
1316*4882a593Smuzhiyun #endif
1317*4882a593Smuzhiyun
1318*4882a593Smuzhiyun if (enable) {
1319*4882a593Smuzhiyun /*
1320*4882a593Smuzhiyun * 1. configure REG_RXFLTMAP2
1321*4882a593Smuzhiyun * 2. disable TSF update & buddy TSF update to avoid updating wrong TSF due to clear RCR_CBSSID_BCN
1322*4882a593Smuzhiyun * 3. config RCR to receive different BSSID BCN or probe rsp
1323*4882a593Smuzhiyun */
1324*4882a593Smuzhiyun
1325*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP2_8821C, value_rxfltmap2);
1326*4882a593Smuzhiyun
1327*4882a593Smuzhiyun rtw_hal_rcr_set_chk_bssid(adapter, MLME_SCAN_ENTER);
1328*4882a593Smuzhiyun
1329*4882a593Smuzhiyun if (rtw_mi_get_ap_num(adapter) || rtw_mi_get_mesh_num(adapter))
1330*4882a593Smuzhiyun StopTxBeacon(adapter);
1331*4882a593Smuzhiyun } else {
1332*4882a593Smuzhiyun /* sitesurvey done
1333*4882a593Smuzhiyun * 1. enable rx data frame
1334*4882a593Smuzhiyun * 2. config RCR not to receive different BSSID BCN or probe rsp
1335*4882a593Smuzhiyun * 3. can enable TSF update & buddy TSF right now due to HW support(IC before 8821C not support ex:8812A/8814A/8192E...)
1336*4882a593Smuzhiyun */
1337*4882a593Smuzhiyun if (rtw_mi_check_fwstate(adapter, WIFI_ASOC_STATE | WIFI_AP_STATE | WIFI_MESH_STATE))/* enable to rx data frame */
1338*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0xFFFF);
1339*4882a593Smuzhiyun
1340*4882a593Smuzhiyun rtw_hal_rcr_set_chk_bssid(adapter, MLME_SCAN_DONE);
1341*4882a593Smuzhiyun
1342*4882a593Smuzhiyun #ifdef CONFIG_AP_MODE
1343*4882a593Smuzhiyun if (rtw_mi_get_ap_num(adapter) || rtw_mi_get_mesh_num(adapter)) {
1344*4882a593Smuzhiyun ResumeTxBeacon(adapter);
1345*4882a593Smuzhiyun rtw_mi_tx_beacon_hdl(adapter);
1346*4882a593Smuzhiyun }
1347*4882a593Smuzhiyun #endif
1348*4882a593Smuzhiyun }
1349*4882a593Smuzhiyun }
hw_var_set_mlme_join(PADAPTER adapter,u8 type)1350*4882a593Smuzhiyun static void hw_var_set_mlme_join(PADAPTER adapter, u8 type)
1351*4882a593Smuzhiyun {
1352*4882a593Smuzhiyun u8 val8;
1353*4882a593Smuzhiyun u16 val16;
1354*4882a593Smuzhiyun u32 val32;
1355*4882a593Smuzhiyun u8 RetryLimit;
1356*4882a593Smuzhiyun PHAL_DATA_TYPE hal;
1357*4882a593Smuzhiyun struct mlme_priv *pmlmepriv;
1358*4882a593Smuzhiyun
1359*4882a593Smuzhiyun RetryLimit = RL_VAL_STA;
1360*4882a593Smuzhiyun hal = GET_HAL_DATA(adapter);
1361*4882a593Smuzhiyun pmlmepriv = &adapter->mlmepriv;
1362*4882a593Smuzhiyun
1363*4882a593Smuzhiyun
1364*4882a593Smuzhiyun #ifdef CONFIG_CONCURRENT_MODE
1365*4882a593Smuzhiyun if (type == 0) {
1366*4882a593Smuzhiyun /* prepare to join */
1367*4882a593Smuzhiyun if (rtw_mi_get_ap_num(adapter) || rtw_mi_get_mesh_num(adapter))
1368*4882a593Smuzhiyun StopTxBeacon(adapter);
1369*4882a593Smuzhiyun
1370*4882a593Smuzhiyun /* enable to rx data frame.Accept all data frame */
1371*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0xFFFF);
1372*4882a593Smuzhiyun
1373*4882a593Smuzhiyun hw_bcn_func(adapter, _TRUE);
1374*4882a593Smuzhiyun if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
1375*4882a593Smuzhiyun RetryLimit = (hal->CustomerID == RT_CID_CCX) ? RL_VAL_AP : RL_VAL_STA;
1376*4882a593Smuzhiyun else /* Ad-hoc Mode */
1377*4882a593Smuzhiyun RetryLimit = RL_VAL_AP;
1378*4882a593Smuzhiyun #ifdef CONFIG_CLIENT_PORT_CFG
1379*4882a593Smuzhiyun rtw_hw_client_port_cfg(adapter);
1380*4882a593Smuzhiyun #endif
1381*4882a593Smuzhiyun
1382*4882a593Smuzhiyun rtw_iface_enable_tsf_update(adapter);
1383*4882a593Smuzhiyun
1384*4882a593Smuzhiyun } else if (type == 1) {
1385*4882a593Smuzhiyun /* joinbss_event call back when join res < 0 */
1386*4882a593Smuzhiyun if (rtw_mi_check_status(adapter, MI_LINKED) == _FALSE)
1387*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0x00);
1388*4882a593Smuzhiyun
1389*4882a593Smuzhiyun rtw_iface_disable_tsf_update(adapter);
1390*4882a593Smuzhiyun
1391*4882a593Smuzhiyun if (rtw_mi_get_ap_num(adapter) || rtw_mi_get_mesh_num(adapter)) {
1392*4882a593Smuzhiyun ResumeTxBeacon(adapter);
1393*4882a593Smuzhiyun
1394*4882a593Smuzhiyun /* reset TSF 1/2 after resume_tx_beacon */
1395*4882a593Smuzhiyun val8 = BIT_TSFTR_RST_8821C | BIT_TSFTR_CLI0_RST_8821C;
1396*4882a593Smuzhiyun rtw_write8(adapter, REG_DUAL_TSF_RST_8821C, val8);
1397*4882a593Smuzhiyun }
1398*4882a593Smuzhiyun #ifdef CONFIG_CLIENT_PORT_CFG
1399*4882a593Smuzhiyun if (MLME_IS_STA(adapter))
1400*4882a593Smuzhiyun rtw_hw_client_port_clr(adapter);
1401*4882a593Smuzhiyun #endif
1402*4882a593Smuzhiyun } else if (type == 2) {
1403*4882a593Smuzhiyun /* sta add event callback */
1404*4882a593Smuzhiyun if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) {
1405*4882a593Smuzhiyun rtw_write8(adapter, 0x542, 0x02);
1406*4882a593Smuzhiyun RetryLimit = RL_VAL_AP;
1407*4882a593Smuzhiyun }
1408*4882a593Smuzhiyun
1409*4882a593Smuzhiyun if (rtw_mi_get_ap_num(adapter) || rtw_mi_get_mesh_num(adapter)) {
1410*4882a593Smuzhiyun ResumeTxBeacon(adapter);
1411*4882a593Smuzhiyun
1412*4882a593Smuzhiyun /* reset TSF 1/2 after resume_tx_beacon */
1413*4882a593Smuzhiyun rtw_write8(adapter, REG_DUAL_TSF_RST_8821C, BIT_TSFTR_RST_8821C | BIT_TSFTR_CLI0_RST_8821C);
1414*4882a593Smuzhiyun }
1415*4882a593Smuzhiyun }
1416*4882a593Smuzhiyun
1417*4882a593Smuzhiyun val16 = BIT_LRL_8821C(RetryLimit) | BIT_SRL_8821C(RetryLimit);
1418*4882a593Smuzhiyun rtw_write16(adapter, REG_RETRY_LIMIT_8821C, val16);
1419*4882a593Smuzhiyun #else /* !CONFIG_CONCURRENT_MODE */
1420*4882a593Smuzhiyun if (type == 0) {
1421*4882a593Smuzhiyun /* prepare to join */
1422*4882a593Smuzhiyun
1423*4882a593Smuzhiyun /* enable to rx data frame.Accept all data frame */
1424*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0xFFFF);
1425*4882a593Smuzhiyun
1426*4882a593Smuzhiyun if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
1427*4882a593Smuzhiyun RetryLimit = (hal->CustomerID == RT_CID_CCX) ? RL_VAL_AP : RL_VAL_STA;
1428*4882a593Smuzhiyun else /* Ad-hoc Mode */
1429*4882a593Smuzhiyun RetryLimit = RL_VAL_AP;
1430*4882a593Smuzhiyun hw_bcn_func(adapter, _TRUE);
1431*4882a593Smuzhiyun
1432*4882a593Smuzhiyun rtw_iface_enable_tsf_update(adapter);
1433*4882a593Smuzhiyun
1434*4882a593Smuzhiyun } else if (type == 1) {
1435*4882a593Smuzhiyun /* joinbss_event call back when join res < 0 */
1436*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP2_8821C, 0x00);
1437*4882a593Smuzhiyun
1438*4882a593Smuzhiyun rtw_iface_disable_tsf_update(adapter);
1439*4882a593Smuzhiyun
1440*4882a593Smuzhiyun } else if (type == 2) {
1441*4882a593Smuzhiyun /* sta add event callback */
1442*4882a593Smuzhiyun if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE))
1443*4882a593Smuzhiyun RetryLimit = RL_VAL_AP;
1444*4882a593Smuzhiyun }
1445*4882a593Smuzhiyun
1446*4882a593Smuzhiyun val16 = BIT_LRL_8821C(RetryLimit) | BIT_SRL_8821C(RetryLimit);
1447*4882a593Smuzhiyun rtw_write16(adapter, REG_RETRY_LIMIT_8821C, val16);
1448*4882a593Smuzhiyun #endif /* !CONFIG_CONCURRENT_MODE */
1449*4882a593Smuzhiyun }
1450*4882a593Smuzhiyun
hw_var_set_acm_ctrl(PADAPTER adapter,u8 ctrl)1451*4882a593Smuzhiyun static void hw_var_set_acm_ctrl(PADAPTER adapter, u8 ctrl)
1452*4882a593Smuzhiyun {
1453*4882a593Smuzhiyun u8 hwctrl = 0;
1454*4882a593Smuzhiyun
1455*4882a593Smuzhiyun if (ctrl) {
1456*4882a593Smuzhiyun hwctrl |= BIT_ACMHWEN_8821C;
1457*4882a593Smuzhiyun
1458*4882a593Smuzhiyun if (ctrl & BIT(1)) /* BE */
1459*4882a593Smuzhiyun hwctrl |= BIT_BEQ_ACM_EN_8821C;
1460*4882a593Smuzhiyun else
1461*4882a593Smuzhiyun hwctrl &= (~BIT_BEQ_ACM_EN_8821C);
1462*4882a593Smuzhiyun
1463*4882a593Smuzhiyun if (ctrl & BIT(2)) /* VI */
1464*4882a593Smuzhiyun hwctrl |= BIT_VIQ_ACM_EN_8821C;
1465*4882a593Smuzhiyun else
1466*4882a593Smuzhiyun hwctrl &= (~BIT_VIQ_ACM_EN_8821C);
1467*4882a593Smuzhiyun
1468*4882a593Smuzhiyun if (ctrl & BIT(3)) /* VO */
1469*4882a593Smuzhiyun hwctrl |= BIT_VOQ_ACM_EN_8821C;
1470*4882a593Smuzhiyun else
1471*4882a593Smuzhiyun hwctrl &= (~BIT_VOQ_ACM_EN_8821C);
1472*4882a593Smuzhiyun }
1473*4882a593Smuzhiyun
1474*4882a593Smuzhiyun RTW_INFO("[HW_VAR_ACM_CTRL] Write 0x%02X\n", hwctrl);
1475*4882a593Smuzhiyun rtw_write8(adapter, REG_ACMHWCTRL_8821C, hwctrl);
1476*4882a593Smuzhiyun }
1477*4882a593Smuzhiyun
hw_var_lps_rfon_chk(_adapter * adapter,u8 rfon_ctrl)1478*4882a593Smuzhiyun void hw_var_lps_rfon_chk(_adapter *adapter, u8 rfon_ctrl)
1479*4882a593Smuzhiyun {
1480*4882a593Smuzhiyun #ifdef CONFIG_LPS_ACK
1481*4882a593Smuzhiyun struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
1482*4882a593Smuzhiyun
1483*4882a593Smuzhiyun if (rfon_ctrl == rf_on) {
1484*4882a593Smuzhiyun if (rtw_sctx_wait(&pwrpriv->lps_ack_sctx, __func__)) {
1485*4882a593Smuzhiyun if (pwrpriv->lps_ack_status > 0)
1486*4882a593Smuzhiyun RTW_INFO(FUNC_ADPT_FMT" RF_ON function is not ready !!!\n", FUNC_ADPT_ARG(adapter));
1487*4882a593Smuzhiyun } else {
1488*4882a593Smuzhiyun RTW_WARN("LPS RFON sctx query timeout, operation abort!!\n");
1489*4882a593Smuzhiyun }
1490*4882a593Smuzhiyun pwrpriv->lps_ack_status = -1;
1491*4882a593Smuzhiyun }
1492*4882a593Smuzhiyun #endif
1493*4882a593Smuzhiyun }
1494*4882a593Smuzhiyun
hw_var_set_sec_cfg(PADAPTER adapter,u8 cfg)1495*4882a593Smuzhiyun static void hw_var_set_sec_cfg(PADAPTER adapter, u8 cfg)
1496*4882a593Smuzhiyun {
1497*4882a593Smuzhiyun u16 reg_scr_ori;
1498*4882a593Smuzhiyun u16 reg_scr;
1499*4882a593Smuzhiyun
1500*4882a593Smuzhiyun reg_scr = reg_scr_ori = rtw_read16(adapter, REG_SECCFG_8821C);
1501*4882a593Smuzhiyun reg_scr |= (BIT_CHK_KEYID_8821C | BIT_RXDEC_8821C | BIT_TXENC_8821C);
1502*4882a593Smuzhiyun
1503*4882a593Smuzhiyun if (_rtw_camctl_chk_cap(adapter, SEC_CAP_CHK_BMC))
1504*4882a593Smuzhiyun reg_scr |= BIT_CHK_BMC_8821C;
1505*4882a593Smuzhiyun
1506*4882a593Smuzhiyun if (_rtw_camctl_chk_flags(adapter, SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH))
1507*4882a593Smuzhiyun reg_scr |= BIT_NOSKMC_8821C;
1508*4882a593Smuzhiyun
1509*4882a593Smuzhiyun if (reg_scr != reg_scr_ori)
1510*4882a593Smuzhiyun rtw_write16(adapter, REG_SECCFG_8821C, reg_scr);
1511*4882a593Smuzhiyun
1512*4882a593Smuzhiyun RTW_INFO("%s: [HW_VAR_SEC_CFG] 0x%x=0x%x\n", __FUNCTION__,
1513*4882a593Smuzhiyun REG_SECCFG_8821C, rtw_read32(adapter, REG_SECCFG_8821C));
1514*4882a593Smuzhiyun }
1515*4882a593Smuzhiyun
hw_var_set_sec_dk_cfg(PADAPTER adapter,u8 enable)1516*4882a593Smuzhiyun static void hw_var_set_sec_dk_cfg(PADAPTER adapter, u8 enable)
1517*4882a593Smuzhiyun {
1518*4882a593Smuzhiyun struct security_priv *sec = &adapter->securitypriv;
1519*4882a593Smuzhiyun u8 reg_scr = rtw_read8(adapter, REG_SECCFG_8821C);
1520*4882a593Smuzhiyun
1521*4882a593Smuzhiyun if (enable) {
1522*4882a593Smuzhiyun /* Enable default key related setting */
1523*4882a593Smuzhiyun reg_scr |= BIT_TXBCUSEDK_8821C;
1524*4882a593Smuzhiyun if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
1525*4882a593Smuzhiyun reg_scr |= BIT_RXUHUSEDK_8821C | BIT_TXUHUSEDK_8821C;
1526*4882a593Smuzhiyun } else {
1527*4882a593Smuzhiyun /* Disable default key related setting */
1528*4882a593Smuzhiyun reg_scr &= ~(BIT_RXBCUSEDK_8821C | BIT_TXBCUSEDK_8821C | BIT_RXUHUSEDK_8821C | BIT_TXUHUSEDK_8821C);
1529*4882a593Smuzhiyun }
1530*4882a593Smuzhiyun
1531*4882a593Smuzhiyun rtw_write8(adapter, REG_SECCFG_8821C, reg_scr);
1532*4882a593Smuzhiyun
1533*4882a593Smuzhiyun RTW_INFO("%s: [HW_VAR_SEC_DK_CFG] 0x%x=0x%08x\n", __FUNCTION__,
1534*4882a593Smuzhiyun REG_SECCFG_8821C, rtw_read32(adapter, REG_SECCFG_8821C));
1535*4882a593Smuzhiyun }
1536*4882a593Smuzhiyun
hw_var_set_bcn_valid(PADAPTER adapter)1537*4882a593Smuzhiyun static void hw_var_set_bcn_valid(PADAPTER adapter)
1538*4882a593Smuzhiyun {
1539*4882a593Smuzhiyun u8 val8 = 0;
1540*4882a593Smuzhiyun
1541*4882a593Smuzhiyun /* only port 0 can TX BCN */
1542*4882a593Smuzhiyun val8 = rtw_read8(adapter, REG_FIFOPAGE_CTRL_2_8821C + 1);
1543*4882a593Smuzhiyun val8 = val8 | BIT(7);
1544*4882a593Smuzhiyun rtw_write8(adapter, REG_FIFOPAGE_CTRL_2_8821C + 1, val8);
1545*4882a593Smuzhiyun }
1546*4882a593Smuzhiyun
hw_var_set_ack_preamble(PADAPTER adapter,u8 bShortPreamble)1547*4882a593Smuzhiyun static void hw_var_set_ack_preamble(PADAPTER adapter, u8 bShortPreamble)
1548*4882a593Smuzhiyun {
1549*4882a593Smuzhiyun u8 val8 = 0;
1550*4882a593Smuzhiyun
1551*4882a593Smuzhiyun
1552*4882a593Smuzhiyun val8 = rtw_read8(adapter, REG_WMAC_TRXPTCL_CTL_8821C + 2);
1553*4882a593Smuzhiyun val8 |= BIT(4) | BIT(5);
1554*4882a593Smuzhiyun
1555*4882a593Smuzhiyun if (bShortPreamble)
1556*4882a593Smuzhiyun val8 |= BIT1;
1557*4882a593Smuzhiyun else
1558*4882a593Smuzhiyun val8 &= (~BIT1);
1559*4882a593Smuzhiyun
1560*4882a593Smuzhiyun rtw_write8(adapter, REG_WMAC_TRXPTCL_CTL_8821C + 2, val8);
1561*4882a593Smuzhiyun }
1562*4882a593Smuzhiyun
rtl8821c_dl_rsvd_page(PADAPTER adapter,u8 mstatus)1563*4882a593Smuzhiyun void rtl8821c_dl_rsvd_page(PADAPTER adapter, u8 mstatus)
1564*4882a593Smuzhiyun {
1565*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
1566*4882a593Smuzhiyun struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
1567*4882a593Smuzhiyun struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
1568*4882a593Smuzhiyun struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
1569*4882a593Smuzhiyun BOOLEAN bcn_valid = _FALSE;
1570*4882a593Smuzhiyun u8 DLBcnCount = 0;
1571*4882a593Smuzhiyun u32 poll = 0;
1572*4882a593Smuzhiyun u8 val8, org_bcn, org_cr;
1573*4882a593Smuzhiyun u8 hw_port = rtw_hal_get_port(adapter);
1574*4882a593Smuzhiyun
1575*4882a593Smuzhiyun RTW_INFO(FUNC_ADPT_FMT ":+ hw_port=%d mstatus(%x)\n",
1576*4882a593Smuzhiyun FUNC_ADPT_ARG(adapter), hw_port, mstatus);
1577*4882a593Smuzhiyun
1578*4882a593Smuzhiyun if (mstatus == RT_MEDIA_CONNECT) {
1579*4882a593Smuzhiyun #if 0
1580*4882a593Smuzhiyun BOOLEAN bRecover = _FALSE;
1581*4882a593Smuzhiyun #endif
1582*4882a593Smuzhiyun u8 v8;
1583*4882a593Smuzhiyun
1584*4882a593Smuzhiyun /* We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 8821C -bit 10:0 */
1585*4882a593Smuzhiyun rtw_write16(adapter, port_cfg[hw_port].ps_aid, (0xF800 | pmlmeinfo->aid));
1586*4882a593Smuzhiyun
1587*4882a593Smuzhiyun /* Enable SW TX beacon - Set REG_CR bit 8. DMA beacon by SW */
1588*4882a593Smuzhiyun v8 = rtw_read8(adapter, REG_CR_8821C + 1);
1589*4882a593Smuzhiyun org_cr = v8;
1590*4882a593Smuzhiyun v8 |= (BIT_ENSWBCN_8821C >> 8);
1591*4882a593Smuzhiyun rtw_write8(adapter, REG_CR_8821C + 1, v8);
1592*4882a593Smuzhiyun
1593*4882a593Smuzhiyun /*
1594*4882a593Smuzhiyun * Disable Hw protection for a time which revserd for Hw sending beacon.
1595*4882a593Smuzhiyun * Fix download reserved page packet fail that access collision with the protection time.
1596*4882a593Smuzhiyun */
1597*4882a593Smuzhiyun val8 = rtw_read8(adapter, REG_BCN_CTRL_8821C);
1598*4882a593Smuzhiyun org_bcn = val8;
1599*4882a593Smuzhiyun val8 &= ~BIT_EN_BCN_FUNCTION_8821C;
1600*4882a593Smuzhiyun val8 |= BIT_DIS_TSF_UDT_8821C;
1601*4882a593Smuzhiyun rtw_write8(adapter, REG_BCN_CTRL_8821C, val8);
1602*4882a593Smuzhiyun
1603*4882a593Smuzhiyun #if 0
1604*4882a593Smuzhiyun /* Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. */
1605*4882a593Smuzhiyun RegFwHwTxQCtrl = rtw_read8(adapter, REG_FWHW_TXQ_CTRL_8821C + 2);
1606*4882a593Smuzhiyun
1607*4882a593Smuzhiyun if (RegFwHwTxQCtrl & BIT(6))
1608*4882a593Smuzhiyun bRecover = _TRUE;
1609*4882a593Smuzhiyun
1610*4882a593Smuzhiyun /* To tell Hw the packet is not a real beacon frame. */
1611*4882a593Smuzhiyun RegFwHwTxQCtrl &= ~BIT(6);
1612*4882a593Smuzhiyun rtw_write8(adapter, REG_FWHW_TXQ_CTRL_8821C + 2, RegFwHwTxQCtrl);
1613*4882a593Smuzhiyun #endif
1614*4882a593Smuzhiyun
1615*4882a593Smuzhiyun /* Clear beacon valid check bit. */
1616*4882a593Smuzhiyun rtw_hal_set_hwreg(adapter, HW_VAR_BCN_VALID, NULL);
1617*4882a593Smuzhiyun
1618*4882a593Smuzhiyun DLBcnCount = 0;
1619*4882a593Smuzhiyun poll = 0;
1620*4882a593Smuzhiyun do {
1621*4882a593Smuzhiyun /* download rsvd page. */
1622*4882a593Smuzhiyun rtw_hal_set_fw_rsvd_page(adapter, _FALSE);
1623*4882a593Smuzhiyun DLBcnCount++;
1624*4882a593Smuzhiyun do {
1625*4882a593Smuzhiyun rtw_yield_os();
1626*4882a593Smuzhiyun
1627*4882a593Smuzhiyun /* check rsvd page download OK. */
1628*4882a593Smuzhiyun rtw_hal_get_hwreg(adapter, HW_VAR_BCN_VALID, (u8 *)(&bcn_valid));
1629*4882a593Smuzhiyun poll++;
1630*4882a593Smuzhiyun } while (!bcn_valid && (poll % 10) != 0 && !RTW_CANNOT_RUN(adapter));
1631*4882a593Smuzhiyun
1632*4882a593Smuzhiyun } while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(adapter));
1633*4882a593Smuzhiyun
1634*4882a593Smuzhiyun if (RTW_CANNOT_RUN(adapter))
1635*4882a593Smuzhiyun ;
1636*4882a593Smuzhiyun else if (!bcn_valid)
1637*4882a593Smuzhiyun RTW_ERR(FUNC_ADPT_FMT ": DL RSVD page failed! DLBcnCount:%u, poll:%u\n",
1638*4882a593Smuzhiyun FUNC_ADPT_ARG(adapter), DLBcnCount, poll);
1639*4882a593Smuzhiyun else {
1640*4882a593Smuzhiyun struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
1641*4882a593Smuzhiyun
1642*4882a593Smuzhiyun pwrctl->fw_psmode_iface_id = adapter->iface_id;
1643*4882a593Smuzhiyun rtw_hal_set_fw_rsvd_page(adapter, _TRUE);
1644*4882a593Smuzhiyun RTW_INFO(ADPT_FMT ": DL RSVD page success! DLBcnCount:%u, poll:%u\n",
1645*4882a593Smuzhiyun ADPT_ARG(adapter), DLBcnCount, poll);
1646*4882a593Smuzhiyun }
1647*4882a593Smuzhiyun
1648*4882a593Smuzhiyun rtw_write8(adapter, REG_CR_8821C + 1, org_cr);
1649*4882a593Smuzhiyun rtw_write8(adapter, REG_BCN_CTRL_8821C, org_bcn);
1650*4882a593Smuzhiyun #if 0
1651*4882a593Smuzhiyun /*
1652*4882a593Smuzhiyun * To make sure that if there exists an adapter which would like to send beacon.
1653*4882a593Smuzhiyun * If exists, the origianl value of 0x422[6] will be 1, we should check this to
1654*4882a593Smuzhiyun * prevent from setting 0x422[6] to 0 after download reserved page, or it will cause
1655*4882a593Smuzhiyun * the beacon cannot be sent by HW.
1656*4882a593Smuzhiyun */
1657*4882a593Smuzhiyun if (bRecover) {
1658*4882a593Smuzhiyun RegFwHwTxQCtrl |= BIT(6);
1659*4882a593Smuzhiyun rtw_write8(adapter, REG_FWHW_TXQ_CTRL_8821C + 2, RegFwHwTxQCtrl);
1660*4882a593Smuzhiyun }
1661*4882a593Smuzhiyun #endif
1662*4882a593Smuzhiyun #ifndef CONFIG_PCI_HCI
1663*4882a593Smuzhiyun /* Clear CR[8] or beacon packet will not be send to TxBuf anymore. */
1664*4882a593Smuzhiyun v8 = rtw_read8(adapter, REG_CR_8821C + 1);
1665*4882a593Smuzhiyun v8 &= ~BIT(0); /* ~ENSWBCN */
1666*4882a593Smuzhiyun rtw_write8(adapter, REG_CR_8821C + 1, v8);
1667*4882a593Smuzhiyun #endif /* !CONFIG_PCI_HCI */
1668*4882a593Smuzhiyun }
1669*4882a593Smuzhiyun
1670*4882a593Smuzhiyun }
1671*4882a593Smuzhiyun
rtl8821c_set_h2c_fw_joinbssrpt(PADAPTER adapter,u8 mstatus)1672*4882a593Smuzhiyun static void rtl8821c_set_h2c_fw_joinbssrpt(PADAPTER adapter, u8 mstatus)
1673*4882a593Smuzhiyun {
1674*4882a593Smuzhiyun if (mstatus == RT_MEDIA_CONNECT)
1675*4882a593Smuzhiyun rtl8821c_dl_rsvd_page(adapter, RT_MEDIA_CONNECT);
1676*4882a593Smuzhiyun }
1677*4882a593Smuzhiyun
1678*4882a593Smuzhiyun #ifdef CONFIG_WOWLAN
hw_var_vendor_wow_mode(_adapter * adapter,u8 en)1679*4882a593Smuzhiyun static void hw_var_vendor_wow_mode(_adapter *adapter, u8 en)
1680*4882a593Smuzhiyun {
1681*4882a593Smuzhiyun #ifdef CONFIG_CONCURRENT_MODE
1682*4882a593Smuzhiyun _adapter *iface = NULL;
1683*4882a593Smuzhiyun struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1684*4882a593Smuzhiyun struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1685*4882a593Smuzhiyun u8 igi = 0, mac_addr[ETH_ALEN];
1686*4882a593Smuzhiyun
1687*4882a593Smuzhiyun RTW_INFO("%s: en(%d)--->\n", __func__, en);
1688*4882a593Smuzhiyun if (en) {
1689*4882a593Smuzhiyun rtw_hal_get_hwreg(adapter, HW_VAR_MAC_ADDR, mac_addr);
1690*4882a593Smuzhiyun /* RTW_INFO("suspend mac addr: "MAC_FMT"\n", MAC_ARG(mac_addr)); */
1691*4882a593Smuzhiyun rtw_halmac_set_bssid(dvobj, HW_PORT4, mac_addr);
1692*4882a593Smuzhiyun dvobj->rxfltmap2_bf_suspend = rtw_read16(adapter, REG_RXFLTMAP2);
1693*4882a593Smuzhiyun dvobj->bcn_ctrl_clint3_bf_suspend = rtw_read8(adapter, REG_BCN_CTRL_CLINT3);
1694*4882a593Smuzhiyun dvobj->rcr_bf_suspend = rtw_read32(adapter, REG_RCR);
1695*4882a593Smuzhiyun dvobj->cr_ext_bf_suspend = rtw_read32(adapter, REG_CR_EXT);
1696*4882a593Smuzhiyun /*RTW_INFO("RCR: 0x%02x, REG_CR_EXT: 0x%02x , REG_BCN_CTRL_CLINT3: 0x%02x, REG_RXFLTMAP2:0x%02x, REG_MACID_DROP0_8822B:0x%02x\n"
1697*4882a593Smuzhiyun , rtw_read32(adapter, REG_RCR), rtw_read8(adapter, REG_CR_EXT), rtw_read8(adapter, REG_BCN_CTRL_CLINT3)
1698*4882a593Smuzhiyun , rtw_read32(adapter, REG_RXFLTMAP2), rtw_read8(adapter, REG_MACID_DROP0_8822B)); */
1699*4882a593Smuzhiyun rtw_write32(adapter, REG_RCR, (rtw_read32(adapter, REG_RCR) & (~(RCR_AM))) | RCR_CBSSID_DATA | RCR_CBSSID_BCN);
1700*4882a593Smuzhiyun /* set PORT4 to ad hoc mode to filter not necessary Beacons */
1701*4882a593Smuzhiyun rtw_write8(adapter, REG_CR_EXT, (rtw_read8(adapter, REG_CR_EXT)& (~BIT5)) | BIT4);
1702*4882a593Smuzhiyun rtw_write8(adapter, REG_BCN_CTRL_CLINT3, rtw_read8(adapter, REG_BCN_CTRL_CLINT3) | BIT3);
1703*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP2, 0xffff);
1704*4882a593Smuzhiyun /* RTW_INFO("RCR: 0x%02x, REG_CR_EXT: 0x%02x , REG_BCN_CTRL_CLINT3: 0x%02x, REG_RXFLTMAP2:0x%02x, REG_MACID_DROP0_8822B:0x%02x\n"
1705*4882a593Smuzhiyun , rtw_read32(adapter, REG_RCR), rtw_read8(adapter, REG_CR_EXT), rtw_read8(adapter, REG_BCN_CTRL_CLINT3)
1706*4882a593Smuzhiyun , rtw_read32(adapter, REG_RXFLTMAP2), rtw_read8(adapter, REG_MACID_DROP0_8822B)); */
1707*4882a593Smuzhiyun
1708*4882a593Smuzhiyun /* The WRC's RSSI is weak. Set the IGI to lower */
1709*4882a593Smuzhiyun odm_write_dig(adapter_to_phydm(adapter), 0x24);
1710*4882a593Smuzhiyun } else {
1711*4882a593Smuzhiyun /* restore the rcr, port ctrol setting */
1712*4882a593Smuzhiyun rtw_write32(adapter, REG_CR_EXT, dvobj->cr_ext_bf_suspend);
1713*4882a593Smuzhiyun rtw_write32(adapter, REG_RCR, dvobj->rcr_bf_suspend);
1714*4882a593Smuzhiyun rtw_write8(adapter, REG_BCN_CTRL_CLINT3, dvobj->bcn_ctrl_clint3_bf_suspend);
1715*4882a593Smuzhiyun rtw_write16(adapter, REG_RXFLTMAP2, dvobj->rxfltmap2_bf_suspend);
1716*4882a593Smuzhiyun
1717*4882a593Smuzhiyun /* RTW_INFO("RCR: 0x%02x, REG_CR_EXT: 0x%02x , REG_BCN_CTRL_CLINT3: 0x%02x, REG_RXFLTMAP2:0x%02x, REG_MACID_DROP0_8822B:0x%02x\n"
1718*4882a593Smuzhiyun , rtw_read32(adapter, REG_RCR), rtw_read8(adapter, REG_CR_EXT), rtw_read8(adapter, REG_BCN_CTRL_CLINT3)
1719*4882a593Smuzhiyun , rtw_read32(adapter, REG_RXFLTMAP2), rtw_read8(adapter, REG_MACID_DROP0_8822B)); */
1720*4882a593Smuzhiyun }
1721*4882a593Smuzhiyun #endif /* CONFIG_CONCURRENT_MODE */
1722*4882a593Smuzhiyun }
1723*4882a593Smuzhiyun #endif /* CONFIG_WOWLAN */
1724*4882a593Smuzhiyun
1725*4882a593Smuzhiyun /*
1726*4882a593Smuzhiyun * Parameters:
1727*4882a593Smuzhiyun * adapter
1728*4882a593Smuzhiyun * enable _TRUE: enable; _FALSE: disable
1729*4882a593Smuzhiyun */
rx_agg_switch(PADAPTER adapter,u8 enable)1730*4882a593Smuzhiyun static u8 rx_agg_switch(PADAPTER adapter, u8 enable)
1731*4882a593Smuzhiyun {
1732*4882a593Smuzhiyun /* if (rtl8821c_config_rx_agg(adapter, enable)) */
1733*4882a593Smuzhiyun return _SUCCESS;
1734*4882a593Smuzhiyun
1735*4882a593Smuzhiyun return _FAIL;
1736*4882a593Smuzhiyun }
1737*4882a593Smuzhiyun
rtl8821c_sethwreg(PADAPTER adapter,u8 variable,u8 * val)1738*4882a593Smuzhiyun u8 rtl8821c_sethwreg(PADAPTER adapter, u8 variable, u8 *val)
1739*4882a593Smuzhiyun {
1740*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
1741*4882a593Smuzhiyun u8 ret = _SUCCESS;
1742*4882a593Smuzhiyun u8 val8;
1743*4882a593Smuzhiyun u16 val16;
1744*4882a593Smuzhiyun u32 val32;
1745*4882a593Smuzhiyun
1746*4882a593Smuzhiyun
1747*4882a593Smuzhiyun switch (variable) {
1748*4882a593Smuzhiyun case HW_VAR_SET_OPMODE:
1749*4882a593Smuzhiyun hw_var_set_opmode(adapter, val);
1750*4882a593Smuzhiyun break;
1751*4882a593Smuzhiyun /*
1752*4882a593Smuzhiyun case HW_VAR_INIT_RTS_RATE:
1753*4882a593Smuzhiyun break;
1754*4882a593Smuzhiyun */
1755*4882a593Smuzhiyun case HW_VAR_BASIC_RATE:
1756*4882a593Smuzhiyun rtw_var_set_basic_rate(adapter, val);
1757*4882a593Smuzhiyun break;
1758*4882a593Smuzhiyun
1759*4882a593Smuzhiyun case HW_VAR_TXPAUSE:
1760*4882a593Smuzhiyun rtw_write8(adapter, REG_TXPAUSE_8821C, *val);
1761*4882a593Smuzhiyun break;
1762*4882a593Smuzhiyun
1763*4882a593Smuzhiyun case HW_VAR_BCN_FUNC:
1764*4882a593Smuzhiyun hw_var_set_bcn_func(adapter, *val);
1765*4882a593Smuzhiyun break;
1766*4882a593Smuzhiyun
1767*4882a593Smuzhiyun case HW_VAR_PORT_CFG:
1768*4882a593Smuzhiyun hw_var_hw_port_cfg(adapter, *val);
1769*4882a593Smuzhiyun break;
1770*4882a593Smuzhiyun
1771*4882a593Smuzhiyun case HW_VAR_MLME_DISCONNECT:
1772*4882a593Smuzhiyun hw_var_set_mlme_disconnect(adapter);
1773*4882a593Smuzhiyun break;
1774*4882a593Smuzhiyun
1775*4882a593Smuzhiyun case HW_VAR_MLME_SITESURVEY:
1776*4882a593Smuzhiyun hw_var_set_mlme_sitesurvey(adapter, *val);
1777*4882a593Smuzhiyun #ifdef CONFIG_BT_COEXIST
1778*4882a593Smuzhiyun if (hal->EEPROMBluetoothCoexist)
1779*4882a593Smuzhiyun rtw_btcoex_ScanNotify(adapter, *val ? _TRUE : _FALSE);
1780*4882a593Smuzhiyun else
1781*4882a593Smuzhiyun #endif /* CONFIG_BT_COEXIST */
1782*4882a593Smuzhiyun rtw_btcoex_wifionly_scan_notify(adapter);
1783*4882a593Smuzhiyun break;
1784*4882a593Smuzhiyun
1785*4882a593Smuzhiyun case HW_VAR_MLME_JOIN:
1786*4882a593Smuzhiyun hw_var_set_mlme_join(adapter, *val);
1787*4882a593Smuzhiyun break;
1788*4882a593Smuzhiyun
1789*4882a593Smuzhiyun case HW_VAR_SLOT_TIME:
1790*4882a593Smuzhiyun rtw_write8(adapter, REG_SLOT_8821C, *val);
1791*4882a593Smuzhiyun break;
1792*4882a593Smuzhiyun
1793*4882a593Smuzhiyun case HW_VAR_RESP_SIFS:
1794*4882a593Smuzhiyun /* RESP_SIFS for CCK */
1795*4882a593Smuzhiyun rtw_write8(adapter, REG_RESP_SIFS_CCK_8821C, 0x08);
1796*4882a593Smuzhiyun rtw_write8(adapter, REG_RESP_SIFS_CCK_8821C + 1, 0x08);
1797*4882a593Smuzhiyun /* RESP_SIFS for OFDM */
1798*4882a593Smuzhiyun rtw_write8(adapter, REG_RESP_SIFS_OFDM_8821C, 0x0a);
1799*4882a593Smuzhiyun rtw_write8(adapter, REG_RESP_SIFS_OFDM_8821C + 1, 0x0a);
1800*4882a593Smuzhiyun break;
1801*4882a593Smuzhiyun
1802*4882a593Smuzhiyun case HW_VAR_ACK_PREAMBLE:
1803*4882a593Smuzhiyun hw_var_set_ack_preamble(adapter, *val);
1804*4882a593Smuzhiyun break;
1805*4882a593Smuzhiyun
1806*4882a593Smuzhiyun case HW_VAR_SEC_CFG:
1807*4882a593Smuzhiyun hw_var_set_sec_cfg(adapter, *val);
1808*4882a593Smuzhiyun break;
1809*4882a593Smuzhiyun
1810*4882a593Smuzhiyun case HW_VAR_SEC_DK_CFG:
1811*4882a593Smuzhiyun if (val)
1812*4882a593Smuzhiyun hw_var_set_sec_dk_cfg(adapter, _TRUE);
1813*4882a593Smuzhiyun else
1814*4882a593Smuzhiyun hw_var_set_sec_dk_cfg(adapter, _FALSE);
1815*4882a593Smuzhiyun break;
1816*4882a593Smuzhiyun
1817*4882a593Smuzhiyun case HW_VAR_BCN_VALID:
1818*4882a593Smuzhiyun hw_var_set_bcn_valid(adapter);
1819*4882a593Smuzhiyun break;
1820*4882a593Smuzhiyun
1821*4882a593Smuzhiyun case HW_VAR_CAM_INVALID_ALL:
1822*4882a593Smuzhiyun val32 = BIT_SECCAM_POLLING_8821C | BIT_SECCAM_CLR_8821C;
1823*4882a593Smuzhiyun rtw_write32(adapter, REG_CAMCMD_8821C, val32);
1824*4882a593Smuzhiyun break;
1825*4882a593Smuzhiyun
1826*4882a593Smuzhiyun case HW_VAR_AC_PARAM_VO:
1827*4882a593Smuzhiyun rtw_write32(adapter, REG_EDCA_VO_PARAM_8821C, *(u32 *)val);
1828*4882a593Smuzhiyun break;
1829*4882a593Smuzhiyun
1830*4882a593Smuzhiyun case HW_VAR_AC_PARAM_VI:
1831*4882a593Smuzhiyun rtw_write32(adapter, REG_EDCA_VI_PARAM_8821C, *(u32 *)val);
1832*4882a593Smuzhiyun break;
1833*4882a593Smuzhiyun
1834*4882a593Smuzhiyun case HW_VAR_AC_PARAM_BE:
1835*4882a593Smuzhiyun hal->ac_param_be = *(u32 *)val;
1836*4882a593Smuzhiyun rtw_write32(adapter, REG_EDCA_BE_PARAM_8821C, *(u32 *)val);
1837*4882a593Smuzhiyun break;
1838*4882a593Smuzhiyun
1839*4882a593Smuzhiyun case HW_VAR_AC_PARAM_BK:
1840*4882a593Smuzhiyun rtw_write32(adapter, REG_EDCA_BK_PARAM_8821C, *(u32 *)val);
1841*4882a593Smuzhiyun break;
1842*4882a593Smuzhiyun
1843*4882a593Smuzhiyun case HW_VAR_ACM_CTRL:
1844*4882a593Smuzhiyun hw_var_set_acm_ctrl(adapter, *val);
1845*4882a593Smuzhiyun break;
1846*4882a593Smuzhiyun /*
1847*4882a593Smuzhiyun case HW_VAR_AMPDU_MIN_SPACE:
1848*4882a593Smuzhiyun break;
1849*4882a593Smuzhiyun */
1850*4882a593Smuzhiyun #ifdef CONFIG_80211N_HT
1851*4882a593Smuzhiyun case HW_VAR_AMPDU_FACTOR: {
1852*4882a593Smuzhiyun u32 AMPDULen = *val; /* enum AGGRE_SIZE */
1853*4882a593Smuzhiyun
1854*4882a593Smuzhiyun AMPDULen = (0x2000 << AMPDULen) - 1;
1855*4882a593Smuzhiyun rtw_write32(adapter, REG_AMPDU_MAX_LENGTH_8821C, AMPDULen);
1856*4882a593Smuzhiyun }
1857*4882a593Smuzhiyun break;
1858*4882a593Smuzhiyun #endif /* CONFIG_80211N_HT */
1859*4882a593Smuzhiyun case HW_VAR_RXDMA_AGG_PG_TH:
1860*4882a593Smuzhiyun /*
1861*4882a593Smuzhiyun * TH=1 => invalidate RX DMA aggregation
1862*4882a593Smuzhiyun * TH=0 => validate RX DMA aggregation, use init value.
1863*4882a593Smuzhiyun */
1864*4882a593Smuzhiyun if (*val == 0)
1865*4882a593Smuzhiyun /* enable RXDMA aggregation */
1866*4882a593Smuzhiyun rx_agg_switch(adapter, _TRUE);
1867*4882a593Smuzhiyun else
1868*4882a593Smuzhiyun /* disable RXDMA aggregation */
1869*4882a593Smuzhiyun rx_agg_switch(adapter, _FALSE);
1870*4882a593Smuzhiyun break;
1871*4882a593Smuzhiyun
1872*4882a593Smuzhiyun case HW_VAR_H2C_FW_PWRMODE:
1873*4882a593Smuzhiyun rtl8821c_set_FwPwrMode_cmd(adapter, *val);
1874*4882a593Smuzhiyun break;
1875*4882a593Smuzhiyun
1876*4882a593Smuzhiyun case HW_VAR_H2C_FW_PWRMODE_RFON_CTRL:
1877*4882a593Smuzhiyun rtl8821c_set_FwPwrMode_rfon_ctrl_cmd(adapter, *val);
1878*4882a593Smuzhiyun break;
1879*4882a593Smuzhiyun
1880*4882a593Smuzhiyun case HW_VAR_LPS_RFON_CHK :
1881*4882a593Smuzhiyun hw_var_lps_rfon_chk(adapter, *val);
1882*4882a593Smuzhiyun break;
1883*4882a593Smuzhiyun /*
1884*4882a593Smuzhiyun case HW_VAR_H2C_PS_TUNE_PARAM:
1885*4882a593Smuzhiyun break;
1886*4882a593Smuzhiyun */
1887*4882a593Smuzhiyun case HW_VAR_H2C_FW_JOINBSSRPT:
1888*4882a593Smuzhiyun rtl8821c_set_h2c_fw_joinbssrpt(adapter, *val);
1889*4882a593Smuzhiyun break;
1890*4882a593Smuzhiyun case HW_VAR_H2C_INACTIVE_IPS:
1891*4882a593Smuzhiyun #ifdef CONFIG_WOWLAN
1892*4882a593Smuzhiyun rtl8821c_set_fw_pwrmode_inips_cmd_wowlan(adapter, *val);
1893*4882a593Smuzhiyun #endif /* CONFIG_WOWLAN */
1894*4882a593Smuzhiyun #ifdef CONFIG_WOWLAN
1895*4882a593Smuzhiyun case HW_VAR_VENDOR_WOW_MODE:
1896*4882a593Smuzhiyun hw_var_vendor_wow_mode(adapter, *(u8 *)val);
1897*4882a593Smuzhiyun break;
1898*4882a593Smuzhiyun #endif /* CONFIG_WOWLAN */
1899*4882a593Smuzhiyun case HW_VAR_DL_RSVD_PAGE:
1900*4882a593Smuzhiyun #ifdef CONFIG_BT_COEXIST
1901*4882a593Smuzhiyun if (check_fwstate(&adapter->mlmepriv, WIFI_AP_STATE) == _TRUE)
1902*4882a593Smuzhiyun rtl8821c_download_BTCoex_AP_mode_rsvd_page(adapter);
1903*4882a593Smuzhiyun #endif
1904*4882a593Smuzhiyun break;
1905*4882a593Smuzhiyun #ifdef CONFIG_P2P
1906*4882a593Smuzhiyun case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
1907*4882a593Smuzhiyun #ifdef CONFIG_FW_MULTI_PORT_SUPPORT
1908*4882a593Smuzhiyun if (*val == P2P_PS_ENABLE)
1909*4882a593Smuzhiyun rtw_set_default_port_id(adapter);
1910*4882a593Smuzhiyun #endif
1911*4882a593Smuzhiyun rtw_set_p2p_ps_offload_cmd(adapter, *val);
1912*4882a593Smuzhiyun break;
1913*4882a593Smuzhiyun #endif
1914*4882a593Smuzhiyun
1915*4882a593Smuzhiyun /*
1916*4882a593Smuzhiyun case HW_VAR_TRIGGER_GPIO_0:
1917*4882a593Smuzhiyun case HW_VAR_BT_SET_COEXIST:
1918*4882a593Smuzhiyun case HW_VAR_BT_ISSUE_DELBA:
1919*4882a593Smuzhiyun break;
1920*4882a593Smuzhiyun */
1921*4882a593Smuzhiyun
1922*4882a593Smuzhiyun /*
1923*4882a593Smuzhiyun case HW_VAR_SWITCH_EPHY_WoWLAN:
1924*4882a593Smuzhiyun case HW_VAR_EFUSE_USAGE:
1925*4882a593Smuzhiyun case HW_VAR_EFUSE_BYTES:
1926*4882a593Smuzhiyun case HW_VAR_EFUSE_BT_USAGE:
1927*4882a593Smuzhiyun case HW_VAR_EFUSE_BT_BYTES:
1928*4882a593Smuzhiyun break;
1929*4882a593Smuzhiyun */
1930*4882a593Smuzhiyun case HW_VAR_FIFO_CLEARN_UP: {
1931*4882a593Smuzhiyun struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
1932*4882a593Smuzhiyun u8 trycnt = 100;
1933*4882a593Smuzhiyun u32 reg_hw_ssn;
1934*4882a593Smuzhiyun
1935*4882a593Smuzhiyun /* pause tx */
1936*4882a593Smuzhiyun rtw_write8(adapter, REG_TXPAUSE_8821C, 0xff);
1937*4882a593Smuzhiyun
1938*4882a593Smuzhiyun /* keep hw sn */
1939*4882a593Smuzhiyun if (adapter->xmitpriv.hw_ssn_seq_no == 1)
1940*4882a593Smuzhiyun reg_hw_ssn = REG_HW_SEQ1_8821C;
1941*4882a593Smuzhiyun else if (adapter->xmitpriv.hw_ssn_seq_no == 2)
1942*4882a593Smuzhiyun reg_hw_ssn = REG_HW_SEQ2_8821C;
1943*4882a593Smuzhiyun else if (adapter->xmitpriv.hw_ssn_seq_no == 3)
1944*4882a593Smuzhiyun reg_hw_ssn = REG_HW_SEQ3_8821C;
1945*4882a593Smuzhiyun else
1946*4882a593Smuzhiyun reg_hw_ssn = REG_HW_SEQ0_8821C;
1947*4882a593Smuzhiyun
1948*4882a593Smuzhiyun adapter->xmitpriv.nqos_ssn = rtw_read16(adapter, reg_hw_ssn);
1949*4882a593Smuzhiyun
1950*4882a593Smuzhiyun if (pwrpriv->bkeepfwalive != _TRUE) {
1951*4882a593Smuzhiyun /* RX DMA stop */
1952*4882a593Smuzhiyun val32 = rtw_read32(adapter, REG_RXPKT_NUM_8821C);
1953*4882a593Smuzhiyun val32 |= BIT_RW_RELEASE_EN;
1954*4882a593Smuzhiyun rtw_write32(adapter, REG_RXPKT_NUM_8821C, val32);
1955*4882a593Smuzhiyun do {
1956*4882a593Smuzhiyun val32 = rtw_read32(adapter, REG_RXPKT_NUM_8821C);
1957*4882a593Smuzhiyun val32 &= BIT_RXDMA_IDLE_8821C;
1958*4882a593Smuzhiyun if (val32)
1959*4882a593Smuzhiyun break;
1960*4882a593Smuzhiyun
1961*4882a593Smuzhiyun RTW_INFO("[HW_VAR_FIFO_CLEARN_UP] val=%x times:%d\n", val32, trycnt);
1962*4882a593Smuzhiyun rtw_yield_os();
1963*4882a593Smuzhiyun } while (--trycnt);
1964*4882a593Smuzhiyun if (trycnt == 0)
1965*4882a593Smuzhiyun RTW_INFO("[HW_VAR_FIFO_CLEARN_UP] Stop RX DMA failed!\n");
1966*4882a593Smuzhiyun #if 0
1967*4882a593Smuzhiyun /* RQPN Load 0 */
1968*4882a593Smuzhiyun rtw_write16(adapter, REG_RQPN_NPQ, 0);
1969*4882a593Smuzhiyun rtw_write32(adapter, REG_RQPN, 0x80000000);
1970*4882a593Smuzhiyun rtw_mdelay_os(2);
1971*4882a593Smuzhiyun #endif
1972*4882a593Smuzhiyun }
1973*4882a593Smuzhiyun }
1974*4882a593Smuzhiyun break;
1975*4882a593Smuzhiyun
1976*4882a593Smuzhiyun case HW_VAR_RESTORE_HW_SEQ: {
1977*4882a593Smuzhiyun /* restore Sequence No. */
1978*4882a593Smuzhiyun u32 reg_hw_ssn;
1979*4882a593Smuzhiyun
1980*4882a593Smuzhiyun if (adapter->xmitpriv.hw_ssn_seq_no == 1)
1981*4882a593Smuzhiyun reg_hw_ssn = REG_HW_SEQ1_8821C;
1982*4882a593Smuzhiyun else if (adapter->xmitpriv.hw_ssn_seq_no == 2)
1983*4882a593Smuzhiyun reg_hw_ssn = REG_HW_SEQ2_8821C;
1984*4882a593Smuzhiyun else if (adapter->xmitpriv.hw_ssn_seq_no == 3)
1985*4882a593Smuzhiyun reg_hw_ssn = REG_HW_SEQ3_8821C;
1986*4882a593Smuzhiyun else
1987*4882a593Smuzhiyun reg_hw_ssn = REG_HW_SEQ0_8821C;
1988*4882a593Smuzhiyun
1989*4882a593Smuzhiyun rtw_write8(adapter, reg_hw_ssn, adapter->xmitpriv.nqos_ssn);
1990*4882a593Smuzhiyun }
1991*4882a593Smuzhiyun break;
1992*4882a593Smuzhiyun
1993*4882a593Smuzhiyun case HW_VAR_CHECK_TXBUF: {
1994*4882a593Smuzhiyun u16 rtylmtorg;
1995*4882a593Smuzhiyun u8 RetryLimit = 0x01;
1996*4882a593Smuzhiyun systime start;
1997*4882a593Smuzhiyun u32 passtime;
1998*4882a593Smuzhiyun u32 timelmt = 2000; /* ms */
1999*4882a593Smuzhiyun u32 waittime = 10; /* ms */
2000*4882a593Smuzhiyun u32 high, low, normal, extra, publc;
2001*4882a593Smuzhiyun u16 rsvd, available;
2002*4882a593Smuzhiyun u8 empty;
2003*4882a593Smuzhiyun
2004*4882a593Smuzhiyun
2005*4882a593Smuzhiyun rtylmtorg = rtw_read16(adapter, REG_RETRY_LIMIT_8821C);
2006*4882a593Smuzhiyun
2007*4882a593Smuzhiyun val16 = BIT_LRL_8821C(RetryLimit) | BIT_SRL_8821C(RetryLimit);
2008*4882a593Smuzhiyun rtw_write16(adapter, REG_RETRY_LIMIT_8821C, val16);
2009*4882a593Smuzhiyun
2010*4882a593Smuzhiyun /* Check TX FIFO empty or not */
2011*4882a593Smuzhiyun empty = _FALSE;
2012*4882a593Smuzhiyun high = 0;
2013*4882a593Smuzhiyun low = 0;
2014*4882a593Smuzhiyun normal = 0;
2015*4882a593Smuzhiyun extra = 0;
2016*4882a593Smuzhiyun publc = 0;
2017*4882a593Smuzhiyun start = rtw_get_current_time();
2018*4882a593Smuzhiyun while ((rtw_get_passing_time_ms(start) < timelmt)
2019*4882a593Smuzhiyun && !RTW_CANNOT_RUN(adapter)) {
2020*4882a593Smuzhiyun high = rtw_read32(adapter, REG_FIFOPAGE_INFO_1_8821C);
2021*4882a593Smuzhiyun low = rtw_read32(adapter, REG_FIFOPAGE_INFO_2_8821C);
2022*4882a593Smuzhiyun normal = rtw_read32(adapter, REG_FIFOPAGE_INFO_3_8821C);
2023*4882a593Smuzhiyun extra = rtw_read32(adapter, REG_FIFOPAGE_INFO_4_8821C);
2024*4882a593Smuzhiyun publc = rtw_read32(adapter, REG_FIFOPAGE_INFO_5_8821C);
2025*4882a593Smuzhiyun
2026*4882a593Smuzhiyun rsvd = BIT_GET_HPQ_V1_8821C(high);
2027*4882a593Smuzhiyun available = BIT_GET_HPQ_AVAL_PG_V1_8821C(high);
2028*4882a593Smuzhiyun if (rsvd != available) {
2029*4882a593Smuzhiyun rtw_msleep_os(waittime);
2030*4882a593Smuzhiyun continue;
2031*4882a593Smuzhiyun }
2032*4882a593Smuzhiyun
2033*4882a593Smuzhiyun rsvd = BIT_GET_LPQ_V1_8821C(low);
2034*4882a593Smuzhiyun available = BIT_GET_LPQ_AVAL_PG_V1_8821C(low);
2035*4882a593Smuzhiyun if (rsvd != available) {
2036*4882a593Smuzhiyun rtw_msleep_os(waittime);
2037*4882a593Smuzhiyun continue;
2038*4882a593Smuzhiyun }
2039*4882a593Smuzhiyun
2040*4882a593Smuzhiyun rsvd = BIT_GET_NPQ_V1_8821C(normal);
2041*4882a593Smuzhiyun available = BIT_GET_NPQ_AVAL_PG_V1_8821C(normal);
2042*4882a593Smuzhiyun if (rsvd != available) {
2043*4882a593Smuzhiyun rtw_msleep_os(waittime);
2044*4882a593Smuzhiyun continue;
2045*4882a593Smuzhiyun }
2046*4882a593Smuzhiyun
2047*4882a593Smuzhiyun rsvd = BIT_GET_EXQ_V1_8821C(extra);
2048*4882a593Smuzhiyun available = BIT_GET_EXQ_AVAL_PG_V1_8821C(extra);
2049*4882a593Smuzhiyun if (rsvd != available) {
2050*4882a593Smuzhiyun rtw_msleep_os(waittime);
2051*4882a593Smuzhiyun continue;
2052*4882a593Smuzhiyun }
2053*4882a593Smuzhiyun
2054*4882a593Smuzhiyun rsvd = BIT_GET_PUBQ_V1_8821C(publc);
2055*4882a593Smuzhiyun available = BIT_GET_PUBQ_AVAL_PG_V1_8821C(publc);
2056*4882a593Smuzhiyun if (rsvd != available) {
2057*4882a593Smuzhiyun rtw_msleep_os(waittime);
2058*4882a593Smuzhiyun continue;
2059*4882a593Smuzhiyun }
2060*4882a593Smuzhiyun
2061*4882a593Smuzhiyun empty = _TRUE;
2062*4882a593Smuzhiyun break;
2063*4882a593Smuzhiyun }
2064*4882a593Smuzhiyun
2065*4882a593Smuzhiyun passtime = rtw_get_passing_time_ms(start);
2066*4882a593Smuzhiyun if (_TRUE == empty)
2067*4882a593Smuzhiyun RTW_INFO("[HW_VAR_CHECK_TXBUF] Empty in %d ms\n", passtime);
2068*4882a593Smuzhiyun else if (RTW_CANNOT_RUN(adapter))
2069*4882a593Smuzhiyun RTW_INFO("[HW_VAR_CHECK_TXBUF] bDriverStopped or bSurpriseRemoved\n");
2070*4882a593Smuzhiyun else {
2071*4882a593Smuzhiyun RTW_INFO("[HW_VAR_CHECK_TXBUF] NOT empty in %d ms\n", passtime);
2072*4882a593Smuzhiyun RTW_INFO("[HW_VAR_CHECK_TXBUF] 0x230=0x%08x 0x234=0x%08x 0x238=0x%08x 0x23c=0x%08x 0x240=0x%08x\n",
2073*4882a593Smuzhiyun high, low, normal, extra, publc);
2074*4882a593Smuzhiyun
2075*4882a593Smuzhiyun }
2076*4882a593Smuzhiyun
2077*4882a593Smuzhiyun rtw_write16(adapter, REG_RETRY_LIMIT_8821C, rtylmtorg);
2078*4882a593Smuzhiyun }
2079*4882a593Smuzhiyun break;
2080*4882a593Smuzhiyun /*
2081*4882a593Smuzhiyun case HW_VAR_PCIE_STOP_TX_DMA:
2082*4882a593Smuzhiyun break;
2083*4882a593Smuzhiyun */
2084*4882a593Smuzhiyun
2085*4882a593Smuzhiyun /*
2086*4882a593Smuzhiyun case HW_VAR_SYS_CLKR:
2087*4882a593Smuzhiyun break;
2088*4882a593Smuzhiyun */
2089*4882a593Smuzhiyun #ifdef CONFIG_GPIO_WAKEUP
2090*4882a593Smuzhiyun case HW_SET_GPIO_WL_CTRL: {
2091*4882a593Smuzhiyun struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
2092*4882a593Smuzhiyun u8 enable = *val;
2093*4882a593Smuzhiyun u8 value = 0;
2094*4882a593Smuzhiyun u8 addr = REG_PAD_CTRL1_8821C + 3;
2095*4882a593Smuzhiyun
2096*4882a593Smuzhiyun if (pwrpriv->wowlan_gpio_index == 6) {
2097*4882a593Smuzhiyun value = rtw_read8(adapter, addr);
2098*4882a593Smuzhiyun
2099*4882a593Smuzhiyun if (enable == _TRUE && (value & BIT(1)))
2100*4882a593Smuzhiyun /* set 0x64[25] = 0 to control GPIO 6 */
2101*4882a593Smuzhiyun rtw_write8(adapter, addr, value & (~BIT(1)));
2102*4882a593Smuzhiyun else if (enable == _FALSE)
2103*4882a593Smuzhiyun rtw_write8(adapter, addr, value | BIT(1));
2104*4882a593Smuzhiyun
2105*4882a593Smuzhiyun RTW_INFO("[HW_SET_GPIO_WL_CTRL] 0x%02X=0x%02X\n",
2106*4882a593Smuzhiyun addr, rtw_read8(adapter, addr));
2107*4882a593Smuzhiyun }
2108*4882a593Smuzhiyun }
2109*4882a593Smuzhiyun break;
2110*4882a593Smuzhiyun #endif
2111*4882a593Smuzhiyun case HW_VAR_NAV_UPPER: {
2112*4882a593Smuzhiyun #define HAL_NAV_UPPER_UNIT 128 /* micro-second */
2113*4882a593Smuzhiyun u32 usNavUpper = *(u32 *)val;
2114*4882a593Smuzhiyun
2115*4882a593Smuzhiyun if (usNavUpper > HAL_NAV_UPPER_UNIT * 0xFF) {
2116*4882a593Smuzhiyun RTW_INFO(FUNC_ADPT_FMT ": [HW_VAR_NAV_UPPER] value(0x%08X us) is larger than (%d * 0xFF)!!!\n",
2117*4882a593Smuzhiyun FUNC_ADPT_ARG(adapter), usNavUpper, HAL_NAV_UPPER_UNIT);
2118*4882a593Smuzhiyun break;
2119*4882a593Smuzhiyun }
2120*4882a593Smuzhiyun
2121*4882a593Smuzhiyun usNavUpper = (usNavUpper + HAL_NAV_UPPER_UNIT - 1) / HAL_NAV_UPPER_UNIT;
2122*4882a593Smuzhiyun rtw_write8(adapter, REG_NAV_CTRL_8821C + 2, (u8)usNavUpper);
2123*4882a593Smuzhiyun }
2124*4882a593Smuzhiyun break;
2125*4882a593Smuzhiyun
2126*4882a593Smuzhiyun /*
2127*4882a593Smuzhiyun case HW_VAR_RPT_TIMER_SETTING:
2128*4882a593Smuzhiyun case HW_VAR_TX_RPT_MAX_MACID:
2129*4882a593Smuzhiyun case HW_VAR_CHK_HI_QUEUE_EMPTY:
2130*4882a593Smuzhiyun break;
2131*4882a593Smuzhiyun */
2132*4882a593Smuzhiyun
2133*4882a593Smuzhiyun /*
2134*4882a593Smuzhiyun case HW_VAR_AMPDU_MAX_TIME:
2135*4882a593Smuzhiyun case HW_VAR_USB_MODE:
2136*4882a593Smuzhiyun break;
2137*4882a593Smuzhiyun */
2138*4882a593Smuzhiyun #ifdef CONFIG_AP_PORT_SWAP
2139*4882a593Smuzhiyun case HW_VAR_PORT_SWITCH:
2140*4882a593Smuzhiyun {
2141*4882a593Smuzhiyun u8 mode = *((u8 *)val);
2142*4882a593Smuzhiyun
2143*4882a593Smuzhiyun rtl8821c_ap_port_switch(adapter, mode);
2144*4882a593Smuzhiyun }
2145*4882a593Smuzhiyun break;
2146*4882a593Smuzhiyun #endif
2147*4882a593Smuzhiyun
2148*4882a593Smuzhiyun /*
2149*4882a593Smuzhiyun case HW_VAR_SOUNDING_RATE:
2150*4882a593Smuzhiyun case HW_VAR_SOUNDING_STATUS:
2151*4882a593Smuzhiyun case HW_VAR_SOUNDING_FW_NDPA:
2152*4882a593Smuzhiyun case HW_VAR_SOUNDING_CLK:
2153*4882a593Smuzhiyun break;
2154*4882a593Smuzhiyun */
2155*4882a593Smuzhiyun #ifdef CONFIG_BEAMFORMING
2156*4882a593Smuzhiyun case HW_VAR_SOUNDING_ENTER:
2157*4882a593Smuzhiyun rtl8821c_phy_bf_enter(adapter, (struct sta_info*)val);
2158*4882a593Smuzhiyun break;
2159*4882a593Smuzhiyun
2160*4882a593Smuzhiyun case HW_VAR_SOUNDING_LEAVE:
2161*4882a593Smuzhiyun rtl8821c_phy_bf_leave(adapter, val);
2162*4882a593Smuzhiyun break;
2163*4882a593Smuzhiyun
2164*4882a593Smuzhiyun case HW_VAR_SOUNDING_SET_GID_TABLE:
2165*4882a593Smuzhiyun rtl8821c_phy_bf_set_gid_table(adapter, (struct beamformer_entry*)val);
2166*4882a593Smuzhiyun break;
2167*4882a593Smuzhiyun #endif
2168*4882a593Smuzhiyun case HW_VAR_FREECNT:
2169*4882a593Smuzhiyun
2170*4882a593Smuzhiyun val8 = *((u8*)val);
2171*4882a593Smuzhiyun
2172*4882a593Smuzhiyun if (val8 == 0) {
2173*4882a593Smuzhiyun /* disable free run counter set 0x577[3]=0 */
2174*4882a593Smuzhiyun rtw_write8(adapter, REG_MISC_CTRL,
2175*4882a593Smuzhiyun rtw_read8(adapter, REG_MISC_CTRL)&(~BIT_EN_FREECNT));
2176*4882a593Smuzhiyun
2177*4882a593Smuzhiyun /* reset FREE_RUN_COUNTER set 0x553[5]=1 */
2178*4882a593Smuzhiyun val8 = rtw_read8(adapter, REG_DUAL_TSF_RST);
2179*4882a593Smuzhiyun val8 |= BIT_FREECNT_RST;
2180*4882a593Smuzhiyun rtw_write8(adapter, REG_DUAL_TSF_RST, val8);
2181*4882a593Smuzhiyun
2182*4882a593Smuzhiyun } else if (val8 == 1){
2183*4882a593Smuzhiyun
2184*4882a593Smuzhiyun /* enable free run counter */
2185*4882a593Smuzhiyun
2186*4882a593Smuzhiyun /* disable first set 0x577[3]=0 */
2187*4882a593Smuzhiyun rtw_write8(adapter, REG_MISC_CTRL,
2188*4882a593Smuzhiyun rtw_read8(adapter, REG_MISC_CTRL)&(~BIT_EN_FREECNT));
2189*4882a593Smuzhiyun
2190*4882a593Smuzhiyun /* reset FREE_RUN_COUNTER set 0x553[5]=1 */
2191*4882a593Smuzhiyun val8 = rtw_read8(adapter, REG_DUAL_TSF_RST);
2192*4882a593Smuzhiyun val8 |= BIT_FREECNT_RST;
2193*4882a593Smuzhiyun rtw_write8(adapter, REG_DUAL_TSF_RST, val8);
2194*4882a593Smuzhiyun
2195*4882a593Smuzhiyun /* enable free run counter 0x577[3]=1 */
2196*4882a593Smuzhiyun rtw_write8(adapter, REG_MISC_CTRL,
2197*4882a593Smuzhiyun rtw_read8(adapter, REG_MISC_CTRL)|BIT_EN_FREECNT);
2198*4882a593Smuzhiyun }
2199*4882a593Smuzhiyun break;
2200*4882a593Smuzhiyun
2201*4882a593Smuzhiyun default:
2202*4882a593Smuzhiyun ret = SetHwReg(adapter, variable, val);
2203*4882a593Smuzhiyun break;
2204*4882a593Smuzhiyun }
2205*4882a593Smuzhiyun
2206*4882a593Smuzhiyun return ret;
2207*4882a593Smuzhiyun }
2208*4882a593Smuzhiyun
2209*4882a593Smuzhiyun #ifdef CONFIG_PROC_DEBUG
2210*4882a593Smuzhiyun struct qinfo {
2211*4882a593Smuzhiyun u32 head:11;
2212*4882a593Smuzhiyun u32 tail:11;
2213*4882a593Smuzhiyun u32 empty:1;
2214*4882a593Smuzhiyun u32 ac:2;
2215*4882a593Smuzhiyun u32 macid:7;
2216*4882a593Smuzhiyun };
2217*4882a593Smuzhiyun
2218*4882a593Smuzhiyun struct bcn_qinfo {
2219*4882a593Smuzhiyun u16 head:12;
2220*4882a593Smuzhiyun u16 rsvd:4;
2221*4882a593Smuzhiyun };
2222*4882a593Smuzhiyun
dump_qinfo(void * sel,struct qinfo * info,u32 pkt_num,const char * tag)2223*4882a593Smuzhiyun static void dump_qinfo(void *sel, struct qinfo *info, u32 pkt_num, const char *tag)
2224*4882a593Smuzhiyun {
2225*4882a593Smuzhiyun RTW_PRINT_SEL(sel, "%shead:0x%02x, tail:0x%02x, pkt_num:%u, macid:%u, ac:%u\n",
2226*4882a593Smuzhiyun tag ? tag : "", info->head, info->tail, pkt_num, info->macid, info->ac);
2227*4882a593Smuzhiyun }
2228*4882a593Smuzhiyun
dump_bcn_qinfo(void * sel,struct bcn_qinfo * info,u32 pkt_num,const char * tag)2229*4882a593Smuzhiyun static void dump_bcn_qinfo(void *sel, struct bcn_qinfo *info, u32 pkt_num, const char *tag)
2230*4882a593Smuzhiyun {
2231*4882a593Smuzhiyun RTW_PRINT_SEL(sel, "%shead:0x%02x, pkt_num:%u\n",
2232*4882a593Smuzhiyun tag ? tag : "", info->head, pkt_num);
2233*4882a593Smuzhiyun }
2234*4882a593Smuzhiyun
dump_mac_qinfo(void * sel,_adapter * adapter)2235*4882a593Smuzhiyun static void dump_mac_qinfo(void *sel, _adapter *adapter)
2236*4882a593Smuzhiyun {
2237*4882a593Smuzhiyun u32 q0_info;
2238*4882a593Smuzhiyun u32 q1_info;
2239*4882a593Smuzhiyun u32 q2_info;
2240*4882a593Smuzhiyun u32 q3_info;
2241*4882a593Smuzhiyun u32 q4_info;
2242*4882a593Smuzhiyun u32 q5_info;
2243*4882a593Smuzhiyun u32 q6_info;
2244*4882a593Smuzhiyun u32 q7_info;
2245*4882a593Smuzhiyun u32 mg_q_info;
2246*4882a593Smuzhiyun u32 hi_q_info;
2247*4882a593Smuzhiyun u16 bcn_q_info;
2248*4882a593Smuzhiyun u32 q0_q1_info;
2249*4882a593Smuzhiyun u32 q2_q3_info;
2250*4882a593Smuzhiyun u32 q4_q5_info;
2251*4882a593Smuzhiyun u32 q6_q7_info;
2252*4882a593Smuzhiyun u32 mg_hi_q_info;
2253*4882a593Smuzhiyun u32 cmd_bcn_q_info;
2254*4882a593Smuzhiyun
2255*4882a593Smuzhiyun
2256*4882a593Smuzhiyun q0_info = rtw_read32(adapter, REG_Q0_INFO_8821C);
2257*4882a593Smuzhiyun q1_info = rtw_read32(adapter, REG_Q1_INFO_8821C);
2258*4882a593Smuzhiyun q2_info = rtw_read32(adapter, REG_Q2_INFO_8821C);
2259*4882a593Smuzhiyun q3_info = rtw_read32(adapter, REG_Q3_INFO_8821C);
2260*4882a593Smuzhiyun q4_info = rtw_read32(adapter, REG_Q4_INFO_8821C);
2261*4882a593Smuzhiyun q5_info = rtw_read32(adapter, REG_Q5_INFO_8821C);
2262*4882a593Smuzhiyun q6_info = rtw_read32(adapter, REG_Q6_INFO_8821C);
2263*4882a593Smuzhiyun q7_info = rtw_read32(adapter, REG_Q7_INFO_8821C);
2264*4882a593Smuzhiyun mg_q_info = rtw_read32(adapter, REG_MGQ_INFO_8821C);
2265*4882a593Smuzhiyun hi_q_info = rtw_read32(adapter, REG_HIQ_INFO_8821C);
2266*4882a593Smuzhiyun bcn_q_info = rtw_read16(adapter, REG_BCNQ_INFO_8821C);
2267*4882a593Smuzhiyun
2268*4882a593Smuzhiyun q0_q1_info = rtw_read32(adapter, REG_Q0_Q1_INFO_8821C);
2269*4882a593Smuzhiyun q2_q3_info = rtw_read32(adapter, REG_Q2_Q3_INFO_8821C);
2270*4882a593Smuzhiyun q4_q5_info = rtw_read32(adapter, REG_Q4_Q5_INFO_8821C);
2271*4882a593Smuzhiyun q6_q7_info = rtw_read32(adapter, REG_Q6_Q7_INFO_8821C);
2272*4882a593Smuzhiyun mg_hi_q_info = rtw_read32(adapter, REG_MGQ_HIQ_INFO_8821C);
2273*4882a593Smuzhiyun cmd_bcn_q_info = rtw_read32(adapter, REG_CMDQ_BCNQ_INFO_8821C);
2274*4882a593Smuzhiyun
2275*4882a593Smuzhiyun dump_qinfo(sel, (struct qinfo *)&q0_info, q0_q1_info&0xFFF, "Q0 ");
2276*4882a593Smuzhiyun dump_qinfo(sel, (struct qinfo *)&q1_info, (q0_q1_info>>15)&0xFFF, "Q1 ");
2277*4882a593Smuzhiyun dump_qinfo(sel, (struct qinfo *)&q2_info, q2_q3_info&0xFFF, "Q2 ");
2278*4882a593Smuzhiyun dump_qinfo(sel, (struct qinfo *)&q3_info, (q2_q3_info>>15)&0xFFF, "Q3 ");
2279*4882a593Smuzhiyun dump_qinfo(sel, (struct qinfo *)&q4_info, q4_q5_info&0xFFF, "Q4 ");
2280*4882a593Smuzhiyun dump_qinfo(sel, (struct qinfo *)&q5_info, (q4_q5_info>>15)&0xFFF, "Q5 ");
2281*4882a593Smuzhiyun dump_qinfo(sel, (struct qinfo *)&q6_info, q6_q7_info&0xFFF, "Q6 ");
2282*4882a593Smuzhiyun dump_qinfo(sel, (struct qinfo *)&q7_info, (q6_q7_info>>15)&0xFFF, "Q7 ");
2283*4882a593Smuzhiyun dump_qinfo(sel, (struct qinfo *)&mg_q_info, mg_hi_q_info&0xFFF, "MG ");
2284*4882a593Smuzhiyun dump_qinfo(sel, (struct qinfo *)&hi_q_info, (mg_hi_q_info>>15)&0xFFF, "HI ");
2285*4882a593Smuzhiyun dump_bcn_qinfo(sel, (struct bcn_qinfo *)&bcn_q_info, cmd_bcn_q_info&0xFFF, "BCN ");
2286*4882a593Smuzhiyun
2287*4882a593Smuzhiyun }
2288*4882a593Smuzhiyun
dump_mac_txfifo(void * sel,_adapter * adapter)2289*4882a593Smuzhiyun static void dump_mac_txfifo(void *sel, _adapter *adapter)
2290*4882a593Smuzhiyun {
2291*4882a593Smuzhiyun u32 hpq, lpq, npq, epq, pubq;
2292*4882a593Smuzhiyun
2293*4882a593Smuzhiyun hpq = rtw_read32(adapter, REG_FIFOPAGE_INFO_1_8821C);
2294*4882a593Smuzhiyun lpq = rtw_read32(adapter, REG_FIFOPAGE_INFO_2_8821C);
2295*4882a593Smuzhiyun npq = rtw_read32(adapter, REG_FIFOPAGE_INFO_3_8821C);
2296*4882a593Smuzhiyun epq = rtw_read32(adapter, REG_FIFOPAGE_INFO_4_8821C);
2297*4882a593Smuzhiyun pubq = rtw_read32(adapter, REG_FIFOPAGE_INFO_5_8821C);
2298*4882a593Smuzhiyun
2299*4882a593Smuzhiyun hpq = (hpq & 0xFFF0000)>>16;
2300*4882a593Smuzhiyun lpq = (lpq & 0xFFF0000)>>16;
2301*4882a593Smuzhiyun npq = (npq & 0xFFF0000)>>16;
2302*4882a593Smuzhiyun epq = (epq & 0xFFF0000)>>16;
2303*4882a593Smuzhiyun pubq = (pubq & 0xFFF0000)>>16;
2304*4882a593Smuzhiyun
2305*4882a593Smuzhiyun RTW_PRINT_SEL(sel, "Tx: available page num: ");
2306*4882a593Smuzhiyun if ((hpq == 0xAEA) && (hpq == lpq) && (hpq == pubq))
2307*4882a593Smuzhiyun RTW_PRINT_SEL(sel, "N/A (reg val = 0xea)\n");
2308*4882a593Smuzhiyun else
2309*4882a593Smuzhiyun RTW_PRINT_SEL(sel, "HPQ: %d, LPQ: %d, NPQ: %d, EPQ: %d, PUBQ: %d\n"
2310*4882a593Smuzhiyun , hpq, lpq, npq, epq, pubq);
2311*4882a593Smuzhiyun }
2312*4882a593Smuzhiyun #endif
2313*4882a593Smuzhiyun
hw_var_get_bcn_valid(PADAPTER adapter)2314*4882a593Smuzhiyun static u8 hw_var_get_bcn_valid(PADAPTER adapter)
2315*4882a593Smuzhiyun {
2316*4882a593Smuzhiyun u8 val8 = 0;
2317*4882a593Smuzhiyun u8 ret = _FALSE;
2318*4882a593Smuzhiyun
2319*4882a593Smuzhiyun /* only port 0 can TX BCN */
2320*4882a593Smuzhiyun val8 = rtw_read8(adapter, REG_FIFOPAGE_CTRL_2_8821C + 1);
2321*4882a593Smuzhiyun ret = (BIT(7) & val8) ? _TRUE : _FALSE;
2322*4882a593Smuzhiyun
2323*4882a593Smuzhiyun return ret;
2324*4882a593Smuzhiyun }
2325*4882a593Smuzhiyun
rtl8821c_read_wmmedca_reg(PADAPTER adapter,u16 * vo_params,u16 * vi_params,u16 * be_params,u16 * bk_params)2326*4882a593Smuzhiyun void rtl8821c_read_wmmedca_reg(PADAPTER adapter, u16 *vo_params, u16 *vi_params, u16 *be_params, u16 *bk_params)
2327*4882a593Smuzhiyun {
2328*4882a593Smuzhiyun u8 vo_reg_params[4];
2329*4882a593Smuzhiyun u8 vi_reg_params[4];
2330*4882a593Smuzhiyun u8 be_reg_params[4];
2331*4882a593Smuzhiyun u8 bk_reg_params[4];
2332*4882a593Smuzhiyun
2333*4882a593Smuzhiyun rtl8821c_gethwreg(adapter, HW_VAR_AC_PARAM_VO, vo_reg_params);
2334*4882a593Smuzhiyun rtl8821c_gethwreg(adapter, HW_VAR_AC_PARAM_VI, vi_reg_params);
2335*4882a593Smuzhiyun rtl8821c_gethwreg(adapter, HW_VAR_AC_PARAM_BE, be_reg_params);
2336*4882a593Smuzhiyun rtl8821c_gethwreg(adapter, HW_VAR_AC_PARAM_BK, bk_reg_params);
2337*4882a593Smuzhiyun
2338*4882a593Smuzhiyun vo_params[0] = vo_reg_params[0];
2339*4882a593Smuzhiyun vo_params[1] = vo_reg_params[1] & 0x0F;
2340*4882a593Smuzhiyun vo_params[2] = (vo_reg_params[1] & 0xF0) >> 4;
2341*4882a593Smuzhiyun vo_params[3] = ((vo_reg_params[3] << 8) | (vo_reg_params[2])) * 32;
2342*4882a593Smuzhiyun
2343*4882a593Smuzhiyun vi_params[0] = vi_reg_params[0];
2344*4882a593Smuzhiyun vi_params[1] = vi_reg_params[1] & 0x0F;
2345*4882a593Smuzhiyun vi_params[2] = (vi_reg_params[1] & 0xF0) >> 4;
2346*4882a593Smuzhiyun vi_params[3] = ((vi_reg_params[3] << 8) | (vi_reg_params[2])) * 32;
2347*4882a593Smuzhiyun
2348*4882a593Smuzhiyun be_params[0] = be_reg_params[0];
2349*4882a593Smuzhiyun be_params[1] = be_reg_params[1] & 0x0F;
2350*4882a593Smuzhiyun be_params[2] = (be_reg_params[1] & 0xF0) >> 4;
2351*4882a593Smuzhiyun be_params[3] = ((be_reg_params[3] << 8) | (be_reg_params[2])) * 32;
2352*4882a593Smuzhiyun
2353*4882a593Smuzhiyun bk_params[0] = bk_reg_params[0];
2354*4882a593Smuzhiyun bk_params[1] = bk_reg_params[1] & 0x0F;
2355*4882a593Smuzhiyun bk_params[2] = (bk_reg_params[1] & 0xF0) >> 4;
2356*4882a593Smuzhiyun bk_params[3] = ((bk_reg_params[3] << 8) | (bk_reg_params[2])) * 32;
2357*4882a593Smuzhiyun
2358*4882a593Smuzhiyun vo_params[1] = (1 << vo_params[1]) - 1;
2359*4882a593Smuzhiyun vo_params[2] = (1 << vo_params[2]) - 1;
2360*4882a593Smuzhiyun vi_params[1] = (1 << vi_params[1]) - 1;
2361*4882a593Smuzhiyun vi_params[2] = (1 << vi_params[2]) - 1;
2362*4882a593Smuzhiyun be_params[1] = (1 << be_params[1]) - 1;
2363*4882a593Smuzhiyun be_params[2] = (1 << be_params[2]) - 1;
2364*4882a593Smuzhiyun bk_params[1] = (1 << bk_params[1]) - 1;
2365*4882a593Smuzhiyun bk_params[2] = (1 << bk_params[2]) - 1;
2366*4882a593Smuzhiyun }
2367*4882a593Smuzhiyun
rtl8821c_gethwreg(PADAPTER adapter,u8 variable,u8 * val)2368*4882a593Smuzhiyun void rtl8821c_gethwreg(PADAPTER adapter, u8 variable, u8 *val)
2369*4882a593Smuzhiyun {
2370*4882a593Smuzhiyun PHAL_DATA_TYPE hal;
2371*4882a593Smuzhiyun u8 val8;
2372*4882a593Smuzhiyun u16 val16;
2373*4882a593Smuzhiyun u32 val32;
2374*4882a593Smuzhiyun
2375*4882a593Smuzhiyun
2376*4882a593Smuzhiyun hal = GET_HAL_DATA(adapter);
2377*4882a593Smuzhiyun
2378*4882a593Smuzhiyun switch (variable) {
2379*4882a593Smuzhiyun /*
2380*4882a593Smuzhiyun case HW_VAR_INIT_RTS_RATE:
2381*4882a593Smuzhiyun case HW_VAR_BASIC_RATE:
2382*4882a593Smuzhiyun break;
2383*4882a593Smuzhiyun */
2384*4882a593Smuzhiyun case HW_VAR_TXPAUSE:
2385*4882a593Smuzhiyun *val = rtw_read8(adapter, REG_TXPAUSE_8821C);
2386*4882a593Smuzhiyun break;
2387*4882a593Smuzhiyun /*
2388*4882a593Smuzhiyun case HW_VAR_BCN_FUNC:
2389*4882a593Smuzhiyun case HW_VAR_MLME_DISCONNECT:
2390*4882a593Smuzhiyun case HW_VAR_MLME_SITESURVEY:
2391*4882a593Smuzhiyun case HW_VAR_MLME_JOIN:
2392*4882a593Smuzhiyun case HW_VAR_BEACON_INTERVAL:
2393*4882a593Smuzhiyun case HW_VAR_SLOT_TIME:
2394*4882a593Smuzhiyun case HW_VAR_RESP_SIFS:
2395*4882a593Smuzhiyun case HW_VAR_ACK_PREAMBLE:
2396*4882a593Smuzhiyun case HW_VAR_SEC_CFG:
2397*4882a593Smuzhiyun case HW_VAR_SEC_DK_CFG:
2398*4882a593Smuzhiyun break;
2399*4882a593Smuzhiyun */
2400*4882a593Smuzhiyun case HW_VAR_BCN_VALID:
2401*4882a593Smuzhiyun *val = hw_var_get_bcn_valid(adapter);
2402*4882a593Smuzhiyun break;
2403*4882a593Smuzhiyun /*
2404*4882a593Smuzhiyun case HW_VAR_CAM_INVALID_ALL:
2405*4882a593Smuzhiyun */
2406*4882a593Smuzhiyun case HW_VAR_AC_PARAM_VO:
2407*4882a593Smuzhiyun val32 = rtw_read32(adapter, REG_EDCA_VO_PARAM);
2408*4882a593Smuzhiyun val[0] = val32 & 0xFF;
2409*4882a593Smuzhiyun val[1] = (val32 >> 8) & 0xFF;
2410*4882a593Smuzhiyun val[2] = (val32 >> 16) & 0xFF;
2411*4882a593Smuzhiyun val[3] = (val32 >> 24) & 0x07;
2412*4882a593Smuzhiyun break;
2413*4882a593Smuzhiyun
2414*4882a593Smuzhiyun case HW_VAR_AC_PARAM_VI:
2415*4882a593Smuzhiyun val32 = rtw_read32(adapter, REG_EDCA_VI_PARAM);
2416*4882a593Smuzhiyun val[0] = val32 & 0xFF;
2417*4882a593Smuzhiyun val[1] = (val32 >> 8) & 0xFF;
2418*4882a593Smuzhiyun val[2] = (val32 >> 16) & 0xFF;
2419*4882a593Smuzhiyun val[3] = (val32 >> 24) & 0x07;
2420*4882a593Smuzhiyun break;
2421*4882a593Smuzhiyun
2422*4882a593Smuzhiyun case HW_VAR_AC_PARAM_BE:
2423*4882a593Smuzhiyun val32 = rtw_read32(adapter, REG_EDCA_BE_PARAM);
2424*4882a593Smuzhiyun val[0] = val32 & 0xFF;
2425*4882a593Smuzhiyun val[1] = (val32 >> 8) & 0xFF;
2426*4882a593Smuzhiyun val[2] = (val32 >> 16) & 0xFF;
2427*4882a593Smuzhiyun val[3] = (val32 >> 24) & 0x07;
2428*4882a593Smuzhiyun break;
2429*4882a593Smuzhiyun
2430*4882a593Smuzhiyun case HW_VAR_AC_PARAM_BK:
2431*4882a593Smuzhiyun val32 = rtw_read32(adapter, REG_EDCA_BK_PARAM);
2432*4882a593Smuzhiyun val[0] = val32 & 0xFF;
2433*4882a593Smuzhiyun val[1] = (val32 >> 8) & 0xFF;
2434*4882a593Smuzhiyun val[2] = (val32 >> 16) & 0xFF;
2435*4882a593Smuzhiyun val[3] = (val32 >> 24) & 0x07;
2436*4882a593Smuzhiyun break;
2437*4882a593Smuzhiyun /*
2438*4882a593Smuzhiyun case HW_VAR_ACM_CTRL:
2439*4882a593Smuzhiyun case HW_VAR_AMPDU_MIN_SPACE:
2440*4882a593Smuzhiyun case HW_VAR_AMPDU_FACTOR:
2441*4882a593Smuzhiyun case HW_VAR_RXDMA_AGG_PG_TH:
2442*4882a593Smuzhiyun case HW_VAR_H2C_FW_PWRMODE:
2443*4882a593Smuzhiyun case HW_VAR_H2C_PS_TUNE_PARAM:
2444*4882a593Smuzhiyun case HW_VAR_H2C_FW_JOINBSSRPT:
2445*4882a593Smuzhiyun break;
2446*4882a593Smuzhiyun */
2447*4882a593Smuzhiyun /*
2448*4882a593Smuzhiyun case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
2449*4882a593Smuzhiyun case HW_VAR_TRIGGER_GPIO_0:
2450*4882a593Smuzhiyun case HW_VAR_BT_SET_COEXIST:
2451*4882a593Smuzhiyun case HW_VAR_BT_ISSUE_DELBA:
2452*4882a593Smuzhiyun break;
2453*4882a593Smuzhiyun */
2454*4882a593Smuzhiyun
2455*4882a593Smuzhiyun /*
2456*4882a593Smuzhiyun case HW_VAR_ANTENNA_DIVERSITY_SELECT:
2457*4882a593Smuzhiyun case HW_VAR_SWITCH_EPHY_WoWLAN:
2458*4882a593Smuzhiyun case HW_VAR_EFUSE_USAGE:
2459*4882a593Smuzhiyun case HW_VAR_EFUSE_BYTES:
2460*4882a593Smuzhiyun case HW_VAR_EFUSE_BT_USAGE:
2461*4882a593Smuzhiyun case HW_VAR_EFUSE_BT_BYTES:
2462*4882a593Smuzhiyun case HW_VAR_FIFO_CLEARN_UP:
2463*4882a593Smuzhiyun case HW_VAR_RESTORE_HW_SEQ:
2464*4882a593Smuzhiyun case HW_VAR_CHECK_TXBUF:
2465*4882a593Smuzhiyun case HW_VAR_PCIE_STOP_TX_DMA:
2466*4882a593Smuzhiyun break;
2467*4882a593Smuzhiyun */
2468*4882a593Smuzhiyun
2469*4882a593Smuzhiyun
2470*4882a593Smuzhiyun
2471*4882a593Smuzhiyun #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
2472*4882a593Smuzhiyun case HW_VAR_SYS_CLKR:
2473*4882a593Smuzhiyun *val = rtw_read8(adapter, REG_SYS_CLK_CTRL_8821C);
2474*4882a593Smuzhiyun break;
2475*4882a593Smuzhiyun #endif
2476*4882a593Smuzhiyun /*
2477*4882a593Smuzhiyun case HW_VAR_NAV_UPPER:
2478*4882a593Smuzhiyun case HW_VAR_RPT_TIMER_SETTING:
2479*4882a593Smuzhiyun case HW_VAR_TX_RPT_MAX_MACID:
2480*4882a593Smuzhiyun break;
2481*4882a593Smuzhiyun */
2482*4882a593Smuzhiyun case HW_VAR_CHK_HI_QUEUE_EMPTY:
2483*4882a593Smuzhiyun val16 = rtw_read16(adapter, REG_TXPKT_EMPTY_8821C);
2484*4882a593Smuzhiyun *val = (val16 & BIT_HQQ_EMPTY_8821C) ? _TRUE : _FALSE;
2485*4882a593Smuzhiyun break;
2486*4882a593Smuzhiyun case HW_VAR_CHK_MGQ_CPU_EMPTY:
2487*4882a593Smuzhiyun val16 = rtw_read16(adapter, REG_TXPKT_EMPTY_8821C);
2488*4882a593Smuzhiyun *val = (val16 & BIT_MGQ_CPU_EMPTY_8821C) ? _TRUE : _FALSE;
2489*4882a593Smuzhiyun break;
2490*4882a593Smuzhiyun /*
2491*4882a593Smuzhiyun case HW_VAR_AMPDU_MAX_TIME:
2492*4882a593Smuzhiyun case HW_VAR_USB_MODE:
2493*4882a593Smuzhiyun case HW_VAR_DO_IQK:
2494*4882a593Smuzhiyun case HW_VAR_SOUNDING_ENTER:
2495*4882a593Smuzhiyun case HW_VAR_SOUNDING_LEAVE:
2496*4882a593Smuzhiyun case HW_VAR_SOUNDING_RATE:
2497*4882a593Smuzhiyun case HW_VAR_SOUNDING_STATUS:
2498*4882a593Smuzhiyun case HW_VAR_SOUNDING_FW_NDPA:
2499*4882a593Smuzhiyun case HW_VAR_SOUNDING_CLK:
2500*4882a593Smuzhiyun break;
2501*4882a593Smuzhiyun */
2502*4882a593Smuzhiyun case HW_VAR_FW_PS_STATE:
2503*4882a593Smuzhiyun /* driver read REG_SYS_CFG5 - BIT_LPS_STATUS REG_1070[3] to get hw ps state */
2504*4882a593Smuzhiyun *((u16 *)val) = rtw_read8(adapter, REG_SYS_CFG5);
2505*4882a593Smuzhiyun break;
2506*4882a593Smuzhiyun #ifdef CONFIG_PROC_DEBUG
2507*4882a593Smuzhiyun case HW_VAR_DUMP_MAC_QUEUE_INFO:
2508*4882a593Smuzhiyun dump_mac_qinfo(val, adapter);
2509*4882a593Smuzhiyun break;
2510*4882a593Smuzhiyun
2511*4882a593Smuzhiyun case HW_VAR_DUMP_MAC_TXFIFO:
2512*4882a593Smuzhiyun dump_mac_txfifo(val, adapter);
2513*4882a593Smuzhiyun break;
2514*4882a593Smuzhiyun #endif
2515*4882a593Smuzhiyun /*
2516*4882a593Smuzhiyun case HW_VAR_ASIX_IOT:
2517*4882a593Smuzhiyun case HW_VAR_H2C_BT_MP_OPER:
2518*4882a593Smuzhiyun break;
2519*4882a593Smuzhiyun */
2520*4882a593Smuzhiyun
2521*4882a593Smuzhiyun case HW_VAR_BCN_CTRL_ADDR:
2522*4882a593Smuzhiyun *((u32 *)val) = hw_bcn_ctrl_addr(adapter, adapter->hw_port);
2523*4882a593Smuzhiyun break;
2524*4882a593Smuzhiyun
2525*4882a593Smuzhiyun case HW_VAR_FREECNT:
2526*4882a593Smuzhiyun *val = rtw_read8(adapter, REG_MISC_CTRL)&BIT_EN_FREECNT;
2527*4882a593Smuzhiyun break;
2528*4882a593Smuzhiyun
2529*4882a593Smuzhiyun default:
2530*4882a593Smuzhiyun GetHwReg(adapter, variable, val);
2531*4882a593Smuzhiyun break;
2532*4882a593Smuzhiyun }
2533*4882a593Smuzhiyun }
2534*4882a593Smuzhiyun
2535*4882a593Smuzhiyun /*
2536*4882a593Smuzhiyun * Description:
2537*4882a593Smuzhiyun * Change default setting of specified variable.
2538*4882a593Smuzhiyun */
rtl8821c_sethaldefvar(PADAPTER adapter,HAL_DEF_VARIABLE variable,void * pval)2539*4882a593Smuzhiyun u8 rtl8821c_sethaldefvar(PADAPTER adapter, HAL_DEF_VARIABLE variable, void *pval)
2540*4882a593Smuzhiyun {
2541*4882a593Smuzhiyun PHAL_DATA_TYPE hal;
2542*4882a593Smuzhiyun u8 bResult, val8;
2543*4882a593Smuzhiyun
2544*4882a593Smuzhiyun
2545*4882a593Smuzhiyun hal = GET_HAL_DATA(adapter);
2546*4882a593Smuzhiyun bResult = _SUCCESS;
2547*4882a593Smuzhiyun
2548*4882a593Smuzhiyun switch (variable) {
2549*4882a593Smuzhiyun /*
2550*4882a593Smuzhiyun case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
2551*4882a593Smuzhiyun case HAL_DEF_IS_SUPPORT_ANT_DIV:
2552*4882a593Smuzhiyun case HAL_DEF_DRVINFO_SZ:
2553*4882a593Smuzhiyun case HAL_DEF_MAX_RECVBUF_SZ:
2554*4882a593Smuzhiyun case HAL_DEF_RX_PACKET_OFFSET:
2555*4882a593Smuzhiyun case HAL_DEF_RX_DMA_SZ_WOW:
2556*4882a593Smuzhiyun case HAL_DEF_RX_DMA_SZ:
2557*4882a593Smuzhiyun case HAL_DEF_RX_PAGE_SIZE:
2558*4882a593Smuzhiyun case HAL_DEF_DBG_DUMP_RXPKT:
2559*4882a593Smuzhiyun case HAL_DEF_RA_DECISION_RATE:
2560*4882a593Smuzhiyun case HAL_DEF_RA_SGI:
2561*4882a593Smuzhiyun case HAL_DEF_PT_PWR_STATUS:
2562*4882a593Smuzhiyun case HW_VAR_MAX_RX_AMPDU_FACTOR:
2563*4882a593Smuzhiyun case HAL_DEF_DBG_DUMP_TXPKT:
2564*4882a593Smuzhiyun case HAL_DEF_TX_PAGE_BOUNDARY:
2565*4882a593Smuzhiyun case HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN:
2566*4882a593Smuzhiyun case HAL_DEF_ANT_DETECT:
2567*4882a593Smuzhiyun case HAL_DEF_PCI_SUUPORT_L1_BACKDOOR:
2568*4882a593Smuzhiyun case HAL_DEF_PCI_AMD_L1_SUPPORT:
2569*4882a593Smuzhiyun case HAL_DEF_PCI_ASPM_OSC:
2570*4882a593Smuzhiyun case HAL_DEF_EFUSE_USAGE:
2571*4882a593Smuzhiyun case HAL_DEF_EFUSE_BYTES:
2572*4882a593Smuzhiyun case HW_VAR_BEST_AMPDU_DENSITY:
2573*4882a593Smuzhiyun break;
2574*4882a593Smuzhiyun */
2575*4882a593Smuzhiyun
2576*4882a593Smuzhiyun default:
2577*4882a593Smuzhiyun bResult = SetHalDefVar(adapter, variable, pval);
2578*4882a593Smuzhiyun break;
2579*4882a593Smuzhiyun }
2580*4882a593Smuzhiyun
2581*4882a593Smuzhiyun return bResult;
2582*4882a593Smuzhiyun }
2583*4882a593Smuzhiyun
rtl8821c_ra_info_dump(_adapter * padapter,void * sel)2584*4882a593Smuzhiyun void rtl8821c_ra_info_dump(_adapter *padapter, void *sel)
2585*4882a593Smuzhiyun {
2586*4882a593Smuzhiyun u8 mac_id;
2587*4882a593Smuzhiyun struct sta_info *psta;
2588*4882a593Smuzhiyun u32 rate_mask1, rate_mask2;
2589*4882a593Smuzhiyun struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
2590*4882a593Smuzhiyun struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
2591*4882a593Smuzhiyun
2592*4882a593Smuzhiyun for (mac_id = 0; mac_id < macid_ctl->num; mac_id++) {
2593*4882a593Smuzhiyun if (rtw_macid_is_used(macid_ctl, mac_id) && !rtw_macid_is_bmc(macid_ctl, mac_id)) {
2594*4882a593Smuzhiyun psta = macid_ctl->sta[mac_id];
2595*4882a593Smuzhiyun if (!psta)
2596*4882a593Smuzhiyun continue;
2597*4882a593Smuzhiyun
2598*4882a593Smuzhiyun dump_sta_info(sel, psta);
2599*4882a593Smuzhiyun rate_mask1 = macid_ctl->rate_bmp0[mac_id];
2600*4882a593Smuzhiyun rate_mask2 = macid_ctl->rate_bmp1[mac_id];
2601*4882a593Smuzhiyun _RTW_PRINT_SEL(sel, "rate_mask2:0x%08x, rate_mask1:0x%08x\n", rate_mask2, rate_mask1);
2602*4882a593Smuzhiyun }
2603*4882a593Smuzhiyun }
2604*4882a593Smuzhiyun }
2605*4882a593Smuzhiyun
2606*4882a593Smuzhiyun /*
2607*4882a593Smuzhiyun * Description:
2608*4882a593Smuzhiyun * Query setting of specified variable.
2609*4882a593Smuzhiyun */
rtl8821c_gethaldefvar(PADAPTER adapter,HAL_DEF_VARIABLE variable,void * pval)2610*4882a593Smuzhiyun u8 rtl8821c_gethaldefvar(PADAPTER adapter, HAL_DEF_VARIABLE variable, void *pval)
2611*4882a593Smuzhiyun {
2612*4882a593Smuzhiyun PHAL_DATA_TYPE hal;
2613*4882a593Smuzhiyun u8 bResult;
2614*4882a593Smuzhiyun u8 val8 = 0;
2615*4882a593Smuzhiyun u32 val32 = 0;
2616*4882a593Smuzhiyun
2617*4882a593Smuzhiyun
2618*4882a593Smuzhiyun hal = GET_HAL_DATA(adapter);
2619*4882a593Smuzhiyun bResult = _SUCCESS;
2620*4882a593Smuzhiyun
2621*4882a593Smuzhiyun switch (variable) {
2622*4882a593Smuzhiyun /*
2623*4882a593Smuzhiyun case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
2624*4882a593Smuzhiyun break;
2625*4882a593Smuzhiyun */
2626*4882a593Smuzhiyun case HAL_DEF_IS_SUPPORT_ANT_DIV:
2627*4882a593Smuzhiyun #ifdef CONFIG_ANTENNA_DIVERSITY
2628*4882a593Smuzhiyun *(u8 *)pval = _TRUE;
2629*4882a593Smuzhiyun #else
2630*4882a593Smuzhiyun *(u8 *)pval = _FALSE;
2631*4882a593Smuzhiyun #endif
2632*4882a593Smuzhiyun break;
2633*4882a593Smuzhiyun case HAL_DEF_MAX_RECVBUF_SZ:
2634*4882a593Smuzhiyun *((u32 *)pval) = MAX_RECVBUF_SZ;
2635*4882a593Smuzhiyun break;
2636*4882a593Smuzhiyun case HAL_DEF_RX_PACKET_OFFSET:
2637*4882a593Smuzhiyun rtw_halmac_get_rx_desc_size(adapter_to_dvobj(adapter), &val32);
2638*4882a593Smuzhiyun rtw_halmac_get_rx_drv_info_sz(adapter_to_dvobj(adapter), &val8);
2639*4882a593Smuzhiyun *((u32 *)pval) = val32 + val8;
2640*4882a593Smuzhiyun break;
2641*4882a593Smuzhiyun /*
2642*4882a593Smuzhiyun case HAL_DEF_DRVINFO_SZ:
2643*4882a593Smuzhiyun rtw_halmac_get_rx_drv_info_sz(adapter_to_dvobj(adapter), &val8);
2644*4882a593Smuzhiyun *((u32 *)pval) = val8;
2645*4882a593Smuzhiyun break;
2646*4882a593Smuzhiyun case HAL_DEF_RX_DMA_SZ_WOW:
2647*4882a593Smuzhiyun case HAL_DEF_RX_DMA_SZ:
2648*4882a593Smuzhiyun case HAL_DEF_RX_PAGE_SIZE:
2649*4882a593Smuzhiyun case HAL_DEF_DBG_DUMP_RXPKT:
2650*4882a593Smuzhiyun case HAL_DEF_RA_DECISION_RATE:
2651*4882a593Smuzhiyun case HAL_DEF_RA_SGI:
2652*4882a593Smuzhiyun break;
2653*4882a593Smuzhiyun */
2654*4882a593Smuzhiyun /* only for 8188E */
2655*4882a593Smuzhiyun case HAL_DEF_PT_PWR_STATUS:
2656*4882a593Smuzhiyun break;
2657*4882a593Smuzhiyun
2658*4882a593Smuzhiyun case HAL_DEF_TX_LDPC:
2659*4882a593Smuzhiyun *(u8 *)pval = ((hal->phy_spec.ldpc_cap >> 8) & 0xFF) ? _TRUE : _FALSE;
2660*4882a593Smuzhiyun break;
2661*4882a593Smuzhiyun
2662*4882a593Smuzhiyun case HAL_DEF_RX_LDPC:
2663*4882a593Smuzhiyun *(u8 *)pval = (hal->phy_spec.ldpc_cap & 0xFF) ? _TRUE : _FALSE;
2664*4882a593Smuzhiyun break;
2665*4882a593Smuzhiyun
2666*4882a593Smuzhiyun case HAL_DEF_TX_STBC:
2667*4882a593Smuzhiyun *(u8 *)pval = (((hal->phy_spec.stbc_cap >> 8) & 0xFF) && hal->max_tx_cnt > 1) ? _TRUE : _FALSE;
2668*4882a593Smuzhiyun break;
2669*4882a593Smuzhiyun
2670*4882a593Smuzhiyun /* support 1RX for STBC */
2671*4882a593Smuzhiyun case HAL_DEF_RX_STBC:
2672*4882a593Smuzhiyun *(u8 *)pval = hal->phy_spec.stbc_cap & 0xFF;
2673*4882a593Smuzhiyun break;
2674*4882a593Smuzhiyun
2675*4882a593Smuzhiyun /* support Explicit TxBF for HT/VHT */
2676*4882a593Smuzhiyun case HAL_DEF_EXPLICIT_BEAMFORMER:
2677*4882a593Smuzhiyun #ifdef CONFIG_BEAMFORMING
2678*4882a593Smuzhiyun *(u8 *)pval = ((hal->phy_spec.txbf_cap >> 20)& 0xF) ? _TRUE : _FALSE;
2679*4882a593Smuzhiyun #else
2680*4882a593Smuzhiyun *(u8 *)pval = _FALSE;
2681*4882a593Smuzhiyun #endif
2682*4882a593Smuzhiyun break;
2683*4882a593Smuzhiyun
2684*4882a593Smuzhiyun case HAL_DEF_EXPLICIT_BEAMFORMEE:
2685*4882a593Smuzhiyun #ifdef CONFIG_BEAMFORMING
2686*4882a593Smuzhiyun *(u8 *)pval = ((hal->phy_spec.txbf_cap >> 16) & 0xF) ? _TRUE : _FALSE;
2687*4882a593Smuzhiyun #else
2688*4882a593Smuzhiyun *(u8 *)pval = _FALSE;
2689*4882a593Smuzhiyun #endif
2690*4882a593Smuzhiyun break;
2691*4882a593Smuzhiyun
2692*4882a593Smuzhiyun
2693*4882a593Smuzhiyun case HAL_DEF_VHT_MU_BEAMFORMER:
2694*4882a593Smuzhiyun #ifdef CONFIG_BEAMFORMING
2695*4882a593Smuzhiyun *(u8 *)pval = ((hal->phy_spec.txbf_cap >> 28)& 0xF) ? _TRUE : _FALSE;
2696*4882a593Smuzhiyun #else
2697*4882a593Smuzhiyun *(u8 *)pval = _FALSE;
2698*4882a593Smuzhiyun #endif
2699*4882a593Smuzhiyun break;
2700*4882a593Smuzhiyun
2701*4882a593Smuzhiyun case HAL_DEF_VHT_MU_BEAMFORMEE:
2702*4882a593Smuzhiyun #ifdef CONFIG_BEAMFORMING
2703*4882a593Smuzhiyun *(u8 *)pval = ((hal->phy_spec.txbf_cap >> 24)& 0xF) ? _TRUE : _FALSE;
2704*4882a593Smuzhiyun #else
2705*4882a593Smuzhiyun *(u8 *)pval = _FALSE;
2706*4882a593Smuzhiyun #endif
2707*4882a593Smuzhiyun break;
2708*4882a593Smuzhiyun
2709*4882a593Smuzhiyun case HAL_DEF_BEAMFORMER_CAP:
2710*4882a593Smuzhiyun *(u8 *)pval = (hal->phy_spec.txbf_param >> 24)& 0xFF ;
2711*4882a593Smuzhiyun break;
2712*4882a593Smuzhiyun
2713*4882a593Smuzhiyun case HAL_DEF_BEAMFORMEE_CAP:
2714*4882a593Smuzhiyun *(u8 *)pval = (hal->phy_spec.txbf_param >> 16) & 0xFF ;
2715*4882a593Smuzhiyun break;
2716*4882a593Smuzhiyun
2717*4882a593Smuzhiyun case HW_DEF_RA_INFO_DUMP:
2718*4882a593Smuzhiyun rtl8821c_ra_info_dump(adapter, pval);
2719*4882a593Smuzhiyun break;
2720*4882a593Smuzhiyun /*
2721*4882a593Smuzhiyun case HAL_DEF_DBG_DUMP_TXPKT:
2722*4882a593Smuzhiyun case HAL_DEF_TX_PAGE_SIZE:
2723*4882a593Smuzhiyun break;
2724*4882a593Smuzhiyun */
2725*4882a593Smuzhiyun case HAL_DEF_TX_PAGE_BOUNDARY:
2726*4882a593Smuzhiyun rtw_halmac_get_rsvd_drv_pg_bndy(adapter_to_dvobj(adapter), (u16 *)pval);
2727*4882a593Smuzhiyun break;
2728*4882a593Smuzhiyun /* case HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN:
2729*4882a593Smuzhiyun case HAL_DEF_ANT_DETECT:
2730*4882a593Smuzhiyun case HAL_DEF_PCI_SUUPORT_L1_BACKDOOR:
2731*4882a593Smuzhiyun case HAL_DEF_PCI_AMD_L1_SUPPORT:
2732*4882a593Smuzhiyun case HAL_DEF_PCI_ASPM_OSC:
2733*4882a593Smuzhiyun case HAL_DEF_EFUSE_USAGE:
2734*4882a593Smuzhiyun case HAL_DEF_EFUSE_BYTES:
2735*4882a593Smuzhiyun break;
2736*4882a593Smuzhiyun */
2737*4882a593Smuzhiyun case HW_VAR_BEST_AMPDU_DENSITY:
2738*4882a593Smuzhiyun *((u32 *)pval) = AMPDU_DENSITY_VALUE_4;
2739*4882a593Smuzhiyun break;
2740*4882a593Smuzhiyun
2741*4882a593Smuzhiyun default:
2742*4882a593Smuzhiyun bResult = GetHalDefVar(adapter, variable, pval);
2743*4882a593Smuzhiyun break;
2744*4882a593Smuzhiyun }
2745*4882a593Smuzhiyun
2746*4882a593Smuzhiyun return bResult;
2747*4882a593Smuzhiyun }
2748*4882a593Smuzhiyun
2749*4882a593Smuzhiyun /* xmit section */
rtl8821c_init_xmit_priv(_adapter * adapter)2750*4882a593Smuzhiyun void rtl8821c_init_xmit_priv(_adapter *adapter)
2751*4882a593Smuzhiyun {
2752*4882a593Smuzhiyun struct xmit_priv *pxmitpriv = &adapter->xmitpriv;
2753*4882a593Smuzhiyun
2754*4882a593Smuzhiyun pxmitpriv->hw_ssn_seq_no = rtw_get_hwseq_no(adapter);
2755*4882a593Smuzhiyun pxmitpriv->nqos_ssn = 0;
2756*4882a593Smuzhiyun }
2757*4882a593Smuzhiyun
2758*4882a593Smuzhiyun
fill_txdesc_force_bmc_camid(struct pkt_attrib * pattrib,u8 * ptxdesc)2759*4882a593Smuzhiyun void fill_txdesc_force_bmc_camid(struct pkt_attrib *pattrib, u8 *ptxdesc)
2760*4882a593Smuzhiyun {
2761*4882a593Smuzhiyun if ((pattrib->encrypt > 0) && (!pattrib->bswenc)
2762*4882a593Smuzhiyun && (pattrib->bmc_camid != INVALID_SEC_MAC_CAM_ID)) {
2763*4882a593Smuzhiyun
2764*4882a593Smuzhiyun SET_TX_DESC_EN_DESC_ID_8821C(ptxdesc, 1);
2765*4882a593Smuzhiyun SET_TX_DESC_MACID_8821C(ptxdesc, pattrib->bmc_camid);
2766*4882a593Smuzhiyun }
2767*4882a593Smuzhiyun }
2768*4882a593Smuzhiyun
fill_txdesc_bmc_tx_rate(struct pkt_attrib * pattrib,u8 * ptxdesc)2769*4882a593Smuzhiyun void fill_txdesc_bmc_tx_rate(struct pkt_attrib *pattrib, u8 *ptxdesc)
2770*4882a593Smuzhiyun {
2771*4882a593Smuzhiyun SET_TX_DESC_USE_RATE_8821C(ptxdesc, 1);
2772*4882a593Smuzhiyun SET_TX_DESC_DATARATE_8821C(ptxdesc, MRateToHwRate(pattrib->rate));
2773*4882a593Smuzhiyun SET_TX_DESC_DISDATAFB_8821C(ptxdesc, 1);
2774*4882a593Smuzhiyun }
2775*4882a593Smuzhiyun
rtl8821c_fill_txdesc_sectype(struct pkt_attrib * pattrib,u8 * ptxdesc)2776*4882a593Smuzhiyun void rtl8821c_fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc)
2777*4882a593Smuzhiyun {
2778*4882a593Smuzhiyun if ((pattrib->encrypt > 0) && !pattrib->bswenc) {
2779*4882a593Smuzhiyun /* SEC_TYPE : 0:NO_ENC,1:WEP40/TKIP,2:WAPI,3:AES */
2780*4882a593Smuzhiyun switch (pattrib->encrypt) {
2781*4882a593Smuzhiyun case _WEP40_:
2782*4882a593Smuzhiyun case _WEP104_:
2783*4882a593Smuzhiyun case _TKIP_:
2784*4882a593Smuzhiyun case _TKIP_WTMIC_:
2785*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(ptxdesc, 0x1);
2786*4882a593Smuzhiyun break;
2787*4882a593Smuzhiyun #ifdef CONFIG_WAPI_SUPPORT
2788*4882a593Smuzhiyun case _SMS4_:
2789*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(ptxdesc, 0x2);
2790*4882a593Smuzhiyun break;
2791*4882a593Smuzhiyun #endif
2792*4882a593Smuzhiyun case _AES_:
2793*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(ptxdesc, 0x3);
2794*4882a593Smuzhiyun break;
2795*4882a593Smuzhiyun case _CCMP_256_:
2796*4882a593Smuzhiyun case _GCMP_:
2797*4882a593Smuzhiyun case _GCMP_256_:
2798*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(ptxdesc, 0x2);
2799*4882a593Smuzhiyun break;
2800*4882a593Smuzhiyun case _NO_PRIVACY_:
2801*4882a593Smuzhiyun default:
2802*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(ptxdesc, 0x0);
2803*4882a593Smuzhiyun break;
2804*4882a593Smuzhiyun }
2805*4882a593Smuzhiyun }
2806*4882a593Smuzhiyun }
2807*4882a593Smuzhiyun
rtl8821c_fill_txdesc_vcs(PADAPTER adapter,struct pkt_attrib * pattrib,u8 * ptxdesc)2808*4882a593Smuzhiyun void rtl8821c_fill_txdesc_vcs(PADAPTER adapter, struct pkt_attrib *pattrib, u8 *ptxdesc)
2809*4882a593Smuzhiyun {
2810*4882a593Smuzhiyun struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
2811*4882a593Smuzhiyun struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
2812*4882a593Smuzhiyun
2813*4882a593Smuzhiyun
2814*4882a593Smuzhiyun if (pattrib->vcs_mode) {
2815*4882a593Smuzhiyun switch (pattrib->vcs_mode) {
2816*4882a593Smuzhiyun case RTS_CTS:
2817*4882a593Smuzhiyun SET_TX_DESC_RTSEN_8821C(ptxdesc, 1);
2818*4882a593Smuzhiyun break;
2819*4882a593Smuzhiyun case CTS_TO_SELF:
2820*4882a593Smuzhiyun SET_TX_DESC_CTS2SELF_8821C(ptxdesc, 1);
2821*4882a593Smuzhiyun break;
2822*4882a593Smuzhiyun case NONE_VCS:
2823*4882a593Smuzhiyun default:
2824*4882a593Smuzhiyun break;
2825*4882a593Smuzhiyun }
2826*4882a593Smuzhiyun
2827*4882a593Smuzhiyun if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT)
2828*4882a593Smuzhiyun SET_TX_DESC_RTS_SHORT_8821C(ptxdesc, 1);
2829*4882a593Smuzhiyun
2830*4882a593Smuzhiyun SET_TX_DESC_RTSRATE_8821C(ptxdesc, 0x8);/* RTS Rate=24M */
2831*4882a593Smuzhiyun SET_TX_DESC_RTS_RTY_LOWEST_RATE_8821C(ptxdesc, 0xf);
2832*4882a593Smuzhiyun }
2833*4882a593Smuzhiyun }
2834*4882a593Smuzhiyun
rtl8821c_bw_mapping(PADAPTER adapter,struct pkt_attrib * pattrib)2835*4882a593Smuzhiyun u8 rtl8821c_bw_mapping(PADAPTER adapter, struct pkt_attrib *pattrib)
2836*4882a593Smuzhiyun {
2837*4882a593Smuzhiyun u8 BWSettingOfDesc = 0;
2838*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
2839*4882a593Smuzhiyun
2840*4882a593Smuzhiyun
2841*4882a593Smuzhiyun if (hal->current_channel_bw == CHANNEL_WIDTH_80) {
2842*4882a593Smuzhiyun if (pattrib->bwmode == CHANNEL_WIDTH_80)
2843*4882a593Smuzhiyun BWSettingOfDesc = 2;
2844*4882a593Smuzhiyun else if (pattrib->bwmode == CHANNEL_WIDTH_40)
2845*4882a593Smuzhiyun BWSettingOfDesc = 1;
2846*4882a593Smuzhiyun else
2847*4882a593Smuzhiyun BWSettingOfDesc = 0;
2848*4882a593Smuzhiyun } else if (hal->current_channel_bw == CHANNEL_WIDTH_40) {
2849*4882a593Smuzhiyun if ((pattrib->bwmode == CHANNEL_WIDTH_40) || (pattrib->bwmode == CHANNEL_WIDTH_80))
2850*4882a593Smuzhiyun BWSettingOfDesc = 1;
2851*4882a593Smuzhiyun else
2852*4882a593Smuzhiyun BWSettingOfDesc = 0;
2853*4882a593Smuzhiyun } else
2854*4882a593Smuzhiyun BWSettingOfDesc = 0;
2855*4882a593Smuzhiyun
2856*4882a593Smuzhiyun return BWSettingOfDesc;
2857*4882a593Smuzhiyun }
2858*4882a593Smuzhiyun
rtl8821c_sc_mapping(PADAPTER adapter,struct pkt_attrib * pattrib)2859*4882a593Smuzhiyun u8 rtl8821c_sc_mapping(PADAPTER adapter, struct pkt_attrib *pattrib)
2860*4882a593Smuzhiyun {
2861*4882a593Smuzhiyun u8 SCSettingOfDesc = 0;
2862*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
2863*4882a593Smuzhiyun
2864*4882a593Smuzhiyun
2865*4882a593Smuzhiyun if (hal->current_channel_bw == CHANNEL_WIDTH_80) {
2866*4882a593Smuzhiyun if (pattrib->bwmode == CHANNEL_WIDTH_80)
2867*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;
2868*4882a593Smuzhiyun else if (pattrib->bwmode == CHANNEL_WIDTH_40) {
2869*4882a593Smuzhiyun if (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
2870*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_40_LOWER_OF_80MHZ;
2871*4882a593Smuzhiyun else if (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
2872*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_40_UPPER_OF_80MHZ;
2873*4882a593Smuzhiyun else
2874*4882a593Smuzhiyun RTW_INFO("SCMapping: DONOT CARE Mode Setting\n");
2875*4882a593Smuzhiyun } else {
2876*4882a593Smuzhiyun if ((hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
2877*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
2878*4882a593Smuzhiyun else if ((hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
2879*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_20_LOWER_OF_80MHZ;
2880*4882a593Smuzhiyun else if ((hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
2881*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_20_UPPER_OF_80MHZ;
2882*4882a593Smuzhiyun else if ((hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (hal->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
2883*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
2884*4882a593Smuzhiyun else
2885*4882a593Smuzhiyun RTW_INFO("SCMapping: DONOT CARE Mode Setting\n");
2886*4882a593Smuzhiyun }
2887*4882a593Smuzhiyun } else if (hal->current_channel_bw == CHANNEL_WIDTH_40) {
2888*4882a593Smuzhiyun if (pattrib->bwmode == CHANNEL_WIDTH_40)
2889*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;
2890*4882a593Smuzhiyun else if (pattrib->bwmode == CHANNEL_WIDTH_20) {
2891*4882a593Smuzhiyun if (hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
2892*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_20_UPPER_OF_80MHZ;
2893*4882a593Smuzhiyun else if (hal->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
2894*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_20_LOWER_OF_80MHZ;
2895*4882a593Smuzhiyun else
2896*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;
2897*4882a593Smuzhiyun }
2898*4882a593Smuzhiyun } else
2899*4882a593Smuzhiyun SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;
2900*4882a593Smuzhiyun
2901*4882a593Smuzhiyun return SCSettingOfDesc;
2902*4882a593Smuzhiyun }
2903*4882a593Smuzhiyun
rtl8821c_fill_txdesc_phy(PADAPTER adapter,struct pkt_attrib * pattrib,u8 * ptxdesc)2904*4882a593Smuzhiyun void rtl8821c_fill_txdesc_phy(PADAPTER adapter, struct pkt_attrib *pattrib, u8 *ptxdesc)
2905*4882a593Smuzhiyun {
2906*4882a593Smuzhiyun if (pattrib->ht_en) {
2907*4882a593Smuzhiyun /* Set Bandwidth and sub-channel settings. */
2908*4882a593Smuzhiyun SET_TX_DESC_DATA_BW_8821C(ptxdesc, rtl8821c_bw_mapping(adapter, pattrib));
2909*4882a593Smuzhiyun SET_TX_DESC_DATA_SC_8821C(ptxdesc, rtl8821c_sc_mapping(adapter, pattrib));
2910*4882a593Smuzhiyun }
2911*4882a593Smuzhiyun }
2912*4882a593Smuzhiyun
rtl8821c_cal_txdesc_chksum(PADAPTER adapter,u8 * ptxdesc)2913*4882a593Smuzhiyun void rtl8821c_cal_txdesc_chksum(PADAPTER adapter, u8 *ptxdesc)
2914*4882a593Smuzhiyun {
2915*4882a593Smuzhiyun struct halmac_adapter *halmac;
2916*4882a593Smuzhiyun struct halmac_api *api;
2917*4882a593Smuzhiyun
2918*4882a593Smuzhiyun
2919*4882a593Smuzhiyun halmac = adapter_to_halmac(adapter);
2920*4882a593Smuzhiyun api = HALMAC_GET_API(halmac);
2921*4882a593Smuzhiyun
2922*4882a593Smuzhiyun api->halmac_fill_txdesc_checksum(halmac, ptxdesc);
2923*4882a593Smuzhiyun }
2924*4882a593Smuzhiyun
2925*4882a593Smuzhiyun
2926*4882a593Smuzhiyun #ifdef CONFIG_MP_INCLUDED
rtl8821c_prepare_mp_txdesc(PADAPTER adapter,struct mp_priv * pmp_priv)2927*4882a593Smuzhiyun void rtl8821c_prepare_mp_txdesc(PADAPTER adapter, struct mp_priv *pmp_priv)
2928*4882a593Smuzhiyun {
2929*4882a593Smuzhiyun u32 desc_size = 0;
2930*4882a593Smuzhiyun u8 *desc;
2931*4882a593Smuzhiyun struct pkt_attrib *attrib;
2932*4882a593Smuzhiyun u32 pkt_size;
2933*4882a593Smuzhiyun s32 bmcast;
2934*4882a593Smuzhiyun u8 data_rate, pwr_status, offset;
2935*4882a593Smuzhiyun
2936*4882a593Smuzhiyun rtw_halmac_get_tx_desc_size(adapter_to_dvobj(adapter), &desc_size);
2937*4882a593Smuzhiyun
2938*4882a593Smuzhiyun desc = pmp_priv->tx.desc;
2939*4882a593Smuzhiyun attrib = &pmp_priv->tx.attrib;
2940*4882a593Smuzhiyun pkt_size = attrib->last_txcmdsz;
2941*4882a593Smuzhiyun bmcast = IS_MCAST(attrib->ra);
2942*4882a593Smuzhiyun
2943*4882a593Smuzhiyun SET_TX_DESC_LS_8821C(desc, 1);
2944*4882a593Smuzhiyun SET_TX_DESC_TXPKTSIZE_8821C(desc, pkt_size);
2945*4882a593Smuzhiyun
2946*4882a593Smuzhiyun offset = desc_size;
2947*4882a593Smuzhiyun SET_TX_DESC_OFFSET_8821C(desc, offset);
2948*4882a593Smuzhiyun
2949*4882a593Smuzhiyun #if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI)
2950*4882a593Smuzhiyun SET_TX_DESC_PKT_OFFSET_8821C(desc, 0); /* Don't need to set PACKET Offset bit,it's no use 512bytes of length */
2951*4882a593Smuzhiyun #else
2952*4882a593Smuzhiyun SET_TX_DESC_PKT_OFFSET_8821C(desc, 1);
2953*4882a593Smuzhiyun #endif
2954*4882a593Smuzhiyun
2955*4882a593Smuzhiyun if (bmcast)
2956*4882a593Smuzhiyun SET_TX_DESC_BMC_8821C(desc, 1);
2957*4882a593Smuzhiyun
2958*4882a593Smuzhiyun SET_TX_DESC_MACID_8821C(desc, attrib->mac_id);
2959*4882a593Smuzhiyun SET_TX_DESC_RATE_ID_8821C(desc, attrib->raid);
2960*4882a593Smuzhiyun SET_TX_DESC_QSEL_8821C(desc, attrib->qsel);
2961*4882a593Smuzhiyun
2962*4882a593Smuzhiyun if (pmp_priv->preamble)
2963*4882a593Smuzhiyun SET_TX_DESC_DATA_SHORT_8821C(desc, 1);
2964*4882a593Smuzhiyun
2965*4882a593Smuzhiyun if (!attrib->qos_en)
2966*4882a593Smuzhiyun SET_TX_DESC_EN_HWSEQ_8821C(desc, 1);
2967*4882a593Smuzhiyun else
2968*4882a593Smuzhiyun SET_TX_DESC_SW_SEQ_8821C(desc, attrib->seqnum);
2969*4882a593Smuzhiyun
2970*4882a593Smuzhiyun if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160)
2971*4882a593Smuzhiyun SET_TX_DESC_DATA_BW_8821C(desc, pmp_priv->bandwidth);
2972*4882a593Smuzhiyun else {
2973*4882a593Smuzhiyun RTW_INFO("%s: <ERROR> unknown bandwidth %d, use 20M\n",
2974*4882a593Smuzhiyun __FUNCTION__, pmp_priv->bandwidth);
2975*4882a593Smuzhiyun SET_TX_DESC_DATA_BW_8821C(desc, CHANNEL_WIDTH_20);
2976*4882a593Smuzhiyun }
2977*4882a593Smuzhiyun
2978*4882a593Smuzhiyun SET_TX_DESC_DISDATAFB_8821C(desc, 1);
2979*4882a593Smuzhiyun SET_TX_DESC_USE_RATE_8821C(desc, 1);
2980*4882a593Smuzhiyun SET_TX_DESC_DATARATE_8821C(desc, pmp_priv->rateidx);
2981*4882a593Smuzhiyun }
2982*4882a593Smuzhiyun #endif /* CONFIG_MP_INCLUDED */
2983*4882a593Smuzhiyun
2984*4882a593Smuzhiyun #define OFFSET_SZ 0
fill_default_txdesc(struct xmit_frame * pxmitframe,u8 * pbuf)2985*4882a593Smuzhiyun static void fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf)
2986*4882a593Smuzhiyun {
2987*4882a593Smuzhiyun PADAPTER adapter = pxmitframe->padapter;
2988*4882a593Smuzhiyun HAL_DATA_TYPE *phal_data = GET_HAL_DATA(adapter);
2989*4882a593Smuzhiyun struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
2990*4882a593Smuzhiyun struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
2991*4882a593Smuzhiyun struct pkt_attrib *pattrib = &pxmitframe->attrib;
2992*4882a593Smuzhiyun s32 bmcst = IS_MCAST(pattrib->ra);
2993*4882a593Smuzhiyun u32 desc_size = 0;
2994*4882a593Smuzhiyun u8 offset, pkt_offset = 0;
2995*4882a593Smuzhiyun #define RA_SW_DEFINE_CONT 0x01
2996*4882a593Smuzhiyun u8 drv_fixed_reate = _FALSE;
2997*4882a593Smuzhiyun u8 hw_port = rtw_hal_get_port(adapter);
2998*4882a593Smuzhiyun
2999*4882a593Smuzhiyun #if 0
3000*4882a593Smuzhiyun #ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX
3001*4882a593Smuzhiyun if (adapter->registrypriv.mp_mode == 0) {
3002*4882a593Smuzhiyun if ((PACKET_OFFSET_SZ != 0) && (!bagg_pkt) &&
3003*4882a593Smuzhiyun (rtw_usb_bulk_size_boundary(adapter, TXDESC_SIZE + pattrib->last_txcmdsz) == _FALSE)) {
3004*4882a593Smuzhiyun ptxdesc = (pmem + PACKET_OFFSET_SZ);
3005*4882a593Smuzhiyun /* RTW_INFO("==> non-agg-pkt,shift pointer...\n"); */
3006*4882a593Smuzhiyun pull = 1;
3007*4882a593Smuzhiyun }
3008*4882a593Smuzhiyun }
3009*4882a593Smuzhiyun #endif /* CONFIG_USE_USB_BUFFER_ALLOC_TX*/
3010*4882a593Smuzhiyun #endif
3011*4882a593Smuzhiyun rtw_halmac_get_tx_desc_size(adapter_to_dvobj(adapter), &desc_size);
3012*4882a593Smuzhiyun
3013*4882a593Smuzhiyun _rtw_memset(pbuf, 0, desc_size);
3014*4882a593Smuzhiyun
3015*4882a593Smuzhiyun /*SET_TX_DESC_LS_8821C(pbuf, 1);*/ /*for USB only*/
3016*4882a593Smuzhiyun
3017*4882a593Smuzhiyun SET_TX_DESC_TXPKTSIZE_8821C(pbuf, pattrib->last_txcmdsz);
3018*4882a593Smuzhiyun
3019*4882a593Smuzhiyun offset = desc_size + OFFSET_SZ;
3020*4882a593Smuzhiyun
3021*4882a593Smuzhiyun #ifdef CONFIG_TX_EARLY_MODE
3022*4882a593Smuzhiyun if (pxmitframe->frame_tag == DATA_FRAMETAG)
3023*4882a593Smuzhiyun if (bagg_pkt)
3024*4882a593Smuzhiyun offset += EARLY_MODE_INFO_SIZE ;/*0x28 */
3025*4882a593Smuzhiyun pkt_offset = pxmitframe->pkt_offset = 0x01;
3026*4882a593Smuzhiyun #endif
3027*4882a593Smuzhiyun SET_TX_DESC_OFFSET_8821C(pbuf, offset);
3028*4882a593Smuzhiyun
3029*4882a593Smuzhiyun if (bmcst)
3030*4882a593Smuzhiyun SET_TX_DESC_BMC_8821C(pbuf, 1);
3031*4882a593Smuzhiyun
3032*4882a593Smuzhiyun #if 0
3033*4882a593Smuzhiyun #ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX
3034*4882a593Smuzhiyun if (adapter->registrypriv.mp_mode == 0) {
3035*4882a593Smuzhiyun if ((PACKET_OFFSET_SZ != 0) && (!bagg_pkt)) {
3036*4882a593Smuzhiyun if ((pull) && (pxmitframe->pkt_offset > 0)) {
3037*4882a593Smuzhiyun pxmitframe->pkt_offset = pxmitframe->pkt_offset - 1;
3038*4882a593Smuzhiyun pkt_offset = pxmitframe->pkt_offset;
3039*4882a593Smuzhiyun }
3040*4882a593Smuzhiyun }
3041*4882a593Smuzhiyun }
3042*4882a593Smuzhiyun /*RTW_INFO("%s, pkt_offset=0x%02x\n", __func__, pxmitframe->pkt_offset);*/
3043*4882a593Smuzhiyun #endif
3044*4882a593Smuzhiyun #endif
3045*4882a593Smuzhiyun
3046*4882a593Smuzhiyun /* pkt_offset, unit:8 bytes padding*/
3047*4882a593Smuzhiyun if (pkt_offset > 0)
3048*4882a593Smuzhiyun SET_TX_DESC_PKT_OFFSET_8821C(pbuf, pkt_offset);
3049*4882a593Smuzhiyun
3050*4882a593Smuzhiyun
3051*4882a593Smuzhiyun SET_TX_DESC_MACID_8821C(pbuf, pattrib->mac_id);
3052*4882a593Smuzhiyun SET_TX_DESC_RATE_ID_8821C(pbuf, pattrib->raid);
3053*4882a593Smuzhiyun SET_TX_DESC_QSEL_8821C(pbuf, pattrib->qsel);
3054*4882a593Smuzhiyun
3055*4882a593Smuzhiyun /* 2009.11.05. tynli_test. Suggested by SD4 Filen for FW LPS.
3056*4882a593Smuzhiyun * (1) The sequence number of each non-Qos frame / broadcast / multicast /
3057*4882a593Smuzhiyun * mgnt frame should be controled by Hw because Fw will also send null data
3058*4882a593Smuzhiyun * which we cannot control when Fw LPS enable.
3059*4882a593Smuzhiyun * --> default enable non-Qos data sequense number. 2010.06.23. by tynli.
3060*4882a593Smuzhiyun * (2) Enable HW SEQ control for beacon packet, because we use Hw beacon.
3061*4882a593Smuzhiyun * (3) Use HW Qos SEQ to control the seq num of Ext port non-Qos packets.
3062*4882a593Smuzhiyun */
3063*4882a593Smuzhiyun
3064*4882a593Smuzhiyun /* HW sequence, to fix to use 0 queue. todo: 4AC packets to use auto queue select */
3065*4882a593Smuzhiyun if (!pattrib->qos_en) {
3066*4882a593Smuzhiyun SET_TX_DESC_DISQSELSEQ_8821C(pbuf, 1);
3067*4882a593Smuzhiyun SET_TX_DESC_EN_HWSEQ_8821C(pbuf, 1);
3068*4882a593Smuzhiyun SET_TX_DESC_HW_SSN_SEL_8821C(pbuf, pattrib->hw_ssn_sel);
3069*4882a593Smuzhiyun SET_TX_DESC_EN_HWEXSEQ_8821C(pbuf, 0);
3070*4882a593Smuzhiyun } else
3071*4882a593Smuzhiyun SET_TX_DESC_SW_SEQ_8821C(pbuf, pattrib->seqnum);
3072*4882a593Smuzhiyun
3073*4882a593Smuzhiyun if (pxmitframe->frame_tag == DATA_FRAMETAG) {
3074*4882a593Smuzhiyun
3075*4882a593Smuzhiyun rtl8821c_fill_txdesc_sectype(pattrib, pbuf);
3076*4882a593Smuzhiyun
3077*4882a593Smuzhiyun if (bmcst)
3078*4882a593Smuzhiyun fill_txdesc_force_bmc_camid(pattrib, pbuf);
3079*4882a593Smuzhiyun
3080*4882a593Smuzhiyun #if defined(CONFIG_USB_TX_AGGREGATION) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
3081*4882a593Smuzhiyun if (pxmitframe->agg_num > 1) {
3082*4882a593Smuzhiyun /*RTW_INFO("%s agg_num:%d\n",__func__,pxmitframe->agg_num );*/
3083*4882a593Smuzhiyun SET_TX_DESC_DMA_TXAGG_NUM_8821C(pbuf, pxmitframe->agg_num);
3084*4882a593Smuzhiyun }
3085*4882a593Smuzhiyun #endif /*CONFIG_USB_TX_AGGREGATION*/
3086*4882a593Smuzhiyun
3087*4882a593Smuzhiyun rtl8821c_fill_txdesc_vcs(adapter, pattrib, pbuf);
3088*4882a593Smuzhiyun
3089*4882a593Smuzhiyun #ifdef CONFIG_SUPPORT_DYNAMIC_TXPWR
3090*4882a593Smuzhiyun rtw_phydm_set_dyntxpwr(adapter, pbuf, pattrib->mac_id);
3091*4882a593Smuzhiyun #endif
3092*4882a593Smuzhiyun if ((pattrib->ether_type != 0x888e) &&
3093*4882a593Smuzhiyun (pattrib->ether_type != 0x0806) &&
3094*4882a593Smuzhiyun (pattrib->ether_type != 0x88B4) &&
3095*4882a593Smuzhiyun (pattrib->dhcp_pkt != 1)
3096*4882a593Smuzhiyun #ifdef CONFIG_AUTO_AP_MODE
3097*4882a593Smuzhiyun && (pattrib->pctrl != _TRUE)
3098*4882a593Smuzhiyun #endif
3099*4882a593Smuzhiyun ) {
3100*4882a593Smuzhiyun /* Non EAP & ARP & DHCP type data packet */
3101*4882a593Smuzhiyun
3102*4882a593Smuzhiyun if (pattrib->ampdu_en == _TRUE) {
3103*4882a593Smuzhiyun SET_TX_DESC_AGG_EN_8821C(pbuf, 1);
3104*4882a593Smuzhiyun SET_TX_DESC_MAX_AGG_NUM_8821C(pbuf, 0x1F);
3105*4882a593Smuzhiyun SET_TX_DESC_AMPDU_DENSITY_8821C(pbuf, pattrib->ampdu_spacing);
3106*4882a593Smuzhiyun } else
3107*4882a593Smuzhiyun SET_TX_DESC_BK_8821C(pbuf, 1);
3108*4882a593Smuzhiyun
3109*4882a593Smuzhiyun if (adapter->fix_bw != 0xFF)
3110*4882a593Smuzhiyun pattrib->bwmode = adapter->fix_bw;
3111*4882a593Smuzhiyun
3112*4882a593Smuzhiyun rtl8821c_fill_txdesc_phy(adapter, pattrib, pbuf);
3113*4882a593Smuzhiyun
3114*4882a593Smuzhiyun if (phal_data->current_band_type == BAND_ON_5G)/*Data Rate Fallback Limit rate*/
3115*4882a593Smuzhiyun SET_TX_DESC_DATA_RTY_LOWEST_RATE_8821C(pbuf, 4);
3116*4882a593Smuzhiyun else
3117*4882a593Smuzhiyun SET_TX_DESC_DATA_RTY_LOWEST_RATE_8821C(pbuf, 0);
3118*4882a593Smuzhiyun
3119*4882a593Smuzhiyun if (bmcst) {
3120*4882a593Smuzhiyun drv_fixed_reate = _TRUE;
3121*4882a593Smuzhiyun fill_txdesc_bmc_tx_rate(pattrib, pbuf);
3122*4882a593Smuzhiyun }
3123*4882a593Smuzhiyun
3124*4882a593Smuzhiyun /* modify data rate by iwpriv*/
3125*4882a593Smuzhiyun if (adapter->fix_rate != 0xFF) {
3126*4882a593Smuzhiyun drv_fixed_reate = _TRUE;
3127*4882a593Smuzhiyun SET_TX_DESC_USE_RATE_8821C(pbuf, 1);
3128*4882a593Smuzhiyun
3129*4882a593Smuzhiyun if (adapter->fix_rate & BIT(7))
3130*4882a593Smuzhiyun SET_TX_DESC_DATA_SHORT_8821C(pbuf, 1);
3131*4882a593Smuzhiyun SET_TX_DESC_DATARATE_8821C(pbuf, adapter->fix_rate & 0x7F);
3132*4882a593Smuzhiyun if (!adapter->data_fb)
3133*4882a593Smuzhiyun SET_TX_DESC_DISDATAFB_8821C(pbuf, 1);
3134*4882a593Smuzhiyun }
3135*4882a593Smuzhiyun
3136*4882a593Smuzhiyun if (pattrib->ldpc)
3137*4882a593Smuzhiyun SET_TX_DESC_DATA_LDPC_8821C(pbuf, 1);
3138*4882a593Smuzhiyun if (pattrib->stbc)
3139*4882a593Smuzhiyun SET_TX_DESC_DATA_STBC_8821C(pbuf, 1);
3140*4882a593Smuzhiyun
3141*4882a593Smuzhiyun #ifdef CONFIG_CMCC_TEST
3142*4882a593Smuzhiyun SET_TX_DESC_DATA_SHORT_8821C(pbuf, 1); /* use cck short premble */
3143*4882a593Smuzhiyun #endif
3144*4882a593Smuzhiyun
3145*4882a593Smuzhiyun #ifdef CONFIG_WMMPS_STA
3146*4882a593Smuzhiyun if (pattrib->trigger_frame)
3147*4882a593Smuzhiyun SET_TX_DESC_TRI_FRAME_8821C (pbuf, 1);
3148*4882a593Smuzhiyun #endif /* CONFIG_WMMPS_STA */
3149*4882a593Smuzhiyun } else {
3150*4882a593Smuzhiyun
3151*4882a593Smuzhiyun /*
3152*4882a593Smuzhiyun * EAP data packet and ARP packet.
3153*4882a593Smuzhiyun * Use the 1M data rate to send the EAP/ARP packet.
3154*4882a593Smuzhiyun * This will maybe make the handshake smooth.
3155*4882a593Smuzhiyun */
3156*4882a593Smuzhiyun SET_TX_DESC_BK_8821C(pbuf, 1);
3157*4882a593Smuzhiyun drv_fixed_reate = _TRUE;
3158*4882a593Smuzhiyun SET_TX_DESC_USE_RATE_8821C(pbuf, 1);
3159*4882a593Smuzhiyun
3160*4882a593Smuzhiyun /* HW will ignore this setting if the transmission rate is legacy OFDM.*/
3161*4882a593Smuzhiyun if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT)
3162*4882a593Smuzhiyun SET_TX_DESC_DATA_SHORT_8821C(pbuf, 1);
3163*4882a593Smuzhiyun #ifdef CONFIG_IP_R_MONITOR
3164*4882a593Smuzhiyun if((pattrib->ether_type == ETH_P_ARP) &&
3165*4882a593Smuzhiyun (IsSupportedTxOFDM(adapter->registrypriv.wireless_mode)))
3166*4882a593Smuzhiyun SET_TX_DESC_DATARATE_8821C(pbuf, MRateToHwRate(IEEE80211_OFDM_RATE_6MB));
3167*4882a593Smuzhiyun else
3168*4882a593Smuzhiyun #endif/*CONFIG_IP_R_MONITOR*/
3169*4882a593Smuzhiyun SET_TX_DESC_DATARATE_8821C(pbuf, MRateToHwRate(pmlmeext->tx_rate));
3170*4882a593Smuzhiyun
3171*4882a593Smuzhiyun RTW_INFO(FUNC_ADPT_FMT ": SP Packet(0x%04X) rate=0x%x SeqNum = %d\n",
3172*4882a593Smuzhiyun FUNC_ADPT_ARG(adapter), pattrib->ether_type, MRateToHwRate(pmlmeext->tx_rate), pattrib->seqnum);
3173*4882a593Smuzhiyun }
3174*4882a593Smuzhiyun #ifdef CONFIG_TDLS
3175*4882a593Smuzhiyun #ifdef CONFIG_XMIT_ACK
3176*4882a593Smuzhiyun /* CCX-TXRPT ack for xmit mgmt frames. */
3177*4882a593Smuzhiyun if (pxmitframe->ack_report) {
3178*4882a593Smuzhiyun #ifdef DBG_CCX
3179*4882a593Smuzhiyun RTW_INFO("%s set spe_rpt\n", __func__);
3180*4882a593Smuzhiyun #endif
3181*4882a593Smuzhiyun SET_TX_DESC_SPE_RPT_8821C(pbuf, 1);
3182*4882a593Smuzhiyun }
3183*4882a593Smuzhiyun #endif /* CONFIG_XMIT_ACK */
3184*4882a593Smuzhiyun #endif
3185*4882a593Smuzhiyun
3186*4882a593Smuzhiyun } else if (pxmitframe->frame_tag == MGNT_FRAMETAG) {
3187*4882a593Smuzhiyun SET_TX_DESC_MBSSID_8821C(pbuf, pattrib->mbssid & 0xF);
3188*4882a593Smuzhiyun SET_TX_DESC_USE_RATE_8821C(pbuf, 1);
3189*4882a593Smuzhiyun drv_fixed_reate = _TRUE;
3190*4882a593Smuzhiyun
3191*4882a593Smuzhiyun SET_TX_DESC_DATARATE_8821C(pbuf, MRateToHwRate(pattrib->rate));
3192*4882a593Smuzhiyun
3193*4882a593Smuzhiyun /* VHT NDPA or HT NDPA Packet for Beamformer.*/
3194*4882a593Smuzhiyun #ifdef CONFIG_BEAMFORMING
3195*4882a593Smuzhiyun if ((pattrib->subtype == WIFI_NDPA) ||
3196*4882a593Smuzhiyun ((pattrib->subtype == WIFI_ACTION_NOACK) && (pattrib->order == 1))) {
3197*4882a593Smuzhiyun SET_TX_DESC_NAVUSEHDR_8821C(pbuf, 1);
3198*4882a593Smuzhiyun
3199*4882a593Smuzhiyun SET_TX_DESC_DATA_BW_8821C(pbuf, rtl8821c_bw_mapping(adapter, pattrib));
3200*4882a593Smuzhiyun /*SET_TX_DESC_DATA_SC_8821C(pbuf, rtl8821c_sc_mapping(adapter, pattrib));*/
3201*4882a593Smuzhiyun SET_TX_DESC_SIGNALING_TA_PKT_SC_8821C(pbuf, rtl8821c_sc_mapping(adapter,pattrib));
3202*4882a593Smuzhiyun
3203*4882a593Smuzhiyun SET_TX_DESC_RTY_LMT_EN_8821C(pbuf, 1);
3204*4882a593Smuzhiyun SET_TX_DESC_RTS_DATA_RTY_LMT_8821C(pbuf, 5);
3205*4882a593Smuzhiyun SET_TX_DESC_DISDATAFB_8821C(pbuf, 1);
3206*4882a593Smuzhiyun
3207*4882a593Smuzhiyun /*if(pattrib->rts_cca)
3208*4882a593Smuzhiyun SET_TX_DESC_NDPA_8821C(ptxdesc, 2);
3209*4882a593Smuzhiyun else*/
3210*4882a593Smuzhiyun SET_TX_DESC_NDPA_8821C(pbuf, 1);
3211*4882a593Smuzhiyun } else
3212*4882a593Smuzhiyun #endif
3213*4882a593Smuzhiyun {
3214*4882a593Smuzhiyun SET_TX_DESC_RTY_LMT_EN_8821C(pbuf, 1);
3215*4882a593Smuzhiyun if (pattrib->retry_ctrl == _TRUE)
3216*4882a593Smuzhiyun SET_TX_DESC_RTS_DATA_RTY_LMT_8821C(pbuf, 6);
3217*4882a593Smuzhiyun else
3218*4882a593Smuzhiyun SET_TX_DESC_RTS_DATA_RTY_LMT_8821C(pbuf, 12);
3219*4882a593Smuzhiyun }
3220*4882a593Smuzhiyun
3221*4882a593Smuzhiyun #ifdef CONFIG_XMIT_ACK
3222*4882a593Smuzhiyun /* CCX-TXRPT ack for xmit mgmt frames. */
3223*4882a593Smuzhiyun if (pxmitframe->ack_report) {
3224*4882a593Smuzhiyun #ifdef DBG_CCX
3225*4882a593Smuzhiyun RTW_INFO("%s set spe_rpt\n", __func__);
3226*4882a593Smuzhiyun #endif
3227*4882a593Smuzhiyun SET_TX_DESC_SPE_RPT_8821C(pbuf, 1);
3228*4882a593Smuzhiyun }
3229*4882a593Smuzhiyun #endif /* CONFIG_XMIT_ACK */
3230*4882a593Smuzhiyun } else if (pxmitframe->frame_tag == TXAGG_FRAMETAG)
3231*4882a593Smuzhiyun RTW_INFO("%s: TXAGG_FRAMETAG\n", __func__);
3232*4882a593Smuzhiyun #ifdef CONFIG_MP_INCLUDED
3233*4882a593Smuzhiyun else if (pxmitframe->frame_tag == MP_FRAMETAG) {
3234*4882a593Smuzhiyun RTW_INFO("%s: MP_FRAMETAG\n", __func__);
3235*4882a593Smuzhiyun fill_txdesc_for_mp(adapter, pbuf);
3236*4882a593Smuzhiyun }
3237*4882a593Smuzhiyun #endif
3238*4882a593Smuzhiyun else {
3239*4882a593Smuzhiyun RTW_INFO("%s: frame_tag=0x%x\n", __func__, pxmitframe->frame_tag);
3240*4882a593Smuzhiyun
3241*4882a593Smuzhiyun SET_TX_DESC_USE_RATE_8821C(pbuf, 1);
3242*4882a593Smuzhiyun drv_fixed_reate = _TRUE;
3243*4882a593Smuzhiyun SET_TX_DESC_DATARATE_8821C(pbuf, MRateToHwRate(pmlmeext->tx_rate));
3244*4882a593Smuzhiyun }
3245*4882a593Smuzhiyun
3246*4882a593Smuzhiyun if (drv_fixed_reate == _TRUE)
3247*4882a593Smuzhiyun SET_TX_DESC_SW_DEFINE_8821C(pbuf, RA_SW_DEFINE_CONT);
3248*4882a593Smuzhiyun
3249*4882a593Smuzhiyun if (adapter->power_offset != 0)
3250*4882a593Smuzhiyun SET_TX_DESC_TXPWR_OFSET_8821C(pbuf, adapter->power_offset);
3251*4882a593Smuzhiyun
3252*4882a593Smuzhiyun #ifdef CONFIG_ANTENNA_DIVERSITY
3253*4882a593Smuzhiyun if (!bmcst && pattrib->psta)
3254*4882a593Smuzhiyun odm_set_tx_ant_by_tx_info(adapter_to_phydm(adapter), pbuf, pattrib->psta->cmn.mac_id);
3255*4882a593Smuzhiyun #endif
3256*4882a593Smuzhiyun
3257*4882a593Smuzhiyun #ifdef CONFIG_BEAMFORMING
3258*4882a593Smuzhiyun SET_TX_DESC_G_ID_8821C(pbuf, pattrib->txbf_g_id);
3259*4882a593Smuzhiyun SET_TX_DESC_P_AID_8821C(pbuf, pattrib->txbf_p_aid);
3260*4882a593Smuzhiyun #endif
3261*4882a593Smuzhiyun
3262*4882a593Smuzhiyun SET_TX_DESC_PORT_ID_8821C(pbuf, hw_port);
3263*4882a593Smuzhiyun SET_TX_DESC_MULTIPLE_PORT_8821C(pbuf, hw_port);
3264*4882a593Smuzhiyun }
3265*4882a593Smuzhiyun
rtl8821c_dbg_dump_tx_desc(PADAPTER adapter,int frame_tag,u8 * ptxdesc)3266*4882a593Smuzhiyun void rtl8821c_dbg_dump_tx_desc(PADAPTER adapter, int frame_tag, u8 *ptxdesc)
3267*4882a593Smuzhiyun {
3268*4882a593Smuzhiyun u8 bDumpTxPkt;
3269*4882a593Smuzhiyun u8 bDumpTxDesc = _FALSE;
3270*4882a593Smuzhiyun
3271*4882a593Smuzhiyun
3272*4882a593Smuzhiyun rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_TXPKT, &bDumpTxPkt);
3273*4882a593Smuzhiyun
3274*4882a593Smuzhiyun /* 1 for data frame, 2 for mgnt frame */
3275*4882a593Smuzhiyun if (bDumpTxPkt == 1) {
3276*4882a593Smuzhiyun RTW_INFO("dump tx_desc for data frame\n");
3277*4882a593Smuzhiyun if ((frame_tag & 0x0f) == DATA_FRAMETAG)
3278*4882a593Smuzhiyun bDumpTxDesc = _TRUE;
3279*4882a593Smuzhiyun } else if (bDumpTxPkt == 2) {
3280*4882a593Smuzhiyun RTW_INFO("dump tx_desc for mgnt frame\n");
3281*4882a593Smuzhiyun if ((frame_tag & 0x0f) == MGNT_FRAMETAG)
3282*4882a593Smuzhiyun bDumpTxDesc = _TRUE;
3283*4882a593Smuzhiyun }
3284*4882a593Smuzhiyun
3285*4882a593Smuzhiyun /* 8821C TX SIZE = 48(HALMAC_TX_DESC_SIZE_8821C) */
3286*4882a593Smuzhiyun if (_TRUE == bDumpTxDesc) {
3287*4882a593Smuzhiyun RTW_INFO("=====================================\n");
3288*4882a593Smuzhiyun RTW_INFO("Offset00(0x%08x)\n", *((u32 *)(ptxdesc)));
3289*4882a593Smuzhiyun RTW_INFO("Offset04(0x%08x)\n", *((u32 *)(ptxdesc + 4)));
3290*4882a593Smuzhiyun RTW_INFO("Offset08(0x%08x)\n", *((u32 *)(ptxdesc + 8)));
3291*4882a593Smuzhiyun RTW_INFO("Offset12(0x%08x)\n", *((u32 *)(ptxdesc + 12)));
3292*4882a593Smuzhiyun RTW_INFO("Offset16(0x%08x)\n", *((u32 *)(ptxdesc + 16)));
3293*4882a593Smuzhiyun RTW_INFO("Offset20(0x%08x)\n", *((u32 *)(ptxdesc + 20)));
3294*4882a593Smuzhiyun RTW_INFO("Offset24(0x%08x)\n", *((u32 *)(ptxdesc + 24)));
3295*4882a593Smuzhiyun RTW_INFO("Offset28(0x%08x)\n", *((u32 *)(ptxdesc + 28)));
3296*4882a593Smuzhiyun RTW_INFO("Offset32(0x%08x)\n", *((u32 *)(ptxdesc + 32)));
3297*4882a593Smuzhiyun RTW_INFO("Offset36(0x%08x)\n", *((u32 *)(ptxdesc + 36)));
3298*4882a593Smuzhiyun RTW_INFO("Offset40(0x%08x)\n", *((u32 *)(ptxdesc + 40)));
3299*4882a593Smuzhiyun RTW_INFO("Offset44(0x%08x)\n", *((u32 *)(ptxdesc + 44)));
3300*4882a593Smuzhiyun RTW_INFO("=====================================\n");
3301*4882a593Smuzhiyun }
3302*4882a593Smuzhiyun }
3303*4882a593Smuzhiyun
3304*4882a593Smuzhiyun /*
3305*4882a593Smuzhiyun * Description:
3306*4882a593Smuzhiyun *
3307*4882a593Smuzhiyun * Parameters:
3308*4882a593Smuzhiyun * pxmitframe xmitframe
3309*4882a593Smuzhiyun * pbuf where to fill tx desc
3310*4882a593Smuzhiyun */
rtl8821c_update_txdesc(struct xmit_frame * pxmitframe,u8 * pbuf)3311*4882a593Smuzhiyun void rtl8821c_update_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf)
3312*4882a593Smuzhiyun {
3313*4882a593Smuzhiyun fill_default_txdesc(pxmitframe, pbuf);
3314*4882a593Smuzhiyun rtl8821c_cal_txdesc_chksum(pxmitframe->padapter, pbuf);
3315*4882a593Smuzhiyun rtl8821c_dbg_dump_tx_desc(pxmitframe->padapter, pxmitframe->frame_tag, pbuf);
3316*4882a593Smuzhiyun }
3317*4882a593Smuzhiyun
3318*4882a593Smuzhiyun /*
3319*4882a593Smuzhiyun * Description:
3320*4882a593Smuzhiyun * In normal chip, we should send some packet to HW which will be used by FW
3321*4882a593Smuzhiyun * in FW LPS mode.
3322*4882a593Smuzhiyun * The function is to fill the Tx descriptor of this packets,
3323*4882a593Smuzhiyun * then FW can tell HW to send these packet directly.
3324*4882a593Smuzhiyun */
fill_fake_txdesc(PADAPTER adapter,u8 * pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull,u8 bDataFrame)3325*4882a593Smuzhiyun static void fill_fake_txdesc(PADAPTER adapter, u8 *pDesc, u32 BufferLen,
3326*4882a593Smuzhiyun u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame)
3327*4882a593Smuzhiyun {
3328*4882a593Smuzhiyun struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
3329*4882a593Smuzhiyun struct xmit_priv *pxmitpriv = &adapter->xmitpriv;
3330*4882a593Smuzhiyun u32 desc_size = 0;
3331*4882a593Smuzhiyun u8 hw_port = rtw_hal_get_port(adapter);
3332*4882a593Smuzhiyun
3333*4882a593Smuzhiyun rtw_halmac_get_tx_desc_size(adapter_to_dvobj(adapter), &desc_size);
3334*4882a593Smuzhiyun
3335*4882a593Smuzhiyun /* Clear all status */
3336*4882a593Smuzhiyun _rtw_memset(pDesc, 0, desc_size);
3337*4882a593Smuzhiyun
3338*4882a593Smuzhiyun SET_TX_DESC_LS_8821C(pDesc, 1);
3339*4882a593Smuzhiyun
3340*4882a593Smuzhiyun SET_TX_DESC_OFFSET_8821C(pDesc, desc_size);
3341*4882a593Smuzhiyun
3342*4882a593Smuzhiyun SET_TX_DESC_TXPKTSIZE_8821C(pDesc, BufferLen);
3343*4882a593Smuzhiyun SET_TX_DESC_QSEL_8821C(pDesc, QSLT_MGNT); /* Fixed queue of Mgnt queue */
3344*4882a593Smuzhiyun
3345*4882a593Smuzhiyun if (pmlmeext->cur_wireless_mode & WIRELESS_11B)
3346*4882a593Smuzhiyun SET_TX_DESC_RATE_ID_8821C(pDesc, RATEID_IDX_B);
3347*4882a593Smuzhiyun else
3348*4882a593Smuzhiyun SET_TX_DESC_RATE_ID_8821C(pDesc, RATEID_IDX_G);
3349*4882a593Smuzhiyun
3350*4882a593Smuzhiyun /* Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by HW */
3351*4882a593Smuzhiyun if (_TRUE == IsPsPoll)
3352*4882a593Smuzhiyun SET_TX_DESC_NAVUSEHDR_8821C(pDesc, 1);
3353*4882a593Smuzhiyun else {
3354*4882a593Smuzhiyun SET_TX_DESC_DISQSELSEQ_8821C(pDesc, 1);
3355*4882a593Smuzhiyun SET_TX_DESC_EN_HWSEQ_8821C(pDesc, 1);
3356*4882a593Smuzhiyun SET_TX_DESC_HW_SSN_SEL_8821C(pDesc, pxmitpriv->hw_ssn_seq_no);/*pattrib->hw_ssn_sel*/
3357*4882a593Smuzhiyun SET_TX_DESC_EN_HWEXSEQ_8821C(pDesc, 0);
3358*4882a593Smuzhiyun }
3359*4882a593Smuzhiyun
3360*4882a593Smuzhiyun if (_TRUE == IsBTQosNull)
3361*4882a593Smuzhiyun SET_TX_DESC_BT_NULL_8821C(pDesc, 1);
3362*4882a593Smuzhiyun
3363*4882a593Smuzhiyun SET_TX_DESC_USE_RATE_8821C(pDesc, 1);
3364*4882a593Smuzhiyun SET_TX_DESC_DATARATE_8821C(pDesc, MRateToHwRate(pmlmeext->tx_rate));
3365*4882a593Smuzhiyun
3366*4882a593Smuzhiyun #ifdef CONFIG_MCC_MODE
3367*4882a593Smuzhiyun /* config Null data retry number */
3368*4882a593Smuzhiyun if (IsPsPoll == _FALSE && IsBTQosNull == _FALSE && bDataFrame == _FALSE) {
3369*4882a593Smuzhiyun if (rtw_hal_check_mcc_status(adapter, MCC_STATUS_PROCESS_MCC_START_SETTING)) {
3370*4882a593Smuzhiyun u8 rty_num = adapter->mcc_adapterpriv.null_rty_num;
3371*4882a593Smuzhiyun if (rty_num != 0) {
3372*4882a593Smuzhiyun SET_TX_DESC_RTY_LMT_EN_8821C(pDesc, 1);
3373*4882a593Smuzhiyun SET_TX_DESC_RTS_DATA_RTY_LMT_8821C(pDesc, rty_num);
3374*4882a593Smuzhiyun }
3375*4882a593Smuzhiyun }
3376*4882a593Smuzhiyun }
3377*4882a593Smuzhiyun #endif
3378*4882a593Smuzhiyun
3379*4882a593Smuzhiyun /*
3380*4882a593Smuzhiyun * Encrypt the data frame if under security mode excepct null data.
3381*4882a593Smuzhiyun */
3382*4882a593Smuzhiyun if (_TRUE == bDataFrame) {
3383*4882a593Smuzhiyun u32 EncAlg;
3384*4882a593Smuzhiyun
3385*4882a593Smuzhiyun EncAlg = adapter->securitypriv.dot11PrivacyAlgrthm;
3386*4882a593Smuzhiyun switch (EncAlg) {
3387*4882a593Smuzhiyun case _NO_PRIVACY_:
3388*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x0);
3389*4882a593Smuzhiyun break;
3390*4882a593Smuzhiyun case _WEP40_:
3391*4882a593Smuzhiyun case _WEP104_:
3392*4882a593Smuzhiyun case _TKIP_:
3393*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x1);
3394*4882a593Smuzhiyun break;
3395*4882a593Smuzhiyun case _SMS4_:
3396*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x2);
3397*4882a593Smuzhiyun break;
3398*4882a593Smuzhiyun case _AES_:
3399*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x3);
3400*4882a593Smuzhiyun break;
3401*4882a593Smuzhiyun case _CCMP_256_:
3402*4882a593Smuzhiyun case _GCMP_:
3403*4882a593Smuzhiyun case _GCMP_256_:
3404*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x2);
3405*4882a593Smuzhiyun break;
3406*4882a593Smuzhiyun default:
3407*4882a593Smuzhiyun SET_TX_DESC_SEC_TYPE_8821C(pDesc, 0x0);
3408*4882a593Smuzhiyun break;
3409*4882a593Smuzhiyun }
3410*4882a593Smuzhiyun }
3411*4882a593Smuzhiyun SET_TX_DESC_PORT_ID_8821C(pDesc, hw_port);
3412*4882a593Smuzhiyun SET_TX_DESC_MULTIPLE_PORT_8821C(pDesc, hw_port);
3413*4882a593Smuzhiyun
3414*4882a593Smuzhiyun #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
3415*4882a593Smuzhiyun /*
3416*4882a593Smuzhiyun * USB interface drop packet if the checksum of descriptor isn't correct.
3417*4882a593Smuzhiyun * Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.).
3418*4882a593Smuzhiyun */
3419*4882a593Smuzhiyun rtl8821c_cal_txdesc_chksum(adapter, pDesc);
3420*4882a593Smuzhiyun #endif
3421*4882a593Smuzhiyun }
3422*4882a593Smuzhiyun
rtl8821c_rxdesc2attribute(struct rx_pkt_attrib * pattrib,u8 * desc)3423*4882a593Smuzhiyun void rtl8821c_rxdesc2attribute(struct rx_pkt_attrib *pattrib, u8 *desc)
3424*4882a593Smuzhiyun {
3425*4882a593Smuzhiyun /* initial value */
3426*4882a593Smuzhiyun _rtw_memset(pattrib, 0, sizeof(struct rx_pkt_attrib));
3427*4882a593Smuzhiyun
3428*4882a593Smuzhiyun pattrib->pkt_len = (u16)GET_RX_DESC_PKT_LEN_8821C(desc);
3429*4882a593Smuzhiyun pattrib->pkt_rpt_type = (GET_RX_DESC_C2H_8821C(desc)) ? C2H_PACKET : NORMAL_RX;
3430*4882a593Smuzhiyun
3431*4882a593Smuzhiyun if (pattrib->pkt_rpt_type == NORMAL_RX) {
3432*4882a593Smuzhiyun /* Get from RX DESC */
3433*4882a593Smuzhiyun pattrib->crc_err = (u8)GET_RX_DESC_CRC32_8821C(desc);
3434*4882a593Smuzhiyun pattrib->icv_err = (u8)GET_RX_DESC_ICV_ERR_8821C(desc);
3435*4882a593Smuzhiyun
3436*4882a593Smuzhiyun pattrib->drvinfo_sz = (u8)GET_RX_DESC_DRV_INFO_SIZE_8821C(desc) << 3;
3437*4882a593Smuzhiyun pattrib->encrypt = (u8)GET_RX_DESC_SECURITY_8821C(desc);
3438*4882a593Smuzhiyun pattrib->qos = (u8)GET_RX_DESC_QOS_8821C(desc);
3439*4882a593Smuzhiyun pattrib->shift_sz = (u8)GET_RX_DESC_SHIFT_8821C(desc);
3440*4882a593Smuzhiyun pattrib->physt = (u8)GET_RX_DESC_PHYST_8821C(desc);
3441*4882a593Smuzhiyun pattrib->bdecrypted = (u8)GET_RX_DESC_SWDEC_8821C(desc) ? 0 : 1;
3442*4882a593Smuzhiyun
3443*4882a593Smuzhiyun pattrib->priority = (u8)GET_RX_DESC_TID_8821C(desc);
3444*4882a593Smuzhiyun pattrib->amsdu = (u8)GET_RX_DESC_AMSDU_8821C(desc);
3445*4882a593Smuzhiyun pattrib->mdata = (u8)GET_RX_DESC_MD_8821C(desc);
3446*4882a593Smuzhiyun pattrib->mfrag = (u8)GET_RX_DESC_MF_8821C(desc);
3447*4882a593Smuzhiyun
3448*4882a593Smuzhiyun pattrib->seq_num = (u16)GET_RX_DESC_SEQ_8821C(desc);
3449*4882a593Smuzhiyun pattrib->frag_num = (u8)GET_RX_DESC_FRAG_8821C(desc);
3450*4882a593Smuzhiyun pattrib->ampdu = (u8)GET_RX_DESC_PAGGR_8821C(desc);
3451*4882a593Smuzhiyun pattrib->ampdu_eof = (u8)GET_RX_DESC_RX_EOF_8821C(desc);
3452*4882a593Smuzhiyun pattrib->ppdu_cnt = (u8)GET_RX_DESC_PPDU_CNT_8821C(desc);
3453*4882a593Smuzhiyun pattrib->free_cnt = (u32)GET_RX_DESC_TSFL_8821C(desc);
3454*4882a593Smuzhiyun
3455*4882a593Smuzhiyun pattrib->bw = CHANNEL_WIDTH_MAX;
3456*4882a593Smuzhiyun pattrib->data_rate = (u8)GET_RX_DESC_RX_RATE_8821C(desc);
3457*4882a593Smuzhiyun }
3458*4882a593Smuzhiyun }
3459*4882a593Smuzhiyun
rtl8821c_query_rx_desc(union recv_frame * precvframe,u8 * pdesc)3460*4882a593Smuzhiyun void rtl8821c_query_rx_desc(union recv_frame *precvframe, u8 *pdesc)
3461*4882a593Smuzhiyun {
3462*4882a593Smuzhiyun rtl8821c_rxdesc2attribute(&precvframe->u.hdr.attrib, pdesc);
3463*4882a593Smuzhiyun }
3464*4882a593Smuzhiyun
InitBeaconParameters(PADAPTER adapter)3465*4882a593Smuzhiyun static void InitBeaconParameters(PADAPTER adapter)
3466*4882a593Smuzhiyun {
3467*4882a593Smuzhiyun PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
3468*4882a593Smuzhiyun
3469*4882a593Smuzhiyun /* TBTT setup time */
3470*4882a593Smuzhiyun rtw_write8(adapter, REG_TBTT_PROHIBIT_8821C, TBTT_PROHIBIT_SETUP_TIME);
3471*4882a593Smuzhiyun
3472*4882a593Smuzhiyun /* TBTT hold time: 0x540[19:8] */
3473*4882a593Smuzhiyun rtw_write8(adapter, REG_TBTT_PROHIBIT_8821C + 1, TBTT_PROHIBIT_HOLD_TIME_STOP_BCN & 0xFF);
3474*4882a593Smuzhiyun rtw_write8(adapter, REG_TBTT_PROHIBIT_8821C + 2,
3475*4882a593Smuzhiyun (rtw_read8(adapter, REG_TBTT_PROHIBIT_8821C + 2) & 0xF0) | (TBTT_PROHIBIT_HOLD_TIME_STOP_BCN >> 8));
3476*4882a593Smuzhiyun
3477*4882a593Smuzhiyun rtw_write8(adapter, REG_DRVERLYINT_8821C, DRIVER_EARLY_INT_TIME_8821C); /* 5ms */
3478*4882a593Smuzhiyun rtw_write8(adapter, REG_BCNDMATIM_8821C, BCN_DMA_ATIME_INT_TIME_8821C); /* 2ms */
3479*4882a593Smuzhiyun
3480*4882a593Smuzhiyun /*
3481*4882a593Smuzhiyun * Suggested by designer timchen. Change beacon AIFS to the largest number
3482*4882a593Smuzhiyun * beacause test chip does not contension before sending beacon.
3483*4882a593Smuzhiyun */
3484*4882a593Smuzhiyun rtw_write16(adapter, REG_BCNTCFG_8821C, 0x4413);
3485*4882a593Smuzhiyun }
3486*4882a593Smuzhiyun
beacon_function_enable(PADAPTER adapter,u8 Enable,u8 Linked)3487*4882a593Smuzhiyun static void beacon_function_enable(PADAPTER adapter, u8 Enable, u8 Linked)
3488*4882a593Smuzhiyun {
3489*4882a593Smuzhiyun hw_bcn_ctrl_add(adapter, get_hw_port(adapter), BIT_DIS_TSF_UDT_8821C | BIT_EN_BCN_FUNCTION_8821C);
3490*4882a593Smuzhiyun }
3491*4882a593Smuzhiyun
set_beacon_related_registers(PADAPTER adapter)3492*4882a593Smuzhiyun static void set_beacon_related_registers(PADAPTER adapter)
3493*4882a593Smuzhiyun {
3494*4882a593Smuzhiyun struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
3495*4882a593Smuzhiyun struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
3496*4882a593Smuzhiyun
3497*4882a593Smuzhiyun /* reset TSF, enable update TSF, correcting TSF On Beacon */
3498*4882a593Smuzhiyun #if 0
3499*4882a593Smuzhiyun /* * REG_MBSSID_BCN_SPACE */
3500*4882a593Smuzhiyun /* * REG_BCNDMATIM */
3501*4882a593Smuzhiyun /* * REG_ATIMWND */
3502*4882a593Smuzhiyun /* * REG_TBTT_PROHIBIT */
3503*4882a593Smuzhiyun /* * REG_DRVERLYINT */
3504*4882a593Smuzhiyun /* * REG_BCN_MAX_ERR */
3505*4882a593Smuzhiyun /* * REG_BCNTCFG (0x510) */
3506*4882a593Smuzhiyun /* * REG_DUAL_TSF_RST */
3507*4882a593Smuzhiyun /* * REG_BCN_CTRL (0x550) */
3508*4882a593Smuzhiyun #endif
3509*4882a593Smuzhiyun
3510*4882a593Smuzhiyun /* ATIM window */
3511*4882a593Smuzhiyun rtw_write16(adapter, REG_ATIMWND_8821C, 2);
3512*4882a593Smuzhiyun
3513*4882a593Smuzhiyun /* Beacon interval (in unit of TU). */
3514*4882a593Smuzhiyun rtw_hal_set_hwreg(adapter, HW_VAR_BEACON_INTERVAL, (u8 *)&pmlmeinfo->bcn_interval);
3515*4882a593Smuzhiyun
3516*4882a593Smuzhiyun InitBeaconParameters(adapter);
3517*4882a593Smuzhiyun
3518*4882a593Smuzhiyun rtw_write8(adapter, REG_SLOT_8821C, 0x09);
3519*4882a593Smuzhiyun
3520*4882a593Smuzhiyun /* Reset TSF Timer to zero */
3521*4882a593Smuzhiyun hw_tsf_reset(adapter);
3522*4882a593Smuzhiyun
3523*4882a593Smuzhiyun rtw_write8(adapter, REG_RXTSF_OFFSET_CCK_8821C, 0x50);
3524*4882a593Smuzhiyun rtw_write8(adapter, REG_RXTSF_OFFSET_OFDM_8821C, 0x50);
3525*4882a593Smuzhiyun
3526*4882a593Smuzhiyun beacon_function_enable(adapter, _TRUE, _TRUE);
3527*4882a593Smuzhiyun
3528*4882a593Smuzhiyun ResumeTxBeacon(adapter);
3529*4882a593Smuzhiyun }
3530*4882a593Smuzhiyun
rtl8821c_set_hal_ops(PADAPTER adapter)3531*4882a593Smuzhiyun void rtl8821c_set_hal_ops(PADAPTER adapter)
3532*4882a593Smuzhiyun {
3533*4882a593Smuzhiyun struct hal_ops *ops_func = &adapter->hal_func;
3534*4882a593Smuzhiyun
3535*4882a593Smuzhiyun /*** initialize section ***/
3536*4882a593Smuzhiyun ops_func->read_chip_version = read_chip_version;
3537*4882a593Smuzhiyun /*
3538*4882a593Smuzhiyun ops->init_default_value = NULL;
3539*4882a593Smuzhiyun */
3540*4882a593Smuzhiyun ops_func->read_adapter_info = rtl8821c_read_efuse;
3541*4882a593Smuzhiyun ops_func->hal_power_on = rtl8821c_power_on;
3542*4882a593Smuzhiyun ops_func->hal_power_off = rtl8821c_power_off;
3543*4882a593Smuzhiyun
3544*4882a593Smuzhiyun ops_func->dm_init = rtl8821c_phy_init_dm_priv;
3545*4882a593Smuzhiyun ops_func->dm_deinit = rtl8821c_phy_deinit_dm_priv;
3546*4882a593Smuzhiyun
3547*4882a593Smuzhiyun /*** xmit section ***/
3548*4882a593Smuzhiyun /*
3549*4882a593Smuzhiyun ops->init_xmit_priv = NULL;
3550*4882a593Smuzhiyun ops->free_xmit_priv = NULL;
3551*4882a593Smuzhiyun ops->hal_xmit = NULL;
3552*4882a593Smuzhiyun ops->mgnt_xmit = NULL;
3553*4882a593Smuzhiyun ops->hal_xmitframe_enqueue = NULL;
3554*4882a593Smuzhiyun #ifdef CONFIG_XMIT_THREAD_MODE
3555*4882a593Smuzhiyun ops->xmit_thread_handler = NULL;
3556*4882a593Smuzhiyun #endif
3557*4882a593Smuzhiyun */
3558*4882a593Smuzhiyun /*
3559*4882a593Smuzhiyun ops_func->run_thread = rtl8821c_run_thread;
3560*4882a593Smuzhiyun ops_func->cancel_thread = rtl8821c_cancel_thread;
3561*4882a593Smuzhiyun */
3562*4882a593Smuzhiyun /*** recv section ***/
3563*4882a593Smuzhiyun /*
3564*4882a593Smuzhiyun ops->init_recv_priv = NULL;
3565*4882a593Smuzhiyun ops->free_recv_priv = NULL;
3566*4882a593Smuzhiyun #if defined(CONFIG_USB_HCI) || defined(CONFIG_PCI_HCI)
3567*4882a593Smuzhiyun ops->inirp_init = NULL;
3568*4882a593Smuzhiyun ops->inirp_deinit = NULL;
3569*4882a593Smuzhiyun #endif
3570*4882a593Smuzhiyun */
3571*4882a593Smuzhiyun /*** interrupt hdl section ***/
3572*4882a593Smuzhiyun /*
3573*4882a593Smuzhiyun ops->enable_interrupt = NULL;
3574*4882a593Smuzhiyun ops->disable_interrupt = NULL;
3575*4882a593Smuzhiyun */
3576*4882a593Smuzhiyun ops_func->check_ips_status = check_ips_status;
3577*4882a593Smuzhiyun /*
3578*4882a593Smuzhiyun #if defined(CONFIG_PCI_HCI)
3579*4882a593Smuzhiyun ops->interrupt_handler = NULL;
3580*4882a593Smuzhiyun #endif
3581*4882a593Smuzhiyun #if defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT)
3582*4882a593Smuzhiyun ops->interrupt_handler = NULL;
3583*4882a593Smuzhiyun #endif
3584*4882a593Smuzhiyun #if defined(CONFIG_PCI_HCI)
3585*4882a593Smuzhiyun ops->irp_reset = NULL;
3586*4882a593Smuzhiyun #endif
3587*4882a593Smuzhiyun */
3588*4882a593Smuzhiyun
3589*4882a593Smuzhiyun /*** DM section ***/
3590*4882a593Smuzhiyun ops_func->set_chnl_bw_handler = rtl8821c_set_channel_bw;
3591*4882a593Smuzhiyun
3592*4882a593Smuzhiyun ops_func->set_tx_power_level_handler = rtl8821c_set_tx_power_level;
3593*4882a593Smuzhiyun ops_func->set_tx_power_index_handler = rtl8821c_set_tx_power_index;
3594*4882a593Smuzhiyun ops_func->get_tx_power_index_handler = hal_com_get_txpwr_idx;
3595*4882a593Smuzhiyun
3596*4882a593Smuzhiyun ops_func->hal_dm_watchdog = rtl8821c_phy_haldm_watchdog;
3597*4882a593Smuzhiyun
3598*4882a593Smuzhiyun ops_func->GetHalODMVarHandler = GetHalODMVar;
3599*4882a593Smuzhiyun ops_func->SetHalODMVarHandler = SetHalODMVar;
3600*4882a593Smuzhiyun
3601*4882a593Smuzhiyun ops_func->SetBeaconRelatedRegistersHandler = set_beacon_related_registers;
3602*4882a593Smuzhiyun
3603*4882a593Smuzhiyun #ifdef CONFIG_ANTENNA_DIVERSITY
3604*4882a593Smuzhiyun /*
3605*4882a593Smuzhiyun ops->AntDivBeforeLinkHandler = NULL;
3606*4882a593Smuzhiyun ops->AntDivCompareHandler = NULL;
3607*4882a593Smuzhiyun */
3608*4882a593Smuzhiyun #endif
3609*4882a593Smuzhiyun /*
3610*4882a593Smuzhiyun ops->interface_ps_func = NULL;
3611*4882a593Smuzhiyun */
3612*4882a593Smuzhiyun
3613*4882a593Smuzhiyun ops_func->read_bbreg = rtl8821c_read_bb_reg;
3614*4882a593Smuzhiyun ops_func->write_bbreg = rtl8821c_write_bb_reg;
3615*4882a593Smuzhiyun ops_func->read_rfreg = rtl8821c_read_rf_reg;
3616*4882a593Smuzhiyun ops_func->write_rfreg = rtl8821c_write_rf_reg;
3617*4882a593Smuzhiyun ops_func->read_wmmedca_reg = rtl8821c_read_wmmedca_reg;
3618*4882a593Smuzhiyun
3619*4882a593Smuzhiyun #ifdef CONFIG_HOSTAPD_MLME
3620*4882a593Smuzhiyun /*
3621*4882a593Smuzhiyun ops->hostap_mgnt_xmit_entry = NULL;
3622*4882a593Smuzhiyun */
3623*4882a593Smuzhiyun #endif
3624*4882a593Smuzhiyun /*
3625*4882a593Smuzhiyun ops->EfusePowerSwitch = NULL;
3626*4882a593Smuzhiyun ops->BTEfusePowerSwitch = NULL;
3627*4882a593Smuzhiyun ops->ReadEFuse = NULL;
3628*4882a593Smuzhiyun ops->EFUSEGetEfuseDefinition = NULL;
3629*4882a593Smuzhiyun ops->EfuseGetCurrentSize = NULL;
3630*4882a593Smuzhiyun ops->Efuse_PgPacketRead = NULL;
3631*4882a593Smuzhiyun ops->Efuse_PgPacketWrite = NULL;
3632*4882a593Smuzhiyun ops->Efuse_WordEnableDataWrite = NULL;
3633*4882a593Smuzhiyun ops->Efuse_PgPacketWrite_BT = NULL;
3634*4882a593Smuzhiyun */
3635*4882a593Smuzhiyun #ifdef DBG_CONFIG_ERROR_DETECT
3636*4882a593Smuzhiyun ops_func->sreset_init_value = sreset_init_value;
3637*4882a593Smuzhiyun ops_func->sreset_reset_value = sreset_reset_value;
3638*4882a593Smuzhiyun ops_func->silentreset = sreset_reset;
3639*4882a593Smuzhiyun ops_func->sreset_xmit_status_check = xmit_status_check;
3640*4882a593Smuzhiyun ops_func->sreset_linked_status_check = linked_status_check;
3641*4882a593Smuzhiyun ops_func->sreset_get_wifi_status = sreset_get_wifi_status;
3642*4882a593Smuzhiyun ops_func->sreset_inprogress = sreset_inprogress;
3643*4882a593Smuzhiyun #endif /* DBG_CONFIG_ERROR_DETECT */
3644*4882a593Smuzhiyun
3645*4882a593Smuzhiyun #ifdef CONFIG_IOL
3646*4882a593Smuzhiyun /*
3647*4882a593Smuzhiyun ops->IOL_exec_cmds_sync = NULL;
3648*4882a593Smuzhiyun */
3649*4882a593Smuzhiyun #endif
3650*4882a593Smuzhiyun
3651*4882a593Smuzhiyun ops_func->hal_notch_filter = rtl8821c_notch_filter_switch;
3652*4882a593Smuzhiyun ops_func->hal_mac_c2h_handler = c2h_handler_rtl8821c;
3653*4882a593Smuzhiyun ops_func->fill_h2c_cmd = rtl8821c_fillh2ccmd;
3654*4882a593Smuzhiyun ops_func->fill_fake_txdesc = fill_fake_txdesc;
3655*4882a593Smuzhiyun ops_func->fw_dl = rtl8821c_fw_dl;
3656*4882a593Smuzhiyun
3657*4882a593Smuzhiyun #ifdef CONFIG_LPS_PG
3658*4882a593Smuzhiyun ops_func->fw_mem_dl = rtl8821c_fw_mem_dl;
3659*4882a593Smuzhiyun #endif
3660*4882a593Smuzhiyun #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
3661*4882a593Smuzhiyun /*
3662*4882a593Smuzhiyun ops->clear_interrupt = NULL;
3663*4882a593Smuzhiyun */
3664*4882a593Smuzhiyun #endif
3665*4882a593Smuzhiyun /*
3666*4882a593Smuzhiyun ops_func->hal_get_tx_buff_rsvd_page_num = NULL;
3667*4882a593Smuzhiyun */
3668*4882a593Smuzhiyun #ifdef CONFIG_GPIO_API
3669*4882a593Smuzhiyun /*
3670*4882a593Smuzhiyun ops->update_hisr_hsisr_ind = NULL;
3671*4882a593Smuzhiyun */
3672*4882a593Smuzhiyun #endif
3673*4882a593Smuzhiyun
3674*4882a593Smuzhiyun /* HALMAC related functions */
3675*4882a593Smuzhiyun ops_func->init_mac_register = rtl8821c_init_phy_parameter_mac;
3676*4882a593Smuzhiyun ops_func->init_phy = rtl8821c_phy_init;
3677*4882a593Smuzhiyun
3678*4882a593Smuzhiyun }
3679