Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2d550f22 authored by Vevek Venkatesan's avatar Vevek Venkatesan
Browse files

qcacmn: add hif_grp_irq_deconfigure bus_ops to free ext grp IRQs

As per current design, in failure path of hdd_wlan_start_modules,
mem_free of hif_ext_group is done (in cds_dp_close) before
free_irq (in hdd_hif_close), during next hdd_wlan_start_modules,
request_irq adds new handler entry to the list in irq_desc, this
leads to a crash on accessing older stale entry from irq handler,
so adding a bus_ops hif_grp_irq_deconfigure to free ext grp IRQs.

Change-Id: I4d0a2bee1fabee388cea8a85226fae641165a8d5
CRs-Fixed: 2949400
parent 51d26011
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2352,6 +2352,7 @@ static void dp_soc_interrupt_detach(struct cdp_soc_t *txrx_soc)
	if (soc->intr_mode == DP_INTR_POLL) {
		qdf_timer_free(&soc->int_timer);
	} else {
		hif_deconfigure_ext_group_interrupts(soc->hif_handle);
		hif_deregister_exec_group(soc->hif_handle, "dp_intr");
	}

+1 −0
Original line number Diff line number Diff line
@@ -1238,6 +1238,7 @@ int32_t hif_get_int_ctx_irq_num(struct hif_opaque_softc *softc,
				uint8_t id);

uint32_t hif_configure_ext_group_interrupts(struct hif_opaque_softc *hif_ctx);
void hif_deconfigure_ext_group_interrupts(struct hif_opaque_softc *hif_ctx);
uint32_t  hif_register_ext_group(struct hif_opaque_softc *hif_ctx,
		uint32_t numirq, uint32_t irq[], ext_intr_handler handler,
		void *cb_ctx, const char *context_name,
+2 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2013-2018,2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2013-2018,2020-2021 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
@@ -49,6 +49,7 @@ int hif_ahb_enable_radio(struct hif_pci_softc *sc,
int hif_ahb_configure_irq(struct hif_pci_softc *sc);
int hif_ahb_configure_grp_irq(struct hif_softc *scn,
			      struct hif_exec_context *hif_ext_grp);
void hif_ahb_deconfigure_grp_irq(struct hif_softc *scn);
bool hif_ahb_needs_bmi(struct hif_softc *scn);
void hif_ahb_display_stats(struct hif_softc *scn);
void hif_ahb_clear_stats(struct hif_softc *scn);
+10 −0
Original line number Diff line number Diff line
@@ -262,6 +262,16 @@ int hif_dummy_grp_irq_configure(struct hif_softc *hif_sc,
    return 0;
}

/**
 * hif_dummy_grp_irq_deconfigure - dummy call
 * hif_sc: hif context
 *
 * Return: none
 */
void hif_dummy_grp_irq_deconfigure(struct hif_softc *hif_sc)
{
}

/**
 * hif_dummy_dump_registers - dummy call
 * hif_sc: hif context
+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ void hif_dummy_grp_irq_enable(struct hif_softc *hif_sc, uint32_t grp_id);
void hif_dummy_grp_irq_disable(struct hif_softc *hif_sc, uint32_t grp_id);
int hif_dummy_grp_irq_configure(struct hif_softc *hif_sc,
				struct hif_exec_context *exec);
void hif_dummy_grp_irq_deconfigure(struct hif_softc *hif_sc);
int hif_dummy_dump_registers(struct hif_softc *hif_sc);
void hif_dummy_dump_target_memory(struct hif_softc *hif_sc, void *ramdump_base,
				  uint32_t address, uint32_t size);
Loading