qcacld-3.0: Check per vdev limits for selecting discard frames

When HL Flow Control is enabled, check for per vdev limits for making
a decision on whether frames should be discarded.

Change-Id: Ifde5f763d253eb644f97afeab9e4e1365c23e672
CRs-fixed: 2236321
This commit is contained in:
Ajit Pal Singh
2018-04-26 18:22:16 +05:30
zatwierdzone przez nshrivas
rodzic d6c08f2f0e
commit a9d5382e9a

Wyświetl plik

@@ -161,6 +161,7 @@ ol_tx_queue_discard(
num = ol_tx_desc_pool_size_hl(pdev->ctrl_pdev) - num = ol_tx_desc_pool_size_hl(pdev->ctrl_pdev) -
qdf_atomic_read(&pdev->tx_queue.rsrc_cnt); qdf_atomic_read(&pdev->tx_queue.rsrc_cnt);
else else
/*TODO: Discard frames for a particular vdev only */
num = pdev->tx_queue.rsrc_threshold_hi - num = pdev->tx_queue.rsrc_threshold_hi -
pdev->tx_queue.rsrc_threshold_lo; pdev->tx_queue.rsrc_threshold_lo;
@@ -192,7 +193,7 @@ ol_tx_queue_discard(
ol_tx_queue_flush(pdev); ol_tx_queue_flush(pdev);
} }
#ifdef CONFIG_PER_VDEV_TX_DESC_POOL #ifdef QCA_HL_NETDEV_FLOW_CONTROL
/** /**
* is_ol_tx_discard_frames_success() - check whether currently queued tx frames * is_ol_tx_discard_frames_success() - check whether currently queued tx frames
@@ -202,16 +203,39 @@ ol_tx_queue_discard(
* *
* Return: Success if available tx descriptors are too few * Return: Success if available tx descriptors are too few
*/ */
static bool static inline bool
is_ol_tx_discard_frames_success(struct ol_txrx_pdev_t *pdev, is_ol_tx_discard_frames_success(struct ol_txrx_pdev_t *pdev,
struct ol_tx_desc_t *tx_desc) struct ol_tx_desc_t *tx_desc)
{ {
ol_txrx_vdev_handle vdev; ol_txrx_vdev_handle vdev;
bool discard_frames;
vdev = tx_desc->vdev; vdev = tx_desc->vdev;
return qdf_atomic_read(&vdev->tx_desc_count) >
((ol_tx_desc_pool_size_hl(pdev->ctrl_pdev) >> 1) qdf_spin_lock_bh(&vdev->pdev->tx_mutex);
- TXRX_HL_TX_FLOW_CTRL_MGMT_RESERVED); if (vdev->tx_desc_limit == 0) {
/* Flow control not enabled */
discard_frames = qdf_atomic_read(&pdev->tx_queue.rsrc_cnt) <=
pdev->tx_queue.rsrc_threshold_lo;
} else {
/*
* Discard
* if netbuf is normal priority and tx_desc_count greater than
* queue stop threshold
* AND
* if netbuf is high priority and tx_desc_count greater than
* tx desc limit.
*/
discard_frames = (!ol_tx_desc_is_high_prio(tx_desc->netbuf) &&
qdf_atomic_read(&vdev->tx_desc_count) >
vdev->queue_stop_th) ||
(ol_tx_desc_is_high_prio(tx_desc->netbuf) &&
qdf_atomic_read(&vdev->tx_desc_count) >
vdev->tx_desc_limit);
}
qdf_spin_unlock_bh(&vdev->pdev->tx_mutex);
return discard_frames;
} }
#else #else
@@ -222,7 +246,7 @@ is_ol_tx_discard_frames_success(struct ol_txrx_pdev_t *pdev,
return qdf_atomic_read(&pdev->tx_queue.rsrc_cnt) <= return qdf_atomic_read(&pdev->tx_queue.rsrc_cnt) <=
pdev->tx_queue.rsrc_threshold_lo; pdev->tx_queue.rsrc_threshold_lo;
} }
#endif #endif /* QCA_HL_NETDEV_FLOW_CONTROL */
void void
ol_tx_enqueue( ol_tx_enqueue(