浏览代码

qcacmn: Dont unmap cloned ME buf's before freeing

For ME, cloned nbuf's are not mapped.Hence,these
should not be unmapped before freeing.

Change-Id: I998cd4924781944754a81df7d3675c0a34dc10a0
Debasis Das 4 年之前
父节点
当前提交
a420fc8730
共有 1 个文件被更改,包括 12 次插入3 次删除
  1. 12 3
      dp/wifi3.0/dp_tx.c

+ 12 - 3
dp/wifi3.0/dp_tx.c

@@ -2142,10 +2142,13 @@ qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
 				 */
 				qdf_nbuf_free(msdu_info->u.sg_info
 					      .curr_seg->nbuf);
-				if (msdu_info->u.sg_info.curr_seg->next)
+				if (msdu_info->u.sg_info.curr_seg->next) {
 					msdu_info->u.sg_info.curr_seg =
 						msdu_info->u.sg_info
 						.curr_seg->next;
+					nbuf = msdu_info->u.sg_info
+					       .curr_seg->nbuf;
+				}
 				i++;
 				continue;
 			}
@@ -2227,10 +2230,13 @@ qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
 				 */
 				qdf_nbuf_free(msdu_info->u.sg_info
 					      .curr_seg->nbuf);
-				if (msdu_info->u.sg_info.curr_seg->next)
+				if (msdu_info->u.sg_info.curr_seg->next) {
 					msdu_info->u.sg_info.curr_seg =
 						msdu_info->u.sg_info
 						.curr_seg->next;
+					nbuf = msdu_info->u.sg_info
+					       .curr_seg->nbuf;
+				}
 				i++;
 				continue;
 			}
@@ -3477,13 +3483,16 @@ static inline void dp_tx_comp_free_buf(struct dp_soc *soc,
 			return;
 		}
 	}
+	/* If it's ME frame, dont unmap the cloned nbuf's */
+	if ((desc->flags & DP_TX_DESC_FLAG_ME) && qdf_nbuf_is_cloned(nbuf))
+		goto nbuf_free;
 
 	qdf_nbuf_unmap_nbytes_single(soc->osdev, nbuf,
 				     QDF_DMA_TO_DEVICE, nbuf->len);
 
 	if (desc->flags & DP_TX_DESC_FLAG_MESH_MODE)
 		return dp_mesh_tx_comp_free_buff(soc, desc);
-
+nbuf_free:
 	qdf_nbuf_free(nbuf);
 }