@@ -89,6 +89,8 @@
[HTT_TLV_T2H_MSG_TYPE_RX_OFLD_PKT_ERR] =
HTT_T2H_MSG_TYPE_RX_OFLD_PKT_ERR,
[HTT_TLV_T2H_MSG_TYPE_TEST] = HTT_T2H_MSG_TYPE_TEST,
+ [HTT_TLV_T2H_MSG_TYPE_PEER_STATS] =
+ HTT_T2H_MSG_TYPE_PEER_STATS,
};
static const enum htt_t2h_msg_type htt_10_4_t2h_msg_types[] = {
@@ -449,6 +449,12 @@ enum htt_tlv_t2h_msg_type {
HTT_TLV_T2H_MSG_TYPE_WDI_IPA_OP_RESPONSE = 0x14,
HTT_TLV_T2H_MSG_TYPE_CHAN_CHANGE = 0x15,
HTT_TLV_T2H_MSG_TYPE_RX_OFLD_PKT_ERR = 0x16,
+ HTT_TLV_T2H_MSG_TYPE_PEER_MAP_V2 = 0x1e,
+ HTT_TLV_T2H_MSG_TYPE_PEER_UNMAP_V2 = 0x1f,
+ HTT_TLV_T2H_MSG_TYPE_MONITOR_MAC_HEADER_IND = 0x20,
+ HTT_TLV_T2H_MSG_TYPE_FLOW_POOL_RESIZE = 0x21,
+ HTT_TLV_T2H_MSG_TYPE_CFR_DUMP_COMPL_IND = 0x22,
+ HTT_TLV_T2H_MSG_TYPE_PEER_STATS = 0x23,
HTT_TLV_T2H_MSG_TYPE_TEST,
/* keep this last */
HTT_TLV_T2H_NUM_MSGS
@@ -1604,6 +1610,63 @@ struct htt_channel_change {
__le32 phymode;
} __packed;
+#define HTT_TAG_ADDR_MASK GENMASK(11, 0)
+#define HTT_LEN_ADDR_MASK GENMASK(23, 12)
+#define HTT_LEN_ADDR_LSB 12
+
+struct htt_tlv_msg {
+ /* BIT [11 : 0] :- tag
+ * BIT [23 : 12] :- length
+ * BIT [31 : 24] :- reserved
+ */
+ __le32 tag_length;
+ u8 payload[0];
+};
+
+struct htt_tlv {
+ __le16 reserved1;
+ u8 reserved2;
+ u8 payload[0];
+};
+
+#define HTT_TX_STATS_IS_AMPDU_MASK GENMASK(0, 0)
+#define HTT_TX_STATS_BA_ACK_FAILED_MASK GENMASK(2, 1)
+#define HTT_TX_STATS_BW_MASK GENMASK(5, 3)
+#define HTT_TX_STATS_GI_MASK GENMASK(6, 6)
+#define HTT_TX_STATS_SKIPPED_RATE_CTRL_MASK GENMASK(7, 7)
+
+enum htt_tx_stats_valid_bitmap {
+ HTT_TX_STATS_VALID,
+ HTT_TX_STATS_SUCCESS_BYTES,
+ HTT_TX_STATS_RETRY_BYTES,
+ HTT_TX_STATS_FAILED_BYTES,
+ HTT_TX_STATS_RATECODE,
+ HTT_TX_STATS_IS_AMPDU,
+ HTT_TX_STATS_BA_ACK_FAILED,
+ HTT_TX_STATS_BW,
+ HTT_TX_STATS_GI,
+ HTT_TX_STATS_SKIPPED_RATE_CTRL,
+ HTT_TX_STATS_PEER_ID,
+ HTT_TX_STATS_SUCCESS_PKTS,
+ HTT_TX_STATS_RETRY_PKTS,
+ HTT_TX_STATS_FAILED_PKTS,
+ HTT_TX_STATS_TX_DURATION,
+};
+
+struct htt_tlv_per_peer_tx_stats_ind {
+ __le32 succ_bytes;
+ __le32 retry_bytes;
+ __le32 failed_bytes;
+ u8 ratecode;
+ u8 flags;
+ __le16 peer_id;
+ __le16 succ_pkts;
+ __le16 retry_pkts;
+ __le16 failed_pkts;
+ __le16 tx_duration;
+ __le32 valid_bitmap;
+} __packed;
+
struct htt_per_peer_tx_stats_ind {
__le32 succ_bytes;
__le32 retry_bytes;
@@ -1699,6 +1762,7 @@ struct htt_resp {
struct htt_tx_mode_switch_ind tx_mode_switch_ind;
struct htt_channel_change chan_change;
struct htt_peer_tx_stats peer_tx_stats;
+ struct htt_tlv tlv;
};
} __packed;
@@ -3039,11 +3039,12 @@ static inline s8 ath10k_get_legacy_rate_idx(struct ath10k *ar, u8 rate)
lockdep_assert_held(&ar->data_lock);
txrate.flags = ATH10K_HW_PREAMBLE(peer_stats->ratecode);
- txrate.bw = ATH10K_HW_BW(peer_stats->flags);
+ txrate.bw = ath10k_get_bw(&ar->hw_params, peer_stats->flags);
txrate.nss = ATH10K_HW_NSS(peer_stats->ratecode);
txrate.mcs = ATH10K_HW_MCS_RATE(peer_stats->ratecode);
- sgi = ATH10K_HW_GI(peer_stats->flags);
- skip_auto_rate = ATH10K_FW_SKIPPED_RATE_CTRL(peer_stats->flags);
+ sgi = ath10k_get_gi(&ar->hw_params, peer_stats->flags);
+ skip_auto_rate = ath10k_get_skipped_rate_ctrl(&ar->hw_params,
+ peer_stats->flags);
/* Firmware's rate control skips broadcast/management frames,
* if host has configure fixed rates and in some other special cases.
@@ -3146,6 +3147,133 @@ static inline s8 ath10k_get_legacy_rate_idx(struct ath10k *ar, u8 rate)
static void ath10k_htt_fetch_peer_stats_tlv(struct ath10k *ar,
struct sk_buff *skb)
{
+ struct ath10k_per_peer_tx_stats *p_tx_stats = &ar->peer_tx_stats;
+ struct htt_resp *resp = (struct htt_resp *)skb->data;
+ struct htt_tlv_per_peer_tx_stats_ind *tx_stats;
+ const struct htt_tlv_msg *tlv;
+ unsigned long valid_bitmap;
+ struct ieee80211_sta *sta;
+ struct ath10k_sta *arsta;
+ struct ath10k_peer *peer;
+ u16 tlv_tag, tlv_len;
+ void *begin, *ptr;
+ int peer_id, len;
+
+ begin = resp->tlv.payload;
+ ptr = begin;
+ len = skb->len - sizeof(struct htt_tlv);
+
+ while (len > 0) {
+ if (len < sizeof(*tlv)) {
+ ath10k_dbg(ar, ATH10K_DBG_HTT,
+ "HTT tlv parse failure at byte %zd (%d bytes left, %zu expected)\n",
+ ptr - begin, len, sizeof(*tlv));
+ return;
+ }
+
+ tlv = (struct htt_tlv_msg *)ptr;
+ tlv_tag = HTT_TAG_ADDR_MASK & __le32_to_cpu(tlv->tag_length);
+ tlv_len = MS(__le32_to_cpu(tlv->tag_length), HTT_LEN_ADDR);
+ ptr += sizeof(*tlv);
+ len -= sizeof(*tlv);
+
+ if (tlv_len > len) {
+ ath10k_dbg(ar, ATH10K_DBG_HTT,
+ "HTT tlv parse failure of tag %hu at byte %zd (%d bytes left, %hu expected)\n",
+ tlv_tag, ptr - begin, len, tlv_len);
+ return;
+ }
+
+ tx_stats = (struct htt_tlv_per_peer_tx_stats_ind *)ptr;
+ valid_bitmap = __le32_to_cpu(tx_stats->valid_bitmap);
+
+ if (test_bit(HTT_TX_STATS_VALID, &valid_bitmap)) {
+ if (test_bit(HTT_TX_STATS_PEER_ID, &valid_bitmap)) {
+ peer_id = __le16_to_cpu(tx_stats->peer_id);
+ } else {
+ ath10k_dbg(ar, ATH10K_DBG_HTT, "Peer id is not received, ignoring\n");
+ goto next;
+ }
+
+ rcu_read_lock();
+ spin_lock_bh(&ar->data_lock);
+ peer = ath10k_peer_find_by_id(ar, peer_id);
+ if (!peer) {
+ ath10k_warn(ar, "Invalid peer id %d peer stats buffer\n",
+ peer_id);
+ spin_unlock_bh(&ar->data_lock);
+ rcu_read_unlock();
+ return;
+ }
+
+ sta = peer->sta;
+ arsta = (struct ath10k_sta *)sta->drv_priv;
+ p_tx_stats->flags = 0;
+
+ if (test_bit(HTT_TX_STATS_SUCCESS_BYTES, &valid_bitmap))
+ p_tx_stats->succ_bytes =
+ __le32_to_cpu(tx_stats->succ_bytes);
+
+ if (test_bit(HTT_TX_STATS_RETRY_BYTES, &valid_bitmap))
+ p_tx_stats->retry_bytes =
+ __le32_to_cpu(tx_stats->retry_bytes);
+
+ if (test_bit(HTT_TX_STATS_FAILED_BYTES, &valid_bitmap))
+ p_tx_stats->failed_bytes =
+ __le32_to_cpu(tx_stats->failed_bytes);
+
+ if (test_bit(HTT_TX_STATS_RATECODE, &valid_bitmap))
+ p_tx_stats->ratecode = tx_stats->ratecode;
+
+ if (test_bit(HTT_TX_STATS_IS_AMPDU, &valid_bitmap))
+ p_tx_stats->flags |= tx_stats->flags &
+ HTT_TX_STATS_IS_AMPDU_MASK;
+
+ if (test_bit(HTT_TX_STATS_BA_ACK_FAILED, &valid_bitmap))
+ p_tx_stats->flags |= tx_stats->flags &
+ HTT_TX_STATS_BA_ACK_FAILED_MASK;
+
+ if (test_bit(HTT_TX_STATS_BW, &valid_bitmap))
+ p_tx_stats->flags |= tx_stats->flags &
+ HTT_TX_STATS_BW_MASK;
+
+ if (test_bit(HTT_TX_STATS_GI, &valid_bitmap))
+ p_tx_stats->flags |= tx_stats->flags &
+ HTT_TX_STATS_GI_MASK;
+
+ if (test_bit(HTT_TX_STATS_SKIPPED_RATE_CTRL,
+ &valid_bitmap))
+ p_tx_stats->flags |= tx_stats->flags &
+ HTT_TX_STATS_SKIPPED_RATE_CTRL_MASK;
+
+ if (test_bit(HTT_TX_STATS_SUCCESS_PKTS, &valid_bitmap))
+ p_tx_stats->succ_pkts =
+ __le16_to_cpu(tx_stats->succ_pkts);
+
+ if (test_bit(HTT_TX_STATS_RETRY_PKTS, &valid_bitmap))
+ p_tx_stats->retry_pkts =
+ __le16_to_cpu(tx_stats->retry_pkts);
+
+ if (test_bit(HTT_TX_STATS_FAILED_PKTS, &valid_bitmap))
+ p_tx_stats->failed_pkts =
+ __le16_to_cpu(tx_stats->failed_pkts);
+
+ if (test_bit(HTT_TX_STATS_TX_DURATION, &valid_bitmap))
+ p_tx_stats->duration =
+ __le16_to_cpu(tx_stats->tx_duration);
+
+ ath10k_update_per_peer_tx_stats(ar, sta, p_tx_stats);
+
+ spin_unlock_bh(&ar->data_lock);
+ rcu_read_unlock();
+ } else {
+ ath10k_dbg(ar, ATH10K_DBG_HTT, "received invalid bitmap 0x%lx for tag %hu at byte %zd\n",
+ valid_bitmap, tlv_tag, ptr - begin);
+ }
+next:
+ ptr += tlv_len;
+ len -= tlv_len;
+ }
}
static void ath10k_htt_fetch_peer_stats(struct ath10k *ar,
@@ -3438,7 +3566,7 @@ bool ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
ath10k_htt_rx_tx_mode_switch_ind(ar, skb);
break;
case HTT_T2H_MSG_TYPE_PEER_STATS:
- ath10k_htt_fetch_peer_stats(ar, skb);
+ htt->rx_ops->htt_fetch_peer_stats(ar, skb);
break;
case HTT_T2H_MSG_TYPE_EN_STATS:
default:
@@ -1100,8 +1100,26 @@ int ath10k_hw_diag_fast_download(struct ath10k *ar,
return ret;
}
+static int ath10k_hw_bw(u8 flags)
+{
+ return FIELD_GET(ATH10K_HW_BW_MASK, flags);
+}
+
+static int ath10k_hw_gi(u8 flags)
+{
+ return FIELD_GET(ATH10K_HW_GI_MASK, flags);
+}
+
+static int ath10k_hw_skipped_rate_ctrl(u8 flags)
+{
+ return FIELD_GET(ATH10K_HW_SKIPPED_RATE_CTRL_MASK, flags);
+}
+
const struct ath10k_hw_ops qca988x_ops = {
.set_coverage_class = ath10k_hw_qca988x_set_coverage_class,
+ .get_bw = ath10k_hw_bw,
+ .get_gi = ath10k_hw_gi,
+ .get_skipped_rate_ctrl = ath10k_hw_skipped_rate_ctrl,
};
static int ath10k_qca99x0_rx_desc_get_l3_pad_bytes(struct htt_rx_desc *rxd)
@@ -1119,11 +1137,36 @@ static bool ath10k_qca99x0_rx_desc_msdu_limit_error(struct htt_rx_desc *rxd)
const struct ath10k_hw_ops qca99x0_ops = {
.rx_desc_get_l3_pad_bytes = ath10k_qca99x0_rx_desc_get_l3_pad_bytes,
.rx_desc_get_msdu_limit_error = ath10k_qca99x0_rx_desc_msdu_limit_error,
+ .get_bw = ath10k_hw_bw,
+ .get_gi = ath10k_hw_gi,
+ .get_skipped_rate_ctrl = ath10k_hw_skipped_rate_ctrl,
};
const struct ath10k_hw_ops qca6174_ops = {
.set_coverage_class = ath10k_hw_qca988x_set_coverage_class,
.enable_pll_clk = ath10k_hw_qca6174_enable_pll_clock,
+ .get_bw = ath10k_hw_bw,
+ .get_gi = ath10k_hw_gi,
+ .get_skipped_rate_ctrl = ath10k_hw_skipped_rate_ctrl,
};
-const struct ath10k_hw_ops wcn3990_ops = {};
+static int ath10k_hw_wcn3990_bw(u8 flags)
+{
+ return FIELD_GET(ATH10K_HW_WCN3990_BW_BIT_MASK, flags);
+}
+
+static int ath10k_hw_wcn3990_gi(u8 flags)
+{
+ return FIELD_GET(ATH10K_HW_WCN3990_GI_MASK, flags);
+}
+
+static int ath10k_hw_wcn3990_skipped_rate_ctrl(u8 flags)
+{
+ return FIELD_GET(ATH10K_HW_WCN3990_SKIPPED_RATE_CTRL_MASK, flags);
+}
+
+const struct ath10k_hw_ops wcn3990_ops = {
+ .get_bw = ath10k_hw_wcn3990_bw,
+ .get_gi = ath10k_hw_wcn3990_gi,
+ .get_skipped_rate_ctrl = ath10k_hw_wcn3990_skipped_rate_ctrl,
+};
@@ -159,6 +159,13 @@ enum qca9377_chip_id_rev {
#define REG_DUMP_COUNT_QCA988X 60
+#define ATH10K_HW_BW_MASK GENMASK(4, 3)
+#define ATH10K_HW_GI_MASK GENMASK(5, 5)
+#define ATH10K_HW_SKIPPED_RATE_CTRL_MASK GENMASK(6, 6)
+#define ATH10K_HW_WCN3990_BW_BIT_MASK GENMASK(5, 3)
+#define ATH10K_HW_WCN3990_GI_MASK GENMASK(6, 6)
+#define ATH10K_HW_WCN3990_SKIPPED_RATE_CTRL_MASK GENMASK(7, 7)
+
struct ath10k_fw_ie {
__le32 id;
__le32 len;
@@ -616,6 +623,9 @@ struct ath10k_hw_ops {
void (*set_coverage_class)(struct ath10k *ar, s16 value);
int (*enable_pll_clk)(struct ath10k *ar);
bool (*rx_desc_get_msdu_limit_error)(struct htt_rx_desc *rxd);
+ int (*get_bw)(u8 flags);
+ int (*get_gi)(u8 flags);
+ int (*get_skipped_rate_ctrl)(u8 flags);
};
extern const struct ath10k_hw_ops qca988x_ops;
@@ -643,6 +653,30 @@ struct ath10k_hw_ops {
return false;
}
+static inline int
+ath10k_get_bw(struct ath10k_hw_params *hw, u8 flags)
+{
+ if (hw->hw_ops->get_bw)
+ return hw->hw_ops->get_bw(flags);
+ return 0;
+}
+
+static inline int
+ath10k_get_gi(struct ath10k_hw_params *hw, u8 flags)
+{
+ if (hw->hw_ops->get_gi)
+ return hw->hw_ops->get_gi(flags);
+ return 0;
+}
+
+static inline int
+ath10k_get_skipped_rate_ctrl(struct ath10k_hw_params *hw, u8 flags)
+{
+ if (hw->hw_ops->get_skipped_rate_ctrl)
+ return hw->hw_ops->get_skipped_rate_ctrl(flags);
+ return 0;
+}
+
/* Target specific defines for MAIN firmware */
#define TARGET_NUM_VDEVS 8
#define TARGET_NUM_PEER_AST 2
@@ -1706,6 +1706,9 @@ static struct sk_buff *ath10k_wmi_tlv_op_gen_init(struct ath10k *ar)
cfg->num_ocb_schedules = __cpu_to_le32(0);
cfg->host_capab = __cpu_to_le32(WMI_TLV_FLAG_MGMT_BUNDLE_TX_COMPL);
+ if (ath10k_peer_stats_enabled(ar))
+ cfg->host_capab |= __cpu_to_le32(WMI_RSRC_CFG_FLAG_TX_PEER_STATS);
+
ath10k_wmi_put_host_mem_chunks(ar, chunks);
ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv init\n");
@@ -13,6 +13,7 @@
#define WMI_TLV_PDEV_PARAM_UNSUPPORTED 0
#define WMI_TLV_VDEV_PARAM_UNSUPPORTED 0
#define WMI_TLV_MGMT_TX_FRAME_MAX_LEN 64
+#define WMI_RSRC_CFG_FLAG_TX_PEER_STATS BIT(21)
enum wmi_tlv_grp_id {
WMI_TLV_GRP_START = 0x3,
@@ -1384,6 +1385,36 @@ enum wmi_tlv_service {
WMI_TLV_SERVICE_AP_TWT = 153,
WMI_TLV_SERVICE_GMAC_OFFLOAD_SUPPORT = 154,
WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT = 155,
+ WMI_TLV_SERVICE_PEER_TID_CONFIGS_SUPPORT = 156,
+ WMI_TLV_SERVICE_VDEV_SWRETRY_PER_AC_CONFIG_SUPPORT = 157,
+ WMI_TLV_SERVICE_DUAL_BEACON_ON_SINGLE_MAC_SCC_SUPPORT = 158,
+ WMI_TLV_SERVICE_DUAL_BEACON_ON_SINGLE_MAC_MCC_SUPPORT = 159,
+ WMI_TLV_SERVICE_MOTION_DET = 160,
+ WMI_TLV_SERVICE_INFRA_MBSSID = 161,
+ WMI_TLV_SERVICE_OBSS_SPATIAL_REUSE = 162,
+ WMI_TLV_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT = 163,
+ WMI_TLV_SERVICE_NAN_DBS_SUPPORT = 164,
+ WMI_TLV_SERVICE_NDI_DBS_SUPPORT = 165,
+ WMI_TLV_SERVICE_NAN_SAP_SUPPORT = 166,
+ WMI_TLV_SERVICE_NDI_SAP_SUPPORT = 167,
+ WMI_TLV_SERVICE_CFR_CAPTURE_SUPPORT = 168,
+ WMI_TLV_SERVICE_CFR_CAPTURE_IND_MSG_TYPE_1 = 169,
+ WMI_TLV_SERVICE_ESP_SUPPORT = 170,
+ WMI_TLV_SERVICE_PEER_CHWIDTH_CHANGE = 171,
+ WMI_TLV_SERVICE_WLAN_HPCS_PULSE = 172,
+ WMI_TLV_SERVICE_PER_VDEV_CHAINMASK_CONFIG_SUPPORT = 173,
+ WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI = 174,
+ WMI_TLV_SERVICE_NAN_DISABLE_SUPPORT = 175,
+ WMI_TLV_SERVICE_HTT_H2T_NO_HTC_HDR_LEN_IN_MSG_LEN = 176,
+ WMI_TLV_SERVICE_COEX_SUPPORT_UNEQUAL_ISOLATION = 177,
+ WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT = 178,
+ WMI_TLV_SERVICE_SUPPORT_EXTEND_ADDRESS = 179,
+ WMI_TLV_SERVICE_BEACON_RECEPTION_STATS = 180,
+ WMI_TLV_SERVICE_FETCH_TX_PN = 181,
+ WMI_TLV_SERVICE_PEER_UNMAP_RESPONSE_SUPPORT = 182,
+ WMI_TLV_SERVICE_TX_PER_PEER_AMPDU_SIZE = 183,
+ WMI_TLV_SERVICE_BSS_COLOR_SWITCH_COUNT = 184,
+ WMI_TLV_SERVICE_PEER_STATS = 185,
WMI_TLV_MAX_EXT_SERVICE = 256,
};
@@ -1557,6 +1588,8 @@ enum wmi_tlv_service {
SVCMAP(WMI_TLV_SERVICE_THERM_THROT,
WMI_SERVICE_THERM_THROT,
WMI_TLV_MAX_SERVICE);
+ SVCMAP(WMI_TLV_SERVICE_PEER_STATS,
+ WMI_SERVICE_PEER_STATS, WMI_TLV_MAX_SERVICE);
}
#undef SVCMAP
@@ -5043,13 +5043,10 @@ enum wmi_rate_preamble {
#define ATH10K_HW_PREAMBLE(rate) (((rate) >> 6) & 0x3)
#define ATH10K_HW_MCS_RATE(rate) ((rate) & 0xf)
#define ATH10K_HW_LEGACY_RATE(rate) ((rate) & 0x3f)
-#define ATH10K_HW_BW(flags) (((flags) >> 3) & 0x3)
-#define ATH10K_HW_GI(flags) (((flags) >> 5) & 0x1)
#define ATH10K_HW_RATECODE(rate, nss, preamble) \
(((preamble) << 6) | ((nss) << 4) | (rate))
#define ATH10K_HW_AMPDU(flags) ((flags) & 0x1)
#define ATH10K_HW_BA_FAIL(flags) (((flags) >> 1) & 0x3)
-#define ATH10K_FW_SKIPPED_RATE_CTRL(flags) (((flags) >> 6) & 0x1)
#define ATH10K_VHT_MCS_NUM 10
#define ATH10K_BW_NUM 4
The firmware sends peer stats to the host driver if the firmware advertises WMI_SERVICE_PEER_STATS service and the host driver indicates the WMI_RSRC_CFG_FLAG_TX_PEER_STATS capability in the host capab flag in wmi init cmd. When peer stats are enabled, firmware sends one HTT event HTT_TLV_T2H_MSG_TYPE_PEER_STATS for every four PPDUs transmitted. HTT msg payload has tag followed by length followed by success pkts/bytes, failed pkts/bytes, retry pkts/bytes and rate info per ppdu. Parse peer stats sent by the firmware in tlv format and update the tx rate information and tx_stats debugfs entry per STA. To get the tx_stats: echo 1 > /sys/kernel/debug/ieee80211/phyX/ath10k/enable_extd_tx_stats cat /sys/kernel/debug/ieee80211/phyX/net:wlanX/stations/xx:xx:xx:xx:xx:xx/tx_stats Tested HW: WCN3990 Tested FW: WLAN.HL.3.1-00784-QCAHLSWMTPLZ-1 Signed-off-by: Surabhi Vishnoi <svishnoi@codeaurora.org> --- drivers/net/wireless/ath/ath10k/htt.c | 2 + drivers/net/wireless/ath/ath10k/htt.h | 64 ++++++++++++++ drivers/net/wireless/ath/ath10k/htt_rx.c | 136 +++++++++++++++++++++++++++++- drivers/net/wireless/ath/ath10k/hw.c | 45 +++++++++- drivers/net/wireless/ath/ath10k/hw.h | 34 ++++++++ drivers/net/wireless/ath/ath10k/wmi-tlv.c | 3 + drivers/net/wireless/ath/ath10k/wmi-tlv.h | 33 ++++++++ drivers/net/wireless/ath/ath10k/wmi.h | 3 - 8 files changed, 312 insertions(+), 8 deletions(-)