Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01d85b9b authored by Kalle Valo's avatar Kalle Valo
Browse files

Merge tag 'iwlwifi-for-kalle-2015-12-16' of...

Merge tag 'iwlwifi-for-kalle-2015-12-16' of https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes

* don't load firmware that won't exist for 7260
* fix RCU splat
parents eeec5d0e 45854360
Loading
Loading
Loading
Loading
+35 −14
Original line number Original line Diff line number Diff line
@@ -69,13 +69,19 @@
#include "iwl-agn-hw.h"
#include "iwl-agn-hw.h"


/* Highest firmware API version supported */
/* Highest firmware API version supported */
#define IWL7260_UCODE_API_MAX	19
#define IWL7260_UCODE_API_MAX	17
#define IWL7265_UCODE_API_MAX	19
#define IWL7265D_UCODE_API_MAX	19


/* Oldest version we won't warn about */
/* Oldest version we won't warn about */
#define IWL7260_UCODE_API_OK	13
#define IWL7260_UCODE_API_OK	13
#define IWL7265_UCODE_API_OK	13
#define IWL7265D_UCODE_API_OK	13


/* Lowest firmware API version supported */
/* Lowest firmware API version supported */
#define IWL7260_UCODE_API_MIN	13
#define IWL7260_UCODE_API_MIN	13
#define IWL7265_UCODE_API_MIN	13
#define IWL7265D_UCODE_API_MIN	13


/* NVM versions */
/* NVM versions */
#define IWL7260_NVM_VERSION		0x0a1d
#define IWL7260_NVM_VERSION		0x0a1d
@@ -149,10 +155,7 @@ static const struct iwl_ht_params iwl7000_ht_params = {
	.ht40_bands = BIT(IEEE80211_BAND_2GHZ) | BIT(IEEE80211_BAND_5GHZ),
	.ht40_bands = BIT(IEEE80211_BAND_2GHZ) | BIT(IEEE80211_BAND_5GHZ),
};
};


#define IWL_DEVICE_7000						\
#define IWL_DEVICE_7000_COMMON					\
	.ucode_api_max = IWL7260_UCODE_API_MAX,			\
	.ucode_api_ok = IWL7260_UCODE_API_OK,			\
	.ucode_api_min = IWL7260_UCODE_API_MIN,			\
	.device_family = IWL_DEVICE_FAMILY_7000,		\
	.device_family = IWL_DEVICE_FAMILY_7000,		\
	.max_inst_size = IWL60_RTC_INST_SIZE,			\
	.max_inst_size = IWL60_RTC_INST_SIZE,			\
	.max_data_size = IWL60_RTC_DATA_SIZE,			\
	.max_data_size = IWL60_RTC_DATA_SIZE,			\
