diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index d75d3c7c8f..85289265e6 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -1127,6 +1127,9 @@ struct ol_if_ops { uint8_t (*freq_to_band)(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id, uint16_t freq); + QDF_STATUS(*set_mec_timer)(struct cdp_ctrl_objmgr_psoc *psoc, + uint8_t vdev_id, uint16_t mec_timer_val); + #ifdef ATH_SUPPORT_NAC_RSSI int (*config_fw_for_nac_rssi)(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id, diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 522454aa8d..b2f1e3fe31 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -24,6 +24,9 @@ #include "dp_be_rx.h" #include +/* Generic AST entry aging timer value */ +#define DP_AST_AGING_TIMER_DEFAULT_MS 5000 + #if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1) static struct wlan_cfg_tcl_wbm_ring_num_map g_tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = { {.tcl_ring_num = 0, .wbm_ring_num = 0, .wbm_rbm_id = HAL_BE_WBM_SW0_BM_ID, .for_ipa = 0}, @@ -470,9 +473,16 @@ static QDF_STATUS dp_vdev_attach_be(struct dp_soc *soc, struct dp_vdev *vdev) return QDF_STATUS_E_FAULT; } - if (vdev->opmode == wlan_op_mode_sta) + if (vdev->opmode == wlan_op_mode_sta) { + if (soc->cdp_soc.ol_ops->set_mec_timer) + soc->cdp_soc.ol_ops->set_mec_timer( + soc->ctrl_psoc, + vdev->vdev_id, + DP_AST_AGING_TIMER_DEFAULT_MS); + hal_tx_vdev_mcast_ctrl_set(soc->hal_soc, vdev->vdev_id, HAL_TX_MCAST_CTRL_MEC_NOTIFY); + } return QDF_STATUS_SUCCESS; } diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 77f54b19b1..6882a3981d 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -242,8 +242,6 @@ static uint8_t dp_soc_ring_if_nss_offloaded(struct dp_soc *soc, #define MON_VDEV_TIMER_INIT 0x1 #define MON_VDEV_TIMER_RUNNING 0x2 -/* Generic AST entry aging timer value */ -#define DP_AST_AGING_TIMER_DEFAULT_MS 1000 #define DP_MCS_LENGTH (6*MAX_MCS) #define DP_CURR_FW_STATS_AVAIL 19 @@ -13124,7 +13122,7 @@ static void dp_soc_cfg_init(struct dp_soc *soc) soc->wbm_release_desc_rx_sg_support = 1; soc->rxdma2sw_rings_not_supported = 1; soc->ast_offload_support = AST_OFFLOAD_ENABLE_STATUS; - + soc->mec_fw_offload = FW_MEC_FW_OFFLOAD_ENABLED; break; default: qdf_print("%s: Unknown tgt type %d\n", __func__, target_type); diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 5f905ff94c..eb847c3c44 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -1342,9 +1342,11 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, qdf_nbuf_t nbuf, } } - if (dp_rx_mcast_echo_check(soc, peer, rx_tlv_hdr, nbuf)) { + if ((!soc->mec_fw_offload) && + dp_rx_mcast_echo_check(soc, peer, rx_tlv_hdr, nbuf)) { /* this is a looped back MCBC pkt, drop it */ - DP_STATS_INC_PKT(peer, rx.mec_drop, 1, qdf_nbuf_len(nbuf)); + DP_STATS_INC_PKT(peer, rx.mec_drop, 1, + qdf_nbuf_len(nbuf)); goto drop_nbuf; } @@ -2847,7 +2849,11 @@ done: err_code, pool_id); break; - + case HAL_RXDMA_MULTICAST_ECHO: + DP_STATS_INC_PKT(peer, rx.mec_drop, 1, + qdf_nbuf_len(nbuf)); + qdf_nbuf_free(nbuf); + break; default: qdf_nbuf_free(nbuf); dp_err_rl("RXDMA error %d", diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 617605cb15..d78c9f0525 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -4381,6 +4381,7 @@ void dp_tx_process_htt_completion(struct dp_soc *soc, * descriptor in case of MEC notify. */ if (tx_status == HTT_TX_FW2WBM_TX_STATUS_MEC_NOTIFY) { + qdf_assert_always(!soc->mec_fw_offload); /* * Get vdev id from HTT status word in case of MEC * notification diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 88f1d71948..f09259b3ff 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -126,6 +126,12 @@ #define AST_OFFLOAD_ENABLE_STATUS 0 #endif +#ifdef FEATURE_MEC_OFFLOAD +#define FW_MEC_FW_OFFLOAD_ENABLED 1 +#else +#define FW_MEC_FW_OFFLOAD_ENABLED 0 +#endif + #define PCP_TID_MAP_MAX 8 #define MAX_MU_USERS 37 @@ -2124,7 +2130,8 @@ struct dp_soc { #ifdef WIFI_MONITOR_SUPPORT struct dp_mon_soc *monitor_soc; #endif - bool rxdma2sw_rings_not_supported; + uint8_t rxdma2sw_rings_not_supported:1, + mec_fw_offload:1; }; #ifdef IPA_OFFLOAD diff --git a/hal/wifi3.0/hal_rx.h b/hal/wifi3.0/hal_rx.h index a58b24a7e0..d138f0f3c0 100644 --- a/hal/wifi3.0/hal_rx.h +++ b/hal/wifi3.0/hal_rx.h @@ -574,6 +574,9 @@ enum hal_reo_error_code { * @ HAL_RXDMA_ERR_DA_TIMEOUT : Destination Address search timeout * @ HAL_RXDMA_ERR_FLOW_TIMEOUT : Flow Search Timeout * @ HAL_RXDMA_ERR_FLUSH_REQUEST : RxDMA FIFO Flush request + * @ HAL_RXDMA_AMSDU_FRAGMENT : Rx PCU reported A-MSDU + * present as well as a fragmented MPDU + * @ HAL_RXDMA_MULTICAST_ECHO : RX OLE reported a multicast echo * @ HAL_RXDMA_ERR_WAR : RxDMA WAR dummy errors */ enum hal_rxdma_error_code { @@ -591,6 +594,8 @@ enum hal_rxdma_error_code { HAL_RXDMA_ERR_DA_TIMEOUT, HAL_RXDMA_ERR_FLOW_TIMEOUT, HAL_RXDMA_ERR_FLUSH_REQUEST, + HAL_RXDMA_AMSDU_FRAGMENT, + HAL_RXDMA_MULTICAST_ECHO, HAL_RXDMA_ERR_WAR = 31, HAL_RXDMA_ERR_MAX };