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:

committed by
Madan Koyyalamudi

parent
4ae60e4df1
commit
3243b9e4f4
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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",
|
||||||
|
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user