All of lore.kernel.org
 help / color / mirror / Atom feed
From: Miles Hu <milehu@codeaurora.org>
To: ath11k@lists.infradead.org
Cc: Miles Hu <milehu@codeaurora.org>
Subject: [PATCH v5 2/6] ath11k: monitor filter set function
Date: Mon, 15 Apr 2019 17:12:52 -0700	[thread overview]
Message-ID: <1555373576-4771-3-git-send-email-milehu@codeaurora.org> (raw)
In-Reply-To: <1555373576-4771-1-git-send-email-milehu@codeaurora.org>

create monitor mode filter.
implement htt filter set function.
create common function to get htt ring id and type.

Signed-off-by: Miles Hu <milehu@codeaurora.org>
---
V2:
 - correct wrong indent and style.
 - remove redundant code.

 drivers/net/wireless/ath/ath11k/dp_tx.c | 193 +++++++++++++++++++-------------
 1 file changed, 115 insertions(+), 78 deletions(-)

diff --git a/drivers/net/wireless/ath/ath11k/dp_tx.c b/drivers/net/wireless/ath/ath11k/dp_tx.c
index ef724ec..2cba343 100644
--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
@@ -335,9 +335,14 @@ static void ath11k_dp_cache_peer_stats(struct ath11k *ar,
 {
 	struct ath11k_per_peer_tx_stats *peer_stats = &ar->cached_stats;
 
-	if (ts->try_cnt > 1) {
-		peer_stats->retry_pkts += ts->try_cnt - 1;
-		peer_stats->retry_bytes += (ts->try_cnt - 1) * msdu->len;
+	if (ts->try_cnt >= 1) {
+		if (ts->try_cnt == 1) {
+			peer_stats->retry_pkts += 1;
+			peer_stats->retry_bytes += msdu->len;
+		} else {
+			peer_stats->retry_pkts += ts->try_cnt - 1;
+			peer_stats->retry_bytes += (ts->try_cnt - 1) * msdu->len;
+		}
 
 		if (ts->status != HAL_WBM_TQM_REL_REASON_FRAME_ACKED) {
 			peer_stats->failed_pkts += 1;
@@ -378,9 +383,6 @@ static void ath11k_dp_tx_complete_msdu(struct ath11k *ar,
 	info = IEEE80211_SKB_CB(msdu);
 	memset(&info->status, 0, sizeof(info->status));
 
-	/* skip tx rate update from ieee80211_status*/
-	 info->status.rates[0].idx = -1;
-
 	if (ts->status == HAL_WBM_TQM_REL_REASON_FRAME_ACKED &&
 	    !(info->flags & IEEE80211_TX_CTL_NO_ACK)) {
 		info->flags |= IEEE80211_TX_STAT_ACK;
@@ -551,30 +553,15 @@ int ath11k_dp_send_reo_cmd(struct ath11k_base *ab, struct dp_rx_tid *rx_tid,
 	return 0;
 }
 
-int ath11k_dp_htt_srng_setup(struct ath11k_base *ab, u32 ring_id,
-			     int mac_id, enum hal_ring_type ring_type)
+static int
+ath11k_dp_get_ring_id_type(struct ath11k_base *ab,
+			   int mac_id, u32 ring_id,
+			   enum hal_ring_type ring_type,
+			   enum htt_srng_ring_type *htt_ring_type,
+			   enum htt_srng_ring_id *htt_ring_id)
 {
-	struct htt_srng_setup_cmd *cmd;
-	struct hal_srng *srng = &ab->hal.srng_list[ring_id];
-	struct hal_srng_params params;
-	struct sk_buff *skb;
-	int ring_entry_sz;
-	int len = sizeof(*cmd);
-	dma_addr_t hp_addr, tp_addr;
-	int lmac_ring_id_offset;
-	enum htt_srng_ring_type htt_ring_type;
-	enum htt_srng_ring_id htt_ring_id;
-	int ret;
-
-	skb = ath11k_htc_alloc_skb(ab, len);
-	if (!skb)
-		return -ENOMEM;
-
-	memset(&params, 0, sizeof(params));
-	ath11k_hal_srng_get_params(ab, srng, &params);
-
-	hp_addr = ath11k_hal_srng_get_hp_addr(ab, srng);
-	tp_addr = ath11k_hal_srng_get_tp_addr(ab, srng);
+	int lmac_ring_id_offset = 0;
+	int ret = 0;
 
 	switch (ring_type) {
 	case HAL_RXDMA_BUF:
@@ -584,37 +571,66 @@ int ath11k_dp_htt_srng_setup(struct ath11k_base *ab, u32 ring_id,
 		    ring_id == (HAL_SRNG_RING_ID_WMAC1_SW2RXDMA1_BUF +
 				lmac_ring_id_offset))) {
 			ret = -EINVAL;
-			goto err_free;
 		}
-
-		htt_ring_id = HTT_RXDMA_HOST_BUF_RING;
-		htt_ring_type = HTT_SW_TO_HW_RING;
+		*htt_ring_id = HTT_RXDMA_HOST_BUF_RING;
+		*htt_ring_type = HTT_SW_TO_HW_RING;
 		break;
 	case HAL_RXDMA_DST:
-		htt_ring_id = HTT_RXDMA_NON_MONITOR_DEST_RING;
-		htt_ring_type = HTT_HW_TO_SW_RING;
+		*htt_ring_id = HTT_RXDMA_NON_MONITOR_DEST_RING;
+		*htt_ring_type = HTT_HW_TO_SW_RING;
 		break;
 	case HAL_RXDMA_MONITOR_BUF:
-		htt_ring_id = HTT_RXDMA_MONITOR_BUF_RING;
-		htt_ring_type = HTT_SW_TO_HW_RING;
+		*htt_ring_id = HTT_RXDMA_MONITOR_BUF_RING;
+		*htt_ring_type = HTT_SW_TO_HW_RING;
 		break;
 	case HAL_RXDMA_MONITOR_STATUS:
-		htt_ring_id = HTT_RXDMA_MONITOR_STATUS_RING;
-		htt_ring_type = HTT_SW_TO_HW_RING;
+		*htt_ring_id = HTT_RXDMA_MONITOR_STATUS_RING;
+		*htt_ring_type = HTT_SW_TO_HW_RING;
 		break;
 	case HAL_RXDMA_MONITOR_DST:
-		htt_ring_id = HTT_RXDMA_MONITOR_DEST_RING;
-		htt_ring_type = HTT_HW_TO_SW_RING;
+		*htt_ring_id = HTT_RXDMA_MONITOR_DEST_RING;
+		*htt_ring_type = HTT_HW_TO_SW_RING;
 		break;
 	case HAL_RXDMA_MONITOR_DESC:
-		htt_ring_id = HTT_RXDMA_MONITOR_DESC_RING;
-		htt_ring_type = HTT_SW_TO_HW_RING;
+		*htt_ring_id = HTT_RXDMA_MONITOR_DESC_RING;
+		*htt_ring_type = HTT_SW_TO_HW_RING;
 		break;
 	default:
 		ath11k_warn(ab, "Unsupported ring type in DP :%d\n", ring_type);
 		ret = -EINVAL;
-		goto err_free;
 	}
+	return ret;
+}
+
+int ath11k_dp_htt_srng_setup(struct ath11k_base *ab, u32 ring_id,
+			     int mac_id, enum hal_ring_type ring_type)
+{
+	struct htt_srng_setup_cmd *cmd;
+	struct hal_srng *srng = &ab->hal.srng_list[ring_id];
+	struct hal_srng_params params;
+	struct sk_buff *skb;
+	u32 ring_entry_sz;
+	int len = sizeof(*cmd);
+	dma_addr_t hp_addr, tp_addr;
+	int lmac_ring_id_offset;
+	enum htt_srng_ring_type htt_ring_type;
+	enum htt_srng_ring_id htt_ring_id;
+	int ret;
+
+	skb = ath11k_htc_alloc_skb(ab, len);
+	if (!skb)
+		return -ENOMEM;
+
+	memset(&params, 0, sizeof(params));
+	ath11k_hal_srng_get_params(ab, srng, &params);
+
+	hp_addr = ath11k_hal_srng_get_hp_addr(ab, srng);
+	tp_addr = ath11k_hal_srng_get_tp_addr(ab, srng);
+
+	if (ath11k_dp_get_ring_id_type(ab, mac_id, ring_id,
+				       ring_type, &htt_ring_type,
+				       &htt_ring_id))
+		goto err_free;
 
 	skb_put(skb, len);
 	cmd = (struct htt_srng_setup_cmd *)skb->data;
@@ -757,7 +773,7 @@ int ath11k_dp_htt_h2t_ppdu_stats_req(struct ath11k *ar, u32 mask)
 	cmd->msg = FIELD_PREP(HTT_PPDU_STATS_CFG_MSG_TYPE,
 			      HTT_H2T_MSG_TYPE_PPDU_STATS_CFG);
 
-	pdev_mask = 1 << (ar->pdev_idx);
+	pdev_mask = DP_SW2HW_MACID(ar->pdev_idx);
 	cmd->msg |= FIELD_PREP(HTT_PPDU_STATS_CFG_PDEV_ID, pdev_mask);
 	cmd->msg |= FIELD_PREP(HTT_PPDU_STATS_CFG_TLV_TYPE_BITMASK, mask);
 
@@ -791,36 +807,10 @@ int ath11k_dp_htt_rx_filter_setup(struct ath11k_base *ab, u32 ring_id,
 	memset(&params, 0, sizeof(params));
 	ath11k_hal_srng_get_params(ab, srng, &params);
 
-	switch (ring_type) {
-	case HAL_RXDMA_BUF:
-		htt_ring_id = HTT_RXDMA_HOST_BUF_RING;
-		htt_ring_type = HTT_SW_TO_HW_RING;
-		break;
-	case HAL_RXDMA_DST:
-		htt_ring_id = HTT_RXDMA_NON_MONITOR_DEST_RING;
-		htt_ring_type = HTT_HW_TO_SW_RING;
-		break;
-	case HAL_RXDMA_MONITOR_BUF:
-		htt_ring_id = HTT_RXDMA_MONITOR_BUF_RING;
-		htt_ring_type = HTT_SW_TO_HW_RING;
-		break;
-	case HAL_RXDMA_MONITOR_STATUS:
-		htt_ring_id = HTT_RXDMA_MONITOR_STATUS_RING;
-		htt_ring_type = HTT_SW_TO_HW_RING;
-		break;
-	case HAL_RXDMA_MONITOR_DST:
-		htt_ring_id = HTT_RXDMA_MONITOR_DEST_RING;
-		htt_ring_type = HTT_HW_TO_SW_RING;
-		break;
-	case HAL_RXDMA_MONITOR_DESC:
-		htt_ring_id = HTT_RXDMA_MONITOR_DESC_RING;
-		htt_ring_type = HTT_SW_TO_HW_RING;
-		break;
-	default:
-		ath11k_warn(ab, "Unsupported ring type in DP :%d\n", ring_type);
-		ret = -EINVAL;
+	if (ath11k_dp_get_ring_id_type(ab, mac_id, ring_id,
+				       ring_type, &htt_ring_type,
+				       &htt_ring_id))
 		goto err_free;
-	}
 
 	skb_put(skb, len);
 	cmd = (struct htt_rx_ring_selection_cfg_cmd *)skb->data;
@@ -828,11 +818,13 @@ int ath11k_dp_htt_rx_filter_setup(struct ath11k_base *ab, u32 ring_id,
 				HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG);
 	if (htt_ring_type == HTT_SW_TO_HW_RING ||
 	    htt_ring_type == HTT_HW_TO_SW_RING)
-		cmd->info0 |= FIELD_PREP(HTT_RX_RING_SELECTION_CFG_CMD_INFO0_PDEV_ID,
-					 DP_SW2HW_MACID(mac_id));
+		cmd->info0 |=
+			FIELD_PREP(HTT_RX_RING_SELECTION_CFG_CMD_INFO0_PDEV_ID,
+				   DP_SW2HW_MACID(mac_id));
 	else
-		cmd->info0 |= FIELD_PREP(HTT_RX_RING_SELECTION_CFG_CMD_INFO0_PDEV_ID,
-					 mac_id);
+		cmd->info0 |=
+			FIELD_PREP(HTT_RX_RING_SELECTION_CFG_CMD_INFO0_PDEV_ID,
+				   mac_id);
 	cmd->info0 |= FIELD_PREP(HTT_RX_RING_SELECTION_CFG_CMD_INFO0_RING_ID,
 				 htt_ring_id);
 	cmd->info0 |= FIELD_PREP(HTT_RX_RING_SELECTION_CFG_CMD_INFO0_SS,
@@ -901,3 +893,48 @@ int ath11k_dp_htt_h2t_ext_stats_req(struct ath11k *ar, u8 type,
 
 	return 0;
 }
+
+int ath11k_dp_htt_monitor_mode_ring_config(struct ath11k *ar, bool reset)
+{
+	struct ath11k_pdev_dp *dp = &ar->dp;
+	struct htt_rx_ring_tlv_filter tlv_filter = {0};
+	int ret = 0, ring_id = 0;
+
+	ring_id = dp->rxdma_mon_buf_ring.refill_buf_ring.ring_id;
+
+	if (!reset) {
+		tlv_filter.rx_filter = HTT_RX_MON_FILTER_TLV_FLAGS_MON_BUF_RING;
+		tlv_filter.pkt_filter_flags0 =
+					HTT_RX_MON_FP_MGMT_FILTER_FLAGS0 |
+					HTT_RX_MON_MO_MGMT_FILTER_FLAGS0;
+		tlv_filter.pkt_filter_flags1 =
+					HTT_RX_MON_FP_MGMT_FILTER_FLAGS1 |
+					HTT_RX_MON_MO_MGMT_FILTER_FLAGS1;
+		tlv_filter.pkt_filter_flags2 =
+					HTT_RX_MON_FP_CTRL_FILTER_FLASG2 |
+					HTT_RX_MON_MO_CTRL_FILTER_FLASG2;
+		tlv_filter.pkt_filter_flags3 =
+					HTT_RX_MON_FP_CTRL_FILTER_FLASG3 |
+					HTT_RX_MON_MO_CTRL_FILTER_FLASG3 |
+					HTT_RX_MON_FP_DATA_FILTER_FLASG3 |
+					HTT_RX_MON_MO_DATA_FILTER_FLASG3;
+	}
+
+	ret = ath11k_dp_htt_rx_filter_setup(ar->ab, ring_id, dp->mac_id,
+					    HAL_RXDMA_MONITOR_BUF,
+					    DP_RXDMA_REFILL_RING_SIZE,
+					    &tlv_filter);
+	if (ret)
+		return ret;
+
+	ring_id = dp->rx_mon_status_refill_ring.refill_buf_ring.ring_id;
+	if (!reset)
+		tlv_filter.rx_filter =
+				HTT_RX_MON_FILTER_TLV_FLAGS_MON_STATUS_RING;
+
+	ret = ath11k_dp_htt_rx_filter_setup(ar->ab, ring_id, dp->mac_id,
+					    HAL_RXDMA_MONITOR_STATUS,
+					    DP_RXDMA_REFILL_RING_SIZE,
+					    &tlv_filter);
+	return ret;
+}
-- 
2.7.4


_______________________________________________
ath11k mailing list
ath11k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath11k

  parent reply	other threads:[~2019-04-16  0:13 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-16  0:12 [PATCH v5 0/6] ath11k: add monitor mode support Miles Hu
2019-04-16  0:12 ` [PATCH v5 1/6] ath11k: init/deinit monitor rings Miles Hu
2019-04-16  0:12 ` Miles Hu [this message]
2019-04-16  0:12 ` [PATCH v5 3/6] ath11k: htt setup " Miles Hu
2019-04-16  0:12 ` [PATCH v5 4/6] ath11k: monitor mode attach/detach Miles Hu
2019-04-16  0:12 ` [PATCH v5 5/6] ath11k: enable/disable monitor mode and destination ring entry process Miles Hu
2019-04-16  0:12 ` [PATCH v5 6/6] ath11k: merge msdu tlv process and status/destination ring process Miles Hu
2019-04-23 14:05 ` [PATCH v5 0/6] ath11k: add monitor mode support Kalle Valo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1555373576-4771-3-git-send-email-milehu@codeaurora.org \
    --to=milehu@codeaurora.org \
    --cc=ath11k@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.