qcacmn: Add support for ce_cancel_srng API

ce cacnel is used To release/flush buffers from source SRNGs which have
not been reaped yet. Update this API to use appropriate hal API to reap
all pending buffers.

Change-Id: I6f8179b765f0768f2c2b25cd384b0380b7782414
CRs-Fixed: 2165595
diff --git a/hif/src/ce/ce_service_srng.c b/hif/src/ce/ce_service_srng.c
index 2c2ca93..0f6a3ce 100644
--- a/hif/src/ce/ce_service_srng.c
+++ b/hif/src/ce/ce_service_srng.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -516,7 +516,58 @@
 		unsigned int *transfer_idp,
 		uint32_t *toeplitz_hash_result)
 {
-	return QDF_STATUS_E_INVAL;
+	struct CE_state *CE_state;
+	int status = QDF_STATUS_E_FAILURE;
+	struct CE_ring_state *src_ring;
+	unsigned int nentries_mask;
+	unsigned int sw_index;
+	struct hif_softc *scn;
+	struct ce_srng_src_desc *src_desc;
+
+	CE_state = (struct CE_state *)copyeng;
+	src_ring = CE_state->src_ring;
+	if (!src_ring)
+		return QDF_STATUS_E_FAILURE;
+
+	nentries_mask = src_ring->nentries_mask;
+	sw_index = src_ring->sw_index;
+	scn = CE_state->scn;
+
+	if (hal_srng_access_start(scn->hal_soc, src_ring->srng_ctx)) {
+		status = QDF_STATUS_E_FAILURE;
+		return status;
+	}
+
+	src_desc = hal_srng_src_pending_reap_next(scn->hal_soc,
+			src_ring->srng_ctx);
+	if (src_desc) {
+		/* Return data from completed source descriptor */
+		*bufferp = (qdf_dma_addr_t)
+			(((uint64_t)(src_desc)->buffer_addr_lo +
+			  ((uint64_t)((src_desc)->buffer_addr_hi &
+				  0xFF) << 32)));
+		*nbytesp = src_desc->nbytes;
+		*transfer_idp = src_desc->meta_data;
+		*toeplitz_hash_result = 0; /*src_desc->toeplitz_hash_result;*/
+
+		if (per_CE_contextp)
+			*per_CE_contextp = CE_state->send_context;
+
+		/* sw_index is used more like read index */
+		if (per_transfer_contextp)
+			*per_transfer_contextp =
+				src_ring->per_transfer_context[sw_index];
+
+		src_ring->per_transfer_context[sw_index] = 0;   /* sanity */
+
+		/* Update sw_index */
+		sw_index = CE_RING_IDX_INCR(nentries_mask, sw_index);
+		src_ring->sw_index = sw_index;
+		status = QDF_STATUS_SUCCESS;
+	}
+	hal_srng_access_end_reap(scn->hal_soc, src_ring->srng_ctx);
+
+	return status;
 }
 
 /* Shift bits to convert IS_*_RING_*_WATERMARK_MASK to CE_WM_FLAG_*_* */