aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm
diff options
context:
space:
mode:
authorAvri Altman <avri.altman@intel.com>2015-04-18 15:16:42 -0400
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-04-19 10:06:20 -0400
commitd44c3fe68cc7e435ebc06d5b6ac260a5c1b495f8 (patch)
tree1cb577c9dffb5bd409ed1eb496b0ff8dfafde519 /drivers/net/wireless/iwlwifi/mvm
parent6c373ca89399c5a3f7ef210ad8f63dc3437da345 (diff)
iwlwifi: mvm: fix Tx Power firmware API
The firmware doesn't relate the scan to a vif. The scan is run by a separate entity called auxiliary MAC (aka AUX MAC). This AUX MAC needs to get Tx power limitations that are not applied on a specific vif, but on the device as a whole. This can be implemented by using the minimum of all the values set by the user for all the MACs. But then we need to ignore the limitations that come from the AP or regulatory for a specific vif: a specific vif might have regulatory limitations because of the channel is works on. This limit is irrelevant for the AUX MAC. Use the new API from mac80211: the user_power_level in bss_conf to achieve this. Firmware -13.ucode has already moved to this API. Change-Id: Ifba83660f378e91b93bd46d29fe8ba35a7c168a4 Signed-off-by: Avri Altman <avri.altman@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-power.h34
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api.h13
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c24
3 files changed, 56 insertions, 15 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
index 4fc0938b3fb6..b1baa33cc19b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
@@ -298,6 +298,40 @@ struct iwl_uapsd_misbehaving_ap_notif {
298} __packed; 298} __packed;
299 299
300/** 300/**
301 * struct iwl_reduce_tx_power_cmd - TX power reduction command
302 * REDUCE_TX_POWER_CMD = 0x9f
303 * @flags: (reserved for future implementation)
304 * @mac_context_id: id of the mac ctx for which we are reducing TX power.
305 * @pwr_restriction: TX power restriction in dBms.
306 */
307struct iwl_reduce_tx_power_cmd {
308 u8 flags;
309 u8 mac_context_id;
310 __le16 pwr_restriction;
311} __packed; /* TX_REDUCED_POWER_API_S_VER_1 */
312
313/**
314 * struct iwl_dev_tx_power_cmd - TX power reduction command
315 * REDUCE_TX_POWER_CMD = 0x9f
316 * @set_mode: 0 - MAC tx power, 1 - device tx power
317 * @mac_context_id: id of the mac ctx for which we are reducing TX power.
318 * @pwr_restriction: TX power restriction in 1/8 dBms.
319 * @dev_24: device TX power restriction in 1/8 dBms
320 * @dev_52_low: device TX power restriction upper band - low
321 * @dev_52_high: device TX power restriction upper band - high
322 */
323struct iwl_dev_tx_power_cmd {
324 __le32 set_mode;
325 __le32 mac_context_id;
326 __le16 pwr_restriction;
327 __le16 dev_24;
328 __le16 dev_52_low;
329 __le16 dev_52_high;
330} __packed; /* TX_REDUCED_POWER_API_S_VER_2 */
331
332#define IWL_DEV_MAX_TX_POWER 0x7FFF
333
334/**
301 * struct iwl_beacon_filter_cmd 335 * struct iwl_beacon_filter_cmd
302 * REPLY_BEACON_FILTERING_CMD = 0xd2 (command) 336 * REPLY_BEACON_FILTERING_CMD = 0xd2 (command)
303 * @id_and_color: MAC contex identifier 337 * @id_and_color: MAC contex identifier
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api.h b/drivers/net/wireless/iwlwifi/mvm/fw-api.h
index aab68cbae754..01b1da6ad359 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api.h
@@ -281,19 +281,6 @@ struct iwl_tx_ant_cfg_cmd {
281 __le32 valid; 281 __le32 valid;
282} __packed; 282} __packed;
283 283
284/**
285 * struct iwl_reduce_tx_power_cmd - TX power reduction command
286 * REDUCE_TX_POWER_CMD = 0x9f
287 * @flags: (reserved for future implementation)
288 * @mac_context_id: id of the mac ctx for which we are reducing TX power.
289 * @pwr_restriction: TX power restriction in dBms.
290 */
291struct iwl_reduce_tx_power_cmd {
292 u8 flags;
293 u8 mac_context_id;
294 __le16 pwr_restriction;
295} __packed; /* TX_REDUCED_POWER_API_S_VER_1 */
296
297/* 284/*
298 * Calibration control struct. 285 * Calibration control struct.
299 * Sent as part of the phy configuration command. 286 * Sent as part of the phy configuration command.
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 84555170b6f7..7c2d5ace0eb3 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -1471,8 +1471,8 @@ static struct iwl_mvm_phy_ctxt *iwl_mvm_get_free_phy_ctxt(struct iwl_mvm *mvm)
1471 return NULL; 1471 return NULL;
1472} 1472}
1473 1473
1474static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 1474static int iwl_mvm_set_tx_power_old(struct iwl_mvm *mvm,
1475 s8 tx_power) 1475 struct ieee80211_vif *vif, s8 tx_power)
1476{ 1476{
1477 /* FW is in charge of regulatory enforcement */ 1477 /* FW is in charge of regulatory enforcement */
1478 struct iwl_reduce_tx_power_cmd reduce_txpwr_cmd = { 1478 struct iwl_reduce_tx_power_cmd reduce_txpwr_cmd = {
@@ -1485,6 +1485,26 @@ static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1485 &reduce_txpwr_cmd); 1485 &reduce_txpwr_cmd);
1486} 1486}
1487 1487
1488static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1489 s16 tx_power)
1490{
1491 struct iwl_dev_tx_power_cmd cmd = {
1492 .set_mode = 0,
1493 .mac_context_id =
1494 cpu_to_le32(iwl_mvm_vif_from_mac80211(vif)->id),
1495 .pwr_restriction = cpu_to_le16(8 * tx_power),
1496 };
1497
1498 if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_TX_POWER_DEV))
1499 return iwl_mvm_set_tx_power_old(mvm, vif, tx_power);
1500
1501 if (tx_power == IWL_DEFAULT_MAX_TX_POWER)
1502 cmd.pwr_restriction = cpu_to_le16(IWL_DEV_MAX_TX_POWER);
1503
1504 return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0,
1505 sizeof(cmd), &cmd);
1506}
1507
1488static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw, 1508static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
1489 struct ieee80211_vif *vif) 1509 struct ieee80211_vif *vif)
1490{ 1510{