qcacmn: Restrict the tx descriptors for low mem config
For low mem config, use user configured max tx descriptors to limit the allocation of software tx descriptors. Use dp_txrx_pflow_update_pdev_params function to print stats and to update pdev param. Change-Id: I8fa6f0bb8841de68e8dc205ffcb0fde264f1b0e0 CRs-Fixed: 2414452
This commit is contained in:

committed by
nshrivas

parent
3e9d647162
commit
550e69c726
@@ -935,4 +935,21 @@ static inline void dp_peer_unref_del_find_by_id(struct dp_peer *peer)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_WIN
|
||||||
|
/**
|
||||||
|
* dp_pdev_print_delay_stats(): Print pdev level delay stats
|
||||||
|
* @pdev: DP_PDEV handle
|
||||||
|
*
|
||||||
|
* Return:void
|
||||||
|
*/
|
||||||
|
void dp_pdev_print_delay_stats(struct dp_pdev *pdev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_pdev_print_tid_stats(): Print pdev level tid stats
|
||||||
|
* @pdev: DP_PDEV handle
|
||||||
|
*
|
||||||
|
* Return:void
|
||||||
|
*/
|
||||||
|
void dp_pdev_print_tid_stats(struct dp_pdev *pdev);
|
||||||
|
#endif /* CONFIG_WIN */
|
||||||
#endif /* #ifndef _DP_INTERNAL_H_ */
|
#endif /* #ifndef _DP_INTERNAL_H_ */
|
||||||
|
@@ -3424,6 +3424,8 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
|
|||||||
&dp_iterate_update_peer_list);
|
&dp_iterate_update_peer_list);
|
||||||
qdf_event_create(&pdev->fw_peer_stats_event);
|
qdf_event_create(&pdev->fw_peer_stats_event);
|
||||||
|
|
||||||
|
pdev->num_tx_allowed = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
|
||||||
|
|
||||||
return (struct cdp_pdev *)pdev;
|
return (struct cdp_pdev *)pdev;
|
||||||
|
|
||||||
fail1:
|
fail1:
|
||||||
@@ -9339,6 +9341,78 @@ static uint32_t dp_get_cfg(void *soc, enum cdp_dp_cfg cfg)
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_WIN
|
||||||
|
/**
|
||||||
|
* dp_tx_flow_ctrl_configure_pdev() - Configure flow control params
|
||||||
|
* @pdev_hdl: datapath pdev handle
|
||||||
|
* @param: ol ath params
|
||||||
|
* @value: value of the flag
|
||||||
|
* @buff: Buffer to be passed
|
||||||
|
*
|
||||||
|
* Implemented this function same as legacy function. In legacy code, single
|
||||||
|
* function is used to display stats and update pdev params.
|
||||||
|
*
|
||||||
|
* Return: 0 for success. nonzero for failure.
|
||||||
|
*/
|
||||||
|
static uint32_t dp_tx_flow_ctrl_configure_pdev(void *pdev_handle,
|
||||||
|
enum _ol_ath_param_t param,
|
||||||
|
uint32_t value, void *buff)
|
||||||
|
{
|
||||||
|
struct dp_soc *soc = NULL;
|
||||||
|
struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
|
||||||
|
|
||||||
|
if (qdf_unlikely(!pdev))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
soc = pdev->soc;
|
||||||
|
if (!soc)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
switch (param) {
|
||||||
|
case OL_ATH_PARAM_VIDEO_DELAY_STATS_FC:
|
||||||
|
if (value)
|
||||||
|
pdev->delay_stats_flag = true;
|
||||||
|
else
|
||||||
|
pdev->delay_stats_flag = false;
|
||||||
|
break;
|
||||||
|
case OL_ATH_PARAM_VIDEO_STATS_FC:
|
||||||
|
qdf_print("------- TID Stats ------\n");
|
||||||
|
dp_pdev_print_tid_stats(pdev);
|
||||||
|
qdf_print("------ Delay Stats ------\n");
|
||||||
|
dp_pdev_print_delay_stats(pdev);
|
||||||
|
break;
|
||||||
|
case OL_ATH_PARAM_TOTAL_Q_SIZE:
|
||||||
|
{
|
||||||
|
uint32_t tx_min, tx_max;
|
||||||
|
|
||||||
|
tx_min = wlan_cfg_get_min_tx_desc(soc->wlan_cfg_ctx);
|
||||||
|
tx_max = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
|
||||||
|
|
||||||
|
if (!buff) {
|
||||||
|
if ((value >= tx_min) && (value <= tx_max)) {
|
||||||
|
pdev->num_tx_allowed = value;
|
||||||
|
} else {
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_DP,
|
||||||
|
QDF_TRACE_LEVEL_INFO,
|
||||||
|
"Failed to update num_tx_allowed, Q_min = %d Q_max = %d",
|
||||||
|
tx_min, tx_max);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*(int *)buff = pdev->num_tx_allowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
|
||||||
|
"%s: not handled param %d ", __func__, param);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct cdp_cmn_ops dp_ops_cmn = {
|
static struct cdp_cmn_ops dp_ops_cmn = {
|
||||||
.txrx_soc_attach_target = dp_soc_attach_target_wifi3,
|
.txrx_soc_attach_target = dp_soc_attach_target_wifi3,
|
||||||
.txrx_vdev_attach = dp_vdev_attach_wifi3,
|
.txrx_vdev_attach = dp_vdev_attach_wifi3,
|
||||||
@@ -9499,7 +9573,7 @@ static struct cdp_raw_ops dp_ops_raw = {
|
|||||||
|
|
||||||
#ifdef CONFIG_WIN
|
#ifdef CONFIG_WIN
|
||||||
static struct cdp_pflow_ops dp_ops_pflow = {
|
static struct cdp_pflow_ops dp_ops_pflow = {
|
||||||
dp_pdev_tid_stats_display,
|
dp_tx_flow_ctrl_configure_pdev,
|
||||||
};
|
};
|
||||||
#endif /* CONFIG_WIN */
|
#endif /* CONFIG_WIN */
|
||||||
|
|
||||||
|
@@ -3565,14 +3565,7 @@ static inline const char *dp_vow_str_intfrm_delay(uint8_t index)
|
|||||||
return intfrm_delay_bucket[index];
|
return intfrm_delay_bucket[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
|
||||||
* dp_pdev_print_tid_stats(): Print pdev level tid stats
|
|
||||||
* @pdev: DP_PDEV handle
|
|
||||||
*
|
|
||||||
* Return:void
|
|
||||||
*/
|
|
||||||
static inline void
|
|
||||||
dp_pdev_print_tid_stats(struct dp_pdev *pdev)
|
|
||||||
{
|
{
|
||||||
struct cdp_tid_stats *tid_stats;
|
struct cdp_tid_stats *tid_stats;
|
||||||
struct cdp_tid_tx_stats *txstats;
|
struct cdp_tid_tx_stats *txstats;
|
||||||
@@ -3640,14 +3633,7 @@ dp_pdev_print_tid_stats(struct dp_pdev *pdev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
void dp_pdev_print_delay_stats(struct dp_pdev *pdev)
|
||||||
* dp_pdev_print_delay_stats(): Print pdev level delay stats
|
|
||||||
* @pdev: DP_PDEV handle
|
|
||||||
*
|
|
||||||
* Return:void
|
|
||||||
*/
|
|
||||||
static inline void
|
|
||||||
dp_pdev_print_delay_stats(struct dp_pdev *pdev)
|
|
||||||
{
|
{
|
||||||
struct dp_soc *soc = pdev->soc;
|
struct dp_soc *soc = pdev->soc;
|
||||||
struct cdp_tid_tx_stats *txstats = NULL;
|
struct cdp_tid_tx_stats *txstats = NULL;
|
||||||
@@ -3736,47 +3722,4 @@ dp_pdev_print_delay_stats(struct dp_pdev *pdev)
|
|||||||
DP_PRINT_STATS("Avg = %u\n", rxstats->to_stack_delay.avg_delay);
|
DP_PRINT_STATS("Avg = %u\n", rxstats->to_stack_delay.avg_delay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* dp_pdev_tid_stats_display() - Pdev TID stats display
|
|
||||||
* @pdev_hdl: datapath pdev handle
|
|
||||||
* @param: ol ath params
|
|
||||||
* @value: value of the flag
|
|
||||||
* @buff: Buffer to be passed
|
|
||||||
*
|
|
||||||
* Return: 0 for success. nonzero for failure.
|
|
||||||
*/
|
|
||||||
uint32_t dp_pdev_tid_stats_display(void *pdev_handle,
|
|
||||||
enum _ol_ath_param_t param, uint32_t value, void *buff)
|
|
||||||
{
|
|
||||||
struct dp_soc *soc = NULL;
|
|
||||||
struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
|
|
||||||
|
|
||||||
if (qdf_unlikely(!pdev))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
soc = pdev->soc;
|
|
||||||
if (!soc)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
switch (param) {
|
|
||||||
case OL_ATH_PARAM_VIDEO_DELAY_STATS_FC:
|
|
||||||
if (value)
|
|
||||||
pdev->delay_stats_flag = true;
|
|
||||||
else
|
|
||||||
pdev->delay_stats_flag = false;
|
|
||||||
break;
|
|
||||||
case OL_ATH_PARAM_VIDEO_STATS_FC:
|
|
||||||
qdf_print("------- TID Stats ------\n");
|
|
||||||
dp_pdev_print_tid_stats(pdev);
|
|
||||||
qdf_print("------ Delay Stats ------\n");
|
|
||||||
dp_pdev_print_delay_stats(pdev);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
qdf_print("%s: not handled param %d ", __func__, param);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -649,6 +649,39 @@ static void dp_tx_trace_pkt(qdf_nbuf_t skb, uint16_t msdu_id,
|
|||||||
msdu_id, QDF_TX));
|
msdu_id, QDF_TX));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef QCA_512M_CONFIG
|
||||||
|
/**
|
||||||
|
* dp_tx_pdev_pflow_control - Check if allocated tx descriptors reached max
|
||||||
|
* tx descriptor configured value
|
||||||
|
* @vdev: DP vdev handle
|
||||||
|
*
|
||||||
|
* Return: true if allocated tx descriptors reached max configured value, else
|
||||||
|
* false.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
dp_tx_pdev_pflow_control(struct dp_vdev *vdev)
|
||||||
|
{
|
||||||
|
struct dp_pdev *pdev = vdev->pdev;
|
||||||
|
|
||||||
|
if (qdf_atomic_read(&pdev->num_tx_outstanding) >=
|
||||||
|
pdev->num_tx_allowed) {
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
|
||||||
|
"%s: queued packets are more than max tx, drop the frame",
|
||||||
|
__func__);
|
||||||
|
DP_STATS_INC(vdev, tx_i.dropped.desc_na.num, 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline bool
|
||||||
|
dp_tx_pdev_pflow_control(struct dp_vdev *vdev)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dp_tx_desc_prepare_single - Allocate and prepare Tx descriptor
|
* dp_tx_desc_prepare_single - Allocate and prepare Tx descriptor
|
||||||
* @vdev: DP vdev handle
|
* @vdev: DP vdev handle
|
||||||
@@ -675,6 +708,9 @@ struct dp_tx_desc_s *dp_tx_prepare_desc_single(struct dp_vdev *vdev,
|
|||||||
struct dp_pdev *pdev = vdev->pdev;
|
struct dp_pdev *pdev = vdev->pdev;
|
||||||
struct dp_soc *soc = pdev->soc;
|
struct dp_soc *soc = pdev->soc;
|
||||||
|
|
||||||
|
if (dp_tx_pdev_pflow_control(vdev))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
/* Allocate software Tx descriptor */
|
/* Allocate software Tx descriptor */
|
||||||
tx_desc = dp_tx_desc_alloc(soc, desc_pool_id);
|
tx_desc = dp_tx_desc_alloc(soc, desc_pool_id);
|
||||||
if (qdf_unlikely(!tx_desc)) {
|
if (qdf_unlikely(!tx_desc)) {
|
||||||
@@ -810,6 +846,9 @@ static struct dp_tx_desc_s *dp_tx_prepare_desc(struct dp_vdev *vdev,
|
|||||||
struct dp_pdev *pdev = vdev->pdev;
|
struct dp_pdev *pdev = vdev->pdev;
|
||||||
struct dp_soc *soc = pdev->soc;
|
struct dp_soc *soc = pdev->soc;
|
||||||
|
|
||||||
|
if (dp_tx_pdev_pflow_control(vdev))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
/* Allocate software Tx descriptor */
|
/* Allocate software Tx descriptor */
|
||||||
tx_desc = dp_tx_desc_alloc(soc, desc_pool_id);
|
tx_desc = dp_tx_desc_alloc(soc, desc_pool_id);
|
||||||
if (!tx_desc) {
|
if (!tx_desc) {
|
||||||
|
@@ -1393,6 +1393,9 @@ struct dp_pdev {
|
|||||||
|
|
||||||
/* qdf_event for fw_peer_stats */
|
/* qdf_event for fw_peer_stats */
|
||||||
qdf_event_t fw_peer_stats_event;
|
qdf_event_t fw_peer_stats_event;
|
||||||
|
|
||||||
|
/* User configured max number of tx buffers */
|
||||||
|
uint32_t num_tx_allowed;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct dp_peer;
|
struct dp_peer;
|
||||||
|
@@ -143,7 +143,7 @@
|
|||||||
#define WLAN_CFG_TX_COMP_RING_SIZE_MAX 0x80000
|
#define WLAN_CFG_TX_COMP_RING_SIZE_MAX 0x80000
|
||||||
|
|
||||||
#define WLAN_CFG_NUM_TX_DESC_MIN 1024
|
#define WLAN_CFG_NUM_TX_DESC_MIN 1024
|
||||||
#define WLAN_CFG_NUM_TX_DESC_MAX 0x320000
|
#define WLAN_CFG_NUM_TX_DESC_MAX 32768
|
||||||
|
|
||||||
#define WLAN_CFG_NUM_TX_EXT_DESC_MIN 1024
|
#define WLAN_CFG_NUM_TX_EXT_DESC_MIN 1024
|
||||||
#define WLAN_CFG_NUM_TX_EXT_DESC_MAX 0x80000
|
#define WLAN_CFG_NUM_TX_EXT_DESC_MAX 0x80000
|
||||||
|
@@ -267,6 +267,7 @@ struct wlan_cfg_dp_soc_ctxt *wlan_cfg_soc_attach(void *psoc)
|
|||||||
wlan_cfg_ctx->num_tx_ext_desc_pool = cfg_get(psoc,
|
wlan_cfg_ctx->num_tx_ext_desc_pool = cfg_get(psoc,
|
||||||
CFG_DP_TX_EXT_DESC_POOLS);
|
CFG_DP_TX_EXT_DESC_POOLS);
|
||||||
wlan_cfg_ctx->num_tx_desc = cfg_get(psoc, CFG_DP_TX_DESC);
|
wlan_cfg_ctx->num_tx_desc = cfg_get(psoc, CFG_DP_TX_DESC);
|
||||||
|
wlan_cfg_ctx->min_tx_desc = WLAN_CFG_NUM_TX_DESC_MIN;
|
||||||
wlan_cfg_ctx->num_tx_ext_desc = cfg_get(psoc, CFG_DP_TX_EXT_DESC);
|
wlan_cfg_ctx->num_tx_ext_desc = cfg_get(psoc, CFG_DP_TX_EXT_DESC);
|
||||||
wlan_cfg_ctx->htt_packet_type = cfg_get(psoc, CFG_DP_HTT_PACKET_TYPE);
|
wlan_cfg_ctx->htt_packet_type = cfg_get(psoc, CFG_DP_HTT_PACKET_TYPE);
|
||||||
wlan_cfg_ctx->max_peer_id = cfg_get(psoc, CFG_DP_MAX_PEER_ID);
|
wlan_cfg_ctx->max_peer_id = cfg_get(psoc, CFG_DP_MAX_PEER_ID);
|
||||||
@@ -684,6 +685,11 @@ void wlan_cfg_set_num_tx_desc(struct wlan_cfg_dp_soc_ctxt *cfg, int num_desc)
|
|||||||
cfg->num_tx_desc = num_desc;
|
cfg->num_tx_desc = num_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int wlan_cfg_get_min_tx_desc(struct wlan_cfg_dp_soc_ctxt *cfg)
|
||||||
|
{
|
||||||
|
return cfg->min_tx_desc;
|
||||||
|
}
|
||||||
|
|
||||||
int wlan_cfg_get_num_tx_ext_desc(struct wlan_cfg_dp_soc_ctxt *cfg)
|
int wlan_cfg_get_num_tx_ext_desc(struct wlan_cfg_dp_soc_ctxt *cfg)
|
||||||
{
|
{
|
||||||
return cfg->num_tx_ext_desc;
|
return cfg->num_tx_ext_desc;
|
||||||
|
@@ -96,6 +96,7 @@ struct wlan_cfg_dp_pdev_ctxt;
|
|||||||
* @num_tx_desc_pool: Number of Tx Descriptor pools
|
* @num_tx_desc_pool: Number of Tx Descriptor pools
|
||||||
* @num_tx_ext_desc_pool: Number of Tx MSDU extension Descriptor pools
|
* @num_tx_ext_desc_pool: Number of Tx MSDU extension Descriptor pools
|
||||||
* @num_tx_desc: Number of Tx Descriptors per pool
|
* @num_tx_desc: Number of Tx Descriptors per pool
|
||||||
|
* @min_tx_desc: Minimum number of Tx Descriptors per pool
|
||||||
* @num_tx_ext_desc: Number of Tx MSDU extension Descriptors per pool
|
* @num_tx_ext_desc: Number of Tx MSDU extension Descriptors per pool
|
||||||
* @max_peer_id: Maximum value of peer id that FW can assign for a client
|
* @max_peer_id: Maximum value of peer id that FW can assign for a client
|
||||||
* @htt_packet_type: Default 802.11 encapsulation type for any VAP created
|
* @htt_packet_type: Default 802.11 encapsulation type for any VAP created
|
||||||
@@ -149,6 +150,7 @@ struct wlan_cfg_dp_soc_ctxt {
|
|||||||
int num_tx_desc_pool;
|
int num_tx_desc_pool;
|
||||||
int num_tx_ext_desc_pool;
|
int num_tx_ext_desc_pool;
|
||||||
int num_tx_desc;
|
int num_tx_desc;
|
||||||
|
int min_tx_desc;
|
||||||
int num_tx_ext_desc;
|
int num_tx_ext_desc;
|
||||||
int max_peer_id;
|
int max_peer_id;
|
||||||
int htt_packet_type;
|
int htt_packet_type;
|
||||||
@@ -647,6 +649,14 @@ void wlan_cfg_set_num_tx_ext_desc_pool(struct wlan_cfg_dp_soc_ctxt *cfg, int num
|
|||||||
*/
|
*/
|
||||||
int wlan_cfg_get_num_tx_desc(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx);
|
int wlan_cfg_get_num_tx_desc(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wlan_cfg_get_min_tx_desc() - Minimum number of Tx Descriptors per pool
|
||||||
|
* @wlan_cfg_ctx - Configuration Handle
|
||||||
|
*
|
||||||
|
* Return: num_tx_desc
|
||||||
|
*/
|
||||||
|
int wlan_cfg_get_min_tx_desc(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* wlan_cfg_set_num_tx_desc() - Set the number of Tx Descriptors per pool
|
* wlan_cfg_set_num_tx_desc() - Set the number of Tx Descriptors per pool
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user