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_*_* */