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

Commit 867bafcc authored by Govind Singh's avatar Govind Singh Committed by Gerrit - the friendly Code Review server
Browse files

ath10k: Add support for extended HTT aggr msg support



HTT aggr message parameter in HL2.0 fw are different in comparison
to legacy fw version. Fill correct HTT aggr msg parameter for
targets using HL2.0 firmware.

Signed-off-by: default avatarGovind Singh <govinds@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Change-Id: I7798f480c5cd3ac502a7c3b921b81b8b37ff4706
Git-commit: 5cbb117477501df2f8b3a384b042b08cd7174c92
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/ath.git


Signed-off-by: default avatarGovind Singh <govinds@codeaurora.org>
parent 982aa2fd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -268,7 +268,7 @@ int ath10k_htt_setup(struct ath10k_htt *htt)
		return status;
	}

	status = ath10k_htt_h2t_aggr_cfg_msg(htt,
	status = htt->tx_ops->htt_h2t_aggr_cfg_msg(htt,
					     htt->max_num_ampdu,
					     htt->max_num_amsdu);
	if (status) {
+11 −0
Original line number Diff line number Diff line
@@ -357,6 +357,13 @@ struct htt_aggr_conf {
	u8 max_num_amsdu_subframes;
} __packed;

struct htt_aggr_conf_v2 {
	u8 max_num_ampdu_subframes;
	/* amsdu_subframes is limited by 0x1F mask */
	u8 max_num_amsdu_subframes;
	u8 reserved;
} __packed;

#define HTT_MGMT_FRM_HDR_DOWNLOAD_LEN 32
struct htt_mgmt_tx_desc_qca99x0 {
	__le32 rate;
@@ -1621,6 +1628,7 @@ struct htt_cmd {
		struct htt_stats_req stats_req;
		struct htt_oob_sync_req oob_sync_req;
		struct htt_aggr_conf aggr_conf;
		struct htt_aggr_conf_v2 aggr_conf_v2;
		struct htt_frag_desc_bank_cfg32 frag_desc_bank_cfg32;
		struct htt_frag_desc_bank_cfg64 frag_desc_bank_cfg64;
		struct htt_tx_fetch_resp tx_fetch_resp;
@@ -1859,6 +1867,9 @@ struct ath10k_htt_tx_ops {
		      struct sk_buff *msdu);
	int (*htt_alloc_txbuff)(struct ath10k_htt *htt);
	void (*htt_free_txbuff)(struct ath10k_htt *htt);
	int (*htt_h2t_aggr_cfg_msg)(struct ath10k_htt *htt,
				    u8 max_subfrms_ampdu,
				    u8 max_subfrms_amsdu);
};

struct ath10k_htt_rx_ops {
+49 −0
Original line number Diff line number Diff line
@@ -981,6 +981,53 @@ int ath10k_htt_h2t_aggr_cfg_msg(struct ath10k_htt *htt,
	return 0;
}

static int ath10k_htt_h2t_aggr_cfg_msg_v2(struct ath10k_htt *htt,
					  u8 max_subfrms_ampdu,
					  u8 max_subfrms_amsdu)
{
	struct ath10k *ar = htt->ar;
	struct htt_aggr_conf_v2 *aggr_conf;
	struct sk_buff *skb;
	struct htt_cmd *cmd;
	int len;
	int ret;

	/* Firmware defaults are: amsdu = 3 and ampdu = 64 */

	if (max_subfrms_ampdu == 0 || max_subfrms_ampdu > 64)
		return -EINVAL;

	if (max_subfrms_amsdu == 0 || max_subfrms_amsdu > 31)
		return -EINVAL;

	len = sizeof(cmd->hdr);
	len += sizeof(cmd->aggr_conf_v2);

	skb = ath10k_htc_alloc_skb(ar, len);
	if (!skb)
		return -ENOMEM;

	skb_put(skb, len);
	cmd = (struct htt_cmd *)skb->data;
	cmd->hdr.msg_type = HTT_H2T_MSG_TYPE_AGGR_CFG;

	aggr_conf = &cmd->aggr_conf_v2;
	aggr_conf->max_num_ampdu_subframes = max_subfrms_ampdu;
	aggr_conf->max_num_amsdu_subframes = max_subfrms_amsdu;

	ath10k_dbg(ar, ATH10K_DBG_HTT, "htt h2t aggr cfg msg amsdu %d ampdu %d",
		   aggr_conf->max_num_amsdu_subframes,
		   aggr_conf->max_num_ampdu_subframes);

	ret = ath10k_htc_send(&htt->ar->htc, htt->eid, skb);
	if (ret) {
		dev_kfree_skb_any(skb);
		return ret;
	}

	return 0;
}

int ath10k_htt_tx_fetch_resp(struct ath10k *ar,
			     __le32 token,
			     __le16 fetch_seq_num,
@@ -1555,6 +1602,7 @@ static const struct ath10k_htt_tx_ops htt_tx_ops_32 = {
	.htt_tx = ath10k_htt_tx_32,
	.htt_alloc_txbuff = ath10k_htt_tx_alloc_cont_txbuf_32,
	.htt_free_txbuff = ath10k_htt_tx_free_cont_txbuf_32,
	.htt_h2t_aggr_cfg_msg = ath10k_htt_h2t_aggr_cfg_msg,
};

static const struct ath10k_htt_tx_ops htt_tx_ops_64 = {
@@ -1565,6 +1613,7 @@ static const struct ath10k_htt_tx_ops htt_tx_ops_64 = {
	.htt_tx = ath10k_htt_tx_64,
	.htt_alloc_txbuff = ath10k_htt_tx_alloc_cont_txbuf_64,
	.htt_free_txbuff = ath10k_htt_tx_free_cont_txbuf_64,
	.htt_h2t_aggr_cfg_msg = ath10k_htt_h2t_aggr_cfg_msg_v2,
};

void ath10k_htt_set_tx_ops(struct ath10k_htt *htt)