Procházet zdrojové kódy

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 před 6 roky
rodič
revize
0c201e23a3
1 změnil soubory, kde provedl 10 přidání a 10 odebrání
  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;