diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index e7c63317a6..b58396d804 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -2971,39 +2971,124 @@ static void dp_ipa_get_tx_comp_ring_size(int tx_comp_ring_num, *tx_comp_ipa_ring_sz = WLAN_CFG_IPA_TX_COMP_RING_SIZE; } #else +static uint8_t dp_reo_ring_selection(uint32_t value, uint32_t *ring) +{ + uint8_t num = 0; + + switch (value) { + case 0xF: + num = 4; + ring[0] = REO_REMAP_SW1; + ring[1] = REO_REMAP_SW2; + ring[2] = REO_REMAP_SW3; + ring[3] = REO_REMAP_SW4; + break; + case 0xE: + num = 3; + ring[0] = REO_REMAP_SW2; + ring[1] = REO_REMAP_SW3; + ring[2] = REO_REMAP_SW4; + break; + case 0xD: + num = 3; + ring[0] = REO_REMAP_SW1; + ring[1] = REO_REMAP_SW3; + ring[2] = REO_REMAP_SW4; + break; + case 0xC: + num = 2; + ring[0] = REO_REMAP_SW3; + ring[1] = REO_REMAP_SW4; + break; + case 0xB: + num = 3; + ring[0] = REO_REMAP_SW1; + ring[1] = REO_REMAP_SW2; + ring[2] = REO_REMAP_SW4; + break; + case 0xA: + num = 2; + ring[0] = REO_REMAP_SW2; + ring[1] = REO_REMAP_SW4; + break; + case 0x9: + num = 2; + ring[0] = REO_REMAP_SW1; + ring[1] = REO_REMAP_SW4; + break; + case 0x8: + num = 1; + ring[0] = REO_REMAP_SW4; + break; + case 0x7: + num = 3; + ring[0] = REO_REMAP_SW1; + ring[1] = REO_REMAP_SW2; + ring[2] = REO_REMAP_SW3; + break; + case 0x6: + num = 2; + ring[0] = REO_REMAP_SW2; + ring[1] = REO_REMAP_SW3; + break; + case 0x5: + num = 2; + ring[0] = REO_REMAP_SW1; + ring[1] = REO_REMAP_SW3; + break; + case 0x4: + num = 1; + ring[0] = REO_REMAP_SW3; + break; + case 0x3: + num = 2; + ring[0] = REO_REMAP_SW1; + ring[1] = REO_REMAP_SW2; + break; + case 0x2: + num = 1; + ring[0] = REO_REMAP_SW2; + break; + case 0x1: + num = 1; + ring[0] = REO_REMAP_SW1; + break; + } + return num; +} + static bool dp_reo_remap_config(struct dp_soc *soc, uint32_t *remap1, uint32_t *remap2) { uint8_t offload_radio = wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx); - uint8_t target_type; + uint32_t reo_config = wlan_cfg_get_reo_rings_mapping(soc->wlan_cfg_ctx); + uint8_t target_type, num; uint32_t ring[4]; + uint32_t value; target_type = hal_get_target_type(soc->hal_soc); switch (offload_radio) { case dp_nss_cfg_default: - ring[0] = REO_REMAP_SW1; - ring[1] = REO_REMAP_SW2; - ring[2] = REO_REMAP_SW3; - ring[3] = REO_REMAP_SW4; + value = reo_config & 0xF; + num = dp_reo_ring_selection(value, ring); hal_compute_reo_remap_ix2_ix3(soc->hal_soc, ring, - 4, remap1, remap2); + num, remap1, remap2); break; case dp_nss_cfg_first_radio: - ring[0] = REO_REMAP_SW2; - ring[1] = REO_REMAP_SW3; - ring[2] = REO_REMAP_SW4; + value = reo_config & 0xE; + num = dp_reo_ring_selection(value, ring); hal_compute_reo_remap_ix2_ix3(soc->hal_soc, ring, - 3, remap1, remap2); + num, remap1, remap2); + break; case dp_nss_cfg_second_radio: - ring[0] = REO_REMAP_SW1; - ring[1] = REO_REMAP_SW3; - ring[2] = REO_REMAP_SW4; + value = reo_config & 0xD; + num = dp_reo_ring_selection(value, ring); hal_compute_reo_remap_ix2_ix3(soc->hal_soc, ring, - 3, remap1, remap2); + num, remap1, remap2); break; case dp_nss_cfg_dbdc: diff --git a/hal/wifi3.0/qca5018/hal_5018.c b/hal/wifi3.0/qca5018/hal_5018.c index 4f3714c095..8e7b843551 100644 --- a/hal/wifi3.0/qca5018/hal_5018.c +++ b/hal/wifi3.0/qca5018/hal_5018.c @@ -222,6 +222,44 @@ void hal_compute_reo_remap_ix2_ix3_5018(uint32_t *ring, uint32_t num_rings, uint32_t *remap1, uint32_t *remap2) { switch (num_rings) { + case 1: + *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | + HAL_REO_REMAP_IX2(ring[0], 17) | + HAL_REO_REMAP_IX2(ring[0], 18) | + HAL_REO_REMAP_IX2(ring[0], 19) | + HAL_REO_REMAP_IX2(ring[0], 20) | + HAL_REO_REMAP_IX2(ring[0], 21) | + HAL_REO_REMAP_IX2(ring[0], 22) | + HAL_REO_REMAP_IX2(ring[0], 23); + + *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | + HAL_REO_REMAP_IX3(ring[0], 25) | + HAL_REO_REMAP_IX3(ring[0], 26) | + HAL_REO_REMAP_IX3(ring[0], 27) | + HAL_REO_REMAP_IX3(ring[0], 28) | + HAL_REO_REMAP_IX3(ring[0], 29) | + HAL_REO_REMAP_IX3(ring[0], 30) | + HAL_REO_REMAP_IX3(ring[0], 31); + break; + case 2: + *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | + HAL_REO_REMAP_IX2(ring[0], 17) | + HAL_REO_REMAP_IX2(ring[1], 18) | + HAL_REO_REMAP_IX2(ring[1], 19) | + HAL_REO_REMAP_IX2(ring[0], 20) | + HAL_REO_REMAP_IX2(ring[0], 21) | + HAL_REO_REMAP_IX2(ring[1], 22) | + HAL_REO_REMAP_IX2(ring[1], 23); + + *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | + HAL_REO_REMAP_IX3(ring[0], 25) | + HAL_REO_REMAP_IX3(ring[1], 26) | + HAL_REO_REMAP_IX3(ring[1], 27) | + HAL_REO_REMAP_IX3(ring[0], 28) | + HAL_REO_REMAP_IX3(ring[0], 29) | + HAL_REO_REMAP_IX3(ring[1], 30) | + HAL_REO_REMAP_IX3(ring[1], 31); + break; case 3: *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | HAL_REO_REMAP_IX2(ring[1], 17) | diff --git a/hal/wifi3.0/qca8074v1/hal_8074v1.c b/hal/wifi3.0/qca8074v1/hal_8074v1.c index cfa63b33e5..eef6f8fdf3 100644 --- a/hal/wifi3.0/qca8074v1/hal_8074v1.c +++ b/hal/wifi3.0/qca8074v1/hal_8074v1.c @@ -1133,6 +1133,44 @@ void hal_compute_reo_remap_ix2_ix3_8074v1(uint32_t *ring, uint32_t num_rings, uint32_t *remap1, uint32_t *remap2) { switch (num_rings) { + case 1: + *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | + HAL_REO_REMAP_IX2(ring[0], 17) | + HAL_REO_REMAP_IX2(ring[0], 18) | + HAL_REO_REMAP_IX2(ring[0], 19) | + HAL_REO_REMAP_IX2(ring[0], 20) | + HAL_REO_REMAP_IX2(ring[0], 21) | + HAL_REO_REMAP_IX2(ring[0], 22) | + HAL_REO_REMAP_IX2(ring[0], 23); + + *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | + HAL_REO_REMAP_IX3(ring[0], 25) | + HAL_REO_REMAP_IX3(ring[0], 26) | + HAL_REO_REMAP_IX3(ring[0], 27) | + HAL_REO_REMAP_IX3(ring[0], 28) | + HAL_REO_REMAP_IX3(ring[0], 29) | + HAL_REO_REMAP_IX3(ring[0], 30) | + HAL_REO_REMAP_IX3(ring[0], 31); + break; + case 2: + *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | + HAL_REO_REMAP_IX2(ring[0], 17) | + HAL_REO_REMAP_IX2(ring[1], 18) | + HAL_REO_REMAP_IX2(ring[1], 19) | + HAL_REO_REMAP_IX2(ring[0], 20) | + HAL_REO_REMAP_IX2(ring[0], 21) | + HAL_REO_REMAP_IX2(ring[1], 22) | + HAL_REO_REMAP_IX2(ring[1], 23); + + *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | + HAL_REO_REMAP_IX3(ring[0], 25) | + HAL_REO_REMAP_IX3(ring[1], 26) | + HAL_REO_REMAP_IX3(ring[1], 27) | + HAL_REO_REMAP_IX3(ring[0], 28) | + HAL_REO_REMAP_IX3(ring[0], 29) | + HAL_REO_REMAP_IX3(ring[1], 30) | + HAL_REO_REMAP_IX3(ring[1], 31); + break; case 3: *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | HAL_REO_REMAP_IX2(ring[1], 17) | diff --git a/hal/wifi3.0/qca8074v2/hal_8074v2.c b/hal/wifi3.0/qca8074v2/hal_8074v2.c index c2e14851ba..73041ea1ba 100644 --- a/hal/wifi3.0/qca8074v2/hal_8074v2.c +++ b/hal/wifi3.0/qca8074v2/hal_8074v2.c @@ -1130,6 +1130,44 @@ void hal_compute_reo_remap_ix2_ix3_8074v2(uint32_t *ring, uint32_t num_rings, uint32_t *remap1, uint32_t *remap2) { switch (num_rings) { + case 1: + *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | + HAL_REO_REMAP_IX2(ring[0], 17) | + HAL_REO_REMAP_IX2(ring[0], 18) | + HAL_REO_REMAP_IX2(ring[0], 19) | + HAL_REO_REMAP_IX2(ring[0], 20) | + HAL_REO_REMAP_IX2(ring[0], 21) | + HAL_REO_REMAP_IX2(ring[0], 22) | + HAL_REO_REMAP_IX2(ring[0], 23); + + *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | + HAL_REO_REMAP_IX3(ring[0], 25) | + HAL_REO_REMAP_IX3(ring[0], 26) | + HAL_REO_REMAP_IX3(ring[0], 27) | + HAL_REO_REMAP_IX3(ring[0], 28) | + HAL_REO_REMAP_IX3(ring[0], 29) | + HAL_REO_REMAP_IX3(ring[0], 30) | + HAL_REO_REMAP_IX3(ring[0], 31); + break; + case 2: + *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | + HAL_REO_REMAP_IX2(ring[0], 17) | + HAL_REO_REMAP_IX2(ring[1], 18) | + HAL_REO_REMAP_IX2(ring[1], 19) | + HAL_REO_REMAP_IX2(ring[0], 20) | + HAL_REO_REMAP_IX2(ring[0], 21) | + HAL_REO_REMAP_IX2(ring[1], 22) | + HAL_REO_REMAP_IX2(ring[1], 23); + + *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | + HAL_REO_REMAP_IX3(ring[0], 25) | + HAL_REO_REMAP_IX3(ring[1], 26) | + HAL_REO_REMAP_IX3(ring[1], 27) | + HAL_REO_REMAP_IX3(ring[0], 28) | + HAL_REO_REMAP_IX3(ring[0], 29) | + HAL_REO_REMAP_IX3(ring[1], 30) | + HAL_REO_REMAP_IX3(ring[1], 31); + break; case 3: *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | HAL_REO_REMAP_IX2(ring[1], 17) | diff --git a/hal/wifi3.0/qcn9000/hal_9000.c b/hal/wifi3.0/qcn9000/hal_9000.c index 69e7179d18..dc3f2b4f6e 100644 --- a/hal/wifi3.0/qcn9000/hal_9000.c +++ b/hal/wifi3.0/qcn9000/hal_9000.c @@ -1584,6 +1584,44 @@ void hal_compute_reo_remap_ix2_ix3_9000(uint32_t *ring, uint32_t num_rings, uint32_t *remap1, uint32_t *remap2) { switch (num_rings) { + case 1: + *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | + HAL_REO_REMAP_IX2(ring[0], 17) | + HAL_REO_REMAP_IX2(ring[0], 18) | + HAL_REO_REMAP_IX2(ring[0], 19) | + HAL_REO_REMAP_IX2(ring[0], 20) | + HAL_REO_REMAP_IX2(ring[0], 21) | + HAL_REO_REMAP_IX2(ring[0], 22) | + HAL_REO_REMAP_IX2(ring[0], 23); + + *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | + HAL_REO_REMAP_IX3(ring[0], 25) | + HAL_REO_REMAP_IX3(ring[0], 26) | + HAL_REO_REMAP_IX3(ring[0], 27) | + HAL_REO_REMAP_IX3(ring[0], 28) | + HAL_REO_REMAP_IX3(ring[0], 29) | + HAL_REO_REMAP_IX3(ring[0], 30) | + HAL_REO_REMAP_IX3(ring[0], 31); + break; + case 2: + *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | + HAL_REO_REMAP_IX2(ring[0], 17) | + HAL_REO_REMAP_IX2(ring[1], 18) | + HAL_REO_REMAP_IX2(ring[1], 19) | + HAL_REO_REMAP_IX2(ring[0], 20) | + HAL_REO_REMAP_IX2(ring[0], 21) | + HAL_REO_REMAP_IX2(ring[1], 22) | + HAL_REO_REMAP_IX2(ring[1], 23); + + *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | + HAL_REO_REMAP_IX3(ring[0], 25) | + HAL_REO_REMAP_IX3(ring[1], 26) | + HAL_REO_REMAP_IX3(ring[1], 27) | + HAL_REO_REMAP_IX3(ring[0], 28) | + HAL_REO_REMAP_IX3(ring[0], 29) | + HAL_REO_REMAP_IX3(ring[1], 30) | + HAL_REO_REMAP_IX3(ring[1], 31); + break; case 3: *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | HAL_REO_REMAP_IX2(ring[1], 17) | diff --git a/wlan_cfg/cfg_dp.h b/wlan_cfg/cfg_dp.h index 1b984efa4f..3688788b65 100644 --- a/wlan_cfg/cfg_dp.h +++ b/wlan_cfg/cfg_dp.h @@ -337,6 +337,10 @@ #define WLAN_CFG_PKTLOG_MIN_BUFFER_SIZE 1 #define WLAN_CFG_PKTLOG_MAX_BUFFER_SIZE 10 +#define WLAN_CFG_NUM_REO_RINGS_MAP 0xF +#define WLAN_CFG_NUM_REO_RINGS_MAP_MIN 0x1 +#define WLAN_CFG_NUM_REO_RINGS_MAP_MAX 0xF + /* DP INI Declerations */ #define CFG_DP_HTT_PACKET_TYPE \ CFG_INI_UINT("dp_htt_packet_type", \ @@ -835,6 +839,13 @@ CFG_INI_BOOL("full_mon_mode", \ false, "Full Monitor mode support") +#define CFG_DP_REO_RINGS_MAP \ + CFG_INI_UINT("dp_reo_rings_map", \ + WLAN_CFG_NUM_REO_RINGS_MAP_MIN, \ + WLAN_CFG_NUM_REO_RINGS_MAP_MAX, \ + WLAN_CFG_NUM_REO_RINGS_MAP, \ + CFG_VALUE_OR_DEFAULT, "REO Destination Rings Mapping") + #define CFG_DP \ CFG(CFG_DP_HTT_PACKET_TYPE) \ CFG(CFG_DP_INT_BATCH_THRESHOLD_OTHER) \ @@ -909,6 +920,7 @@ CFG(CFG_DP_RXDMA_MONITOR_RX_DROP_THRESHOLD) \ CFG(CFG_DP_PKTLOG_BUFFER_SIZE) \ CFG(CFG_DP_RX_FISA_ENABLE) \ - CFG(CFG_DP_FULL_MON_MODE) + CFG(CFG_DP_FULL_MON_MODE) \ + CFG(CFG_DP_REO_RINGS_MAP) #endif /* _CFG_DP_H_ */ diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index df338b52e3..b809d9c275 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -604,6 +604,7 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc) wlan_cfg_ctx->mon_drop_thresh = cfg_get(psoc, CFG_DP_RXDMA_MONITOR_RX_DROP_THRESHOLD); wlan_cfg_ctx->is_rx_fisa_enabled = cfg_get(psoc, CFG_DP_RX_FISA_ENABLE); + wlan_cfg_ctx->reo_rings_mapping = cfg_get(psoc, CFG_DP_REO_RINGS_MAP); return wlan_cfg_ctx; } @@ -1218,6 +1219,12 @@ wlan_cfg_get_dp_soc_rx_sw_desc_weight(struct wlan_cfg_dp_soc_ctxt *cfg) return cfg->rx_sw_desc_weight; } +uint32_t +wlan_cfg_get_reo_rings_mapping(struct wlan_cfg_dp_soc_ctxt *cfg) +{ + return cfg->reo_rings_mapping; +} + bool wlan_cfg_get_dp_caps(struct wlan_cfg_dp_soc_ctxt *cfg, enum cdp_capabilities dp_caps) diff --git a/wlan_cfg/wlan_cfg.h b/wlan_cfg/wlan_cfg.h index 987080efd3..b158abda79 100644 --- a/wlan_cfg/wlan_cfg.h +++ b/wlan_cfg/wlan_cfg.h @@ -183,6 +183,7 @@ struct wlan_srng_cfg { * 5 tuple flow entry * @pktlog_buffer_size: packet log buffer size * @is_rx_fisa_enabled: flag to enable/disable FISA Rx + * @reo_rings_mapping: reo destination ring bitmap */ struct wlan_cfg_dp_soc_ctxt { int num_int_ctxts; @@ -283,6 +284,7 @@ struct wlan_cfg_dp_soc_ctxt { uint8_t is_rx_fisa_enabled; bool is_tso_desc_attach_defer; uint32_t delayed_replenish_entries; + uint32_t reo_rings_mapping; }; /** @@ -1329,3 +1331,12 @@ void wlan_cfg_set_tso_desc_attach_defer(struct wlan_cfg_dp_soc_ctxt *cfg, bool wlan_cfg_is_tso_desc_attach_defer(struct wlan_cfg_dp_soc_ctxt *cfg); +/** + * wlan_cfg_get_reo_rings_mapping() - Get Reo destination ring bitmap + * + * + * @cfg: soc configuration context + * + * Return: reo ring bitmap. + */ +uint32_t wlan_cfg_get_reo_rings_mapping(struct wlan_cfg_dp_soc_ctxt *cfg);