diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/htt_tx.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath10k/htt_tx.c | 52 | 
1 files changed, 52 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath10k/htt_tx.c b/drivers/net/wireless/ath/ath10k/htt_tx.c index 7064354d1f4f..8b27bfcc1de3 100644 --- a/drivers/net/wireless/ath/ath10k/htt_tx.c +++ b/drivers/net/wireless/ath/ath10k/htt_tx.c @@ -307,6 +307,52 @@ int ath10k_htt_send_rx_ring_cfg_ll(struct ath10k_htt *htt)  	return 0;  } +int ath10k_htt_h2t_aggr_cfg_msg(struct ath10k_htt *htt, +				u8 max_subfrms_ampdu, +				u8 max_subfrms_amsdu) +{ +	struct htt_aggr_conf *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); + +	skb = ath10k_htc_alloc_skb(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; +	aggr_conf->max_num_ampdu_subframes = max_subfrms_ampdu; +	aggr_conf->max_num_amsdu_subframes = max_subfrms_amsdu; + +	ath10k_dbg(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_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)  {  	struct device *dev = htt->ar->dev; @@ -485,6 +531,12 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)  	flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L3_OFFLOAD;  	flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L4_OFFLOAD; +	/* Prevent firmware from sending up tx inspection requests. There's +	 * nothing ath10k can do with frames requested for inspection so force +	 * it to simply rely a regular tx completion with discard status. +	 */ +	flags1 |= HTT_DATA_TX_DESC_FLAGS1_POSTPONED; +  	skb_cb->htt.txbuf->cmd_hdr.msg_type = HTT_H2T_MSG_TYPE_TX_FRM;  	skb_cb->htt.txbuf->cmd_tx.flags0 = flags0;  	skb_cb->htt.txbuf->cmd_tx.flags1 = __cpu_to_le16(flags1);  |