qcacmn: Add Support of Rx Err MLO Link Stats for ML Peer

Add Support to update Rx Error path, MLO Link stats
for ML Peer

Change-Id: Ie5000d0d30a41fa69c86259bae0fd7a8094bddf7
CRs-Fixed: 3397721
This commit is contained in:
Kenvish Butani
2023-01-11 15:36:47 +05:30
committed by Madan Koyyalamudi
parent 4ae60e4df1
commit 3243b9e4f4
8 changed files with 102 additions and 50 deletions

View File

@@ -1961,7 +1961,8 @@ QDF_STATUS
dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf, dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
uint8_t *rx_tlv_hdr, uint8_t pool_id, uint8_t *rx_tlv_hdr, uint8_t pool_id,
struct dp_txrx_peer *txrx_peer, struct dp_txrx_peer *txrx_peer,
bool is_reo_exception) bool is_reo_exception,
uint8_t link_id)
{ {
uint32_t pkt_len; uint32_t pkt_len;
uint16_t msdu_len; uint16_t msdu_len;
@@ -2082,7 +2083,8 @@ dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 0, 1); dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 0, 1);
if (dp_rx_err_drop_3addr_mcast(vdev, rx_tlv_hdr)) { if (dp_rx_err_drop_3addr_mcast(vdev, rx_tlv_hdr)) {
DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.mcast_3addr_drop, 1); DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.mcast_3addr_drop, 1,
link_id);
goto drop_nbuf; goto drop_nbuf;
} }
@@ -2100,7 +2102,7 @@ dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
dp_rx_mcast_echo_check(soc, txrx_peer, rx_tlv_hdr, nbuf)) { dp_rx_mcast_echo_check(soc, txrx_peer, rx_tlv_hdr, nbuf)) {
/* this is a looped back MCBC pkt, drop it */ /* this is a looped back MCBC pkt, drop it */
DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.mec_drop, 1, DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.mec_drop, 1,
qdf_nbuf_len(nbuf)); qdf_nbuf_len(nbuf), link_id);
goto drop_nbuf; goto drop_nbuf;
} }
@@ -2111,7 +2113,7 @@ dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
*/ */
if (check_qwrap_multicast_loopback(vdev, nbuf)) { if (check_qwrap_multicast_loopback(vdev, nbuf)) {
DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.mec_drop, 1, DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.mec_drop, 1,
qdf_nbuf_len(nbuf)); qdf_nbuf_len(nbuf), link_id);
goto drop_nbuf; goto drop_nbuf;
} }
@@ -2119,13 +2121,15 @@ dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
hal_rx_msdu_end_da_is_mcbc_get(soc->hal_soc, hal_rx_msdu_end_da_is_mcbc_get(soc->hal_soc,
rx_tlv_hdr))) { rx_tlv_hdr))) {
dp_err_rl("free buffer for multicast packet"); dp_err_rl("free buffer for multicast packet");
DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.nawds_mcast_drop, 1); DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.nawds_mcast_drop, 1,
link_id);
goto drop_nbuf; goto drop_nbuf;
} }
if (!dp_wds_rx_policy_check(rx_tlv_hdr, vdev, txrx_peer)) { if (!dp_wds_rx_policy_check(rx_tlv_hdr, vdev, txrx_peer)) {
dp_err_rl("mcast Policy Check Drop pkt"); dp_err_rl("mcast Policy Check Drop pkt");
DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.policy_check_drop, 1); DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.policy_check_drop, 1,
link_id);
goto drop_nbuf; goto drop_nbuf;
} }
/* WDS Source Port Learning */ /* WDS Source Port Learning */
@@ -2185,7 +2189,7 @@ dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw)) { if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw)) {
qdf_nbuf_set_next(nbuf, NULL); qdf_nbuf_set_next(nbuf, NULL);
dp_rx_deliver_raw(vdev, nbuf, txrx_peer); dp_rx_deliver_raw(vdev, nbuf, txrx_peer, link_id);
} else { } else {
enh_flag = vdev->pdev->enhanced_stats_en; enh_flag = vdev->pdev->enhanced_stats_en;
qdf_nbuf_set_next(nbuf, NULL); qdf_nbuf_set_next(nbuf, NULL);
@@ -2208,12 +2212,18 @@ dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
(vdev->rx_decap_type == (vdev->rx_decap_type ==
htt_cmn_pkt_type_ethernet))) { htt_cmn_pkt_type_ethernet))) {
DP_PEER_MC_INCC_PKT(txrx_peer, 1, qdf_nbuf_len(nbuf), DP_PEER_MC_INCC_PKT(txrx_peer, 1, qdf_nbuf_len(nbuf),
enh_flag); enh_flag, link_id);
if (QDF_IS_ADDR_BROADCAST(eh->ether_dhost)) if (QDF_IS_ADDR_BROADCAST(eh->ether_dhost))
DP_PEER_BC_INCC_PKT(txrx_peer, 1, DP_PEER_BC_INCC_PKT(txrx_peer, 1,
qdf_nbuf_len(nbuf), qdf_nbuf_len(nbuf),
enh_flag); enh_flag,
link_id);
} else {
DP_PEER_UC_INCC_PKT(txrx_peer, 1,
qdf_nbuf_len(nbuf),
enh_flag,
link_id);
} }
qdf_nbuf_set_exc_frame(nbuf, 1); qdf_nbuf_set_exc_frame(nbuf, 1);

