Browse Source

qcacmn: Add CE ring cleanup in hal

Cleanup hal srng for CE rings upon CE ring
cleanup.

Change-Id: I6d52ee1b83c23d74d88a1aca8a7eab2c5a0d186a
Sumedh Baikady 4 năm trước cách đây
mục cha
commit
18ff74028c
3 tập tin đã thay đổi với 38 bổ sung0 xóa
  1. 2 0
      hif/src/ce/ce_api.h
  2. 13 0
      hif/src/ce/ce_main.c
  3. 23 0
      hif/src/ce/ce_service_srng.c

+ 2 - 0
hif/src/ce/ce_api.h

@@ -536,6 +536,8 @@ struct ce_ops {
 	int (*ce_ring_setup)(struct hif_softc *scn, uint8_t ring_type,
 		uint32_t ce_id, struct CE_ring_state *ring,
 		struct CE_attr *attr);
+	void (*ce_srng_cleanup)(struct hif_softc *scn,
+				struct CE_state *CE_state, uint8_t ring_type);
 	QDF_STATUS (*ce_send_nolock)(struct CE_handle *copyeng,
 				     void *per_transfer_context,
 				     qdf_dma_addr_t buffer,

+ 13 - 0
hif/src/ce/ce_main.c

@@ -1782,6 +1782,16 @@ static int ce_ring_setup(struct hif_softc *scn, uint8_t ring_type,
 					      ring, attr);
 }
 
+static void ce_srng_cleanup(struct hif_softc *scn, struct CE_state *CE_state,
+			    uint8_t ring_type)
+{
+	struct HIF_CE_state *hif_state = HIF_GET_CE_STATE(scn);
+
+	if (hif_state->ce_services->ce_srng_cleanup)
+		hif_state->ce_services->ce_srng_cleanup(scn,
+					CE_state, ring_type);
+}
+
 int hif_ce_bus_early_suspend(struct hif_softc *scn)
 {
 	uint8_t ul_pipe, dl_pipe;
@@ -2543,6 +2553,7 @@ void ce_fini(struct CE_handle *copyeng)
 			ce_free_desc_ring(scn, CE_state->id,
 					  CE_state->src_ring,
 					  desc_size);
+		ce_srng_cleanup(scn, CE_state, CE_RING_SRC);
 		qdf_mem_free(CE_state->src_ring);
 	}
 	if (CE_state->dest_ring) {
@@ -2554,6 +2565,7 @@ void ce_fini(struct CE_handle *copyeng)
 			ce_free_desc_ring(scn, CE_state->id,
 					  CE_state->dest_ring,
 					  desc_size);
+		ce_srng_cleanup(scn, CE_state, CE_RING_DEST);
 		qdf_mem_free(CE_state->dest_ring);
 
 		/* epping */
@@ -2574,6 +2586,7 @@ void ce_fini(struct CE_handle *copyeng)
 			ce_free_desc_ring(scn, CE_state->id,
 					  CE_state->status_ring,
 					  desc_size);
+		ce_srng_cleanup(scn, CE_state, CE_RING_STATUS);
 		qdf_mem_free(CE_state->status_ring);
 	}
 

+ 23 - 0
hif/src/ce/ce_service_srng.c

@@ -907,6 +907,28 @@ static int ce_ring_setup_srng(struct hif_softc *scn, uint8_t ring_type,
 	return 0;
 }
 
+static void ce_ring_cleanup_srng(struct hif_softc *scn,
+				 struct CE_state *CE_state,
+				 uint8_t ring_type)
+{
+	hal_ring_handle_t hal_srng = NULL;
+
+	switch (ring_type) {
+	case CE_RING_SRC:
+		hal_srng = (hal_ring_handle_t)CE_state->src_ring->srng_ctx;
+	break;
+	case CE_RING_DEST:
+		hal_srng = (hal_ring_handle_t)CE_state->dest_ring->srng_ctx;
+	break;
+	case CE_RING_STATUS:
+		hal_srng = (hal_ring_handle_t)CE_state->status_ring->srng_ctx;
+	break;
+	}
+
+	if (hal_srng)
+		hal_srng_cleanup(scn->hal_soc, hal_srng);
+}
+
 static void ce_construct_shadow_config_srng(struct hif_softc *scn)
 {
 	struct HIF_CE_state *hif_state = HIF_GET_CE_STATE(scn);
@@ -994,6 +1016,7 @@ int ce_get_index_info_srng(struct hif_softc *scn, void *ce_state,
 static struct ce_ops ce_service_srng = {
 	.ce_get_desc_size = ce_get_desc_size_srng,
 	.ce_ring_setup = ce_ring_setup_srng,
+	.ce_srng_cleanup = ce_ring_cleanup_srng,
 	.ce_sendlist_send = ce_sendlist_send_srng,
 	.ce_completed_recv_next_nolock = ce_completed_recv_next_nolock_srng,
 	.ce_revoke_recv_next = ce_revoke_recv_next_srng,