From 1edfe5ae7c78a373d2276703d802338ab2c0f98e Mon Sep 17 00:00:00 2001 From: Amit Shukla Date: Thu, 24 Oct 2019 14:03:39 -0700 Subject: [PATCH] qcacmn: Data path changes for Dynamic Mode Change FR. Changes include- 1. Move all LMAC rings to SOC from pDEV 2. Dynamically obtain lmac->pdev mapping while handling LMAC interrupts Change-Id: Ib017d49243405b62fc34099c01a2b898b25341d0 --- dp/inc/cdp_txrx_cmn.h | 8 +- dp/inc/cdp_txrx_ops.h | 2 +- dp/wifi3.0/dp_htt.c | 48 ++- dp/wifi3.0/dp_internal.h | 117 ++++++- dp/wifi3.0/dp_main.c | 555 +++++++++++++++++++++------------- dp/wifi3.0/dp_rx.c | 38 ++- dp/wifi3.0/dp_rx.h | 7 +- dp/wifi3.0/dp_rx_defrag.c | 8 +- dp/wifi3.0/dp_rx_err.c | 27 +- dp/wifi3.0/dp_rx_mon_dest.c | 173 ++++++----- dp/wifi3.0/dp_rx_mon_status.c | 12 +- dp/wifi3.0/dp_stats.c | 42 ++- dp/wifi3.0/dp_tx.c | 7 +- dp/wifi3.0/dp_types.h | 52 ++-- wlan_cfg/wlan_cfg.c | 38 ++- wlan_cfg/wlan_cfg.h | 57 +++- 16 files changed, 758 insertions(+), 433 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index bbfd3df940..a681e4c774 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1929,12 +1929,12 @@ cdp_soc_set_dp_txrx_handle(ol_txrx_soc_handle soc, void *dp_handle) * @soc: opaque soc handle * @pdev_id: id of data path pdev handle * @lmac_id: lmac id - * + * @mode_change: flag to indicate mode change (true) or init (false) * Return: QDF_STATUS */ static inline QDF_STATUS cdp_soc_map_pdev_to_lmac(ol_txrx_soc_handle soc, uint8_t pdev_id, - uint32_t lmac_id) + uint32_t lmac_id, bool mode_change) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -1948,7 +1948,7 @@ cdp_soc_map_pdev_to_lmac(ol_txrx_soc_handle soc, uint8_t pdev_id, return QDF_STATUS_E_FAILURE; return soc->ops->cmn_drv_ops->map_pdev_to_lmac(soc, pdev_id, - lmac_id); + lmac_id, mode_change); } /** diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 3b83156bf7..1090b9323c 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -447,7 +447,7 @@ struct cdp_cmn_ops { void *dp_txrx_handle); QDF_STATUS (*map_pdev_to_lmac)(ol_txrx_soc_handle soc, uint8_t pdev_id, - uint32_t lmac_id); + uint32_t lmac_id, bool mode_change); QDF_STATUS (*set_pdev_status_down)(struct cdp_soc_t *soc_handle, uint8_t pdev_id, bool is_pdev_down); diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 06902f385d..331b0451b9 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -765,6 +765,8 @@ int htt_srng_setup(struct htt_soc *soc, int mac_id, hal_srng_get_entrysize(soc->hal_soc, hal_ring_type); int htt_ring_type, htt_ring_id; uint8_t *htt_logger_bufp; + int target_pdev_id; + int lmac_id = dp_get_lmac_id_for_pdev_id(soc->dp_soc, 0, mac_id); /* Sizes should be set in 4-byte words */ ring_entry_size = ring_entry_size >> 2; @@ -796,7 +798,7 @@ int htt_srng_setup(struct htt_soc *soc, int mac_id, #else if (srng_params.ring_id == (HAL_SRNG_WMAC1_SW2RXDMA0_BUF0 + - (mac_id * HAL_MAX_RINGS_PER_LMAC))) { + (lmac_id * HAL_MAX_RINGS_PER_LMAC))) { htt_ring_id = HTT_RXDMA_HOST_BUF_RING; htt_ring_type = HTT_SW_TO_HW_RING; #endif @@ -806,7 +808,7 @@ int htt_srng_setup(struct htt_soc *soc, int mac_id, #else (HAL_SRNG_WMAC1_SW2RXDMA1_BUF + #endif - (mac_id * HAL_MAX_RINGS_PER_LMAC))) { + (lmac_id * HAL_MAX_RINGS_PER_LMAC))) { htt_ring_id = HTT_RXDMA_HOST_BUF_RING; htt_ring_type = HTT_SW_TO_HW_RING; } else { @@ -870,11 +872,12 @@ int htt_srng_setup(struct htt_soc *soc, int mac_id, *msg_word = 0; htt_logger_bufp = (uint8_t *)msg_word; HTT_H2T_MSG_TYPE_SET(*msg_word, HTT_H2T_MSG_TYPE_SRING_SETUP); + target_pdev_id = + dp_get_target_pdev_id_for_host_pdev_id(soc->dp_soc, mac_id); if ((htt_ring_type == HTT_SW_TO_HW_RING) || (htt_ring_type == HTT_HW_TO_SW_RING)) - HTT_SRING_SETUP_PDEV_ID_SET(*msg_word, - DP_SW2HW_MACID(mac_id)); + HTT_SRING_SETUP_PDEV_ID_SET(*msg_word, target_pdev_id); else HTT_SRING_SETUP_PDEV_ID_SET(*msg_word, mac_id); @@ -1011,7 +1014,7 @@ fail0: * htt_h2t_rx_ring_cfg() - Send SRNG packet and TLV filter * config message to target * @htt_soc: HTT SOC handle - * @pdev_id: PDEV Id + * @pdev_id: WIN- PDEV Id, MCL- mac id * @hal_srng: Opaque HAL SRNG pointer * @hal_ring_type: SRNG ring type * @ring_buf_size: SRNG buffer size @@ -1033,6 +1036,7 @@ int htt_h2t_rx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, uint8_t *htt_logger_bufp; struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx = soc->dp_soc->wlan_cfg_ctx; uint32_t mon_drop_th = wlan_cfg_get_mon_drop_thresh(wlan_cfg_ctx); + int target_pdev_id; htt_msg = qdf_nbuf_alloc(soc->osdev, HTT_MSG_BUF_SIZE(HTT_RX_RING_SELECTION_CFG_SZ), @@ -1102,10 +1106,13 @@ int htt_h2t_rx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, * pdev_id is indexed from 0 whereas mac_id is indexed from 1 * SW_TO_SW and SW_TO_HW rings are unaffected by this */ + target_pdev_id = + dp_get_target_pdev_id_for_host_pdev_id(soc->dp_soc, pdev_id); + if (htt_ring_type == HTT_SW_TO_SW_RING || htt_ring_type == HTT_SW_TO_HW_RING) HTT_RX_RING_SELECTION_CFG_PDEV_ID_SET(*msg_word, - DP_SW2HW_MACID(pdev_id)); + target_pdev_id); /* TODO: Discuss with FW on changing this to unique ID and using * htt_ring_type to send the type of ring @@ -3656,10 +3663,12 @@ dp_ppdu_stats_ind_handler(struct htt_soc *soc, qdf_nbuf_t htt_t2h_msg) { u_int8_t pdev_id; + u_int8_t target_pdev_id; bool free_buf; qdf_nbuf_set_pktlen(htt_t2h_msg, HTT_T2H_MAX_MSG_SIZE); - pdev_id = HTT_T2H_PPDU_STATS_PDEV_ID_GET(*msg_word); - pdev_id = DP_HW2SW_MACID(pdev_id); + target_pdev_id = HTT_T2H_PPDU_STATS_PDEV_ID_GET(*msg_word); + pdev_id = dp_get_host_pdev_id_for_target_pdev_id(soc->dp_soc, + target_pdev_id); free_buf = dp_txrx_ppdu_stats_handler(soc->dp_soc, pdev_id, htt_t2h_msg); dp_wdi_event_handler(WDI_EVENT_LITE_T2H, soc->dp_soc, @@ -3691,10 +3700,12 @@ dp_pktlog_msg_handler(struct htt_soc *soc, uint32_t *msg_word) { uint8_t pdev_id; + uint8_t target_pdev_id; uint32_t *pl_hdr; - pdev_id = HTT_T2H_PKTLOG_PDEV_ID_GET(*msg_word); - pdev_id = DP_HW2SW_MACID(pdev_id); + target_pdev_id = HTT_T2H_PKTLOG_PDEV_ID_GET(*msg_word); + pdev_id = dp_get_host_pdev_id_for_target_pdev_id(soc->dp_soc, + target_pdev_id); pl_hdr = (msg_word + 1); dp_wdi_event_handler(WDI_EVENT_OFFLOAD_ALL, soc->dp_soc, pl_hdr, HTT_INVALID_PEER, WDI_NO_VAL, @@ -3761,6 +3772,7 @@ static void dp_htt_bkp_event_alert(u_int32_t *msg_word, struct htt_soc *soc) { u_int8_t ring_type; u_int8_t pdev_id; + uint8_t target_pdev_id; u_int8_t ring_id; u_int16_t hp_idx; u_int16_t tp_idx; @@ -3776,8 +3788,9 @@ static void dp_htt_bkp_event_alert(u_int32_t *msg_word, struct htt_soc *soc) dpsoc = (struct dp_soc *)soc->dp_soc; msg_type = HTT_T2H_MSG_TYPE_GET(*msg_word); ring_type = HTT_T2H_RX_BKPRESSURE_RING_TYPE_GET(*msg_word); - pdev_id = HTT_T2H_RX_BKPRESSURE_PDEV_ID_GET(*msg_word); - pdev_id = DP_HW2SW_MACID(pdev_id); + target_pdev_id = HTT_T2H_RX_BKPRESSURE_PDEV_ID_GET(*msg_word); + pdev_id = dp_get_host_pdev_id_for_target_pdev_id(soc->dp_soc, + target_pdev_id); pdev = (struct dp_pdev *)dpsoc->pdev_list[pdev_id]; ring_id = HTT_T2H_RX_BKPRESSURE_RINGID_GET(*msg_word); hp_idx = HTT_T2H_RX_BKPRESSURE_HEAD_IDX_GET(*(msg_word + 1)); @@ -4268,6 +4281,8 @@ QDF_STATUS dp_h2t_ext_stats_msg_send(struct dp_pdev *pdev, uint32_t *msg_word; uint8_t pdev_mask = 0; uint8_t *htt_logger_bufp; + int mac_for_pdev; + int target_pdev_id; msg = qdf_nbuf_alloc( soc->osdev, @@ -4283,9 +4298,11 @@ QDF_STATUS dp_h2t_ext_stats_msg_send(struct dp_pdev *pdev, * Bit 2: Pdev stats for pdev id 1 * Bit 3: Pdev stats for pdev id 2 */ - mac_id = dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id); + mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id); + target_pdev_id = + dp_get_target_pdev_id_for_host_pdev_id(pdev->soc, mac_for_pdev); - pdev_mask = 1 << DP_SW2HW_MACID(mac_id); + pdev_mask = 1 << target_pdev_id; /* * Set the length of the message. * The contribution from the HTC_HDR_ALIGNMENT_PADDING is added @@ -4412,7 +4429,8 @@ QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev, * Bit 2: Pdev stats for pdev id 1 * Bit 3: Pdev stats for pdev id 2 */ - pdev_mask = 1 << DP_SW2HW_MACID(mac_id); + pdev_mask = 1 << dp_get_target_pdev_id_for_host_pdev_id(pdev->soc, + mac_id); /* * Set the length of the message. diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 1f0a84510c..36e9bd0adf 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1202,6 +1202,121 @@ static inline int dp_get_mac_id_for_pdev(uint32_t mac_id, uint32_t pdev_id) return (mac_id + pdev_id); } +/** + * dp_get_lmac_id_for_pdev_id() - Return lmac id corresponding to host pdev id + * @soc: soc pointer + * @mac_id: MAC id + * @pdev_id: pdev_id corresponding to pdev, 0 for MCL + * + * For MCL, Single pdev using both MACs will operate on both MAC rings. + * + * For WIN, each PDEV will operate one ring. + * + */ +static inline int +dp_get_lmac_id_for_pdev_id + (struct dp_soc *soc, uint32_t mac_id, uint32_t pdev_id) +{ + if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) { + if (mac_id && pdev_id) { + qdf_print("Both mac_id and pdev_id cannot be non zero"); + QDF_BUG(0); + return 0; + } + return (mac_id + pdev_id); + } + + return soc->pdev_list[pdev_id]->lmac_id; +} + +/** + * dp_get_pdev_for_lmac_id() - Return pdev pointer corresponding to lmac id + * @soc: soc pointer + * @lmac_id: LMAC id + * + * For MCL, Single pdev exists + * + * For WIN, each PDEV will operate one ring. + * + */ +static inline struct dp_pdev * + dp_get_pdev_for_lmac_id(struct dp_soc *soc, uint32_t lmac_id) +{ + int i = 0; + + if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) { + i = wlan_cfg_get_pdev_idx(soc->wlan_cfg_ctx, lmac_id); + qdf_assert_always(i < MAX_PDEV_CNT); + + return soc->pdev_list[i]; + } + + /* Typically for MCL as there only 1 PDEV*/ + return soc->pdev_list[0]; +} + +/** + * dp_get_target_pdev_id_for_host_pdev_id() - Return target pdev corresponding + * to host pdev id + * @soc: soc pointer + * @mac_for_pdev: pdev_id corresponding to host pdev for WIN, mac id for MCL + * + * returns target pdev_id for host pdev id. For WIN, this is derived through + * a two step process: + * 1. Get lmac_id corresponding to host pdev_id (lmac_id can change + * during mode switch) + * 2. Get target pdev_id (set up during WMI ready) from lmac_id + * + * For MCL, return the offset-1 translated mac_id + */ +static inline int +dp_get_target_pdev_id_for_host_pdev_id + (struct dp_soc *soc, uint32_t mac_for_pdev) +{ + struct dp_pdev *pdev; + + if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) + return DP_SW2HW_MACID(mac_for_pdev); + + pdev = soc->pdev_list[mac_for_pdev]; + + /*non-MCL case, get original target_pdev mapping*/ + return wlan_cfg_get_target_pdev_id(soc->wlan_cfg_ctx, pdev->lmac_id); +} + +/** + * dp_get_host_pdev_id_for_target_pdev_id() - Return host pdev corresponding + * to target pdev id + * @soc: soc pointer + * @pdev_id: pdev_id corresponding to target pdev + * + * returns host pdev_id for target pdev id. For WIN, this is derived through + * a two step process: + * 1. Get lmac_id corresponding to target pdev_id + * 2. Get host pdev_id (set up during WMI ready) from lmac_id + * + * For MCL, return the 0-offset pdev_id + */ +static inline int +dp_get_host_pdev_id_for_target_pdev_id + (struct dp_soc *soc, uint32_t pdev_id) +{ + struct dp_pdev *pdev; + int lmac_id; + + if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) + return DP_HW2SW_MACID(pdev_id); + + /*non-MCL case, get original target_lmac mapping from target pdev*/ + lmac_id = wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx, + DP_HW2SW_MACID(pdev_id)); + + /*Get host pdev from lmac*/ + pdev = dp_get_pdev_for_lmac_id(soc, lmac_id); + + return pdev->pdev_id; +} + /* * dp_get_mac_id_for_mac() - Return mac corresponding WIN and MCL mac_ids * diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 7d6279759f..38d85289f1 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -340,23 +340,19 @@ uint32_t dp_soc_get_mon_mask_for_interrupt_mode(struct dp_soc *soc, int intr_ctx static void dp_service_mon_rings(void *arg) { struct dp_soc *soc = (struct dp_soc *)arg; - int ring = 0, work_done, mac_id; + int ring = 0, work_done; struct dp_pdev *pdev = NULL; - for (ring = 0 ; ring < MAX_PDEV_CNT; ring++) { - pdev = soc->pdev_list[ring]; + for (ring = 0 ; ring < MAX_NUM_LMAC_HW; ring++) { + pdev = dp_get_pdev_for_lmac_id(soc, ring); if (!pdev) continue; - for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); - work_done = dp_mon_process(soc, mac_for_pdev, - QCA_NAPI_BUDGET); + work_done = dp_mon_process(soc, ring, + QCA_NAPI_BUDGET); - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, - FL("Reaped %d descs from Monitor rings"), - work_done); - } + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, + FL("Reaped %d descs from Monitor rings"), + work_done); } qdf_timer_mod(&soc->mon_reap_timer, DP_INTR_POLL_TIMER_MS); @@ -486,36 +482,37 @@ uint32_t dp_soc_get_mon_mask_for_interrupt_mode(struct dp_soc *soc, int intr_ctx static void dp_service_lmac_rings(void *arg) { struct dp_soc *soc = (struct dp_soc *)arg; - int ring = 0, mac_id, i; + int ring = 0, i; struct dp_pdev *pdev = NULL; union dp_rx_desc_list_elem_t *desc_list = NULL; union dp_rx_desc_list_elem_t *tail = NULL; /* Process LMAC interrupts */ - for (ring = 0 ; ring < MAX_PDEV_CNT; ring++) { - pdev = soc->pdev_list[ring]; + for (ring = 0 ; ring < MAX_NUM_LMAC_HW; ring++) { + int mac_for_pdev = ring; + struct dp_srng *rx_refill_buf_ring; + + pdev = dp_get_pdev_for_lmac_id(soc, mac_for_pdev); if (!pdev) continue; - for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); - struct dp_srng *rx_refill_buf_ring = - &pdev->rx_refill_buf_ring; - dp_mon_process(soc, mac_for_pdev, - QCA_NAPI_BUDGET); + rx_refill_buf_ring = &soc->rx_refill_buf_ring[mac_for_pdev]; - for (i = 0; i < wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx); i++) - dp_rxdma_err_process(&soc->intr_ctx[i], soc, - mac_for_pdev, - QCA_NAPI_BUDGET); + dp_mon_process(soc, mac_for_pdev, + QCA_NAPI_BUDGET); - if (!dp_soc_ring_if_nss_offloaded(soc, RXDMA_BUF, mac_id)) - dp_rx_buffers_replenish(soc, mac_for_pdev, - rx_refill_buf_ring, - &soc->rx_desc_buf[mac_for_pdev], - 0, &desc_list, &tail); - } + for (i = 0; + i < wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx); i++) + dp_rxdma_err_process(&soc->intr_ctx[i], soc, + mac_for_pdev, + QCA_NAPI_BUDGET); + + if (!dp_soc_ring_if_nss_offloaded(soc, RXDMA_BUF, + mac_for_pdev)) + dp_rx_buffers_replenish(soc, mac_for_pdev, + rx_refill_buf_ring, + &soc->rx_desc_buf[mac_for_pdev], + 0, &desc_list, &tail); } qdf_timer_mod(&soc->lmac_reap_timer, DP_INTR_POLL_TIMER_MS); @@ -1513,7 +1510,6 @@ static uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget) uint8_t reo_status_mask = int_ctx->reo_status_ring_mask; uint32_t remaining_quota = dp_budget; struct dp_pdev *pdev = NULL; - int mac_id; dp_verbose_debug("tx %x rx %x rx_err %x rx_wbm_rel %x reo_status %x rx_mon_ring %x host2rxdma %x rxdma2host %x\n", tx_mask, rx_mask, rx_err_mask, rx_wbm_rel_mask, @@ -1613,52 +1609,51 @@ static uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget) } /* Process LMAC interrupts */ - for (ring = 0 ; ring < MAX_PDEV_CNT; ring++) { - pdev = soc->pdev_list[ring]; + for (ring = 0 ; ring < MAX_NUM_LMAC_HW; ring++) { + int mac_for_pdev = ring; + + pdev = dp_get_pdev_for_lmac_id(soc, mac_for_pdev); if (!pdev) continue; - for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); - if (int_ctx->rx_mon_ring_mask & (1 << mac_for_pdev)) { - work_done = dp_mon_process(soc, mac_for_pdev, - remaining_quota); - if (work_done) - intr_stats->num_rx_mon_ring_masks++; - budget -= work_done; - if (budget <= 0) - goto budget_done; - remaining_quota = budget; - } + if (int_ctx->rx_mon_ring_mask & (1 << mac_for_pdev)) { + work_done = dp_mon_process(soc, mac_for_pdev, + remaining_quota); + if (work_done) + intr_stats->num_rx_mon_ring_masks++; + budget -= work_done; + if (budget <= 0) + goto budget_done; + remaining_quota = budget; + } - if (int_ctx->rxdma2host_ring_mask & + if (int_ctx->rxdma2host_ring_mask & + (1 << mac_for_pdev)) { + work_done = dp_rxdma_err_process(int_ctx, soc, + mac_for_pdev, + remaining_quota); + if (work_done) + intr_stats->num_rxdma2host_ring_masks++; + budget -= work_done; + if (budget <= 0) + goto budget_done; + remaining_quota = budget; + } + + if (int_ctx->host2rxdma_ring_mask & (1 << mac_for_pdev)) { - work_done = dp_rxdma_err_process(int_ctx, soc, - mac_for_pdev, - remaining_quota); - if (work_done) - intr_stats->num_rxdma2host_ring_masks++; - budget -= work_done; - if (budget <= 0) - goto budget_done; - remaining_quota = budget; - } + union dp_rx_desc_list_elem_t *desc_list = NULL; + union dp_rx_desc_list_elem_t *tail = NULL; + struct dp_srng *rx_refill_buf_ring = + &soc->rx_refill_buf_ring[mac_for_pdev]; - if (int_ctx->host2rxdma_ring_mask & - (1 << mac_for_pdev)) { - union dp_rx_desc_list_elem_t *desc_list = NULL; - union dp_rx_desc_list_elem_t *tail = NULL; - struct dp_srng *rx_refill_buf_ring = - &pdev->rx_refill_buf_ring; + intr_stats->num_host2rxdma_ring_masks++; + DP_STATS_INC(pdev, replenish.low_thresh_intrs, + 1); + dp_rx_buffers_replenish(soc, mac_for_pdev, + rx_refill_buf_ring, + &soc->rx_desc_buf[mac_for_pdev], + 0, &desc_list, &tail); - intr_stats->num_host2rxdma_ring_masks++; - DP_STATS_INC(pdev, replenish.low_thresh_intrs, - 1); - dp_rx_buffers_replenish(soc, mac_for_pdev, - rx_refill_buf_ring, - &soc->rx_desc_buf[mac_for_pdev], - 0, &desc_list, &tail); - } } } @@ -1849,29 +1844,24 @@ static void dp_soc_interrupt_map_calculate_integrated(struct dp_soc *soc, if (rxdma2host_ring_mask & (1 << j)) { irq_id_map[num_irq++] = - rxdma2host_destination_ring_mac1 - - wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx, j); + rxdma2host_destination_ring_mac1 - j; } if (host2rxdma_ring_mask & (1 << j)) { irq_id_map[num_irq++] = - host2rxdma_host_buf_ring_mac1 - - wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx, j); + host2rxdma_host_buf_ring_mac1 - j; } if (host2rxdma_mon_ring_mask & (1 << j)) { irq_id_map[num_irq++] = - host2rxdma_monitor_ring1 - - wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx, j); + host2rxdma_monitor_ring1 - j; } if (rx_mon_mask & (1 << j)) { irq_id_map[num_irq++] = - ppdu_end_interrupts_mac1 - - wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx, j); + ppdu_end_interrupts_mac1 - j; irq_id_map[num_irq++] = - rxdma2host_monitor_status_ring_mac1 - - wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx, j); + rxdma2host_monitor_status_ring_mac1 - j; } if (rx_wbm_rel_ring_mask & (1 << j)) @@ -3009,11 +2999,9 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) entries = wlan_cfg_get_dp_soc_rxdma_err_dst_ring_size(soc_cfg_ctx); /* LMAC RxDMA to SW Rings configuration */ if (!wlan_cfg_per_pdev_lmac_ring(soc_cfg_ctx)) { - /* Only valid for MCL */ - struct dp_pdev *pdev = soc->pdev_list[0]; for (i = 0; i < MAX_RX_MAC_RINGS; i++) { - if (dp_srng_setup(soc, &pdev->rxdma_err_dst_ring[i], + if (dp_srng_setup(soc, &soc->rxdma_err_dst_ring[i], RXDMA_DST, 0, i, entries, 0)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -3394,14 +3382,14 @@ QDF_STATUS dp_mon_rings_setup(struct dp_soc *soc, struct dp_pdev *pdev) pdev_cfg_ctx = pdev->wlan_cfg_ctx; for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id); + int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); if (soc->wlan_cfg_ctx->rxdma1_enable) { entries = wlan_cfg_get_dma_mon_buf_ring_size(pdev_cfg_ctx); if (dp_srng_setup(soc, - &pdev->rxdma_mon_buf_ring[mac_id], - RXDMA_MONITOR_BUF, 0, mac_for_pdev, + &soc->rxdma_mon_buf_ring[lmac_id], + RXDMA_MONITOR_BUF, 0, lmac_id, entries, 0)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -3412,8 +3400,8 @@ QDF_STATUS dp_mon_rings_setup(struct dp_soc *soc, struct dp_pdev *pdev) entries = wlan_cfg_get_dma_mon_dest_ring_size(pdev_cfg_ctx); if (dp_srng_setup(soc, - &pdev->rxdma_mon_dst_ring[mac_id], - RXDMA_MONITOR_DST, 0, mac_for_pdev, + &soc->rxdma_mon_dst_ring[lmac_id], + RXDMA_MONITOR_DST, 0, lmac_id, entries, 0)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -3424,8 +3412,8 @@ QDF_STATUS dp_mon_rings_setup(struct dp_soc *soc, struct dp_pdev *pdev) entries = wlan_cfg_get_dma_mon_stat_ring_size(pdev_cfg_ctx); if (dp_srng_setup(soc, - &pdev->rxdma_mon_status_ring[mac_id], - RXDMA_MONITOR_STATUS, 0, mac_for_pdev, + &soc->rxdma_mon_status_ring[lmac_id], + RXDMA_MONITOR_STATUS, 0, lmac_id, entries, 0)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -3436,8 +3424,8 @@ QDF_STATUS dp_mon_rings_setup(struct dp_soc *soc, struct dp_pdev *pdev) entries = wlan_cfg_get_dma_mon_desc_ring_size(pdev_cfg_ctx); if (dp_srng_setup(soc, - &pdev->rxdma_mon_desc_ring[mac_id], - RXDMA_MONITOR_DESC, 0, mac_for_pdev, + &soc->rxdma_mon_desc_ring[lmac_id], + RXDMA_MONITOR_DESC, 0, lmac_id, entries, 0)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -3448,8 +3436,8 @@ QDF_STATUS dp_mon_rings_setup(struct dp_soc *soc, struct dp_pdev *pdev) entries = wlan_cfg_get_dma_mon_stat_ring_size(pdev_cfg_ctx); if (dp_srng_setup(soc, - &pdev->rxdma_mon_status_ring[mac_id], - RXDMA_MONITOR_STATUS, 0, mac_for_pdev, + &soc->rxdma_mon_status_ring[lmac_id], + RXDMA_MONITOR_STATUS, 0, lmac_id, entries, 0)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -3651,8 +3639,8 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, ring_size = wlan_cfg_get_dp_soc_rxdma_refill_ring_size(soc->wlan_cfg_ctx); - if (dp_srng_setup(soc, &pdev->rx_refill_buf_ring, RXDMA_BUF, 0, pdev_id, - ring_size, 0)) { + if (dp_srng_setup(soc, &soc->rx_refill_buf_ring[pdev->lmac_id], + RXDMA_BUF, 0, pdev->lmac_id, ring_size, 0)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, FL("dp_srng_setup failed rx refill ring")); goto fail1; @@ -3672,8 +3660,10 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, entries = wlan_cfg_get_dp_soc_rxdma_err_dst_ring_size(soc_cfg_ctx); if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) { - if (dp_srng_setup(soc, &pdev->rxdma_err_dst_ring[0], RXDMA_DST, - 0, pdev_id, entries, 0)) { + if (dp_srng_setup(soc, + &soc->rxdma_err_dst_ring[pdev->lmac_id], + RXDMA_DST, + 0, pdev->lmac_id, entries, 0)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, FL(RNG_ERR "rxdma_err_dst_ring")); goto fail1; @@ -3871,35 +3861,35 @@ static void dp_mon_ring_cleanup(struct dp_soc *soc, struct dp_pdev *pdev, int mac_id) { - if (soc->wlan_cfg_ctx->rxdma1_enable) { - dp_srng_cleanup(soc, - &pdev->rxdma_mon_buf_ring[mac_id], - RXDMA_MONITOR_BUF, 0); + if (soc->wlan_cfg_ctx->rxdma1_enable) { + dp_srng_cleanup(soc, + &soc->rxdma_mon_buf_ring[mac_id], + RXDMA_MONITOR_BUF, 0); - dp_srng_cleanup(soc, - &pdev->rxdma_mon_dst_ring[mac_id], - RXDMA_MONITOR_DST, 0); + dp_srng_cleanup(soc, + &soc->rxdma_mon_dst_ring[mac_id], + RXDMA_MONITOR_DST, 0); - dp_srng_cleanup(soc, - &pdev->rxdma_mon_status_ring[mac_id], - RXDMA_MONITOR_STATUS, 0); + dp_srng_cleanup(soc, + &soc->rxdma_mon_status_ring[mac_id], + RXDMA_MONITOR_STATUS, 0); - dp_srng_cleanup(soc, - &pdev->rxdma_mon_desc_ring[mac_id], - RXDMA_MONITOR_DESC, 0); + dp_srng_cleanup(soc, + &soc->rxdma_mon_desc_ring[mac_id], + RXDMA_MONITOR_DESC, 0); - dp_srng_cleanup(soc, - &pdev->rxdma_err_dst_ring[mac_id], - RXDMA_DST, 0); - } else { - dp_srng_cleanup(soc, - &pdev->rxdma_mon_status_ring[mac_id], - RXDMA_MONITOR_STATUS, 0); + dp_srng_cleanup(soc, + &soc->rxdma_err_dst_ring[mac_id], + RXDMA_DST, 0); + } else { + dp_srng_cleanup(soc, + &soc->rxdma_mon_status_ring[mac_id], + RXDMA_MONITOR_STATUS, 0); - dp_srng_cleanup(soc, - &pdev->rxdma_err_dst_ring[mac_id], - RXDMA_DST, 0); - } + dp_srng_cleanup(soc, + &soc->rxdma_err_dst_ring[mac_id], + RXDMA_DST, 0); + } } #else @@ -4039,13 +4029,18 @@ static void dp_pdev_deinit(struct cdp_pdev *txrx_pdev, int force) REO_DST, pdev->pdev_id); } - dp_srng_deinit(soc, &pdev->rx_refill_buf_ring, RXDMA_BUF, 0); + dp_srng_deinit(soc, &soc->rx_refill_buf_ring[pdev->lmac_id], + RXDMA_BUF, 0); dp_rxdma_ring_cleanup(soc, pdev); for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - dp_mon_ring_deinit(soc, pdev, mac_id); - dp_srng_deinit(soc, &pdev->rxdma_err_dst_ring[mac_id], + int lmac_id = + dp_get_lmac_id_for_pdev_id(soc, pdev->pdev_id, mac_id); + + dp_mon_ring_deinit(soc, pdev, lmac_id); + + dp_srng_deinit(soc, &soc->rxdma_err_dst_ring[lmac_id], RXDMA_DST, 0); } @@ -4120,6 +4115,7 @@ static void dp_pdev_detach(struct cdp_pdev *txrx_pdev, int force) struct dp_soc *soc = pdev->soc; struct rx_desc_pool *rx_desc_pool; int mac_id, mac_for_pdev; + int lmac_id; if (wlan_cfg_per_pdev_tx_ring(soc->wlan_cfg_ctx)) { dp_srng_cleanup(soc, &soc->tcl_data_ring[pdev->pdev_id], @@ -4138,16 +4134,21 @@ static void dp_pdev_detach(struct cdp_pdev *txrx_pdev, int force) dp_rxdma_ring_cleanup(soc, pdev); wlan_cfg_pdev_detach(pdev->wlan_cfg_ctx); - dp_srng_cleanup(soc, &pdev->rx_refill_buf_ring, RXDMA_BUF, 0); + dp_srng_cleanup(soc, &soc->rx_refill_buf_ring[pdev->lmac_id], + RXDMA_BUF, 0); dp_cleanup_ipa_rx_refill_buf_ring(soc, pdev); for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - dp_mon_ring_cleanup(soc, pdev, mac_id); - dp_srng_cleanup(soc, &pdev->rxdma_err_dst_ring[mac_id], + lmac_id = + dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev->pdev_id); + dp_mon_ring_cleanup(soc, pdev, lmac_id); + dp_srng_cleanup(soc, &soc->rxdma_err_dst_ring[lmac_id], RXDMA_DST, 0); + if (dp_is_soc_reinit(soc)) { - mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); + mac_for_pdev = + dp_get_lmac_id_for_pdev_id(soc, mac_id, + pdev->pdev_id); rx_desc_pool = &soc->rx_desc_status[mac_for_pdev]; dp_rx_desc_pool_free(soc, rx_desc_pool); rx_desc_pool = &soc->rx_desc_mon[mac_for_pdev]; @@ -4465,7 +4466,7 @@ static QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, if (soc->wlan_cfg_ctx->rxdma1_enable) { status = htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_buf_ring[mac_id] + soc->rxdma_mon_buf_ring[mac_id] .hal_srng, RXDMA_MONITOR_BUF); @@ -4475,7 +4476,7 @@ static QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, } status = htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_dst_ring[mac_id] + soc->rxdma_mon_dst_ring[mac_id] .hal_srng, RXDMA_MONITOR_DST); @@ -4485,7 +4486,7 @@ static QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, } status = htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id] + soc->rxdma_mon_status_ring[mac_id] .hal_srng, RXDMA_MONITOR_STATUS); @@ -4495,7 +4496,7 @@ static QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, } status = htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_desc_ring[mac_id] + soc->rxdma_mon_desc_ring[mac_id] .hal_srng, RXDMA_MONITOR_DESC); @@ -4505,7 +4506,7 @@ static QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, } } else { status = htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id] + soc->rxdma_mon_status_ring[mac_id] .hal_srng, RXDMA_MONITOR_STATUS); @@ -4554,10 +4555,12 @@ static QDF_STATUS dp_rxdma_ring_config(struct dp_soc *soc) int max_mac_rings = wlan_cfg_get_num_mac_rings (pdev->wlan_cfg_ctx); + int lmac_id = dp_get_lmac_id_for_pdev_id(soc, 0, i); htt_srng_setup(soc->htt_handle, 0, - pdev->rx_refill_buf_ring.hal_srng, - RXDMA_BUF); + soc->rx_refill_buf_ring[lmac_id] + .hal_srng, + RXDMA_BUF); if (pdev->rx_refill_buf_ring2.hal_srng) htt_srng_setup(soc->htt_handle, 0, @@ -4589,9 +4592,17 @@ static QDF_STATUS dp_rxdma_ring_config(struct dp_soc *soc) pdev->pdev_id, max_mac_rings); for (mac_id = 0; mac_id < max_mac_rings; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev( - mac_id, pdev->pdev_id); - + int mac_for_pdev = + dp_get_mac_id_for_pdev(mac_id, + pdev->pdev_id); + /* + * Obtain lmac id from pdev to access the LMAC + * ring in soc context + */ + lmac_id = + dp_get_lmac_id_for_pdev_id(soc, + mac_id, + pdev->pdev_id); QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, FL("mac_id %d"), mac_for_pdev); @@ -4601,13 +4612,13 @@ static QDF_STATUS dp_rxdma_ring_config(struct dp_soc *soc) .hal_srng, RXDMA_BUF); htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_err_dst_ring[mac_id] - .hal_srng, + soc->rxdma_err_dst_ring[lmac_id] + .hal_srng, RXDMA_DST); /* Configure monitor mode rings */ status = dp_mon_htt_srng_setup(soc, pdev, - mac_id, + lmac_id, mac_for_pdev); if (status != QDF_STATUS_SUCCESS) { dp_err("Failed to send htt monitor messages to target"); @@ -4633,38 +4644,40 @@ static QDF_STATUS dp_rxdma_ring_config(struct dp_soc *soc) static QDF_STATUS dp_rxdma_ring_config(struct dp_soc *soc) { int i; - int mac_id; QDF_STATUS status = QDF_STATUS_SUCCESS; + int mac_for_pdev; + int lmac_id; for (i = 0; i < MAX_PDEV_CNT; i++) { - struct dp_pdev *pdev = soc->pdev_list[i]; + struct dp_pdev *pdev = soc->pdev_list[i]; if (!pdev) continue; - for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, i); + mac_for_pdev = i; + lmac_id = dp_get_lmac_id_for_pdev_id(soc, 0, i); - htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rx_refill_buf_ring.hal_srng, RXDMA_BUF); + htt_srng_setup(soc->htt_handle, mac_for_pdev, + soc->rx_refill_buf_ring[lmac_id]. + hal_srng, RXDMA_BUF); #ifndef DISABLE_MON_CONFIG - htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_buf_ring[mac_id].hal_srng, - RXDMA_MONITOR_BUF); - htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_dst_ring[mac_id].hal_srng, - RXDMA_MONITOR_DST); - htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id].hal_srng, - RXDMA_MONITOR_STATUS); - htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_desc_ring[mac_id].hal_srng, - RXDMA_MONITOR_DESC); + + htt_srng_setup(soc->htt_handle, mac_for_pdev, + soc->rxdma_mon_buf_ring[lmac_id].hal_srng, + RXDMA_MONITOR_BUF); + htt_srng_setup(soc->htt_handle, mac_for_pdev, + soc->rxdma_mon_dst_ring[lmac_id].hal_srng, + RXDMA_MONITOR_DST); + htt_srng_setup(soc->htt_handle, mac_for_pdev, + soc->rxdma_mon_status_ring[lmac_id].hal_srng, + RXDMA_MONITOR_STATUS); + htt_srng_setup(soc->htt_handle, mac_for_pdev, + soc->rxdma_mon_desc_ring[lmac_id].hal_srng, + RXDMA_MONITOR_DESC); #endif - htt_srng_setup(soc->htt_handle, mac_for_pdev, - pdev->rxdma_err_dst_ring[mac_id].hal_srng, - RXDMA_DST); - } + htt_srng_setup(soc->htt_handle, mac_for_pdev, + soc->rxdma_err_dst_ring[lmac_id].hal_srng, + RXDMA_DST); } /* Configure LMAC rings in Polled mode */ @@ -4742,11 +4755,19 @@ dp_rxdma_ring_sel_cfg(struct dp_soc *soc) continue; for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); + int mac_for_pdev = + dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id); + /* + * Obtain lmac id from pdev to access the LMAC ring + * in soc context + */ + int lmac_id = + dp_get_lmac_id_for_pdev_id(soc, mac_id, + pdev->pdev_id); htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, - pdev->rx_refill_buf_ring.hal_srng, + soc->rx_refill_buf_ring[lmac_id]. + hal_srng, RXDMA_BUF, RX_BUFFER_SIZE, &htt_tlv_filter); } @@ -6494,7 +6515,7 @@ static struct cdp_cfg *dp_get_ctrl_pdev_from_vdev_wifi3( * dp_monitor_mode_ring_config() - Send the tlv config to fw for monitor buffer * ring based on target * @soc: soc handle - * @mac_for_pdev: pdev_id + * @mac_for_pdev: WIN- pdev_id, MCL- mac id * @pdev: physical device handle * @ring_num: mac id * @htt_tlv_filter: tlv filter @@ -6510,7 +6531,7 @@ QDF_STATUS dp_monitor_mode_ring_config(struct dp_soc *soc, uint8_t mac_for_pdev, if (soc->wlan_cfg_ctx->rxdma1_enable) status = htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_buf_ring[ring_num] + soc->rxdma_mon_buf_ring[ring_num] .hal_srng, RXDMA_MONITOR_BUF, RX_BUFFER_SIZE, &htt_tlv_filter); @@ -6555,9 +6576,13 @@ QDF_STATUS dp_reset_monitor_mode(struct cdp_pdev *pdev_handle) for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id); - + /* + * Obtain lmac id from pdev to access the ring in soc + * context + */ + int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); status = dp_monitor_mode_ring_config(soc, mac_for_pdev, - pdev, mac_id, + pdev, lmac_id, htt_tlv_filter); if (status != QDF_STATUS_SUCCESS) { @@ -6567,9 +6592,10 @@ QDF_STATUS dp_reset_monitor_mode(struct cdp_pdev *pdev_handle) } htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id].hal_srng, - RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, - &htt_tlv_filter); + soc->rxdma_mon_status_ring[lmac_id] + .hal_srng, + RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, + &htt_tlv_filter); } pdev->monitor_vdev = NULL; @@ -6719,9 +6745,14 @@ QDF_STATUS dp_pdev_configure_monitor_rings(struct dp_pdev *pdev) for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id); + /* + * Obtain lmac id from pdev to access the LMAC ring in soc + * context + */ + int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); status = dp_monitor_mode_ring_config(soc, mac_for_pdev, - pdev, mac_id, + pdev, lmac_id, htt_tlv_filter); if (status != QDF_STATUS_SUCCESS) { @@ -6778,8 +6809,13 @@ QDF_STATUS dp_pdev_configure_monitor_rings(struct dp_pdev *pdev) htt_tlv_filter.offset_valid = false; for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); + int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id); + /* + * Obtain lmac id from pdev to access the LMAC ring in soc + * context + */ + int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); + /* * If two back to back HTT msg sending happened in * short time, the second HTT msg source SRNG HP @@ -6795,8 +6831,10 @@ QDF_STATUS dp_pdev_configure_monitor_rings(struct dp_pdev *pdev) qdf_udelay(100); htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id].hal_srng, - RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter); + soc->rxdma_mon_status_ring[lmac_id] + .hal_srng, + RXDMA_MONITOR_STATUS, + RX_BUFFER_SIZE, &htt_tlv_filter); } return status; @@ -6906,9 +6944,14 @@ dp_pdev_set_advance_monitor_filter(struct cdp_pdev *pdev_handle, for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id); + /* + * Obtain lmac id from pdev to access the LMAC ring in soc + * context + */ + int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); status = dp_monitor_mode_ring_config(soc, mac_for_pdev, - pdev, mac_id, + pdev, lmac_id, htt_tlv_filter); if (status != QDF_STATUS_SUCCESS) { @@ -6917,7 +6960,7 @@ dp_pdev_set_advance_monitor_filter(struct cdp_pdev *pdev_handle, } htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id].hal_srng, + soc->rxdma_mon_status_ring[lmac_id].hal_srng, RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter); } @@ -6952,9 +6995,14 @@ dp_pdev_set_advance_monitor_filter(struct cdp_pdev *pdev_handle, for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id); + /* + * Obtain lmac id from pdev to access the LMAC ring in soc + * context + */ + int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); status = dp_monitor_mode_ring_config(soc, mac_for_pdev, - pdev, mac_id, + pdev, lmac_id, htt_tlv_filter); if (status != QDF_STATUS_SUCCESS) { @@ -6991,11 +7039,19 @@ dp_pdev_set_advance_monitor_filter(struct cdp_pdev *pdev_handle, htt_tlv_filter.offset_valid = false; for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); + int mac_for_pdev = + dp_get_mac_id_for_pdev(mac_id, + pdev->pdev_id); + /* + * Obtain lmac id from pdev to access the LMAC ring in soc + * context + */ + int lmac_id = + dp_get_lmac_id_for_pdev_id(soc, + mac_id, pdev->pdev_id); htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id].hal_srng, + soc->rxdma_mon_status_ring[lmac_id].hal_srng, RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter); } @@ -7685,11 +7741,18 @@ dp_ppdu_ring_reset(struct dp_pdev *pdev) qdf_mem_zero(&(htt_tlv_filter), sizeof(htt_tlv_filter)); for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); + int mac_for_pdev = + dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id); + /* + * Obtain lmac id from pdev to access the LMAC ring in soc + * context + */ + int lmac_id = + dp_get_lmac_id_for_pdev_id(pdev->soc, + mac_id, pdev->pdev_id); htt_h2t_rx_ring_cfg(pdev->soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id].hal_srng, + pdev->soc->rxdma_mon_status_ring[lmac_id].hal_srng, RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter); } } @@ -7743,9 +7806,16 @@ dp_ppdu_ring_cfg(struct dp_pdev *pdev) for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id); + /* + * Obtain lmac id from pdev to access the LMAC ring in soc + * context + */ + int lmac_id = + dp_get_lmac_id_for_pdev_id(pdev->soc, + mac_id, pdev->pdev_id); htt_h2t_rx_ring_cfg(pdev->soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id].hal_srng, + pdev->soc->rxdma_mon_status_ring[lmac_id].hal_srng, RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter); } } @@ -9072,24 +9142,48 @@ dp_soc_set_dp_txrx_handle(struct cdp_soc *soc_handle, void *txrx_handle) * @soc_hdl: datapath soc handle * @pdev_id: id of the datapath pdev handle * @lmac_id: lmac id + * @mode_change: flag to indicate a mode change * * Return: QDF_STATUS */ static QDF_STATUS -dp_soc_map_pdev_to_lmac(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, - uint32_t lmac_id) +dp_soc_map_pdev_to_lmac + (struct cdp_soc_t *soc_hdl, uint8_t pdev_id, + uint32_t lmac_id, bool mode_change) { struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); + struct dp_vdev *vdev = NULL; + int hw_pdev_id; if (qdf_unlikely(!pdev)) return QDF_STATUS_E_FAILURE; pdev->lmac_id = lmac_id; - wlan_cfg_set_hw_macid(soc->wlan_cfg_ctx, - pdev_id, - (lmac_id + 1)); + dp_info(" mode change %d %d\n", pdev->pdev_id, pdev->lmac_id); + + if (!mode_change) { + wlan_cfg_set_hw_mac_idx(soc->wlan_cfg_ctx, + pdev->pdev_id, + lmac_id); + } + + /*Set host PDEV ID for lmac_id*/ + wlan_cfg_set_pdev_idx(soc->wlan_cfg_ctx, + pdev->pdev_id, + lmac_id); + + hw_pdev_id = + dp_get_target_pdev_id_for_host_pdev_id(soc, + pdev->pdev_id); + + qdf_spin_lock_bh(&pdev->vdev_list_lock); + TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) { + HTT_TX_TCL_METADATA_PDEV_ID_SET(vdev->htt_tcl_metadata, + hw_pdev_id); + } + qdf_spin_unlock_bh(&pdev->vdev_list_lock); return QDF_STATUS_SUCCESS; } @@ -10934,17 +11028,26 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, for (mac_id = 0; mac_id < max_mac_rings; mac_id++) { + int pdev_id = pdev->pdev_id; int mac_for_pdev = - dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); + dp_get_mac_id_for_pdev(mac_id, + pdev_id); + /* + * Obtain LMAC id from pdev for + * accessing LMAC ring from SOC + */ + int lmac_id = + dp_get_lmac_id_for_pdev_id(soc, + mac_id, + pdev_id); htt_h2t_rx_ring_cfg(soc->htt_handle, - mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id] - .hal_srng, - RXDMA_MONITOR_STATUS, - RX_BUFFER_SIZE, - &htt_tlv_filter); + mac_for_pdev, + soc->rxdma_mon_status_ring[lmac_id] + .hal_srng, + RXDMA_MONITOR_STATUS, + RX_BUFFER_SIZE, + &htt_tlv_filter); } @@ -10982,13 +11085,22 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, for (mac_id = 0; mac_id < max_mac_rings; mac_id++) { + int pdev_id = pdev->pdev_id; int mac_for_pdev = - dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); + dp_get_mac_id_for_pdev(mac_id, + pdev_id); + /* + * Obtain lmac id from pdev to access + * the LMAC ring in soc context + */ + int lmac_id = + dp_get_lmac_id_for_pdev_id(soc, + mac_id, + pdev_id); htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id] + soc->rxdma_mon_status_ring[lmac_id] .hal_srng, RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE_PKTLOG_LITE, @@ -11039,17 +11151,26 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, for (mac_id = 0; mac_id < max_mac_rings; mac_id++) { + int pdev_id = pdev->pdev_id; int mac_for_pdev = - dp_get_mac_id_for_pdev(mac_id, - pdev->pdev_id); + dp_get_mac_id_for_pdev(mac_id, + pdev_id); + /* + * Obtain lmac id from pdev to access + * the LMAC ring in soc context + */ + int lmac_id = + dp_get_lmac_id_for_pdev_id(soc, + mac_id, + pdev_id); htt_h2t_rx_ring_cfg(soc->htt_handle, - mac_for_pdev, - pdev->rxdma_mon_status_ring[mac_id] - .hal_srng, - RXDMA_MONITOR_STATUS, - RX_BUFFER_SIZE, - &htt_tlv_filter); + mac_for_pdev, + soc->rxdma_mon_status_ring[lmac_id] + .hal_srng, + RXDMA_MONITOR_STATUS, + RX_BUFFER_SIZE, + &htt_tlv_filter); } if (soc->reap_timer_init) diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index b65e14bf7f..ab624a5ceb 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -114,7 +114,7 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, { uint32_t num_alloc_desc; uint16_t num_desc_to_free = 0; - struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(dp_soc, mac_id); + struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(dp_soc, mac_id); uint32_t num_entries_avail; uint32_t count; int sync_hw_ptr = 1; @@ -761,7 +761,7 @@ uint8_t dp_rx_process_invalid_peer(struct dp_soc *soc, qdf_nbuf_t mpdu, goto free; } - pdev = dp_get_pdev_for_mac_id(soc, mac_id); + pdev = dp_get_pdev_for_lmac_id(soc, mac_id); if (!pdev || qdf_unlikely(pdev->is_pdev_down)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -863,7 +863,7 @@ uint8_t dp_rx_process_invalid_peer(struct dp_soc *soc, qdf_nbuf_t mpdu, goto free; } - pdev = dp_get_pdev_for_mac_id(soc, mac_id); + pdev = dp_get_pdev_for_lmac_id(soc, mac_id); if (!pdev) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -891,6 +891,13 @@ out: if (soc->cdp_soc.ol_ops->rx_invalid_peer) soc->cdp_soc.ol_ops->rx_invalid_peer(vdev->vdev_id, wh); free: + /* reset the head and tail pointers */ + pdev = dp_get_pdev_for_lmac_id(soc, mac_id); + if (pdev) { + pdev->invalid_peer_head_msdu = NULL; + pdev->invalid_peer_tail_msdu = NULL; + } + /* Drop and free packet */ curr_nbuf = mpdu; while (curr_nbuf) { @@ -1725,7 +1732,6 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl, uint8_t *rx_tlv_hdr; uint32_t rx_bufs_reaped[MAX_PDEV_CNT]; uint8_t mac_id = 0; - struct dp_pdev *pdev; struct dp_pdev *rx_pdev; struct dp_srng *dp_rxdma_srng; struct rx_desc_pool *rx_desc_pool; @@ -1960,8 +1966,8 @@ done: if (!rx_bufs_reaped[mac_id]) continue; - pdev = soc->pdev_list[mac_id]; - dp_rxdma_srng = &pdev->rx_refill_buf_ring; + dp_rxdma_srng = &soc->rx_refill_buf_ring[mac_id]; + rx_desc_pool = &soc->rx_desc_buf[mac_id]; dp_rx_buffers_replenish(soc, mac_id, dp_rxdma_srng, @@ -2312,15 +2318,15 @@ QDF_STATUS dp_rx_vdev_detach(struct dp_vdev *vdev) void dp_rx_pdev_detach(struct dp_pdev *pdev) { - uint8_t pdev_id = pdev->pdev_id; + uint8_t mac_for_pdev = pdev->lmac_id; struct dp_soc *soc = pdev->soc; struct rx_desc_pool *rx_desc_pool; - rx_desc_pool = &soc->rx_desc_buf[pdev_id]; + rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev]; if (rx_desc_pool->pool_size != 0) { if (!dp_is_soc_reinit(soc)) - dp_rx_desc_nbuf_and_pool_free(soc, pdev_id, + dp_rx_desc_nbuf_and_pool_free(soc, mac_for_pdev, rx_desc_pool); else dp_rx_desc_nbuf_free(soc, rx_desc_pool); @@ -2375,7 +2381,7 @@ dp_pdev_rx_buffers_attach(struct dp_soc *dp_soc, uint32_t mac_id, struct rx_desc_pool *rx_desc_pool, uint32_t num_req_buffers) { - struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(dp_soc, mac_id); + struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(dp_soc, mac_id); hal_ring_handle_t rxdma_srng = dp_rxdma_srng->hal_srng; union dp_rx_desc_list_elem_t *next; void *rxdma_ring_entry; @@ -2513,7 +2519,7 @@ dp_rx_pdev_attach(struct dp_pdev *pdev) struct dp_srng *dp_rxdma_srng; struct rx_desc_pool *rx_desc_pool; QDF_STATUS ret_val; - + int mac_for_pdev; if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, @@ -2522,15 +2528,17 @@ dp_rx_pdev_attach(struct dp_pdev *pdev) } pdev = soc->pdev_list[pdev_id]; - dp_rxdma_srng = &pdev->rx_refill_buf_ring; + mac_for_pdev = pdev->lmac_id; + dp_rxdma_srng = &soc->rx_refill_buf_ring[mac_for_pdev]; + rxdma_entries = dp_rxdma_srng->num_entries; soc->process_rx_status = CONFIG_PROCESS_RX_STATUS; - rx_desc_pool = &soc->rx_desc_buf[pdev_id]; + rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev]; rx_sw_desc_weight = wlan_cfg_get_dp_soc_rx_sw_desc_weight(soc->wlan_cfg_ctx); - dp_rx_desc_pool_alloc(soc, pdev_id, + dp_rx_desc_pool_alloc(soc, mac_for_pdev, rx_sw_desc_weight * rxdma_entries, rx_desc_pool); @@ -2546,7 +2554,7 @@ dp_rx_pdev_attach(struct dp_pdev *pdev) return ret_val; } - return dp_pdev_rx_buffers_attach(soc, pdev_id, dp_rxdma_srng, + return dp_pdev_rx_buffers_attach(soc, mac_for_pdev, dp_rxdma_srng, rx_desc_pool, rxdma_entries - 1); } diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index b79ab85a42..0c4930e6e6 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -730,15 +730,16 @@ void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev, int mac_id) { void *link_desc_va; - int mac_for_pdev = dp_get_mac_id_for_mac(pdev->soc, mac_id); /* TODO */ /* Add sanity for cookie */ link_desc_va = - pdev->link_desc_banks[mac_for_pdev][buf_info->sw_cookie].base_vaddr + + pdev->soc->mon_link_desc_banks[mac_id][buf_info->sw_cookie] + .base_vaddr + (buf_info->paddr - - pdev->link_desc_banks[mac_for_pdev][buf_info->sw_cookie].base_paddr); + pdev->soc->mon_link_desc_banks[mac_id][buf_info->sw_cookie] + .base_paddr); return link_desc_va; } diff --git a/dp/wifi3.0/dp_rx_defrag.c b/dp/wifi3.0/dp_rx_defrag.c index 9c2ffe9673..78ac49fd5b 100644 --- a/dp/wifi3.0/dp_rx_defrag.c +++ b/dp/wifi3.0/dp_rx_defrag.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -96,13 +96,15 @@ static void dp_rx_return_head_frag_desc(struct dp_peer *peer, struct rx_desc_pool *rx_desc_pool; union dp_rx_desc_list_elem_t *head = NULL; union dp_rx_desc_list_elem_t *tail = NULL; + uint8_t pool_id; pdev = peer->vdev->pdev; soc = pdev->soc; if (peer->rx_tid[tid].head_frag_desc) { - dp_rxdma_srng = &pdev->rx_refill_buf_ring; - rx_desc_pool = &soc->rx_desc_buf[pdev->pdev_id]; + pool_id = peer->rx_tid[tid].head_frag_desc->pool_id; + dp_rxdma_srng = &soc->rx_refill_buf_ring[pool_id]; + rx_desc_pool = &soc->rx_desc_buf[pool_id]; dp_rx_add_to_free_desc_list(&head, &tail, peer->rx_tid[tid].head_frag_desc); diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index d3d91ba318..8b84b576ca 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -1303,7 +1303,7 @@ dp_rx_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, reo_error[HAL_REO_ERR_PN_CHECK_FAILED], 1); /* increment @pdev level */ - dp_pdev = dp_get_pdev_for_mac_id(soc, mac_id); + dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id); if (dp_pdev) DP_STATS_INC(dp_pdev, err.reo_error, 1); count = dp_rx_pn_error_handle(soc, @@ -1322,7 +1322,7 @@ dp_rx_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, reo_error[HAL_REO_ERR_REGULAR_FRAME_2K_JUMP], 1); /* increment @pdev level */ - dp_pdev = dp_get_pdev_for_mac_id(soc, mac_id); + dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id); if (dp_pdev) DP_STATS_INC(dp_pdev, err.reo_error, 1); @@ -1348,8 +1348,8 @@ done: for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) { if (rx_bufs_reaped[mac_id]) { - dp_pdev = soc->pdev_list[mac_id]; - dp_rxdma_srng = &dp_pdev->rx_refill_buf_ring; + dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id); + dp_rxdma_srng = &soc->rx_refill_buf_ring[mac_id]; rx_desc_pool = &soc->rx_desc_buf[mac_id]; dp_rx_buffers_replenish(soc, mac_id, dp_rxdma_srng, @@ -1489,8 +1489,8 @@ done: for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) { if (rx_bufs_reaped[mac_id]) { - dp_pdev = soc->pdev_list[mac_id]; - dp_rxdma_srng = &dp_pdev->rx_refill_buf_ring; + dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id); + dp_rxdma_srng = &soc->rx_refill_buf_ring[mac_id]; rx_desc_pool = &soc->rx_desc_buf[mac_id]; dp_rx_buffers_replenish(soc, mac_id, dp_rxdma_srng, @@ -1537,7 +1537,7 @@ done: [wbm_err_info.reo_err_code], 1); /* increment @pdev level */ pool_id = wbm_err_info.pool_id; - dp_pdev = dp_get_pdev_for_mac_id(soc, pool_id); + dp_pdev = dp_get_pdev_for_lmac_id(soc, pool_id); if (dp_pdev) DP_STATS_INC(dp_pdev, err.reo_error, 1); @@ -1600,7 +1600,7 @@ done: [wbm_err_info.rxdma_err_code], 1); /* increment @pdev level */ pool_id = wbm_err_info.pool_id; - dp_pdev = dp_get_pdev_for_mac_id(soc, pool_id); + dp_pdev = dp_get_pdev_for_lmac_id(soc, pool_id); if (dp_pdev) DP_STATS_INC(dp_pdev, err.rxdma_error, 1); @@ -1728,7 +1728,7 @@ dp_rx_err_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, uint8_t push_reason; uint8_t rxdma_error_code = 0; uint8_t bm_action = HAL_BM_ACTION_PUT_IN_IDLE_LIST; - struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id); + struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS]; hal_rxdma_desc_t ring_desc; @@ -1843,8 +1843,7 @@ uint32_t dp_rxdma_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, uint32_t mac_id, uint32_t quota) { - struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id); - int mac_for_pdev = dp_get_mac_id_for_mac(soc, mac_id); + struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); hal_rxdma_desc_t rxdma_dst_ring_desc; hal_soc_handle_t hal_soc; void *err_dst_srng; @@ -1858,7 +1857,7 @@ dp_rxdma_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, if (!pdev) return 0; - err_dst_srng = pdev->rxdma_err_dst_ring[mac_for_pdev].hal_srng; + err_dst_srng = soc->rxdma_err_dst_ring[mac_id].hal_srng; if (!err_dst_srng) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -1891,7 +1890,7 @@ dp_rxdma_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, dp_srng_access_end(int_ctx, soc, err_dst_srng); if (rx_bufs_used) { - dp_rxdma_srng = &pdev->rx_refill_buf_ring; + dp_rxdma_srng = &soc->rx_refill_buf_ring[mac_id]; rx_desc_pool = &soc->rx_desc_buf[mac_id]; dp_rx_buffers_replenish(soc, mac_id, dp_rxdma_srng, @@ -2044,7 +2043,7 @@ dp_handle_wbm_internal_error(struct dp_soc *soc, void *hal_desc, DP_STATS_INC(soc, tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED], 1); dp_pdev = soc->pdev_list[pool_id]; - dp_rxdma_srng = &dp_pdev->rx_refill_buf_ring; + dp_rxdma_srng = &soc->rx_refill_buf_ring[pool_id]; rx_desc_pool = &soc->rx_desc_buf[pool_id]; dp_rx_buffers_replenish(soc, pool_id, dp_rxdma_srng, diff --git a/dp/wifi3.0/dp_rx_mon_dest.c b/dp/wifi3.0/dp_rx_mon_dest.c index d8801399db..0c38728cf9 100644 --- a/dp/wifi3.0/dp_rx_mon_dest.c +++ b/dp/wifi3.0/dp_rx_mon_dest.c @@ -62,11 +62,10 @@ dp_rx_mon_link_desc_return(struct dp_pdev *dp_pdev, hal_soc_handle_t hal_soc; QDF_STATUS status = QDF_STATUS_E_FAILURE; void *src_srng_desc; - int mac_for_pdev = dp_get_mac_id_for_mac(dp_pdev->soc, mac_id); hal_soc = dp_pdev->soc->hal_soc; - dp_srng = &dp_pdev->rxdma_mon_desc_ring[mac_for_pdev]; + dp_srng = &dp_pdev->soc->rxdma_mon_desc_ring[mac_id]; hal_ring_hdl = dp_srng->hal_srng; qdf_assert(hal_ring_hdl); @@ -178,9 +177,9 @@ void *dp_rxdma_get_mon_dst_ring(struct dp_pdev *pdev, uint8_t mac_for_pdev) { if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) - return pdev->rxdma_mon_dst_ring[mac_for_pdev].hal_srng; + return pdev->soc->rxdma_mon_dst_ring[mac_for_pdev].hal_srng; - return pdev->rxdma_err_dst_ring[mac_for_pdev].hal_srng; + return pdev->soc->rxdma_err_dst_ring[mac_for_pdev].hal_srng; } /** @@ -196,9 +195,9 @@ struct dp_srng *dp_rxdma_get_mon_buf_ring(struct dp_pdev *pdev, uint8_t mac_for_pdev) { if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) - return &pdev->rxdma_mon_buf_ring[mac_for_pdev]; + return &pdev->soc->rxdma_mon_buf_ring[mac_for_pdev]; - return &pdev->rx_refill_buf_ring; + return &pdev->soc->rx_refill_buf_ring[mac_for_pdev]; } /** @@ -261,7 +260,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, union dp_rx_desc_list_elem_t **head, union dp_rx_desc_list_elem_t **tail) { - struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(soc, mac_id); + struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id); void *rx_desc_tlv; void *rx_msdu_link_desc; qdf_nbuf_t msdu; @@ -557,7 +556,7 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc, unsigned char *dest; struct ieee80211_frame *wh; struct ieee80211_qoscntl *qos; - struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(soc, mac_id); + struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id); head_frag_list = NULL; mpdu_buf = NULL; @@ -936,7 +935,7 @@ void dp_rx_extract_radiotap_info(struct cdp_mon_status *rx_status, QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id, qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu) { - struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id); + struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); struct cdp_mon_status *rs = &pdev->rx_mon_recv_status; qdf_nbuf_t mon_skb, skb_next; qdf_nbuf_t mon_mpdu = NULL; @@ -1011,7 +1010,7 @@ mon_deliver_fail: QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc, uint32_t mac_id) { - struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id); + struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); ol_txrx_rx_mon_fp osif_rx_mon; qdf_nbuf_t dummy_msdu; @@ -1073,7 +1072,7 @@ mon_deliver_non_std_fail: */ void dp_rx_mon_dest_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota) { - struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id); + struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); uint8_t pdev_id; hal_rxdma_desc_t rxdma_dst_ring_desc; hal_soc_handle_t hal_soc; @@ -1083,7 +1082,7 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota) uint32_t ppdu_id; uint32_t rx_bufs_used; uint32_t mpdu_rx_bufs_used; - int mac_for_pdev = dp_get_mac_id_for_mac(soc, mac_id); + int mac_for_pdev = mac_id; struct cdp_pdev_mon_stats *rx_mon_stats; mon_dst_srng = dp_rxdma_get_mon_dst_ring(pdev, mac_for_pdev); @@ -1205,10 +1204,9 @@ dp_rx_pdev_mon_buf_attach(struct dp_pdev *pdev, int mac_id) { uint32_t num_entries; struct rx_desc_pool *rx_desc_pool; QDF_STATUS status = QDF_STATUS_SUCCESS; - uint8_t mac_for_pdev = dp_get_mac_id_for_mac(soc, mac_id); uint32_t rx_desc_pool_size, replenish_size; - mon_buf_ring = &pdev->rxdma_mon_buf_ring[mac_for_pdev]; + mon_buf_ring = &soc->rxdma_mon_buf_ring[mac_id]; num_entries = mon_buf_ring->num_entries; @@ -1264,8 +1262,6 @@ dp_rx_pdev_mon_buf_detach(struct dp_pdev *pdev, int mac_id) static QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id) { - struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(soc, mac_id); - int mac_for_pdev = dp_get_mac_id_for_mac(soc, mac_id); int link_desc_size = hal_get_link_desc_size(soc->hal_soc); int link_desc_align = hal_get_link_desc_align(soc->hal_soc); uint32_t max_alloc_size = wlan_cfg_max_alloc_size(soc->wlan_cfg_ctx); @@ -1279,7 +1275,7 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id) int i; qdf_dma_addr_t *baseaddr = NULL; - dp_srng = &dp_pdev->rxdma_mon_desc_ring[mac_for_pdev]; + dp_srng = &soc->rxdma_mon_desc_ring[mac_id]; num_entries = dp_srng->alloc_size/hal_srng_get_entrysize( soc->hal_soc, RXDMA_MONITOR_DESC); @@ -1315,17 +1311,17 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id) __func__, max_alloc_size, last_bank_size); for (i = 0; i < num_link_desc_banks; i++) { - baseaddr = &dp_pdev->link_desc_banks[mac_for_pdev][i]. + baseaddr = &soc->mon_link_desc_banks[mac_id][i]. base_paddr_unaligned; if (!dp_is_soc_reinit(soc)) { - dp_pdev->link_desc_banks[mac_for_pdev][i]. + soc->mon_link_desc_banks[mac_id][i]. base_vaddr_unaligned = qdf_mem_alloc_consistent(soc->osdev, soc->osdev->dev, max_alloc_size, baseaddr); - if (!dp_pdev->link_desc_banks[mac_for_pdev][i]. + if (!soc->mon_link_desc_banks[mac_id][i]. base_vaddr_unaligned) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, @@ -1334,25 +1330,25 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id) goto fail; } } - dp_pdev->link_desc_banks[mac_for_pdev][i].size = max_alloc_size; + soc->mon_link_desc_banks[mac_id][i].size = max_alloc_size; - dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr = + soc->mon_link_desc_banks[mac_id][i].base_vaddr = (void *)((unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i]. + (soc->mon_link_desc_banks[mac_id][i]. base_vaddr_unaligned) + ((unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i]. + (soc->mon_link_desc_banks[mac_id][i]. base_vaddr_unaligned) % link_desc_align)); - dp_pdev->link_desc_banks[mac_for_pdev][i].base_paddr = + soc->mon_link_desc_banks[mac_id][i].base_paddr = (unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i]. + (soc->mon_link_desc_banks[mac_id][i]. base_paddr_unaligned) + ((unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr) - + (soc->mon_link_desc_banks[mac_id][i].base_vaddr) - (unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i]. + (soc->mon_link_desc_banks[mac_id][i]. base_vaddr_unaligned)); } @@ -1360,17 +1356,17 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id) /* Allocate last bank in case total memory required is not exact * multiple of max_alloc_size */ - baseaddr = &dp_pdev->link_desc_banks[mac_for_pdev][i]. + baseaddr = &soc->mon_link_desc_banks[mac_id][i]. base_paddr_unaligned; if (!dp_is_soc_reinit(soc)) { - dp_pdev->link_desc_banks[mac_for_pdev][i]. + soc->mon_link_desc_banks[mac_id][i]. base_vaddr_unaligned = qdf_mem_alloc_consistent(soc->osdev, soc->osdev->dev, last_bank_size, baseaddr); - if (!dp_pdev->link_desc_banks[mac_for_pdev][i]. + if (!soc->mon_link_desc_banks[mac_id][i]. base_vaddr_unaligned) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, @@ -1379,33 +1375,34 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id) goto fail; } } - dp_pdev->link_desc_banks[mac_for_pdev][i].size = last_bank_size; + soc->mon_link_desc_banks[mac_id][i].size = + last_bank_size; - dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr = + soc->mon_link_desc_banks[mac_id][i].base_vaddr = (void *)((unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_vaddr_unaligned) + + (soc->mon_link_desc_banks[mac_id][i]. + base_vaddr_unaligned) + ((unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_vaddr_unaligned) % + (soc->mon_link_desc_banks[mac_id][i]. + base_vaddr_unaligned) % link_desc_align)); - dp_pdev->link_desc_banks[mac_for_pdev][i].base_paddr = + soc->mon_link_desc_banks[mac_id][i].base_paddr = (unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_paddr_unaligned) + + (soc->mon_link_desc_banks[mac_id][i]. + base_paddr_unaligned) + ((unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr) - + (soc->mon_link_desc_banks[mac_id][i].base_vaddr) - (unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_vaddr_unaligned)); + (soc->mon_link_desc_banks[mac_id][i]. + base_vaddr_unaligned)); } /* Allocate and setup link descriptor idle list for HW internal use */ entry_size = hal_srng_get_entrysize(soc->hal_soc, RXDMA_MONITOR_DESC); total_mem_size = entry_size * total_link_descs; - mon_desc_srng = dp_pdev->rxdma_mon_desc_ring[mac_for_pdev].hal_srng; + mon_desc_srng = soc->rxdma_mon_desc_ring[mac_id].hal_srng; num_replenish_buf = 0; @@ -1414,22 +1411,22 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id) for (i = 0; - i < MAX_MON_LINK_DESC_BANKS && - dp_pdev->link_desc_banks[mac_for_pdev][i].base_paddr; - i++) { + i < MAX_MON_LINK_DESC_BANKS && + soc->mon_link_desc_banks[mac_id][i].base_paddr; + i++) { uint32_t num_entries = - (dp_pdev->link_desc_banks[mac_for_pdev][i].size - + (soc->mon_link_desc_banks[mac_id][i].size - (unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr) - + (soc->mon_link_desc_banks[mac_id][i].base_vaddr) - (unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i]. + (soc->mon_link_desc_banks[mac_id][i]. base_vaddr_unaligned)) / link_desc_size; unsigned long paddr = (unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i].base_paddr); + (soc->mon_link_desc_banks[mac_id][i].base_paddr); unsigned long vaddr = (unsigned long) - (dp_pdev->link_desc_banks[mac_for_pdev][i].base_vaddr); + (soc->mon_link_desc_banks[mac_id][i].base_vaddr); hal_srng_access_start_unlocked(soc->hal_soc, mon_desc_srng); @@ -1438,7 +1435,7 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id) hal_srng_src_get_next(soc->hal_soc, mon_desc_srng))) { - hal_set_link_desc_addr(desc, i, paddr); + hal_set_link_desc_addr(desc, i, paddr); num_entries--; num_replenish_buf++; paddr += link_desc_size; @@ -1459,16 +1456,17 @@ QDF_STATUS dp_mon_link_desc_pool_setup(struct dp_soc *soc, uint32_t mac_id) fail: for (i = 0; i < MAX_MON_LINK_DESC_BANKS; i++) { - if (dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_vaddr_unaligned) { - qdf_mem_free_consistent(soc->osdev, soc->osdev->dev, - dp_pdev->link_desc_banks[mac_for_pdev][i].size, - dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_vaddr_unaligned, - dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_paddr_unaligned, 0); - dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_vaddr_unaligned = NULL; + if (soc->mon_link_desc_banks[mac_id][i]. + base_vaddr_unaligned) { + qdf_mem_free_consistent(soc->osdev, soc->osdev->dev, + soc->mon_link_desc_banks[mac_id][i]. + size, + soc->mon_link_desc_banks[mac_id][i]. + base_vaddr_unaligned, + soc->mon_link_desc_banks[mac_id][i]. + base_paddr_unaligned, 0); + soc->mon_link_desc_banks[mac_id][i]. + base_vaddr_unaligned = NULL; } } return QDF_STATUS_E_FAILURE; @@ -1480,21 +1478,20 @@ fail: static void dp_mon_link_desc_pool_cleanup(struct dp_soc *soc, uint32_t mac_id) { - struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(soc, mac_id); - int mac_for_pdev = dp_get_mac_id_for_mac(soc, mac_id); int i; for (i = 0; i < MAX_MON_LINK_DESC_BANKS; i++) { - if (dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_vaddr_unaligned) { - qdf_mem_free_consistent(soc->osdev, soc->osdev->dev, - dp_pdev->link_desc_banks[mac_for_pdev][i].size, - dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_vaddr_unaligned, - dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_paddr_unaligned, 0); - dp_pdev->link_desc_banks[mac_for_pdev][i]. - base_vaddr_unaligned = NULL; + if (soc->mon_link_desc_banks[mac_id][i]. + base_vaddr_unaligned) { + qdf_mem_free_consistent(soc->osdev, soc->osdev->dev, + soc->mon_link_desc_banks[mac_id][i]. + size, + soc->mon_link_desc_banks[mac_id][i]. + base_vaddr_unaligned, + soc->mon_link_desc_banks[mac_id][i]. + base_paddr_unaligned, 0); + soc->mon_link_desc_banks[mac_id][i]. + base_vaddr_unaligned = NULL; } } } @@ -1512,27 +1509,25 @@ void dp_mon_buf_delayed_replenish(struct dp_pdev *pdev) union dp_rx_desc_list_elem_t *tail = NULL; union dp_rx_desc_list_elem_t *desc_list = NULL; uint32_t num_entries; - uint32_t mac_id, id; + uint32_t id; soc = pdev->soc; num_entries = wlan_cfg_get_dma_mon_buf_ring_size(pdev->wlan_cfg_ctx); for (id = 0; id < NUM_RXDMA_RINGS_PER_PDEV; id++) { - mac_for_pdev = dp_get_mac_id_for_pdev(id, - pdev->pdev_id); - /* - * Map mac_for_pdev appropriately for both MCL & WIN, + * Get mac_for_pdev appropriately for both MCL & WIN, * since MCL have multiple mon buf rings and WIN just - * has one mon buffer ring, below API helps identify - * accurate buffer_ring for both cases + * has one mon buffer ring mapped per pdev, below API + * helps identify accurate buffer_ring for both cases * */ - mac_id = dp_get_mac_id_for_mac(soc, mac_for_pdev); + mac_for_pdev = + dp_get_lmac_id_for_pdev_id(soc, id, pdev->pdev_id); dp_rx_buffers_replenish(soc, mac_for_pdev, dp_rxdma_get_mon_buf_ring(pdev, - mac_id), + mac_for_pdev), dp_rx_get_mon_desc_pool(soc, mac_for_pdev, pdev->pdev_id), @@ -1582,7 +1577,7 @@ static QDF_STATUS dp_rx_pdev_mon_cmn_detach(struct dp_pdev *pdev, int mac_id) { struct dp_soc *soc = pdev->soc; uint8_t pdev_id = pdev->pdev_id; - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id); + int mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); dp_mon_link_desc_pool_cleanup(soc, mac_for_pdev); dp_rx_pdev_mon_status_detach(pdev, mac_for_pdev); @@ -1606,7 +1601,7 @@ static QDF_STATUS dp_rx_pdev_mon_cmn_attach(struct dp_pdev *pdev, int mac_id) { struct dp_soc *soc = pdev->soc; uint8_t pdev_id = pdev->pdev_id; - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id); + int mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); QDF_STATUS status; status = dp_rx_pdev_mon_buf_attach(pdev, mac_for_pdev); @@ -1688,7 +1683,8 @@ dp_mon_link_free(struct dp_pdev *pdev) { int mac_id; for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id); + int mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, + mac_id, pdev_id); dp_mon_link_desc_pool_cleanup(soc, mac_for_pdev); } @@ -1713,7 +1709,8 @@ dp_rx_pdev_mon_detach(struct dp_pdev *pdev) { qdf_spinlock_destroy(&pdev->mon_lock); for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - int mac_for_pdev = dp_get_mac_id_for_pdev(mac_id, pdev_id); + int mac_for_pdev = dp_get_lmac_id_for_pdev_id(pdev->soc, + mac_id, pdev_id); dp_rx_pdev_mon_status_detach(pdev, mac_for_pdev); dp_rx_pdev_mon_buf_detach(pdev, mac_for_pdev); diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index 2834b05ea4..0b0ab47676 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -1370,7 +1370,7 @@ static inline void dp_rx_mon_status_process_tlv(struct dp_soc *soc, uint32_t mac_id, uint32_t quota) { - struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id); + struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); struct hal_rx_ppdu_info *ppdu_info; qdf_nbuf_t status_nbuf; uint8_t *rx_tlv; @@ -1522,15 +1522,14 @@ static inline uint32_t dp_rx_mon_status_srng_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota) { - struct dp_pdev *pdev = dp_get_pdev_for_mac_id(soc, mac_id); + struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); hal_soc_handle_t hal_soc; void *mon_status_srng; void *rxdma_mon_status_ring_entry; QDF_STATUS status; uint32_t work_done = 0; - int mac_for_pdev = dp_get_mac_id_for_mac(soc, mac_id); - mon_status_srng = pdev->rxdma_mon_status_ring[mac_for_pdev].hal_srng; + mon_status_srng = soc->rxdma_mon_status_ring[mac_id].hal_srng; qdf_assert(mon_status_srng); if (!mon_status_srng || !hal_srng_initialized(mon_status_srng)) { @@ -1782,7 +1781,7 @@ QDF_STATUS dp_rx_mon_status_buffers_replenish(struct dp_soc *dp_soc, void *rxdma_ring_entry; union dp_rx_desc_list_elem_t *next; void *rxdma_srng; - struct dp_pdev *dp_pdev = dp_get_pdev_for_mac_id(dp_soc, mac_id); + struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(dp_soc, mac_id); rxdma_srng = dp_rxdma_srng->hal_srng; @@ -1917,9 +1916,8 @@ dp_rx_pdev_mon_status_attach(struct dp_pdev *pdev, int ring_id) { uint32_t i; struct rx_desc_pool *rx_desc_pool; QDF_STATUS status; - int mac_for_pdev = dp_get_mac_id_for_mac(soc, ring_id); - mon_status_ring = &pdev->rxdma_mon_status_ring[mac_for_pdev]; + mon_status_ring = &soc->rxdma_mon_status_ring[ring_id]; num_entries = mon_status_ring->num_entries; diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 794d2654da..b300f5a4f3 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -4750,19 +4750,19 @@ void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id) { if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) { dp_print_ring_stat_from_hal(pdev->soc, - &pdev->rxdma_mon_buf_ring[mac_id], - RXDMA_MONITOR_BUF); + &pdev->soc->rxdma_mon_buf_ring[mac_id], + RXDMA_MONITOR_BUF); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->rxdma_mon_dst_ring[mac_id], - RXDMA_MONITOR_DST); + &pdev->soc->rxdma_mon_dst_ring[mac_id], + RXDMA_MONITOR_DST); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->rxdma_mon_desc_ring[mac_id], - RXDMA_MONITOR_DESC); + &pdev->soc->rxdma_mon_desc_ring[mac_id], + RXDMA_MONITOR_DESC); } dp_print_ring_stat_from_hal(pdev->soc, - &pdev->rxdma_mon_status_ring[mac_id], - RXDMA_MONITOR_STATUS); + &pdev->soc->rxdma_mon_status_ring[mac_id], + RXDMA_MONITOR_STATUS); } void @@ -4770,6 +4770,7 @@ dp_print_ring_stats(struct dp_pdev *pdev) { uint32_t i; int mac_id; + int lmac_id; if (hif_pm_runtime_get_sync(pdev->soc->hif_handle)) return; @@ -4812,9 +4813,10 @@ dp_print_ring_stats(struct dp_pdev *pdev) &pdev->soc->tx_comp_ring[i], WBM2SW_RELEASE); + lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0, pdev->pdev_id); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->rx_refill_buf_ring, - RXDMA_BUF); + &pdev->soc->rx_refill_buf_ring[lmac_id], + RXDMA_BUF); dp_print_ring_stat_from_hal(pdev->soc, &pdev->rx_refill_buf_ring2, @@ -4825,14 +4827,22 @@ dp_print_ring_stats(struct dp_pdev *pdev) &pdev->rx_mac_buf_ring[i], RXDMA_BUF); - for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) - dp_print_mon_ring_stat_from_hal(pdev, mac_id); + for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { + lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, + mac_id, pdev->pdev_id); + + dp_print_mon_ring_stat_from_hal(pdev, lmac_id); + } + + for (i = 0; i < NUM_RXDMA_RINGS_PER_PDEV; i++) { + lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, + i, pdev->pdev_id); - for (i = 0; i < NUM_RXDMA_RINGS_PER_PDEV; i++) dp_print_ring_stat_from_hal(pdev->soc, - &pdev->rxdma_err_dst_ring[i], + &pdev->soc->rxdma_err_dst_ring + [lmac_id], RXDMA_DST); - + } hif_pm_runtime_put(pdev->soc->hif_handle); } diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index e52b82195b..36f727eca2 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -3722,6 +3722,7 @@ qdf_nbuf_t dp_tx_non_std(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, */ QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev) { + int pdev_id; /* * Fill HTT TCL Metadata with Vdev ID and MAC ID */ @@ -3731,8 +3732,10 @@ QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev) HTT_TX_TCL_METADATA_VDEV_ID_SET(vdev->htt_tcl_metadata, vdev->vdev_id); - HTT_TX_TCL_METADATA_PDEV_ID_SET(vdev->htt_tcl_metadata, - DP_SW2HW_MACID(vdev->pdev->pdev_id)); + pdev_id = + dp_get_target_pdev_id_for_host_pdev_id(vdev->pdev->soc, + vdev->pdev->pdev_id); + HTT_TX_TCL_METADATA_PDEV_ID_SET(vdev->htt_tcl_metadata, pdev_id); /* * Set HTT Extension Valid bit to 0 by default diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 9b429e145c..01228b04ed 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -907,6 +907,32 @@ struct dp_soc { /* PDEVs on this SOC */ struct dp_pdev *pdev_list[MAX_PDEV_CNT]; + /* Ring used to replenish rx buffers (maybe to the firmware of MAC) */ + struct dp_srng rx_refill_buf_ring[MAX_PDEV_CNT]; + + struct dp_srng rxdma_mon_desc_ring[MAX_NUM_LMAC_HW]; + + /* RXDMA error destination ring */ + struct dp_srng rxdma_err_dst_ring[MAX_NUM_LMAC_HW]; + + /* Link descriptor memory banks */ + struct { + void *base_vaddr_unaligned; + void *base_vaddr; + qdf_dma_addr_t base_paddr_unaligned; + qdf_dma_addr_t base_paddr; + uint32_t size; + } mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS]; + + /* RXDMA monitor buffer replenish ring */ + struct dp_srng rxdma_mon_buf_ring[MAX_NUM_LMAC_HW]; + + /* RXDMA monitor destination ring */ + struct dp_srng rxdma_mon_dst_ring[MAX_NUM_LMAC_HW]; + + /* RXDMA monitor status ring. TBD: Check format of this ring */ + struct dp_srng rxdma_mon_status_ring[MAX_NUM_LMAC_HW]; + /* Number of PDEVs */ uint8_t pdev_count; @@ -1407,32 +1433,6 @@ struct dp_pdev { /* TXRX SOC handle */ struct dp_soc *soc; - /* Ring used to replenish rx buffers (maybe to the firmware of MAC) */ - struct dp_srng rx_refill_buf_ring; - - /* RXDMA error destination ring */ - struct dp_srng rxdma_err_dst_ring[NUM_RXDMA_RINGS_PER_PDEV]; - - /* Link descriptor memory banks */ - struct { - void *base_vaddr_unaligned; - void *base_vaddr; - qdf_dma_addr_t base_paddr_unaligned; - qdf_dma_addr_t base_paddr; - uint32_t size; - } link_desc_banks[NUM_RXDMA_RINGS_PER_PDEV][MAX_MON_LINK_DESC_BANKS]; - - /* RXDMA monitor buffer replenish ring */ - struct dp_srng rxdma_mon_buf_ring[NUM_RXDMA_RINGS_PER_PDEV]; - - /* RXDMA monitor destination ring */ - struct dp_srng rxdma_mon_dst_ring[NUM_RXDMA_RINGS_PER_PDEV]; - - /* RXDMA monitor status ring. TBD: Check format of this ring */ - struct dp_srng rxdma_mon_status_ring[NUM_RXDMA_RINGS_PER_PDEV]; - - struct dp_srng rxdma_mon_desc_ring[NUM_RXDMA_RINGS_PER_PDEV]; - /* Stuck count on monitor destination ring MPDU process */ uint32_t mon_dest_ring_stuck_cnt; diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index 24da573691..98ddc48b6c 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -476,11 +476,11 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc) /* This is default mapping and can be overridden by HW config * received from FW */ - wlan_cfg_set_hw_macid(wlan_cfg_ctx, 0, 1); + wlan_cfg_set_hw_mac_idx(wlan_cfg_ctx, 0, 0); if (MAX_PDEV_CNT > 1) - wlan_cfg_set_hw_macid(wlan_cfg_ctx, 1, 3); + wlan_cfg_set_hw_mac_idx(wlan_cfg_ctx, 1, 2); if (MAX_PDEV_CNT > 2) - wlan_cfg_set_hw_macid(wlan_cfg_ctx, 2, 2); + wlan_cfg_set_hw_mac_idx(wlan_cfg_ctx, 2, 1); wlan_cfg_ctx->base_hw_macid = cfg_get(psoc, CFG_DP_BASE_HW_MAC_ID); @@ -685,23 +685,45 @@ int wlan_cfg_get_host2rxdma_ring_mask(struct wlan_cfg_dp_soc_ctxt *cfg, return cfg->int_host2rxdma_ring_mask[context]; } -void wlan_cfg_set_hw_macid(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx, - int hw_macid) +void wlan_cfg_set_hw_mac_idx(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx, + int hw_macid) { qdf_assert_always(pdev_idx < MAX_PDEV_CNT); cfg->hw_macid[pdev_idx] = hw_macid; } -int wlan_cfg_get_hw_macid(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx) +int wlan_cfg_get_hw_mac_idx(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx) { qdf_assert_always(pdev_idx < MAX_PDEV_CNT); return cfg->hw_macid[pdev_idx]; } -int wlan_cfg_get_hw_mac_idx(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx) +int wlan_cfg_get_target_pdev_id(struct wlan_cfg_dp_soc_ctxt *cfg, + int hw_macid) +{ + int idx; + + for (idx = 0; idx < MAX_NUM_LMAC_HW; idx++) { + if (cfg->hw_macid[idx] == hw_macid) + return (idx + 1); + } + qdf_assert_always(idx < MAX_PDEV_CNT); + return WLAN_INVALID_PDEV_ID; +} + +void wlan_cfg_set_pdev_idx(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx, + int hw_macid) { qdf_assert_always(pdev_idx < MAX_PDEV_CNT); - return cfg->hw_macid[pdev_idx] - cfg->base_hw_macid; + qdf_assert_always(hw_macid < MAX_NUM_LMAC_HW); + + cfg->hw_macid_pdev_id_map[hw_macid] = pdev_idx; +} + +int wlan_cfg_get_pdev_idx(struct wlan_cfg_dp_soc_ctxt *cfg, int hw_macid) +{ + qdf_assert_always(hw_macid < MAX_NUM_LMAC_HW); + return cfg->hw_macid_pdev_id_map[hw_macid]; } void wlan_cfg_set_ce_ring_mask(struct wlan_cfg_dp_soc_ctxt *cfg, diff --git a/wlan_cfg/wlan_cfg.h b/wlan_cfg/wlan_cfg.h index 31026fa624..4e125882d2 100644 --- a/wlan_cfg/wlan_cfg.h +++ b/wlan_cfg/wlan_cfg.h @@ -38,11 +38,16 @@ #define DP_PPDU_TXLITE_STATS_BITMASK_CFG 0x3FFF #define NUM_RXDMA_RINGS_PER_PDEV 2 + +/*Maximum Number of LMAC instances*/ +#define MAX_NUM_LMAC_HW 2 #else #define WLAN_CFG_DST_RING_CACHED_DESC 1 #define MAX_PDEV_CNT 3 #define WLAN_CFG_INT_NUM_CONTEXTS 11 #define NUM_RXDMA_RINGS_PER_PDEV 1 +#define MAX_NUM_LMAC_HW 3 + #endif #define WLAN_CFG_INT_NUM_CONTEXTS_MAX 11 @@ -213,6 +218,7 @@ struct wlan_cfg_dp_soc_ctxt { int int_rxdma2host_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS]; int int_host2rxdma_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS]; int hw_macid[MAX_PDEV_CNT]; + int hw_macid_pdev_id_map[MAX_PDEV_CNT]; int base_hw_macid; bool rx_hash; bool tso_enabled; @@ -486,25 +492,15 @@ int wlan_cfg_get_rxdma2host_mon_ring_mask(struct wlan_cfg_dp_soc_ctxt *cfg, int context); /** - * wlan_cfg_set_hw_macid() - Set HW MAC Id for the given PDEV index + * wlan_cfg_set_hw_macidx() - Set HW MAC Idx for the given PDEV index * * @wlan_cfg_ctx - Configuration Handle * @pdev_idx - Index of SW PDEV * @hw_macid - HW MAC Id * */ -void wlan_cfg_set_hw_macid(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx, - int hw_macid); - -/** - * wlan_cfg_get_hw_macid() - Get HW MAC Id for the given PDEV index - * - * @wlan_cfg_ctx - Configuration Handle - * @pdev_idx - Index of SW PDEV - * - * Return: HW MAC Id - */ -int wlan_cfg_get_hw_macid(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx); +void wlan_cfg_set_hw_mac_idx + (struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx, int hw_macid); /** * wlan_cfg_get_hw_mac_idx() - Get 0 based HW MAC index for the given @@ -517,6 +513,41 @@ int wlan_cfg_get_hw_macid(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx); */ int wlan_cfg_get_hw_mac_idx(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx); +/** + * wlan_cfg_get_target_pdev_id() - Get target PDEV ID for HW MAC ID + * + * @wlan_cfg_ctx - Configuration Handle + * @hw_macid - Index of hw mac + * + * Return: PDEV ID + */ +int +wlan_cfg_get_target_pdev_id(struct wlan_cfg_dp_soc_ctxt *cfg, int hw_macid); + +/** + * wlan_cfg_set_pdev_idx() - Set 0 based host PDEV index for the given + * hw mac index + * + * @wlan_cfg_ctx - Configuration Handle + * @pdev_idx - Index of SW PDEV + * @hw_macid - Index of hw mac + * + * Return: PDEV index + */ +void wlan_cfg_set_pdev_idx + (struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx, int hw_macid); + +/** + * wlan_cfg_get_pdev_idx() - Get 0 based PDEV index for the given + * hw mac index + * + * @wlan_cfg_ctx - Configuration Handle + * @hw_macid - Index of hw mac + * + * Return: PDEV index + */ +int wlan_cfg_get_pdev_idx(struct wlan_cfg_dp_soc_ctxt *cfg, int hw_macid); + /** * wlan_cfg_get_rx_err_ring_mask() - Return Rx monitor ring interrupt mask * mapped to an interrupt context