• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 
8 #include "odm_precomp.h"
9 
10 static u32 edca_setting_DL_GMode[HT_IOT_PEER_MAX] = {
11 /*UNKNOWN, REALTEK_90, ALTEK_92SE	BROADCOM, LINK	ATHEROS,
12  *CISCO, MERU, MARVELL, 92U_AP, SELF_AP
13  */
14 	0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322,
15 	0xa42b, 0x5ea42b, 0xa44f, 0x5e4322, 0x5ea42b
16 };
17 
18 static u32 edca_setting_UL[HT_IOT_PEER_MAX] = {
19 /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM, RALINK, ATHEROS,
20  *CISCO, MERU, MARVELL, 92U_AP, SELF_AP(DownLink/Tx)
21  */
22 	0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422,	0x5ea322,
23 	0x3ea430, 0x5ea42b, 0x5ea44f, 0x5e4322, 0x5e4322};
24 
25 static u32 edca_setting_DL[HT_IOT_PEER_MAX] = {
26 /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM, RALINK, ATHEROS,
27  *CISCO, MERU, MARVELL, 92U_AP, SELF_AP(UpLink/Rx)
28  */
29 	0xa44f, 0x5ea44f, 0x5e4322, 0x5ea42b, 0xa44f, 0xa630,
30 	0x5ea630, 0x5ea42b, 0xa44f, 0xa42b, 0xa42b};
31 
ODM_EdcaTurboInit(void * pDM_VOID)32 void ODM_EdcaTurboInit(void *pDM_VOID)
33 {
34 	PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
35 	struct adapter *Adapter = pDM_Odm->Adapter;
36 
37 	pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = false;
38 	pDM_Odm->DM_EDCA_Table.bIsCurRDLState = false;
39 	Adapter->recvpriv.bIsAnyNonBEPkts = false;
40 
41 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD,
42 		     ("Original VO PARAM: 0x%x\n",
43 		      rtw_read32(pDM_Odm->Adapter, ODM_EDCA_VO_PARAM)));
44 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD,
45 		     ("Original VI PARAM: 0x%x\n",
46 		      rtw_read32(pDM_Odm->Adapter, ODM_EDCA_VI_PARAM)));
47 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD,
48 		     ("Original BE PARAM: 0x%x\n",
49 		      rtw_read32(pDM_Odm->Adapter, ODM_EDCA_BE_PARAM)));
50 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD,
51 		     ("Original BK PARAM: 0x%x\n",
52 		      rtw_read32(pDM_Odm->Adapter, ODM_EDCA_BK_PARAM)));
53 }	/*  ODM_InitEdcaTurbo */
54 
odm_EdcaTurboCheck(void * pDM_VOID)55 void odm_EdcaTurboCheck(void *pDM_VOID)
56 {
57 	/*  In HW integration first stage, we provide 4 different handles to
58 	 *  operate at the same time. In stage2/3, we need to prove universal
59 	 *  interface and merge all HW dynamic mechanism.
60 	 */
61 	PDM_ODM_T		pDM_Odm = (PDM_ODM_T)pDM_VOID;
62 
63 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD,
64 		     ("odm_EdcaTurboCheck ========================>\n"));
65 
66 	if (!(pDM_Odm->SupportAbility & ODM_MAC_EDCA_TURBO))
67 		return;
68 
69 	odm_EdcaTurboCheckCE(pDM_Odm);
70 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD,
71 		     ("<========================odm_EdcaTurboCheck\n"));
72 }	/*  odm_CheckEdcaTurbo */
73 
odm_EdcaTurboCheckCE(void * pDM_VOID)74 void odm_EdcaTurboCheckCE(void *pDM_VOID)
75 {
76 	PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
77 	struct adapter *Adapter = pDM_Odm->Adapter;
78 	struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);
79 	struct recv_priv *precvpriv = &(Adapter->recvpriv);
80 	struct registry_priv *pregpriv = &Adapter->registrypriv;
81 	struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
82 	struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
83 	u32 EDCA_BE_UL = 0x5ea42b;
84 	u32 EDCA_BE_DL = 0x5ea42b;
85 	u32 iot_peer = 0;
86 	u8 wirelessmode = 0xFF;		/* invalid value */
87 	u32 trafficIndex;
88 	u32 edca_param;
89 	u64	cur_tx_bytes = 0;
90 	u64	cur_rx_bytes = 0;
91 	u8 bbtchange = false;
92 	u8 biasonrx = false;
93 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
94 
95 	if (!pDM_Odm->bLinked) {
96 		precvpriv->bIsAnyNonBEPkts = false;
97 		return;
98 	}
99 
100 	if (pregpriv->wifi_spec == 1) {
101 		precvpriv->bIsAnyNonBEPkts = false;
102 		return;
103 	}
104 
105 	if (pDM_Odm->pwirelessmode)
106 		wirelessmode = *(pDM_Odm->pwirelessmode);
107 
108 	iot_peer = pmlmeinfo->assoc_AP_vendor;
109 
110 	if (iot_peer >=  HT_IOT_PEER_MAX) {
111 		precvpriv->bIsAnyNonBEPkts = false;
112 		return;
113 	}
114 
115 	/*  Check if the status needs to be changed. */
116 	if ((bbtchange) || (!precvpriv->bIsAnyNonBEPkts)) {
117 		cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;
118 		cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;
119 
120 		/* traffic, TX or RX */
121 		if (biasonrx) {
122 			if (cur_tx_bytes > (cur_rx_bytes << 2)) {
123 				/*  Uplink TP is present. */
124 				trafficIndex = UP_LINK;
125 			} else { /*  Balance TP is present. */
126 				trafficIndex = DOWN_LINK;
127 			}
128 		} else {
129 			if (cur_rx_bytes > (cur_tx_bytes << 2)) {
130 				/*  Downlink TP is present. */
131 				trafficIndex = DOWN_LINK;
132 			} else { /*  Balance TP is present. */
133 				trafficIndex = UP_LINK;
134 			}
135 		}
136 
137 		/* 92D txop can't be set to 0x3e for cisco1250 */
138 		if ((iot_peer == HT_IOT_PEER_CISCO) &&
139 		    (wirelessmode == ODM_WM_N24G)) {
140 			EDCA_BE_DL = edca_setting_DL[iot_peer];
141 			EDCA_BE_UL = edca_setting_UL[iot_peer];
142 		} else if ((iot_peer == HT_IOT_PEER_CISCO) &&
143 			   ((wirelessmode == ODM_WM_G) ||
144 			    (wirelessmode == (ODM_WM_B | ODM_WM_G)) ||
145 			    (wirelessmode == ODM_WM_A) ||
146 			    (wirelessmode == ODM_WM_B))) {
147 			EDCA_BE_DL = edca_setting_DL_GMode[iot_peer];
148 		} else if ((iot_peer == HT_IOT_PEER_AIRGO) &&
149 			   ((wirelessmode == ODM_WM_G) ||
150 			    (wirelessmode == ODM_WM_A))) {
151 			EDCA_BE_DL = 0xa630;
152 		} else if (iot_peer == HT_IOT_PEER_MARVELL) {
153 			EDCA_BE_DL = edca_setting_DL[iot_peer];
154 			EDCA_BE_UL = edca_setting_UL[iot_peer];
155 		} else if (iot_peer == HT_IOT_PEER_ATHEROS) {
156 			/*  Set DL EDCA for Atheros peer to 0x3ea42b. */
157 			EDCA_BE_DL = edca_setting_DL[iot_peer];
158 		}
159 
160 		if (trafficIndex == DOWN_LINK)
161 			edca_param = EDCA_BE_DL;
162 		else
163 			edca_param = EDCA_BE_UL;
164 
165 		rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
166 
167 		pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
168 
169 		pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = true;
170 	} else {
171 		/*  Turn Off EDCA turbo here. */
172 		/*  Restore original EDCA according to the declaration of AP. */
173 		 if (pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA) {
174 			rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
175 			pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = false;
176 		}
177 	}
178 }
179