Commit d896d463 authored by John W. Linville's avatar John W. Linville
parents 0a8a721d 758f555f
# WIFI # WIFI
obj-$(CONFIG_IWLWIFI) += iwlwifi.o obj-$(CONFIG_IWLWIFI) += iwlwifi.o
iwlwifi-objs := iwl-agn.o iwl-agn-rs.o iwl-mac80211.o iwlwifi-objs := iwl-agn.o iwl-agn-rs.o iwl-mac80211.o
iwlwifi-objs += iwl-ucode.o iwl-agn-tx.o iwlwifi-objs += iwl-ucode.o iwl-agn-tx.o iwl-debug.o
iwlwifi-objs += iwl-agn-lib.o iwl-agn-calib.o iwl-io.o iwlwifi-objs += iwl-agn-lib.o iwl-agn-calib.o iwl-io.o
iwlwifi-objs += iwl-agn-tt.o iwl-agn-sta.o iwl-agn-rx.o iwlwifi-objs += iwl-agn-tt.o iwl-agn-sta.o iwl-agn-rx.o
......
...@@ -120,7 +120,7 @@ static struct iwl_sensitivity_ranges iwl1000_sensitivity = { ...@@ -120,7 +120,7 @@ static struct iwl_sensitivity_ranges iwl1000_sensitivity = {
.nrg_th_cca = 62, .nrg_th_cca = 62,
}; };
static int iwl1000_hw_set_hw_params(struct iwl_priv *priv) static void iwl1000_hw_set_hw_params(struct iwl_priv *priv)
{ {
if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES && if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES &&
iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES) iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES)
...@@ -128,8 +128,6 @@ static int iwl1000_hw_set_hw_params(struct iwl_priv *priv) ...@@ -128,8 +128,6 @@ static int iwl1000_hw_set_hw_params(struct iwl_priv *priv)
iwlagn_mod_params.num_of_queues; iwlagn_mod_params.num_of_queues;
hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues; hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues;
hw_params(priv).max_data_size = IWLAGN_RTC_DATA_SIZE;
hw_params(priv).max_inst_size = IWLAGN_RTC_INST_SIZE;
hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ); hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ);
...@@ -146,8 +144,6 @@ static int iwl1000_hw_set_hw_params(struct iwl_priv *priv) ...@@ -146,8 +144,6 @@ static int iwl1000_hw_set_hw_params(struct iwl_priv *priv)
/* Set initial sensitivity parameters */ /* Set initial sensitivity parameters */
hw_params(priv).sens = &iwl1000_sensitivity; hw_params(priv).sens = &iwl1000_sensitivity;
return 0;
} }
static struct iwl_lib_ops iwl1000_lib = { static struct iwl_lib_ops iwl1000_lib = {
...@@ -193,6 +189,8 @@ static struct iwl_ht_params iwl1000_ht_params = { ...@@ -193,6 +189,8 @@ static struct iwl_ht_params iwl1000_ht_params = {
.ucode_api_max = IWL1000_UCODE_API_MAX, \ .ucode_api_max = IWL1000_UCODE_API_MAX, \
.ucode_api_ok = IWL1000_UCODE_API_OK, \ .ucode_api_ok = IWL1000_UCODE_API_OK, \
.ucode_api_min = IWL1000_UCODE_API_MIN, \ .ucode_api_min = IWL1000_UCODE_API_MIN, \
.max_inst_size = IWLAGN_RTC_INST_SIZE, \
.max_data_size = IWLAGN_RTC_DATA_SIZE, \
.eeprom_ver = EEPROM_1000_EEPROM_VERSION, \ .eeprom_ver = EEPROM_1000_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_1000_TX_POWER_VERSION, \ .eeprom_calib_ver = EEPROM_1000_TX_POWER_VERSION, \
.lib = &iwl1000_lib, \ .lib = &iwl1000_lib, \
...@@ -215,6 +213,8 @@ struct iwl_cfg iwl1000_bg_cfg = { ...@@ -215,6 +213,8 @@ struct iwl_cfg iwl1000_bg_cfg = {
.ucode_api_max = IWL100_UCODE_API_MAX, \ .ucode_api_max = IWL100_UCODE_API_MAX, \
.ucode_api_ok = IWL100_UCODE_API_OK, \ .ucode_api_ok = IWL100_UCODE_API_OK, \
.ucode_api_min = IWL100_UCODE_API_MIN, \ .ucode_api_min = IWL100_UCODE_API_MIN, \
.max_inst_size = IWLAGN_RTC_INST_SIZE, \
.max_data_size = IWLAGN_RTC_DATA_SIZE, \
.eeprom_ver = EEPROM_1000_EEPROM_VERSION, \ .eeprom_ver = EEPROM_1000_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_1000_TX_POWER_VERSION, \ .eeprom_calib_ver = EEPROM_1000_TX_POWER_VERSION, \
.lib = &iwl1000_lib, \ .lib = &iwl1000_lib, \
......
...@@ -116,7 +116,7 @@ static struct iwl_sensitivity_ranges iwl2000_sensitivity = { ...@@ -116,7 +116,7 @@ static struct iwl_sensitivity_ranges iwl2000_sensitivity = {
.nrg_th_cca = 62, .nrg_th_cca = 62,
}; };
static int iwl2000_hw_set_hw_params(struct iwl_priv *priv) static void iwl2000_hw_set_hw_params(struct iwl_priv *priv)
{ {
if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES && if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES &&
iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES) iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES)
...@@ -124,8 +124,6 @@ static int iwl2000_hw_set_hw_params(struct iwl_priv *priv) ...@@ -124,8 +124,6 @@ static int iwl2000_hw_set_hw_params(struct iwl_priv *priv)
iwlagn_mod_params.num_of_queues; iwlagn_mod_params.num_of_queues;
hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues; hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues;
hw_params(priv).max_data_size = IWL60_RTC_DATA_SIZE;
hw_params(priv).max_inst_size = IWL60_RTC_INST_SIZE;
hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ); hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ);
...@@ -142,8 +140,6 @@ static int iwl2000_hw_set_hw_params(struct iwl_priv *priv) ...@@ -142,8 +140,6 @@ static int iwl2000_hw_set_hw_params(struct iwl_priv *priv)
/* Set initial sensitivity parameters */ /* Set initial sensitivity parameters */
hw_params(priv).sens = &iwl2000_sensitivity; hw_params(priv).sens = &iwl2000_sensitivity;
return 0;
} }
static struct iwl_lib_ops iwl2000_lib = { static struct iwl_lib_ops iwl2000_lib = {
...@@ -242,6 +238,8 @@ static struct iwl_bt_params iwl2030_bt_params = { ...@@ -242,6 +238,8 @@ static struct iwl_bt_params iwl2030_bt_params = {
.ucode_api_max = IWL2000_UCODE_API_MAX, \ .ucode_api_max = IWL2000_UCODE_API_MAX, \
.ucode_api_ok = IWL2000_UCODE_API_OK, \ .ucode_api_ok = IWL2000_UCODE_API_OK, \
.ucode_api_min = IWL2000_UCODE_API_MIN, \ .ucode_api_min = IWL2000_UCODE_API_MIN, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.eeprom_ver = EEPROM_2000_EEPROM_VERSION, \ .eeprom_ver = EEPROM_2000_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \ .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.lib = &iwl2000_lib, \ .lib = &iwl2000_lib, \
...@@ -268,6 +266,8 @@ struct iwl_cfg iwl2000_2bgn_d_cfg = { ...@@ -268,6 +266,8 @@ struct iwl_cfg iwl2000_2bgn_d_cfg = {
.ucode_api_max = IWL2030_UCODE_API_MAX, \ .ucode_api_max = IWL2030_UCODE_API_MAX, \
.ucode_api_ok = IWL2030_UCODE_API_OK, \ .ucode_api_ok = IWL2030_UCODE_API_OK, \
.ucode_api_min = IWL2030_UCODE_API_MIN, \ .ucode_api_min = IWL2030_UCODE_API_MIN, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.eeprom_ver = EEPROM_2000_EEPROM_VERSION, \ .eeprom_ver = EEPROM_2000_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \ .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.lib = &iwl2030_lib, \ .lib = &iwl2030_lib, \
...@@ -290,6 +290,8 @@ struct iwl_cfg iwl2030_2bgn_cfg = { ...@@ -290,6 +290,8 @@ struct iwl_cfg iwl2030_2bgn_cfg = {
.ucode_api_max = IWL105_UCODE_API_MAX, \ .ucode_api_max = IWL105_UCODE_API_MAX, \
.ucode_api_ok = IWL105_UCODE_API_OK, \ .ucode_api_ok = IWL105_UCODE_API_OK, \
.ucode_api_min = IWL105_UCODE_API_MIN, \ .ucode_api_min = IWL105_UCODE_API_MIN, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.eeprom_ver = EEPROM_2000_EEPROM_VERSION, \ .eeprom_ver = EEPROM_2000_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \ .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.lib = &iwl2000_lib, \ .lib = &iwl2000_lib, \
...@@ -318,6 +320,8 @@ struct iwl_cfg iwl105_bgn_d_cfg = { ...@@ -318,6 +320,8 @@ struct iwl_cfg iwl105_bgn_d_cfg = {
.ucode_api_max = IWL135_UCODE_API_MAX, \ .ucode_api_max = IWL135_UCODE_API_MAX, \
.ucode_api_ok = IWL135_UCODE_API_OK, \ .ucode_api_ok = IWL135_UCODE_API_OK, \
.ucode_api_min = IWL135_UCODE_API_MIN, \ .ucode_api_min = IWL135_UCODE_API_MIN, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.eeprom_ver = EEPROM_2000_EEPROM_VERSION, \ .eeprom_ver = EEPROM_2000_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \ .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
.lib = &iwl2030_lib, \ .lib = &iwl2030_lib, \
......
...@@ -162,7 +162,7 @@ static void iwl5000_set_ct_threshold(struct iwl_priv *priv) ...@@ -162,7 +162,7 @@ static void iwl5000_set_ct_threshold(struct iwl_priv *priv)
hw_params(priv).ct_kill_threshold = CT_KILL_THRESHOLD_LEGACY; hw_params(priv).ct_kill_threshold = CT_KILL_THRESHOLD_LEGACY;
} }
static int iwl5000_hw_set_hw_params(struct iwl_priv *priv) static void iwl5000_hw_set_hw_params(struct iwl_priv *priv)
{ {
if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES && if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES &&
iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES) iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES)
...@@ -170,8 +170,6 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv) ...@@ -170,8 +170,6 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
iwlagn_mod_params.num_of_queues; iwlagn_mod_params.num_of_queues;
hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues; hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues;
hw_params(priv).max_data_size = IWLAGN_RTC_DATA_SIZE;
hw_params(priv).max_inst_size = IWLAGN_RTC_INST_SIZE;
hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) |
BIT(IEEE80211_BAND_5GHZ); BIT(IEEE80211_BAND_5GHZ);
...@@ -185,11 +183,9 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv) ...@@ -185,11 +183,9 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
/* Set initial sensitivity parameters */ /* Set initial sensitivity parameters */
hw_params(priv).sens = &iwl5000_sensitivity; hw_params(priv).sens = &iwl5000_sensitivity;
return 0;
} }
static int iwl5150_hw_set_hw_params(struct iwl_priv *priv) static void iwl5150_hw_set_hw_params(struct iwl_priv *priv)
{ {
if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES && if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES &&
iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES) iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES)
...@@ -197,8 +193,6 @@ static int iwl5150_hw_set_hw_params(struct iwl_priv *priv) ...@@ -197,8 +193,6 @@ static int iwl5150_hw_set_hw_params(struct iwl_priv *priv)
iwlagn_mod_params.num_of_queues; iwlagn_mod_params.num_of_queues;
hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues; hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues;
hw_params(priv).max_data_size = IWLAGN_RTC_DATA_SIZE;
hw_params(priv).max_inst_size = IWLAGN_RTC_INST_SIZE;
hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) |
BIT(IEEE80211_BAND_5GHZ); BIT(IEEE80211_BAND_5GHZ);
...@@ -212,8 +206,6 @@ static int iwl5150_hw_set_hw_params(struct iwl_priv *priv) ...@@ -212,8 +206,6 @@ static int iwl5150_hw_set_hw_params(struct iwl_priv *priv)
/* Set initial sensitivity parameters */ /* Set initial sensitivity parameters */
hw_params(priv).sens = &iwl5150_sensitivity; hw_params(priv).sens = &iwl5150_sensitivity;
return 0;
} }
static void iwl5150_temperature(struct iwl_priv *priv) static void iwl5150_temperature(struct iwl_priv *priv)
...@@ -356,6 +348,8 @@ static struct iwl_ht_params iwl5000_ht_params = { ...@@ -356,6 +348,8 @@ static struct iwl_ht_params iwl5000_ht_params = {
.fw_name_pre = IWL5000_FW_PRE, \ .fw_name_pre = IWL5000_FW_PRE, \
.ucode_api_max = IWL5000_UCODE_API_MAX, \ .ucode_api_max = IWL5000_UCODE_API_MAX, \
.ucode_api_min = IWL5000_UCODE_API_MIN, \ .ucode_api_min = IWL5000_UCODE_API_MIN, \
.max_inst_size = IWLAGN_RTC_INST_SIZE, \
.max_data_size = IWLAGN_RTC_DATA_SIZE, \
.eeprom_ver = EEPROM_5000_EEPROM_VERSION, \ .eeprom_ver = EEPROM_5000_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, \ .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, \
.lib = &iwl5000_lib, \ .lib = &iwl5000_lib, \
...@@ -399,6 +393,8 @@ struct iwl_cfg iwl5350_agn_cfg = { ...@@ -399,6 +393,8 @@ struct iwl_cfg iwl5350_agn_cfg = {
.fw_name_pre = IWL5000_FW_PRE, .fw_name_pre = IWL5000_FW_PRE,
.ucode_api_max = IWL5000_UCODE_API_MAX, .ucode_api_max = IWL5000_UCODE_API_MAX,
.ucode_api_min = IWL5000_UCODE_API_MIN, .ucode_api_min = IWL5000_UCODE_API_MIN,
.max_inst_size = IWLAGN_RTC_INST_SIZE,
.max_data_size = IWLAGN_RTC_DATA_SIZE,
.eeprom_ver = EEPROM_5050_EEPROM_VERSION, .eeprom_ver = EEPROM_5050_EEPROM_VERSION,
.eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION, .eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION,
.lib = &iwl5000_lib, .lib = &iwl5000_lib,
...@@ -412,6 +408,8 @@ struct iwl_cfg iwl5350_agn_cfg = { ...@@ -412,6 +408,8 @@ struct iwl_cfg iwl5350_agn_cfg = {
.fw_name_pre = IWL5150_FW_PRE, \ .fw_name_pre = IWL5150_FW_PRE, \
.ucode_api_max = IWL5150_UCODE_API_MAX, \ .ucode_api_max = IWL5150_UCODE_API_MAX, \
.ucode_api_min = IWL5150_UCODE_API_MIN, \ .ucode_api_min = IWL5150_UCODE_API_MIN, \
.max_inst_size = IWLAGN_RTC_INST_SIZE, \
.max_data_size = IWLAGN_RTC_DATA_SIZE, \
.eeprom_ver = EEPROM_5050_EEPROM_VERSION, \ .eeprom_ver = EEPROM_5050_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION, \ .eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION, \
.lib = &iwl5150_lib, \ .lib = &iwl5150_lib, \
......
...@@ -137,7 +137,7 @@ static struct iwl_sensitivity_ranges iwl6000_sensitivity = { ...@@ -137,7 +137,7 @@ static struct iwl_sensitivity_ranges iwl6000_sensitivity = {
.nrg_th_cca = 62, .nrg_th_cca = 62,
}; };
static int iwl6000_hw_set_hw_params(struct iwl_priv *priv) static void iwl6000_hw_set_hw_params(struct iwl_priv *priv)
{ {
if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES && if (iwlagn_mod_params.num_of_queues >= IWL_MIN_NUM_QUEUES &&
iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES) iwlagn_mod_params.num_of_queues <= IWLAGN_NUM_QUEUES)
...@@ -145,8 +145,6 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv) ...@@ -145,8 +145,6 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)
iwlagn_mod_params.num_of_queues; iwlagn_mod_params.num_of_queues;
hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues; hw_params(priv).max_txq_num = cfg(priv)->base_params->num_of_queues;
hw_params(priv).max_data_size = IWL60_RTC_DATA_SIZE;
hw_params(priv).max_inst_size = IWL60_RTC_INST_SIZE;
hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) |
BIT(IEEE80211_BAND_5GHZ); BIT(IEEE80211_BAND_5GHZ);
...@@ -165,7 +163,6 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv) ...@@ -165,7 +163,6 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)
/* Set initial sensitivity parameters */ /* Set initial sensitivity parameters */
hw_params(priv).sens = &iwl6000_sensitivity; hw_params(priv).sens = &iwl6000_sensitivity;
return 0;
} }
static int iwl6000_hw_channel_switch(struct iwl_priv *priv, static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
...@@ -349,6 +346,8 @@ static struct iwl_bt_params iwl6000_bt_params = { ...@@ -349,6 +346,8 @@ static struct iwl_bt_params iwl6000_bt_params = {
.ucode_api_max = IWL6000G2_UCODE_API_MAX, \ .ucode_api_max = IWL6000G2_UCODE_API_MAX, \
.ucode_api_ok = IWL6000G2_UCODE_API_OK, \ .ucode_api_ok = IWL6000G2_UCODE_API_OK, \
.ucode_api_min = IWL6000G2_UCODE_API_MIN, \ .ucode_api_min = IWL6000G2_UCODE_API_MIN, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.eeprom_ver = EEPROM_6005_EEPROM_VERSION, \ .eeprom_ver = EEPROM_6005_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_6005_TX_POWER_VERSION, \ .eeprom_calib_ver = EEPROM_6005_TX_POWER_VERSION, \
.lib = &iwl6000_lib, \ .lib = &iwl6000_lib, \
...@@ -389,6 +388,8 @@ struct iwl_cfg iwl6005_2agn_d_cfg = { ...@@ -389,6 +388,8 @@ struct iwl_cfg iwl6005_2agn_d_cfg = {
.ucode_api_max = IWL6000G2_UCODE_API_MAX, \ .ucode_api_max = IWL6000G2_UCODE_API_MAX, \
.ucode_api_ok = IWL6000G2_UCODE_API_OK, \ .ucode_api_ok = IWL6000G2_UCODE_API_OK, \
.ucode_api_min = IWL6000G2_UCODE_API_MIN, \ .ucode_api_min = IWL6000G2_UCODE_API_MIN, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.eeprom_ver = EEPROM_6030_EEPROM_VERSION, \ .eeprom_ver = EEPROM_6030_EEPROM_VERSION, \
.eeprom_calib_ver = EEPROM_6030_TX_POWER_VERSION, \ .eeprom_calib_ver = EEPROM_6030_TX_POWER_VERSION, \
.lib = &iwl6030_lib, \ .lib = &iwl6030_lib, \
...@@ -458,6 +459,8 @@ struct iwl_cfg iwl130_bg_cfg = { ...@@ -458,6 +459,8 @@ struct iwl_cfg iwl130_bg_cfg = {
.ucode_api_max = IWL6000_UCODE_API_MAX, \ .ucode_api_max = IWL6000_UCODE_API_MAX, \
.ucode_api_ok = IWL6000_UCODE_API_OK, \ .ucode_api_ok = IWL6000_UCODE_API_OK, \
.ucode_api_min = IWL6000_UCODE_API_MIN, \ .ucode_api_min = IWL6000_UCODE_API_MIN, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.valid_tx_ant = ANT_BC, /* .cfg overwrite */ \ .valid_tx_ant = ANT_BC, /* .cfg overwrite */ \
.valid_rx_ant = ANT_BC, /* .cfg overwrite */ \ .valid_rx_ant = ANT_BC, /* .cfg overwrite */ \
.eeprom_ver = EEPROM_6000_EEPROM_VERSION, \ .eeprom_ver = EEPROM_6000_EEPROM_VERSION, \
...@@ -487,6 +490,8 @@ struct iwl_cfg iwl6000i_2bg_cfg = { ...@@ -487,6 +490,8 @@ struct iwl_cfg iwl6000i_2bg_cfg = {
.fw_name_pre = IWL6050_FW_PRE, \ .fw_name_pre = IWL6050_FW_PRE, \
.ucode_api_max = IWL6050_UCODE_API_MAX, \ .ucode_api_max = IWL6050_UCODE_API_MAX, \
.ucode_api_min = IWL6050_UCODE_API_MIN, \ .ucode_api_min = IWL6050_UCODE_API_MIN, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.valid_tx_ant = ANT_AB, /* .cfg overwrite */ \ .valid_tx_ant = ANT_AB, /* .cfg overwrite */ \
.valid_rx_ant = ANT_AB, /* .cfg overwrite */ \ .valid_rx_ant = ANT_AB, /* .cfg overwrite */ \
.lib = &iwl6000_lib, \ .lib = &iwl6000_lib, \
...@@ -512,6 +517,8 @@ struct iwl_cfg iwl6050_2abg_cfg = { ...@@ -512,6 +517,8 @@ struct iwl_cfg iwl6050_2abg_cfg = {
.fw_name_pre = IWL6050_FW_PRE, \ .fw_name_pre = IWL6050_FW_PRE, \
.ucode_api_max = IWL6050_UCODE_API_MAX, \ .ucode_api_max = IWL6050_UCODE_API_MAX, \
.ucode_api_min = IWL6050_UCODE_API_MIN, \ .ucode_api_min = IWL6050_UCODE_API_MIN, \
.max_inst_size = IWL60_RTC_INST_SIZE, \
.max_data_size = IWL60_RTC_DATA_SIZE, \
.lib = &iwl6000_lib, \ .lib = &iwl6000_lib, \
.additional_nic_config = iwl6150_additional_nic_config, \ .additional_nic_config = iwl6150_additional_nic_config, \
.eeprom_ver = EEPROM_6150_EEPROM_VERSION, \ .eeprom_ver = EEPROM_6150_EEPROM_VERSION, \
...@@ -537,6 +544,8 @@ struct iwl_cfg iwl6000_3agn_cfg = { ...@@ -537,6 +544,8 @@ struct iwl_cfg iwl6000_3agn_cfg = {
.ucode_api_max = IWL6000_UCODE_API_MAX, .ucode_api_max = IWL6000_UCODE_API_MAX,
.ucode_api_ok = IWL6000_UCODE_API_OK, .ucode_api_ok = IWL6000_UCODE_API_OK,
.ucode_api_min = IWL6000_UCODE_API_MIN, .ucode_api_min = IWL6000_UCODE_API_MIN,
.max_inst_size = IWL60_RTC_INST_SIZE,
.max_data_size = IWL60_RTC_DATA_SIZE,
.eeprom_ver = EEPROM_6000_EEPROM_VERSION, .eeprom_ver = EEPROM_6000_EEPROM_VERSION,
.eeprom_calib_ver = EEPROM_6000_TX_POWER_VERSION, .eeprom_calib_ver = EEPROM_6000_TX_POWER_VERSION,
.lib = &iwl6000_lib, .lib = &iwl6000_lib,
......
...@@ -68,6 +68,8 @@ ...@@ -68,6 +68,8 @@
#include "iwl-agn-calib.h" #include "iwl-agn-calib.h"
#include "iwl-trans.h" #include "iwl-trans.h"
#include "iwl-agn.h" #include "iwl-agn.h"
#include "iwl-wifi.h"
#include "iwl-ucode.h"
/***************************************************************************** /*****************************************************************************
* INIT calibrations framework * INIT calibrations framework
...@@ -634,7 +636,7 @@ void iwl_init_sensitivity(struct iwl_priv *priv) ...@@ -634,7 +636,7 @@ void iwl_init_sensitivity(struct iwl_priv *priv)
data->last_bad_plcp_cnt_cck = 0; data->last_bad_plcp_cnt_cck = 0;
data->last_fa_cnt_cck = 0; data->last_fa_cnt_cck = 0;
if (priv->enhance_sensitivity_table) if (nic(priv)->fw.enhance_sensitivity_table)
ret |= iwl_enhance_sensitivity_write(priv); ret |= iwl_enhance_sensitivity_write(priv);
else else
ret |= iwl_sensitivity_write(priv); ret |= iwl_sensitivity_write(priv);
...@@ -745,7 +747,7 @@ void iwl_sensitivity_calibration(struct iwl_priv *priv) ...@@ -745,7 +747,7 @@ void iwl_sensitivity_calibration(struct iwl_priv *priv)
iwl_sens_auto_corr_ofdm(priv, norm_fa_ofdm, rx_enable_time); iwl_sens_auto_corr_ofdm(priv, norm_fa_ofdm, rx_enable_time);
iwl_sens_energy_cck(priv, norm_fa_cck, rx_enable_time, &statis); iwl_sens_energy_cck(priv, norm_fa_cck, rx_enable_time, &statis);
if (priv->enhance_sensitivity_table) if (nic(priv)->fw.enhance_sensitivity_table)
iwl_enhance_sensitivity_write(priv); iwl_enhance_sensitivity_write(priv);
else else
iwl_sensitivity_write(priv); iwl_sensitivity_write(priv);
......
...@@ -77,7 +77,7 @@ int iwlagn_send_tx_power(struct iwl_priv *priv) ...@@ -77,7 +77,7 @@ int iwlagn_send_tx_power(struct iwl_priv *priv)
tx_power_cmd.flags = IWLAGN_TX_POWER_NO_CLOSED; tx_power_cmd.flags = IWLAGN_TX_POWER_NO_CLOSED;
tx_power_cmd.srv_chan_lmt = IWLAGN_TX_POWER_AUTO; tx_power_cmd.srv_chan_lmt = IWLAGN_TX_POWER_AUTO;
if (IWL_UCODE_API(priv->ucode_ver) == 1) if (IWL_UCODE_API(nic(priv)->fw.ucode_ver) == 1)
tx_ant_cfg_cmd = REPLY_TX_POWER_DBM_CMD_V1; tx_ant_cfg_cmd = REPLY_TX_POWER_DBM_CMD_V1;
else else
tx_ant_cfg_cmd = REPLY_TX_POWER_DBM_CMD; tx_ant_cfg_cmd = REPLY_TX_POWER_DBM_CMD;
...@@ -700,7 +700,7 @@ static void iwlagn_set_kill_msk(struct iwl_priv *priv, ...@@ -700,7 +700,7 @@ static void iwlagn_set_kill_msk(struct iwl_priv *priv,
priv->kill_cts_mask = bt_kill_cts_msg[kill_msk]; priv->kill_cts_mask = bt_kill_cts_msg[kill_msk];
/* schedule to send runtime bt_config */ /* schedule to send runtime bt_config */
queue_work(priv->shrd->workqueue, &priv->bt_runtime_config); queue_work(priv->workqueue, &priv->bt_runtime_config);
} }
} }
...@@ -745,7 +745,7 @@ int iwlagn_bt_coex_profile_notif(struct iwl_priv *priv, ...@@ -745,7 +745,7 @@ int iwlagn_bt_coex_profile_notif(struct iwl_priv *priv,
IWL_BT_COEX_TRAFFIC_LOAD_NONE; IWL_BT_COEX_TRAFFIC_LOAD_NONE;
} }
priv->bt_status = coex->bt_status; priv->bt_status = coex->bt_status;
queue_work(priv->shrd->workqueue, queue_work(priv->workqueue,
&priv->bt_traffic_change_work); &priv->bt_traffic_change_work);
} }
} }
......
...@@ -892,7 +892,7 @@ static void rs_bt_update_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx, ...@@ -892,7 +892,7 @@ static void rs_bt_update_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
rs_fill_link_cmd(priv, lq_sta, tbl->current_rate); rs_fill_link_cmd(priv, lq_sta, tbl->current_rate);
iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false); iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false);
queue_work(priv->shrd->workqueue, &priv->bt_full_concurrency); queue_work(priv->workqueue, &priv->bt_full_concurrency);
} }
} }
......
...@@ -581,7 +581,7 @@ static int iwlagn_rx_statistics(struct iwl_priv *priv, ...@@ -581,7 +581,7 @@ static int iwlagn_rx_statistics(struct iwl_priv *priv,
if (unlikely(!test_bit(STATUS_SCANNING, &priv->shrd->status)) && if (unlikely(!test_bit(STATUS_SCANNING, &priv->shrd->status)) &&
(pkt->hdr.cmd == STATISTICS_NOTIFICATION)) { (pkt->hdr.cmd == STATISTICS_NOTIFICATION)) {
iwlagn_rx_calc_noise(priv); iwlagn_rx_calc_noise(priv);
queue_work(priv->shrd->workqueue, &priv->run_time_calib_work); queue_work(priv->workqueue, &priv->run_time_calib_work);
} }
if (cfg(priv)->lib->temperature && change) if (cfg(priv)->lib->temperature && change)
cfg(priv)->lib->temperature(priv); cfg(priv)->lib->temperature(priv);
......
...@@ -900,6 +900,22 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw, ...@@ -900,6 +900,22 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
} }
} }
/*
* If the ucode decides to do beacon filtering before
* association, it will lose beacons that are needed
* before sending frames out on passive channels. This
* causes association failures on those channels. Enable
* receiving beacons in such cases.
*/
if (vif->type == NL80211_IFTYPE_STATION) {
if (!bss_conf->assoc)
ctx->staging.filter_flags |= RXON_FILTER_BCON_AWARE_MSK;
else
ctx->staging.filter_flags &=
~RXON_FILTER_BCON_AWARE_MSK;
}
if (force || memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging))) if (force || memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging)))
iwlagn_commit_rxon(priv, ctx); iwlagn_commit_rxon(priv, ctx);
......
...@@ -568,7 +568,7 @@ void iwl_tt_enter_ct_kill(struct iwl_priv *priv) ...@@ -568,7 +568,7 @@ void iwl_tt_enter_ct_kill(struct iwl_priv *priv)
return; return;
IWL_DEBUG_TEMP(priv, "Queueing critical temperature enter.\n"); IWL_DEBUG_TEMP(priv, "Queueing critical temperature enter.\n");
queue_work(priv->shrd->workqueue, &priv->ct_enter); queue_work(priv->workqueue, &priv->ct_enter);
} }
void iwl_tt_exit_ct_kill(struct iwl_priv *priv) void iwl_tt_exit_ct_kill(struct iwl_priv *priv)
...@@ -577,7 +577,7 @@ void iwl_tt_exit_ct_kill(struct iwl_priv *priv) ...@@ -577,7 +577,7 @@ void iwl_tt_exit_ct_kill(struct iwl_priv *priv)
return; return;
IWL_DEBUG_TEMP(priv, "Queueing critical temperature exit.\n"); IWL_DEBUG_TEMP(priv, "Queueing critical temperature exit.\n");
queue_work(priv->shrd->workqueue, &priv->ct_exit); queue_work(priv->workqueue, &priv->ct_exit);
} }
static void iwl_bg_tt_work(struct work_struct *work) static void iwl_bg_tt_work(struct work_struct *work)
...@@ -600,7 +600,7 @@ void iwl_tt_handler(struct iwl_priv *priv) ...@@ -600,7 +600,7 @@ void iwl_tt_handler(struct iwl_priv *priv)
return; return;
IWL_DEBUG_TEMP(priv, "Queueing thermal throttling work.\n"); IWL_DEBUG_TEMP(priv, "Queueing thermal throttling work.\n");
queue_work(priv->shrd->workqueue, &priv->tt_work); queue_work(priv->workqueue, &priv->tt_work);
} }
/* Thermal throttling initialization /* Thermal throttling initialization
......
...@@ -983,7 +983,7 @@ static void iwl_check_abort_status(struct iwl_priv *priv, ...@@ -983,7 +983,7 @@ static void iwl_check_abort_status(struct iwl_priv *priv,
if (frame_count == 1 && status == TX_STATUS_FAIL_RFKILL_FLUSH) { if (frame_count == 1 && status == TX_STATUS_FAIL_RFKILL_FLUSH) {
IWL_ERR(priv, "Tx flush command to flush out all frames\n"); IWL_ERR(priv, "Tx flush command to flush out all frames\n");
if (!test_bit(STATUS_EXIT_PENDING, &priv->shrd->status)) if (!test_bit(STATUS_EXIT_PENDING, &priv->shrd->status))
queue_work(priv->shrd->workqueue, &priv->tx_flush); queue_work(priv->workqueue, &priv->tx_flush);
} }
} }
......
...@@ -618,7 +618,7 @@ static int iwlagn_send_tx_ant_config(struct iwl_priv *priv, u8 valid_tx_ant) ...@@ -618,7 +618,7 @@ static int iwlagn_send_tx_ant_config(struct iwl_priv *priv, u8 valid_tx_ant)
.valid = cpu_to_le32(valid_tx_ant), .valid = cpu_to_le32(valid_tx_ant),
}; };
if (IWL_UCODE_API(priv->ucode_ver) > 1) { if (IWL_UCODE_API(nic(priv)->fw.ucode_ver) > 1) {
IWL_DEBUG_HC(priv, "select valid tx ant: %u\n", valid_tx_ant); IWL_DEBUG_HC(priv, "select valid tx ant: %u\n", valid_tx_ant);
return iwl_trans_send_cmd_pdu(trans(priv), return iwl_trans_send_cmd_pdu(trans(priv),
TX_ANT_CONFIGURATION_CMD, TX_ANT_CONFIGURATION_CMD,
...@@ -738,14 +738,14 @@ int iwl_alive_start(struct iwl_priv *priv) ...@@ -738,14 +738,14 @@ int iwl_alive_start(struct iwl_priv *priv)
return iwl_power_update_mode(priv, true); return iwl_power_update_mode(priv, true);
} }
static void iwl_cancel_deferred_work(struct iwl_priv *priv); void iwl_down(struct iwl_priv *priv)
void __iwl_down(struct iwl_priv *priv)
{ {
int exit_pending; int exit_pending;
IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n"); IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n");
lockdep_assert_held(&priv->shrd->mutex);
iwl_scan_cancel_timeout(priv, 200); iwl_scan_cancel_timeout(priv, 200);
/* /*
...@@ -803,15 +803,6 @@ void __iwl_down(struct iwl_priv *priv) ...@@ -803,15 +803,6 @@ void __iwl_down(struct iwl_priv *priv)
priv->beacon_skb = NULL; priv->beacon_skb = NULL;
} }
void iwl_down(struct iwl_priv *priv)
{
mutex_lock(&priv->shrd->mutex);
__iwl_down(priv);
mutex_unlock(&priv->shrd->mutex);
iwl_cancel_deferred_work(priv);
}
/***************************************************************************** /*****************************************************************************
* *
* Workqueue callbacks * Workqueue callbacks
...@@ -869,7 +860,7 @@ void iwlagn_prepare_restart(struct iwl_priv *priv) ...@@ -869,7 +860,7 @@ void iwlagn_prepare_restart(struct iwl_priv *priv)
bt_status = priv->bt_status; bt_status = priv->bt_status;
bt_is_sco = priv->bt_is_sco; bt_is_sco = priv->bt_is_sco;
__iwl_down(priv); iwl_down(priv);
priv->bt_full_concurrent = bt_full_concurrent; priv->bt_full_concurrent = bt_full_concurrent;
priv->bt_ci_compliance = bt_ci_compliance; priv->bt_ci_compliance = bt_ci_compliance;
...@@ -939,7 +930,7 @@ static void iwlagn_disable_roc_work(struct work_struct *work) ...@@ -939,7 +930,7 @@ static void iwlagn_disable_roc_work(struct work_struct *work)
static void iwl_setup_deferred_work(struct iwl_priv *priv) static void iwl_setup_deferred_work(struct iwl_priv *priv)
{ {
priv->shrd->workqueue = create_singlethread_workqueue(DRV_NAME); priv->workqueue = create_singlethread_workqueue(DRV_NAME);
init_waitqueue_head(&priv->shrd->wait_command_queue); init_waitqueue_head(&priv->shrd->wait_command_queue);
...@@ -970,7 +961,7 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv) ...@@ -970,7 +961,7 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)
priv->watchdog.function = iwl_bg_watchdog; priv->watchdog.function = iwl_bg_watchdog;
} }
static void iwl_cancel_deferred_work(struct iwl_priv *priv) void iwl_cancel_deferred_work(struct iwl_priv *priv)
{ {
if (cfg(priv)->lib->cancel_deferred_work) if (cfg(priv)->lib->cancel_deferred_work)
cfg(priv)->lib->cancel_deferred_work(priv); cfg(priv)->lib->cancel_deferred_work(priv);
...@@ -1091,7 +1082,7 @@ static void iwl_uninit_drv(struct iwl_priv *priv) ...@@ -1091,7 +1082,7 @@ static void iwl_uninit_drv(struct iwl_priv *priv)
#define IWL_RX_BUF_SIZE_4K (4 * 1024) #define IWL_RX_BUF_SIZE_4K (4 * 1024)
#define IWL_RX_BUF_SIZE_8K (8 * 1024) #define IWL_RX_BUF_SIZE_8K (8 * 1024)
static int iwl_set_hw_params(struct iwl_priv *priv) static void iwl_set_hw_params(struct iwl_priv *priv)
{ {
if (iwlagn_mod_params.amsdu_size_8K) if (iwlagn_mod_params.amsdu_size_8K)
hw_params(priv).rx_page_order = hw_params(priv).rx_page_order =
...@@ -1111,7 +1102,7 @@ static int iwl_set_hw_params(struct iwl_priv *priv) ...@@ -1111,7 +1102,7 @@ static int iwl_set_hw_params(struct iwl_priv *priv)
hw_params(priv).wd_timeout = cfg(priv)->base_params->wd_timeout; hw_params(priv).wd_timeout = cfg(priv)->base_params->wd_timeout;
/* Device-specific setup */ /* Device-specific setup */
return cfg(priv)->lib->set_hw_params(priv); cfg(priv)->lib->set_hw_params(priv);
} }
...@@ -1248,11 +1239,7 @@ int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops, ...@@ -1248,11 +1239,7 @@ int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops,
/************************ /************************
* 5. Setup HW constants * 5. Setup HW constants
************************/ ************************/
if (iwl_set_hw_params(priv)) { iwl_set_hw_params(priv);
err = -ENOENT;
IWL_ERR(priv, "failed to set hw parameters\n");
goto out_free_eeprom;
}
/******************* /*******************
* 6. Setup priv * 6. Setup priv
...@@ -1273,17 +1260,17 @@ int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops, ...@@ -1273,17 +1260,17 @@ int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops,
iwl_power_initialize(priv); iwl_power_initialize(priv);
iwl_tt_initialize(priv); iwl_tt_initialize(priv);
init_completion(&priv->firmware_loading_complete); init_completion(&nic(priv)->request_firmware_complete);
err = iwl_request_firmware(priv, true); err = iwl_request_firmware(nic(priv), true);
if (err) if (err)
goto out_destroy_workqueue; goto out_destroy_workqueue;
return 0; return 0;
out_destroy_workqueue: out_destroy_workqueue:
destroy_workqueue(priv->shrd->workqueue); destroy_workqueue(priv->workqueue);
priv->shrd->workqueue = NULL; priv->workqueue = NULL;
iwl_uninit_drv(priv); iwl_uninit_drv(priv);
out_free_eeprom: out_free_eeprom:
iwl_eeprom_free(priv->shrd); iwl_eeprom_free(priv->shrd);
...@@ -1296,7 +1283,7 @@ int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops, ...@@ -1296,7 +1283,7 @@ int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops,
void __devexit iwl_remove(struct iwl_priv * priv) void __devexit iwl_remove(struct iwl_priv * priv)
{ {
wait_for_completion(&priv->firmware_loading_complete); wait_for_completion(&nic(priv)->request_firmware_complete);
IWL_DEBUG_INFO(priv, "*** UNLOAD DRIVER ***\n"); IWL_DEBUG_INFO(priv, "*** UNLOAD DRIVER ***\n");
...@@ -1316,18 +1303,18 @@ void __devexit iwl_remove(struct iwl_priv * priv) ...@@ -1316,18 +1303,18 @@ void __devexit iwl_remove(struct iwl_priv * priv)
/*This will stop the queues, move the device to low power state */ /*This will stop the queues, move the device to low power state */
iwl_trans_stop_device(trans(priv)); iwl_trans_stop_device(trans(priv));
iwl_dealloc_ucode(trans(priv)); iwl_dealloc_ucode(nic(priv));
iwl_eeprom_free(priv->shrd); iwl_eeprom_free(priv->shrd);
/*netif_stop_queue(dev); */ /*netif_stop_queue(dev); */
flush_workqueue(priv->shrd->workqueue); flush_workqueue(priv->workqueue);
/* ieee80211_unregister_hw calls iwlagn_mac_stop, which flushes /* ieee80211_unregister_hw calls iwlagn_mac_stop, which flushes
* priv->shrd->workqueue... so we can't take down the workqueue * priv->workqueue... so we can't take down the workqueue
* until now... */ * until now... */
destroy_workqueue(priv->shrd->workqueue); destroy_workqueue(priv->workqueue);
priv->shrd->workqueue = NULL; priv->workqueue = NULL;
iwl_free_traffic_mem(priv); iwl_free_traffic_mem(priv);
iwl_uninit_drv(priv); iwl_uninit_drv(priv);
......
...@@ -65,11 +65,7 @@ ...@@ -65,11 +65,7 @@
#include "iwl-dev.h" #include "iwl-dev.h"
struct iwlagn_ucode_capabilities { struct iwl_ucode_capabilities;
u32 max_probe_length;
u32 standard_phy_calibration_size;
u32 flags;
};
extern struct ieee80211_ops iwlagn_hw_ops; extern struct ieee80211_ops iwlagn_hw_ops;
...@@ -81,14 +77,14 @@ static inline void iwl_set_calib_hdr(struct iwl_calib_hdr *hdr, u8 cmd) ...@@ -81,14 +77,14 @@ static inline void iwl_set_calib_hdr(struct iwl_calib_hdr *hdr, u8 cmd)
hdr->data_valid = 1; hdr->data_valid = 1;
} }
void __iwl_down(struct iwl_priv *priv);
void iwl_down(struct iwl_priv *priv); void iwl_down(struct iwl_priv *priv);
void iwl_cancel_deferred_work(struct iwl_priv *priv);
void iwlagn_prepare_restart(struct iwl_priv *priv); void iwlagn_prepare_restart(struct iwl_priv *priv);
/* MAC80211 */ /* MAC80211 */
struct ieee80211_hw *iwl_alloc_all(void); struct ieee80211_hw *iwl_alloc_all(void);
int iwlagn_mac_setup_register(struct iwl_priv *priv, int iwlagn_mac_setup_register(struct iwl_priv *priv,
struct iwlagn_ucode_capabilities *capa); struct iwl_ucode_capabilities *capa);
void iwlagn_mac_unregister(struct iwl_priv *priv); void iwlagn_mac_unregister(struct iwl_priv *priv);
/* RXON */ /* RXON */
......
...@@ -643,7 +643,7 @@ u8 iwl_get_single_channel_number(struct iwl_priv *priv, ...@@ -643,7 +643,7 @@ u8 iwl_get_single_channel_number(struct iwl_priv *priv,
* NOTE: Does not commit to the hardware; it sets appropriate bit fields * NOTE: Does not commit to the hardware; it sets appropriate bit fields
* in the staging RXON flag structure based on the ch->band * in the staging RXON flag structure based on the ch->band
*/ */
int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch, void iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
struct iwl_rxon_context *ctx) struct iwl_rxon_context *ctx)
{ {
enum ieee80211_band band = ch->band; enum ieee80211_band band = ch->band;
...@@ -651,7 +651,7 @@ int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch, ...@@ -651,7 +651,7 @@ int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
if ((le16_to_cpu(ctx->staging.channel) == channel) && if ((le16_to_cpu(ctx->staging.channel) == channel) &&
(priv->band == band)) (priv->band == band))
return 0; return;
ctx->staging.channel = cpu_to_le16(channel); ctx->staging.channel = cpu_to_le16(channel);
if (band == IEEE80211_BAND_5GHZ) if (band == IEEE80211_BAND_5GHZ)
...@@ -663,7 +663,6 @@ int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch, ...@@ -663,7 +663,6 @@ int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
IWL_DEBUG_INFO(priv, "Staging channel set to %d [%d]\n", channel, band); IWL_DEBUG_INFO(priv, "Staging channel set to %d [%d]\n", channel, band);
return 0;
} }
void iwl_set_flags_for_band(struct iwl_priv *priv, void iwl_set_flags_for_band(struct iwl_priv *priv,
...@@ -875,7 +874,7 @@ void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand) ...@@ -875,7 +874,7 @@ void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
if (iwlagn_mod_params.restart_fw) { if (iwlagn_mod_params.restart_fw) {
IWL_DEBUG_FW_ERRORS(priv, IWL_DEBUG_FW_ERRORS(priv,
"Restarting adapter due to uCode error.\n"); "Restarting adapter due to uCode error.\n");
queue_work(priv->shrd->workqueue, &priv->restart); queue_work(priv->workqueue, &priv->restart);
} else } else
IWL_DEBUG_FW_ERRORS(priv, IWL_DEBUG_FW_ERRORS(priv,
"Detected FW error, but not restarting\n"); "Detected FW error, but not restarting\n");
......
...@@ -76,7 +76,7 @@ struct iwl_cmd; ...@@ -76,7 +76,7 @@ struct iwl_cmd;
struct iwl_lib_ops { struct iwl_lib_ops {
/* set hw dependent parameters */ /* set hw dependent parameters */
int (*set_hw_params)(struct iwl_priv *priv); void (*set_hw_params)(struct iwl_priv *priv);
/* setup BT Rx handler */ /* setup BT Rx handler */
void (*bt_rx_handler_setup)(struct iwl_priv *priv); void (*bt_rx_handler_setup)(struct iwl_priv *priv);
/* setup BT related deferred work */ /* setup BT related deferred work */
...@@ -169,7 +169,7 @@ void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, struct iwl_rxon_context *ctx, ...@@ -169,7 +169,7 @@ void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
int hw_decrypt); int hw_decrypt);
int iwl_check_rxon_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx); int iwl_check_rxon_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
int iwl_full_rxon_required(struct iwl_priv *priv, struct iwl_rxon_context *ctx); int iwl_full_rxon_required(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch, void iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
struct iwl_rxon_context *ctx); struct iwl_rxon_context *ctx);
void iwl_set_flags_for_band(struct iwl_priv *priv, void iwl_set_flags_for_band(struct iwl_priv *priv,
struct iwl_rxon_context *ctx, struct iwl_rxon_context *ctx,
......
/******************************************************************************
*
* This file is provided under a dual BSD/GPLv2 license. When using or
* redistributing this file, you may do so under either license.
*
* GPL LICENSE SUMMARY
*
* Copyright(c) 2007 - 2011 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
* USA
*
* The full GNU General Public License is included in this distribution
* in the file called LICENSE.GPL.
*
* Contact Information:
* Intel Linux Wireless <ilw@linux.intel.com>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
*
* Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************/
#include <linux/interrupt.h>
#include "iwl-debug.h"
#define __iwl_fn(fn) \
void __iwl_ ##fn(struct device *dev, const char *fmt, ...) \
{ \
struct va_format vaf = { \
.fmt = fmt, \
}; \
va_list args; \
\
va_start(args, fmt); \
vaf.va = &args; \
dev_ ##fn(dev, "%pV", &vaf); \
trace_iwlwifi_ ##fn(&vaf); \
va_end(args); \
}
__iwl_fn(warn)
__iwl_fn(info)
__iwl_fn(crit)
void __iwl_err(struct device *dev, bool rfkill_prefix, bool trace_only,
const char *fmt, ...)
{
struct va_format vaf = {
.fmt = fmt,
};
va_list args;
va_start(args, fmt);
vaf.va = &args;
if (!trace_only) {
if (rfkill_prefix)
dev_err(dev, "(RFKILL) %pV", &vaf);
else
dev_err(dev, "%pV", &vaf);
}
trace_iwlwifi_err(&vaf);
va_end(args);
}
#if defined(CONFIG_IWLWIFI_DEBUG) || defined(CONFIG_IWLWIFI_DEVICE_TRACING)
void __iwl_dbg(struct iwl_shared *shared, struct device *dev,
u32 level, bool limit, const char *function,
const char *fmt, ...)
{
struct va_format vaf = {
.fmt = fmt,
};
va_list args;
va_start(args, fmt);
vaf.va = &args;
#ifdef CONFIG_IWLWIFI_DEBUG
if (iwl_get_debug_level(shared) & level &&
(!limit || net_ratelimit()))
dev_err(dev, "%c %s %pV", in_interrupt() ? 'I' : 'U',
function, &vaf);
#endif
trace_iwlwifi_dbg(level, in_interrupt(), function, &vaf);
va_end(args);
}
#endif
...@@ -31,14 +31,33 @@ ...@@ -31,14 +31,33 @@
#include "iwl-bus.h" #include "iwl-bus.h"
#include "iwl-shared.h" #include "iwl-shared.h"
#include "iwl-devtrace.h"
struct iwl_priv; struct iwl_priv;
/*No matter what is m (priv, bus, trans), this will work */ void __iwl_err(struct device *dev, bool rfkill_prefix, bool only_trace,
#define IWL_ERR(m, f, a...) dev_err(trans(m)->dev, f, ## a) const char *fmt, ...);
#define IWL_WARN(m, f, a...) dev_warn(trans(m)->dev, f, ## a) void __iwl_warn(struct device *dev, const char *fmt, ...);
#define IWL_INFO(m, f, a...) dev_info(trans(m)->dev, f, ## a) void __iwl_info(struct device *dev, const char *fmt, ...);
#define IWL_CRIT(m, f, a...) dev_crit(trans(m)->dev, f, ## a) void __iwl_crit(struct device *dev, const char *fmt, ...);
/* No matter what is m (priv, bus, trans), this will work */
#define IWL_ERR(m, f, a...) __iwl_err(trans(m)->dev, false, false, f, ## a)
#define IWL_WARN(m, f, a...) __iwl_warn(trans(m)->dev, f, ## a)
#define IWL_INFO(m, f, a...) __iwl_info(trans(m)->dev, f, ## a)
#define IWL_CRIT(m, f, a...) __iwl_crit(trans(m)->dev, f, ## a)
#if defined(CONFIG_IWLWIFI_DEBUG) || defined(CONFIG_IWLWIFI_DEVICE_TRACING)
void __iwl_dbg(struct iwl_shared *shared, struct device *dev,
u32 level, bool limit, const char *function,
const char *fmt, ...);
#else
static inline void
__iwl_dbg(struct iwl_shared *shared, struct device *dev,
u32 level, bool limit, const char *function,
const char *fmt, ...)
{}
#endif
#define iwl_print_hex_error(m, p, len) \ #define iwl_print_hex_error(m, p, len) \
do { \ do { \
...@@ -46,53 +65,35 @@ do { \ ...@@ -46,53 +65,35 @@ do { \
DUMP_PREFIX_OFFSET, 16, 1, p, len, 1); \ DUMP_PREFIX_OFFSET, 16, 1, p, len, 1); \
} while (0) } while (0)
#ifdef CONFIG_IWLWIFI_DEBUG #define IWL_DEBUG(m, level, fmt, args...) \
#define IWL_DEBUG(m, level, fmt, ...) \ __iwl_dbg((m)->shrd, trans(m)->dev, level, false, __func__, fmt, ##args)
do { \ #define IWL_DEBUG_LIMIT(m, level, fmt, args...) \
if (iwl_get_debug_level((m)->shrd) & (level)) \ __iwl_dbg((m)->shrd, trans(m)->dev, level, true, __func__, fmt, ##args)
dev_err(trans(m)->dev, "%c %s " fmt, \
in_interrupt() ? 'I' : 'U', __func__, \
##__VA_ARGS__); \
} while (0)
#define IWL_DEBUG_LIMIT(m, level, fmt, ...) \
do { \
if (iwl_get_debug_level((m)->shrd) & (level) && \
net_ratelimit()) \
dev_err(trans(m)->dev, "%c %s " fmt, \
in_interrupt() ? 'I' : 'U', __func__, \
##__VA_ARGS__); \
} while (0)
#ifdef CONFIG_IWLWIFI_DEBUG
#define iwl_print_hex_dump(m, level, p, len) \ #define iwl_print_hex_dump(m, level, p, len) \
do { \ do { \
if (iwl_get_debug_level((m)->shrd) & level) \ if (iwl_get_debug_level((m)->shrd) & level) \
print_hex_dump(KERN_DEBUG, "iwl data: ", \ print_hex_dump(KERN_DEBUG, "iwl data: ", \
DUMP_PREFIX_OFFSET, 16, 1, p, len, 1); \ DUMP_PREFIX_OFFSET, 16, 1, p, len, 1); \
} while (0) } while (0)
#define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...) \
#define IWL_DEBUG_QUIET_RFKILL(p, fmt, ...) \
do { \ do { \
if (!iwl_is_rfkill(p->shrd)) \ if (!iwl_is_rfkill((m)->shrd)) \
dev_err(trans(p)->dev, "%s%c %s " fmt, \ IWL_ERR(m, fmt, ##args); \
"", \ else \
in_interrupt() ? 'I' : 'U', __func__, \ __iwl_err(trans(m)->dev, true, \
##__VA_ARGS__); \ !(iwl_get_debug_level((m)->shrd) & IWL_DL_RADIO),\
else if (iwl_get_debug_level(p->shrd) & IWL_DL_RADIO) \ fmt, ##args); \
dev_err(trans(p)->dev, "%s%c %s " fmt, \
"(RFKILL) ", \
in_interrupt() ? 'I' : 'U', __func__, \
##__VA_ARGS__); \
} while (0) } while (0)
#else #else
#define IWL_DEBUG(m, level, fmt, args...)
#define IWL_DEBUG_LIMIT(m, level, fmt, args...)
#define iwl_print_hex_dump(m, level, p, len) #define iwl_print_hex_dump(m, level, p, len)
#define IWL_DEBUG_QUIET_RFKILL(p, fmt, args...) \ #define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...) \
do { \ do { \
if (!iwl_is_rfkill(p->shrd)) \ if (!iwl_is_rfkill((m)->shrd)) \
IWL_ERR(p, fmt, ##args); \ IWL_ERR(m, fmt, ##args); \
else \
__iwl_err(trans(m)->dev, true, true, fmt, ##args); \
} while (0) } while (0)
#endif /* CONFIG_IWLWIFI_DEBUG */ #endif /* CONFIG_IWLWIFI_DEBUG */
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include "iwl-core.h" #include "iwl-core.h"
#include "iwl-io.h" #include "iwl-io.h"
#include "iwl-agn.h" #include "iwl-agn.h"
#include "iwl-wifi.h"
/* create and remove of files */ /* create and remove of files */
#define DEBUGFS_ADD_FILE(name, parent, mode) do { \ #define DEBUGFS_ADD_FILE(name, parent, mode) do { \
...@@ -234,12 +235,12 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file, ...@@ -234,12 +235,12 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
/* default is to dump the entire data segment */ /* default is to dump the entire data segment */
if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) { if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) {
struct iwl_trans *trans = trans(priv); struct iwl_nic *nic = nic(priv);
priv->dbgfs_sram_offset = 0x800000; priv->dbgfs_sram_offset = 0x800000;
if (trans->shrd->ucode_type == IWL_UCODE_INIT) if (nic->shrd->ucode_type == IWL_UCODE_INIT)
priv->dbgfs_sram_len = trans->ucode_init.data.len; priv->dbgfs_sram_len = nic->fw.ucode_init.data.len;
else else
priv->dbgfs_sram_len = trans->ucode_rt.data.len; priv->dbgfs_sram_len = nic->fw.ucode_rt.data.len;
} }
len = priv->dbgfs_sram_len; len = priv->dbgfs_sram_len;
...@@ -342,7 +343,7 @@ static ssize_t iwl_dbgfs_wowlan_sram_read(struct file *file, ...@@ -342,7 +343,7 @@ static ssize_t iwl_dbgfs_wowlan_sram_read(struct file *file,
return simple_read_from_buffer(user_buf, count, ppos, return simple_read_from_buffer(user_buf, count, ppos,
priv->wowlan_sram, priv->wowlan_sram,
trans(priv)->ucode_wowlan.data.len); nic(priv)->fw.ucode_wowlan.data.len);
} }
static ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf, static ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
......
...@@ -696,11 +696,11 @@ struct iwl_testmode_trace { ...@@ -696,11 +696,11 @@ struct iwl_testmode_trace {
dma_addr_t dma_addr; dma_addr_t dma_addr;
bool trace_enabled; bool trace_enabled;
}; };
struct iwl_testmode_sram { struct iwl_testmode_mem {
u32 buff_size; u32 buff_size;
u32 num_chunks; u32 num_chunks;
u8 *buff_addr; u8 *buff_addr;
bool sram_readed; bool read_in_progress;
}; };
#endif #endif
...@@ -721,6 +721,8 @@ struct iwl_priv { ...@@ -721,6 +721,8 @@ struct iwl_priv {
struct ieee80211_rate *ieee_rates; struct ieee80211_rate *ieee_rates;
struct kmem_cache *tx_cmd_pool; struct kmem_cache *tx_cmd_pool;
struct workqueue_struct *workqueue;
enum ieee80211_band band; enum ieee80211_band band;
void (*pre_rx_handler)(struct iwl_priv *priv, void (*pre_rx_handler)(struct iwl_priv *priv,
...@@ -785,13 +787,6 @@ struct iwl_priv { ...@@ -785,13 +787,6 @@ struct iwl_priv {
/* EEPROM MAC addresses */ /* EEPROM MAC addresses */
struct mac_address addresses[2]; struct mac_address addresses[2];
/* uCode images, save to reload in case of failure */
int fw_index; /* firmware we're trying to load */
u32 ucode_ver; /* version of ucode, copy of
iwl_ucode.ver */
char firmware_name[25];
struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX]; struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX];
__le16 switch_channel; __le16 switch_channel;
...@@ -801,7 +796,6 @@ struct iwl_priv { ...@@ -801,7 +796,6 @@ struct iwl_priv {
u8 start_calib; u8 start_calib;
struct iwl_sensitivity_data sensitivity_data; struct iwl_sensitivity_data sensitivity_data;
struct iwl_chain_noise_data chain_noise_data; struct iwl_chain_noise_data chain_noise_data;
bool enhance_sensitivity_table;
__le16 sensitivity_tbl[HD_TABLE_SIZE]; __le16 sensitivity_tbl[HD_TABLE_SIZE];
__le16 enhance_sensitivity_tbl[ENHANCE_HD_TABLE_ENTRIES]; __le16 enhance_sensitivity_tbl[ENHANCE_HD_TABLE_ENTRIES];
...@@ -869,11 +863,6 @@ struct iwl_priv { ...@@ -869,11 +863,6 @@ struct iwl_priv {
struct iwl_rx_phy_res last_phy_res; struct iwl_rx_phy_res last_phy_res;
bool last_phy_res_valid; bool last_phy_res_valid;
struct completion firmware_loading_complete;
u32 init_evtlog_ptr, init_evtlog_size, init_errlog_ptr;
u32 inst_evtlog_ptr, inst_evtlog_size, inst_errlog_ptr;
/* /*
* chain noise reset and gain commands are the * chain noise reset and gain commands are the
* two extra calibration commands follows the standard * two extra calibration commands follows the standard
...@@ -964,7 +953,7 @@ struct iwl_priv { ...@@ -964,7 +953,7 @@ struct iwl_priv {
bool led_registered; bool led_registered;
#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE #ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
struct iwl_testmode_trace testmode_trace; struct iwl_testmode_trace testmode_trace;
struct iwl_testmode_sram testmode_sram; struct iwl_testmode_mem testmode_mem;
u32 tm_fixed_rate; u32 tm_fixed_rate;
#endif #endif
......
...@@ -34,6 +34,11 @@ ...@@ -34,6 +34,11 @@
#undef TRACE_EVENT #undef TRACE_EVENT
#define TRACE_EVENT(name, proto, ...) \ #define TRACE_EVENT(name, proto, ...) \
static inline void trace_ ## name(proto) {} static inline void trace_ ## name(proto) {}
#undef DECLARE_EVENT_CLASS
#define DECLARE_EVENT_CLASS(...)
#undef DEFINE_EVENT
#define DEFINE_EVENT(evt_class, name, proto, ...) \
static inline void trace_ ## name(proto) {}
#endif #endif
#define PRIV_ENTRY __field(void *, priv) #define PRIV_ENTRY __field(void *, priv)
...@@ -163,6 +168,66 @@ TRACE_EVENT(iwlwifi_dev_ucode_wrap_event, ...@@ -163,6 +168,66 @@ TRACE_EVENT(iwlwifi_dev_ucode_wrap_event,
__entry->p_entry) __entry->p_entry)
); );
#undef TRACE_SYSTEM
#define TRACE_SYSTEM iwlwifi_msg
#define MAX_MSG_LEN 100
DECLARE_EVENT_CLASS(iwlwifi_msg_event,
TP_PROTO(struct va_format *vaf),
TP_ARGS(vaf),
TP_STRUCT__entry(
__dynamic_array(char, msg, MAX_MSG_LEN)
),
TP_fast_assign(
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
MAX_MSG_LEN, vaf->fmt,
*vaf->va) >= MAX_MSG_LEN);
),
TP_printk("%s", (char *)__get_dynamic_array(msg))
);
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_err,
TP_PROTO(struct va_format *vaf),
TP_ARGS(vaf)
);
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_warn,
TP_PROTO(struct va_format *vaf),
TP_ARGS(vaf)
);
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_info,
TP_PROTO(struct va_format *vaf),
TP_ARGS(vaf)
);
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_crit,
TP_PROTO(struct va_format *vaf),
TP_ARGS(vaf)
);
TRACE_EVENT(iwlwifi_dbg,
TP_PROTO(u32 level, bool in_interrupt, const char *function,
struct va_format *vaf),
TP_ARGS(level, in_interrupt, function, vaf),
TP_STRUCT__entry(
__field(u32, level)
__field(u8, in_interrupt)
__string(function, function)
__dynamic_array(char, msg, MAX_MSG_LEN)
),
TP_fast_assign(
__entry->level = level;
__entry->in_interrupt = in_interrupt;
__assign_str(function, function);
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
MAX_MSG_LEN, vaf->fmt,
*vaf->va) >= MAX_MSG_LEN);
),
TP_printk("%s", (char *)__get_dynamic_array(msg))
);
#undef TRACE_SYSTEM #undef TRACE_SYSTEM
#define TRACE_SYSTEM iwlwifi #define TRACE_SYSTEM iwlwifi
......
...@@ -136,7 +136,7 @@ iwlagn_iface_combinations_p2p[] = { ...@@ -136,7 +136,7 @@ iwlagn_iface_combinations_p2p[] = {
* other mac80211 functions grouped here. * other mac80211 functions grouped here.
*/ */
int iwlagn_mac_setup_register(struct iwl_priv *priv, int iwlagn_mac_setup_register(struct iwl_priv *priv,
struct iwlagn_ucode_capabilities *capa) struct iwl_ucode_capabilities *capa)
{ {
int ret; int ret;
struct ieee80211_hw *hw = priv->hw; struct ieee80211_hw *hw = priv->hw;
...@@ -195,7 +195,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv, ...@@ -195,7 +195,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
WIPHY_FLAG_DISABLE_BEACON_HINTS | WIPHY_FLAG_DISABLE_BEACON_HINTS |
WIPHY_FLAG_IBSS_RSN; WIPHY_FLAG_IBSS_RSN;
if (trans(priv)->ucode_wowlan.code.len && if (nic(priv)->fw.ucode_wowlan.code.len &&
device_can_wakeup(trans(priv)->dev)) { device_can_wakeup(trans(priv)->dev)) {
hw->wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT | hw->wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
WIPHY_WOWLAN_DISCONNECT | WIPHY_WOWLAN_DISCONNECT |
...@@ -296,7 +296,7 @@ static int __iwl_up(struct iwl_priv *priv) ...@@ -296,7 +296,7 @@ static int __iwl_up(struct iwl_priv *priv)
error: error:
set_bit(STATUS_EXIT_PENDING, &priv->shrd->status); set_bit(STATUS_EXIT_PENDING, &priv->shrd->status);
__iwl_down(priv); iwl_down(priv);
clear_bit(STATUS_EXIT_PENDING, &priv->shrd->status); clear_bit(STATUS_EXIT_PENDING, &priv->shrd->status);
IWL_ERR(priv, "Unable to initialize device.\n"); IWL_ERR(priv, "Unable to initialize device.\n");
...@@ -341,9 +341,13 @@ static void iwlagn_mac_stop(struct ieee80211_hw *hw) ...@@ -341,9 +341,13 @@ static void iwlagn_mac_stop(struct ieee80211_hw *hw)
priv->is_open = 0; priv->is_open = 0;
mutex_lock(&priv->shrd->mutex);
iwl_down(priv); iwl_down(priv);
mutex_unlock(&priv->shrd->mutex);
iwl_cancel_deferred_work(priv);
flush_workqueue(priv->shrd->workqueue); flush_workqueue(priv->workqueue);
/* User space software may expect getting rfkill changes /* User space software may expect getting rfkill changes
* even if interface is down, trans->down will leave the RF * even if interface is down, trans->down will leave the RF
...@@ -453,17 +457,17 @@ static int iwlagn_mac_resume(struct ieee80211_hw *hw) ...@@ -453,17 +457,17 @@ static int iwlagn_mac_resume(struct ieee80211_hw *hw)
#ifdef CONFIG_IWLWIFI_DEBUGFS #ifdef CONFIG_IWLWIFI_DEBUGFS
if (ret == 0) { if (ret == 0) {
struct iwl_trans *trans = trans(priv); struct iwl_nic *nic = nic(priv);
if (!priv->wowlan_sram) if (!priv->wowlan_sram)
priv->wowlan_sram = priv->wowlan_sram =
kzalloc(trans->ucode_wowlan.data.len, kzalloc(nic->fw.ucode_wowlan.data.len,
GFP_KERNEL); GFP_KERNEL);
if (priv->wowlan_sram) if (priv->wowlan_sram)
_iwl_read_targ_mem_words( _iwl_read_targ_mem_words(
trans(priv), 0x800000, trans(priv), 0x800000,
priv->wowlan_sram, priv->wowlan_sram,
trans->ucode_wowlan.data.len / 4); nic->fw.ucode_wowlan.data.len / 4);
} }
#endif #endif
} }
...@@ -1117,7 +1121,7 @@ static int iwlagn_mac_set_tim(struct ieee80211_hw *hw, ...@@ -1117,7 +1121,7 @@ static int iwlagn_mac_set_tim(struct ieee80211_hw *hw,
{ {
struct iwl_priv *priv = hw->priv; struct iwl_priv *priv = hw->priv;
queue_work(priv->shrd->workqueue, &priv->beacon_update); queue_work(priv->workqueue, &priv->beacon_update);
return 0; return 0;
} }
......
...@@ -70,6 +70,7 @@ ...@@ -70,6 +70,7 @@
#include "iwl-trans.h" #include "iwl-trans.h"
#include "iwl-csr.h" #include "iwl-csr.h"
#include "iwl-cfg.h" #include "iwl-cfg.h"
#include "iwl-wifi.h"
#define IWL_PCI_DEVICE(dev, subdev, cfg) \ #define IWL_PCI_DEVICE(dev, subdev, cfg) \
.vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \ .vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \
...@@ -282,13 +283,23 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -282,13 +283,23 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
bus->shrd->bus = bus; bus->shrd->bus = bus;
/* temporarily create this here */
bus->shrd->nic = kzalloc(sizeof(*bus->shrd->nic), GFP_KERNEL);
if (!bus->shrd->nic) {
dev_printk(KERN_ERR, &pdev->dev,
"Couldn't allocate iwl_nic");
err = -ENOMEM;
goto out_free_bus;
}
/* and initialize it as well, temporarily */
bus->shrd->nic->shrd = bus->shrd;
pci_set_drvdata(pdev, bus); pci_set_drvdata(pdev, bus);
#ifdef CONFIG_IWLWIFI_IDI #ifdef CONFIG_IWLWIFI_IDI
trans(bus) = iwl_trans_idi_alloc(bus->shrd, pdev, ent); trans(bus) = iwl_trans_idi_alloc(bus->shrd, pdev, ent);
if (trans(bus) == NULL) { if (trans(bus) == NULL) {
err = -ENOMEM; err = -ENOMEM;
goto out_free_bus; goto out_free_nic;
} }
err = iwl_probe(bus, &trans_ops_idi, cfg); err = iwl_probe(bus, &trans_ops_idi, cfg);
...@@ -296,7 +307,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -296,7 +307,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
trans(bus) = iwl_trans_pcie_alloc(bus->shrd, pdev, ent); trans(bus) = iwl_trans_pcie_alloc(bus->shrd, pdev, ent);
if (trans(bus) == NULL) { if (trans(bus) == NULL) {
err = -ENOMEM; err = -ENOMEM;
goto out_free_bus; goto out_free_nic;
} }
err = iwl_probe(bus, &trans_ops_pcie, cfg); err = iwl_probe(bus, &trans_ops_pcie, cfg);
...@@ -309,6 +320,8 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -309,6 +320,8 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
out_free_trans: out_free_trans:
iwl_trans_free(trans(bus)); iwl_trans_free(trans(bus));
pci_set_drvdata(pdev, NULL); pci_set_drvdata(pdev, NULL);
out_free_nic:
kfree(bus->shrd->nic);
out_free_bus: out_free_bus:
kfree(bus->shrd); kfree(bus->shrd);
kfree(bus); kfree(bus);
...@@ -325,6 +338,7 @@ static void __devexit iwl_pci_remove(struct pci_dev *pdev) ...@@ -325,6 +338,7 @@ static void __devexit iwl_pci_remove(struct pci_dev *pdev)
pci_set_drvdata(pdev, NULL); pci_set_drvdata(pdev, NULL);
kfree(bus->shrd->nic);
kfree(bus->shrd); kfree(bus->shrd);
kfree(bus); kfree(bus);
} }
......
...@@ -218,7 +218,7 @@ static void iwl_do_scan_abort(struct iwl_priv *priv) ...@@ -218,7 +218,7 @@ static void iwl_do_scan_abort(struct iwl_priv *priv)
int iwl_scan_cancel(struct iwl_priv *priv) int iwl_scan_cancel(struct iwl_priv *priv)
{ {
IWL_DEBUG_SCAN(priv, "Queuing abort scan\n"); IWL_DEBUG_SCAN(priv, "Queuing abort scan\n");
queue_work(priv->shrd->workqueue, &priv->abort_scan); queue_work(priv->workqueue, &priv->abort_scan);
return 0; return 0;
} }
...@@ -354,7 +354,7 @@ static int iwl_rx_scan_complete_notif(struct iwl_priv *priv, ...@@ -354,7 +354,7 @@ static int iwl_rx_scan_complete_notif(struct iwl_priv *priv,
*/ */
set_bit(STATUS_SCAN_COMPLETE, &priv->shrd->status); set_bit(STATUS_SCAN_COMPLETE, &priv->shrd->status);
clear_bit(STATUS_SCAN_HW, &priv->shrd->status); clear_bit(STATUS_SCAN_HW, &priv->shrd->status);
queue_work(priv->shrd->workqueue, &priv->scan_completed); queue_work(priv->workqueue, &priv->scan_completed);
if (priv->iw_mode != NL80211_IFTYPE_ADHOC && if (priv->iw_mode != NL80211_IFTYPE_ADHOC &&
iwl_advanced_bt_coexist(priv) && iwl_advanced_bt_coexist(priv) &&
...@@ -374,7 +374,7 @@ static int iwl_rx_scan_complete_notif(struct iwl_priv *priv, ...@@ -374,7 +374,7 @@ static int iwl_rx_scan_complete_notif(struct iwl_priv *priv,
IWL_BT_COEX_TRAFFIC_LOAD_NONE; IWL_BT_COEX_TRAFFIC_LOAD_NONE;
} }
priv->bt_status = scan_notif->bt_status; priv->bt_status = scan_notif->bt_status;
queue_work(priv->shrd->workqueue, queue_work(priv->workqueue,
&priv->bt_traffic_change_work); &priv->bt_traffic_change_work);
} }
return 0; return 0;
...@@ -950,7 +950,7 @@ int __must_check iwl_scan_initiate(struct iwl_priv *priv, ...@@ -950,7 +950,7 @@ int __must_check iwl_scan_initiate(struct iwl_priv *priv,
return ret; return ret;
} }
queue_delayed_work(priv->shrd->workqueue, &priv->scan_check, queue_delayed_work(priv->workqueue, &priv->scan_check,
IWL_SCAN_CHECK_WATCHDOG); IWL_SCAN_CHECK_WATCHDOG);
return 0; return 0;
...@@ -963,7 +963,7 @@ int __must_check iwl_scan_initiate(struct iwl_priv *priv, ...@@ -963,7 +963,7 @@ int __must_check iwl_scan_initiate(struct iwl_priv *priv,
*/ */
void iwl_internal_short_hw_scan(struct iwl_priv *priv) void iwl_internal_short_hw_scan(struct iwl_priv *priv)
{ {
queue_work(priv->shrd->workqueue, &priv->start_internal_scan); queue_work(priv->workqueue, &priv->start_internal_scan);
} }
static void iwl_bg_start_internal_scan(struct work_struct *work) static void iwl_bg_start_internal_scan(struct work_struct *work)
......
...@@ -173,8 +173,6 @@ struct iwl_mod_params { ...@@ -173,8 +173,6 @@ struct iwl_mod_params {
* @ht40_channel: is 40MHz width possible: BIT(IEEE80211_BAND_XXX) * @ht40_channel: is 40MHz width possible: BIT(IEEE80211_BAND_XXX)
* @sku: sku read from EEPROM * @sku: sku read from EEPROM
* @rx_page_order: Rx buffer page order * @rx_page_order: Rx buffer page order
* @max_inst_size: for ucode use
* @max_data_size: for ucode use
* @ct_kill_threshold: temperature threshold - in hw dependent unit * @ct_kill_threshold: temperature threshold - in hw dependent unit
* @ct_kill_exit_threshold: when to reeable the device - in hw dependent unit * @ct_kill_exit_threshold: when to reeable the device - in hw dependent unit
* relevant for 1000, 6000 and up * relevant for 1000, 6000 and up
...@@ -192,8 +190,6 @@ struct iwl_hw_params { ...@@ -192,8 +190,6 @@ struct iwl_hw_params {
bool shadow_reg_enable; bool shadow_reg_enable;
u16 sku; u16 sku;
u32 rx_page_order; u32 rx_page_order;
u32 max_inst_size;
u32 max_data_size;
u32 ct_kill_threshold; u32 ct_kill_threshold;
u32 ct_kill_exit_threshold; u32 ct_kill_exit_threshold;
unsigned int wd_timeout; unsigned int wd_timeout;
...@@ -283,6 +279,8 @@ enum iwl_led_mode { ...@@ -283,6 +279,8 @@ enum iwl_led_mode {
* @ucode_api_ok: oldest version of the uCode API that is OK to load * @ucode_api_ok: oldest version of the uCode API that is OK to load
* without a warning, for use in transitions * without a warning, for use in transitions
* @ucode_api_min: Lowest version of uCode API supported by driver. * @ucode_api_min: Lowest version of uCode API supported by driver.
* @max_inst_size: The maximal length of the fw inst section
* @max_data_size: The maximal length of the fw data section
* @valid_tx_ant: valid transmit antenna * @valid_tx_ant: valid transmit antenna
* @valid_rx_ant: valid receive antenna * @valid_rx_ant: valid receive antenna
* @sku: sku information from EEPROM * @sku: sku information from EEPROM
...@@ -320,6 +318,8 @@ struct iwl_cfg { ...@@ -320,6 +318,8 @@ struct iwl_cfg {
const unsigned int ucode_api_max; const unsigned int ucode_api_max;
const unsigned int ucode_api_ok; const unsigned int ucode_api_ok;
const unsigned int ucode_api_min; const unsigned int ucode_api_min;
const u32 max_data_size;
const u32 max_inst_size;
u8 valid_tx_ant; u8 valid_tx_ant;
u8 valid_rx_ant; u8 valid_rx_ant;
u16 sku; u16 sku;
...@@ -358,8 +358,8 @@ struct iwl_cfg { ...@@ -358,8 +358,8 @@ struct iwl_cfg {
* @cfg: see struct iwl_cfg * @cfg: see struct iwl_cfg
* @priv: pointer to the upper layer data * @priv: pointer to the upper layer data
* @trans: pointer to the transport layer data * @trans: pointer to the transport layer data
* @nic: pointer to the nic data
* @hw_params: see struct iwl_hw_params * @hw_params: see struct iwl_hw_params
* @workqueue: the workqueue used by all the layers of the driver
* @lock: protect general shared data * @lock: protect general shared data
* @sta_lock: protects the station table. * @sta_lock: protects the station table.
* If lock and sta_lock are needed, lock must be acquired first. * If lock and sta_lock are needed, lock must be acquired first.
...@@ -389,9 +389,9 @@ struct iwl_shared { ...@@ -389,9 +389,9 @@ struct iwl_shared {
struct iwl_cfg *cfg; struct iwl_cfg *cfg;
struct iwl_priv *priv; struct iwl_priv *priv;
struct iwl_trans *trans; struct iwl_trans *trans;
struct iwl_nic *nic;
struct iwl_hw_params hw_params; struct iwl_hw_params hw_params;
struct workqueue_struct *workqueue;
spinlock_t lock; spinlock_t lock;
spinlock_t sta_lock; spinlock_t sta_lock;
struct mutex mutex; struct mutex mutex;
...@@ -420,6 +420,7 @@ struct iwl_shared { ...@@ -420,6 +420,7 @@ struct iwl_shared {
#define priv(_m) ((_m)->shrd->priv) #define priv(_m) ((_m)->shrd->priv)
#define cfg(_m) ((_m)->shrd->cfg) #define cfg(_m) ((_m)->shrd->cfg)
#define bus(_m) ((_m)->shrd->bus) #define bus(_m) ((_m)->shrd->bus)
#define nic(_m) ((_m)->shrd->nic)
#define trans(_m) ((_m)->shrd->trans) #define trans(_m) ((_m)->shrd->trans)
#define hw_params(_m) ((_m)->shrd->hw_params) #define hw_params(_m) ((_m)->shrd->hw_params)
......
This diff is collapsed.
...@@ -99,7 +99,7 @@ ...@@ -99,7 +99,7 @@
* to user application * to user application
* @IWL_TM_CMD_DEV2APP_UCODE_RX_PKT: * @IWL_TM_CMD_DEV2APP_UCODE_RX_PKT:
* commands from kernel space to multicast the spontaneous messages * commands from kernel space to multicast the spontaneous messages
* to user application * to user application, or reply of host commands
* @IWL_TM_CMD_DEV2APP_EEPROM_RSP: * @IWL_TM_CMD_DEV2APP_EEPROM_RSP:
* commands from kernel space to carry the eeprom response * commands from kernel space to carry the eeprom response
* to user application * to user application
...@@ -109,20 +109,19 @@ ...@@ -109,20 +109,19 @@
* if application has the ownership, the only host command from * if application has the ownership, the only host command from
* testmode will deliver to uCode. Default owner is driver * testmode will deliver to uCode. Default owner is driver
* *
* @IWL_TM_CMD_APP2DEV_INDIRECT_REG_READ32:
* @IWL_TM_CMD_APP2DEV_INDIRECT_REG_WRITE32:
* commands from user application to indirectly access peripheral register
*
* @IWL_TM_CMD_APP2DEV_READ_SRAM:
* @IWL_TM_CMD_APP2DEV_DUMP_SRAM:
* commands from user application to read data in sram
*
* @IWL_TM_CMD_APP2DEV_LOAD_WOWLAN_FW: load Wake On Wireless LAN uCode image * @IWL_TM_CMD_APP2DEV_LOAD_WOWLAN_FW: load Wake On Wireless LAN uCode image
* @IWL_TM_CMD_APP2DEV_GET_FW_VERSION: retrieve uCode version * @IWL_TM_CMD_APP2DEV_GET_FW_VERSION: retrieve uCode version
* @IWL_TM_CMD_APP2DEV_GET_DEVICE_ID: retrieve ID information in device * @IWL_TM_CMD_APP2DEV_GET_DEVICE_ID: retrieve ID information in device
* @IWL_TM_CMD_APP2DEV_GET_FW_INFO: * @IWL_TM_CMD_APP2DEV_GET_FW_INFO:
* retrieve information of existing loaded uCode image * retrieve information of existing loaded uCode image
* *
* @IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_READ:
* @IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_DUMP:
* @IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_WRITE:
* Commands to read/write data from periphery or SRAM memory ranges.
* Fore reading, a READ command is sent from the userspace and the data
* is returned when the user calls a DUMP command.
* For writing, only a WRITE command is used.
*/ */
enum iwl_tm_cmd_t { enum iwl_tm_cmd_t {
IWL_TM_CMD_APP2DEV_UCODE = 1, IWL_TM_CMD_APP2DEV_UCODE = 1,
...@@ -142,15 +141,18 @@ enum iwl_tm_cmd_t { ...@@ -142,15 +141,18 @@ enum iwl_tm_cmd_t {
IWL_TM_CMD_DEV2APP_UCODE_RX_PKT = 15, IWL_TM_CMD_DEV2APP_UCODE_RX_PKT = 15,
IWL_TM_CMD_DEV2APP_EEPROM_RSP = 16, IWL_TM_CMD_DEV2APP_EEPROM_RSP = 16,
IWL_TM_CMD_APP2DEV_OWNERSHIP = 17, IWL_TM_CMD_APP2DEV_OWNERSHIP = 17,
IWL_TM_CMD_APP2DEV_INDIRECT_REG_READ32 = 18, RESERVED_18 = 18,
IWL_TM_CMD_APP2DEV_INDIRECT_REG_WRITE32 = 19, RESERVED_19 = 19,
IWL_TM_CMD_APP2DEV_READ_SRAM = 20, RESERVED_20 = 20,
IWL_TM_CMD_APP2DEV_DUMP_SRAM = 21, RESERVED_21 = 21,
IWL_TM_CMD_APP2DEV_LOAD_WOWLAN_FW = 22, IWL_TM_CMD_APP2DEV_LOAD_WOWLAN_FW = 22,
IWL_TM_CMD_APP2DEV_GET_FW_VERSION = 23, IWL_TM_CMD_APP2DEV_GET_FW_VERSION = 23,
IWL_TM_CMD_APP2DEV_GET_DEVICE_ID = 24, IWL_TM_CMD_APP2DEV_GET_DEVICE_ID = 24,
IWL_TM_CMD_APP2DEV_GET_FW_INFO = 25, IWL_TM_CMD_APP2DEV_GET_FW_INFO = 25,
IWL_TM_CMD_MAX = 26, IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_READ = 26,
IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_DUMP = 27,
IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_WRITE = 28,
IWL_TM_CMD_MAX = 29,
}; };
/* /*
...@@ -171,8 +173,6 @@ enum iwl_tm_cmd_t { ...@@ -171,8 +173,6 @@ enum iwl_tm_cmd_t {
* When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_UCODE, * When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_UCODE,
* The mandatory fields are : * The mandatory fields are :
* IWL_TM_ATTR_UCODE_CMD_ID for recognizable command ID; * IWL_TM_ATTR_UCODE_CMD_ID for recognizable command ID;
* IWL_TM_ATTR_COMMAND_FLAG for the flags of the commands;
* The optional fields are:
* IWL_TM_ATTR_UCODE_CMD_DATA for the actual command payload * IWL_TM_ATTR_UCODE_CMD_DATA for the actual command payload
* to the ucode * to the ucode
* *
...@@ -221,16 +221,19 @@ enum iwl_tm_cmd_t { ...@@ -221,16 +221,19 @@ enum iwl_tm_cmd_t {
* The mandatory fields are: * The mandatory fields are:
* IWL_TM_ATTR_UCODE_OWNER for the new owner * IWL_TM_ATTR_UCODE_OWNER for the new owner
* *
* @IWL_TM_ATTR_SRAM_ADDR: * @IWL_TM_ATTR_MEM_ADDR:
* @IWL_TM_ATTR_SRAM_SIZE: * @IWL_TM_ATTR_BUFFER_SIZE:
* When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_READ_SRAM, * When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_READ
* or IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_WRITE.
* The mandatory fields are: * The mandatory fields are:
* IWL_TM_ATTR_SRAM_ADDR for the address in sram * IWL_TM_ATTR_MEM_ADDR for the address in SRAM/periphery to read/write
* IWL_TM_ATTR_SRAM_SIZE for the buffer size of data reading * IWL_TM_ATTR_BUFFER_SIZE for the buffer size of data to read/write.
* *
* @IWL_TM_ATTR_SRAM_DUMP: * @IWL_TM_ATTR_BUFFER_DUMP:
* When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_DUMP_SRAM, * When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_DUMP,
* IWL_TM_ATTR_SRAM_DUMP for the data in sram * IWL_TM_ATTR_BUFFER_DUMP is used for the data that was read.
* When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_INDIRECT_BUFFER_WRITE,
* this attribute contains the data to write.
* *
* @IWL_TM_ATTR_FW_VERSION: * @IWL_TM_ATTR_FW_VERSION:
* When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_GET_FW_VERSION, * When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_GET_FW_VERSION,
...@@ -249,6 +252,10 @@ enum iwl_tm_cmd_t { ...@@ -249,6 +252,10 @@ enum iwl_tm_cmd_t {
* IWL_TM_ATTR_FW_INST_SIZE for the size of instruction section * IWL_TM_ATTR_FW_INST_SIZE for the size of instruction section
* IWL_TM_ATTR_FW_DATA_SIZE for the size of data section * IWL_TM_ATTR_FW_DATA_SIZE for the size of data section
* *
* @IWL_TM_ATTR_UCODE_CMD_SKB:
* When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_UCODE this flag
* indicates that the user wants to receive the response of the command
* in a reply SKB. If it's not present, the response is not returned.
*/ */
enum iwl_tm_attr_t { enum iwl_tm_attr_t {
IWL_TM_ATTR_NOT_APPLICABLE = 0, IWL_TM_ATTR_NOT_APPLICABLE = 0,
...@@ -266,15 +273,16 @@ enum iwl_tm_attr_t { ...@@ -266,15 +273,16 @@ enum iwl_tm_attr_t {
IWL_TM_ATTR_TRACE_DUMP = 12, IWL_TM_ATTR_TRACE_DUMP = 12,
IWL_TM_ATTR_FIXRATE = 13, IWL_TM_ATTR_FIXRATE = 13,
IWL_TM_ATTR_UCODE_OWNER = 14, IWL_TM_ATTR_UCODE_OWNER = 14,
IWL_TM_ATTR_SRAM_ADDR = 15, IWL_TM_ATTR_MEM_ADDR = 15,
IWL_TM_ATTR_SRAM_SIZE = 16, IWL_TM_ATTR_BUFFER_SIZE = 16,
IWL_TM_ATTR_SRAM_DUMP = 17, IWL_TM_ATTR_BUFFER_DUMP = 17,
IWL_TM_ATTR_FW_VERSION = 18, IWL_TM_ATTR_FW_VERSION = 18,
IWL_TM_ATTR_DEVICE_ID = 19, IWL_TM_ATTR_DEVICE_ID = 19,
IWL_TM_ATTR_FW_TYPE = 20, IWL_TM_ATTR_FW_TYPE = 20,
IWL_TM_ATTR_FW_INST_SIZE = 21, IWL_TM_ATTR_FW_INST_SIZE = 21,
IWL_TM_ATTR_FW_DATA_SIZE = 22, IWL_TM_ATTR_FW_DATA_SIZE = 22,
IWL_TM_ATTR_MAX = 23, IWL_TM_ATTR_UCODE_CMD_SKB = 23,
IWL_TM_ATTR_MAX = 24,
}; };
/* uCode trace buffer */ /* uCode trace buffer */
......
...@@ -230,6 +230,7 @@ struct iwl_trans_pcie { ...@@ -230,6 +230,7 @@ struct iwl_trans_pcie {
struct tasklet_struct irq_tasklet; struct tasklet_struct irq_tasklet;
struct isr_statistics isr_stats; struct isr_statistics isr_stats;
spinlock_t irq_lock;
u32 inta_mask; u32 inta_mask;
u32 scd_base_addr; u32 scd_base_addr;
struct iwl_dma_ptr scd_bc_tbls; struct iwl_dma_ptr scd_bc_tbls;
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "iwl-core.h" #include "iwl-core.h"
#include "iwl-io.h" #include "iwl-io.h"
#include "iwl-trans-pcie-int.h" #include "iwl-trans-pcie-int.h"
#include "iwl-wifi.h"
#ifdef CONFIG_IWLWIFI_IDI #ifdef CONFIG_IWLWIFI_IDI
#include "iwl-amfh.h" #include "iwl-amfh.h"
...@@ -227,7 +228,7 @@ static void iwlagn_rx_queue_restock(struct iwl_trans *trans) ...@@ -227,7 +228,7 @@ static void iwlagn_rx_queue_restock(struct iwl_trans *trans)
/* If the pre-allocated buffer pool is dropping low, schedule to /* If the pre-allocated buffer pool is dropping low, schedule to
* refill it */ * refill it */
if (rxq->free_count <= RX_LOW_WATERMARK) if (rxq->free_count <= RX_LOW_WATERMARK)
queue_work(trans->shrd->workqueue, &trans_pcie->rx_replenish); schedule_work(&trans_pcie->rx_replenish);
/* If we've added more space for the firmware to place data, tell it. /* If we've added more space for the firmware to place data, tell it.
...@@ -331,13 +332,14 @@ static void iwlagn_rx_allocate(struct iwl_trans *trans, gfp_t priority) ...@@ -331,13 +332,14 @@ static void iwlagn_rx_allocate(struct iwl_trans *trans, gfp_t priority)
void iwlagn_rx_replenish(struct iwl_trans *trans) void iwlagn_rx_replenish(struct iwl_trans *trans)
{ {
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
unsigned long flags; unsigned long flags;
iwlagn_rx_allocate(trans, GFP_KERNEL); iwlagn_rx_allocate(trans, GFP_KERNEL);
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
iwlagn_rx_queue_restock(trans); iwlagn_rx_queue_restock(trans);
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
} }
static void iwlagn_rx_replenish_now(struct iwl_trans *trans) static void iwlagn_rx_replenish_now(struct iwl_trans *trans)
...@@ -351,14 +353,8 @@ void iwl_bg_rx_replenish(struct work_struct *data) ...@@ -351,14 +353,8 @@ void iwl_bg_rx_replenish(struct work_struct *data)
{ {
struct iwl_trans_pcie *trans_pcie = struct iwl_trans_pcie *trans_pcie =
container_of(data, struct iwl_trans_pcie, rx_replenish); container_of(data, struct iwl_trans_pcie, rx_replenish);
struct iwl_trans *trans = trans_pcie->trans;
if (test_bit(STATUS_EXIT_PENDING, &trans->shrd->status))
return;
mutex_lock(&trans->shrd->mutex); iwlagn_rx_replenish(trans_pcie->trans);
iwlagn_rx_replenish(trans);
mutex_unlock(&trans->shrd->mutex);
} }
/** /**
...@@ -594,17 +590,17 @@ static void iwl_dump_nic_error_log(struct iwl_trans *trans) ...@@ -594,17 +590,17 @@ static void iwl_dump_nic_error_log(struct iwl_trans *trans)
{ {
u32 base; u32 base;
struct iwl_error_event_table table; struct iwl_error_event_table table;
struct iwl_priv *priv = priv(trans); struct iwl_nic *nic = nic(trans);
struct iwl_trans_pcie *trans_pcie = struct iwl_trans_pcie *trans_pcie =
IWL_TRANS_GET_PCIE_TRANS(trans); IWL_TRANS_GET_PCIE_TRANS(trans);
base = trans->shrd->device_pointers.error_event_table; base = trans->shrd->device_pointers.error_event_table;
if (trans->shrd->ucode_type == IWL_UCODE_INIT) { if (trans->shrd->ucode_type == IWL_UCODE_INIT) {
if (!base) if (!base)
base = priv->init_errlog_ptr; base = nic->init_errlog_ptr;
} else { } else {
if (!base) if (!base)
base = priv->inst_errlog_ptr; base = nic->inst_errlog_ptr;
} }
if (!iwlagn_hw_valid_rtc_data_addr(base)) { if (!iwlagn_hw_valid_rtc_data_addr(base)) {
...@@ -616,7 +612,7 @@ static void iwl_dump_nic_error_log(struct iwl_trans *trans) ...@@ -616,7 +612,7 @@ static void iwl_dump_nic_error_log(struct iwl_trans *trans)
return; return;
} }
iwl_read_targ_mem_words(trans(priv), base, &table, sizeof(table)); iwl_read_targ_mem_words(trans, base, &table, sizeof(table));
if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) { if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) {
IWL_ERR(trans, "Start IWL Error Log Dump:\n"); IWL_ERR(trans, "Start IWL Error Log Dump:\n");
...@@ -626,7 +622,7 @@ static void iwl_dump_nic_error_log(struct iwl_trans *trans) ...@@ -626,7 +622,7 @@ static void iwl_dump_nic_error_log(struct iwl_trans *trans)
trans_pcie->isr_stats.err_code = table.error_id; trans_pcie->isr_stats.err_code = table.error_id;
trace_iwlwifi_dev_ucode_error(priv, table.error_id, table.tsf_low, trace_iwlwifi_dev_ucode_error(priv(nic), table.error_id, table.tsf_low,
table.data1, table.data2, table.line, table.data1, table.data2, table.line,
table.blink1, table.blink2, table.ilink1, table.blink1, table.blink2, table.ilink1,
table.ilink2, table.bcon_time, table.gp1, table.ilink2, table.bcon_time, table.gp1,
...@@ -723,7 +719,7 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx, ...@@ -723,7 +719,7 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx,
u32 ptr; /* SRAM byte address of log data */ u32 ptr; /* SRAM byte address of log data */
u32 ev, time, data; /* event log data */ u32 ev, time, data; /* event log data */
unsigned long reg_flags; unsigned long reg_flags;
struct iwl_priv *priv = priv(trans); struct iwl_nic *nic = nic(trans);
if (num_events == 0) if (num_events == 0)
return pos; return pos;
...@@ -731,10 +727,10 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx, ...@@ -731,10 +727,10 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx,
base = trans->shrd->device_pointers.log_event_table; base = trans->shrd->device_pointers.log_event_table;
if (trans->shrd->ucode_type == IWL_UCODE_INIT) { if (trans->shrd->ucode_type == IWL_UCODE_INIT) {
if (!base) if (!base)
base = priv->init_evtlog_ptr; base = nic->init_evtlog_ptr;
} else { } else {
if (!base) if (!base)
base = priv->inst_evtlog_ptr; base = nic->inst_evtlog_ptr;
} }
if (mode == 0) if (mode == 0)
...@@ -764,7 +760,7 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx, ...@@ -764,7 +760,7 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx,
"EVT_LOG:0x%08x:%04u\n", "EVT_LOG:0x%08x:%04u\n",
time, ev); time, ev);
} else { } else {
trace_iwlwifi_dev_ucode_event(priv, 0, trace_iwlwifi_dev_ucode_event(priv(trans), 0,
time, ev); time, ev);
IWL_ERR(trans, "EVT_LOG:0x%08x:%04u\n", IWL_ERR(trans, "EVT_LOG:0x%08x:%04u\n",
time, ev); time, ev);
...@@ -778,7 +774,7 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx, ...@@ -778,7 +774,7 @@ static int iwl_print_event_log(struct iwl_trans *trans, u32 start_idx,
} else { } else {
IWL_ERR(trans, "EVT_LOGT:%010u:0x%08x:%04u\n", IWL_ERR(trans, "EVT_LOGT:%010u:0x%08x:%04u\n",
time, data, ev); time, data, ev);
trace_iwlwifi_dev_ucode_event(priv, time, trace_iwlwifi_dev_ucode_event(priv(trans), time,
data, ev); data, ev);
} }
} }
...@@ -840,17 +836,17 @@ int iwl_dump_nic_event_log(struct iwl_trans *trans, bool full_log, ...@@ -840,17 +836,17 @@ int iwl_dump_nic_event_log(struct iwl_trans *trans, bool full_log,
u32 logsize; u32 logsize;
int pos = 0; int pos = 0;
size_t bufsz = 0; size_t bufsz = 0;
struct iwl_priv *priv = priv(trans); struct iwl_nic *nic = nic(trans);
base = trans->shrd->device_pointers.log_event_table; base = trans->shrd->device_pointers.log_event_table;
if (trans->shrd->ucode_type == IWL_UCODE_INIT) { if (trans->shrd->ucode_type == IWL_UCODE_INIT) {
logsize = priv->init_evtlog_size; logsize = nic->init_evtlog_size;
if (!base) if (!base)
base = priv->init_evtlog_ptr; base = nic->init_evtlog_ptr;
} else { } else {
logsize = priv->inst_evtlog_size; logsize = nic->inst_evtlog_size;
if (!base) if (!base)
base = priv->inst_evtlog_ptr; base = nic->inst_evtlog_ptr;
} }
if (!iwlagn_hw_valid_rtc_data_addr(base)) { if (!iwlagn_hw_valid_rtc_data_addr(base)) {
...@@ -949,7 +945,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans) ...@@ -949,7 +945,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
struct isr_statistics *isr_stats = &trans_pcie->isr_stats; struct isr_statistics *isr_stats = &trans_pcie->isr_stats;
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
/* Ack/clear/reset pending uCode interrupts. /* Ack/clear/reset pending uCode interrupts.
* Note: Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS, * Note: Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS,
...@@ -979,7 +975,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans) ...@@ -979,7 +975,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
/* saved interrupt in inta variable now we can reset trans_pcie->inta */ /* saved interrupt in inta variable now we can reset trans_pcie->inta */
trans_pcie->inta = 0; trans_pcie->inta = 0;
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
/* Now service all interrupt bits discovered above. */ /* Now service all interrupt bits discovered above. */
if (inta & CSR_INT_BIT_HW_ERR) { if (inta & CSR_INT_BIT_HW_ERR) {
...@@ -1232,7 +1228,7 @@ void iwl_reset_ict(struct iwl_trans *trans) ...@@ -1232,7 +1228,7 @@ void iwl_reset_ict(struct iwl_trans *trans)
if (!trans_pcie->ict_tbl) if (!trans_pcie->ict_tbl)
return; return;
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
iwl_disable_interrupts(trans); iwl_disable_interrupts(trans);
memset(trans_pcie->ict_tbl, 0, ICT_SIZE); memset(trans_pcie->ict_tbl, 0, ICT_SIZE);
...@@ -1249,7 +1245,7 @@ void iwl_reset_ict(struct iwl_trans *trans) ...@@ -1249,7 +1245,7 @@ void iwl_reset_ict(struct iwl_trans *trans)
trans_pcie->ict_index = 0; trans_pcie->ict_index = 0;
iwl_write32(trans, CSR_INT, trans_pcie->inta_mask); iwl_write32(trans, CSR_INT, trans_pcie->inta_mask);
iwl_enable_interrupts(trans); iwl_enable_interrupts(trans);
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
} }
/* Device is going down disable ict interrupt usage */ /* Device is going down disable ict interrupt usage */
...@@ -1260,9 +1256,9 @@ void iwl_disable_ict(struct iwl_trans *trans) ...@@ -1260,9 +1256,9 @@ void iwl_disable_ict(struct iwl_trans *trans)
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
trans_pcie->use_ict = false; trans_pcie->use_ict = false;
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
} }
static irqreturn_t iwl_isr(int irq, void *data) static irqreturn_t iwl_isr(int irq, void *data)
...@@ -1281,7 +1277,7 @@ static irqreturn_t iwl_isr(int irq, void *data) ...@@ -1281,7 +1277,7 @@ static irqreturn_t iwl_isr(int irq, void *data)
trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
/* Disable (but don't clear!) interrupts here to avoid /* Disable (but don't clear!) interrupts here to avoid
* back-to-back ISRs and sporadic interrupts from our NIC. * back-to-back ISRs and sporadic interrupts from our NIC.
...@@ -1325,7 +1321,7 @@ static irqreturn_t iwl_isr(int irq, void *data) ...@@ -1325,7 +1321,7 @@ static irqreturn_t iwl_isr(int irq, void *data)
iwl_enable_interrupts(trans); iwl_enable_interrupts(trans);
unplugged: unplugged:
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
return IRQ_HANDLED; return IRQ_HANDLED;
none: none:
...@@ -1335,7 +1331,7 @@ static irqreturn_t iwl_isr(int irq, void *data) ...@@ -1335,7 +1331,7 @@ static irqreturn_t iwl_isr(int irq, void *data)
!trans_pcie->inta) !trans_pcie->inta)
iwl_enable_interrupts(trans); iwl_enable_interrupts(trans);
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
return IRQ_NONE; return IRQ_NONE;
} }
...@@ -1369,7 +1365,7 @@ irqreturn_t iwl_isr_ict(int irq, void *data) ...@@ -1369,7 +1365,7 @@ irqreturn_t iwl_isr_ict(int irq, void *data)
trace_iwlwifi_dev_irq(priv(trans)); trace_iwlwifi_dev_irq(priv(trans));
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
/* Disable (but don't clear!) interrupts here to avoid /* Disable (but don't clear!) interrupts here to avoid
* back-to-back ISRs and sporadic interrupts from our NIC. * back-to-back ISRs and sporadic interrupts from our NIC.
...@@ -1440,7 +1436,7 @@ irqreturn_t iwl_isr_ict(int irq, void *data) ...@@ -1440,7 +1436,7 @@ irqreturn_t iwl_isr_ict(int irq, void *data)
iwl_enable_interrupts(trans); iwl_enable_interrupts(trans);
} }
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
return IRQ_HANDLED; return IRQ_HANDLED;
none: none:
...@@ -1451,6 +1447,6 @@ irqreturn_t iwl_isr_ict(int irq, void *data) ...@@ -1451,6 +1447,6 @@ irqreturn_t iwl_isr_ict(int irq, void *data)
!trans_pcie->inta) !trans_pcie->inta)
iwl_enable_interrupts(trans); iwl_enable_interrupts(trans);
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
return IRQ_NONE; return IRQ_NONE;
} }
...@@ -492,7 +492,7 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans, ...@@ -492,7 +492,7 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans,
ra_tid = BUILD_RAxTID(sta_id, tid); ra_tid = BUILD_RAxTID(sta_id, tid);
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
/* Stop this Tx queue before configuring it */ /* Stop this Tx queue before configuring it */
iwlagn_tx_queue_stop_scheduler(trans, txq_id); iwlagn_tx_queue_stop_scheduler(trans, txq_id);
...@@ -532,7 +532,7 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans, ...@@ -532,7 +532,7 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans,
trans_pcie->txq[txq_id].sta_id = sta_id; trans_pcie->txq[txq_id].sta_id = sta_id;
trans_pcie->txq[txq_id].tid = tid; trans_pcie->txq[txq_id].tid = tid;
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
} }
/* /*
......
...@@ -219,10 +219,10 @@ static int iwl_rx_init(struct iwl_trans *trans) ...@@ -219,10 +219,10 @@ static int iwl_rx_init(struct iwl_trans *trans)
iwl_trans_rx_hw_init(trans, rxq); iwl_trans_rx_hw_init(trans, rxq);
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
rxq->need_update = 1; rxq->need_update = 1;
iwl_rx_queue_update_write_ptr(trans, rxq); iwl_rx_queue_update_write_ptr(trans, rxq);
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
return 0; return 0;
} }
...@@ -585,7 +585,7 @@ static int iwl_tx_init(struct iwl_trans *trans) ...@@ -585,7 +585,7 @@ static int iwl_tx_init(struct iwl_trans *trans)
alloc = true; alloc = true;
} }
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
/* Turn off all Tx DMA fifos */ /* Turn off all Tx DMA fifos */
iwl_write_prph(trans, SCD_TXFACT, 0); iwl_write_prph(trans, SCD_TXFACT, 0);
...@@ -594,7 +594,7 @@ static int iwl_tx_init(struct iwl_trans *trans) ...@@ -594,7 +594,7 @@ static int iwl_tx_init(struct iwl_trans *trans)
iwl_write_direct32(trans, FH_KW_MEM_ADDR_REG, iwl_write_direct32(trans, FH_KW_MEM_ADDR_REG,
trans_pcie->kw.dma >> 4); trans_pcie->kw.dma >> 4);
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
/* Alloc and init all Tx queues, including the command queue (#4/#9) */ /* Alloc and init all Tx queues, including the command queue (#4/#9) */
for (txq_id = 0; txq_id < hw_params(trans).max_txq_num; txq_id++) { for (txq_id = 0; txq_id < hw_params(trans).max_txq_num; txq_id++) {
...@@ -803,17 +803,18 @@ static void iwl_apm_stop(struct iwl_trans *trans) ...@@ -803,17 +803,18 @@ static void iwl_apm_stop(struct iwl_trans *trans)
static int iwl_nic_init(struct iwl_trans *trans) static int iwl_nic_init(struct iwl_trans *trans)
{ {
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
unsigned long flags; unsigned long flags;
/* nic_init */ /* nic_init */
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
iwl_apm_init(trans); iwl_apm_init(trans);
/* Set interrupt coalescing calibration timer to default (512 usecs) */ /* Set interrupt coalescing calibration timer to default (512 usecs) */
iwl_write8(trans, CSR_INT_COALESCING, iwl_write8(trans, CSR_INT_COALESCING,
IWL_HOST_INT_CALIB_TIMEOUT_DEF); IWL_HOST_INT_CALIB_TIMEOUT_DEF);
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
iwl_set_pwr_vmain(trans); iwl_set_pwr_vmain(trans);
...@@ -1078,10 +1079,15 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, struct fw_img *fw) ...@@ -1078,10 +1079,15 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, struct fw_img *fw)
/* /*
* Activate/Deactivate Tx DMA/FIFO channels according tx fifos mask * Activate/Deactivate Tx DMA/FIFO channels according tx fifos mask
* must be called under priv->shrd->lock and mac access * must be called under the irq lock and with MAC access
*/ */
static void iwl_trans_txq_set_sched(struct iwl_trans *trans, u32 mask) static void iwl_trans_txq_set_sched(struct iwl_trans *trans, u32 mask)
{ {
struct iwl_trans_pcie __maybe_unused *trans_pcie =
IWL_TRANS_GET_PCIE_TRANS(trans);
lockdep_assert_held(&trans_pcie->irq_lock);
iwl_write_prph(trans, SCD_TXFACT, mask); iwl_write_prph(trans, SCD_TXFACT, mask);
} }
...@@ -1095,7 +1101,7 @@ static void iwl_tx_start(struct iwl_trans *trans) ...@@ -1095,7 +1101,7 @@ static void iwl_tx_start(struct iwl_trans *trans)
int i, chan; int i, chan;
u32 reg_val; u32 reg_val;
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
trans_pcie->scd_base_addr = trans_pcie->scd_base_addr =
iwl_read_prph(trans, SCD_SRAM_BASE_ADDR); iwl_read_prph(trans, SCD_SRAM_BASE_ADDR);
...@@ -1191,7 +1197,7 @@ static void iwl_tx_start(struct iwl_trans *trans) ...@@ -1191,7 +1197,7 @@ static void iwl_tx_start(struct iwl_trans *trans)
fifo, 0); fifo, 0);
} }
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
/* Enable L1-Active */ /* Enable L1-Active */
iwl_clear_bits_prph(trans, APMG_PCIDEV_STT_REG, iwl_clear_bits_prph(trans, APMG_PCIDEV_STT_REG,
...@@ -1214,7 +1220,7 @@ static int iwl_trans_tx_stop(struct iwl_trans *trans) ...@@ -1214,7 +1220,7 @@ static int iwl_trans_tx_stop(struct iwl_trans *trans)
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
/* Turn off all Tx DMA fifos */ /* Turn off all Tx DMA fifos */
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
iwl_trans_txq_set_sched(trans, 0); iwl_trans_txq_set_sched(trans, 0);
...@@ -1230,7 +1236,7 @@ static int iwl_trans_tx_stop(struct iwl_trans *trans) ...@@ -1230,7 +1236,7 @@ static int iwl_trans_tx_stop(struct iwl_trans *trans)
iwl_read_direct32(trans, iwl_read_direct32(trans,
FH_TSSR_TX_STATUS_REG)); FH_TSSR_TX_STATUS_REG));
} }
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
if (!trans_pcie->txq) { if (!trans_pcie->txq) {
IWL_WARN(trans, "Stopping tx queues that aren't allocated..."); IWL_WARN(trans, "Stopping tx queues that aren't allocated...");
...@@ -1250,9 +1256,9 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans) ...@@ -1250,9 +1256,9 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
/* tell the device to stop sending interrupts */ /* tell the device to stop sending interrupts */
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
iwl_disable_interrupts(trans); iwl_disable_interrupts(trans);
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
/* device going down, Stop using ICT table */ /* device going down, Stop using ICT table */
iwl_disable_ict(trans); iwl_disable_ict(trans);
...@@ -1285,14 +1291,16 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans) ...@@ -1285,14 +1291,16 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
/* Upon stop, the APM issues an interrupt if HW RF kill is set. /* Upon stop, the APM issues an interrupt if HW RF kill is set.
* Clean again the interrupt here * Clean again the interrupt here
*/ */
spin_lock_irqsave(&trans->shrd->lock, flags); spin_lock_irqsave(&trans_pcie->irq_lock, flags);
iwl_disable_interrupts(trans); iwl_disable_interrupts(trans);
spin_unlock_irqrestore(&trans->shrd->lock, flags); spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
/* wait to make sure we flush pending tasklet*/ /* wait to make sure we flush pending tasklet*/
synchronize_irq(trans->irq); synchronize_irq(trans->irq);
tasklet_kill(&trans_pcie->irq_tasklet); tasklet_kill(&trans_pcie->irq_tasklet);
cancel_work_sync(&trans_pcie->rx_replenish);
/* stop and reset the on-board processor */ /* stop and reset the on-board processor */
iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET); iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);
} }
...@@ -2259,6 +2267,7 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct iwl_shared *shrd, ...@@ -2259,6 +2267,7 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct iwl_shared *shrd,
trans->shrd = shrd; trans->shrd = shrd;
trans_pcie->trans = trans; trans_pcie->trans = trans;
spin_lock_init(&trans->hcmd_lock); spin_lock_init(&trans->hcmd_lock);
spin_lock_init(&trans_pcie->irq_lock);
/* W/A - seems to solve weird behavior. We need to remove this if we /* W/A - seems to solve weird behavior. We need to remove this if we
* don't want to stay in L1 all the time. This wastes a lot of power */ * don't want to stay in L1 all the time. This wastes a lot of power */
......
This diff is collapsed.
This diff is collapsed.
...@@ -63,6 +63,8 @@ ...@@ -63,6 +63,8 @@
#ifndef __iwl_ucode_h__ #ifndef __iwl_ucode_h__
#define __iwl_ucode_h__ #define __iwl_ucode_h__
#include <linux/netdevice.h>
/* v1/v2 uCode file layout */ /* v1/v2 uCode file layout */
struct iwl_ucode_header { struct iwl_ucode_header {
__le32 ver; /* major/minor/API/serial */ __le32 ver; /* major/minor/API/serial */
...@@ -171,8 +173,49 @@ struct iwl_tlv_ucode_header { ...@@ -171,8 +173,49 @@ struct iwl_tlv_ucode_header {
u8 data[0]; u8 data[0];
}; };
struct iwl_priv; struct iwl_ucode_capabilities {
u32 max_probe_length;
u32 standard_phy_calibration_size;
u32 flags;
};
/* one for each uCode image (inst/data, boot/init/runtime) */
struct fw_desc {
dma_addr_t p_addr; /* hardware address */
void *v_addr; /* software address */
u32 len; /* size in bytes */
};
int __must_check iwl_request_firmware(struct iwl_priv *priv, bool first); struct fw_img {
struct fw_desc code; /* firmware code image */
struct fw_desc data; /* firmware data image */
};
/**
* struct iwl_fw - variables associated with the firmware
*
* @ucode_ver: ucode version from the ucode file
* @fw_version: firmware version string
* @ucode_rt: run time ucode image
* @ucode_init: init ucode image
* @ucode_wowlan: wake on wireless ucode image (optional)
* @ucode_capa: capabilities parsed from the ucode file.
* @enhance_sensitivity_table: device can do enhanced sensitivity.
*/
struct iwl_fw {
/* ucode image and variables */
u32 ucode_ver; /* version of ucode, copy of
iwl_ucode.ver */
char fw_version[ETHTOOL_BUSINFO_LEN];
/* ucode images */
struct fw_img ucode_rt;
struct fw_img ucode_init;
struct fw_img ucode_wowlan;
struct iwl_ucode_capabilities ucode_capa;
bool enhance_sensitivity_table;
};
#endif /* __iwl_ucode_h__ */ #endif /* __iwl_ucode_h__ */
...@@ -64,6 +64,39 @@ ...@@ -64,6 +64,39 @@
#define __iwl_wifi_h__ #define __iwl_wifi_h__
#include "iwl-shared.h" #include "iwl-shared.h"
#include "iwl-ucode.h"
/**
* struct iwl_nic - nic common data
* @fw: the iwl_fw structure
* @shrd: pointer to common shared structure
* @fw_index: firmware revision to try loading
* @firmware_name: composite filename of ucode file to load
* @init_evtlog_ptr: event log offset for init ucode.
* @init_evtlog_size: event log size for init ucode.
* @init_errlog_ptr: error log offfset for init ucode.
* @inst_evtlog_ptr: event log offset for runtime ucode.
* @inst_evtlog_size: event log size for runtime ucode.
* @inst_errlog_ptr: error log offfset for runtime ucode.
* @request_firmware_complete: the firmware has been obtained from user space
*/
struct iwl_nic {
struct iwl_fw fw;
struct iwl_shared *shrd;
int fw_index; /* firmware we're trying to load */
char firmware_name[25]; /* name of firmware file to load */
u32 init_evtlog_ptr, init_evtlog_size, init_errlog_ptr;
u32 inst_evtlog_ptr, inst_evtlog_size, inst_errlog_ptr;
struct completion request_firmware_complete;
};
int __must_check iwl_request_firmware(struct iwl_nic *nic, bool first);
void iwl_dealloc_ucode(struct iwl_nic *nic);
int iwl_send_bt_env(struct iwl_trans *trans, u8 action, u8 type); int iwl_send_bt_env(struct iwl_trans *trans, u8 action, u8 type);
void iwl_send_prio_tbl(struct iwl_trans *trans); void iwl_send_prio_tbl(struct iwl_trans *trans);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment