diff --git a/dp/wifi3.0/dp_ipa.c b/dp/wifi3.0/dp_ipa.c index 92dcb35e49..35b80b9d53 100644 --- a/dp/wifi3.0/dp_ipa.c +++ b/dp/wifi3.0/dp_ipa.c @@ -1831,16 +1831,16 @@ static qdf_nbuf_t dp_ipa_frag_nbuf_linearize(struct dp_soc *soc, bool is_nbuf_head = true; uint32_t copy_len = 0; - dst_nbuf = qdf_nbuf_alloc(soc->osdev, RX_BUFFER_SIZE, - RX_BUFFER_RESERVATION, RX_BUFFER_ALIGNMENT, - FALSE); + dst_nbuf = qdf_nbuf_alloc(soc->osdev, RX_DATA_BUFFER_SIZE, + RX_BUFFER_RESERVATION, + RX_DATA_BUFFER_ALIGNMENT, FALSE); if (!dst_nbuf) { dp_err_rl("nbuf allocate fail"); return NULL; } - if ((nbuf_len + L3_HEADER_PADDING) > RX_BUFFER_SIZE) { + if ((nbuf_len + L3_HEADER_PADDING) > RX_DATA_BUFFER_SIZE) { qdf_nbuf_free(dst_nbuf); dp_err_rl("nbuf is jumbo data"); return NULL; diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 3937a902c1..7f79080cbd 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -4804,7 +4804,7 @@ dp_rxdma_ring_sel_cfg(struct dp_soc *soc) htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, soc->rx_refill_buf_ring[lmac_id]. hal_srng, - RXDMA_BUF, RX_BUFFER_SIZE, + RXDMA_BUF, RX_DATA_BUFFER_SIZE, &htt_tlv_filter); } } @@ -6558,13 +6558,14 @@ QDF_STATUS dp_monitor_mode_ring_config(struct dp_soc *soc, uint8_t mac_for_pdev, status = htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, soc->rxdma_mon_buf_ring[ring_num] .hal_srng, - RXDMA_MONITOR_BUF, RX_BUFFER_SIZE, + RXDMA_MONITOR_BUF, + RX_MONITOR_BUFFER_SIZE, &htt_tlv_filter); else status = htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, pdev->rx_mac_buf_ring[ring_num] .hal_srng, - RXDMA_BUF, RX_BUFFER_SIZE, + RXDMA_BUF, RX_DATA_BUFFER_SIZE, &htt_tlv_filter); return status; @@ -6621,7 +6622,7 @@ QDF_STATUS dp_reset_monitor_mode(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, soc->rxdma_mon_status_ring[lmac_id] .hal_srng, - RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, + RXDMA_MONITOR_STATUS, RX_DATA_BUFFER_SIZE, &htt_tlv_filter); } @@ -6835,7 +6836,7 @@ QDF_STATUS dp_pdev_configure_monitor_rings(struct dp_pdev *pdev) soc->rxdma_mon_status_ring[lmac_id] .hal_srng, RXDMA_MONITOR_STATUS, - RX_BUFFER_SIZE, &htt_tlv_filter); + RX_DATA_BUFFER_SIZE, &htt_tlv_filter); } return status; @@ -6969,7 +6970,8 @@ dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, soc->rxdma_mon_status_ring[lmac_id].hal_srng, - RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter); + RXDMA_MONITOR_STATUS, RX_DATA_BUFFER_SIZE, + &htt_tlv_filter); } htt_tlv_filter.mpdu_start = 1; @@ -7060,7 +7062,8 @@ dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev, soc->rxdma_mon_status_ring[lmac_id].hal_srng, - RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter); + RXDMA_MONITOR_STATUS, RX_DATA_BUFFER_SIZE, + &htt_tlv_filter); } return QDF_STATUS_SUCCESS; @@ -7686,7 +7689,8 @@ dp_ppdu_ring_reset(struct dp_pdev *pdev) htt_h2t_rx_ring_cfg(pdev->soc->htt_handle, mac_for_pdev, pdev->soc->rxdma_mon_status_ring[lmac_id].hal_srng, - RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter); + RXDMA_MONITOR_STATUS, RX_DATA_BUFFER_SIZE, + &htt_tlv_filter); } } @@ -7749,7 +7753,8 @@ dp_ppdu_ring_cfg(struct dp_pdev *pdev) htt_h2t_rx_ring_cfg(pdev->soc->htt_handle, mac_for_pdev, pdev->soc->rxdma_mon_status_ring[lmac_id].hal_srng, - RXDMA_MONITOR_STATUS, RX_BUFFER_SIZE, &htt_tlv_filter); + RXDMA_MONITOR_STATUS, RX_DATA_BUFFER_SIZE, + &htt_tlv_filter); } } @@ -11175,7 +11180,7 @@ static void dp_cfr_filter(struct cdp_soc_t *soc_hdl, soc->rxdma_mon_status_ring[mac_id] .hal_srng, RXDMA_MONITOR_STATUS, - RX_BUFFER_SIZE, + RX_DATA_BUFFER_SIZE, &htt_tlv_filter); } } @@ -11313,7 +11318,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, soc->rxdma_mon_status_ring[lmac_id] .hal_srng, RXDMA_MONITOR_STATUS, - RX_BUFFER_SIZE, + RX_DATA_BUFFER_SIZE, &htt_tlv_filter); } @@ -11436,7 +11441,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, soc->rxdma_mon_status_ring[lmac_id] .hal_srng, RXDMA_MONITOR_STATUS, - RX_BUFFER_SIZE, + RX_DATA_BUFFER_SIZE, &htt_tlv_filter); } diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 514bbf0d90..471920c32b 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -123,6 +123,8 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, void *rxdma_ring_entry; union dp_rx_desc_list_elem_t *next; QDF_STATUS ret; + uint16_t buf_size = rx_desc_pool->buf_size; + uint8_t buf_alignment = rx_desc_pool->buf_alignment; void *rxdma_srng; @@ -190,9 +192,9 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, while (count < num_req_buffers) { rx_netbuf = qdf_nbuf_alloc(dp_soc->osdev, - RX_BUFFER_SIZE, + buf_size, RX_BUFFER_RESERVATION, - RX_BUFFER_ALIGNMENT, + buf_alignment, FALSE); if (qdf_unlikely(!rx_netbuf)) { @@ -217,7 +219,7 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, * allocating new nbuf. We can try for 100 times. * this is a temp WAR till we fix it properly. */ - ret = check_x86_paddr(dp_soc, &rx_netbuf, &paddr, dp_pdev); + ret = check_x86_paddr(dp_soc, &rx_netbuf, &paddr, rx_desc_pool); if (ret == QDF_STATUS_E_FAILURE) { DP_STATS_INC(dp_pdev, replenish.x86_fail, 1); break; @@ -256,8 +258,10 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, dp_verbose_debug("replenished buffers %d, rx desc added back to free list %u", count, num_desc_to_free); - DP_STATS_INC_PKT(dp_pdev, replenish.pkts, count, - (RX_BUFFER_SIZE * count)); + /* No need to count the number of bytes received during replenish. + * Therefore set replenish.pkts.bytes as 0. + */ + DP_STATS_INC_PKT(dp_pdev, replenish.pkts, count, 0); free_descs: DP_STATS_INC(dp_pdev, buf_freelist, num_desc_to_free); @@ -1014,15 +1018,15 @@ static inline bool dp_rx_adjust_nbuf_len(qdf_nbuf_t nbuf, uint16_t *mpdu_len) { bool last_nbuf; - if (*mpdu_len > (RX_BUFFER_SIZE - RX_PKT_TLVS_LEN)) { - qdf_nbuf_set_pktlen(nbuf, RX_BUFFER_SIZE); + if (*mpdu_len > (RX_DATA_BUFFER_SIZE - RX_PKT_TLVS_LEN)) { + qdf_nbuf_set_pktlen(nbuf, RX_DATA_BUFFER_SIZE); last_nbuf = false; } else { qdf_nbuf_set_pktlen(nbuf, (*mpdu_len + RX_PKT_TLVS_LEN)); last_nbuf = true; } - *mpdu_len -= (RX_BUFFER_SIZE - RX_PKT_TLVS_LEN); + *mpdu_len -= (RX_DATA_BUFFER_SIZE - RX_PKT_TLVS_LEN); return last_nbuf; } @@ -1901,8 +1905,8 @@ more_data: * reap this MPDU */ if (((msdu_desc_info.msdu_len / - (RX_BUFFER_SIZE - RX_PKT_TLVS_LEN) + 1)) > - num_entries_avail) { + (RX_DATA_BUFFER_SIZE - RX_PKT_TLVS_LEN) + + 1)) > num_entries_avail) { DP_STATS_INC( soc, rx.msdu_scatter_wait_break, @@ -2382,14 +2386,15 @@ dp_rx_pdev_detach(struct dp_pdev *pdev) static QDF_STATUS dp_pdev_nbuf_alloc_and_map(struct dp_soc *dp_soc, qdf_nbuf_t *nbuf, - struct dp_pdev *dp_pdev) + struct dp_pdev *dp_pdev, + struct rx_desc_pool *rx_desc_pool) { qdf_dma_addr_t paddr; QDF_STATUS ret = QDF_STATUS_E_FAILURE; - *nbuf = qdf_nbuf_alloc(dp_soc->osdev, RX_BUFFER_SIZE, - RX_BUFFER_RESERVATION, RX_BUFFER_ALIGNMENT, - FALSE); + *nbuf = qdf_nbuf_alloc(dp_soc->osdev, rx_desc_pool->buf_size, + RX_BUFFER_RESERVATION, + rx_desc_pool->buf_alignment, FALSE); if (!(*nbuf)) { dp_err("nbuf alloc failed"); DP_STATS_INC(dp_pdev, replenish.nbuf_alloc_fail, 1); @@ -2407,7 +2412,7 @@ dp_pdev_nbuf_alloc_and_map(struct dp_soc *dp_soc, qdf_nbuf_t *nbuf, paddr = qdf_nbuf_get_frag_paddr(*nbuf, 0); - ret = check_x86_paddr(dp_soc, nbuf, &paddr, dp_pdev); + ret = check_x86_paddr(dp_soc, nbuf, &paddr, rx_desc_pool); if (ret == QDF_STATUS_E_FAILURE) { qdf_nbuf_unmap_single(dp_soc->osdev, *nbuf, QDF_DMA_FROM_DEVICE); @@ -2495,7 +2500,7 @@ dp_pdev_rx_buffers_attach(struct dp_soc *dp_soc, uint32_t mac_id, break; ret = dp_pdev_nbuf_alloc_and_map(dp_soc, &rx_nbuf_arr[nr_nbuf], - dp_pdev); + dp_pdev, rx_desc_pool); if (QDF_IS_STATUS_ERROR(ret)) break; @@ -2537,8 +2542,11 @@ dp_pdev_rx_buffers_attach(struct dp_soc *dp_soc, uint32_t mac_id, QDF_BUG(0); return QDF_STATUS_E_RESOURCES; } - DP_STATS_INC_PKT(dp_pdev, replenish.pkts, nr_nbuf, - RX_BUFFER_SIZE * nr_nbuf_total); + + /* No need to count the number of bytes received during replenish. + * Therefore set replenish.pkts.bytes as 0. + */ + DP_STATS_INC_PKT(dp_pdev, replenish.pkts, nr_nbuf, 0); return QDF_STATUS_SUCCESS; } @@ -2588,6 +2596,9 @@ dp_rx_pdev_attach(struct dp_pdev *pdev) rx_desc_pool); rx_desc_pool->owner = DP_WBM2SW_RBM; + rx_desc_pool->buf_size = RX_DATA_BUFFER_SIZE; + rx_desc_pool->buf_alignment = RX_DATA_BUFFER_ALIGNMENT; + /* For Rx buffers, WBM release ring is SW RING 3,for all pdev's */ ret_val = dp_rx_fst_attach(soc, pdev); @@ -2626,9 +2637,9 @@ dp_rx_nbuf_prepare(struct dp_soc *soc, struct dp_pdev *pdev) nbuf_retry_count++) { /* Allocate a new skb */ nbuf = qdf_nbuf_alloc(soc->osdev, - RX_BUFFER_SIZE, + RX_DATA_BUFFER_SIZE, RX_BUFFER_RESERVATION, - RX_BUFFER_ALIGNMENT, + RX_DATA_BUFFER_ALIGNMENT, FALSE); if (!nbuf) { @@ -2639,7 +2650,7 @@ dp_rx_nbuf_prepare(struct dp_soc *soc, struct dp_pdev *pdev) buf = qdf_nbuf_data(nbuf); - memset(buf, 0, RX_BUFFER_SIZE); + memset(buf, 0, RX_DATA_BUFFER_SIZE); ret = qdf_nbuf_map_single(soc->osdev, nbuf, QDF_DMA_FROM_DEVICE); diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 26e8f9f709..6f95a91eeb 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -25,13 +25,15 @@ #include "dp_internal.h" #ifdef RXDMA_OPTIMIZATION -#ifdef NO_RX_PKT_HDR_TLV -#define RX_BUFFER_ALIGNMENT 0 -#else -#define RX_BUFFER_ALIGNMENT 128 -#endif /* NO_RX_PKT_HDR_TLV */ +#ifndef RX_DATA_BUFFER_ALIGNMENT +#define RX_DATA_BUFFER_ALIGNMENT 128 +#endif +#ifndef RX_MONITOR_BUFFER_ALIGNMENT +#define RX_MONITOR_BUFFER_ALIGNMENT 128 +#endif #else /* RXDMA_OPTIMIZATION */ -#define RX_BUFFER_ALIGNMENT 4 +#define RX_DATA_BUFFER_ALIGNMENT 4 +#define RX_MONITOR_BUFFER_ALIGNMENT 4 #endif /* RXDMA_OPTIMIZATION */ #ifdef QCA_HOST2FW_RXBUF_RING @@ -613,14 +615,14 @@ void dp_2k_jump_handle(struct dp_soc *soc, qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr, /*for qcn9000 emulation the pcie is complete phy and no address restrictions*/ #if !defined(BUILD_X86) || defined(QCA_WIFI_QCN9000) static inline int check_x86_paddr(struct dp_soc *dp_soc, qdf_nbuf_t *rx_netbuf, - qdf_dma_addr_t *paddr, struct dp_pdev *pdev) + qdf_dma_addr_t *paddr, struct rx_desc_pool *rx_desc_pool) { return QDF_STATUS_SUCCESS; } #else #define MAX_RETRY 100 static inline int check_x86_paddr(struct dp_soc *dp_soc, qdf_nbuf_t *rx_netbuf, - qdf_dma_addr_t *paddr, struct dp_pdev *pdev) + qdf_dma_addr_t *paddr, struct rx_desc_pool *rx_desc_pool) { uint32_t nbuf_retry = 0; int32_t ret; @@ -651,10 +653,10 @@ static inline int check_x86_paddr(struct dp_soc *dp_soc, qdf_nbuf_t *rx_netbuf, } *rx_netbuf = qdf_nbuf_alloc(dp_soc->osdev, - RX_BUFFER_SIZE, - RX_BUFFER_RESERVATION, - RX_BUFFER_ALIGNMENT, - FALSE); + rx_desc_pool->buf_size, + RX_BUFFER_RESERVATION, + rx_desc_pool->buf_alignment, + FALSE); if (qdf_unlikely(!(*rx_netbuf))) return QDF_STATUS_E_FAILURE; diff --git a/dp/wifi3.0/dp_rx_defrag.c b/dp/wifi3.0/dp_rx_defrag.c index 310f4df4fe..3b6910200b 100644 --- a/dp/wifi3.0/dp_rx_defrag.c +++ b/dp/wifi3.0/dp_rx_defrag.c @@ -424,7 +424,7 @@ insert_fail: static QDF_STATUS dp_rx_defrag_tkip_decap(qdf_nbuf_t msdu, uint16_t hdrlen) { uint8_t *ivp, *orig_hdr; - int rx_desc_len = sizeof(struct rx_pkt_tlvs); + int rx_desc_len = SIZE_OF_DATA_RX_TLV; /* start of 802.11 header info */ orig_hdr = (uint8_t *)(qdf_nbuf_data(msdu) + rx_desc_len); @@ -454,7 +454,7 @@ static QDF_STATUS dp_rx_defrag_tkip_decap(qdf_nbuf_t msdu, uint16_t hdrlen) static QDF_STATUS dp_rx_defrag_ccmp_demic(qdf_nbuf_t nbuf, uint16_t hdrlen) { uint8_t *ivp, *orig_hdr; - int rx_desc_len = sizeof(struct rx_pkt_tlvs); + int rx_desc_len = SIZE_OF_DATA_RX_TLV; /* start of the 802.11 header */ orig_hdr = (uint8_t *)(qdf_nbuf_data(nbuf) + rx_desc_len); @@ -481,7 +481,7 @@ static QDF_STATUS dp_rx_defrag_ccmp_demic(qdf_nbuf_t nbuf, uint16_t hdrlen) static QDF_STATUS dp_rx_defrag_ccmp_decap(qdf_nbuf_t nbuf, uint16_t hdrlen) { uint8_t *ivp, *origHdr; - int rx_desc_len = sizeof(struct rx_pkt_tlvs); + int rx_desc_len = SIZE_OF_DATA_RX_TLV; origHdr = (uint8_t *) (qdf_nbuf_data(nbuf) + rx_desc_len); ivp = origHdr + hdrlen; @@ -506,7 +506,7 @@ static QDF_STATUS dp_rx_defrag_ccmp_decap(qdf_nbuf_t nbuf, uint16_t hdrlen) static QDF_STATUS dp_rx_defrag_wep_decap(qdf_nbuf_t msdu, uint16_t hdrlen) { uint8_t *origHdr; - int rx_desc_len = sizeof(struct rx_pkt_tlvs); + int rx_desc_len = SIZE_OF_DATA_RX_TLV; origHdr = (uint8_t *) (qdf_nbuf_data(msdu) + rx_desc_len); qdf_mem_move(origHdr + dp_f_wep.ic_header, origHdr, hdrlen); @@ -639,7 +639,7 @@ static QDF_STATUS dp_rx_defrag_mic(const uint8_t *key, qdf_nbuf_t wbuf, uint32_t l, r; const uint8_t *data; uint32_t space; - int rx_desc_len = sizeof(struct rx_pkt_tlvs); + int rx_desc_len = SIZE_OF_DATA_RX_TLV; dp_rx_defrag_michdr((struct ieee80211_frame *)(qdf_nbuf_data(wbuf) + rx_desc_len), hdr); @@ -871,7 +871,7 @@ static void dp_rx_defrag_err(struct dp_vdev *vdev, qdf_nbuf_t nbuf) { struct ol_if_ops *tops = NULL; struct dp_pdev *pdev = vdev->pdev; - int rx_desc_len = sizeof(struct rx_pkt_tlvs); + int rx_desc_len = SIZE_OF_DATA_RX_TLV; uint8_t *orig_hdr; struct ieee80211_frame *wh; struct cdp_rx_mic_err_info mic_failure_info; @@ -1031,6 +1031,7 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer, struct dp_rx_reorder_array_elem *rx_reorder_array_elem = peer->rx_tid[tid].array; qdf_nbuf_t nbuf_head; + struct rx_desc_pool *rx_desc_pool = NULL; nbuf_head = dp_ipa_handle_rx_reo_reinject(soc, head); if (qdf_unlikely(!nbuf_head)) { @@ -1112,8 +1113,9 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer, dp_ipa_handle_rx_buf_smmu_mapping(soc, head, true); paddr = qdf_nbuf_get_frag_paddr(head, 0); + rx_desc_pool = &soc->rx_desc_buf[pdev->lmac_id]; - ret = check_x86_paddr(soc, &head, &paddr, pdev); + ret = check_x86_paddr(soc, &head, &paddr, rx_desc_pool); if (ret == QDF_STATUS_E_FAILURE) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, diff --git a/dp/wifi3.0/dp_rx_defrag.h b/dp/wifi3.0/dp_rx_defrag.h index 30d35838f7..02d2b1df7c 100644 --- a/dp/wifi3.0/dp_rx_defrag.h +++ b/dp/wifi3.0/dp_rx_defrag.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020 The Linux Foundation. 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 @@ -69,7 +69,7 @@ uint32_t dp_rx_frag_handle(struct dp_soc *soc, hal_ring_desc_t ring_desc, static inline struct ieee80211_frame *dp_rx_frag_get_mac_hdr(uint8_t *rx_desc_info) { - int rx_desc_len = hal_rx_get_desc_len(); + int rx_desc_len = SIZE_OF_DATA_RX_TLV; return (struct ieee80211_frame *)(rx_desc_info + rx_desc_len); } diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index caed5d6d2f..fca1eacc3f 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -513,8 +513,7 @@ void dp_rx_wbm_err_handle_bar(struct dp_soc *soc, */ rx_tlv_hdr = qdf_nbuf_data(nbuf); - bar = (struct ieee80211_frame_bar *)(rx_tlv_hdr + - sizeof(struct rx_pkt_tlvs)); + bar = (struct ieee80211_frame_bar *)(rx_tlv_hdr + SIZE_OF_DATA_RX_TLV); type = bar->i_fc[0] & IEEE80211_FC0_TYPE_MASK; subtype = bar->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; @@ -677,7 +676,7 @@ dp_rx_null_q_handle_invalid_peer_id_exception(struct dp_soc *soc, static inline bool dp_rx_null_q_check_pkt_len_exception(struct dp_soc *soc, uint32_t pkt_len) { - if (qdf_unlikely(pkt_len > RX_BUFFER_SIZE)) { + if (qdf_unlikely(pkt_len > RX_DATA_BUFFER_SIZE)) { DP_STATS_INC_PKT(soc, rx.err.rx_invalid_pkt_len, 1, pkt_len); return true; @@ -762,8 +761,8 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, qdf_nbuf_t nbuf, goto drop_nbuf; /* Set length in nbuf */ - qdf_nbuf_set_pktlen(nbuf, - qdf_min(pkt_len, (uint32_t)RX_BUFFER_SIZE)); + qdf_nbuf_set_pktlen( + nbuf, qdf_min(pkt_len, (uint32_t)RX_DATA_BUFFER_SIZE)); qdf_assert_always(nbuf->data == rx_tlv_hdr); } diff --git a/dp/wifi3.0/dp_rx_mon_dest.c b/dp/wifi3.0/dp_rx_mon_dest.c index 9a0df295f7..0b46146cd7 100644 --- a/dp/wifi3.0/dp_rx_mon_dest.c +++ b/dp/wifi3.0/dp_rx_mon_dest.c @@ -113,8 +113,8 @@ done: static inline void dp_mon_adjust_frag_len(uint32_t *total_len, uint32_t *frag_len) { - if (*total_len >= (RX_BUFFER_SIZE - RX_PKT_TLVS_LEN)) { - *frag_len = RX_BUFFER_SIZE - RX_PKT_TLVS_LEN; + if (*total_len >= (RX_MONITOR_BUFFER_SIZE - RX_PKT_TLVS_LEN)) { + *frag_len = RX_MONITOR_BUFFER_SIZE - RX_PKT_TLVS_LEN; *total_len -= *frag_len; } else { *frag_len = *total_len; @@ -446,7 +446,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, __func__, total_frag_len, frag_len, msdu_list.msdu_info[i].msdu_flags); - rx_pkt_offset = HAL_RX_MON_HW_RX_DESC_SIZE(); + rx_pkt_offset = SIZE_OF_MONITOR_TLV; /* * HW structures call this L3 header padding * -- even though this is actually the offset @@ -537,7 +537,7 @@ void dp_rx_msdus_set_payload(struct dp_soc *soc, qdf_nbuf_t msdu) uint32_t rx_pkt_offset, l2_hdr_offset; data = qdf_nbuf_data(msdu); - rx_pkt_offset = HAL_RX_MON_HW_RX_DESC_SIZE(); + rx_pkt_offset = SIZE_OF_MONITOR_TLV; l2_hdr_offset = hal_rx_msdu_end_l3_hdr_padding_get(soc->hal_soc, data); qdf_nbuf_pull_head(msdu, rx_pkt_offset + l2_hdr_offset); } @@ -1223,6 +1223,8 @@ dp_rx_pdev_mon_buf_attach(struct dp_pdev *pdev, int mac_id) { return status; rx_desc_pool->owner = HAL_RX_BUF_RBM_SW3_BM; + rx_desc_pool->buf_size = RX_MONITOR_BUFFER_SIZE; + rx_desc_pool->buf_alignment = RX_MONITOR_BUFFER_ALIGNMENT; replenish_size = ((num_entries - 1) < MON_BUF_MIN_ALLOC_ENTRIES) ? (num_entries - 1) : MON_BUF_MIN_ALLOC_ENTRIES; diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index 37db9ba5f6..c64794bdc9 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -1420,7 +1420,8 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, uint32_t mac_id, rx_tlv = hal_rx_status_get_next_tlv(rx_tlv); - if ((rx_tlv - rx_tlv_start) >= RX_BUFFER_SIZE) + if ((rx_tlv - rx_tlv_start) >= + RX_DATA_BUFFER_SIZE) break; } while ((tlv_status == HAL_TLV_STATUS_PPDU_NOT_DONE) || @@ -1599,7 +1600,7 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, uint32_t mac_id, hal_srng_src_get_next(hal_soc, mon_status_srng); continue; } - qdf_nbuf_set_pktlen(status_nbuf, RX_BUFFER_SIZE); + qdf_nbuf_set_pktlen(status_nbuf, RX_DATA_BUFFER_SIZE); qdf_nbuf_unmap_single(soc->osdev, status_nbuf, QDF_DMA_FROM_DEVICE); @@ -1934,6 +1935,9 @@ dp_rx_pdev_mon_status_attach(struct dp_pdev *pdev, int ring_id) { if (!QDF_IS_STATUS_SUCCESS(status)) return status; + rx_desc_pool->buf_size = RX_DATA_BUFFER_SIZE; + rx_desc_pool->buf_alignment = RX_DATA_BUFFER_ALIGNMENT; + dp_debug("Mon RX Status Buffers Replenish ring_id=%d", ring_id); status = dp_rx_mon_status_buffers_replenish(soc, ring_id, diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index d36908004b..c9f62dfbcb 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -5682,8 +5682,6 @@ dp_print_pdev_rx_stats(struct dp_pdev *pdev) DP_PRINT_STATS("Replenished:"); DP_PRINT_STATS(" Packets = %d", pdev->stats.replenish.pkts.num); - DP_PRINT_STATS(" Bytes = %llu", - pdev->stats.replenish.pkts.bytes); DP_PRINT_STATS(" Buffers Added To Freelist = %d", pdev->stats.buf_freelist); DP_PRINT_STATS(" Low threshold intr = %d", diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 950f48fecd..51ee721b8e 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -292,6 +292,8 @@ enum dp_cpu_ring_map_types { * @freelist: pointer to free RX descriptor link list * @lock: Protection for the RX descriptor pool * @owner: owner for nbuf + * @buf_size: Buffer size + * @buf_alignment: Buffer alignment */ struct rx_desc_pool { uint32_t pool_size; @@ -304,6 +306,8 @@ struct rx_desc_pool { union dp_rx_desc_list_elem_t *freelist; qdf_spinlock_t lock; uint8_t owner; + uint16_t buf_size; + uint8_t buf_alignment; }; /** diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index f1939b6d83..5913d9a7ab 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -174,13 +174,6 @@ enum { DP_PPDU_STATUS_DONE, }; -static inline -uint32_t HAL_RX_MON_HW_RX_DESC_SIZE(void) -{ - /* return the HW_RX_DESC size */ - return sizeof(struct rx_pkt_tlvs); -} - static inline uint8_t *HAL_RX_MON_DEST_GET_DESC(uint8_t *data) { @@ -191,7 +184,8 @@ static inline uint32_t HAL_RX_DESC_GET_MPDU_LENGTH_ERR(void *hw_desc_addr) { struct rx_attention *rx_attn; - struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr; + struct rx_mon_pkt_tlvs *rx_desc = + (struct rx_mon_pkt_tlvs *)hw_desc_addr; rx_attn = &rx_desc->attn_tlv.rx_attn; @@ -202,7 +196,8 @@ static inline uint32_t HAL_RX_DESC_GET_MPDU_FCS_ERR(void *hw_desc_addr) { struct rx_attention *rx_attn; - struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr; + struct rx_mon_pkt_tlvs *rx_desc = + (struct rx_mon_pkt_tlvs *)hw_desc_addr; rx_attn = &rx_desc->attn_tlv.rx_attn; @@ -219,7 +214,8 @@ uint32_t HAL_RX_DESC_GET_MPDU_FCS_ERR(void *hw_desc_addr) static inline bool HAL_RX_HW_DESC_MPDU_VALID(void *hw_desc_addr) { - struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr; + struct rx_mon_pkt_tlvs *rx_desc = + (struct rx_mon_pkt_tlvs *)hw_desc_addr; uint32_t tlv_tag; tlv_tag = HAL_RX_GET_USER_TLV32_TYPE( diff --git a/hal/wifi3.0/hal_rx.h b/hal/wifi3.0/hal_rx.h index b6228c3db5..eab4d0e49b 100644 --- a/hal/wifi3.0/hal_rx.h +++ b/hal/wifi3.0/hal_rx.h @@ -30,14 +30,13 @@ HAL_RX_MASk(block, field)) >> \ HAL_RX_LSB(block, field)) -#ifdef NO_RX_PKT_HDR_TLV -/* RX_BUFFER_SIZE = 1536 data bytes + 256 RX TLV bytes. We are avoiding - * 128 bytes of RX_PKT_HEADER_TLV. - */ -#define RX_BUFFER_SIZE 1792 -#else -/* RX_BUFFER_SIZE = 1536 data bytes + 384 RX TLV bytes + some spare bytes */ -#define RX_BUFFER_SIZE 2048 +/* BUFFER_SIZE = 1536 data bytes + 384 RX TLV bytes + some spare bytes */ +#ifndef RX_DATA_BUFFER_SIZE +#define RX_DATA_BUFFER_SIZE 2048 +#endif + +#ifndef RX_MONITOR_BUFFER_SIZE +#define RX_MONITOR_BUFFER_SIZE 2048 #endif /* HAL_RX_NON_QOS_TID = NON_QOS_TID which is 16 */ @@ -577,6 +576,9 @@ struct rx_pkt_hdr_tlv { #define RXDMA_OPTIMIZATION +/* rx_pkt_tlvs structure should be used to process Data buffers, monitor status + * buffers, monitor destination buffers and monitor descriptor buffers. + */ #ifdef RXDMA_OPTIMIZATION /* * The RX_PADDING_BYTES is required so that the TLV's don't @@ -611,7 +613,33 @@ struct rx_pkt_tlvs { }; #endif /* RXDMA_OPTIMIZATION */ -#define RX_PKT_TLVS_LEN (sizeof(struct rx_pkt_tlvs)) +/* rx_mon_pkt_tlvs structure should be used to process monitor data buffers */ +#ifdef RXDMA_OPTIMIZATION +struct rx_mon_pkt_tlvs { + struct rx_msdu_end_tlv msdu_end_tlv; /* 72 bytes */ + struct rx_attention_tlv attn_tlv; /* 16 bytes */ + struct rx_msdu_start_tlv msdu_start_tlv;/* 40 bytes */ + uint8_t rx_padding0[RX_PADDING0_BYTES]; /* 4 bytes */ + struct rx_mpdu_start_tlv mpdu_start_tlv;/* 96 bytes */ + struct rx_mpdu_end_tlv mpdu_end_tlv; /* 12 bytes */ + uint8_t rx_padding1[RX_PADDING1_BYTES]; /* 16 bytes */ + struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 128 bytes */ +}; +#else /* RXDMA_OPTIMIZATION */ +struct rx_mon_pkt_tlvs { + struct rx_attention_tlv attn_tlv; + struct rx_mpdu_start_tlv mpdu_start_tlv; + struct rx_msdu_start_tlv msdu_start_tlv; + struct rx_msdu_end_tlv msdu_end_tlv; + struct rx_mpdu_end_tlv mpdu_end_tlv; + struct rx_pkt_hdr_tlv pkt_hdr_tlv; +}; +#endif + +#define SIZE_OF_MONITOR_TLV sizeof(struct rx_mon_pkt_tlvs) +#define SIZE_OF_DATA_RX_TLV sizeof(struct rx_pkt_tlvs) + +#define RX_PKT_TLVS_LEN SIZE_OF_DATA_RX_TLV #ifdef NO_RX_PKT_HDR_TLV static inline uint8_t @@ -2826,7 +2854,7 @@ void hal_rx_defrag_save_info_from_ring_desc(void *msdu_link_desc_va, static inline uint16_t hal_rx_get_desc_len(void) { - return sizeof(struct rx_pkt_tlvs); + return SIZE_OF_DATA_RX_TLV; } /* @@ -3086,10 +3114,13 @@ HAL_RX_DESC_GET_DECAP_FORMAT(void *hw_desc_addr) { static inline uint8_t * HAL_RX_DESC_GET_80211_HDR(void *hw_desc_addr) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, - "[%s][%d] decap format not raw", __func__, __LINE__); - QDF_ASSERT(0); - return 0; + uint8_t *rx_pkt_hdr; + struct rx_mon_pkt_tlvs *rx_desc = + (struct rx_mon_pkt_tlvs *)hw_desc_addr; + + rx_pkt_hdr = &rx_desc->pkt_hdr_tlv.rx_pkt_hdr[0]; + + return rx_pkt_hdr; } #else static inline