@@ -163,6 +166,24 @@ static const struct iwl_ht_params iwl7000_ht_params = {
	.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,	\
	.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,	\
	.dccm_offset = IWL7000_DCCM_OFFSET
	.dccm_offset = IWL7000_DCCM_OFFSET


#define IWL_DEVICE_7000						\
	IWL_DEVICE_7000_COMMON,					\
	.ucode_api_max = IWL7260_UCODE_API_MAX,			\
	.ucode_api_ok = IWL7260_UCODE_API_OK,			\
	.ucode_api_min = IWL7260_UCODE_API_MIN

#define IWL_DEVICE_7005						\
	IWL_DEVICE_7000_COMMON,					\
	.ucode_api_max = IWL7265_UCODE_API_MAX,			\
	.ucode_api_ok = IWL7265_UCODE_API_OK,			\
	.ucode_api_min = IWL7265_UCODE_API_MIN

#define IWL_DEVICE_7005D					\
	IWL_DEVICE_7000_COMMON,					\
	.ucode_api_max = IWL7265D_UCODE_API_MAX,		\
	.ucode_api_ok = IWL7265D_UCODE_API_OK,			\
	.ucode_api_min = IWL7265D_UCODE_API_MIN

const struct iwl_cfg iwl7260_2ac_cfg = {
const struct iwl_cfg iwl7260_2ac_cfg = {
	.name = "Intel(R) Dual Band Wireless AC 7260",
	.name = "Intel(R) Dual Band Wireless AC 7260",
	.fw_name_pre = IWL7260_FW_PRE,
	.fw_name_pre = IWL7260_FW_PRE,
@@ -266,7 +287,7 @@ static const struct iwl_ht_params iwl7265_ht_params = {
const struct iwl_cfg iwl3165_2ac_cfg = {
const struct iwl_cfg iwl3165_2ac_cfg = {
	.name = "Intel(R) Dual Band Wireless AC 3165",
	.name = "Intel(R) Dual Band Wireless AC 3165",
	.fw_name_pre = IWL7265D_FW_PRE,
	.fw_name_pre = IWL7265D_FW_PRE,
	IWL_DEVICE_7000,
	IWL_DEVICE_7005D,
	.ht_params = &iwl7000_ht_params,
	.ht_params = &iwl7000_ht_params,
	.nvm_ver = IWL3165_NVM_VERSION,
	.nvm_ver = IWL3165_NVM_VERSION,
	.nvm_calib_ver = IWL3165_TX_POWER_VERSION,
	.nvm_calib_ver = IWL3165_TX_POWER_VERSION,
@@ -277,7 +298,7 @@ const struct iwl_cfg iwl3165_2ac_cfg = {
const struct iwl_cfg iwl7265_2ac_cfg = {
const struct iwl_cfg iwl7265_2ac_cfg = {
	.name = "Intel(R) Dual Band Wireless AC 7265",
	.name = "Intel(R) Dual Band Wireless AC 7265",
	.fw_name_pre = IWL7265_FW_PRE,
	.fw_name_pre = IWL7265_FW_PRE,
	IWL_DEVICE_7000,
	IWL_DEVICE_7005,
	.ht_params = &iwl7265_ht_params,
	.ht_params = &iwl7265_ht_params,
	.nvm_ver = IWL7265_NVM_VERSION,
	.nvm_ver = IWL7265_NVM_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -288,7 +309,7 @@ const struct iwl_cfg iwl7265_2ac_cfg = {
const struct iwl_cfg iwl7265_2n_cfg = {
const struct iwl_cfg iwl7265_2n_cfg = {
	.name = "Intel(R) Dual Band Wireless N 7265",
	.name = "Intel(R) Dual Band Wireless N 7265",
	.fw_name_pre = IWL7265_FW_PRE,
	.fw_name_pre = IWL7265_FW_PRE,
	IWL_DEVICE_7000,
	IWL_DEVICE_7005,
	.ht_params = &iwl7265_ht_params,
	.ht_params = &iwl7265_ht_params,
	.nvm_ver = IWL7265_NVM_VERSION,
	.nvm_ver = IWL7265_NVM_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -299,7 +320,7 @@ const struct iwl_cfg iwl7265_2n_cfg = {
const struct iwl_cfg iwl7265_n_cfg = {
const struct iwl_cfg iwl7265_n_cfg = {
	.name = "Intel(R) Wireless N 7265",
	.name = "Intel(R) Wireless N 7265",
	.fw_name_pre = IWL7265_FW_PRE,
	.fw_name_pre = IWL7265_FW_PRE,
	IWL_DEVICE_7000,
	IWL_DEVICE_7005,
	.ht_params = &iwl7265_ht_params,
	.ht_params = &iwl7265_ht_params,
	.nvm_ver = IWL7265_NVM_VERSION,
	.nvm_ver = IWL7265_NVM_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -310,7 +331,7 @@ const struct iwl_cfg iwl7265_n_cfg = {
const struct iwl_cfg iwl7265d_2ac_cfg = {
const struct iwl_cfg iwl7265d_2ac_cfg = {
	.name = "Intel(R) Dual Band Wireless AC 7265",
	.name = "Intel(R) Dual Band Wireless AC 7265",
	.fw_name_pre = IWL7265D_FW_PRE,
	.fw_name_pre = IWL7265D_FW_PRE,
	IWL_DEVICE_7000,
	IWL_DEVICE_7005D,
	.ht_params = &iwl7265_ht_params,
	.ht_params = &iwl7265_ht_params,
	.nvm_ver = IWL7265D_NVM_VERSION,
	.nvm_ver = IWL7265D_NVM_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -321,7 +342,7 @@ const struct iwl_cfg iwl7265d_2ac_cfg = {
const struct iwl_cfg iwl7265d_2n_cfg = {
const struct iwl_cfg iwl7265d_2n_cfg = {
	.name = "Intel(R) Dual Band Wireless N 7265",
	.name = "Intel(R) Dual Band Wireless N 7265",
	.fw_name_pre = IWL7265D_FW_PRE,
	.fw_name_pre = IWL7265D_FW_PRE,
	IWL_DEVICE_7000,
	IWL_DEVICE_7005D,
	.ht_params = &iwl7265_ht_params,
	.ht_params = &iwl7265_ht_params,
	.nvm_ver = IWL7265D_NVM_VERSION,
	.nvm_ver = IWL7265D_NVM_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -332,7 +353,7 @@ const struct iwl_cfg iwl7265d_2n_cfg = {
const struct iwl_cfg iwl7265d_n_cfg = {
const struct iwl_cfg iwl7265d_n_cfg = {
	.name = "Intel(R) Wireless N 7265",
	.name = "Intel(R) Wireless N 7265",
	.fw_name_pre = IWL7265D_FW_PRE,
	.fw_name_pre = IWL7265D_FW_PRE,
	IWL_DEVICE_7000,
	IWL_DEVICE_7005D,
	.ht_params = &iwl7265_ht_params,
	.ht_params = &iwl7265_ht_params,
	.nvm_ver = IWL7265D_NVM_VERSION,
	.nvm_ver = IWL7265D_NVM_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
	.nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -342,5 +363,5 @@ const struct iwl_cfg iwl7265d_n_cfg = {


MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7265_UCODE_API_OK));
MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7265D_UCODE_API_OK));
+9 −6
Original line number Original line Diff line number Diff line
@@ -1222,7 +1222,7 @@ static u8 iwl_mvm_get_key_sta_id(struct iwl_mvm *mvm,
	    mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
	    mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
		u8 sta_id = mvmvif->ap_sta_id;
		u8 sta_id = mvmvif->ap_sta_id;


		sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
		sta = rcu_dereference_check(mvm->fw_id_to_mac_id[sta_id],
					    lockdep_is_held(&mvm->mutex));
					    lockdep_is_held(&mvm->mutex));
		/*
		/*
		 * It is possible that the 'sta' parameter is NULL,
		 * It is possible that the 'sta' parameter is NULL,
@@ -1590,14 +1590,15 @@ void iwl_mvm_update_tkip_key(struct iwl_mvm *mvm,
			     u16 *phase1key)
			     u16 *phase1key)
{
{
	struct iwl_mvm_sta *mvm_sta;
	struct iwl_mvm_sta *mvm_sta;
	u8 sta_id = iwl_mvm_get_key_sta_id(mvm, vif, sta);
	u8 sta_id;
	bool mcast = !(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE);
	bool mcast = !(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE);


	if (WARN_ON_ONCE(sta_id == IWL_MVM_STATION_COUNT))
		return;

	rcu_read_lock();
	rcu_read_lock();


	sta_id = iwl_mvm_get_key_sta_id(mvm, vif, sta);
	if (WARN_ON_ONCE(sta_id == IWL_MVM_STATION_COUNT))
		goto unlock;

	if (!sta) {
	if (!sta) {
		sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
		sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
		if (WARN_ON(IS_ERR_OR_NULL(sta))) {
		if (WARN_ON(IS_ERR_OR_NULL(sta))) {
@@ -1609,6 +1610,8 @@ void iwl_mvm_update_tkip_key(struct iwl_mvm *mvm,
	mvm_sta = iwl_mvm_sta_from_mac80211(sta);
	mvm_sta = iwl_mvm_sta_from_mac80211(sta);
	iwl_mvm_send_sta_key(mvm, mvm_sta, keyconf, mcast,
	iwl_mvm_send_sta_key(mvm, mvm_sta, keyconf, mcast,
			     iv32, phase1key, CMD_ASYNC, keyconf->hw_key_idx);
			     iv32, phase1key, CMD_ASYNC, keyconf->hw_key_idx);

 unlock:
	rcu_read_unlock();
	rcu_read_unlock();
}
}