Bladeren bron

qcacmn: Handle failure scenario for qdf_nbuf_map()

Handle failure scenario for qdf_nbuf_map() API by freeing
allocated memory, returning failure/error etc.

Change-Id: I493fb063c8f57e38525e2dc1701a6e972d2ec0e6
CRs-Fixed: 2028524
Himanshu Agarwal 8 jaren geleden
bovenliggende
commit
fa594d9f08
2 gewijzigde bestanden met toevoegingen van 30 en 7 verwijderingen
  1. 21 6
      htc/htc_send.c
  2. 9 1
      wmi/src/wmi_unified_tlv.c

+ 21 - 6
htc/htc_send.c

@@ -541,6 +541,7 @@ static A_STATUS htc_issue_packets(HTC_TARGET *target,
 	HTC_FRAME_HDR *pHtcHdr;
 	uint32_t data_attr = 0;
 	enum qdf_bus_type bus_type;
+	QDF_STATUS ret;
 
 	bus_type = hif_get_bus_type(target->hif_dev);
 
@@ -610,9 +611,16 @@ static A_STATUS htc_issue_packets(HTC_TARGET *target,
 			 */
 			if (pPacket->PktInfo.AsTx.
 			    Flags & HTC_TX_PACKET_FLAG_FIXUP_NETBUF) {
-				qdf_nbuf_map(target->osdev,
-					     GET_HTC_PACKET_NET_BUF_CONTEXT
-						     (pPacket), QDF_DMA_TO_DEVICE);
+				ret = qdf_nbuf_map(target->osdev,
+					GET_HTC_PACKET_NET_BUF_CONTEXT
+						(pPacket), QDF_DMA_TO_DEVICE);
+				if (ret != QDF_STATUS_SUCCESS) {
+					AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
+					  ("%s: nbuf map failed, endpoint %p\n",
+					   __func__, pEndpoint));
+					status = A_ERROR;
+					break;
+				}
 			}
 		}
 
@@ -1361,6 +1369,7 @@ A_STATUS htc_send_pkts_multiple(HTC_HANDLE HTCHandle, HTC_PACKET_QUEUE *pPktQueu
 	HTC_PACKET *pPacket;
 	qdf_nbuf_t netbuf;
 	HTC_FRAME_HDR *pHtcHdr;
+	QDF_STATUS status;
 
 	AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
 			("+htc_send_pkts_multiple: Queue: %p, Pkts %d \n",
@@ -1418,9 +1427,15 @@ A_STATUS htc_send_pkts_multiple(HTC_HANDLE HTCHandle, HTC_PACKET_QUEUE *pPktQueu
 		 * mapped.  This only applies to non-data frames, since data frames
 		 * were already mapped as they entered into the driver.
 		 */
-		qdf_nbuf_map(target->osdev,
-			     GET_HTC_PACKET_NET_BUF_CONTEXT(pPacket),
-			     QDF_DMA_TO_DEVICE);
+		status = qdf_nbuf_map(target->osdev,
+				GET_HTC_PACKET_NET_BUF_CONTEXT(pPacket),
+				QDF_DMA_TO_DEVICE);
+		if (status != QDF_STATUS_SUCCESS) {
+			AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
+			   ("%s: nbuf map failed, endpoint %p, seq_no. %d\n",
+			   __func__, pEndpoint, pEndpoint->SeqNo));
+			return A_ERROR;
+		}
 
 		pPacket->PktInfo.AsTx.Flags |= HTC_TX_PACKET_FLAG_FIXUP_NETBUF;
 	}

+ 9 - 1
wmi/src/wmi_unified_tlv.c

@@ -2480,6 +2480,7 @@ static QDF_STATUS send_mgmt_cmd_tlv(wmi_unified_t wmi_handle,
 	uint64_t dma_addr;
 	void *qdf_ctx = param->qdf_ctx;
 	uint8_t *bufp;
+	QDF_STATUS status;
 	int32_t bufp_len = (param->frm_len < mgmt_tx_dl_frm_len) ? param->frm_len :
 		mgmt_tx_dl_frm_len;
 
@@ -2508,7 +2509,14 @@ static QDF_STATUS send_mgmt_cmd_tlv(wmi_unified_t wmi_handle,
 							    sizeof(uint32_t)));
 	bufp += WMI_TLV_HDR_SIZE;
 	qdf_mem_copy(bufp, param->pdata, bufp_len);
-	qdf_nbuf_map_single(qdf_ctx, param->tx_frame, QDF_DMA_TO_DEVICE);
+
+	status = qdf_nbuf_map_single(qdf_ctx, param->tx_frame,
+				     QDF_DMA_TO_DEVICE);
+	if (status != QDF_STATUS_SUCCESS) {
+		WMI_LOGE("%s: wmi buf map failed", __func__);
+		goto err1;
+	}
+
 	dma_addr = qdf_nbuf_get_frag_paddr(param->tx_frame, 0);
 	cmd->paddr_lo = (uint32_t)(dma_addr & 0xffffffff);
 #if defined(HTT_PADDR64)