diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index b2f1e3fe31..f73b1bd1d3 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -28,6 +28,8 @@ #define DP_AST_AGING_TIMER_DEFAULT_MS 5000 #if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1) +#define DP_TX_VDEV_ID_CHECK_ENABLE 0 + 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}, {1, 4, HAL_BE_WBM_SW4_BM_ID, 0}, @@ -37,6 +39,7 @@ static struct wlan_cfg_tcl_wbm_ring_num_map g_tcl_wbm_map_array[MAX_TCL_DATA_RIN }; #else +#define DP_TX_VDEV_ID_CHECK_ENABLE 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}, @@ -436,6 +439,9 @@ static QDF_STATUS dp_soc_init_be(struct dp_soc *soc) qdf_status = dp_hw_cookie_conversion_init(be_soc); + /* route vdev_id mismatch notification via FW completion */ + hal_tx_vdev_mismatch_routing_set(soc->hal_soc, + HAL_TX_VDEV_MISMATCH_FW_NOTIFY); return qdf_status; } @@ -463,10 +469,9 @@ static QDF_STATUS dp_vdev_attach_be(struct dp_soc *soc, struct dp_vdev *vdev) struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); struct dp_vdev_be *be_vdev = dp_get_be_vdev_from_dp_vdev(vdev); - be_vdev->bank_id = dp_tx_get_bank_profile(be_soc, be_vdev); + be_vdev->vdev_id_check_en = DP_TX_VDEV_ID_CHECK_ENABLE; - /* Needs to be enabled after bring-up*/ - be_vdev->vdev_id_check_en = false; + be_vdev->bank_id = dp_tx_get_bank_profile(be_soc, be_vdev); if (be_vdev->bank_id == DP_BE_INVALID_BANK_ID) { QDF_BUG(0); diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index b48353e4fe..3e35bd0485 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -4490,13 +4490,24 @@ void dp_tx_process_htt_completion(struct dp_soc *soc, dp_tx_inspect_handler(soc, vdev, tx_desc, status); break; } + case HTT_TX_FW2WBM_TX_STATUS_VDEVID_MISMATCH: + { + DP_STATS_INC(vdev, tx_i.dropped.fail_per_pkt_vdev_id_check, 1); + goto release_tx_desc; + } default: - dp_tx_comp_debug("Invalid HTT tx_status %d\n", + dp_tx_comp_alert("Invalid HTT tx_status %d\n", tx_status); - break; + goto release_tx_desc; } dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_HTT_COMP); + return; + +release_tx_desc: + dp_tx_comp_free_buf(soc, tx_desc); + dp_tx_desc_release(tx_desc, tx_desc->pool_id); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_HTT_COMP); } #ifdef WLAN_FEATURE_RX_SOFTIRQ_TIME_LIMIT diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 1ddadce8bf..7afe9e154a 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1640,6 +1640,8 @@ struct dp_arch_ops { uint32_t (*dp_service_near_full_srngs)(struct dp_soc *soc, struct dp_intr *int_ctx, uint32_t dp_budget); + void (*tx_implicit_rbm_set)(struct dp_soc *soc, uint8_t tx_ring_id, + uint8_t bm_id); /* Control Arch Ops */ QDF_STATUS (*txrx_set_vdev_param)(struct dp_soc *soc, @@ -1652,8 +1654,6 @@ struct dp_arch_ops { int (*dp_srng_test_and_update_nf_params)(struct dp_soc *soc, struct dp_srng *dp_srng, int *max_reap_limit); - void (*tx_implicit_rbm_set)(struct dp_soc *soc, uint8_t tx_ring_id, - uint8_t bm_id); }; /** diff --git a/hal/wifi3.0/be/hal_be_tx.h b/hal/wifi3.0/be/hal_be_tx.h index a1b7690049..414ec6665f 100644 --- a/hal/wifi3.0/be/hal_be_tx.h +++ b/hal/wifi3.0/be/hal_be_tx.h @@ -53,6 +53,16 @@ enum hal_tx_mcast_ctrl { HAL_TX_MCAST_CTRL_NO_SPECIAL, }; +/** + * enum hal_tx_vdev_mismatch_notify + * @HAL_TX_VDEV_MISMATCH_TQM_NOTIFY: vdev mismatch exception routed to TQM + * @HAL_TX_VDEV_MISMATCH_FW_NOTIFY: vdev mismatch exception routed to FW + */ +enum hal_tx_vdev_mismatch_notify { + HAL_TX_VDEV_MISMATCH_TQM_NOTIFY = 0, + HAL_TX_VDEV_MISMATCH_FW_NOTIFY, +}; + /*--------------------------------------------------------------------------- * Structures * --------------------------------------------------------------------------- @@ -676,4 +686,34 @@ hal_tx_vdev_mcast_ctrl_set(hal_soc_handle_t hal_soc_hdl, { } #endif + +/** + * hal_tx_vdev_mismatch_routing_set - set vdev mismatch exception routing + * @hal_soc: HAL SoC context + * @config: HAL_TX_VDEV_MISMATCH_TQM_NOTIFY - route via TQM + * HAL_TX_VDEV_MISMATCH_FW_NOTIFY - route via FW + * + * Return: void + */ +static inline void +hal_tx_vdev_mismatch_routing_set(hal_soc_handle_t hal_soc_hdl, + enum hal_tx_vdev_mismatch_notify config) +{ + struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl; + uint32_t reg_addr, reg_val = 0; + uint32_t val = 0; + + reg_addr = HWIO_TCL_R0_CMN_CONFIG_ADDR(MAC_TCL_REG_REG_BASE); + + val = HAL_REG_READ(hal_soc, reg_addr); + + /* reset the corresponding bits in register */ + val &= (~(HWIO_TCL_R0_CMN_CONFIG_VDEVID_MISMATCH_EXCEPTION_BMSK)); + + /* set config value */ + reg_val = val | (config << + HWIO_TCL_R0_CMN_CONFIG_VDEVID_MISMATCH_EXCEPTION_SHFT); + + HAL_REG_WRITE(hal_soc, reg_addr, reg_val); +} #endif /* _HAL_BE_TX_H_ */