| /* |
| ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/rlm_domain.c#2 |
| */ |
| |
| /*! \file "rlm_domain.c" |
| \brief |
| |
| */ |
| |
| /* |
| ** Log: rlm_domain.c |
| ** |
| ** 01 23 2013 eason.tsai |
| ** [BORA00002255] [MT6630 Wi-Fi][Driver] develop |
| ** Rollback //BORA/DEV/MT6630WIFI_DRV/mgmt/rlm_domain.c to revision 1 |
| ** |
| ** 09 17 2012 cm.chang |
| ** [BORA00002149] [MT6630 Wi-Fi] Initial software development |
| ** Duplicate source from MT6620 v2.3 driver branch |
| ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base) |
| * |
| * 11 10 2011 cm.chang |
| * NULL |
| * Modify debug message for XLOG |
| * |
| * 09 29 2011 cm.chang |
| * NULL |
| * Change the function prototype of rlmDomainGetChnlList() |
| * |
| * 09 23 2011 cm.chang |
| * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code |
| * Let channel number to zero if band is illegal |
| * |
| * 09 22 2011 cm.chang |
| * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code |
| * Exclude channel list with illegal band |
| * |
| * 09 15 2011 cm.chang |
| * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code |
| * Use defined country group to have a change to add new group |
| * |
| * 09 08 2011 cm.chang |
| * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code |
| * Use new fields ucChannelListMap and ucChannelListIndex in NVRAM |
| * |
| * 08 31 2011 cm.chang |
| * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code |
| * . |
| * |
| * 06 01 2011 cm.chang |
| * [WCXRP00000756] [MT6620 Wi-Fi][Driver] 1. AIS follow channel of BOW 2. Provide legal channel function |
| * Provide legal channel function based on domain |
| * |
| * 03 19 2011 yuche.tsai |
| * [WCXRP00000584] [Volunteer Patch][MT6620][Driver] Add beacon timeout support for WiFi Direct. |
| * Add beacon timeout support for WiFi Direct Network. |
| * |
| * 03 02 2011 terry.wu |
| * [WCXRP00000505] [MT6620 Wi-Fi][Driver/FW] WiFi Direct Integration |
| * Export rlmDomainGetDomainInfo for p2p driver. |
| * |
| * 01 12 2011 cm.chang |
| * [WCXRP00000354] [MT6620 Wi-Fi][Driver][FW] Follow NVRAM bandwidth setting |
| * User-defined bandwidth is for 2.4G and 5G individually |
| * |
| * 12 07 2010 cm.chang |
| * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant |
| * 1. Country code is from NVRAM or supplicant |
| * 2. Change band definition in CMD/EVENT. |
| * |
| * 07 08 2010 cp.wu |
| * |
| * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository. |
| * |
| * 07 08 2010 cm.chang |
| * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver |
| * Check draft RLM code for HT cap |
| * |
| * 03 25 2010 cm.chang |
| * [BORA00000018]Integrate WIFI part into BORA for the 1st time |
| * Filter out not supported RF freq when reporting available chnl list |
| * |
| * 01 22 2010 cm.chang |
| * [BORA00000018]Integrate WIFI part into BORA for the 1st time |
| * Support protection and bandwidth switch |
| * |
| * 01 13 2010 cm.chang |
| * [BORA00000018]Integrate WIFI part into BORA for the 1st time |
| * Provide query function about full channle list. |
| * |
| * Dec 1 2009 mtk01104 |
| * [BORA00000018] Integrate WIFI part into BORA for the 1st time |
| * |
| * |
| ** |
| */ |
| |
| /******************************************************************************* |
| * C O M P I L E R F L A G S |
| ******************************************************************************** |
| */ |
| |
| /******************************************************************************* |
| * E X T E R N A L R E F E R E N C E S |
| ******************************************************************************** |
| */ |
| #include "precomp.h" |
| |
| /******************************************************************************* |
| * C O N S T A N T S |
| ******************************************************************************** |
| */ |
| |
| /******************************************************************************* |
| * D A T A T Y P E S |
| ******************************************************************************** |
| */ |
| |
| /******************************************************************************* |
| * P U B L I C D A T A |
| ******************************************************************************** |
| */ |
| |
| /* The following country or domain shall be set from host driver. |
| * And host driver should pass specified DOMAIN_INFO_ENTRY to MT6620 as |
| * the channel list of being a STA to do scanning/searching AP or being an |
| * AP to choose an adequate channel if auto-channel is set. |
| */ |
| |
| /* Define mapping tables between country code and its channel set |
| */ |
| static const UINT_16 g_u2CountryGroup0[] = { |
| COUNTRY_CODE_AO, COUNTRY_CODE_BZ, COUNTRY_CODE_BJ, COUNTRY_CODE_BT, |
| COUNTRY_CODE_BO, COUNTRY_CODE_BI, COUNTRY_CODE_CM, COUNTRY_CODE_CF, |
| COUNTRY_CODE_TD, COUNTRY_CODE_KM, COUNTRY_CODE_CD, COUNTRY_CODE_CG, |
| COUNTRY_CODE_CI, COUNTRY_CODE_DJ, COUNTRY_CODE_GQ, COUNTRY_CODE_ER, |
| COUNTRY_CODE_FJ, COUNTRY_CODE_GA, COUNTRY_CODE_GM, COUNTRY_CODE_GN, |
| COUNTRY_CODE_GW, COUNTRY_CODE_RKS, COUNTRY_CODE_KG, COUNTRY_CODE_LY, |
| COUNTRY_CODE_MG, COUNTRY_CODE_ML, COUNTRY_CODE_NR, COUNTRY_CODE_NC, |
| COUNTRY_CODE_ST, COUNTRY_CODE_SC, COUNTRY_CODE_SL, COUNTRY_CODE_SB, |
| COUNTRY_CODE_SO, COUNTRY_CODE_SR, COUNTRY_CODE_SZ, COUNTRY_CODE_TJ, |
| COUNTRY_CODE_TG, COUNTRY_CODE_TO, COUNTRY_CODE_TM, COUNTRY_CODE_TV, |
| COUNTRY_CODE_VU, COUNTRY_CODE_YE |
| }; |
| |
| static const UINT_16 g_u2CountryGroup1[] = { |
| COUNTRY_CODE_AS, COUNTRY_CODE_AI, COUNTRY_CODE_BM, COUNTRY_CODE_CA, |
| COUNTRY_CODE_KY, COUNTRY_CODE_GU, COUNTRY_CODE_FM, COUNTRY_CODE_PR, |
| COUNTRY_CODE_US, COUNTRY_CODE_VI, |
| |
| }; |
| |
| static const UINT_16 g_u2CountryGroup2[] = { |
| COUNTRY_CODE_AR, COUNTRY_CODE_AU, COUNTRY_CODE_AZ, COUNTRY_CODE_BW, |
| COUNTRY_CODE_KH, COUNTRY_CODE_CX, COUNTRY_CODE_CO, COUNTRY_CODE_CR, |
| COUNTRY_CODE_EC, COUNTRY_CODE_GD, COUNTRY_CODE_GT, COUNTRY_CODE_HK, |
| COUNTRY_CODE_KI, COUNTRY_CODE_LB, COUNTRY_CODE_LR, COUNTRY_CODE_MN, |
| COUNTRY_CODE_AN, COUNTRY_CODE_NZ, COUNTRY_CODE_NI, COUNTRY_CODE_PW, |
| COUNTRY_CODE_PY, COUNTRY_CODE_PE, COUNTRY_CODE_PH, COUNTRY_CODE_WS, |
| COUNTRY_CODE_SG, COUNTRY_CODE_LK, COUNTRY_CODE_TH, COUNTRY_CODE_TT, |
| COUNTRY_CODE_UY, COUNTRY_CODE_VN |
| }; |
| |
| static const UINT_16 g_u2CountryGroup3[] = { |
| COUNTRY_CODE_AW, COUNTRY_CODE_LA, COUNTRY_CODE_SA, COUNTRY_CODE_AE, |
| COUNTRY_CODE_UG |
| }; |
| |
| static const UINT_16 g_u2CountryGroup4[] = { COUNTRY_CODE_MM }; |
| |
| static const UINT_16 g_u2CountryGroup5[] = { |
| COUNTRY_CODE_AL, COUNTRY_CODE_DZ, COUNTRY_CODE_AD, COUNTRY_CODE_AT, |
| COUNTRY_CODE_BY, COUNTRY_CODE_BE, COUNTRY_CODE_BA, COUNTRY_CODE_VG, |
| COUNTRY_CODE_BG, COUNTRY_CODE_CV, COUNTRY_CODE_HR, COUNTRY_CODE_CY, |
| COUNTRY_CODE_CZ, COUNTRY_CODE_DK, COUNTRY_CODE_EE, COUNTRY_CODE_ET, |
| COUNTRY_CODE_FI, COUNTRY_CODE_FR, COUNTRY_CODE_GF, COUNTRY_CODE_PF, |
| COUNTRY_CODE_TF, COUNTRY_CODE_GE, COUNTRY_CODE_DE, COUNTRY_CODE_GH, |
| COUNTRY_CODE_GR, COUNTRY_CODE_GP, COUNTRY_CODE_HU, COUNTRY_CODE_IS, |
| COUNTRY_CODE_IQ, COUNTRY_CODE_IE, COUNTRY_CODE_IT, COUNTRY_CODE_KE, |
| COUNTRY_CODE_LV, COUNTRY_CODE_LS, COUNTRY_CODE_LI, COUNTRY_CODE_LT, |
| COUNTRY_CODE_LU, COUNTRY_CODE_MK, COUNTRY_CODE_MT, COUNTRY_CODE_MQ, |
| COUNTRY_CODE_MR, COUNTRY_CODE_MU, COUNTRY_CODE_YT, COUNTRY_CODE_MD, |
| COUNTRY_CODE_MC, COUNTRY_CODE_ME, COUNTRY_CODE_MS, COUNTRY_CODE_NL, |
| COUNTRY_CODE_NO, COUNTRY_CODE_OM, COUNTRY_CODE_PL, COUNTRY_CODE_PT, |
| COUNTRY_CODE_RE, COUNTRY_CODE_RO, COUNTRY_CODE_MF, COUNTRY_CODE_SM, |
| COUNTRY_CODE_SN, COUNTRY_CODE_RS, COUNTRY_CODE_SK, COUNTRY_CODE_SI, |
| COUNTRY_CODE_ZA, COUNTRY_CODE_ES, COUNTRY_CODE_SE, COUNTRY_CODE_CH, |
| COUNTRY_CODE_TR, COUNTRY_CODE_TC, COUNTRY_CODE_GB, COUNTRY_CODE_VA, |
| COUNTRY_CODE_FR |
| }; |
| static const UINT_16 g_u2CountryGroup6[] = { COUNTRY_CODE_JP }; |
| |
| static const UINT_16 g_u2CountryGroup7[] = { |
| COUNTRY_CODE_AM, COUNTRY_CODE_IL, COUNTRY_CODE_KW, COUNTRY_CODE_MA, |
| COUNTRY_CODE_NE, COUNTRY_CODE_TN, COUNTRY_CODE_EH |
| }; |
| static const UINT_16 g_u2CountryGroup8[] = { COUNTRY_CODE_NP }; |
| static const UINT_16 g_u2CountryGroup9[] = { COUNTRY_CODE_AF }; |
| |
| static const UINT_16 g_u2CountryGroup10[] = { |
| COUNTRY_CODE_AG, COUNTRY_CODE_BS, COUNTRY_CODE_BH, COUNTRY_CODE_BB, |
| COUNTRY_CODE_BN, COUNTRY_CODE_CL, COUNTRY_CODE_CN, COUNTRY_CODE_EG, |
| COUNTRY_CODE_SV, COUNTRY_CODE_IN, COUNTRY_CODE_MY, COUNTRY_CODE_MV, |
| COUNTRY_CODE_PA, COUNTRY_CODE_VE, COUNTRY_CODE_ZM, |
| |
| }; |
| static const UINT_16 g_u2CountryGroup11[] = { COUNTRY_CODE_JO, COUNTRY_CODE_PG }; |
| |
| static const UINT_16 g_u2CountryGroup12[] = { |
| COUNTRY_CODE_BF, COUNTRY_CODE_GY, COUNTRY_CODE_HT, COUNTRY_CODE_HN, |
| COUNTRY_CODE_JM, COUNTRY_CODE_MO, COUNTRY_CODE_MW, COUNTRY_CODE_PK, |
| COUNTRY_CODE_QA, COUNTRY_CODE_RW, COUNTRY_CODE_KN, COUNTRY_CODE_TZ, |
| |
| }; |
| static const UINT_16 g_u2CountryGroup13[] = { COUNTRY_CODE_ID }; |
| static const UINT_16 g_u2CountryGroup14[] = { COUNTRY_CODE_KR }; |
| static const UINT_16 g_u2CountryGroup15[] = { COUNTRY_CODE_NG }; |
| |
| static const UINT_16 g_u2CountryGroup16[] = { |
| COUNTRY_CODE_BD, COUNTRY_CODE_BR, COUNTRY_CODE_DM, COUNTRY_CODE_DO, |
| COUNTRY_CODE_FK, COUNTRY_CODE_KZ, COUNTRY_CODE_MX, COUNTRY_CODE_MZ, |
| COUNTRY_CODE_NA, COUNTRY_CODE_RU, COUNTRY_CODE_LC, COUNTRY_CODE_VC, |
| COUNTRY_CODE_UA, COUNTRY_CODE_UZ, COUNTRY_CODE_ZW |
| }; |
| static const UINT_16 g_u2CountryGroup17[] = { COUNTRY_CODE_MP }; |
| static const UINT_16 g_u2CountryGroup18[] = { COUNTRY_CODE_TW }; |
| |
| static const UINT_16 g_u2CountryGroup19[] = { |
| COUNTRY_CODE_CK, COUNTRY_CODE_CU, COUNTRY_CODE_TL, COUNTRY_CODE_FO, |
| COUNTRY_CODE_GI, COUNTRY_CODE_GG, COUNTRY_CODE_IR, COUNTRY_CODE_IM, |
| COUNTRY_CODE_JE, COUNTRY_CODE_KP, COUNTRY_CODE_MH, COUNTRY_CODE_NU, |
| COUNTRY_CODE_NF, COUNTRY_CODE_PS, COUNTRY_CODE_PN, COUNTRY_CODE_PM, |
| COUNTRY_CODE_SS, COUNTRY_CODE_SD, COUNTRY_CODE_SY |
| }; |
| |
| static const UINT_16 g_u2CountryGroup20[] = { |
| COUNTRY_CODE_EU |
| /* When country code is not found, this domain info will be used. |
| * So mark all country codes to reduce search time. 20110908 |
| */ |
| }; |
| |
| DOMAIN_INFO_ENTRY arSupportedRegDomains[] = { |
| { |
| (PUINT_16) g_u2CountryGroup0, sizeof(g_u2CountryGroup0) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_LOW_NA */ |
| {118, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_MID_NA */ |
| {121, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_WW_NA */ |
| {125, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_UPPER_NA */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup1, sizeof(g_u2CountryGroup1) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 11, FALSE} |
| , /* CH_SET_2G4_1_11 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 12, FALSE} |
| , /* CH_SET_UNII_WW_100_144 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE} |
| , /* CH_SET_UNII_UPPER_149_165 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup2, sizeof(g_u2CountryGroup2) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 12, FALSE} |
| , /* CH_SET_UNII_WW_100_144 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE} |
| , /* CH_SET_UNII_UPPER_149_165 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup3, sizeof(g_u2CountryGroup3) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 12, FALSE} |
| , /* CH_SET_UNII_WW_100_144 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 4, FALSE} |
| , /* CH_SET_UNII_UPPER_149_161 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup4, sizeof(g_u2CountryGroup4) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 12, FALSE} |
| , /* CH_SET_UNII_WW_100_144 */ |
| {125, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_UPPER_NA */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup5, sizeof(g_u2CountryGroup5) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 11, FALSE} |
| , /* CH_SET_UNII_WW_100_140 */ |
| {125, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_UPPER_NA */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup6, sizeof(g_u2CountryGroup6) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| {82, BAND_2G4, CHNL_SPAN_5, 14, 1, FALSE} |
| , /* CH_SET_2G4_14_14 */ |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 11, FALSE} |
| , /* CH_SET_UNII_WW_100_140 */ |
| {125, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_UPPER_NA */ |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup7, sizeof(g_u2CountryGroup7) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_WW_NA */ |
| {125, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_UPPER_NA */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup8, sizeof(g_u2CountryGroup8) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_WW_NA */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 4, FALSE} |
| , /* CH_SET_UNII_UPPER_149_161 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup9, sizeof(g_u2CountryGroup9) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_MID_NA */ |
| {121, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_WW_NA */ |
| {125, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_UPPER_NA */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup10, sizeof(g_u2CountryGroup10) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_WW_NA */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE} |
| , /* CH_SET_UNII_UPPER_149_165 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup11, sizeof(g_u2CountryGroup11) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_MID_NA */ |
| {121, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_WW_NA */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE} |
| , /* CH_SET_UNII_UPPER_149_165 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup12, sizeof(g_u2CountryGroup12) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_LOW_NA */ |
| {118, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_MID_NA */ |
| {121, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_WW_NA */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE} |
| , /* CH_SET_UNII_UPPER_149_165 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup13, sizeof(g_u2CountryGroup13) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_LOW_NA */ |
| {118, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_MID_NA */ |
| {121, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_WW_NA */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 4, FALSE} |
| , /* CH_SET_UNII_UPPER_149_161 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup14, sizeof(g_u2CountryGroup14) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 8, FALSE} |
| , /* CH_SET_UNII_WW_100_128 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 4, FALSE} |
| , /* CH_SET_UNII_UPPER_149_161 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup15, sizeof(g_u2CountryGroup15) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_NULL, 0, 0, 0, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 11, FALSE} |
| , /* CH_SET_UNII_WW_100_140 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE} |
| , /* CH_SET_UNII_UPPER_149_165 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup16, sizeof(g_u2CountryGroup16) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 11, FALSE} |
| , /* CH_SET_UNII_WW_100_140 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE} |
| , /* CH_SET_UNII_UPPER_149_165 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup17, sizeof(g_u2CountryGroup17) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 11, FALSE} |
| , /* CH_SET_2G4_1_11 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 11, FALSE} |
| , /* CH_SET_UNII_WW_100_140 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE} |
| , /* CH_SET_UNII_UPPER_149_165 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup18, sizeof(g_u2CountryGroup18) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 11, FALSE} |
| , /* CH_SET_2G4_1_11 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 11, FALSE} |
| , /* CH_SET_UNII_WW_100_140 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE} |
| , /* CH_SET_UNII_UPPER_149_165 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| (PUINT_16) g_u2CountryGroup19, sizeof(g_u2CountryGroup19) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 12, FALSE} |
| , /* CH_SET_UNII_WW_100_144 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 5, FALSE} |
| , /* CH_SET_UNII_UPPER_149_165 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| , |
| { |
| /* Note: The final one is for Europe union now. */ |
| (PUINT_16) g_u2CountryGroup20, sizeof(g_u2CountryGroup20) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE} |
| , /* CH_SET_2G4_1_13 */ |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, FALSE} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, FALSE} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 12, FALSE} |
| , /* CH_SET_UNII_WW_100_144 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 7, FALSE} |
| , /* CH_SET_UNII_UPPER_149_173 */ |
| {0, BAND_NULL, 0, 0, 0, FALSE} |
| } |
| } |
| }; |
| |
| #define REG_DOMAIN_PASSIVE_DEF_IDX 1 |
| |
| static const UINT_16 g_u2CountryGroup0_Passive[] = { |
| COUNTRY_CODE_TW |
| }; |
| |
| DOMAIN_INFO_ENTRY arSupportedRegDomains_Passive[] = { |
| { |
| (PUINT_16) g_u2CountryGroup0_Passive, sizeof(g_u2CountryGroup0_Passive) / 2, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 0, 0} |
| , /* CH_SET_2G4_1_14_NA */ |
| {82, BAND_2G4, CHNL_SPAN_5, 14, 0, 0} |
| , |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 4, 0} |
| , /* CH_SET_UNII_LOW_36_48 */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, 0} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 11, 0} |
| , /* CH_SET_UNII_WW_100_140 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 0, 0} |
| , /* CH_SET_UNII_UPPER_NA */ |
| } |
| } |
| , |
| |
| { |
| /* default passive channel table is empty */ |
| COUNTRY_CODE_NULL, 0, |
| { |
| {81, BAND_2G4, CHNL_SPAN_5, 1, 0, 0} |
| , /* CH_SET_2G4_1_14_NA */ |
| {82, BAND_2G4, CHNL_SPAN_5, 14, 0, 0} |
| , |
| |
| {115, BAND_5G, CHNL_SPAN_20, 36, 0, 0} |
| , /* CH_SET_UNII_LOW_NA */ |
| {118, BAND_5G, CHNL_SPAN_20, 52, 4, 0} |
| , /* CH_SET_UNII_MID_52_64 */ |
| {121, BAND_5G, CHNL_SPAN_20, 100, 12, 0} |
| , /* CH_SET_UNII_WW_100_144 */ |
| {125, BAND_5G, CHNL_SPAN_20, 149, 0, 0} |
| , /* CH_SET_UNII_UPPER_NA */ |
| } |
| } |
| |
| }; |
| |
| #define REG_DOMAIN_PASSIVE_GROUP_NUM \ |
| (sizeof(arSupportedRegDomains_Passive) / sizeof(DOMAIN_INFO_ENTRY)) |
| |
| #if 0 |
| COUNTRY_CH_SET_T arCountryChSets[] = { |
| /* idx=0: US, Bahamas, Barbados, Bolivia(Voluntary), Dominica (the Commonwealth of Dominica), |
| The Dominican Republic, Haiti */ |
| {CH_SET_2G4_1_11, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_100_140, CH_SET_UNII_UPPER_149_165} |
| , |
| /* idx=1: Brazil, Ecuador, Hong Kong, Mexico, Peru */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_100_140, CH_SET_UNII_UPPER_149_165} |
| , |
| /* idx=2: JP1, Colombia(Voluntary), Paraguay */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_100_140, CH_SET_UNII_UPPER_NA} |
| , |
| /* idx=3: JP2 */ |
| {CH_SET_2G4_1_14, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_100_140, CH_SET_UNII_UPPER_NA} |
| , |
| /* idx=4: CN, Uruguay, Morocco */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_NA, CH_SET_UNII_MID_NA, |
| CH_SET_UNII_WW_NA, CH_SET_UNII_UPPER_149_165} |
| , |
| /* idx=5: Argentina */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_NA, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_NA, CH_SET_UNII_UPPER_149_165} |
| , |
| /* idx=6: Australia, New Zealand */ |
| {CH_SET_2G4_1_11, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_100_140, CH_SET_UNII_UPPER_149_161} |
| , |
| /* idx=7: Russia */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_100_140, CH_SET_UNII_UPPER_149_161} |
| , |
| /* idx=8: Indonesia */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_NA, CH_SET_UNII_MID_NA, |
| CH_SET_UNII_WW_NA, CH_SET_UNII_UPPER_149_161} |
| , |
| /* idx=9: Canada */ |
| {CH_SET_2G4_1_11, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_100_116_132_140, CH_SET_UNII_UPPER_149_165} |
| , |
| /* idx=10: Chile, India, Saudi Arabia, Singapore */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_NA, CH_SET_UNII_UPPER_149_165} |
| , |
| /* idx=11: Israel, Ukraine */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_NA, CH_SET_UNII_UPPER_NA} |
| , |
| /* idx=12: Jordan, Kuwait */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_NA, |
| CH_SET_UNII_WW_NA, CH_SET_UNII_UPPER_NA} |
| , |
| /* idx=13: South Korea */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_100_128, CH_SET_UNII_UPPER_149_165} |
| , |
| /* idx=14: Taiwan */ |
| {CH_SET_2G4_1_11, CH_SET_UNII_LOW_NA, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_100_140, CH_SET_UNII_UPPER_149_165} |
| , |
| /* idx=15: EU all countries */ |
| {CH_SET_2G4_1_13, CH_SET_UNII_LOW_36_48, CH_SET_UNII_MID_52_64, |
| CH_SET_UNII_WW_100_140, CH_SET_UNII_UPPER_149_173} |
| }; |
| #endif |
| |
| #include "rlm_txpwr_init.h" |
| |
| SUBBAND_CHANNEL_T g_rRlmSubBand[] = { |
| |
| {BAND_2G4_LOWER_BOUND, BAND_2G4_UPPER_BOUND, 1, 0} |
| , /* 2.4G */ |
| {UNII1_LOWER_BOUND, UNII1_UPPER_BOUND, 2, 0} |
| , /* ch36,38,40,..,48 */ |
| {UNII2A_LOWER_BOUND, UNII2A_UPPER_BOUND, 2, 0} |
| , /* ch52,54,56,..,64 */ |
| {UNII2C_LOWER_BOUND, UNII2C_UPPER_BOUND, 2, 0} |
| , /* ch100,102,104,...,144 */ |
| {UNII3_LOWER_BOUND, UNII3_UPPER_BOUND, 2, 0} /* ch149,151,153,....,173 */ |
| |
| }; |
| |
| static UINT_16 g_u2HostCountryCode = COUNTRY_CODE_NULL; |
| |
| /******************************************************************************* |
| * P R I V A T E D A T A |
| ******************************************************************************** |
| */ |
| |
| /******************************************************************************* |
| * M A C R O S |
| ******************************************************************************** |
| */ |
| |
| /******************************************************************************* |
| * F U N C T I O N D E C L A R A T I O N S |
| ******************************************************************************** |
| */ |
| |
| /******************************************************************************* |
| * F U N C T I O N S |
| ******************************************************************************** |
| */ |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * \brief |
| * |
| * \param[in/out] |
| * |
| * \return none |
| */ |
| /*----------------------------------------------------------------------------*/ |
| P_DOMAIN_INFO_ENTRY rlmDomainGetDomainInfo(P_ADAPTER_T prAdapter) |
| { |
| #define REG_DOMAIN_DEF_IDX 20 /* EU (Europe Union) */ |
| #define REG_DOMAIN_GROUP_NUM \ |
| (sizeof(arSupportedRegDomains) / sizeof(DOMAIN_INFO_ENTRY)) |
| |
| UINT_16 i, j; |
| P_DOMAIN_INFO_ENTRY prDomainInfo; |
| P_REG_INFO_T prRegInfo; |
| UINT_16 u2TargetCountryCode; |
| |
| ASSERT(prAdapter); |
| |
| if (prAdapter->prDomainInfo) |
| return prAdapter->prDomainInfo; |
| |
| prRegInfo = &prAdapter->prGlueInfo->rRegInfo; |
| |
| DBGLOG(RLM, TRACE, "Domain: map=%d, idx=%d, code=0x%04x\n", |
| prRegInfo->eRegChannelListMap, prRegInfo->ucRegChannelListIndex, |
| prAdapter->rWifiVar.rConnSettings.u2CountryCode); |
| |
| if (prRegInfo->eRegChannelListMap == REG_CH_MAP_TBL_IDX && |
| prRegInfo->ucRegChannelListIndex < REG_DOMAIN_GROUP_NUM) { |
| prDomainInfo = &arSupportedRegDomains[prRegInfo->ucRegChannelListIndex]; |
| goto L_set_domain_info; |
| } else if (prRegInfo->eRegChannelListMap == REG_CH_MAP_CUSTOMIZED) { |
| prDomainInfo = &prRegInfo->rDomainInfo; |
| goto L_set_domain_info; |
| } |
| |
| u2TargetCountryCode = prAdapter->rWifiVar.rConnSettings.u2CountryCode; |
| |
| /* If no matched country code, the final one will be used |
| * The final one is for Europe union now. |
| */ |
| for (i = 0; i < REG_DOMAIN_GROUP_NUM; i++) { |
| prDomainInfo = &arSupportedRegDomains[i]; |
| |
| ASSERT((prDomainInfo->u4CountryNum && prDomainInfo->pu2CountryGroup) || |
| prDomainInfo->u4CountryNum == 0); |
| |
| for (j = 0; j < prDomainInfo->u4CountryNum; j++) { |
| if (prDomainInfo->pu2CountryGroup[j] == u2TargetCountryCode) |
| break; |
| } |
| if (j < prDomainInfo->u4CountryNum) |
| break; /* Found */ |
| } |
| |
| DATA_STRUC_INSPECTING_ASSERT(REG_DOMAIN_DEF_IDX < REG_DOMAIN_GROUP_NUM); |
| |
| if (i >= REG_DOMAIN_GROUP_NUM) |
| prDomainInfo = &arSupportedRegDomains[REG_DOMAIN_DEF_IDX]; |
| |
| L_set_domain_info: |
| |
| prAdapter->prDomainInfo = prDomainInfo; |
| return prDomainInfo; |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * \brief |
| * |
| * \param[in/out] The input variable pointed by pucNumOfChannel is the max |
| * arrary size. The return value indciates meaning list size. |
| * |
| * \return none |
| */ |
| /*----------------------------------------------------------------------------*/ |
| VOID |
| rlmDomainGetChnlList(P_ADAPTER_T prAdapter, |
| ENUM_BAND_T eSpecificBand, |
| UINT_8 ucMaxChannelNum, PUINT_8 pucNumOfChannel, P_RF_CHANNEL_INFO_T paucChannelList) |
| { |
| UINT_8 i, j, ucNum; |
| P_DOMAIN_SUBBAND_INFO prSubband; |
| P_DOMAIN_INFO_ENTRY prDomainInfo; |
| |
| ASSERT(prAdapter); |
| ASSERT(paucChannelList); |
| ASSERT(pucNumOfChannel); |
| |
| /* If no matched country code, the final one will be used */ |
| prDomainInfo = rlmDomainGetDomainInfo(prAdapter); |
| ASSERT(prDomainInfo); |
| |
| ucNum = 0; |
| for (i = 0; i < MAX_SUBBAND_NUM; i++) { |
| prSubband = &prDomainInfo->rSubBand[i]; |
| |
| if (prSubband->ucBand == BAND_NULL || prSubband->ucBand >= BAND_NUM || |
| (prSubband->ucBand == BAND_5G && !prAdapter->fgEnable5GBand)) |
| continue; |
| |
| if (eSpecificBand == BAND_NULL || prSubband->ucBand == eSpecificBand) { |
| for (j = 0; j < prSubband->ucNumChannels; j++) { |
| if (ucNum >= ucMaxChannelNum) |
| break; |
| paucChannelList[ucNum].eBand = prSubband->ucBand; |
| paucChannelList[ucNum].ucChannelNum = |
| prSubband->ucFirstChannelNum + j * prSubband->ucChannelSpan; |
| ucNum++; |
| } |
| } |
| } |
| |
| *pucNumOfChannel = ucNum; |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * @brief |
| * |
| * @param[in] |
| * |
| * @return (none) |
| */ |
| /*----------------------------------------------------------------------------*/ |
| VOID rlmDomainSendCmd(P_ADAPTER_T prAdapter, BOOLEAN fgIsOid) |
| { |
| P_DOMAIN_INFO_ENTRY prDomainInfo; |
| P_CMD_SET_DOMAIN_INFO_T prCmd; |
| UINT_8 i; |
| P_DOMAIN_SUBBAND_INFO prSubBand; |
| |
| rlmDomainPassiveScanSendCmd(prAdapter, fgIsOid); |
| |
| prDomainInfo = rlmDomainGetDomainInfo(prAdapter); |
| ASSERT(prDomainInfo); |
| |
| prCmd = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_SET_DOMAIN_INFO_T)); |
| ASSERT(prCmd); |
| |
| /* To do: exception handle */ |
| if (!prCmd) { |
| DBGLOG(RLM, ERROR, "Domain: no buf to send cmd\n"); |
| return; |
| } |
| kalMemZero(prCmd, sizeof(CMD_SET_DOMAIN_INFO_T)); |
| |
| prCmd->u2CountryCode = prAdapter->rWifiVar.rConnSettings.u2CountryCode; |
| prCmd->u2IsSetPassiveScan = 0; |
| prCmd->uc2G4Bandwidth = prAdapter->rWifiVar.rConnSettings.uc2G4BandwidthMode; |
| prCmd->uc5GBandwidth = prAdapter->rWifiVar.rConnSettings.uc5GBandwidthMode; |
| prCmd->aucReserved[0] = 0; |
| prCmd->aucReserved[1] = 0; |
| |
| for (i = 0; i < MAX_SUBBAND_NUM; i++) { |
| prSubBand = &prDomainInfo->rSubBand[i]; |
| |
| prCmd->rSubBand[i].ucRegClass = prSubBand->ucRegClass; |
| |
| if (prSubBand->ucBand == BAND_5G && |
| (prAdapter->fgIsHw5GBandDisabled || !prAdapter->fgEnable5GBand)) { |
| prCmd->rSubBand[i].ucBand = BAND_NULL; |
| prCmd->rSubBand[i].ucChannelSpan = 0; |
| prCmd->rSubBand[i].ucFirstChannelNum = 0; |
| prCmd->rSubBand[i].ucNumChannels = 0; |
| } else { |
| prCmd->rSubBand[i].ucBand = prSubBand->ucBand; |
| if (prSubBand->ucBand != BAND_NULL && prSubBand->ucBand < BAND_NUM) { |
| prCmd->rSubBand[i].ucChannelSpan = prSubBand->ucChannelSpan; |
| prCmd->rSubBand[i].ucFirstChannelNum = prSubBand->ucFirstChannelNum; |
| prCmd->rSubBand[i].ucNumChannels = prSubBand->ucNumChannels; |
| } |
| } |
| } |
| |
| /* Update domain info to chip */ |
| wlanSendSetQueryCmd(prAdapter, /* prAdapter */ |
| CMD_ID_SET_DOMAIN_INFO, /* ucCID */ |
| TRUE, /* fgSetQuery */ |
| FALSE, /* fgNeedResp */ |
| fgIsOid, /* fgIsOid */ |
| NULL, /* pfCmdDoneHandler */ |
| NULL, /* pfCmdTimeoutHandler */ |
| sizeof(CMD_SET_DOMAIN_INFO_T), /* u4SetQueryInfoLen */ |
| (PUINT_8) prCmd, /* pucInfoBuffer */ |
| NULL, /* pvSetQueryBuffer */ |
| 0 /* u4SetQueryBufferLen */ |
| ); |
| |
| /* ASSERT(rStatus == WLAN_STATUS_PENDING); */ |
| |
| cnmMemFree(prAdapter, prCmd); |
| #if CFG_SUPPORT_PWR_LIMIT_COUNTRY |
| rlmDomainSendPwrLimitCmd(prAdapter); |
| #endif |
| |
| } |
| |
| VOID rlmDomainPassiveScanSendCmd(P_ADAPTER_T prAdapter, BOOLEAN fgIsOid) |
| { |
| |
| P_DOMAIN_INFO_ENTRY prDomainInfo; |
| P_CMD_SET_DOMAIN_INFO_T prCmd; |
| WLAN_STATUS rStatus; |
| P_DOMAIN_SUBBAND_INFO prSubBand; |
| UINT_8 i, j; |
| UINT_16 u2TargetCountryCode; |
| |
| prCmd = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_SET_DOMAIN_INFO_T)); |
| ASSERT(prCmd); |
| |
| /* To do: exception handle */ |
| if (!prCmd) { |
| DBGLOG(RLM, ERROR, "Domain: no buf to send cmd\n"); |
| return; |
| } |
| kalMemZero(prCmd, sizeof(CMD_SET_DOMAIN_INFO_T)); |
| |
| prCmd->u2CountryCode = prAdapter->rWifiVar.rConnSettings.u2CountryCode; |
| prCmd->u2IsSetPassiveScan = 1; |
| prCmd->uc2G4Bandwidth = prAdapter->rWifiVar.rConnSettings.uc2G4BandwidthMode; |
| prCmd->uc5GBandwidth = prAdapter->rWifiVar.rConnSettings.uc5GBandwidthMode; |
| prCmd->aucReserved[0] = 0; |
| prCmd->aucReserved[1] = 0; |
| |
| DBGLOG(RLM, INFO, |
| "rlmDomainPassiveScanSendCmd(), CountryCode = %x\n", prAdapter->rWifiVar.rConnSettings.u2CountryCode); |
| |
| u2TargetCountryCode = prAdapter->rWifiVar.rConnSettings.u2CountryCode; |
| |
| for (i = 0; i < REG_DOMAIN_PASSIVE_GROUP_NUM; i++) { |
| prDomainInfo = &arSupportedRegDomains_Passive[i]; |
| |
| for (j = 0; j < prDomainInfo->u4CountryNum; j++) { |
| if (prDomainInfo->pu2CountryGroup[j] == u2TargetCountryCode) |
| break; |
| } |
| if (j < prDomainInfo->u4CountryNum) |
| break; /* Found */ |
| } |
| |
| if (i >= REG_DOMAIN_PASSIVE_GROUP_NUM) |
| prDomainInfo = &arSupportedRegDomains_Passive[REG_DOMAIN_PASSIVE_DEF_IDX]; |
| |
| for (i = 0; i < MAX_SUBBAND_NUM; i++) { |
| prSubBand = &prDomainInfo->rSubBand[i]; |
| |
| prCmd->rSubBand[i].ucRegClass = prSubBand->ucRegClass; |
| |
| if (prSubBand->ucBand == BAND_5G && |
| (prAdapter->fgIsHw5GBandDisabled || !prAdapter->fgEnable5GBand)) { |
| prCmd->rSubBand[i].ucBand = BAND_NULL; |
| prCmd->rSubBand[i].ucChannelSpan = 0; |
| prCmd->rSubBand[i].ucFirstChannelNum = 0; |
| prCmd->rSubBand[i].ucNumChannels = 0; |
| } else { |
| prCmd->rSubBand[i].ucBand = prSubBand->ucBand; |
| if (prSubBand->ucBand != BAND_NULL && prSubBand->ucBand < BAND_NUM) { |
| prCmd->rSubBand[i].ucChannelSpan = prSubBand->ucChannelSpan; |
| prCmd->rSubBand[i].ucFirstChannelNum = prSubBand->ucFirstChannelNum; |
| prCmd->rSubBand[i].ucNumChannels = prSubBand->ucNumChannels; |
| } |
| } |
| } |
| |
| rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */ |
| CMD_ID_SET_DOMAIN_INFO, /* ucCID */ |
| TRUE, /* fgSetQuery */ |
| FALSE, /* fgNeedResp */ |
| fgIsOid, /* fgIsOid */ |
| NULL, /* pfCmdDoneHandler */ |
| NULL, /* pfCmdTimeoutHandler */ |
| sizeof(CMD_SET_DOMAIN_INFO_T), /* u4SetQueryInfoLen */ |
| (PUINT_8) prCmd, /* pucInfoBuffer */ |
| NULL, /* pvSetQueryBuffer */ |
| 0 /* u4SetQueryBufferLen */ |
| ); |
| |
| ASSERT(rStatus == WLAN_STATUS_PENDING); |
| |
| cnmMemFree(prAdapter, prCmd); |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * \brief |
| * |
| * \param[in/out] |
| * |
| * \return TRUE Legal channel |
| * FALSE Illegal channel for current regulatory domain |
| */ |
| /*----------------------------------------------------------------------------*/ |
| BOOLEAN rlmDomainIsLegalChannel(P_ADAPTER_T prAdapter, ENUM_BAND_T eBand, UINT_8 ucChannel) |
| { |
| UINT_8 i, j; |
| P_DOMAIN_SUBBAND_INFO prSubband; |
| P_DOMAIN_INFO_ENTRY prDomainInfo; |
| |
| prDomainInfo = rlmDomainGetDomainInfo(prAdapter); |
| ASSERT(prDomainInfo); |
| |
| for (i = 0; i < MAX_SUBBAND_NUM; i++) { |
| prSubband = &prDomainInfo->rSubBand[i]; |
| |
| if (prSubband->ucBand == BAND_5G && !prAdapter->fgEnable5GBand) |
| continue; |
| |
| if (prSubband->ucBand == eBand) { |
| for (j = 0; j < prSubband->ucNumChannels; j++) { |
| if ((prSubband->ucFirstChannelNum + j * prSubband->ucChannelSpan) |
| == ucChannel) { |
| return TRUE; |
| } |
| } |
| } |
| } |
| |
| return FALSE; |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * \brief |
| * |
| * \param[in/out] |
| * |
| * \return none |
| */ |
| /*----------------------------------------------------------------------------*/ |
| |
| UINT_32 rlmDomainSupOperatingClassIeFill(PUINT_8 pBuf) |
| { |
| /* |
| The Country element should only be included for Status Code 0 (Successful). |
| */ |
| UINT_32 u4IeLen; |
| UINT_8 aucClass[12] = { 0x01, 0x02, 0x03, 0x05, 0x16, 0x17, 0x19, 0x1b, |
| 0x1c, 0x1e, 0x20, 0x21 |
| }; |
| |
| /* |
| The Supported Operating Classes element is used by a STA to advertise the |
| operating classes that it is capable of operating with in this country. |
| |
| The Country element (see 8.4.2.10) allows a STA to configure its PHY and MAC |
| for operation when the operating triplet of Operating Extension Identifier, |
| Operating Class, and Coverage Class fields is present. |
| */ |
| SUP_OPERATING_CLASS_IE(pBuf)->ucId = ELEM_ID_SUP_OPERATING_CLASS; |
| SUP_OPERATING_CLASS_IE(pBuf)->ucLength = 1 + sizeof(aucClass); |
| SUP_OPERATING_CLASS_IE(pBuf)->ucCur = 0x0c; /* 0x51 */ |
| kalMemCopy(SUP_OPERATING_CLASS_IE(pBuf)->ucSup, aucClass, sizeof(aucClass)); |
| u4IeLen = (SUP_OPERATING_CLASS_IE(pBuf)->ucLength + 2); |
| pBuf += u4IeLen; |
| |
| COUNTRY_IE(pBuf)->ucId = ELEM_ID_COUNTRY_INFO; |
| COUNTRY_IE(pBuf)->ucLength = 6; |
| COUNTRY_IE(pBuf)->aucCountryStr[0] = 0x55; |
| COUNTRY_IE(pBuf)->aucCountryStr[1] = 0x53; |
| COUNTRY_IE(pBuf)->aucCountryStr[2] = 0x20; |
| COUNTRY_IE(pBuf)->arCountryStr[0].ucFirstChnlNum = 1; |
| COUNTRY_IE(pBuf)->arCountryStr[0].ucNumOfChnl = 11; |
| COUNTRY_IE(pBuf)->arCountryStr[0].cMaxTxPwrLv = 0x1e; |
| u4IeLen += (COUNTRY_IE(pBuf)->ucLength + 2); |
| |
| return u4IeLen; |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * @brief |
| * |
| * @param[in] |
| * |
| * @return (fgValid) : 0 -> inValid, 1 -> Valid |
| */ |
| /*----------------------------------------------------------------------------*/ |
| BOOLEAN rlmDomainCheckChannelEntryValid(P_ADAPTER_T prAdapter, UINT_8 ucCentralCh) |
| { |
| BOOLEAN fgValid = FALSE; |
| UINT_8 ucTemp = 0; |
| UINT_8 i; |
| /*Check Power limit table channel efficient or not */ |
| |
| for (i = POWER_LIMIT_2G4; i < POWER_LIMIT_SUBAND_NUM; i++) { |
| if ((ucCentralCh >= g_rRlmSubBand[i].ucStartCh) && (ucCentralCh <= g_rRlmSubBand[i].ucEndCh)) |
| ucTemp = (ucCentralCh - g_rRlmSubBand[i].ucStartCh) % g_rRlmSubBand[i].ucInterval; |
| } |
| |
| #if 0 |
| /*2.4G, ex 1, 2, 3 */ |
| if (ucCentralCh >= BAND_2G4_LOWER_BOUND && ucCentralCh <= BAND_2G4_UPPER_BOUND) |
| ucTemp = 0; |
| /*FCC- Spec : Band UNII-1, ex 36, 38, 40.... */ |
| else if (ucCentralCh >= UNII1_LOWER_BOUND && ucCentralCh <= UNII1_UPPER_BOUND) |
| ucTemp = (ucCentralCh - UNII1_LOWER_BOUND) % 2; |
| /*FCC- Spec : Band UNII-2A, ex 52, 54, 56.... */ |
| else if (ucCentralCh >= UNII2A_LOWER_BOUND && ucCentralCh <= UNII2A_UPPER_BOUND) |
| ucTemp = (ucCentralCh - UNII2A_LOWER_BOUND) % 2; |
| /*FCC- Spec : Band UNII-2C, ex 100, 102, 104.... */ |
| else if (ucCentralCh >= UNII2C_LOWER_BOUND && ucCentralCh <= UNII2C_UPPER_BOUND) |
| ucTemp = (ucCentralCh - UNII2C_LOWER_BOUND) % 2; |
| /*FCC- Spec : Band UNII-3, ex 149, 151, 153... */ |
| else if (ucCentralCh >= UNII3_LOWER_BOUND && ucCentralCh <= UNII3_UPPER_BOUND) |
| ucTemp = (ucCentralCh - UNII3_LOWER_BOUND) % 2; |
| #endif |
| if (ucTemp == 0) |
| fgValid = TRUE; |
| return fgValid; |
| |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * \brief |
| * |
| * \param[in] |
| * |
| * \return |
| */ |
| /*----------------------------------------------------------------------------*/ |
| UINT_8 rlmDomainGetCenterChannel(ENUM_BAND_T eBand, UINT_8 ucPriChannel, ENUM_CHNL_EXT_T eExtend) |
| { |
| UINT_8 ucCenterChannel; |
| |
| if (eExtend == CHNL_EXT_SCA) |
| ucCenterChannel = ucPriChannel + 2; |
| else if (eExtend == CHNL_EXT_SCB) |
| ucCenterChannel = ucPriChannel - 2; |
| else |
| ucCenterChannel = ucPriChannel; |
| |
| return ucCenterChannel; |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * \brief |
| * |
| * \param[in] |
| * |
| * \return |
| */ |
| /*----------------------------------------------------------------------------*/ |
| BOOLEAN |
| rlmDomainIsValidRfSetting(P_ADAPTER_T prAdapter, |
| ENUM_BAND_T eBand, |
| UINT_8 ucPriChannel, |
| ENUM_CHNL_EXT_T eExtend, |
| ENUM_CHANNEL_WIDTH_T eChannelWidth, UINT_8 ucChannelS1, UINT_8 ucChannelS2) |
| { |
| UINT_8 ucCenterChannel; |
| BOOLEAN fgValidChannel = TRUE; |
| BOOLEAN fgValidBW = TRUE; |
| BOOLEAN fgValidRfSetting = TRUE; |
| UINT_32 u4PrimaryOffset; |
| |
| /*DBG msg for Channel InValid */ |
| if (eChannelWidth == CW_20_40MHZ) { |
| ucCenterChannel = rlmDomainGetCenterChannel(eBand, ucPriChannel, eExtend); |
| |
| /* Check Central Channel Valid or Not */ |
| fgValidChannel = rlmDomainCheckChannelEntryValid(prAdapter, ucCenterChannel); |
| if (fgValidChannel == FALSE) |
| DBGLOG(RLM, WARN, "Rf: CentralCh=%d\n", ucCenterChannel); |
| } else if (eChannelWidth == CW_80MHZ) { |
| ucCenterChannel = ucChannelS1; |
| |
| /* Check Central Channel Valid or Not */ |
| fgValidChannel = rlmDomainCheckChannelEntryValid(prAdapter, ucCenterChannel); |
| if (fgValidChannel == FALSE) |
| DBGLOG(RLM, WARN, "Rf: CentralCh=%d\n", ucCenterChannel); |
| } else if (eChannelWidth == CW_160MHZ) { |
| ucCenterChannel = ucChannelS2; |
| |
| /* Check Central Channel Valid or Not */ |
| /*TODo */ |
| } |
| |
| /* Check BW Setting Correct or Not */ |
| if (eBand == BAND_2G4) { |
| if (eChannelWidth != CW_20_40MHZ) { |
| fgValidBW = FALSE; |
| DBGLOG(RLM, WARN, "Rf: B=%d, W=%d\n", eBand, eChannelWidth); |
| } |
| } else { |
| if (eChannelWidth == CW_80MHZ) { |
| u4PrimaryOffset = CAL_CH_OFFSET_80M(ucPriChannel, ucCenterChannel); |
| if (u4PrimaryOffset > 4) { |
| fgValidBW = FALSE; |
| DBGLOG(RLM, WARN, "Rf: PriOffSet=%d, W=%d\n", u4PrimaryOffset, eChannelWidth); |
| } |
| } else if (eChannelWidth == CW_160MHZ) { |
| u4PrimaryOffset = CAL_CH_OFFSET_160M(ucPriChannel, ucCenterChannel); |
| if (u4PrimaryOffset > 8) { |
| fgValidBW = FALSE; |
| DBGLOG(RLM, WARN, "Rf: PriOffSet=%d, W=%d\n", u4PrimaryOffset, eChannelWidth); |
| } |
| } |
| } |
| |
| if ((fgValidBW == FALSE) || (fgValidChannel == FALSE)) |
| fgValidRfSetting = FALSE; |
| |
| return fgValidRfSetting; |
| |
| } |
| |
| #if CFG_SUPPORT_PWR_LIMIT_COUNTRY |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * @brief |
| * |
| * @param[in] |
| * |
| * @return (fgValid) : 0 -> inValid, 1 -> Valid |
| */ |
| /*----------------------------------------------------------------------------*/ |
| BOOLEAN |
| rlmDomainCheckPowerLimitValid(P_ADAPTER_T prAdapter, |
| COUNTRY_POWER_LIMIT_TABLE_CONFIGURATION rPowerLimitTableConfiguration, |
| UINT_8 ucPwrLimitNum) |
| { |
| UINT_8 i; |
| BOOLEAN fgValid = TRUE; |
| PINT_8 prPwrLimit; |
| |
| prPwrLimit = &rPowerLimitTableConfiguration.aucPwrLimit[0]; |
| |
| for (i = 0; i < ucPwrLimitNum; i++, prPwrLimit++) { |
| if (*prPwrLimit > MAX_TX_POWER || *prPwrLimit < MIN_TX_POWER) { |
| fgValid = FALSE; |
| break; /*Find out Wrong Power limit */ |
| } |
| } |
| return fgValid; |
| |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * @brief |
| * |
| * @param[in] |
| * |
| * @return (none) |
| */ |
| /*----------------------------------------------------------------------------*/ |
| VOID rlmDomainCheckCountryPowerLimitTable(P_ADAPTER_T prAdapter) |
| { |
| UINT_8 i, j; |
| UINT_16 u2CountryCodeTable, u2CountryCodeCheck; |
| BOOLEAN fgChannelValid = FALSE; |
| BOOLEAN fgPowerLimitValid = FALSE; |
| BOOLEAN fgEntryRepetetion = FALSE; |
| BOOLEAN fgTableValid = TRUE; |
| |
| /*Configuration Table Check */ |
| for (i = 0; i < sizeof(g_rRlmPowerLimitConfiguration) / sizeof(COUNTRY_POWER_LIMIT_TABLE_CONFIGURATION); i++) { |
| /*Table Country Code */ |
| WLAN_GET_FIELD_BE16(&g_rRlmPowerLimitConfiguration[i].aucCountryCode[0], &u2CountryCodeTable); |
| |
| /*Repetition Entry Check */ |
| for (j = i + 1; |
| j < sizeof(g_rRlmPowerLimitConfiguration) / sizeof(COUNTRY_POWER_LIMIT_TABLE_CONFIGURATION); |
| j++) { |
| |
| WLAN_GET_FIELD_BE16(&g_rRlmPowerLimitConfiguration[j].aucCountryCode[0], &u2CountryCodeCheck); |
| if (((g_rRlmPowerLimitConfiguration[i].ucCentralCh) == |
| g_rRlmPowerLimitConfiguration[j].ucCentralCh) |
| && (u2CountryCodeTable == u2CountryCodeCheck)) { |
| fgEntryRepetetion = TRUE; |
| DBGLOG(RLM, INFO, "Domain: Configuration Repetition CC=%c%c, Ch=%d\n", |
| g_rRlmPowerLimitConfiguration[i].aucCountryCode[0], |
| g_rRlmPowerLimitConfiguration[i].aucCountryCode[1], |
| g_rRlmPowerLimitConfiguration[i].ucCentralCh); |
| } |
| } |
| |
| /*Channel Number Check */ |
| fgChannelValid = |
| rlmDomainCheckChannelEntryValid(prAdapter, g_rRlmPowerLimitConfiguration[i].ucCentralCh); |
| |
| /*Power Limit Check */ |
| fgPowerLimitValid = |
| rlmDomainCheckPowerLimitValid(prAdapter, g_rRlmPowerLimitConfiguration[i], PWR_LIMIT_NUM); |
| |
| if (fgChannelValid == FALSE || fgPowerLimitValid == FALSE) { |
| fgTableValid = FALSE; |
| DBGLOG(RLM, INFO, "Domain: CC=%c%c, Ch=%d, Limit: %d,%d,%d,%d,%d\n", |
| g_rRlmPowerLimitConfiguration[i].aucCountryCode[0], |
| g_rRlmPowerLimitConfiguration[i].aucCountryCode[1], |
| g_rRlmPowerLimitConfiguration[i].ucCentralCh, |
| g_rRlmPowerLimitConfiguration[i].aucPwrLimit[PWR_LIMIT_CCK], |
| g_rRlmPowerLimitConfiguration[i].aucPwrLimit[PWR_LIMIT_20M], |
| g_rRlmPowerLimitConfiguration[i].aucPwrLimit[PWR_LIMIT_40M], |
| g_rRlmPowerLimitConfiguration[i].aucPwrLimit[PWR_LIMIT_80M], |
| g_rRlmPowerLimitConfiguration[i].aucPwrLimit[PWR_LIMIT_160M]); |
| } |
| |
| if (u2CountryCodeTable == COUNTRY_CODE_NULL) { |
| DBGLOG(RLM, INFO, "Domain: Full search down\n"); |
| break; /*End of country table entry */ |
| } |
| |
| } |
| |
| if (fgEntryRepetetion == FALSE) |
| DBGLOG(RLM, INFO, "Domain: Configuration Table no Repetiton.\n"); |
| |
| /*Configuration Table no error */ |
| if (fgTableValid == TRUE) |
| prAdapter->fgIsPowerLimitTableValid = TRUE; |
| else |
| prAdapter->fgIsPowerLimitTableValid = FALSE; |
| |
| /*Default Table Check */ |
| fgEntryRepetetion = FALSE; |
| for (i = 0; i < sizeof(g_rRlmPowerLimitDefault) / sizeof(COUNTRY_POWER_LIMIT_TABLE_DEFAULT); i++) { |
| |
| WLAN_GET_FIELD_BE16(&g_rRlmPowerLimitDefault[i].aucCountryCode[0], &u2CountryCodeTable); |
| |
| for (j = i + 1; j < sizeof(g_rRlmPowerLimitDefault) / sizeof(COUNTRY_POWER_LIMIT_TABLE_DEFAULT); j++) { |
| WLAN_GET_FIELD_BE16(&g_rRlmPowerLimitDefault[j].aucCountryCode[0], &u2CountryCodeCheck); |
| if (u2CountryCodeTable == u2CountryCodeCheck) { |
| fgEntryRepetetion = TRUE; |
| DBGLOG(RLM, INFO, |
| "Domain: Default Repetition CC=%c%c\n", |
| g_rRlmPowerLimitDefault[j].aucCountryCode[0], |
| g_rRlmPowerLimitDefault[j].aucCountryCode[1]); |
| } |
| } |
| } |
| if (fgEntryRepetetion == FALSE) |
| DBGLOG(RLM, INFO, "Domain: Default Table no Repetiton.\n"); |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * @brief |
| * |
| * @param[in] |
| * |
| * @return (u2TableIndex) : if 0xFFFF -> No Table Match |
| */ |
| /*----------------------------------------------------------------------------*/ |
| UINT_16 rlmDomainPwrLimitDefaultTableDecision(P_ADAPTER_T prAdapter, UINT_16 u2CountryCode) |
| { |
| |
| UINT_16 i; |
| UINT_16 u2CountryCodeTable = COUNTRY_CODE_NULL; |
| UINT_16 u2TableIndex = POWER_LIMIT_TABLE_NULL; /* No Table Match */ |
| |
| /*Default Table Index */ |
| for (i = 0; i < sizeof(g_rRlmPowerLimitDefault) / sizeof(COUNTRY_POWER_LIMIT_TABLE_DEFAULT); i++) { |
| |
| WLAN_GET_FIELD_BE16(&g_rRlmPowerLimitDefault[i].aucCountryCode[0], &u2CountryCodeTable); |
| |
| if (u2CountryCodeTable == u2CountryCode) { |
| u2TableIndex = i; |
| break; /*match country code */ |
| } else if (u2CountryCodeTable == COUNTRY_CODE_NULL) { |
| u2TableIndex = i; |
| break; /*find last one country- Default */ |
| } |
| } |
| |
| DBGLOG(RLM, INFO, "Domain: Default Table Index = %d\n", u2TableIndex); |
| |
| return u2TableIndex; |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * @brief |
| * |
| * @param[in] |
| * |
| * @return (none) |
| */ |
| /*----------------------------------------------------------------------------*/ |
| VOID rlmDomainBuildCmdByDefaultTable(P_CMD_SET_COUNTRY_CHANNEL_POWER_LIMIT_T prCmd, UINT_16 u2DefaultTableIndex) |
| { |
| UINT_8 i, k; |
| P_COUNTRY_POWER_LIMIT_TABLE_DEFAULT prPwrLimitSubBand; |
| P_CMD_CHANNEL_POWER_LIMIT prCmdPwrLimit; |
| |
| prCmdPwrLimit = &prCmd->rChannelPowerLimit[0]; |
| prPwrLimitSubBand = &g_rRlmPowerLimitDefault[u2DefaultTableIndex]; |
| |
| /*Build power limit cmd by default table information */ |
| |
| for (i = POWER_LIMIT_2G4; i < POWER_LIMIT_SUBAND_NUM; i++) { |
| if (prPwrLimitSubBand->aucPwrLimitSubBand[i] < MAX_TX_POWER) { |
| for (k = g_rRlmSubBand[i].ucStartCh; k <= g_rRlmSubBand[i].ucEndCh; |
| k += g_rRlmSubBand[i].ucInterval) { |
| if ((prPwrLimitSubBand->ucPwrUnit & BIT(i)) == 0) { |
| prCmdPwrLimit->ucCentralCh = k; |
| kalMemSet(&prCmdPwrLimit->cPwrLimitCCK, |
| prPwrLimitSubBand->aucPwrLimitSubBand[i], PWR_LIMIT_NUM); |
| prCmdPwrLimit++; |
| prCmd->ucNum++; |
| |
| } else { |
| /* ex: 40MHz power limit(mW\MHz) = 20MHz power limit(mW\MHz) * 2 |
| * ---> 40MHz power limit(dBm) = 20MHz power limit(dBm) + 6; */ |
| prCmdPwrLimit->ucCentralCh = k; |
| prCmdPwrLimit->cPwrLimitCCK = prPwrLimitSubBand->aucPwrLimitSubBand[i]; |
| prCmdPwrLimit->cPwrLimit20 = prPwrLimitSubBand->aucPwrLimitSubBand[i]; |
| prCmdPwrLimit->cPwrLimit40 = prPwrLimitSubBand->aucPwrLimitSubBand[i] + 6; |
| if (prCmdPwrLimit->cPwrLimit40 > MAX_TX_POWER) |
| prCmdPwrLimit->cPwrLimit40 = MAX_TX_POWER; |
| prCmdPwrLimit->cPwrLimit80 = prPwrLimitSubBand->aucPwrLimitSubBand[i] + 12; |
| if (prCmdPwrLimit->cPwrLimit80 > MAX_TX_POWER) |
| prCmdPwrLimit->cPwrLimit80 = MAX_TX_POWER; |
| prCmdPwrLimit->cPwrLimit160 = prPwrLimitSubBand->aucPwrLimitSubBand[i] + 18; |
| if (prCmdPwrLimit->cPwrLimit160 > MAX_TX_POWER) |
| prCmdPwrLimit->cPwrLimit160 = MAX_TX_POWER; |
| prCmdPwrLimit++; |
| prCmd->ucNum++; |
| } |
| } |
| } |
| } |
| |
| #if 0 |
| if (prPwrLimitSubBand->aucPwrLimitSubBand[POWER_LIMIT_2G4] < MAX_TX_POWER) { |
| for (i = BAND_2G4_LOWER_BOUND; i <= BAND_2G4_UPPER_BOUND; i++) { |
| prCmdPwrLimit->ucCentralCh = i; |
| kalMemSet(&prCmdPwrLimit->cPwrLimitCCK, prPwrLimitSubBand->aucPwrLimitSubBand[POWER_LIMIT_2G4], |
| PWR_LIMIT_NUM); |
| prCmdPwrLimit++; |
| prCmd->ucNum++; |
| } |
| } |
| |
| if (prPwrLimitSubBand->aucPwrLimitSubBand[POWER_LIMIT_UNII1] < MAX_TX_POWER) { |
| if (prCmd->u2CountryCode != COUNTRY_CODE_KR) { |
| for (i = UNII1_LOWER_BOUND; i <= UNII1_UPPER_BOUND; i += 2) { |
| prCmdPwrLimit->ucCentralCh = i; |
| kalMemSet(&prCmdPwrLimit->cPwrLimitCCK, |
| prPwrLimitSubBand->aucPwrLimitSubBand[POWER_LIMIT_UNII1], PWR_LIMIT_NUM); |
| prCmdPwrLimit++; |
| prCmd->ucNum++; |
| } |
| } else { |
| for (i = UNII1_LOWER_BOUND; i <= UNII1_UPPER_BOUND; i += 2) { |
| /* ex: 40MHz power limit(mW\MHz) = 20MHz power limit(mW\MHz) * 2 |
| * ---> 40MHz power limit(dBm) = 20MHz power limit(dBm) + 6; */ |
| prCmdPwrLimit->ucCentralCh = i; |
| prCmdPwrLimit->cPwrLimitCCK = |
| g_rRlmPowerLimitDefault[u2DefaultTableIndex].cPwrLimitUnii1; |
| prCmdPwrLimit->cPwrLimit20 = |
| g_rRlmPowerLimitDefault[u2DefaultTableIndex].cPwrLimitUnii1; |
| prCmdPwrLimit->cPwrLimit40 = |
| g_rRlmPowerLimitDefault[u2DefaultTableIndex].cPwrLimitUnii1 + 6; |
| prCmdPwrLimit->cPwrLimit80 = |
| g_rRlmPowerLimitDefault[u2DefaultTableIndex].cPwrLimitUnii1 + 12; |
| prCmdPwrLimit->cPwrLimit160 = |
| g_rRlmPowerLimitDefault[u2DefaultTableIndex].cPwrLimitUnii1 + 18; |
| prCmdPwrLimit++; |
| prCmd->ucNum++; |
| } |
| } |
| } |
| |
| if (prPwrLimitSubBand->aucPwrLimitSubBand[POWER_LIMIT_UNII2A] < MAX_TX_POWER) { |
| for (i = UNII2A_LOWER_BOUND; i <= UNII2A_UPPER_BOUND; i += 2) { |
| prCmdPwrLimit->ucCentralCh = i; |
| kalMemSet(&prCmdPwrLimit->cPwrLimitCCK, |
| prPwrLimitSubBand->aucPwrLimitSubBand[POWER_LIMIT_UNII2A], PWR_LIMIT_NUM); |
| prCmdPwrLimit++; |
| prCmd->ucNum++; |
| } |
| } |
| |
| if (prPwrLimitSubBand->aucPwrLimitSubBand[POWER_LIMIT_UNII2C] < MAX_TX_POWER) { |
| for (i = UNII2C_LOWER_BOUND; i <= UNII2C_UPPER_BOUND; i += 2) { |
| prCmdPwrLimit->ucCentralCh = i; |
| kalMemSet(&prCmdPwrLimit->cPwrLimitCCK, |
| prPwrLimitSubBand->aucPwrLimitSubBand[POWER_LIMIT_UNII2C], PWR_LIMIT_NUM); |
| prCmdPwrLimit++; |
| prCmd->ucNum++; |
| } |
| } |
| if (prPwrLimitSubBand->aucPwrLimitSubBand[POWER_LIMIT_UNII3] < MAX_TX_POWER) { |
| for (i = UNII3_LOWER_BOUND; i <= UNII3_UPPER_BOUND; i += 2) { |
| prCmdPwrLimit->ucCentralCh = i; |
| kalMemSet(&prCmdPwrLimit->cPwrLimitCCK, |
| prPwrLimitSubBand->aucPwrLimitSubBand[POWER_LIMIT_UNII3], PWR_LIMIT_NUM); |
| prCmdPwrLimit++; |
| prCmd->ucNum++; |
| } |
| } |
| #endif |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * @brief |
| * |
| * @param[in] |
| * |
| * @return (none) |
| */ |
| /*----------------------------------------------------------------------------*/ |
| VOID rlmDomainBuildCmdByConfigTable(P_ADAPTER_T prAdapter, P_CMD_SET_COUNTRY_CHANNEL_POWER_LIMIT_T prCmd) |
| { |
| UINT_8 i, k; |
| UINT_16 u2CountryCodeTable = COUNTRY_CODE_NULL; |
| P_CMD_CHANNEL_POWER_LIMIT prCmdPwrLimit; |
| BOOLEAN fgChannelValid; |
| |
| /*Build power limit cmd by configuration table information */ |
| |
| for (i = 0; i < sizeof(g_rRlmPowerLimitConfiguration) / sizeof(COUNTRY_POWER_LIMIT_TABLE_CONFIGURATION); i++) { |
| |
| WLAN_GET_FIELD_BE16(&g_rRlmPowerLimitConfiguration[i].aucCountryCode[0], &u2CountryCodeTable); |
| |
| fgChannelValid = |
| rlmDomainCheckChannelEntryValid(prAdapter, g_rRlmPowerLimitConfiguration[i].ucCentralCh); |
| |
| if (u2CountryCodeTable == COUNTRY_CODE_NULL) { |
| DBGLOG(RLM, INFO, "Domain: full search configuration table done.\n"); |
| break; /*end of configuration table */ |
| } else if ((u2CountryCodeTable == prCmd->u2CountryCode) && (fgChannelValid == TRUE)) { |
| |
| prCmdPwrLimit = &prCmd->rChannelPowerLimit[0]; |
| |
| if (prCmd->ucNum != 0) { |
| for (k = 0; k < prCmd->ucNum; k++) { |
| if (prCmdPwrLimit->ucCentralCh == |
| g_rRlmPowerLimitConfiguration[i].ucCentralCh) { |
| |
| /*Cmd setting (Default table infromation) and |
| Configuration table has repetition channel entry, |
| ex : Default table (ex: 2.4G, limit = 20dBm) --> ch1~14 limit =20dBm, |
| Configuration table (ex: ch1, limit = 22dBm) --> ch 1 = 22 dBm |
| Cmd final setting --> ch1 = 22dBm, ch12~14 = 20dBm |
| */ |
| kalMemCopy(&prCmdPwrLimit->cPwrLimitCCK, |
| &g_rRlmPowerLimitConfiguration[i].aucPwrLimit, |
| PWR_LIMIT_NUM); |
| |
| DBGLOG(RLM, INFO, |
| "Domain: CC=%c%c,ConfigCh=%d,Limit=%d,%d,%d,%d,%d,Fg=%d\n", |
| ((prCmd->u2CountryCode & 0xff00) >> 8), |
| (prCmd->u2CountryCode & 0x00ff), prCmdPwrLimit->ucCentralCh, |
| prCmdPwrLimit->cPwrLimitCCK, prCmdPwrLimit->cPwrLimit20, |
| prCmdPwrLimit->cPwrLimit40, prCmdPwrLimit->cPwrLimit80, |
| prCmdPwrLimit->cPwrLimit160, prCmdPwrLimit->ucFlag); |
| |
| break; |
| } |
| prCmdPwrLimit++; |
| } |
| if (k == prCmd->ucNum) { |
| |
| /*Full search cmd (Default table setting) no match channey, |
| ex : Default table (ex: 2.4G, limit = 20dBm) --> ch1~14 limit =20dBm, |
| Configuration table (ex: ch36, limit = 22dBm) --> ch 36 = 22 dBm |
| Cmd final setting --> ch1~14 = 20dBm, ch36= 22dBm |
| */ |
| kalMemCopy(&prCmdPwrLimit->cPwrLimitCCK, |
| &g_rRlmPowerLimitConfiguration[i].aucPwrLimit, PWR_LIMIT_NUM); |
| prCmd->ucNum++; |
| |
| DBGLOG(RLM, INFO, |
| "Domain: Full CC=%c%c,ConfigCh=%d,Limit=%d,%d,%d,%d,%d,Fg=%d\n", |
| ((prCmd->u2CountryCode & 0xff00) >> 8), (prCmd->u2CountryCode & 0x00ff), |
| prCmdPwrLimit->ucCentralCh, prCmdPwrLimit->cPwrLimitCCK, |
| prCmdPwrLimit->cPwrLimit20, prCmdPwrLimit->cPwrLimit40, |
| prCmdPwrLimit->cPwrLimit80, prCmdPwrLimit->cPwrLimit160, |
| prCmdPwrLimit->ucFlag); |
| |
| } |
| } else { |
| |
| /*Default table power limit value are 63--> cmd table no channel entry |
| ex : Default table (ex: 2.4G, limit = 63Bm) --> no channel entry in cmd, |
| Configuration table (ex: ch36, limit = 22dBm) --> ch 36 = 22 dBm |
| Cmd final setting --> ch36= 22dBm |
| */ |
| prCmdPwrLimit->ucCentralCh = g_rRlmPowerLimitConfiguration[i].ucCentralCh; |
| kalMemCopy(&prCmdPwrLimit->cPwrLimitCCK, &g_rRlmPowerLimitConfiguration[i].aucPwrLimit, |
| PWR_LIMIT_NUM); |
| prCmd->ucNum++; |
| |
| DBGLOG(RLM, INFO, "Domain: Default table power limit value are 63.\n"); |
| DBGLOG(RLM, INFO, "Domain: CC=%c%c,ConfigCh=%d,Limit=%d,%d,%d,%d,%d,Fg=%d\n", |
| ((prCmd->u2CountryCode & 0xff00) >> 8), |
| (prCmd->u2CountryCode & 0x00ff), prCmdPwrLimit->ucCentralCh, |
| prCmdPwrLimit->cPwrLimitCCK, prCmdPwrLimit->cPwrLimit20, |
| prCmdPwrLimit->cPwrLimit40, prCmdPwrLimit->cPwrLimit80, |
| prCmdPwrLimit->cPwrLimit160, prCmdPwrLimit->ucFlag); |
| |
| } |
| } |
| } |
| } |
| |
| /*----------------------------------------------------------------------------*/ |
| /*! |
| * @brief |
| * |
| * @param[in] |
| * |
| * @return (none) |
| */ |
| /*----------------------------------------------------------------------------*/ |
| VOID rlmDomainSendPwrLimitCmd(P_ADAPTER_T prAdapter) |
| { |
| P_CMD_SET_COUNTRY_CHANNEL_POWER_LIMIT_T prCmd; |
| UINT_16 u2DefaultTableIndex; |
| UINT_32 u4SetCmdTableMaxSize; |
| UINT_32 u4SetQueryInfoLen; |
| |
| u4SetCmdTableMaxSize = |
| sizeof(CMD_SET_COUNTRY_CHANNEL_POWER_LIMIT_T) + |
| MAX_CMD_SUPPORT_CHANNEL_NUM * sizeof(CMD_CHANNEL_POWER_LIMIT); |
| |
| prCmd = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, u4SetCmdTableMaxSize); |
| |
| if (!prCmd) { |
| DBGLOG(RLM, ERROR, "Domain: no buf to send cmd\n"); |
| return; |
| } |
| kalMemZero(prCmd, u4SetCmdTableMaxSize); |
| |
| u2DefaultTableIndex = |
| rlmDomainPwrLimitDefaultTableDecision(prAdapter, prAdapter->rWifiVar.rConnSettings.u2CountryCode); |
| |
| if (u2DefaultTableIndex != POWER_LIMIT_TABLE_NULL) { |
| |
| WLAN_GET_FIELD_BE16(&g_rRlmPowerLimitDefault[u2DefaultTableIndex].aucCountryCode[0], |
| &prCmd->u2CountryCode); |
| |
| prCmd->ucNum = 0; |
| |
| if (prCmd->u2CountryCode != COUNTRY_CODE_NULL) { |
| /*Command - default table information */ |
| rlmDomainBuildCmdByDefaultTable(prCmd, u2DefaultTableIndex); |
| |
| /*Command - configuration table information */ |
| rlmDomainBuildCmdByConfigTable(prAdapter, prCmd); |
| } |
| } |
| |
| if (prCmd->u2CountryCode != 0) { |
| DBGLOG(RLM, INFO, |
| "Domain: ValidCC =%c%c, ChNum=%d\n", ((prCmd->u2CountryCode & 0xff00) >> 8), |
| (prCmd->u2CountryCode & 0x00ff), prCmd->ucNum); |
| } else { |
| DBGLOG(RLM, INFO, "Domain: ValidCC =0x%04x, ChNum=%d\n", prCmd->u2CountryCode, prCmd->ucNum); |
| } |
| |
| u4SetQueryInfoLen = |
| (sizeof(CMD_SET_COUNTRY_CHANNEL_POWER_LIMIT_T) + (prCmd->ucNum) * sizeof(CMD_CHANNEL_POWER_LIMIT)); |
| |
| /* Update domain info to chip */ |
| if (prCmd->ucNum <= MAX_CMD_SUPPORT_CHANNEL_NUM) { |
| wlanSendSetQueryCmd(prAdapter, /* prAdapter */ |
| CMD_ID_SET_COUNTRY_POWER_LIMIT, /* ucCID */ |
| TRUE, /* fgSetQuery */ |
| FALSE, /* fgNeedResp */ |
| FALSE, /* fgIsOid */ |
| NULL, /* pfCmdDoneHandler */ |
| NULL, /* pfCmdTimeoutHandler */ |
| u4SetQueryInfoLen, /* u4SetQueryInfoLen */ |
| (PUINT_8) prCmd, /* pucInfoBuffer */ |
| NULL, /* pvSetQueryBuffer */ |
| 0 /* u4SetQueryBufferLen */ |
| ); |
| } else { |
| DBGLOG(RLM, INFO, "Domain: illegal power limit table"); |
| } |
| |
| /* ASSERT(rStatus == WLAN_STATUS_PENDING); */ |
| |
| cnmMemFree(prAdapter, prCmd); |
| |
| } |
| #endif |
| |
| BOOLEAN rlmDomainGetHostCountryCode(PUINT_16 countrycode) |
| { |
| if(g_u2HostCountryCode == COUNTRY_CODE_NULL) |
| return FALSE; |
| |
| DBGLOG(RLM, INFO, "Last Host Country Code = %x\n", g_u2HostCountryCode); |
| *countrycode = g_u2HostCountryCode; |
| return TRUE; |
| } |
| |
| VOID rlmDomainSetHostCountryCode(UINT_16 countrycode) |
| { |
| DBGLOG(RLM, INFO, "Store Host Country Code = %x\n", g_u2HostCountryCode); |
| g_u2HostCountryCode = countrycode; |
| } |