From 0c201e23a3425df7fa266d1ffd9cc6aa52f09ba9 Mon Sep 17 00:00:00 2001 From: Varsha Mishra Date: Mon, 1 Apr 2019 20:53:00 +0530 Subject: [PATCH] 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 --- dp/wifi3.0/dp_tx.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index a3b7b4126472..1fe7596fca4d 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/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;