Parcourir la source

qcacmn: Typecast address before assigning in multicast enhancement path

Not typecasting 64bit value to 16bit value before assigning is causing
corruption of nearby structure members. Typecasting this value fixes
this corruption.

Change-Id: Iddaf697eb90241f9948aeaafe7985b8c2ea63048
Varsha Mishra il y a 6 ans
Parent
commit
0c201e23a3
1 fichiers modifiés avec 10 ajouts et 10 suppressions
  1. 10 10
      dp/wifi3.0/dp_tx.c

+ 10 - 10
dp/wifi3.0/dp_tx.c

@@ -4094,7 +4094,6 @@ dp_tx_me_send_convert_ucast(struct cdp_vdev *vdev_handle, qdf_nbuf_t nbuf,
 	struct dp_tx_seg_info_s *seg_info_head = NULL;
 	struct dp_tx_seg_info_s *seg_info_tail = NULL;
 	struct dp_tx_seg_info_s *seg_info_new;
-	struct dp_tx_frag_info_s data_frag;
 	qdf_dma_addr_t paddr_data;
 	qdf_dma_addr_t paddr_mcbuf = 0;
 	uint8_t empty_entry_mac[QDF_MAC_ADDR_SIZE] = {0};
@@ -4122,13 +4121,7 @@ dp_tx_me_send_convert_ucast(struct cdp_vdev *vdev_handle, qdf_nbuf_t nbuf,
 		return 1;
 	}
 
-	paddr_data = qdf_nbuf_get_frag_paddr(nbuf, 0) + QDF_MAC_ADDR_SIZE;
-
-	/*preparing data fragment*/
-	data_frag.vaddr = qdf_nbuf_data(nbuf) + QDF_MAC_ADDR_SIZE;
-	data_frag.paddr_lo = (uint32_t)paddr_data;
-	data_frag.paddr_hi = (((uint64_t) paddr_data)  >> 32);
-	data_frag.len = len - QDF_MAC_ADDR_SIZE;
+	paddr_data = qdf_nbuf_mapped_paddr_get(nbuf) + QDF_MAC_ADDR_SIZE;
 
 	for (new_mac_idx = 0; new_mac_idx < new_mac_cnt; new_mac_idx++) {
 		dstmac = newmac[new_mac_idx];
@@ -4195,10 +4188,17 @@ dp_tx_me_send_convert_ucast(struct cdp_vdev *vdev_handle, qdf_nbuf_t nbuf,
 		seg_info_new->frags[0].vaddr =  (uint8_t *)mc_uc_buf;
 		seg_info_new->frags[0].paddr_lo = (uint32_t) paddr_mcbuf;
 		seg_info_new->frags[0].paddr_hi =
-			((uint64_t) paddr_mcbuf >> 32);
+			(uint16_t)((uint64_t)paddr_mcbuf >> 32);
 		seg_info_new->frags[0].len = QDF_MAC_ADDR_SIZE;
 
-		seg_info_new->frags[1] = data_frag;
+		/*preparing data fragment*/
+		seg_info_new->frags[1].vaddr =
+			qdf_nbuf_data(nbuf) + QDF_MAC_ADDR_SIZE;
+		seg_info_new->frags[1].paddr_lo = (uint32_t)paddr_data;
+		seg_info_new->frags[1].paddr_hi =
+			(uint16_t)(((uint64_t)paddr_data) >> 32);
+		seg_info_new->frags[1].len = len - QDF_MAC_ADDR_SIZE;
+
 		seg_info_new->nbuf = nbuf_clone;
 		seg_info_new->frag_cnt = 2;
 		seg_info_new->total_len = len;