qcacmn: Unmap before changing skb data

In cases like Tx capture or per packet info, need to unmap
before skb is touched. Add wrapper function to do the same.

Change-Id: I0d13b2d90c80972f346f85960b1297511771516b
This commit is contained in:
Manoj Ekbote
2021-01-19 13:59:43 -08:00
committed by snandini
parent 459084ce35
commit 01ce9c0032
2 changed files with 34 additions and 5 deletions

View File

@@ -102,6 +102,36 @@ dp_update_tx_desc_stats(struct dp_pdev *pdev)
} }
#endif /* CONFIG_WLAN_SYSFS_MEM_STATS */ #endif /* CONFIG_WLAN_SYSFS_MEM_STATS */
#if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(FEATURE_PERPKT_INFO)
static inline
void dp_tx_enh_unmap(struct dp_soc *soc, struct dp_tx_desc_s *desc)
{
qdf_nbuf_unmap_nbytes_single(soc->osdev, desc->nbuf,
QDF_DMA_TO_DEVICE,
desc->nbuf->len);
desc->flags |= DP_TX_DESC_FLAG_UNMAP_DONE;
}
static inline void dp_tx_unmap(struct dp_soc *soc, struct dp_tx_desc_s *desc)
{
if (qdf_likely(!(desc->flags & DP_TX_DESC_FLAG_UNMAP_DONE)))
qdf_nbuf_unmap_nbytes_single(soc->osdev, desc->nbuf,
QDF_DMA_TO_DEVICE,
desc->nbuf->len);
}
#else
static inline
void dp_tx_enh_unmap(struct dp_soc *soc, struct dp_tx_desc_s *desc)
{
}
static inline void dp_tx_unmap(struct dp_soc *soc, struct dp_tx_desc_s *desc)
{
qdf_nbuf_unmap_nbytes_single(soc->osdev, desc->nbuf,
QDF_DMA_TO_DEVICE, desc->nbuf->len);
}
#endif
#ifdef QCA_TX_LIMIT_CHECK #ifdef QCA_TX_LIMIT_CHECK
/** /**
* dp_tx_limit_check - Check if allocated tx descriptors reached * dp_tx_limit_check - Check if allocated tx descriptors reached
@@ -2118,8 +2148,7 @@ static inline void dp_tx_comp_free_buf(struct dp_soc *soc,
if ((desc->flags & DP_TX_DESC_FLAG_ME) && qdf_nbuf_is_cloned(nbuf)) if ((desc->flags & DP_TX_DESC_FLAG_ME) && qdf_nbuf_is_cloned(nbuf))
goto nbuf_free; goto nbuf_free;
qdf_nbuf_unmap_nbytes_single(soc->osdev, nbuf, dp_tx_unmap(soc, desc);
QDF_DMA_TO_DEVICE, nbuf->len);
if (desc->flags & DP_TX_DESC_FLAG_MESH_MODE) if (desc->flags & DP_TX_DESC_FLAG_MESH_MODE)
return dp_mesh_tx_comp_free_buff(soc, desc); return dp_mesh_tx_comp_free_buff(soc, desc);
@@ -3914,6 +3943,8 @@ dp_tx_comp_process_desc(struct dp_soc *soc,
dp_send_completion_to_pkt_capture(soc, desc, ts); dp_send_completion_to_pkt_capture(soc, desc, ts);
if (!(desc->msdu_ext_desc)) { if (!(desc->msdu_ext_desc)) {
dp_tx_enh_unmap(soc, desc);
if (QDF_STATUS_SUCCESS == if (QDF_STATUS_SUCCESS ==
dp_tx_add_to_comp_queue(soc, desc, ts, peer)) { dp_tx_add_to_comp_queue(soc, desc, ts, peer)) {
return; return;
@@ -3925,9 +3956,6 @@ dp_tx_comp_process_desc(struct dp_soc *soc,
peer, ts, peer, ts,
desc->nbuf, desc->nbuf,
time_latency)) { time_latency)) {
qdf_nbuf_unmap_nbytes_single(soc->osdev, desc->nbuf,
QDF_DMA_TO_DEVICE,
desc->nbuf->len);
dp_send_completion_to_stack(soc, dp_send_completion_to_stack(soc,
desc->pdev, desc->pdev,
ts->peer_id, ts->peer_id,

View File

@@ -45,6 +45,7 @@
#define DP_TX_DESC_FLAG_TDLS_FRAME 0x100 #define DP_TX_DESC_FLAG_TDLS_FRAME 0x100
#define DP_TX_DESC_FLAG_ALLOCATED 0x200 #define DP_TX_DESC_FLAG_ALLOCATED 0x200
#define DP_TX_DESC_FLAG_MESH_MODE 0x400 #define DP_TX_DESC_FLAG_MESH_MODE 0x400
#define DP_TX_DESC_FLAG_UNMAP_DONE 0x800
#define DP_TX_EXT_DESC_FLAG_METADATA_VALID 0x1 #define DP_TX_EXT_DESC_FLAG_METADATA_VALID 0x1