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

Commit da03f029 authored by Johannes Berg's avatar Johannes Berg Committed by Emmanuel Grumbach
Browse files

iwlwifi: mvm: support new TX power command



Add support for the new (bigger) TX power command. This doesn't
actually take advantage of the new capabilities (to set per-chain
TX power limits) but makes the code compatible with newer firmware
images expecting the larger command.

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent a7b3bc91
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -259,6 +259,8 @@ typedef unsigned int __bitwise__ iwl_ucode_tlv_api_t;
 * @IWL_UCODE_TLV_API_NEW_VERSION: new versioning format
 * @IWL_UCODE_TLV_API_NEW_VERSION: new versioning format
 * @IWL_UCODE_TLV_API_EXT_SCAN_PRIORITY: scan APIs use 8-level priority
 * @IWL_UCODE_TLV_API_EXT_SCAN_PRIORITY: scan APIs use 8-level priority
 *	instead of 3.
 *	instead of 3.
 * @IWL_UCODE_TLV_API_TX_POWER_CHAIN: TX power API has larger command size
 *	(command version 3) that supports per-chain limits
 */
 */
enum iwl_ucode_tlv_api {
enum iwl_ucode_tlv_api {
	IWL_UCODE_TLV_API_BT_COEX_SPLIT         = (__force iwl_ucode_tlv_api_t)3,
	IWL_UCODE_TLV_API_BT_COEX_SPLIT         = (__force iwl_ucode_tlv_api_t)3,
@@ -274,6 +276,7 @@ enum iwl_ucode_tlv_api {
	IWL_UCODE_TLV_API_STATS_V10		= (__force iwl_ucode_tlv_api_t)19,
	IWL_UCODE_TLV_API_STATS_V10		= (__force iwl_ucode_tlv_api_t)19,
	IWL_UCODE_TLV_API_NEW_VERSION		= (__force iwl_ucode_tlv_api_t)20,
	IWL_UCODE_TLV_API_NEW_VERSION		= (__force iwl_ucode_tlv_api_t)20,
	IWL_UCODE_TLV_API_EXT_SCAN_PRIORITY	= (__force iwl_ucode_tlv_api_t)24,
	IWL_UCODE_TLV_API_EXT_SCAN_PRIORITY	= (__force iwl_ucode_tlv_api_t)24,
	IWL_UCODE_TLV_API_TX_POWER_CHAIN	= (__force iwl_ucode_tlv_api_t)27,
};
};


typedef unsigned int __bitwise__ iwl_ucode_tlv_capa_t;
typedef unsigned int __bitwise__ iwl_ucode_tlv_capa_t;
+25 −4
Original line number Original line Diff line number Diff line
@@ -7,6 +7,7 @@
 *
 *
 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
 * Copyright(c) 2015 Intel Deutschland GmbH
 *
 *
 * This program is free software; you can redistribute it and/or modify
 * 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
 * it under the terms of version 2 of the GNU General Public License as
@@ -33,6 +34,7 @@
 *
 *
 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
 * Copyright(c) 2015 Intel Deutschland GmbH
 * All rights reserved.
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms, with or without
 * Redistribution and use in source and binary forms, with or without
@@ -310,17 +312,22 @@ struct iwl_reduce_tx_power_cmd {
	__le16 pwr_restriction;
	__le16 pwr_restriction;
} __packed; /* TX_REDUCED_POWER_API_S_VER_1 */
} __packed; /* TX_REDUCED_POWER_API_S_VER_1 */


enum iwl_dev_tx_power_cmd_mode {
	IWL_TX_POWER_MODE_SET_MAC = 0,
	IWL_TX_POWER_MODE_SET_DEVICE = 1,
	IWL_TX_POWER_MODE_SET_CHAINS = 2,
}; /* TX_POWER_REDUCED_FLAGS_TYPE_API_E_VER_2 */;