View File

@@ -594,6 +594,7 @@ dp_rx_wbm_err_reap_desc_be(struct dp_intr *int_ctx, struct dp_soc *soc,
* @pool_id: mac id * @pool_id: mac id
* @txrx_peer: txrx peer handle * @txrx_peer: txrx peer handle
* @is_reo_exception: flag to check if the error is from REO or WBM * @is_reo_exception: flag to check if the error is from REO or WBM
* @link_id: link Id on which the packet is received
* *
* This function handles NULL queue descriptor violations arising out * This function handles NULL queue descriptor violations arising out
* a missing REO queue for a given peer or a given TID. This typically * a missing REO queue for a given peer or a given TID. This typically
@@ -610,7 +611,7 @@ QDF_STATUS
dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf, dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
uint8_t *rx_tlv_hdr, uint8_t pool_id, uint8_t *rx_tlv_hdr, uint8_t pool_id,
struct dp_txrx_peer *txrx_peer, struct dp_txrx_peer *txrx_peer,
bool is_reo_exception); bool is_reo_exception, uint8_t link_id);
#if defined(DP_PKT_STATS_PER_LMAC) && defined(WLAN_FEATURE_11BE_MLO) #if defined(DP_PKT_STATS_PER_LMAC) && defined(WLAN_FEATURE_11BE_MLO)
static inline void static inline void

View File

