aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>2014-07-01 05:54:25 -0400
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-09-16 05:57:50 -0400
commitf1daa00e36c97e24b4d9a210397349212422ed85 (patch)
tree5a5201c381a69628ab406d6a09b46876057d7415
parentb71d9c8a9d7284a5cc6c93e01bf258323f0d334a (diff)
iwlwifi: mvm: Update TX power in TPC reports
Introduce new tx command flag (TX_CMD_FLG_WRITE_TX_POWER) which requests the fw to update the tx power value at some constant offset. Set this flag when transmitting either TPC report or Link measurement report action frames. In addition, introduce new tlv which indicates whether the fw supports power insertion (IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT) and publish the corresponding nl80211 feature. Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fw.h4
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c4
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/tx.c5
4 files changed, 15 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw.h b/drivers/net/wireless/iwlwifi/iwl-fw.h
index 62c46eb8b99c..6ab40bce0394 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fw.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fw.h
@@ -145,9 +145,13 @@ enum iwl_ucode_tlv_api {
145/** 145/**
146 * enum iwl_ucode_tlv_capa - ucode capabilities 146 * enum iwl_ucode_tlv_capa - ucode capabilities
147 * @IWL_UCODE_TLV_CAPA_D0I3_SUPPORT: supports D0i3 147 * @IWL_UCODE_TLV_CAPA_D0I3_SUPPORT: supports D0i3
148 * @IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT: supports insertion of current
149 * tx power value into TPC Report action frame and Link Measurement Report
150 * action frame
148 */ 151 */
149enum iwl_ucode_tlv_capa { 152enum iwl_ucode_tlv_capa {
150 IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = BIT(0), 153 IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = BIT(0),
154 IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT = BIT(8),
151}; 155};
152 156
153/* The default calibrate table size if not specified by firmware file */ 157/* The default calibrate table size if not specified by firmware file */
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h
index d6073f67b212..5bca1f8bfebf 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h
@@ -66,6 +66,7 @@
66/** 66/**
67 * enum iwl_tx_flags - bitmasks for tx_flags in TX command 67 * enum iwl_tx_flags - bitmasks for tx_flags in TX command
68 * @TX_CMD_FLG_PROT_REQUIRE: use RTS or CTS-to-self to protect the frame 68 * @TX_CMD_FLG_PROT_REQUIRE: use RTS or CTS-to-self to protect the frame
69 * @TX_CMD_FLG_WRITE_TX_POWER: update current tx power value in the mgmt frame
69 * @TX_CMD_FLG_ACK: expect ACK from receiving station 70 * @TX_CMD_FLG_ACK: expect ACK from receiving station
70 * @TX_CMD_FLG_STA_RATE: use RS table with initial index from the TX command. 71 * @TX_CMD_FLG_STA_RATE: use RS table with initial index from the TX command.
71 * Otherwise, use rate_n_flags from the TX command 72 * Otherwise, use rate_n_flags from the TX command
@@ -97,6 +98,7 @@
97 */ 98 */
98enum iwl_tx_flags { 99enum iwl_tx_flags {
99 TX_CMD_FLG_PROT_REQUIRE = BIT(0), 100 TX_CMD_FLG_PROT_REQUIRE = BIT(0),
101 TX_CMD_FLG_WRITE_TX_POWER = BIT(1),
100 TX_CMD_FLG_ACK = BIT(3), 102 TX_CMD_FLG_ACK = BIT(3),
101 TX_CMD_FLG_STA_RATE = BIT(4), 103 TX_CMD_FLG_STA_RATE = BIT(4),
102 TX_CMD_FLG_BAR = BIT(6), 104 TX_CMD_FLG_BAR = BIT(6),
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 5f5a89399879..ba029f621391 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -412,6 +412,10 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
412 NL80211_FEATURE_DYNAMIC_SMPS | 412 NL80211_FEATURE_DYNAMIC_SMPS |
413 NL80211_FEATURE_STATIC_SMPS; 413 NL80211_FEATURE_STATIC_SMPS;
414 414
415 if (mvm->fw->ucode_capa.capa[0] &
416 IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT)
417 hw->wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
418
415 mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD; 419 mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
416 420
417 /* currently FW API supports only one optional cipher scheme */ 421 /* currently FW API supports only one optional cipher scheme */
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c
index c67296efa04d..d84f3ca75f63 100644
--- a/drivers/net/wireless/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/tx.c
@@ -133,6 +133,11 @@ static void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
133 !is_multicast_ether_addr(ieee80211_get_DA(hdr))) 133 !is_multicast_ether_addr(ieee80211_get_DA(hdr)))
134 tx_flags |= TX_CMD_FLG_PROT_REQUIRE; 134 tx_flags |= TX_CMD_FLG_PROT_REQUIRE;
135 135
136 if ((mvm->fw->ucode_capa.capa[0] &
137 IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT) &&
138 ieee80211_action_contains_tpc(skb))
139 tx_flags |= TX_CMD_FLG_WRITE_TX_POWER;
140
136 tx_cmd->tx_flags = cpu_to_le32(tx_flags); 141 tx_cmd->tx_flags = cpu_to_le32(tx_flags);
137 /* Total # bytes to be transmitted */ 142 /* Total # bytes to be transmitted */
138 tx_cmd->len = cpu_to_le16((u16)skb->len); 143 tx_cmd->len = cpu_to_le16((u16)skb->len);