/**
/**
 * struct iwl_dev_tx_power_cmd - TX power reduction command
 * struct iwl_dev_tx_power_cmd_v2 - TX power reduction command
 * REDUCE_TX_POWER_CMD = 0x9f
 * @set_mode: see &enum iwl_dev_tx_power_cmd_mode
 * @set_mode: 0 - MAC tx power, 1 - device tx power
 * @mac_context_id: id of the mac ctx for which we are reducing TX power.
 * @mac_context_id: id of the mac ctx for which we are reducing TX power.
 * @pwr_restriction: TX power restriction in 1/8 dBms.
 * @pwr_restriction: TX power restriction in 1/8 dBms.
 * @dev_24: device TX power restriction in 1/8 dBms
 * @dev_24: device TX power restriction in 1/8 dBms
 * @dev_52_low: device TX power restriction upper band - low
 * @dev_52_low: device TX power restriction upper band - low
 * @dev_52_high: device TX power restriction upper band - high
 * @dev_52_high: device TX power restriction upper band - high
 */
 */
struct iwl_dev_tx_power_cmd {
struct iwl_dev_tx_power_cmd_v2 {
	__le32 set_mode;
	__le32 set_mode;
	__le32 mac_context_id;
	__le32 mac_context_id;
	__le16 pwr_restriction;
	__le16 pwr_restriction;
@@ -329,6 +336,20 @@ struct iwl_dev_tx_power_cmd {
	__le16 dev_52_high;
	__le16 dev_52_high;
} __packed; /* TX_REDUCED_POWER_API_S_VER_2 */
} __packed; /* TX_REDUCED_POWER_API_S_VER_2 */


#define IWL_NUM_CHAIN_LIMITS	2
#define IWL_NUM_SUB_BANDS	5

/**
 * struct iwl_dev_tx_power_cmd - TX power reduction command
 * @v2: version 2 of the command, embedded here for easier software handling
 * @per_chain_restriction: per chain restrictions
 */
struct iwl_dev_tx_power_cmd {
	/* v3 is just an extension of v2 - keep this here */
	struct iwl_dev_tx_power_cmd_v2 v2;
	__le16 per_chain_restriction[IWL_NUM_CHAIN_LIMITS][IWL_NUM_SUB_BANDS];
} __packed; /* TX_REDUCED_POWER_API_S_VER_3 */

#define IWL_DEV_MAX_TX_POWER 0x7FFF
#define IWL_DEV_MAX_TX_POWER 0x7FFF


/**
/**
+9 −6
Original line number Original line Diff line number Diff line
@@ -1595,20 +1595,23 @@ static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
				s16 tx_power)
				s16 tx_power)
{
{
	struct iwl_dev_tx_power_cmd cmd = {
	struct iwl_dev_tx_power_cmd cmd = {
		.set_mode = 0,
		.v2.set_mode = cpu_to_le32(IWL_TX_POWER_MODE_SET_MAC),
		.mac_context_id =
		.v2.mac_context_id =
			cpu_to_le32(iwl_mvm_vif_from_mac80211(vif)->id),
			cpu_to_le32(iwl_mvm_vif_from_mac80211(vif)->id),
		.pwr_restriction = cpu_to_le16(8 * tx_power),
		.v2.pwr_restriction = cpu_to_le16(8 * tx_power),
	};
	};
	int len = sizeof(cmd);


	if (!fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_TX_POWER_DEV))
	if (!fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_TX_POWER_DEV))
		return iwl_mvm_set_tx_power_old(mvm, vif, tx_power);
		return iwl_mvm_set_tx_power_old(mvm, vif, tx_power);


	if (tx_power == IWL_DEFAULT_MAX_TX_POWER)
	if (tx_power == IWL_DEFAULT_MAX_TX_POWER)
		cmd.pwr_restriction = cpu_to_le16(IWL_DEV_MAX_TX_POWER);
		cmd.v2.pwr_restriction = cpu_to_le16(IWL_DEV_MAX_TX_POWER);


	return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0,
	if (!fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_TX_POWER_CHAIN))
				    sizeof(cmd), &cmd);
		len = sizeof(cmd.v2);

	return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0, len, &cmd);
}
}


static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,