/**
  * enum iwl_ucode_tlv_capa - ucode capabilities
  * @IWL_UCODE_TLV_CAPA_D0I3_SUPPORT: supports D0i3
+ * @IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT: supports insertion of current
+ *     tx power value into TPC Report action frame and Link Measurement Report
+ *     action frame
  */
 enum iwl_ucode_tlv_capa {
        IWL_UCODE_TLV_CAPA_D0I3_SUPPORT         = BIT(0),
+       IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT = BIT(8),
 };
 
 /* The default calibrate table size if not specified by firmware file */
 
 /**
  * enum iwl_tx_flags - bitmasks for tx_flags in TX command
  * @TX_CMD_FLG_PROT_REQUIRE: use RTS or CTS-to-self to protect the frame
+ * @TX_CMD_FLG_WRITE_TX_POWER: update current tx power value in the mgmt frame
  * @TX_CMD_FLG_ACK: expect ACK from receiving station
  * @TX_CMD_FLG_STA_RATE: use RS table with initial index from the TX command.
  *     Otherwise, use rate_n_flags from the TX command
  */
 enum iwl_tx_flags {
        TX_CMD_FLG_PROT_REQUIRE         = BIT(0),
+       TX_CMD_FLG_WRITE_TX_POWER       = BIT(1),
        TX_CMD_FLG_ACK                  = BIT(3),
        TX_CMD_FLG_STA_RATE             = BIT(4),
        TX_CMD_FLG_BAR                  = BIT(6),
 
                               NL80211_FEATURE_DYNAMIC_SMPS |
                               NL80211_FEATURE_STATIC_SMPS;
 
+       if (mvm->fw->ucode_capa.capa[0] &
+           IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT)
+               hw->wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
+
        mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
 
        /* currently FW API supports only one optional cipher scheme */
 
            !is_multicast_ether_addr(ieee80211_get_DA(hdr)))
                tx_flags |= TX_CMD_FLG_PROT_REQUIRE;
 
+       if ((mvm->fw->ucode_capa.capa[0] &
+            IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT) &&
+           ieee80211_action_contains_tpc(skb))
+               tx_flags |= TX_CMD_FLG_WRITE_TX_POWER;
+
        tx_cmd->tx_flags = cpu_to_le32(tx_flags);
        /* Total # bytes to be transmitted */
        tx_cmd->len = cpu_to_le16((u16)skb->len);