@@ -1019,7 +1019,7 @@ qdf_export_symbol(__dp_rx_buffers_replenish);
void void
dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list, dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list,
struct dp_txrx_peer *txrx_peer) struct dp_txrx_peer *txrx_peer, uint8_t link_id)
{ {
qdf_nbuf_t deliver_list_head = NULL; qdf_nbuf_t deliver_list_head = NULL;
qdf_nbuf_t deliver_list_tail = NULL; qdf_nbuf_t deliver_list_tail = NULL;
@@ -1033,7 +1033,7 @@ dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list,
DP_STATS_INC(vdev->pdev, rx_raw_pkts, 1); DP_STATS_INC(vdev->pdev, rx_raw_pkts, 1);
DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.raw, 1, DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.raw, 1,
qdf_nbuf_len(nbuf)); qdf_nbuf_len(nbuf), link_id);
/* /*
* reset the chfrag_start and chfrag_end bits in nbuf cb * reset the chfrag_start and chfrag_end bits in nbuf cb
* as this is a non-amsdu pkt and RAW mode simulation expects * as this is a non-amsdu pkt and RAW mode simulation expects

View File

@@ -1041,12 +1041,13 @@ void dp_rx_desc_pool_free(struct dp_soc *soc,
* decapsulate the pkt. * decapsulate the pkt.
* @vdev: vdev on which RAW mode is enabled * @vdev: vdev on which RAW mode is enabled
* @nbuf_list: list of RAW pkts to process * @nbuf_list: list of RAW pkts to process
* @txrx_peer: peer object from which the pkt is rx * @peer: peer object from which the pkt is rx
* @link_id: link Id on which the packet is received
* *
* Return: void * Return: void
*/ */
void dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list, void dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list,
struct dp_txrx_peer *txrx_peer); struct dp_txrx_peer *peer, uint8_t link_id);
#ifdef RX_DESC_LOGGING #ifdef RX_DESC_LOGGING
/** /**
@@ -3018,13 +3019,14 @@ dp_rxdma_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
* @err_code: rxdma err code * @err_code: rxdma err code
* @mac_id: mac_id which is one of 3 mac_ids(Assuming mac_id and * @mac_id: mac_id which is one of 3 mac_ids(Assuming mac_id and
* pool_id has same mapping) * pool_id has same mapping)
* @link_id: link Id on which the packet is received
* *
* Return: None * Return: None
*/ */
void void
dp_rx_process_rxdma_err(struct dp_soc *soc, qdf_nbuf_t nbuf, dp_rx_process_rxdma_err(struct dp_soc *soc, qdf_nbuf_t nbuf,
uint8_t *rx_tlv_hdr, struct dp_txrx_peer *txrx_peer, uint8_t *rx_tlv_hdr, struct dp_txrx_peer *txrx_peer,
uint8_t err_code, uint8_t mac_id); uint8_t err_code, uint8_t mac_id, uint8_t link_id);
/** /**
* dp_rx_process_mic_error(): Function to pass mic error indication to umac * dp_rx_process_mic_error(): Function to pass mic error indication to umac

View File

@@ -1050,6 +1050,7 @@ dp_rx_reo_err_entry_process(struct dp_soc *soc,
hal_ring_handle_t hal_ring_hdl = soc->reo_exception_ring.hal_srng; hal_ring_handle_t hal_ring_hdl = soc->reo_exception_ring.hal_srng;
bool first_msdu_in_mpdu_processed = false; bool first_msdu_in_mpdu_processed = false;
bool msdu_dropped = false; bool msdu_dropped = false;
uint8_t link_id = 0;
peer_id = dp_rx_peer_metadata_peer_id_get(soc, peer_id = dp_rx_peer_metadata_peer_id_get(soc,
mpdu_desc_info->peer_meta_data); mpdu_desc_info->peer_meta_data);
@@ -1217,7 +1218,8 @@ more_msdu_link_desc:
rx_tlv_hdr_last, rx_tlv_hdr_last,
rx_desc_pool_id, rx_desc_pool_id,
txrx_peer, txrx_peer,
TRUE); TRUE,
link_id);
if (txrx_peer) if (txrx_peer)
dp_txrx_peer_unref_delete(txrx_ref_handle, dp_txrx_peer_unref_delete(txrx_ref_handle,
DP_MOD_ID_RX_ERR); DP_MOD_ID_RX_ERR);
@@ -1281,7 +1283,7 @@ process_next_msdu:
void void
dp_rx_process_rxdma_err(struct dp_soc *soc, qdf_nbuf_t nbuf, dp_rx_process_rxdma_err(struct dp_soc *soc, qdf_nbuf_t nbuf,
uint8_t *rx_tlv_hdr, struct dp_txrx_peer *txrx_peer, uint8_t *rx_tlv_hdr, struct dp_txrx_peer *txrx_peer,
uint8_t err_code, uint8_t mac_id) uint8_t err_code, uint8_t mac_id, uint8_t link_id)
{ {
uint32_t pkt_len, l2_hdr_offset; uint32_t pkt_len, l2_hdr_offset;
uint16_t msdu_len; uint16_t msdu_len;
@@ -1408,15 +1410,20 @@ process_rx:
is_broadcast = (QDF_IS_ADDR_BROADCAST is_broadcast = (QDF_IS_ADDR_BROADCAST
(eh->ether_dhost)) ? 1 : 0 ; (eh->ether_dhost)) ? 1 : 0 ;
DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.multicast, 1, DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.multicast, 1,
qdf_nbuf_len(nbuf)); qdf_nbuf_len(nbuf), link_id);
if (is_broadcast) { if (is_broadcast) {
DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.bcast, 1, DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.bcast, 1,
qdf_nbuf_len(nbuf)); qdf_nbuf_len(nbuf),
link_id);
} }
} else {
DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.unicast, 1,
qdf_nbuf_len(nbuf),
link_id);
} }
if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw)) { if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw)) {
dp_rx_deliver_raw(vdev, nbuf, txrx_peer); dp_rx_deliver_raw(vdev, nbuf, txrx_peer, link_id);
} else { } else {
/* Update the protocol tag in SKB based on CCE metadata */ /* Update the protocol tag in SKB based on CCE metadata */
dp_rx_update_protocol_tag(soc, vdev, nbuf, rx_tlv_hdr, dp_rx_update_protocol_tag(soc, vdev, nbuf, rx_tlv_hdr,
@@ -1520,10 +1527,12 @@ fail:
static bool dp_rx_igmp_handler(struct dp_soc *soc, static bool dp_rx_igmp_handler(struct dp_soc *soc,
struct dp_vdev *vdev, struct dp_vdev *vdev,
struct dp_txrx_peer *peer, struct dp_txrx_peer *peer,
qdf_nbuf_t nbuf) qdf_nbuf_t nbuf,
uint8_t link_id)
{ {
if (soc->arch_ops.dp_rx_mcast_handler) { if (soc->arch_ops.dp_rx_mcast_handler) {
if (soc->arch_ops.dp_rx_mcast_handler(soc, vdev, peer, nbuf)) if (soc->arch_ops.dp_rx_mcast_handler(soc, vdev, peer,
nbuf, link_id))
return true; return true;
} }
return false; return false;
@@ -1532,7 +1541,8 @@ static bool dp_rx_igmp_handler(struct dp_soc *soc,
static bool dp_rx_igmp_handler(struct dp_soc *soc, static bool dp_rx_igmp_handler(struct dp_soc *soc,
struct dp_vdev *vdev, struct dp_vdev *vdev,
struct dp_txrx_peer *peer, struct dp_txrx_peer *peer,
qdf_nbuf_t nbuf) qdf_nbuf_t nbuf,
uint8_t link_id)
{ {
return false; return false;
} }
@@ -1548,6 +1558,7 @@ static bool dp_rx_igmp_handler(struct dp_soc *soc,
* @txrx_peer: txrx peer handle * @txrx_peer: txrx peer handle
* @rx_tlv_hdr: start of rx tlv header * @rx_tlv_hdr: start of rx tlv header
* @err_src: rxdma/reo * @err_src: rxdma/reo
* @link_id: link id on which the packet is received
* *
* This function indicates EAPOL frame received in wbm error ring to stack. * This function indicates EAPOL frame received in wbm error ring to stack.
* Any other frame should be dropped. * Any other frame should be dropped.
@@ -1557,7 +1568,8 @@ static bool dp_rx_igmp_handler(struct dp_soc *soc,
static void static void
dp_rx_err_route_hdl(struct dp_soc *soc, qdf_nbuf_t nbuf, dp_rx_err_route_hdl(struct dp_soc *soc, qdf_nbuf_t nbuf,
struct dp_txrx_peer *txrx_peer, uint8_t *rx_tlv_hdr, struct dp_txrx_peer *txrx_peer, uint8_t *rx_tlv_hdr,
enum hal_rx_wbm_error_source err_src) enum hal_rx_wbm_error_source err_src,
uint8_t link_id)
{ {
uint32_t pkt_len; uint32_t pkt_len;
uint16_t msdu_len; uint16_t msdu_len;
@@ -1610,7 +1622,7 @@ dp_rx_err_route_hdl(struct dp_soc *soc, qdf_nbuf_t nbuf,
qdf_nbuf_pull_head(nbuf, (msdu_metadata.l3_hdr_pad + qdf_nbuf_pull_head(nbuf, (msdu_metadata.l3_hdr_pad +
soc->rx_pkt_tlv_size)); soc->rx_pkt_tlv_size));
if (dp_rx_igmp_handler(soc, vdev, txrx_peer, nbuf)) if (dp_rx_igmp_handler(soc, vdev, txrx_peer, nbuf, link_id))
return; return;
dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 0, 1); dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 0, 1);
@@ -2331,6 +2343,7 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
struct hal_wbm_err_desc_info wbm_err_info = { 0 }; struct hal_wbm_err_desc_info wbm_err_info = { 0 };
uint8_t pool_id; uint8_t pool_id;
uint8_t tid = 0; uint8_t tid = 0;
uint8_t link_id = 0;
/* Debug -- Remove later */ /* Debug -- Remove later */
qdf_assert(soc && hal_ring_hdl); qdf_assert(soc && hal_ring_hdl);
@@ -2430,7 +2443,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
rx_tlv_hdr, rx_tlv_hdr,
pool_id, pool_id,
txrx_peer, txrx_peer,
FALSE); FALSE,
link_id);
break; break;
/* TODO */ /* TODO */
/* Add per error code accounting */ /* Add per error code accounting */
@@ -2438,7 +2452,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
if (txrx_peer) if (txrx_peer)
DP_PEER_PER_PKT_STATS_INC(txrx_peer, DP_PEER_PER_PKT_STATS_INC(txrx_peer,
rx.err.jump_2k_err, rx.err.jump_2k_err,
1); 1,
link_id);
pool_id = wbm_err_info.pool_id; pool_id = wbm_err_info.pool_id;
@@ -2459,7 +2474,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
if (txrx_peer) if (txrx_peer)
DP_PEER_PER_PKT_STATS_INC(txrx_peer, DP_PEER_PER_PKT_STATS_INC(txrx_peer,
rx.err.oor_err, rx.err.oor_err,
1); 1,
link_id);
if (hal_rx_msdu_end_first_msdu_get(soc->hal_soc, if (hal_rx_msdu_end_first_msdu_get(soc->hal_soc,
rx_tlv_hdr)) { rx_tlv_hdr)) {
tid = tid =
@@ -2489,7 +2505,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
if (txrx_peer) if (txrx_peer)
DP_PEER_PER_PKT_STATS_INC(txrx_peer, DP_PEER_PER_PKT_STATS_INC(txrx_peer,
rx.err.pn_err, rx.err.pn_err,
1); 1,
link_id);
dp_rx_nbuf_free(nbuf); dp_rx_nbuf_free(nbuf);
break; break;
@@ -2502,7 +2519,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
== HAL_RX_WBM_REO_PSH_RSN_ROUTE) { == HAL_RX_WBM_REO_PSH_RSN_ROUTE) {
dp_rx_err_route_hdl(soc, nbuf, txrx_peer, dp_rx_err_route_hdl(soc, nbuf, txrx_peer,
rx_tlv_hdr, rx_tlv_hdr,
HAL_RX_WBM_ERR_SRC_REO); HAL_RX_WBM_ERR_SRC_REO,
link_id);
} else { } else {
/* should not enter here */ /* should not enter here */
dp_rx_err_alert("invalid reo push reason %u", dp_rx_err_alert("invalid reo push reason %u",
@@ -2531,7 +2549,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
if (txrx_peer) if (txrx_peer)
DP_PEER_PER_PKT_STATS_INC(txrx_peer, DP_PEER_PER_PKT_STATS_INC(txrx_peer,
rx.err.rxdma_wifi_parse_err, rx.err.rxdma_wifi_parse_err,
1); 1,
link_id);
pool_id = wbm_err_info.pool_id; pool_id = wbm_err_info.pool_id;
dp_rx_process_rxdma_err(soc, nbuf, dp_rx_process_rxdma_err(soc, nbuf,
@@ -2539,7 +2558,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
txrx_peer, txrx_peer,
wbm_err_info. wbm_err_info.
rxdma_err_code, rxdma_err_code,
pool_id); pool_id,
link_id);
break; break;
case HAL_RXDMA_ERR_TKIP_MIC: case HAL_RXDMA_ERR_TKIP_MIC:
@@ -2549,7 +2569,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
if (txrx_peer) if (txrx_peer)
DP_PEER_PER_PKT_STATS_INC(txrx_peer, DP_PEER_PER_PKT_STATS_INC(txrx_peer,
rx.err.mic_err, rx.err.mic_err,
1); 1,
link_id);
break; break;
case HAL_RXDMA_ERR_DECRYPT: case HAL_RXDMA_ERR_DECRYPT:
@@ -2564,14 +2585,16 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
txrx_peer); txrx_peer);
DP_PEER_PER_PKT_STATS_INC(txrx_peer, DP_PEER_PER_PKT_STATS_INC(txrx_peer,
rx.err.mic_err, rx.err.mic_err,
1); 1,
link_id);
break; break;
} }
if (txrx_peer) { if (txrx_peer) {
DP_PEER_PER_PKT_STATS_INC(txrx_peer, DP_PEER_PER_PKT_STATS_INC(txrx_peer,
rx.err.decrypt_err, rx.err.decrypt_err,
1); 1,
link_id);
dp_rx_nbuf_free(nbuf); dp_rx_nbuf_free(nbuf);
break; break;
} }
@@ -2587,13 +2610,15 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
dp_rx_process_rxdma_err(soc, nbuf, dp_rx_process_rxdma_err(soc, nbuf,
tlv_hdr, NULL, tlv_hdr, NULL,
err_code, err_code,
pool_id); pool_id,
link_id);
break; break;
case HAL_RXDMA_MULTICAST_ECHO: case HAL_RXDMA_MULTICAST_ECHO:
if (txrx_peer) if (txrx_peer)
DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer,
rx.mec_drop, 1, rx.mec_drop, 1,
qdf_nbuf_len(nbuf)); qdf_nbuf_len(nbuf),
link_id);
dp_rx_nbuf_free(nbuf); dp_rx_nbuf_free(nbuf);
break; break;
case HAL_RXDMA_UNAUTHORIZED_WDS: case HAL_RXDMA_UNAUTHORIZED_WDS:
@@ -2604,7 +2629,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
tlv_hdr, tlv_hdr,
txrx_peer, txrx_peer,
err_code, err_code,
pool_id); pool_id,
link_id);
break; break;
default: default:
dp_rx_nbuf_free(nbuf); dp_rx_nbuf_free(nbuf);
@@ -2615,7 +2641,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
== HAL_RX_WBM_RXDMA_PSH_RSN_ROUTE) { == HAL_RX_WBM_RXDMA_PSH_RSN_ROUTE) {
dp_rx_err_route_hdl(soc, nbuf, txrx_peer, dp_rx_err_route_hdl(soc, nbuf, txrx_peer,
rx_tlv_hdr, rx_tlv_hdr,
HAL_RX_WBM_ERR_SRC_RXDMA); HAL_RX_WBM_ERR_SRC_RXDMA,
link_id);
} else if (wbm_err_info.rxdma_psh_rsn } else if (wbm_err_info.rxdma_psh_rsn
== HAL_RX_WBM_RXDMA_PSH_RSN_FLUSH) { == HAL_RX_WBM_RXDMA_PSH_RSN_FLUSH) {
dp_rx_err_err("rxdma push reason %u", dp_rx_err_err("rxdma push reason %u",

View File

@@ -2420,7 +2420,8 @@ struct dp_arch_ops {
uint8_t *rx_tlv_hdr, uint8_t *rx_tlv_hdr,
uint8_t pool_id, uint8_t pool_id,
struct dp_txrx_peer *txrx_peer, struct dp_txrx_peer *txrx_peer,
bool is_reo_exception); bool is_reo_exception,
uint8_t link_id);
}; };
/** /**

View File

@@ -1316,7 +1316,8 @@ QDF_STATUS
dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf, dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
uint8_t *rx_tlv_hdr, uint8_t pool_id, uint8_t *rx_tlv_hdr, uint8_t pool_id,
struct dp_txrx_peer *txrx_peer, struct dp_txrx_peer *txrx_peer,
bool is_reo_exception) bool is_reo_exception,
uint8_t link_id)
{ {
uint32_t pkt_len; uint32_t pkt_len;
uint16_t msdu_len; uint16_t msdu_len;
@@ -1437,7 +1438,8 @@ dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 0, 1); dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 0, 1);
if (dp_rx_err_drop_3addr_mcast(vdev, rx_tlv_hdr)) { if (dp_rx_err_drop_3addr_mcast(vdev, rx_tlv_hdr)) {
DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.mcast_3addr_drop, 1); DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.mcast_3addr_drop, 1,
0);
goto drop_nbuf; goto drop_nbuf;
} }
@@ -1455,7 +1457,7 @@ dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
dp_rx_mcast_echo_check(soc, txrx_peer, rx_tlv_hdr, nbuf)) { dp_rx_mcast_echo_check(soc, txrx_peer, rx_tlv_hdr, nbuf)) {
/* this is a looped back MCBC pkt, drop it */ /* this is a looped back MCBC pkt, drop it */
DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.mec_drop, 1, DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.mec_drop, 1,
qdf_nbuf_len(nbuf)); qdf_nbuf_len(nbuf), 0);
goto drop_nbuf; goto drop_nbuf;
} }
@@ -1466,7 +1468,7 @@ dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
*/ */
if (check_qwrap_multicast_loopback(vdev, nbuf)) { if (check_qwrap_multicast_loopback(vdev, nbuf)) {
DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.mec_drop, 1, DP_PEER_PER_PKT_STATS_INC_PKT(txrx_peer, rx.mec_drop, 1,
qdf_nbuf_len(nbuf)); qdf_nbuf_len(nbuf), 0);
goto drop_nbuf; goto drop_nbuf;
} }
@@ -1474,13 +1476,15 @@ dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
hal_rx_msdu_end_da_is_mcbc_get(soc->hal_soc, hal_rx_msdu_end_da_is_mcbc_get(soc->hal_soc,
rx_tlv_hdr))) { rx_tlv_hdr))) {
dp_err_rl("free buffer for multicast packet"); dp_err_rl("free buffer for multicast packet");
DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.nawds_mcast_drop, 1); DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.nawds_mcast_drop, 1,
0);
goto drop_nbuf; goto drop_nbuf;
} }
if (!dp_wds_rx_policy_check(rx_tlv_hdr, vdev, txrx_peer)) { if (!dp_wds_rx_policy_check(rx_tlv_hdr, vdev, txrx_peer)) {
dp_err_rl("mcast Policy Check Drop pkt"); dp_err_rl("mcast Policy Check Drop pkt");
DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.policy_check_drop, 1); DP_PEER_PER_PKT_STATS_INC(txrx_peer, rx.policy_check_drop, 1,
0);
goto drop_nbuf; goto drop_nbuf;
} }
/* WDS Source Port Learning */ /* WDS Source Port Learning */
@@ -1540,7 +1544,7 @@ dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw)) { if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw)) {
qdf_nbuf_set_next(nbuf, NULL); qdf_nbuf_set_next(nbuf, NULL);
dp_rx_deliver_raw(vdev, nbuf, txrx_peer); dp_rx_deliver_raw(vdev, nbuf, txrx_peer, 0);
} else { } else {
enh_flag = vdev->pdev->enhanced_stats_en; enh_flag = vdev->pdev->enhanced_stats_en;
qdf_nbuf_set_next(nbuf, NULL); qdf_nbuf_set_next(nbuf, NULL);
@@ -1563,12 +1567,17 @@ dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
(vdev->rx_decap_type == (vdev->rx_decap_type ==
htt_cmn_pkt_type_ethernet))) { htt_cmn_pkt_type_ethernet))) {
DP_PEER_MC_INCC_PKT(txrx_peer, 1, qdf_nbuf_len(nbuf), DP_PEER_MC_INCC_PKT(txrx_peer, 1, qdf_nbuf_len(nbuf),
enh_flag); enh_flag, 0);
if (QDF_IS_ADDR_BROADCAST(eh->ether_dhost)) if (QDF_IS_ADDR_BROADCAST(eh->ether_dhost))
DP_PEER_BC_INCC_PKT(txrx_peer, 1, DP_PEER_BC_INCC_PKT(txrx_peer, 1,
qdf_nbuf_len(nbuf), qdf_nbuf_len(nbuf),
enh_flag); enh_flag, 0);
} else {
DP_PEER_UC_INCC_PKT(txrx_peer, 1,
qdf_nbuf_len(nbuf),
enh_flag,
0);
} }
qdf_nbuf_set_exc_frame(nbuf, 1); qdf_nbuf_set_exc_frame(nbuf, 1);

View File

@@ -316,6 +316,7 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc,
* @pool_id: mac id * @pool_id: mac id
* @txrx_peer: txrx peer handle * @txrx_peer: txrx peer handle
* @is_reo_exception: flag to check if the error is from REO or WBM * @is_reo_exception: flag to check if the error is from REO or WBM
* @link_id: link Id on which packet is received
* *
* This function handles NULL queue descriptor violations arising out * This function handles NULL queue descriptor violations arising out
* a missing REO queue for a given peer or a given TID. This typically * a missing REO queue for a given peer or a given TID. This typically
@@ -332,5 +333,6 @@ QDF_STATUS
dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf, dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
uint8_t *rx_tlv_hdr, uint8_t pool_id, uint8_t *rx_tlv_hdr, uint8_t pool_id,
struct dp_txrx_peer *txrx_peer, struct dp_txrx_peer *txrx_peer,
bool is_reo_exception); bool is_reo_exception,
uint8_t link_id);
#endif #endif