1/****************************************************************************** 2 * 3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of version 2 of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * You should have received a copy of the GNU General Public License along with 15 * this program; if not, write to the Free Software Foundation, Inc., 16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 17 * 18 * 19 ******************************************************************************/ 20#include <osdep_service.h> 21#include <drv_types.h> 22 23#include <hal_intf.h> 24#include <hal_com.h> 25#include <rtl8188e_hal.h> 26 27#define _HAL_INIT_C_ 28 29void dump_chip_info(struct HAL_VERSION chip_vers) 30{ 31 uint cnt = 0; 32 char buf[128]; 33 34 if (IS_81XXC(chip_vers)) { 35 cnt += sprintf((buf+cnt), "Chip Version Info: %s_", 36 IS_92C_SERIAL(chip_vers) ? 37 "CHIP_8192C" : "CHIP_8188C"); 38 } else if (IS_92D(chip_vers)) { 39 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8192D_"); 40 } else if (IS_8723_SERIES(chip_vers)) { 41 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8723A_"); 42 } else if (IS_8188E(chip_vers)) { 43 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8188E_"); 44 } 45 46 cnt += sprintf((buf+cnt), "%s_", IS_NORMAL_CHIP(chip_vers) ? 47 "Normal_Chip" : "Test_Chip"); 48 cnt += sprintf((buf+cnt), "%s_", IS_CHIP_VENDOR_TSMC(chip_vers) ? 49 "TSMC" : "UMC"); 50 if (IS_A_CUT(chip_vers)) 51 cnt += sprintf((buf+cnt), "A_CUT_"); 52 else if (IS_B_CUT(chip_vers)) 53 cnt += sprintf((buf+cnt), "B_CUT_"); 54 else if (IS_C_CUT(chip_vers)) 55 cnt += sprintf((buf+cnt), "C_CUT_"); 56 else if (IS_D_CUT(chip_vers)) 57 cnt += sprintf((buf+cnt), "D_CUT_"); 58 else if (IS_E_CUT(chip_vers)) 59 cnt += sprintf((buf+cnt), "E_CUT_"); 60 else 61 cnt += sprintf((buf+cnt), "UNKNOWN_CUT(%d)_", 62 chip_vers.CUTVersion); 63 64 if (IS_1T1R(chip_vers)) 65 cnt += sprintf((buf+cnt), "1T1R_"); 66 else if (IS_1T2R(chip_vers)) 67 cnt += sprintf((buf+cnt), "1T2R_"); 68 else if (IS_2T2R(chip_vers)) 69 cnt += sprintf((buf+cnt), "2T2R_"); 70 else 71 cnt += sprintf((buf+cnt), "UNKNOWN_RFTYPE(%d)_", 72 chip_vers.RFType); 73 74 cnt += sprintf((buf+cnt), "RomVer(%d)\n", chip_vers.ROMVer); 75 76 pr_info("%s", buf); 77} 78 79#define CHAN_PLAN_HW 0x80 80 81u8 /* return the final channel plan decision */ 82hal_com_get_channel_plan(struct adapter *padapter, u8 hw_channel_plan, 83 u8 sw_channel_plan, u8 def_channel_plan, 84 bool load_fail) 85{ 86 u8 sw_cfg; 87 u8 chnlplan; 88 89 sw_cfg = true; 90 if (!load_fail) { 91 if (!rtw_is_channel_plan_valid(sw_channel_plan)) 92 sw_cfg = false; 93 if (hw_channel_plan & CHAN_PLAN_HW) 94 sw_cfg = false; 95 } 96 97 if (sw_cfg) 98 chnlplan = sw_channel_plan; 99 else 100 chnlplan = hw_channel_plan & (~CHAN_PLAN_HW); 101 102 if (!rtw_is_channel_plan_valid(chnlplan)) 103 chnlplan = def_channel_plan; 104 105 return chnlplan; 106} 107 108u8 MRateToHwRate(u8 rate) 109{ 110 u8 ret = DESC_RATE1M; 111 112 switch (rate) { 113 /* CCK and OFDM non-HT rates */ 114 case IEEE80211_CCK_RATE_1MB: 115 ret = DESC_RATE1M; 116 break; 117 case IEEE80211_CCK_RATE_2MB: 118 ret = DESC_RATE2M; 119 break; 120 case IEEE80211_CCK_RATE_5MB: 121 ret = DESC_RATE5_5M; 122 break; 123 case IEEE80211_CCK_RATE_11MB: 124 ret = DESC_RATE11M; 125 break; 126 case IEEE80211_OFDM_RATE_6MB: 127 ret = DESC_RATE6M; 128 break; 129 case IEEE80211_OFDM_RATE_9MB: 130 ret = DESC_RATE9M; 131 break; 132 case IEEE80211_OFDM_RATE_12MB: 133 ret = DESC_RATE12M; 134 break; 135 case IEEE80211_OFDM_RATE_18MB: 136 ret = DESC_RATE18M; 137 break; 138 case IEEE80211_OFDM_RATE_24MB: 139 ret = DESC_RATE24M; 140 break; 141 case IEEE80211_OFDM_RATE_36MB: 142 ret = DESC_RATE36M; 143 break; 144 case IEEE80211_OFDM_RATE_48MB: 145 ret = DESC_RATE48M; 146 break; 147 case IEEE80211_OFDM_RATE_54MB: 148 ret = DESC_RATE54M; 149 break; 150 default: 151 break; 152 } 153 return ret; 154} 155 156void HalSetBrateCfg(struct adapter *adapt, u8 *brates, u16 *rate_cfg) 157{ 158 u8 i, is_brate, brate; 159 160 for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) { 161 is_brate = brates[i] & IEEE80211_BASIC_RATE_MASK; 162 brate = brates[i] & 0x7f; 163 164 if (is_brate) { 165 switch (brate) { 166 case IEEE80211_CCK_RATE_1MB: 167 *rate_cfg |= RATE_1M; 168 break; 169 case IEEE80211_CCK_RATE_2MB: 170 *rate_cfg |= RATE_2M; 171 break; 172 case IEEE80211_CCK_RATE_5MB: 173 *rate_cfg |= RATE_5_5M; 174 break; 175 case IEEE80211_CCK_RATE_11MB: 176 *rate_cfg |= RATE_11M; 177 break; 178 case IEEE80211_OFDM_RATE_6MB: 179 *rate_cfg |= RATE_6M; 180 break; 181 case IEEE80211_OFDM_RATE_9MB: 182 *rate_cfg |= RATE_9M; 183 break; 184 case IEEE80211_OFDM_RATE_12MB: 185 *rate_cfg |= RATE_12M; 186 break; 187 case IEEE80211_OFDM_RATE_18MB: 188 *rate_cfg |= RATE_18M; 189 break; 190 case IEEE80211_OFDM_RATE_24MB: 191 *rate_cfg |= RATE_24M; 192 break; 193 case IEEE80211_OFDM_RATE_36MB: 194 *rate_cfg |= RATE_36M; 195 break; 196 case IEEE80211_OFDM_RATE_48MB: 197 *rate_cfg |= RATE_48M; 198 break; 199 case IEEE80211_OFDM_RATE_54MB: 200 *rate_cfg |= RATE_54M; 201 break; 202 } 203 } 204 } 205} 206 207static void one_out_pipe(struct adapter *adapter) 208{ 209 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter); 210 211 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */ 212 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */ 213 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];/* BE */ 214 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */ 215 216 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ 217 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ 218 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ 219 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ 220} 221 222static void two_out_pipe(struct adapter *adapter, bool wifi_cfg) 223{ 224 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter); 225 226 if (wifi_cfg) { /* WMM */ 227 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */ 228 /* 0, 1, 0, 1, 0, 0, 0, 0, 0}; */ 229 /* 0:H, 1:L */ 230 231 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];/* VO */ 232 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */ 233 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */ 234 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */ 235 236 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ 237 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ 238 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ 239 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ 240 241 } else {/* typical setting */ 242 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */ 243 /* 1, 1, 0, 0, 0, 0, 0, 0, 0}; */ 244 /* 0:H, 1:L */ 245 246 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */ 247 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */ 248 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */ 249 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */ 250 251 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ 252 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ 253 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ 254 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ 255 } 256} 257 258static void three_out_pipe(struct adapter *adapter, bool wifi_cfg) 259{ 260 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter); 261 262 if (wifi_cfg) {/* for WMM */ 263 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */ 264 /* 1, 2, 1, 0, 0, 0, 0, 0, 0}; */ 265 /* 0:H, 1:N, 2:L */ 266 267 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */ 268 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */ 269 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */ 270 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */ 271 272 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ 273 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ 274 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ 275 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ 276 277 } else {/* typical setting */ 278 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */ 279 /* 2, 2, 1, 0, 0, 0, 0, 0, 0}; */ 280 /* 0:H, 1:N, 2:L */ 281 282 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */ 283 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */ 284 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */ 285 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];/* BK */ 286 287 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */ 288 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */ 289 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */ 290 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */ 291 } 292} 293 294bool Hal_MappingOutPipe(struct adapter *adapter, u8 numoutpipe) 295{ 296 struct registry_priv *pregistrypriv = &adapter->registrypriv; 297 bool wifi_cfg = (pregistrypriv->wifi_spec) ? true : false; 298 bool result = true; 299 300 switch (numoutpipe) { 301 case 2: 302 two_out_pipe(adapter, wifi_cfg); 303 break; 304 case 3: 305 three_out_pipe(adapter, wifi_cfg); 306 break; 307 case 1: 308 one_out_pipe(adapter); 309 break; 310 default: 311 result = false; 312 break; 313 } 314 return result; 315} 316 317void hal_init_macaddr(struct adapter *adapter) 318{ 319 rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, 320 adapter->eeprompriv.mac_addr); 321} 322