qcacmn: Support REO2SW ring pointer update threshold configuration
Support REO2SW ring pointer update threshold configuration, it is helpful for PCIe utilization improvement. timer based threshold - M: issue pointer updates when M micro seconds has elapsed. number based threshold - N: issue pointer updates when N entries updates occur. Change-Id: I49ed388520fd52e97e303d6ea9c04ced6cb5cf5f CRs-Fixed: 3420101
Este commit está contenido en:

cometido por
Madan Koyyalamudi

padre
c66b8677cf
commit
c2c0f7f7f9
@@ -1891,6 +1891,37 @@ static void dp_print_peer_table(struct dp_vdev *vdev)
|
|||||||
DP_MOD_ID_GENERIC_STATS);
|
DP_MOD_ID_GENERIC_STATS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_srng_configure_pointer_update_thresholds() - Retrieve pointer
|
||||||
|
* update threshold value from wlan_cfg_ctx
|
||||||
|
* @soc: device handle
|
||||||
|
* @ring_params: per ring specific parameters
|
||||||
|
* @ring_type: Ring type
|
||||||
|
* @ring_num: Ring number for a given ring type
|
||||||
|
* @num_entries: number of entries to fill
|
||||||
|
*
|
||||||
|
* Fill the ring params with the pointer update threshold
|
||||||
|
* configuration parameters available in wlan_cfg_ctx
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
dp_srng_configure_pointer_update_thresholds(
|
||||||
|
struct dp_soc *soc,
|
||||||
|
struct hal_srng_params *ring_params,
|
||||||
|
int ring_type, int ring_num,
|
||||||
|
int num_entries)
|
||||||
|
{
|
||||||
|
if (ring_type == REO_DST) {
|
||||||
|
ring_params->pointer_timer_threshold =
|
||||||
|
wlan_cfg_get_pointer_timer_threshold_rx(
|
||||||
|
soc->wlan_cfg_ctx);
|
||||||
|
ring_params->pointer_num_threshold =
|
||||||
|
wlan_cfg_get_pointer_num_threshold_rx(
|
||||||
|
soc->wlan_cfg_ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef WLAN_DP_PER_RING_TYPE_CONFIG
|
#ifdef WLAN_DP_PER_RING_TYPE_CONFIG
|
||||||
/**
|
/**
|
||||||
* dp_srng_configure_interrupt_thresholds() - Retrieve interrupt
|
* dp_srng_configure_interrupt_thresholds() - Retrieve interrupt
|
||||||
@@ -2407,6 +2438,9 @@ QDF_STATUS dp_srng_init_idx(struct dp_soc *soc, struct dp_srng *srng,
|
|||||||
srng->num_entries);
|
srng->num_entries);
|
||||||
|
|
||||||
dp_srng_set_nf_thresholds(soc, srng, &ring_params);
|
dp_srng_set_nf_thresholds(soc, srng, &ring_params);
|
||||||
|
dp_srng_configure_pointer_update_thresholds(soc, &ring_params,
|
||||||
|
ring_type, ring_num,
|
||||||
|
srng->num_entries);
|
||||||
|
|
||||||
if (srng->cached)
|
if (srng->cached)
|
||||||
ring_params.flags |= HAL_SRNG_CACHED_DESC;
|
ring_params.flags |= HAL_SRNG_CACHED_DESC;
|
||||||
|
@@ -1021,6 +1021,10 @@ struct hal_srng_params {
|
|||||||
/* Safe threshold */
|
/* Safe threshold */
|
||||||
uint16_t safe_thresh;
|
uint16_t safe_thresh;
|
||||||
#endif
|
#endif
|
||||||
|
/* Timer threshold to issue ring pointer update - in micro seconds */
|
||||||
|
uint16_t pointer_timer_threshold;
|
||||||
|
/* Number threshold of ring entries to issue pointer update */
|
||||||
|
uint8_t pointer_num_threshold;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -193,6 +193,7 @@
|
|||||||
#define ID_GROUP R0
|
#define ID_GROUP R0
|
||||||
#define STATUS_GROUP R0
|
#define STATUS_GROUP R0
|
||||||
#define MISC_GROUP R0
|
#define MISC_GROUP R0
|
||||||
|
#define MISC_1_GROUP R0
|
||||||
#define HP_ADDR_LSB_GROUP R0
|
#define HP_ADDR_LSB_GROUP R0
|
||||||
#define HP_ADDR_MSB_GROUP R0
|
#define HP_ADDR_MSB_GROUP R0
|
||||||
#define PRODUCER_INT_SETUP_GROUP R0
|
#define PRODUCER_INT_SETUP_GROUP R0
|
||||||
@@ -244,13 +245,19 @@
|
|||||||
|
|
||||||
#define _SRNG_DST_FLD(_reg_group, _reg_fld) \
|
#define _SRNG_DST_FLD(_reg_group, _reg_fld) \
|
||||||
HAL_REO_ ## _reg_group ## _REO2SW1_RING_ ## _reg_fld
|
HAL_REO_ ## _reg_group ## _REO2SW1_RING_ ## _reg_fld
|
||||||
|
#define _SRNG_DST_HW_FLD(_reg_group, _reg_fld) \
|
||||||
|
HWIO_REO_ ## _reg_group ## _REO2SW1_RING_ ## _reg_fld
|
||||||
#define _SRNG_SRC_FLD(_reg_group, _reg_fld) \
|
#define _SRNG_SRC_FLD(_reg_group, _reg_fld) \
|
||||||
HWIO_TCL_ ## _reg_group ## _SW2TCL1_RING_ ## _reg_fld
|
HWIO_TCL_ ## _reg_group ## _SW2TCL1_RING_ ## _reg_fld
|
||||||
|
|
||||||
#define _SRNG_FLD(_reg_group, _reg_fld, _dir) \
|
#define _SRNG_FLD(_reg_group, _reg_fld, _dir) \
|
||||||
_SRNG_ ## _dir ## _FLD(_reg_group, _reg_fld)
|
_SRNG_ ## _dir ## _FLD(_reg_group, _reg_fld)
|
||||||
|
#define _SRNG_HW_FLD(_reg_group, _reg_fld, _dir) \
|
||||||
|
_SRNG_ ## _dir ## _HW_FLD(_reg_group, _reg_fld)
|
||||||
|
|
||||||
#define SRNG_DST_FLD(_reg, _f) _SRNG_FLD(_reg ## _GROUP, _reg ## _ ## _f, DST)
|
#define SRNG_DST_FLD(_reg, _f) _SRNG_FLD(_reg ## _GROUP, _reg ## _ ## _f, DST)
|
||||||
|
#define SRNG_DST_HW_FLD(_reg, _f) \
|
||||||
|
_SRNG_HW_FLD(_reg ## _GROUP, _reg ## _ ## _f, DST)
|
||||||
#define SRNG_SRC_FLD(_reg, _f) _SRNG_FLD(_reg ## _GROUP, _reg ## _ ## _f, SRC)
|
#define SRNG_SRC_FLD(_reg, _f) _SRNG_FLD(_reg ## _GROUP, _reg ## _ ## _f, SRC)
|
||||||
|
|
||||||
#define SRNG_SRC_R0_START_OFFSET SRNG_SRC_REG_OFFSET(BASE_LSB, R0)
|
#define SRNG_SRC_R0_START_OFFSET SRNG_SRC_REG_OFFSET(BASE_LSB, R0)
|
||||||
|
@@ -368,6 +368,7 @@ enum SRNG_REGISTERS {
|
|||||||
DST_MSI1_BASE_LSB,
|
DST_MSI1_BASE_LSB,
|
||||||
DST_MSI1_BASE_MSB,
|
DST_MSI1_BASE_MSB,
|
||||||
DST_MSI1_DATA,
|
DST_MSI1_DATA,
|
||||||
|
DST_MISC_1,
|
||||||
#ifdef CONFIG_BERYLLIUM
|
#ifdef CONFIG_BERYLLIUM
|
||||||
DST_MSI2_BASE_LSB,
|
DST_MSI2_BASE_LSB,
|
||||||
DST_MSI2_BASE_MSB,
|
DST_MSI2_BASE_MSB,
|
||||||
@@ -800,6 +801,10 @@ struct hal_srng {
|
|||||||
#ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING
|
#ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING
|
||||||
struct hal_srng_high_wm_info high_wm;
|
struct hal_srng_high_wm_info high_wm;
|
||||||
#endif
|
#endif
|
||||||
|
/* Timer threshold to issue ring pointer update - in micro seconds */
|
||||||
|
uint16_t pointer_timer_threshold;
|
||||||
|
/* Number threshold of ring entries to issue pointer update */
|
||||||
|
uint8_t pointer_num_threshold;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* HW SRNG configuration table */
|
/* HW SRNG configuration table */
|
||||||
|
@@ -1559,6 +1559,11 @@ void *hal_srng_setup_idx(void *hal_soc, int ring_type, int ring_num, int mac_id,
|
|||||||
srng->intr_timer_thres_us = ring_params->intr_timer_thres_us;
|
srng->intr_timer_thres_us = ring_params->intr_timer_thres_us;
|
||||||
srng->intr_batch_cntr_thres_entries =
|
srng->intr_batch_cntr_thres_entries =
|
||||||
ring_params->intr_batch_cntr_thres_entries;
|
ring_params->intr_batch_cntr_thres_entries;
|
||||||
|
srng->pointer_timer_threshold =
|
||||||
|
ring_params->pointer_timer_threshold;
|
||||||
|
srng->pointer_num_threshold =
|
||||||
|
ring_params->pointer_num_threshold;
|
||||||
|
|
||||||
if (!idle_check)
|
if (!idle_check)
|
||||||
srng->prefetch_timer = ring_params->prefetch_timer;
|
srng->prefetch_timer = ring_params->prefetch_timer;
|
||||||
srng->hal_soc = hal_soc;
|
srng->hal_soc = hal_soc;
|
||||||
|
@@ -2009,10 +2009,85 @@ static QDF_STATUS hal_rx_reo_ent_get_src_link_id_kiwi(hal_rxdma_desc_t rx_desc,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef QCA_WIFI_KIWI_V2
|
||||||
|
/**
|
||||||
|
* hal_srng_dst_hw_init_misc_1_kiwi() - Function to initialize MISC_1 register
|
||||||
|
* of destination ring HW
|
||||||
|
* @srng: SRNG ring pointer
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
static inline
|
||||||
|
void hal_srng_dst_hw_init_misc_1_kiwi(struct hal_srng *srng)
|
||||||
|
{
|
||||||
|
uint32_t reg_val = 0;
|
||||||
|
|
||||||
|
/* number threshold for pointer update */
|
||||||
|
if (srng->pointer_num_threshold)
|
||||||
|
reg_val |= SRNG_SM(SRNG_DST_HW_FLD(MISC_1,
|
||||||
|
NUM_THRESHOLD_TO_UPDATE),
|
||||||
|
srng->pointer_num_threshold);
|
||||||
|
/* timer threshold for pointer update */
|
||||||
|
if (srng->pointer_timer_threshold)
|
||||||
|
reg_val |= SRNG_SM(SRNG_DST_HW_FLD(MISC_1,
|
||||||
|
TIME_THRESHOLD_TO_UPDATE),
|
||||||
|
srng->pointer_timer_threshold);
|
||||||
|
|
||||||
|
if (reg_val)
|
||||||
|
SRNG_DST_REG_WRITE(srng, MISC_1, reg_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hal_srng_hw_reg_offset_init_misc_1_kiwi() - Initialize the HW srng register
|
||||||
|
* offset of MISC_1
|
||||||
|
* @hal_soc: HAL Soc handle
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
static inline
|
||||||
|
void hal_srng_hw_reg_offset_init_misc_1_kiwi(struct hal_soc *hal_soc)
|
||||||
|
{
|
||||||
|
int32_t *hw_reg_offset = hal_soc->hal_hw_reg_offset;
|
||||||
|
|
||||||
|
hw_reg_offset[DST_MISC_1] = REG_OFFSET(DST, MISC_1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline
|
||||||
|
void hal_srng_dst_hw_init_misc_1_kiwi(struct hal_srng *srng)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void hal_srng_hw_reg_offset_init_misc_1_kiwi(struct hal_soc *hal_soc)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hal_srng_dst_hw_init_kiwi() - Function to initialize SRNG
|
||||||
|
* destination ring HW
|
||||||
|
* @hal_soc: HAL SOC handle
|
||||||
|
* @srng: SRNG ring pointer
|
||||||
|
* @idle_check: Check if ring is idle
|
||||||
|
* @idx: Ring index
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
static inline
|
||||||
|
void hal_srng_dst_hw_init_kiwi(struct hal_soc *hal_soc,
|
||||||
|
struct hal_srng *srng,
|
||||||
|
bool idle_check,
|
||||||
|
uint32_t idx)
|
||||||
|
{
|
||||||
|
hal_srng_dst_hw_init_misc_1_kiwi(srng);
|
||||||
|
|
||||||
|
hal_srng_dst_hw_init_generic(hal_soc, srng, idle_check, idx);
|
||||||
|
}
|
||||||
|
|
||||||
static void hal_hw_txrx_ops_attach_kiwi(struct hal_soc *hal_soc)
|
static void hal_hw_txrx_ops_attach_kiwi(struct hal_soc *hal_soc)
|
||||||
{
|
{
|
||||||
/* init and setup */
|
/* init and setup */
|
||||||
hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_generic;
|
hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_kiwi;
|
||||||
hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic;
|
hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic;
|
||||||
hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic;
|
hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic;
|
||||||
hal_soc->ops->hal_get_window_address = hal_get_window_address_kiwi;
|
hal_soc->ops->hal_get_window_address = hal_get_window_address_kiwi;
|
||||||
@@ -2706,6 +2781,7 @@ static inline void hal_srng_hw_reg_offset_init_kiwi(struct hal_soc *hal_soc)
|
|||||||
hw_reg_offset[DST_MSI2_DATA] = REG_OFFSET(DST, MSI2_DATA),
|
hw_reg_offset[DST_MSI2_DATA] = REG_OFFSET(DST, MSI2_DATA),
|
||||||
hw_reg_offset[DST_PRODUCER_INT2_SETUP] =
|
hw_reg_offset[DST_PRODUCER_INT2_SETUP] =
|
||||||
REG_OFFSET(DST, PRODUCER_INT2_SETUP);
|
REG_OFFSET(DST, PRODUCER_INT2_SETUP);
|
||||||
|
hal_srng_hw_reg_offset_init_misc_1_kiwi(hal_soc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hal_kiwi_attach(struct hal_soc *hal_soc)
|
void hal_kiwi_attach(struct hal_soc *hal_soc)
|
||||||
|
@@ -1354,6 +1354,16 @@
|
|||||||
CFG_INI_BOOL("tx_litemon_sw_peer_filtering", false, \
|
CFG_INI_BOOL("tx_litemon_sw_peer_filtering", false, \
|
||||||
"Enable SW based tx monitor peer fitlering")
|
"Enable SW based tx monitor peer fitlering")
|
||||||
|
|
||||||
|
#define CFG_DP_POINTER_TIMER_THRESHOLD_RX \
|
||||||
|
CFG_INI_UINT("dp_rx_ptr_timer_threshold", \
|
||||||
|
0, 0xFFFF, 0, \
|
||||||
|
CFG_VALUE_OR_DEFAULT, "RX pointer update timer threshold")
|
||||||
|
|
||||||
|
#define CFG_DP_POINTER_NUM_THRESHOLD_RX \
|
||||||
|
CFG_INI_UINT("dp_rx_ptr_num_threshold", \
|
||||||
|
0, 63, 0, \
|
||||||
|
CFG_VALUE_OR_DEFAULT, "RX pointer update entries number threshold")
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* <ini>
|
* <ini>
|
||||||
* dp_rx_fisa_enable - Control Rx datapath FISA
|
* dp_rx_fisa_enable - Control Rx datapath FISA
|
||||||
@@ -2015,5 +2025,7 @@
|
|||||||
CFG_DP_SAWF_STATS_CONFIG \
|
CFG_DP_SAWF_STATS_CONFIG \
|
||||||
CFG(CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE) \
|
CFG(CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE) \
|
||||||
CFG(CFG_DP_TXMON_SW_PEER_FILTERING) \
|
CFG(CFG_DP_TXMON_SW_PEER_FILTERING) \
|
||||||
CFG_TX_PKT_INSPECT_FOR_ILP_CFG
|
CFG_TX_PKT_INSPECT_FOR_ILP_CFG \
|
||||||
|
CFG(CFG_DP_POINTER_TIMER_THRESHOLD_RX) \
|
||||||
|
CFG(CFG_DP_POINTER_NUM_THRESHOLD_RX)
|
||||||
#endif /* _CFG_DP_H_ */
|
#endif /* _CFG_DP_H_ */
|
||||||
|
@@ -3119,6 +3119,10 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc)
|
|||||||
cfg_get(psoc, CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE);
|
cfg_get(psoc, CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE);
|
||||||
wlan_cfg_ctx->txmon_sw_peer_filtering =
|
wlan_cfg_ctx->txmon_sw_peer_filtering =
|
||||||
cfg_get(psoc, CFG_DP_TXMON_SW_PEER_FILTERING);
|
cfg_get(psoc, CFG_DP_TXMON_SW_PEER_FILTERING);
|
||||||
|
wlan_cfg_ctx->pointer_timer_threshold_rx =
|
||||||
|
cfg_get(psoc, CFG_DP_POINTER_TIMER_THRESHOLD_RX);
|
||||||
|
wlan_cfg_ctx->pointer_num_threshold_rx =
|
||||||
|
cfg_get(psoc, CFG_DP_POINTER_NUM_THRESHOLD_RX);
|
||||||
wlan_soc_tx_packet_inspect_attach(psoc, wlan_cfg_ctx);
|
wlan_soc_tx_packet_inspect_attach(psoc, wlan_cfg_ctx);
|
||||||
|
|
||||||
return wlan_cfg_ctx;
|
return wlan_cfg_ctx;
|
||||||
@@ -4465,3 +4469,15 @@ bool wlan_cfg_get_txmon_sw_peer_filtering(struct wlan_cfg_dp_soc_ctxt *cfg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
qdf_export_symbol(wlan_cfg_get_txmon_sw_peer_filtering);
|
qdf_export_symbol(wlan_cfg_get_txmon_sw_peer_filtering);
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
wlan_cfg_get_pointer_timer_threshold_rx(struct wlan_cfg_dp_soc_ctxt *cfg)
|
||||||
|
{
|
||||||
|
return cfg->pointer_timer_threshold_rx;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t
|
||||||
|
wlan_cfg_get_pointer_num_threshold_rx(struct wlan_cfg_dp_soc_ctxt *cfg)
|
||||||
|
{
|
||||||
|
return cfg->pointer_num_threshold_rx;
|
||||||
|
}
|
||||||
|
@@ -335,6 +335,8 @@ struct wlan_srng_cfg {
|
|||||||
* type handling is disabled
|
* type handling is disabled
|
||||||
* @tx_pkt_inspect_for_ilp: flag to indicate if TX packet inspection for HW
|
* @tx_pkt_inspect_for_ilp: flag to indicate if TX packet inspection for HW
|
||||||
* based ILP feature is enabled
|
* based ILP feature is enabled
|
||||||
|
* @pointer_timer_threshold_rx: RX REO2SW ring pointer update timer threshold
|
||||||
|
* @pointer_num_threshold_rx: RX REO2SW ring pointer update entries threshold
|
||||||
*/
|
*/
|
||||||
struct wlan_cfg_dp_soc_ctxt {
|
struct wlan_cfg_dp_soc_ctxt {
|
||||||
int num_int_ctxts;
|
int num_int_ctxts;
|
||||||
@@ -531,6 +533,8 @@ struct wlan_cfg_dp_soc_ctxt {
|
|||||||
#ifdef DP_TX_PACKET_INSPECT_FOR_ILP
|
#ifdef DP_TX_PACKET_INSPECT_FOR_ILP
|
||||||
bool tx_pkt_inspect_for_ilp;
|
bool tx_pkt_inspect_for_ilp;
|
||||||
#endif
|
#endif
|
||||||
|
uint16_t pointer_timer_threshold_rx;
|
||||||
|
uint8_t pointer_num_threshold_rx;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2451,4 +2455,25 @@ uint8_t wlan_cfg_get_napi_scale_factor(struct wlan_cfg_dp_soc_ctxt *cfg);
|
|||||||
void
|
void
|
||||||
wlan_cfg_soc_update_tgt_params(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx,
|
wlan_cfg_soc_update_tgt_params(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx,
|
||||||
struct cdp_ctrl_objmgr_psoc *ctrl_obj);
|
struct cdp_ctrl_objmgr_psoc *ctrl_obj);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_cfg_get_pointer_timer_threshold_rx() - Get timer threshold for RX
|
||||||
|
* pointer update
|
||||||
|
* @cfg: soc configuration context
|
||||||
|
*
|
||||||
|
* Return: timer threshold for RX REO Dest ring pointer update
|
||||||
|
*/
|
||||||
|
uint16_t
|
||||||
|
wlan_cfg_get_pointer_timer_threshold_rx(struct wlan_cfg_dp_soc_ctxt *cfg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_cfg_get_pointer_num_threshold_rx() - Get number threshold for RX
|
||||||
|
* pointer update
|
||||||
|
* @cfg: soc configuration context
|
||||||
|
*
|
||||||
|
* Return: entries number threshold for RX REO Dest ring pointer update
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
wlan_cfg_get_pointer_num_threshold_rx(struct wlan_cfg_dp_soc_ctxt *cfg);
|
||||||
|
|
||||||
#endif /*__WLAN_CFG_H*/
|
#endif /*__WLAN_CFG_H*/
|
||||||
|
Referencia en una nueva incidencia
Block a user