|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
|
|
|
+ * Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
|
|
|
*
|
|
|
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
|
|
|
*
|
|
@@ -42,30 +42,20 @@
|
|
|
|
|
|
#define WORLD_SKU_MASK 0x00F0
|
|
|
#define WORLD_SKU_PREFIX 0x0060
|
|
|
-#define MAX_COUNTRY_COUNT 300
|
|
|
+#define REG_WAIT_TIME 50
|
|
|
|
|
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(WITH_BACKPORTS)
|
|
|
#define IEEE80211_CHAN_PASSIVE_SCAN IEEE80211_CHAN_NO_IR
|
|
|
#define IEEE80211_CHAN_NO_IBSS IEEE80211_CHAN_NO_IR
|
|
|
#endif
|
|
|
|
|
|
-static v_REGDOMAIN_t temp_reg_domain = REGDOMAIN_COUNT;
|
|
|
-
|
|
|
-/* true if init happens thru init time driver hint */
|
|
|
-static bool init_by_driver = false;
|
|
|
-/* true if init happens thru init time callback from regulatory core.
|
|
|
- this should be set to true during driver reload */
|
|
|
-static bool init_by_reg_core = false;
|
|
|
-
|
|
|
-#define REG_WAIT_TIME 50
|
|
|
-
|
|
|
#define REG_RULE_2412_2462 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0)
|
|
|
|
|
|
#define REG_RULE_2467_2472 REG_RULE(2467-10, 2472+10, 40, 0, 20, \
|
|
|
NL80211_RRF_PASSIVE_SCAN)
|
|
|
|
|
|
#define REG_RULE_2484 REG_RULE(2484-10, 2484+10, 40, 0, 20, \
|
|
|
- NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
|
|
|
+ NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
|
|
|
|
|
|
#define REG_RULE_5180_5320 REG_RULE(5180-10, 5320+10, 80, 0, 20, \
|
|
|
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
|
|
@@ -133,162 +123,7 @@ static const struct ieee80211_regdomain cds_world_regdom_67_68_6A_6C = {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-typedef struct {
|
|
|
- uint8_t regDomain;
|
|
|
- country_code_t countryCode;
|
|
|
-} CountryInfo_t;
|
|
|
-
|
|
|
-typedef struct {
|
|
|
- uint16_t countryCount;
|
|
|
- CountryInfo_t countryInfo[MAX_COUNTRY_COUNT];
|
|
|
-} CountryInfoTable_t;
|
|
|
-
|
|
|
-static CountryInfoTable_t country_info_table = {
|
|
|
- /* the first entry in the table is always the world domain */
|
|
|
- 138,
|
|
|
- {
|
|
|
- {REGDOMAIN_WORLD, {'0', '0'}}, /* WORLD DOMAIN */
|
|
|
- {REGDOMAIN_FCC, {'A', 'D'}}, /* ANDORRA */
|
|
|
- {REGDOMAIN_ETSI, {'A', 'E'}}, /* UAE */
|
|
|
- {REGDOMAIN_ETSI, {'A', 'L'}}, /* ALBANIA */
|
|
|
- {REGDOMAIN_ETSI, {'A', 'M'}}, /* ARMENIA */
|
|
|
- {REGDOMAIN_ETSI, {'A', 'N'}}, /* NETHERLANDS ANTILLES */
|
|
|
- {REGDOMAIN_FCC, {'A', 'R'}}, /* ARGENTINA */
|
|
|
- {REGDOMAIN_FCC, {'A', 'S'}}, /* AMERICAN SOMOA */
|
|
|
- {REGDOMAIN_ETSI, {'A', 'T'}}, /* AUSTRIA */
|
|
|
- {REGDOMAIN_FCC, {'A', 'U'}}, /* AUSTRALIA */
|
|
|
- {REGDOMAIN_ETSI, {'A', 'W'}}, /* ARUBA */
|
|
|
- {REGDOMAIN_ETSI, {'A', 'Z'}}, /* AZERBAIJAN */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'A'}}, /* BOSNIA AND HERZEGOVINA */
|
|
|
- {REGDOMAIN_FCC, {'B', 'B'}}, /* BARBADOS */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'D'}}, /* BANGLADESH */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'E'}}, /* BELGIUM */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'G'}}, /* BULGARIA */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'H'}}, /* BAHRAIN */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'L'}}, /* */
|
|
|
- {REGDOMAIN_FCC, {'B', 'M'}}, /* BERMUDA */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'N'}}, /* BRUNEI DARUSSALAM */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'O'}}, /* BOLIVIA */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'R'}}, /* BRAZIL */
|
|
|
- {REGDOMAIN_FCC, {'B', 'S'}}, /* BAHAMAS */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'Y'}}, /* BELARUS */
|
|
|
- {REGDOMAIN_ETSI, {'B', 'Z'}}, /* BELIZE */
|
|
|
- {REGDOMAIN_FCC, {'C', 'A'}}, /* CANADA */
|
|
|
- {REGDOMAIN_ETSI, {'C', 'H'}}, /* SWITZERLAND */
|
|
|
- {REGDOMAIN_ETSI, {'C', 'L'}}, /* CHILE */
|
|
|
- {REGDOMAIN_FCC, {'C', 'N'}}, /* CHINA */
|
|
|
- {REGDOMAIN_FCC, {'C', 'O'}}, /* COLOMBIA */
|
|
|
- {REGDOMAIN_ETSI, {'C', 'R'}}, /* COSTA RICA */
|
|
|
- {REGDOMAIN_ETSI, {'C', 'S'}},
|
|
|
- {REGDOMAIN_ETSI, {'C', 'Y'}}, /* CYPRUS */
|
|
|
- {REGDOMAIN_ETSI, {'C', 'Z'}}, /* CZECH REPUBLIC */
|
|
|
- {REGDOMAIN_ETSI, {'D', 'E'}}, /* GERMANY */
|
|
|
- {REGDOMAIN_ETSI, {'D', 'K'}}, /* DENMARK */
|
|
|
- {REGDOMAIN_FCC, {'D', 'O'}}, /* DOMINICAN REPUBLIC */
|
|
|
- {REGDOMAIN_ETSI, {'D', 'Z'}}, /* ALGERIA */
|
|
|
- {REGDOMAIN_ETSI, {'E', 'C'}}, /* ECUADOR */
|
|
|
- {REGDOMAIN_ETSI, {'E', 'E'}}, /* ESTONIA */
|
|
|
- {REGDOMAIN_ETSI, {'E', 'G'}}, /* EGYPT */
|
|
|
- {REGDOMAIN_ETSI, {'E', 'S'}}, /* SPAIN */
|
|
|
- {REGDOMAIN_ETSI, {'F', 'I'}}, /* FINLAND */
|
|
|
- {REGDOMAIN_ETSI, {'F', 'R'}}, /* FRANCE */
|
|
|
- {REGDOMAIN_ETSI, {'G', 'B'}}, /* UNITED KINGDOM */
|
|
|
- {REGDOMAIN_FCC, {'G', 'D'}}, /* GRENADA */
|
|
|
- {REGDOMAIN_ETSI, {'G', 'E'}}, /* GEORGIA */
|
|
|
- {REGDOMAIN_ETSI, {'G', 'F'}}, /* FRENCH GUIANA */
|
|
|
- {REGDOMAIN_ETSI, {'G', 'L'}}, /* GREENLAND */
|
|
|
- {REGDOMAIN_ETSI, {'G', 'P'}}, /* GUADELOUPE */
|
|
|
- {REGDOMAIN_ETSI, {'G', 'R'}}, /* GREECE */
|
|
|
- {REGDOMAIN_FCC, {'G', 'T'}}, /* GUATEMALA */
|
|
|
- {REGDOMAIN_FCC, {'G', 'U'}}, /* GUAM */
|
|
|
- {REGDOMAIN_ETSI, {'H', 'U'}}, /* HUNGARY */
|
|
|
- {REGDOMAIN_FCC, {'I', 'D'}}, /* INDONESIA */
|
|
|
- {REGDOMAIN_ETSI, {'I', 'E'}}, /* IRELAND */
|
|
|
- {REGDOMAIN_ETSI, {'I', 'L'}}, /* ISRAEL */
|
|
|
- {REGDOMAIN_ETSI, {'I', 'N'}}, /* INDIA */
|
|
|
- {REGDOMAIN_ETSI, {'I', 'R'}}, /* IRAN, ISLAMIC REPUBLIC OF */
|
|
|
- {REGDOMAIN_ETSI, {'I', 'S'}}, /* ICELNAD */
|
|
|
- {REGDOMAIN_ETSI, {'I', 'T'}}, /* ITALY */
|
|
|
- {REGDOMAIN_FCC, {'J', 'M'}}, /* JAMAICA */
|
|
|
- {REGDOMAIN_JAPAN, {'J', 'P'}}, /* JAPAN */
|
|
|
- {REGDOMAIN_ETSI, {'J', 'O'}}, /* JORDAN */
|
|
|
- {REGDOMAIN_ETSI, {'K', 'E'}}, /* KENYA */
|
|
|
- {REGDOMAIN_ETSI, {'K', 'H'}}, /* CAMBODIA */
|
|
|
- {REGDOMAIN_ETSI, {'K', 'P'}}, /* KOREA, DEMOCRATIC PEOPLE's REPUBLIC OF */
|
|
|
- {REGDOMAIN_ETSI, {'K', 'R'}}, /* KOREA, REPUBLIC OF */
|
|
|
- {REGDOMAIN_ETSI, {'K', 'W'}}, /* KUWAIT */
|
|
|
- {REGDOMAIN_ETSI, {'K', 'Z'}}, /* KAZAKHSTAN */
|
|
|
- {REGDOMAIN_ETSI, {'L', 'B'}}, /* LEBANON */
|
|
|
- {REGDOMAIN_ETSI, {'L', 'I'}}, /* LIECHTENSTEIN */
|
|
|
- {REGDOMAIN_ETSI, {'L', 'K'}}, /* SRI-LANKA */
|
|
|
- {REGDOMAIN_ETSI, {'L', 'T'}}, /* LITHUANIA */
|
|
|
- {REGDOMAIN_ETSI, {'L', 'U'}}, /* LUXEMBOURG */
|
|
|
- {REGDOMAIN_ETSI, {'L', 'V'}}, /* LATVIA */
|
|
|
- {REGDOMAIN_ETSI, {'M', 'A'}}, /* MOROCCO */
|
|
|
- {REGDOMAIN_ETSI, {'M', 'C'}}, /* MONACO */
|
|
|
- {REGDOMAIN_ETSI, {'M', 'K'}}, /* MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF */
|
|
|
- {REGDOMAIN_FCC, {'M', 'N'}}, /* MONGOLIA */
|
|
|
- {REGDOMAIN_FCC, {'M', 'O'}}, /* MACAO */
|
|
|
- {REGDOMAIN_FCC, {'M', 'P'}}, /* NORTHERN MARIANA ISLANDS */
|
|
|
- {REGDOMAIN_ETSI, {'M', 'Q'}}, /* MARTINIQUE */
|
|
|
- {REGDOMAIN_FCC, {'M', 'T'}}, /* MALTA */
|
|
|
- {REGDOMAIN_ETSI, {'M', 'U'}}, /* MAURITIUS */
|
|
|
- {REGDOMAIN_ETSI, {'M', 'W'}}, /* MALAWI */
|
|
|
- {REGDOMAIN_FCC, {'M', 'X'}}, /* MEXICO */
|
|
|
- {REGDOMAIN_ETSI, {'M', 'Y'}}, /* MALAYSIA */
|
|
|
- {REGDOMAIN_ETSI, {'N', 'G'}}, /* NIGERIA */
|
|
|
- {REGDOMAIN_FCC, {'N', 'I'}}, /* NICARAGUA */
|
|
|
- {REGDOMAIN_ETSI, {'N', 'L'}}, /* NETHERLANDS */
|
|
|
- {REGDOMAIN_ETSI, {'N', 'O'}}, /* NORWAY */
|
|
|
- {REGDOMAIN_ETSI, {'N', 'P'}}, /* NEPAL */
|
|
|
- {REGDOMAIN_FCC, {'N', 'Z'}}, /* NEW-ZEALAND */
|
|
|
- {REGDOMAIN_FCC, {'O', 'M'}}, /* OMAN */
|
|
|
- {REGDOMAIN_FCC, {'P', 'A'}}, /* PANAMA */
|
|
|
- {REGDOMAIN_ETSI, {'P', 'E'}}, /* PERU */
|
|
|
- {REGDOMAIN_ETSI, {'P', 'F'}}, /* FRENCH POLYNESIA */
|
|
|
- {REGDOMAIN_ETSI, {'P', 'G'}}, /* PAPUA NEW GUINEA */
|
|
|
- {REGDOMAIN_FCC, {'P', 'H'}}, /* PHILIPPINES */
|
|
|
- {REGDOMAIN_ETSI, {'P', 'K'}}, /* PAKISTAN */
|
|
|
- {REGDOMAIN_ETSI, {'P', 'L'}}, /* POLAND */
|
|
|
- {REGDOMAIN_FCC, {'P', 'R'}}, /* PUERTO RICO */
|
|
|
- {REGDOMAIN_FCC, {'P', 'S'}}, /* PALESTINIAN TERRITORY, OCCUPIED */
|
|
|
- {REGDOMAIN_ETSI, {'P', 'T'}}, /* PORTUGAL */
|
|
|
- {REGDOMAIN_FCC, {'P', 'Y'}}, /* PARAGUAY */
|
|
|
- {REGDOMAIN_ETSI, {'Q', 'A'}}, /* QATAR */
|
|
|
- {REGDOMAIN_ETSI, {'R', 'E'}}, /* REUNION */
|
|
|
- {REGDOMAIN_ETSI, {'R', 'O'}}, /* ROMAINIA */
|
|
|
- {REGDOMAIN_ETSI, {'R', 'S'}}, /* SERBIA */
|
|
|
- {REGDOMAIN_ETSI, {'R', 'U'}}, /* RUSSIA */
|
|
|
- {REGDOMAIN_FCC, {'R', 'W'}}, /* RWANDA */
|
|
|
- {REGDOMAIN_ETSI, {'S', 'A'}}, /* SAUDI ARABIA */
|
|
|
- {REGDOMAIN_ETSI, {'S', 'E'}}, /* SWEDEN */
|
|
|
- {REGDOMAIN_ETSI, {'S', 'G'}}, /* SINGAPORE */
|
|
|
- {REGDOMAIN_ETSI, {'S', 'I'}}, /* SLOVENNIA */
|
|
|
- {REGDOMAIN_ETSI, {'S', 'K'}}, /* SLOVAKIA */
|
|
|
- {REGDOMAIN_ETSI, {'S', 'V'}}, /* EL SALVADOR */
|
|
|
- {REGDOMAIN_ETSI, {'S', 'Y'}}, /* SYRIAN ARAB REPUBLIC */
|
|
|
- {REGDOMAIN_ETSI, {'T', 'H'}}, /* THAILAND */
|
|
|
- {REGDOMAIN_ETSI, {'T', 'N'}}, /* TUNISIA */
|
|
|
- {REGDOMAIN_ETSI, {'T', 'R'}}, /* TURKEY */
|
|
|
- {REGDOMAIN_ETSI, {'T', 'T'}}, /* TRINIDAD AND TOBAGO */
|
|
|
- {REGDOMAIN_FCC, {'T', 'W'}}, /* TAIWAN, PRIVINCE OF CHINA */
|
|
|
- {REGDOMAIN_FCC, {'T', 'Z'}}, /* TANZANIA, UNITED REPUBLIC OF */
|
|
|
- {REGDOMAIN_ETSI, {'U', 'A'}}, /* UKRAINE */
|
|
|
- {REGDOMAIN_ETSI, {'U', 'G'}}, /* UGANDA */
|
|
|
- {REGDOMAIN_FCC, {'U', 'S'}}, /* USA */
|
|
|
- {REGDOMAIN_ETSI, {'U', 'Y'}}, /* URUGUAY */
|
|
|
- {REGDOMAIN_FCC, {'U', 'Z'}}, /* UZBEKISTAN */
|
|
|
- {REGDOMAIN_ETSI, {'V', 'E'}}, /* VENEZUELA */
|
|
|
- {REGDOMAIN_FCC, {'V', 'I'}}, /* VIRGIN ISLANDS, US */
|
|
|
- {REGDOMAIN_ETSI, {'V', 'N'}}, /* VIETNAM */
|
|
|
- {REGDOMAIN_ETSI, {'Y', 'E'}}, /* YEMEN */
|
|
|
- {REGDOMAIN_ETSI, {'Y', 'T'}}, /* MAYOTTE */
|
|
|
- {REGDOMAIN_ETSI, {'Z', 'A'}}, /* SOUTH AFRICA */
|
|
|
- {REGDOMAIN_ETSI, {'Z', 'W'}}, /* ZIMBABWE */
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-const tRfChannelProps rf_channels[NUM_RF_CHANNELS] = {
|
|
|
+const struct chan_map chan_mapping[NUM_RF_CHANNELS] = {
|
|
|
{2412, 1},
|
|
|
{2417, 2},
|
|
|
{2422, 3},
|
|
@@ -303,13 +138,6 @@ const tRfChannelProps rf_channels[NUM_RF_CHANNELS] = {
|
|
|
{2467, 12},
|
|
|
{2472, 13},
|
|
|
{2484, 14},
|
|
|
- {4920, 240},
|
|
|
- {4940, 244},
|
|
|
- {4960, 248},
|
|
|
- {4980, 252},
|
|
|
- {5040, 208},
|
|
|
- {5060, 212},
|
|
|
- {5080, 216},
|
|
|
{5180, 36},
|
|
|
{5200, 40},
|
|
|
{5220, 44},
|
|
@@ -359,11 +187,6 @@ const tRfChannelProps rf_channels[NUM_RF_CHANNELS] = {
|
|
|
{2452, 9},
|
|
|
{2457, 10},
|
|
|
{2462, 11},
|
|
|
- {4930, 242},
|
|
|
- {4950, 246},
|
|
|
- {4970, 250},
|
|
|
- {5050, 210},
|
|
|
- {5070, 214},
|
|
|
{5190, 38},
|
|
|
{5210, 42},
|
|
|
{5230, 46},
|
|
@@ -385,27 +208,12 @@ const tRfChannelProps rf_channels[NUM_RF_CHANNELS] = {
|
|
|
{5755, 151},
|
|
|
{5775, 155},
|
|
|
{5795, 159},
|
|
|
- {5815, 163, },
|
|
|
+ {5815, 163},
|
|
|
};
|
|
|
|
|
|
-static t_reg_table reg_table;
|
|
|
-
|
|
|
-const sRegulatoryChannel *reg_channels =
|
|
|
- reg_table.regDomains[0].channels;
|
|
|
-
|
|
|
-
|
|
|
-/**
|
|
|
- * cds_is_wwr_sku() - is regdomain world sku
|
|
|
- * @regd: integer regulatory domain
|
|
|
- *
|
|
|
- * Return: bool
|
|
|
- */
|
|
|
-static inline bool cds_is_wwr_sku(u16 regd)
|
|
|
-{
|
|
|
- return ((regd & COUNTRY_ERD_FLAG) != COUNTRY_ERD_FLAG) &&
|
|
|
- (((regd & WORLD_SKU_MASK) == WORLD_SKU_PREFIX) ||
|
|
|
- (regd == WORLD));
|
|
|
-}
|
|
|
+struct regulatory_channel reg_channels[NUM_RF_CHANNELS];
|
|
|
+static bool init_by_driver;
|
|
|
+static bool init_by_reg_core;
|
|
|
|
|
|
/**
|
|
|
* cds_is_world_regdomain() - whether world regdomain
|
|
@@ -413,9 +221,14 @@ static inline bool cds_is_wwr_sku(u16 regd)
|
|
|
*
|
|
|
* Return: bool
|
|
|
*/
|
|
|
-bool cds_is_world_regdomain(uint32_t regd)
|
|
|
+bool cds_is_world_regdomain(uint32_t reg_domain)
|
|
|
{
|
|
|
- return cds_is_wwr_sku(regd & ~WORLDWIDE_ROAMING_FLAG);
|
|
|
+ uint32_t temp_regd = reg_domain & ~WORLDWIDE_ROAMING_FLAG;
|
|
|
+
|
|
|
+ return ((temp_regd & COUNTRY_ERD_FLAG) != COUNTRY_ERD_FLAG) &&
|
|
|
+ (((temp_regd & WORLD_SKU_MASK) == WORLD_SKU_PREFIX) ||
|
|
|
+ (temp_regd == WORLD));
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
@@ -546,11 +359,11 @@ static void cds_update_regulatory_info(hdd_context_t *hdd_ctx)
|
|
|
*
|
|
|
* Return: CDF_STATUS_SUCCESS
|
|
|
*/
|
|
|
-CDF_STATUS cds_get_channel_list_with_power(tChannelListWithPower *
|
|
|
- base_channels,
|
|
|
+CDF_STATUS cds_get_channel_list_with_power(struct channel_power
|
|
|
+ *base_channels,
|
|
|
uint8_t *num_base_channels,
|
|
|
- tChannelListWithPower *
|
|
|
- channels_40mhz,
|
|
|
+ struct channel_power
|
|
|
+ *channels_40mhz,
|
|
|
uint8_t *num_40mhz_channels)
|
|
|
{
|
|
|
CDF_STATUS status = CDF_STATUS_SUCCESS;
|
|
@@ -559,19 +372,19 @@ CDF_STATUS cds_get_channel_list_with_power(tChannelListWithPower *
|
|
|
if (base_channels && num_base_channels) {
|
|
|
count = 0;
|
|
|
for (i = 0; i <= RF_CHAN_14; i++) {
|
|
|
- if (reg_channels[i].enabled) {
|
|
|
- base_channels[count].chanId =
|
|
|
- rf_channels[i].channelNum;
|
|
|
- base_channels[count++].pwr =
|
|
|
- reg_channels[i].pwrLimit;
|
|
|
+ if (reg_channels[i].state) {
|
|
|
+ base_channels[count].chan_num =
|
|
|
+ chan_mapping[i].chan_num;
|
|
|
+ base_channels[count++].power =
|
|
|
+ reg_channels[i].pwr_limit;
|
|
|
}
|
|
|
}
|
|
|
for (i = RF_CHAN_36; i <= RF_CHAN_184; i++) {
|
|
|
- if (reg_channels[i].enabled) {
|
|
|
- base_channels[count].chanId =
|
|
|
- rf_channels[i].channelNum;
|
|
|
- base_channels[count++].pwr =
|
|
|
- reg_channels[i].pwrLimit;
|
|
|
+ if (reg_channels[i].state) {
|
|
|
+ base_channels[count].chan_num =
|
|
|
+ chan_mapping[i].chan_num;
|
|
|
+ base_channels[count++].power =
|
|
|
+ reg_channels[i].pwr_limit;
|
|
|
}
|
|
|
}
|
|
|
*num_base_channels = count;
|
|
@@ -581,20 +394,20 @@ CDF_STATUS cds_get_channel_list_with_power(tChannelListWithPower *
|
|
|
count = 0;
|
|
|
|
|
|
for (i = RF_CHAN_BOND_3; i <= RF_CHAN_BOND_11; i++) {
|
|
|
- if (reg_channels[i].enabled) {
|
|
|
- channels_40mhz[count].chanId =
|
|
|
- rf_channels[i].channelNum;
|
|
|
- channels_40mhz[count++].pwr =
|
|
|
- reg_channels[i].pwrLimit;
|
|
|
+ if (reg_channels[i].state) {
|
|
|
+ channels_40mhz[count].chan_num =
|
|
|
+ chan_mapping[i].chan_num;
|
|
|
+ channels_40mhz[count++].power =
|
|
|
+ reg_channels[i].pwr_limit;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (i = RF_CHAN_BOND_38; i <= RF_CHAN_BOND_163; i++) {
|
|
|
- if (reg_channels[i].enabled) {
|
|
|
- channels_40mhz[count].chanId =
|
|
|
- rf_channels[i].channelNum;
|
|
|
- channels_40mhz[count++].pwr =
|
|
|
- reg_channels[i].pwrLimit;
|
|
|
+ if (reg_channels[i].state) {
|
|
|
+ channels_40mhz[count].chan_num =
|
|
|
+ chan_mapping[i].chan_num;
|
|
|
+ channels_40mhz[count++].power =
|
|
|
+ reg_channels[i].pwr_limit;
|
|
|
}
|
|
|
}
|
|
|
*num_40mhz_channels = count;
|
|
@@ -609,19 +422,27 @@ CDF_STATUS cds_get_channel_list_with_power(tChannelListWithPower *
|
|
|
*
|
|
|
* Return: CDF_STATUS
|
|
|
*/
|
|
|
-CDF_STATUS cds_read_default_country(country_code_t default_country)
|
|
|
+CDF_STATUS cds_read_default_country(uint8_t *default_country)
|
|
|
{
|
|
|
- CDF_STATUS status = CDF_STATUS_SUCCESS;
|
|
|
+ hdd_context_t *hdd_ctx;
|
|
|
+
|
|
|
+ hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
|
|
|
+ if (!hdd_ctx) {
|
|
|
+ CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
|
+ "invalid hdd_ctx pointer");
|
|
|
+ return CDF_STATUS_E_FAULT;
|
|
|
+ }
|
|
|
|
|
|
memcpy(default_country,
|
|
|
- reg_table.default_country,
|
|
|
- sizeof(country_code_t));
|
|
|
+ hdd_ctx->reg.def_country,
|
|
|
+ CDS_COUNTRY_CODE_LEN + 1);
|
|
|
|
|
|
- pr_info("DefaultCountry is %c%c\n",
|
|
|
- default_country[0],
|
|
|
- default_country[1]);
|
|
|
+ CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_INFO,
|
|
|
+ "default country is %c%c\n",
|
|
|
+ default_country[0],
|
|
|
+ default_country[1]);
|
|
|
|
|
|
- return status;
|
|
|
+ return CDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -630,12 +451,12 @@ CDF_STATUS cds_read_default_country(country_code_t default_country)
|
|
|
*
|
|
|
* Return: enum for the channel
|
|
|
*/
|
|
|
-static eRfChannels cds_get_channel_enum(uint32_t chan_num)
|
|
|
+static enum channel_enum cds_get_channel_enum(uint32_t chan_num)
|
|
|
{
|
|
|
uint32_t loop;
|
|
|
|
|
|
for (loop = 0; loop <= RF_CHAN_184; loop++)
|
|
|
- if (rf_channels[loop].channelNum == chan_num)
|
|
|
+ if (chan_mapping[loop].chan_num == chan_num)
|
|
|
return loop;
|
|
|
|
|
|
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
@@ -647,19 +468,19 @@ static eRfChannels cds_get_channel_enum(uint32_t chan_num)
|
|
|
|
|
|
/**
|
|
|
* cds_get_channel_state() - get the channel state
|
|
|
- * @channel_num: channel number
|
|
|
+ * @chan_num: channel number
|
|
|
*
|
|
|
- * Return: CHANNEL_STATE
|
|
|
+ * Return: channel state
|
|
|
*/
|
|
|
-CHANNEL_STATE cds_get_channel_state(uint32_t chan_num)
|
|
|
+enum channel_state cds_get_channel_state(uint32_t chan_num)
|
|
|
{
|
|
|
- eRfChannels chan_enum;
|
|
|
+ enum channel_enum chan_enum;
|
|
|
|
|
|
chan_enum = cds_get_channel_enum(chan_num);
|
|
|
if (INVALID_RF_CHANNEL == chan_enum)
|
|
|
return CHANNEL_STATE_INVALID;
|
|
|
else
|
|
|
- return reg_channels[chan_enum].enabled;
|
|
|
+ return reg_channels[chan_enum].state;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -667,19 +488,19 @@ CHANNEL_STATE cds_get_channel_state(uint32_t chan_num)
|
|
|
* cds_get_bonded_channel_state() - get the bonded channel state
|
|
|
* @channel_num: channel number
|
|
|
*
|
|
|
- * Return: CHANNEL_STATE
|
|
|
+ * Return: channel state
|
|
|
*/
|
|
|
-CHANNEL_STATE cds_get_bonded_channel_state(uint32_t chan_num,
|
|
|
+enum channel_state cds_get_bonded_channel_state(uint32_t chan_num,
|
|
|
enum channel_width ch_width)
|
|
|
{
|
|
|
- eRfChannels chan_enum;
|
|
|
+ enum channel_enum chan_enum;
|
|
|
bool bw_enabled = false;
|
|
|
|
|
|
chan_enum = cds_get_channel_enum(chan_num);
|
|
|
if (INVALID_RF_CHANNEL == chan_enum)
|
|
|
return CHANNEL_STATE_INVALID;
|
|
|
|
|
|
- if (reg_channels[chan_enum].enabled) {
|
|
|
+ if (reg_channels[chan_enum].state) {
|
|
|
if (CHAN_WIDTH_5MHZ == ch_width)
|
|
|
bw_enabled = 1;
|
|
|
else if (CHAN_WIDTH_10MHZ == ch_width)
|
|
@@ -700,7 +521,7 @@ CHANNEL_STATE cds_get_bonded_channel_state(uint32_t chan_num,
|
|
|
}
|
|
|
|
|
|
if (bw_enabled)
|
|
|
- return reg_channels[chan_enum].enabled;
|
|
|
+ return reg_channels[chan_enum].state;
|
|
|
else
|
|
|
return CHANNEL_STATE_DISABLE;
|
|
|
}
|
|
@@ -713,13 +534,13 @@ CHANNEL_STATE cds_get_bonded_channel_state(uint32_t chan_num,
|
|
|
*/
|
|
|
enum channel_width cds_get_max_channel_bw(uint32_t chan_num)
|
|
|
{
|
|
|
- eRfChannels chan_enum;
|
|
|
+ enum channel_enum chan_enum;
|
|
|
enum channel_width chan_bw = CHAN_WIDTH_0MHZ;
|
|
|
|
|
|
chan_enum = cds_get_channel_enum(chan_num);
|
|
|
|
|
|
if ((INVALID_RF_CHANNEL != chan_enum) &&
|
|
|
- (CHANNEL_STATE_DISABLE != reg_channels[chan_enum].enabled)) {
|
|
|
+ (CHANNEL_STATE_DISABLE != reg_channels[chan_enum].state)) {
|
|
|
|
|
|
if (!(reg_channels[chan_enum].flags &
|
|
|
IEEE80211_CHAN_NO_160MHZ))
|
|
@@ -755,10 +576,6 @@ static int cds_bw20_ch_index_to_bw40_ch_index(int k)
|
|
|
m = k - RF_CHAN_1 + RF_CHAN_BOND_3;
|
|
|
if (m > RF_CHAN_BOND_11)
|
|
|
m = RF_CHAN_BOND_11;
|
|
|
- } else if (k >= RF_CHAN_240 && k <= RF_CHAN_216) {
|
|
|
- m = k - RF_CHAN_240 + RF_CHAN_BOND_242;
|
|
|
- if (m > RF_CHAN_BOND_214)
|
|
|
- m = RF_CHAN_BOND_214;
|
|
|
} else if (k >= RF_CHAN_36 && k <= RF_CHAN_64) {
|
|
|
m = k - RF_CHAN_36 + RF_CHAN_BOND_38;
|
|
|
if (m > RF_CHAN_BOND_62)
|
|
@@ -786,31 +603,31 @@ static int cds_bw20_ch_index_to_bw40_ch_index(int k)
|
|
|
*/
|
|
|
CDF_STATUS cds_set_dfs_region(uint8_t dfs_region)
|
|
|
{
|
|
|
- hdd_context_t *hdd_ctx_ptr = NULL;
|
|
|
+ hdd_context_t *hdd_ctx;
|
|
|
|
|
|
- hdd_ctx_ptr = cds_get_context(CDF_MODULE_ID_HDD);
|
|
|
+ hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
|
|
|
|
|
|
- if (NULL == hdd_ctx_ptr)
|
|
|
+ if (NULL == hdd_ctx)
|
|
|
return CDF_STATUS_E_EXISTS;
|
|
|
|
|
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(WITH_BACKPORTS)
|
|
|
- hdd_ctx_ptr->reg.dfs_region = dfs_region;
|
|
|
+ hdd_ctx->reg.dfs_region = dfs_region;
|
|
|
#else
|
|
|
|
|
|
/* remap the ctl code to dfs region code */
|
|
|
- switch (hdd_ctx_ptr->reg.ctl_5g) {
|
|
|
+ switch (hdd_ctx->reg.ctl_5g) {
|
|
|
case FCC:
|
|
|
- hdd_ctx_ptr->reg.dfs_region = DFS_FCC_DOMAIN;
|
|
|
+ hdd_ctx->reg.dfs_region = DFS_FCC_DOMAIN;
|
|
|
break;
|
|
|
case ETSI:
|
|
|
- hdd_ctx_ptr->reg.dfs_region = DFS_ETSI_DOMAIN;
|
|
|
+ hdd_ctx->reg.dfs_region = DFS_ETSI_DOMAIN;
|
|
|
break;
|
|
|
case MKK:
|
|
|
- hdd_ctx_ptr->reg.dfs_region = DFS_MKK4_DOMAIN;
|
|
|
+ hdd_ctx->reg.dfs_region = DFS_MKK4_DOMAIN;
|
|
|
break;
|
|
|
default:
|
|
|
/* set default dfs_region to FCC */
|
|
|
- hdd_ctx_ptr->reg.dfs_region = DFS_FCC_DOMAIN;
|
|
|
+ hdd_ctx->reg.dfs_region = DFS_FCC_DOMAIN;
|
|
|
break;
|
|
|
}
|
|
|
#endif
|
|
@@ -826,14 +643,14 @@ CDF_STATUS cds_set_dfs_region(uint8_t dfs_region)
|
|
|
*/
|
|
|
CDF_STATUS cds_get_dfs_region(uint8_t *dfs_region)
|
|
|
{
|
|
|
- hdd_context_t *hdd_ctx_ptr = NULL;
|
|
|
+ hdd_context_t *hdd_ctx;
|
|
|
|
|
|
- hdd_ctx_ptr = cds_get_context(CDF_MODULE_ID_HDD);
|
|
|
+ hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
|
|
|
|
|
|
- if (NULL == hdd_ctx_ptr)
|
|
|
+ if (NULL == hdd_ctx)
|
|
|
return CDF_STATUS_E_EXISTS;
|
|
|
|
|
|
- *dfs_region = hdd_ctx_ptr->reg.dfs_region;
|
|
|
+ *dfs_region = hdd_ctx->reg.dfs_region;
|
|
|
|
|
|
return CDF_STATUS_SUCCESS;
|
|
|
}
|
|
@@ -847,14 +664,11 @@ CDF_STATUS cds_get_dfs_region(uint8_t *dfs_region)
|
|
|
* CDF_STATUS_E_EMPTY country table empty
|
|
|
*/
|
|
|
CDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
|
|
|
- const country_code_t
|
|
|
- country_code,
|
|
|
- v_CountryInfoSource_t source)
|
|
|
+ const uint8_t *country_alpha2,
|
|
|
+ enum country_src source)
|
|
|
{
|
|
|
- v_CONTEXT_t cds_context = NULL;
|
|
|
hdd_context_t *hdd_ctx = NULL;
|
|
|
struct wiphy *wiphy = NULL;
|
|
|
- int i;
|
|
|
|
|
|
if (NULL == reg_domain_ptr) {
|
|
|
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
@@ -862,26 +676,24 @@ CDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
|
|
|
return CDF_STATUS_E_FAULT;
|
|
|
}
|
|
|
|
|
|
- *reg_domain_ptr = REGDOMAIN_COUNT;
|
|
|
+ *reg_domain_ptr = 0;
|
|
|
|
|
|
- if (NULL == country_code) {
|
|
|
+ if (SOURCE_QUERY == source)
|
|
|
+ return CDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+ if (NULL == country_alpha2) {
|
|
|
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
|
("Country code array is NULL"));
|
|
|
return CDF_STATUS_E_FAULT;
|
|
|
}
|
|
|
|
|
|
- if (0 == country_info_table.countryCount) {
|
|
|
+ if (cds_is_driver_recovering()) {
|
|
|
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
|
- ("Reg domain table is empty"));
|
|
|
- return CDF_STATUS_E_EMPTY;
|
|
|
+ "SSR in progress, return");
|
|
|
+ return CDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
- cds_context = cds_get_global_context();
|
|
|
-
|
|
|
- if (NULL != cds_context)
|
|
|
- hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
|
|
|
- else
|
|
|
- return CDF_STATUS_E_EXISTS;
|
|
|
+ hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
|
|
|
|
|
|
if (NULL == hdd_ctx) {
|
|
|
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
@@ -891,51 +703,19 @@ CDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
|
|
|
|
|
|
wiphy = hdd_ctx->wiphy;
|
|
|
|
|
|
- if (cds_is_logp_in_progress()) {
|
|
|
- CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
|
- "SSR in progress, return");
|
|
|
- *reg_domain_ptr = temp_reg_domain;
|
|
|
- return CDF_STATUS_SUCCESS;
|
|
|
- }
|
|
|
-
|
|
|
- temp_reg_domain = REGDOMAIN_COUNT;
|
|
|
- for (i = 0; i < country_info_table.countryCount &&
|
|
|
- REGDOMAIN_COUNT == temp_reg_domain; i++) {
|
|
|
- if (memcmp(country_code,
|
|
|
- country_info_table.countryInfo[i].countryCode,
|
|
|
- CDS_COUNTRY_CODE_LEN) == 0) {
|
|
|
-
|
|
|
- temp_reg_domain =
|
|
|
- country_info_table.countryInfo[i].regDomain;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (REGDOMAIN_COUNT == temp_reg_domain) {
|
|
|
- CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
|
- ("Country does not map to any Regulatory domain"));
|
|
|
- temp_reg_domain = REGDOMAIN_WORLD;
|
|
|
- }
|
|
|
-
|
|
|
- if (COUNTRY_QUERY == source) {
|
|
|
- *reg_domain_ptr = temp_reg_domain;
|
|
|
- return CDF_STATUS_SUCCESS;
|
|
|
- }
|
|
|
-
|
|
|
- if ((COUNTRY_INIT == source) && (false == init_by_reg_core)) {
|
|
|
+ if ((SOURCE_DRIVER == source) && (false == init_by_reg_core)) {
|
|
|
init_by_driver = true;
|
|
|
- if (('0' != country_code[0]) || ('0' != country_code[1])) {
|
|
|
+ if (('0' != country_alpha2[0]) || ('0' != country_alpha2[1])) {
|
|
|
INIT_COMPLETION(hdd_ctx->reg_init);
|
|
|
- regulatory_hint(wiphy, country_code);
|
|
|
+ regulatory_hint(wiphy, country_alpha2);
|
|
|
wait_for_completion_timeout(&hdd_ctx->reg_init,
|
|
|
msecs_to_jiffies(REG_WAIT_TIME));
|
|
|
}
|
|
|
- } else if (COUNTRY_IE == source || COUNTRY_USER == source) {
|
|
|
- regulatory_hint_user(country_code,
|
|
|
+ } else if (SOURCE_11D == source || SOURCE_USERSPACE == source) {
|
|
|
+ regulatory_hint_user(country_alpha2,
|
|
|
NL80211_USER_REG_HINT_USER);
|
|
|
}
|
|
|
|
|
|
- *reg_domain_ptr = temp_reg_domain;
|
|
|
return CDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
@@ -948,26 +728,13 @@ CDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
|
|
|
*/
|
|
|
bool cds_is_dsrc_channel(uint16_t center_freq)
|
|
|
{
|
|
|
- switch (center_freq) {
|
|
|
- case 5852:
|
|
|
- case 5860:
|
|
|
- case 5870:
|
|
|
- case 5880:
|
|
|
- case 5890:
|
|
|
- case 5900:
|
|
|
- case 5910:
|
|
|
- case 5920:
|
|
|
- case 5875:
|
|
|
- case 5905:
|
|
|
+ if (center_freq >= 5852 &&
|
|
|
+ center_freq <= 5920)
|
|
|
return 1;
|
|
|
- }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-#ifdef FEATURE_STATICALLY_ADD_11P_CHANNELS
|
|
|
-#define DEFAULT_11P_POWER (30)
|
|
|
-#endif
|
|
|
-
|
|
|
/**
|
|
|
* cds_process_regulatory_data() - process regulatory data
|
|
|
* @wiphy: wiphy
|
|
@@ -976,16 +743,15 @@ bool cds_is_dsrc_channel(uint16_t center_freq)
|
|
|
* Return: int
|
|
|
*/
|
|
|
static int cds_process_regulatory_data(struct wiphy *wiphy,
|
|
|
- uint8_t band_capability, bool reset)
|
|
|
+ uint8_t band_capability,
|
|
|
+ bool reset)
|
|
|
{
|
|
|
int i, j, m;
|
|
|
int k = 0, n = 0;
|
|
|
hdd_context_t *hdd_ctx;
|
|
|
const struct ieee80211_reg_rule *reg_rule;
|
|
|
struct ieee80211_channel *chan;
|
|
|
- sRegulatoryChannel *temp_chan_k;
|
|
|
- sRegulatoryChannel *temp_chan_n;
|
|
|
- sRegulatoryChannel *temp_chan;
|
|
|
+ struct regulatory_channel *temp_chan_k, *temp_chan_n, *temp_chan;
|
|
|
|
|
|
hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
|
|
|
if (NULL == hdd_ctx) {
|
|
@@ -1023,13 +789,8 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
|
|
|
n = cds_bw20_ch_index_to_bw40_ch_index(k);
|
|
|
|
|
|
chan = &(wiphy->bands[i]->channels[j]);
|
|
|
- temp_chan_k =
|
|
|
- &(reg_table.regDomains[temp_reg_domain].
|
|
|
- channels[k]);
|
|
|
-
|
|
|
- temp_chan_n =
|
|
|
- &(reg_table.regDomains[temp_reg_domain].
|
|
|
- channels[n]);
|
|
|
+ temp_chan_k = &(reg_channels[k]);
|
|
|
+ temp_chan_n = &(reg_channels[n]);
|
|
|
|
|
|
if ((!reset) &&
|
|
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(WITH_BACKPORTS)
|
|
@@ -1086,21 +847,12 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#ifdef FEATURE_STATICALLY_ADD_11P_CHANNELS
|
|
|
- if (is_dsrc_channel(chan->center_freq)) {
|
|
|
- temp_chan_k->enabled =
|
|
|
- CHANNEL_STATE_ENABLE;
|
|
|
- temp_chan_k->pwrLimit =
|
|
|
- DEFAULT_11P_POWER;
|
|
|
- temp_chan_k->flags = chan->flags;
|
|
|
- } else
|
|
|
-#endif
|
|
|
if (chan->flags & IEEE80211_CHAN_DISABLED) {
|
|
|
- temp_chan_k->enabled =
|
|
|
+ temp_chan_k->state =
|
|
|
CHANNEL_STATE_DISABLE;
|
|
|
temp_chan_k->flags = chan->flags;
|
|
|
if (n != -1) {
|
|
|
- temp_chan_n->enabled =
|
|
|
+ temp_chan_n->state =
|
|
|
CHANNEL_STATE_DISABLE;
|
|
|
temp_chan_n->flags = chan->flags;
|
|
|
}
|
|
@@ -1119,8 +871,8 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
|
|
|
chan->flags |=
|
|
|
IEEE80211_CHAN_PASSIVE_SCAN;
|
|
|
#endif
|
|
|
- temp_chan_k->enabled = CHANNEL_STATE_DFS;
|
|
|
- temp_chan_k->pwrLimit =
|
|
|
+ temp_chan_k->state = CHANNEL_STATE_DFS;
|
|
|
+ temp_chan_k->pwr_limit =
|
|
|
chan->max_power;
|
|
|
temp_chan_k->flags = chan->flags;
|
|
|
|
|
@@ -1128,12 +880,12 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
|
|
|
if ((chan->flags &
|
|
|
IEEE80211_CHAN_NO_HT40) ==
|
|
|
IEEE80211_CHAN_NO_HT40) {
|
|
|
- temp_chan_n->enabled =
|
|
|
+ temp_chan_n->state =
|
|
|
CHANNEL_STATE_DISABLE;
|
|
|
} else {
|
|
|
- temp_chan_n->enabled =
|
|
|
+ temp_chan_n->state =
|
|
|
CHANNEL_STATE_DFS;
|
|
|
- temp_chan_n->pwrLimit =
|
|
|
+ temp_chan_n->pwr_limit =
|
|
|
chan->max_power-3;
|
|
|
}
|
|
|
temp_chan_n->flags = chan->flags;
|
|
@@ -1142,19 +894,19 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
|
|
|
IEEE80211_CHAN_NO_80MHZ) == 0)
|
|
|
hdd_ctx->isVHT80Allowed = 1;
|
|
|
} else {
|
|
|
- temp_chan_k->enabled = CHANNEL_STATE_ENABLE;
|
|
|
- temp_chan_k->pwrLimit = chan->max_power;
|
|
|
+ temp_chan_k->state = CHANNEL_STATE_ENABLE;
|
|
|
+ temp_chan_k->pwr_limit = chan->max_power;
|
|
|
temp_chan_k->flags = chan->flags;
|
|
|
if (n != -1) {
|
|
|
if ((chan->flags &
|
|
|
IEEE80211_CHAN_NO_HT40) ==
|
|
|
IEEE80211_CHAN_NO_HT40) {
|
|
|
- temp_chan_n->enabled =
|
|
|
+ temp_chan_n->state =
|
|
|
CHANNEL_STATE_DISABLE;
|
|
|
} else {
|
|
|
- temp_chan_n->enabled =
|
|
|
+ temp_chan_n->state =
|
|
|
CHANNEL_STATE_ENABLE;
|
|
|
- temp_chan_n->pwrLimit =
|
|
|
+ temp_chan_n->pwr_limit =
|
|
|
chan->max_power - 3;
|
|
|
}
|
|
|
temp_chan_n->flags = chan->flags;
|
|
@@ -1168,9 +920,8 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
|
|
|
|
|
|
if (0 == (hdd_ctx->reg.eeprom_rd_ext &
|
|
|
(1 << WHAL_REG_EXT_FCC_CH_144))) {
|
|
|
- temp_chan = &(reg_table.regDomains[temp_reg_domain].
|
|
|
- channels[RF_CHAN_144]);
|
|
|
- temp_chan->enabled =
|
|
|
+ temp_chan = &(reg_channels[RF_CHAN_144]);
|
|
|
+ temp_chan->state =
|
|
|
CHANNEL_STATE_DISABLE;
|
|
|
}
|
|
|
|
|
@@ -1220,8 +971,6 @@ void __hdd_reg_notifier(struct wiphy *wiphy,
|
|
|
{
|
|
|
hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
|
|
|
eCsrBand band_capability = eCSR_BAND_ALL;
|
|
|
- country_code_t country_code;
|
|
|
- int i;
|
|
|
bool vht80_allowed;
|
|
|
bool reset = false;
|
|
|
|
|
@@ -1238,7 +987,7 @@ void __hdd_reg_notifier(struct wiphy *wiphy,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (hdd_ctx->isUnloadInProgress || hdd_ctx->isLogpInProgress) {
|
|
|
+ if (cds_is_driver_unloading() || cds_is_driver_recovering()) {
|
|
|
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
|
"%s: Unloading or SSR in Progress, Ignore!!!",
|
|
|
__func__);
|
|
@@ -1279,17 +1028,17 @@ void __hdd_reg_notifier(struct wiphy *wiphy,
|
|
|
}
|
|
|
|
|
|
if (NL80211_REGDOM_SET_BY_CORE == request->initiator) {
|
|
|
- hdd_ctx->reg.cc_src = COUNTRY_CODE_SET_BY_CORE;
|
|
|
+ hdd_ctx->reg.cc_src = SOURCE_CORE;
|
|
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(WITH_BACKPORTS)
|
|
|
if (wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
|
|
|
#else
|
|
|
- if (wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY)
|
|
|
+ if (wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY)
|
|
|
#endif
|
|
|
- reset = true;
|
|
|
+ reset = true;
|
|
|
} else if (NL80211_REGDOM_SET_BY_DRIVER == request->initiator)
|
|
|
- hdd_ctx->reg.cc_src = COUNTRY_CODE_SET_BY_DRIVER;
|
|
|
+ hdd_ctx->reg.cc_src = SOURCE_DRIVER;
|
|
|
else {
|
|
|
- hdd_ctx->reg.cc_src = COUNTRY_CODE_SET_BY_USER;
|
|
|
+ hdd_ctx->reg.cc_src = SOURCE_USERSPACE;
|
|
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) && !defined(WITH_BACKPORTS)
|
|
|
if ((request->alpha2[0] == '0') &&
|
|
|
(request->alpha2[1] == '0') &&
|
|
@@ -1300,31 +1049,11 @@ void __hdd_reg_notifier(struct wiphy *wiphy,
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
- /* first lookup the country in the local database */
|
|
|
- country_code[0] = request->alpha2[0];
|
|
|
- country_code[1] = request->alpha2[1];
|
|
|
-
|
|
|
hdd_ctx->reg.alpha2[0] = request->alpha2[0];
|
|
|
hdd_ctx->reg.alpha2[1] = request->alpha2[1];
|
|
|
|
|
|
cds_update_regulatory_info(hdd_ctx);
|
|
|
|
|
|
- temp_reg_domain = REGDOMAIN_COUNT;
|
|
|
- for (i = 0; i < country_info_table.countryCount &&
|
|
|
- REGDOMAIN_COUNT == temp_reg_domain; i++) {
|
|
|
- if (memcmp(country_code,
|
|
|
- country_info_table.countryInfo[i].countryCode,
|
|
|
- CDS_COUNTRY_CODE_LEN) == 0) {
|
|
|
-
|
|
|
- temp_reg_domain =
|
|
|
- country_info_table.countryInfo[i].regDomain;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (REGDOMAIN_COUNT == temp_reg_domain)
|
|
|
- temp_reg_domain = REGDOMAIN_WORLD;
|
|
|
-
|
|
|
vht80_allowed = hdd_ctx->isVHT80Allowed;
|
|
|
if (cds_process_regulatory_data(wiphy, band_capability,
|
|
|
reset) == 0) {
|
|
@@ -1337,16 +1066,8 @@ void __hdd_reg_notifier(struct wiphy *wiphy,
|
|
|
if (NL80211_REGDOM_SET_BY_DRIVER == request->initiator)
|
|
|
complete(&hdd_ctx->reg_init);
|
|
|
|
|
|
- if (request->alpha2[0] == '0'
|
|
|
- && request->alpha2[1] == '0') {
|
|
|
- sme_generic_change_country_code(hdd_ctx->hHal,
|
|
|
- country_code,
|
|
|
- REGDOMAIN_COUNT);
|
|
|
- } else {
|
|
|
- sme_generic_change_country_code(hdd_ctx->hHal,
|
|
|
- country_code,
|
|
|
- temp_reg_domain);
|
|
|
- }
|
|
|
+ sme_generic_change_country_code(hdd_ctx->hHal,
|
|
|
+ hdd_ctx->reg.alpha2);
|
|
|
|
|
|
cds_fill_and_send_ctl_to_fw(&hdd_ctx->reg);
|
|
|
|
|
@@ -1381,21 +1102,15 @@ void hdd_reg_notifier(struct wiphy *wiphy,
|
|
|
*/
|
|
|
CDF_STATUS cds_regulatory_init(void)
|
|
|
{
|
|
|
- v_CONTEXT_t cds_context = NULL;
|
|
|
hdd_context_t *hdd_ctx = NULL;
|
|
|
struct wiphy *wiphy = NULL;
|
|
|
int ret_val = 0;
|
|
|
struct regulatory *reg_info;
|
|
|
|
|
|
- cds_context = cds_get_global_context();
|
|
|
-
|
|
|
- if (!cds_context)
|
|
|
- return CDF_STATUS_E_FAULT;
|
|
|
-
|
|
|
hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
|
|
|
if (!hdd_ctx) {
|
|
|
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
|
- ("Invalid pHddCtx pointer"));
|
|
|
+ "invalid hdd_ctx pointer");
|
|
|
return CDF_STATUS_E_FAULT;
|
|
|
}
|
|
|
|
|
@@ -1405,8 +1120,6 @@ CDF_STATUS cds_regulatory_init(void)
|
|
|
|
|
|
cds_regulatory_wiphy_init(hdd_ctx, reg_info, wiphy);
|
|
|
|
|
|
- temp_reg_domain = REGDOMAIN_WORLD;
|
|
|
-
|
|
|
if (cds_process_regulatory_data(wiphy,
|
|
|
hdd_ctx->config->
|
|
|
nBandCapability, true) != 0) {
|
|
@@ -1415,7 +1128,7 @@ CDF_STATUS cds_regulatory_init(void)
|
|
|
return CDF_STATUS_E_FAULT;
|
|
|
}
|
|
|
|
|
|
- reg_info->cc_src = COUNTRY_CODE_SET_BY_DRIVER;
|
|
|
+ reg_info->cc_src = SOURCE_DRIVER;
|
|
|
|
|
|
ret_val = cds_fill_some_regulatory_info(reg_info);
|
|
|
if (ret_val) {
|
|
@@ -1423,8 +1136,8 @@ CDF_STATUS cds_regulatory_init(void)
|
|
|
return ret_val;
|
|
|
}
|
|
|
|
|
|
- reg_table.default_country[0] = reg_info->alpha2[0];
|
|
|
- reg_table.default_country[1] = reg_info->alpha2[1];
|
|
|
+ hdd_ctx->reg.def_country[0] = reg_info->alpha2[0];
|
|
|
+ hdd_ctx->reg.def_country[1] = reg_info->alpha2[1];
|
|
|
|
|
|
init_completion(&hdd_ctx->reg_init);
|
|
|
|
|
@@ -1449,7 +1162,29 @@ CDF_STATUS cds_set_reg_domain(void *client_ctxt, v_REGDOMAIN_t reg_domain)
|
|
|
return CDF_STATUS_E_INVAL;
|
|
|
}
|
|
|
|
|
|
- reg_channels = reg_table.regDomains[reg_domain].channels;
|
|
|
-
|
|
|
return CDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * cds_set_ch_params() - set channel parameters
|
|
|
+ * @ch: channel
|
|
|
+ * @phy_mode: physical mode
|
|
|
+ * @ch_param: channel parameters will be returned
|
|
|
+ *
|
|
|
+ * Return: None
|
|
|
+ */
|
|
|
+void cds_set_ch_params(uint8_t ch, uint32_t phy_mode,
|
|
|
+ chan_params_t *ch_params)
|
|
|
+{
|
|
|
+ tHalHandle *hal_ctx = cds_get_context(CDF_MODULE_ID_PE);
|
|
|
+ if (!hal_ctx) {
|
|
|
+ CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
|
|
|
+ ("Invalid hal_ctx pointer"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ * TODO: remove SME call and move the SME set channel
|
|
|
+ * param functionality to CDS.
|
|
|
+ */
|
|
|
+ sme_set_ch_params(hal_ctx, phy_mode, ch, 0, ch_params);
|
|
|
+}
|