Loading dp/inc/cdp_txrx_cmn_struct.h +2 −5 Original line number Diff line number Diff line /* * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved. * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the Loading Loading @@ -1138,8 +1139,6 @@ enum cdp_pdev_param_type { * * @cdp_psoc_param_en_rate_stats: set rate stats enable/disable * @cdp_psoc_param_en_nss_cfg: set nss cfg * * @cdp_enable_tx_checksum: Flag to specify if HW Tx checksum enabled */ typedef union cdp_config_param_t { /* peer params */ Loading Loading @@ -1209,7 +1208,6 @@ typedef union cdp_config_param_t { int cdp_psoc_param_preferred_hw_mode; bool cdp_psoc_param_pext_stats; bool cdp_enable_tx_checksum; } cdp_config_param_type; /** Loading Loading @@ -1307,7 +1305,6 @@ enum cdp_vdev_param_type { #endif CDP_SAFEMODE, CDP_DROP_UNENC, CDP_ENABLE_CSUM, CDP_ENABLE_IGMP_MCAST_EN, CDP_ENABLE_HLOS_TID_OVERRIDE, #ifdef QCA_SUPPORT_WDS_EXTENDED Loading dp/inc/cdp_txrx_stats_struct.h +2 −0 Original line number Diff line number Diff line Loading @@ -914,6 +914,7 @@ struct protocol_trace_count { * @stbc: Packets in STBC * @ldpc: Packets in LDPC * @retries: Packet retries * @retries_mpdu: mpdu number of successfully transmitted after retries * @non_amsdu_cnt: Number of MSDUs with no MSDU level aggregation * @amsdu_cnt: Number of MSDUs part of AMSDU * @tx_rate: Tx Rate Loading Loading @@ -995,6 +996,7 @@ struct cdp_tx_stats { uint32_t stbc; uint32_t ldpc; uint32_t retries; uint32_t retries_mpdu; uint32_t non_amsdu_cnt; uint32_t amsdu_cnt; uint32_t tx_rate; Loading dp/wifi3.0/dp_internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -853,6 +853,7 @@ static inline void dp_update_vdev_stats(struct dp_soc *soc, tgtobj->tx.ldpc += srcobj->stats.tx.ldpc; tgtobj->tx.pream_punct_cnt += srcobj->stats.tx.pream_punct_cnt; tgtobj->tx.retries += srcobj->stats.tx.retries; tgtobj->tx.retries_mpdu += srcobj->stats.tx.retries_mpdu; tgtobj->tx.non_amsdu_cnt += srcobj->stats.tx.non_amsdu_cnt; tgtobj->tx.amsdu_cnt += srcobj->stats.tx.amsdu_cnt; tgtobj->tx.non_ampdu_cnt += srcobj->stats.tx.non_ampdu_cnt; Loading dp/wifi3.0/dp_main.c +0 −5 Original line number Diff line number Diff line Loading @@ -9324,11 +9324,6 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, val.cdp_vdev_param_mesh_mode); break; #endif case CDP_ENABLE_CSUM: dp_info("vdev_id %d enable Checksum %d", vdev_id, val.cdp_enable_tx_checksum); vdev->csum_enabled = val.cdp_enable_tx_checksum; break; case CDP_ENABLE_HLOS_TID_OVERRIDE: dp_info("vdev_id %d enable hlod tid override %d", vdev_id, val.cdp_vdev_param_hlos_tid_override); Loading dp/wifi3.0/dp_rx_err.c +142 −1 Original line number Diff line number Diff line /* * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the Loading Loading @@ -1624,6 +1625,124 @@ void dp_rx_process_mic_error(struct dp_soc *soc, qdf_nbuf_t nbuf, return; } /** * dp_rx_err_route_hdl() - Function to send EAPOL frames to stack * Free any other packet which comes in * this path. * * @soc: core DP main context * @nbuf: buffer pointer * @peer: peer handle * @rx_tlv_hdr: start of rx tlv header * @err_src: rxdma/reo * * This function indicates EAPOL frame received in wbm error ring to stack. * Any other frame should be dropped. * * Return: SUCCESS if delivered to stack */ static void dp_rx_err_route_hdl(struct dp_soc *soc, qdf_nbuf_t nbuf, struct dp_peer *peer, uint8_t *rx_tlv_hdr, enum hal_rx_wbm_error_source err_src) { uint32_t pkt_len; uint16_t msdu_len; struct dp_vdev *vdev; struct hal_rx_msdu_metadata msdu_metadata; bool is_eapol; hal_rx_msdu_metadata_get(soc->hal_soc, rx_tlv_hdr, &msdu_metadata); msdu_len = hal_rx_msdu_start_msdu_len_get(rx_tlv_hdr); pkt_len = msdu_len + msdu_metadata.l3_hdr_pad + RX_PKT_TLVS_LEN; if (qdf_likely(!qdf_nbuf_is_frag(nbuf))) { if (dp_rx_check_pkt_len(soc, pkt_len)) goto drop_nbuf; /* Set length in nbuf */ qdf_nbuf_set_pktlen( nbuf, qdf_min(pkt_len, (uint32_t)RX_DATA_BUFFER_SIZE)); qdf_assert_always(nbuf->data == rx_tlv_hdr); } /* * Check if DMA completed -- msdu_done is the last bit * to be written */ if (!hal_rx_attn_msdu_done_get(rx_tlv_hdr)) { dp_err_rl("MSDU DONE failure"); hal_rx_dump_pkt_tlvs(soc->hal_soc, rx_tlv_hdr, QDF_TRACE_LEVEL_INFO); qdf_assert(0); } if (!peer) goto drop_nbuf; vdev = peer->vdev; if (!vdev) { dp_err_rl("Null vdev!"); DP_STATS_INC(soc, rx.err.invalid_vdev, 1); goto drop_nbuf; } /* * Advance the packet start pointer by total size of * pre-header TLV's */ if (qdf_nbuf_is_frag(nbuf)) qdf_nbuf_pull_head(nbuf, RX_PKT_TLVS_LEN); else qdf_nbuf_pull_head(nbuf, (msdu_metadata.l3_hdr_pad + RX_PKT_TLVS_LEN)); dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 0, 1); /* * Indicate EAPOL frame to stack only when vap mac address * matches the destination address. */ is_eapol = qdf_nbuf_is_ipv4_eapol_pkt(nbuf); if (is_eapol || qdf_nbuf_is_ipv4_wapi_pkt(nbuf)) { qdf_ether_header_t *eh = (qdf_ether_header_t *)qdf_nbuf_data(nbuf); if (qdf_mem_cmp(eh->ether_dhost, &vdev->mac_addr.raw[0], QDF_MAC_ADDR_SIZE) == 0) { DP_STATS_INC_PKT(vdev, rx.to_stack, 1, qdf_nbuf_len(nbuf)); /* * Update the protocol tag in SKB based on * CCE metadata. */ dp_rx_update_protocol_tag(soc, vdev, nbuf, rx_tlv_hdr, EXCEPTION_DEST_RING_ID, true, true); /* Update the flow tag in SKB based on FSE metadata */ dp_rx_update_flow_tag(soc, vdev, nbuf, rx_tlv_hdr, true); DP_STATS_INC_PKT(peer, rx.to_stack, 1, qdf_nbuf_len(nbuf)); qdf_nbuf_set_exc_frame(nbuf, 1); qdf_nbuf_set_next(nbuf, NULL); dp_rx_deliver_to_stack(soc, vdev, peer, nbuf, NULL); return; } } drop_nbuf: DP_STATS_INCC(soc, rx.reo2rel_route_drop, 1, err_src == HAL_RX_WBM_ERR_SRC_REO); DP_STATS_INCC(soc, rx.rxdma2rel_route_drop, 1, err_src == HAL_RX_WBM_ERR_SRC_RXDMA); qdf_nbuf_free(nbuf); } #ifdef DP_RX_DESC_COOKIE_INVALIDATE /** * dp_rx_link_cookie_check() - Validate link desc cookie Loading Loading @@ -2466,6 +2585,17 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, wbm_err_info.reo_err_code); qdf_nbuf_free(nbuf); } } else if (wbm_err_info.reo_psh_rsn == HAL_RX_WBM_REO_PSH_RSN_ROUTE) { dp_rx_err_route_hdl(soc, nbuf, peer, rx_tlv_hdr, HAL_RX_WBM_ERR_SRC_REO); } else { /* should not enter here */ dp_alert("invalid reo push reason %u", wbm_err_info.reo_psh_rsn); qdf_nbuf_free(nbuf); qdf_assert_always(0); } } else if (wbm_err_info.wbm_err_src == HAL_RX_WBM_ERR_SRC_RXDMA) { Loading Loading @@ -2530,6 +2660,17 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, dp_err_rl("RXDMA error %d", wbm_err_info.rxdma_err_code); } } else if (wbm_err_info.rxdma_psh_rsn == HAL_RX_WBM_RXDMA_PSH_RSN_ROUTE) { dp_rx_err_route_hdl(soc, nbuf, peer, rx_tlv_hdr, HAL_RX_WBM_ERR_SRC_RXDMA); } else { /* should not enter here */ dp_alert("invalid rxdma push reason %u", wbm_err_info.rxdma_psh_rsn); qdf_nbuf_free(nbuf); qdf_assert_always(0); } } else { /* Should not come here */ Loading Loading
dp/inc/cdp_txrx_cmn_struct.h +2 −5 Original line number Diff line number Diff line /* * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved. * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the Loading Loading @@ -1138,8 +1139,6 @@ enum cdp_pdev_param_type { * * @cdp_psoc_param_en_rate_stats: set rate stats enable/disable * @cdp_psoc_param_en_nss_cfg: set nss cfg * * @cdp_enable_tx_checksum: Flag to specify if HW Tx checksum enabled */ typedef union cdp_config_param_t { /* peer params */ Loading Loading @@ -1209,7 +1208,6 @@ typedef union cdp_config_param_t { int cdp_psoc_param_preferred_hw_mode; bool cdp_psoc_param_pext_stats; bool cdp_enable_tx_checksum; } cdp_config_param_type; /** Loading Loading @@ -1307,7 +1305,6 @@ enum cdp_vdev_param_type { #endif CDP_SAFEMODE, CDP_DROP_UNENC, CDP_ENABLE_CSUM, CDP_ENABLE_IGMP_MCAST_EN, CDP_ENABLE_HLOS_TID_OVERRIDE, #ifdef QCA_SUPPORT_WDS_EXTENDED Loading
dp/inc/cdp_txrx_stats_struct.h +2 −0 Original line number Diff line number Diff line Loading @@ -914,6 +914,7 @@ struct protocol_trace_count { * @stbc: Packets in STBC * @ldpc: Packets in LDPC * @retries: Packet retries * @retries_mpdu: mpdu number of successfully transmitted after retries * @non_amsdu_cnt: Number of MSDUs with no MSDU level aggregation * @amsdu_cnt: Number of MSDUs part of AMSDU * @tx_rate: Tx Rate Loading Loading @@ -995,6 +996,7 @@ struct cdp_tx_stats { uint32_t stbc; uint32_t ldpc; uint32_t retries; uint32_t retries_mpdu; uint32_t non_amsdu_cnt; uint32_t amsdu_cnt; uint32_t tx_rate; Loading
dp/wifi3.0/dp_internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -853,6 +853,7 @@ static inline void dp_update_vdev_stats(struct dp_soc *soc, tgtobj->tx.ldpc += srcobj->stats.tx.ldpc; tgtobj->tx.pream_punct_cnt += srcobj->stats.tx.pream_punct_cnt; tgtobj->tx.retries += srcobj->stats.tx.retries; tgtobj->tx.retries_mpdu += srcobj->stats.tx.retries_mpdu; tgtobj->tx.non_amsdu_cnt += srcobj->stats.tx.non_amsdu_cnt; tgtobj->tx.amsdu_cnt += srcobj->stats.tx.amsdu_cnt; tgtobj->tx.non_ampdu_cnt += srcobj->stats.tx.non_ampdu_cnt; Loading
dp/wifi3.0/dp_main.c +0 −5 Original line number Diff line number Diff line Loading @@ -9324,11 +9324,6 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, val.cdp_vdev_param_mesh_mode); break; #endif case CDP_ENABLE_CSUM: dp_info("vdev_id %d enable Checksum %d", vdev_id, val.cdp_enable_tx_checksum); vdev->csum_enabled = val.cdp_enable_tx_checksum; break; case CDP_ENABLE_HLOS_TID_OVERRIDE: dp_info("vdev_id %d enable hlod tid override %d", vdev_id, val.cdp_vdev_param_hlos_tid_override); Loading
dp/wifi3.0/dp_rx_err.c +142 −1 Original line number Diff line number Diff line /* * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the Loading Loading @@ -1624,6 +1625,124 @@ void dp_rx_process_mic_error(struct dp_soc *soc, qdf_nbuf_t nbuf, return; } /** * dp_rx_err_route_hdl() - Function to send EAPOL frames to stack * Free any other packet which comes in * this path. * * @soc: core DP main context * @nbuf: buffer pointer * @peer: peer handle * @rx_tlv_hdr: start of rx tlv header * @err_src: rxdma/reo * * This function indicates EAPOL frame received in wbm error ring to stack. * Any other frame should be dropped. * * Return: SUCCESS if delivered to stack */ static void dp_rx_err_route_hdl(struct dp_soc *soc, qdf_nbuf_t nbuf, struct dp_peer *peer, uint8_t *rx_tlv_hdr, enum hal_rx_wbm_error_source err_src) { uint32_t pkt_len; uint16_t msdu_len; struct dp_vdev *vdev; struct hal_rx_msdu_metadata msdu_metadata; bool is_eapol; hal_rx_msdu_metadata_get(soc->hal_soc, rx_tlv_hdr, &msdu_metadata); msdu_len = hal_rx_msdu_start_msdu_len_get(rx_tlv_hdr); pkt_len = msdu_len + msdu_metadata.l3_hdr_pad + RX_PKT_TLVS_LEN; if (qdf_likely(!qdf_nbuf_is_frag(nbuf))) { if (dp_rx_check_pkt_len(soc, pkt_len)) goto drop_nbuf; /* Set length in nbuf */ qdf_nbuf_set_pktlen( nbuf, qdf_min(pkt_len, (uint32_t)RX_DATA_BUFFER_SIZE)); qdf_assert_always(nbuf->data == rx_tlv_hdr); } /* * Check if DMA completed -- msdu_done is the last bit * to be written */ if (!hal_rx_attn_msdu_done_get(rx_tlv_hdr)) { dp_err_rl("MSDU DONE failure"); hal_rx_dump_pkt_tlvs(soc->hal_soc, rx_tlv_hdr, QDF_TRACE_LEVEL_INFO); qdf_assert(0); } if (!peer) goto drop_nbuf; vdev = peer->vdev; if (!vdev) { dp_err_rl("Null vdev!"); DP_STATS_INC(soc, rx.err.invalid_vdev, 1); goto drop_nbuf; } /* * Advance the packet start pointer by total size of * pre-header TLV's */ if (qdf_nbuf_is_frag(nbuf)) qdf_nbuf_pull_head(nbuf, RX_PKT_TLVS_LEN); else qdf_nbuf_pull_head(nbuf, (msdu_metadata.l3_hdr_pad + RX_PKT_TLVS_LEN)); dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 0, 1); /* * Indicate EAPOL frame to stack only when vap mac address * matches the destination address. */ is_eapol = qdf_nbuf_is_ipv4_eapol_pkt(nbuf); if (is_eapol || qdf_nbuf_is_ipv4_wapi_pkt(nbuf)) { qdf_ether_header_t *eh = (qdf_ether_header_t *)qdf_nbuf_data(nbuf); if (qdf_mem_cmp(eh->ether_dhost, &vdev->mac_addr.raw[0], QDF_MAC_ADDR_SIZE) == 0) { DP_STATS_INC_PKT(vdev, rx.to_stack, 1, qdf_nbuf_len(nbuf)); /* * Update the protocol tag in SKB based on * CCE metadata. */ dp_rx_update_protocol_tag(soc, vdev, nbuf, rx_tlv_hdr, EXCEPTION_DEST_RING_ID, true, true); /* Update the flow tag in SKB based on FSE metadata */ dp_rx_update_flow_tag(soc, vdev, nbuf, rx_tlv_hdr, true); DP_STATS_INC_PKT(peer, rx.to_stack, 1, qdf_nbuf_len(nbuf)); qdf_nbuf_set_exc_frame(nbuf, 1); qdf_nbuf_set_next(nbuf, NULL); dp_rx_deliver_to_stack(soc, vdev, peer, nbuf, NULL); return; } } drop_nbuf: DP_STATS_INCC(soc, rx.reo2rel_route_drop, 1, err_src == HAL_RX_WBM_ERR_SRC_REO); DP_STATS_INCC(soc, rx.rxdma2rel_route_drop, 1, err_src == HAL_RX_WBM_ERR_SRC_RXDMA); qdf_nbuf_free(nbuf); } #ifdef DP_RX_DESC_COOKIE_INVALIDATE /** * dp_rx_link_cookie_check() - Validate link desc cookie Loading Loading @@ -2466,6 +2585,17 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, wbm_err_info.reo_err_code); qdf_nbuf_free(nbuf); } } else if (wbm_err_info.reo_psh_rsn == HAL_RX_WBM_REO_PSH_RSN_ROUTE) { dp_rx_err_route_hdl(soc, nbuf, peer, rx_tlv_hdr, HAL_RX_WBM_ERR_SRC_REO); } else { /* should not enter here */ dp_alert("invalid reo push reason %u", wbm_err_info.reo_psh_rsn); qdf_nbuf_free(nbuf); qdf_assert_always(0); } } else if (wbm_err_info.wbm_err_src == HAL_RX_WBM_ERR_SRC_RXDMA) { Loading Loading @@ -2530,6 +2660,17 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, dp_err_rl("RXDMA error %d", wbm_err_info.rxdma_err_code); } } else if (wbm_err_info.rxdma_psh_rsn == HAL_RX_WBM_RXDMA_PSH_RSN_ROUTE) { dp_rx_err_route_hdl(soc, nbuf, peer, rx_tlv_hdr, HAL_RX_WBM_ERR_SRC_RXDMA); } else { /* should not enter here */ dp_alert("invalid rxdma push reason %u", wbm_err_info.rxdma_psh_rsn); qdf_nbuf_free(nbuf); qdf_assert_always(0); } } else { /* Should not come here */ Loading