qcacmn: set customizable rx_buffer_size

introduce custom rx_buffer_size from INI within the bounds of
2048-4096

Change-Id: I17ad727cea74fc559d6407d3c8662cb6a4cd6b0a
CRs-Fixed: 3631271
This commit is contained in:
Ruben Columbus
2023-10-03 15:51:30 -07:00
committed by Rahul Choudhary
parent a4a989e5b7
commit 70b5c653d0
13 changed files with 109 additions and 26 deletions

View File

@@ -1747,6 +1747,9 @@ dp_rxdma_ring_sel_cfg_be(struct dp_soc *soc)
struct htt_rx_ring_tlv_filter htt_tlv_filter = {0};
struct dp_srng *rx_mac_srng;
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
/*
* In Beryllium chipset msdu_start, mpdu_end
@@ -1832,7 +1835,7 @@ dp_rxdma_ring_sel_cfg_be(struct dp_soc *soc)
htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev,
rx_mac_srng->hal_srng,
RXDMA_BUF, RX_DATA_BUFFER_SIZE,
RXDMA_BUF, buf_size,
&htt_tlv_filter);
}
}
@@ -1853,6 +1856,9 @@ dp_rxdma_ring_sel_cfg_be(struct dp_soc *soc)
struct htt_rx_ring_tlv_filter htt_tlv_filter = {0};
struct dp_srng *rx_mac_srng;
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
/*
* In Beryllium chipset msdu_start, mpdu_end
@@ -1958,7 +1964,7 @@ dp_rxdma_ring_sel_cfg_be(struct dp_soc *soc)
htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev,
rx_mac_srng->hal_srng,
RXDMA_BUF, RX_DATA_BUFFER_SIZE,
RXDMA_BUF, buf_size,
&htt_tlv_filter);
}
}

View File

@@ -226,6 +226,7 @@ uint32_t dp_rx_process_be(struct dp_intr *int_ctx,
uint32_t dsf;
uint32_t l3_pad;
uint8_t link_id = 0;
uint16_t buf_size;
DP_HIST_INIT();
@@ -237,6 +238,7 @@ uint32_t dp_rx_process_be(struct dp_intr *int_ctx,
intr_id = int_ctx->dp_intr_id;
num_entries = hal_srng_get_num_entries(hal_soc, hal_ring_hdl);
dp_runtime_pm_mark_last_busy(soc);
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
more_data:
/* reset local variables here to be re-used in the function */
@@ -400,7 +402,7 @@ more_data:
* reap this MPDU
*/
if ((QDF_NBUF_CB_RX_PKT_LEN(rx_desc->nbuf) /
(RX_DATA_BUFFER_SIZE -
(buf_size -
soc->rx_pkt_tlv_size) + 1) >
num_pending) {
DP_STATS_INC(soc,
@@ -2111,6 +2113,9 @@ dp_rx_null_q_desc_handle_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
uint16_t sa_idx = 0;
bool is_eapol = 0;
bool enh_flag;
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
qdf_nbuf_set_rx_chfrag_start(
nbuf,
@@ -2138,8 +2143,7 @@ dp_rx_null_q_desc_handle_be(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_DATA_BUFFER_SIZE));
qdf_nbuf_set_pktlen(nbuf, qdf_min(pkt_len, (uint32_t)buf_size));
}
/*

View File

@@ -5276,6 +5276,9 @@ void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
uint16_t msdu_len, nbuf_len;
uint8_t *rx_tlv_hdr;
struct hal_rx_msdu_metadata msdu_metadata;
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
if (qdf_unlikely(packetdump_cb)) {
rx_tlv_hdr = qdf_nbuf_data(nbuf);
@@ -5293,8 +5296,7 @@ void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
if (set_pktlen) {
msdu_len = nbuf_len + skip_size;
qdf_nbuf_set_pktlen(nbuf, qdf_min(msdu_len,
(uint16_t)RX_DATA_BUFFER_SIZE));
qdf_nbuf_set_pktlen(nbuf, qdf_min(msdu_len, buf_size));
}
qdf_nbuf_pull_head(nbuf, skip_size);

View File

@@ -3874,8 +3874,11 @@ static qdf_nbuf_t dp_ipa_frag_nbuf_linearize(struct dp_soc *soc,
uint32_t nbuf_len = qdf_nbuf_len(nbuf);
bool is_nbuf_head = true;
uint32_t copy_len = 0;
uint16_t buf_size;
dst_nbuf = qdf_nbuf_alloc(soc->osdev, RX_DATA_BUFFER_SIZE,
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
dst_nbuf = qdf_nbuf_alloc(soc->osdev, buf_size,
RX_BUFFER_RESERVATION,
RX_DATA_BUFFER_ALIGNMENT, FALSE);
@@ -3884,7 +3887,7 @@ static qdf_nbuf_t dp_ipa_frag_nbuf_linearize(struct dp_soc *soc,
return NULL;
}
if ((nbuf_len + L3_HEADER_PADDING) > RX_DATA_BUFFER_SIZE) {
if ((nbuf_len + L3_HEADER_PADDING) > buf_size) {
qdf_nbuf_free(dst_nbuf);
dp_err_rl("nbuf is jumbo data");
return NULL;

View File

@@ -1777,13 +1777,16 @@ static inline bool dp_rx_adjust_nbuf_len(struct dp_soc *soc,
{
bool last_nbuf;
uint32_t pkt_hdr_size;
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
pkt_hdr_size = soc->rx_pkt_tlv_size + l3_pad_len;
if ((*mpdu_len + pkt_hdr_size) > RX_DATA_BUFFER_SIZE) {
qdf_nbuf_set_pktlen(nbuf, RX_DATA_BUFFER_SIZE);
if ((*mpdu_len + pkt_hdr_size) > buf_size) {
qdf_nbuf_set_pktlen(nbuf, buf_size);
last_nbuf = false;
*mpdu_len -= (RX_DATA_BUFFER_SIZE - pkt_hdr_size);
*mpdu_len -= (buf_size - pkt_hdr_size);
} else {
qdf_nbuf_set_pktlen(nbuf, (*mpdu_len + pkt_hdr_size));
last_nbuf = true;
@@ -3305,8 +3308,11 @@ QDF_STATUS dp_rx_pdev_desc_pool_init(struct dp_pdev *pdev)
struct dp_srng *dp_rxdma_srng;
struct rx_desc_pool *rx_desc_pool;
uint32_t target_type = hal_get_target_type(soc->hal_soc);
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
rx_desc_pool = &soc->rx_desc_buf[mac_for_pdev];
if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
/*
* If NSS is enabled, rx_desc_pool is already filled.
@@ -3331,7 +3337,7 @@ QDF_STATUS dp_rx_pdev_desc_pool_init(struct dp_pdev *pdev)
wlan_cfg_get_dp_soc_rx_sw_desc_num(soc->wlan_cfg_ctx);
rx_desc_pool->owner = dp_rx_get_rx_bm_id(soc);
rx_desc_pool->buf_size = RX_DATA_BUFFER_SIZE;
rx_desc_pool->buf_size = buf_size;
rx_desc_pool->buf_alignment = RX_DATA_BUFFER_ALIGNMENT;
/* Disable monitor dest processing via frag */
if (target_type == TARGET_TYPE_QCN9160) {

View File

@@ -886,7 +886,11 @@ dp_rx_null_q_handle_invalid_peer_id_exception(struct dp_soc *soc,
bool dp_rx_check_pkt_len(struct dp_soc *soc, uint32_t pkt_len)
{
if (qdf_unlikely(pkt_len > RX_DATA_BUFFER_SIZE)) {
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
if (qdf_unlikely(pkt_len > buf_size)) {
DP_STATS_INC_PKT(soc, rx.err.rx_invalid_pkt_len,
1, pkt_len);
return true;
@@ -1633,6 +1637,9 @@ dp_rx_err_route_hdl(struct dp_soc *soc, qdf_nbuf_t nbuf,
struct dp_vdev *vdev;
struct hal_rx_msdu_metadata msdu_metadata;
bool is_eapol;
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
qdf_nbuf_set_rx_chfrag_start(
nbuf,
@@ -1659,8 +1666,7 @@ dp_rx_err_route_hdl(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_DATA_BUFFER_SIZE));
qdf_nbuf_set_pktlen(nbuf, qdf_min(pkt_len, (uint32_t)buf_size));
}
/*

View File

@@ -259,6 +259,9 @@ dp_rxdma_ring_sel_cfg_li(struct dp_soc *soc)
struct dp_srng *rx_mac_srng;
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint32_t target_type = hal_get_target_type(soc->hal_soc);
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
if (target_type == TARGET_TYPE_QCN9160)
return status;
@@ -327,7 +330,7 @@ dp_rxdma_ring_sel_cfg_li(struct dp_soc *soc)
rx_mac_srng = dp_get_rxdma_ring(pdev, lmac_id);
htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev,
rx_mac_srng->hal_srng,
RXDMA_BUF, RX_DATA_BUFFER_SIZE,
RXDMA_BUF, buf_size,
&htt_tlv_filter);
}
}
@@ -344,6 +347,9 @@ dp_rxdma_ring_sel_cfg_li(struct dp_soc *soc)
struct dp_srng *rx_mac_srng;
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint32_t target_type = hal_get_target_type(soc->hal_soc);
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
if (target_type == TARGET_TYPE_QCN9160)
return status;
@@ -412,7 +418,7 @@ dp_rxdma_ring_sel_cfg_li(struct dp_soc *soc)
rx_mac_srng = dp_get_rxdma_ring(pdev, lmac_id);
htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev,
rx_mac_srng->hal_srng,
RXDMA_BUF, RX_DATA_BUFFER_SIZE,
RXDMA_BUF, buf_size,
&htt_tlv_filter);
}
}

View File

@@ -245,6 +245,7 @@ uint32_t dp_rx_process_li(struct dp_intr *int_ctx,
uint32_t dsf;
uint32_t max_ast;
uint64_t current_time = 0;
uint16_t buf_size;
DP_HIST_INIT();
@@ -252,6 +253,8 @@ uint32_t dp_rx_process_li(struct dp_intr *int_ctx,
hal_soc = soc->hal_soc;
qdf_assert_always(hal_soc);
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
scn = soc->hif_handle;
intr_id = int_ctx->dp_intr_id;
num_entries = hal_srng_get_num_entries(hal_soc, hal_ring_hdl);
@@ -407,7 +410,7 @@ more_data:
* reap this MPDU
*/
if ((msdu_desc_info.msdu_len /
(RX_DATA_BUFFER_SIZE -
(buf_size -
soc->rx_pkt_tlv_size) + 1) >
num_pending) {
DP_STATS_INC(soc,
@@ -1345,6 +1348,9 @@ dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
uint16_t sa_idx = 0;
bool is_eapol = 0;
bool enh_flag;
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
qdf_nbuf_set_rx_chfrag_start(
nbuf,
@@ -1372,8 +1378,7 @@ dp_rx_null_q_desc_handle_li(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_DATA_BUFFER_SIZE));
qdf_nbuf_set_pktlen(nbuf, qdf_min(pkt_len, (uint32_t)buf_size));
}
/*

View File

@@ -722,6 +722,9 @@ dp_rxdma_ring_sel_cfg_rh(struct dp_soc *soc)
struct htt_rx_ring_tlv_filter htt_tlv_filter = {0};
struct dp_srng *rx_mac_srng;
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
htt_tlv_filter.mpdu_start = 1;
htt_tlv_filter.msdu_start = 1;
@@ -787,7 +790,7 @@ dp_rxdma_ring_sel_cfg_rh(struct dp_soc *soc)
rx_mac_srng = dp_get_rxdma_ring(pdev, lmac_id);
htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev,
rx_mac_srng->hal_srng,
RXDMA_BUF, RX_DATA_BUFFER_SIZE,
RXDMA_BUF, buf_size,
&htt_tlv_filter);
}
}
@@ -807,6 +810,9 @@ dp_rxdma_ring_sel_cfg_rh(struct dp_soc *soc)
struct htt_rx_ring_tlv_filter htt_tlv_filter = {0};
struct dp_srng *rx_mac_srng;
QDF_STATUS status = QDF_STATUS_SUCCESS;
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
htt_tlv_filter.mpdu_start = 1;
htt_tlv_filter.msdu_start = 1;
@@ -872,7 +878,7 @@ dp_rxdma_ring_sel_cfg_rh(struct dp_soc *soc)
rx_mac_srng = dp_get_rxdma_ring(pdev, lmac_id);
htt_h2t_rx_ring_cfg(soc->htt_handle, mac_for_pdev,
rx_mac_srng->hal_srng,
RXDMA_BUF, RX_DATA_BUFFER_SIZE,
RXDMA_BUF, buf_size,
&htt_tlv_filter);
}
}

View File

@@ -380,6 +380,9 @@ dp_rx_decrypt_unecrypt_err_handler_rh(struct dp_soc *soc, qdf_nbuf_t nbuf,
bool is_broadcast;
uint8_t *rx_tlv_hdr;
uint16_t peer_id;
uint16_t buf_size;
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
rx_tlv_hdr = qdf_nbuf_data(nbuf);
@@ -419,7 +422,7 @@ dp_rx_decrypt_unecrypt_err_handler_rh(struct dp_soc *soc, qdf_nbuf_t nbuf,
msdu_len = hal_rx_msdu_start_msdu_len_get(soc->hal_soc, rx_tlv_hdr);
pkt_len = msdu_len + l2_hdr_offset + soc->rx_pkt_tlv_size;
if (qdf_unlikely(pkt_len > RX_DATA_BUFFER_SIZE)) {
if (qdf_unlikely(pkt_len > buf_size)) {
DP_STATS_INC_PKT(soc, rx.err.rx_invalid_pkt_len,
1, pkt_len);
goto free_nbuf;
@@ -748,6 +751,7 @@ dp_rx_data_indication_handler(struct dp_soc *soc, qdf_nbuf_t data_ind,
uint32_t error;
uint32_t error_code;
QDF_STATUS status;
uint16_t buf_size;
DP_HIST_INIT();
@@ -757,6 +761,7 @@ dp_rx_data_indication_handler(struct dp_soc *soc, qdf_nbuf_t data_ind,
scn = soc->hif_handle;
dp_runtime_pm_mark_last_busy(soc);
buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
/* reset local variables here to be re-used in the function */
nbuf_head = NULL;
@@ -834,7 +839,7 @@ dp_rx_data_indication_handler(struct dp_soc *soc, qdf_nbuf_t data_ind,
* reap this MPDU
*/
if ((msdu_len /
(RX_DATA_BUFFER_SIZE -
(buf_size -
soc->rx_pkt_tlv_size) + 1) >
num_pending) {
DP_STATS_INC(soc,

View File

@@ -100,6 +100,8 @@
#define WLAN_CFG_TIME_CONTROL_BP 3000
#define WLAN_CFG_RX_BUFFER_SIZE 2048
#define WLAN_CFG_QREF_CONTROL_SIZE 0
#if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
@@ -183,6 +185,9 @@
#define WLAN_CFG_TIME_CONTROL_BP_MIN 3000
#define WLAN_CFG_TIME_CONTROL_BP_MAX 1800000
#define WLAN_CFG_RX_BUFFER_SIZE_MIN 2048
#define WLAN_CFG_RX_BUFFER_SIZE_MAX 4096
#define WLAN_CFG_QREF_CONTROL_SIZE_MIN 0
#define WLAN_CFG_QREF_CONTROL_SIZE_MAX 4000
@@ -846,6 +851,13 @@
WLAN_CFG_TIME_CONTROL_BP,\
CFG_VALUE_OR_DEFAULT, "DP time control back pressure")
#define CFG_DP_RX_BUFFER_SIZE \
CFG_INI_UINT("dp_rx_buffer_size", \
WLAN_CFG_RX_BUFFER_SIZE_MIN,\
WLAN_CFG_RX_BUFFER_SIZE_MAX,\
WLAN_CFG_RX_BUFFER_SIZE,\
CFG_VALUE_OR_DEFAULT, "DP rx buffer size")
#define CFG_DP_QREF_CONTROL_SIZE \
CFG_INI_UINT("dp_qref_control_size", \
WLAN_CFG_QREF_CONTROL_SIZE_MIN,\
@@ -2173,5 +2185,6 @@
CFG(CFG_DP_TX_CAPT_RADIO_1_RBM_ID) \
CFG(CFG_DP_TX_CAPT_RADIO_2_RBM_ID) \
CFG(CFG_DP_TX_CAPT_RADIO_3_RBM_ID) \
CFG_DP_UMAC_RESET_BUFFER_WINDOW_CFG
CFG_DP_UMAC_RESET_BUFFER_WINDOW_CFG \
CFG(CFG_DP_RX_BUFFER_SIZE)
#endif /* _CFG_DP_H_ */

View File

@@ -4192,6 +4192,7 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc)
wlan_soc_tx_packet_inspect_attach(psoc, wlan_cfg_ctx);
wlan_soc_local_pkt_capture_cfg_attach(psoc, wlan_cfg_ctx);
wlan_soc_umac_reset_cfg_attach(psoc, wlan_cfg_ctx);
wlan_cfg_ctx->rx_buffer_size = cfg_get(psoc, CFG_DP_RX_BUFFER_SIZE);
return wlan_cfg_ctx;
}
@@ -4445,6 +4446,7 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc)
wlan_cfg_ctx->special_frame_msk =
cfg_get(psoc, CFG_SPECIAL_FRAME_MSK);
wlan_soc_umac_reset_cfg_attach(psoc, wlan_cfg_ctx);
wlan_cfg_ctx->rx_buffer_size = cfg_get(psoc, CFG_DP_RX_BUFFER_SIZE);
return wlan_cfg_ctx;
}
@@ -4853,6 +4855,15 @@ int wlan_cfg_time_control_bp(struct wlan_cfg_dp_soc_ctxt *cfg)
return cfg->time_control_bp;
}
int wlan_cfg_rx_buffer_size(struct wlan_cfg_dp_soc_ctxt *cfg)
{
if (cfg->rx_buffer_size < RX_DATA_BUFFER_SIZE)
qdf_assert_always(0);
return cfg->rx_buffer_size;
}
qdf_export_symbol(wlan_cfg_rx_buffer_size);
int wlan_cfg_qref_control_size(struct wlan_cfg_dp_soc_ctxt *cfg)
{
return cfg->qref_control_size;

View File

@@ -177,6 +177,7 @@ struct wlan_srng_cfg {
* @int_timer_threshold_mon_dest: Timer threshold counter for monitor dest
* @tx_ring_size:
* @time_control_bp:
* @rx_buffer_size: skb size
* @qref_control_size: list size for memory history arrays
* @tx_comp_ring_size:
* @tx_comp_ring_size_nss:
@@ -386,6 +387,7 @@ struct wlan_cfg_dp_soc_ctxt {
int int_timer_threshold_mon_dest;
int tx_ring_size;
int time_control_bp;
int rx_buffer_size;
int qref_control_size;
int tx_comp_ring_size;
int tx_comp_ring_size_nss;
@@ -1617,6 +1619,14 @@ void wlan_cfg_set_tx_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg,
*/
int wlan_cfg_time_control_bp(struct wlan_cfg_dp_soc_ctxt *cfg);
/**
* wlan_cfg_rx_buffer_size - Get buffer size for skb
* @cfg: soc configuration context
*
* Return: buffer size
*/
int wlan_cfg_rx_buffer_size(struct wlan_cfg_dp_soc_ctxt *cfg);
/**
* wlan_cfg_qref_control_size - Get debug array size
* @cfg: soc configuration context