qcacmn: Change to route vdev_id exceptions to FW

Configure HW to route vdev_id mismatch exceptions
packets to FW.

Change-Id: I8baf4a2f299ddda253a9cd3c247054a0e546af23
This commit is contained in:
Chaithanya Garrepalli
2021-08-13 14:47:21 +05:30
committed by Madan Koyyalamudi
parent 409ffbfda0
commit 60db195327
4 changed files with 63 additions and 7 deletions

View File

@@ -28,6 +28,8 @@
#define DP_AST_AGING_TIMER_DEFAULT_MS 5000 #define DP_AST_AGING_TIMER_DEFAULT_MS 5000
#if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1) #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] = { 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}, {.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}, {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 #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] = { 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}, {.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); 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; 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_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); 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->bank_id = dp_tx_get_bank_profile(be_soc, be_vdev);
be_vdev->vdev_id_check_en = false;
if (be_vdev->bank_id == DP_BE_INVALID_BANK_ID) { if (be_vdev->bank_id == DP_BE_INVALID_BANK_ID) {
QDF_BUG(0); QDF_BUG(0);

View File

@@ -4490,13 +4490,24 @@ void dp_tx_process_htt_completion(struct dp_soc *soc,
dp_tx_inspect_handler(soc, vdev, tx_desc, status); dp_tx_inspect_handler(soc, vdev, tx_desc, status);
break; 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: default:
dp_tx_comp_debug("Invalid HTT tx_status %d\n", dp_tx_comp_alert("Invalid HTT tx_status %d\n",
tx_status); tx_status);
break; goto release_tx_desc;
} }
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_HTT_COMP); 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 #ifdef WLAN_FEATURE_RX_SOFTIRQ_TIME_LIMIT

View File

@@ -1640,6 +1640,8 @@ struct dp_arch_ops {
uint32_t (*dp_service_near_full_srngs)(struct dp_soc *soc, uint32_t (*dp_service_near_full_srngs)(struct dp_soc *soc,
struct dp_intr *int_ctx, struct dp_intr *int_ctx,
uint32_t dp_budget); 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 */ /* Control Arch Ops */
QDF_STATUS (*txrx_set_vdev_param)(struct dp_soc *soc, 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, int (*dp_srng_test_and_update_nf_params)(struct dp_soc *soc,
struct dp_srng *dp_srng, struct dp_srng *dp_srng,
int *max_reap_limit); int *max_reap_limit);
void (*tx_implicit_rbm_set)(struct dp_soc *soc, uint8_t tx_ring_id,
uint8_t bm_id);
}; };
/** /**

View File

@@ -53,6 +53,16 @@ enum hal_tx_mcast_ctrl {
HAL_TX_MCAST_CTRL_NO_SPECIAL, 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 * Structures
* --------------------------------------------------------------------------- * ---------------------------------------------------------------------------
@@ -676,4 +686,34 @@ hal_tx_vdev_mcast_ctrl_set(hal_soc_handle_t hal_soc_hdl,
{ {
} }
#endif #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_ */ #endif /* _HAL_BE_TX_H_ */