xref: /wlan-driver/qca-wifi-host-cmn/hif/src/dispatcher/multibus.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2018, 2020-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /* this file dispatches functions to bus specific definitions */
21*5113495bSYour Name #include "hif_debug.h"
22*5113495bSYour Name #include "hif.h"
23*5113495bSYour Name #include "hif_main.h"
24*5113495bSYour Name #include "hif_io32.h"
25*5113495bSYour Name #include "multibus.h"
26*5113495bSYour Name #include "dummy.h"
27*5113495bSYour Name #if defined(HIF_PCI) || defined(HIF_SNOC) || defined(HIF_AHB) || \
28*5113495bSYour Name     defined(HIF_IPCI)
29*5113495bSYour Name #include "ce_main.h"
30*5113495bSYour Name #include "ce_api.h"
31*5113495bSYour Name #include "ce_internal.h"
32*5113495bSYour Name #endif
33*5113495bSYour Name #include "htc_services.h"
34*5113495bSYour Name #include "a_types.h"
35*5113495bSYour Name #include "dummy.h"
36*5113495bSYour Name #include "qdf_module.h"
37*5113495bSYour Name 
38*5113495bSYour Name /**
39*5113495bSYour Name  * hif_initialize_default_ops() - initializes default operations values
40*5113495bSYour Name  * @hif_sc: hif_context
41*5113495bSYour Name  *
42*5113495bSYour Name  * bus specific features should assign their dummy implementations here.
43*5113495bSYour Name  */
hif_initialize_default_ops(struct hif_softc * hif_sc)44*5113495bSYour Name static void hif_initialize_default_ops(struct hif_softc *hif_sc)
45*5113495bSYour Name {
46*5113495bSYour Name 	struct hif_bus_ops *bus_ops = &hif_sc->bus_ops;
47*5113495bSYour Name 
48*5113495bSYour Name 	/* must be filled in by hif_bus_open */
49*5113495bSYour Name 	bus_ops->hif_bus_close = NULL;
50*5113495bSYour Name 	/* dummy implementations */
51*5113495bSYour Name 	bus_ops->hif_display_stats =
52*5113495bSYour Name 		&hif_dummy_display_stats;
53*5113495bSYour Name 	bus_ops->hif_clear_stats =
54*5113495bSYour Name 		&hif_dummy_clear_stats;
55*5113495bSYour Name 	bus_ops->hif_set_bundle_mode = &hif_dummy_set_bundle_mode;
56*5113495bSYour Name 	bus_ops->hif_bus_reset_resume = &hif_dummy_bus_reset_resume;
57*5113495bSYour Name 	bus_ops->hif_bus_suspend_noirq = &hif_dummy_bus_suspend_noirq;
58*5113495bSYour Name 	bus_ops->hif_bus_resume_noirq = &hif_dummy_bus_resume_noirq;
59*5113495bSYour Name 	bus_ops->hif_bus_early_suspend = &hif_dummy_bus_suspend;
60*5113495bSYour Name 	bus_ops->hif_bus_late_resume = &hif_dummy_bus_resume;
61*5113495bSYour Name 	bus_ops->hif_map_ce_to_irq = &hif_dummy_map_ce_to_irq;
62*5113495bSYour Name 	bus_ops->hif_grp_irq_configure = &hif_dummy_grp_irq_configure;
63*5113495bSYour Name 	bus_ops->hif_grp_irq_deconfigure = &hif_dummy_grp_irq_deconfigure;
64*5113495bSYour Name 	bus_ops->hif_config_irq_affinity =
65*5113495bSYour Name 		&hif_dummy_config_irq_affinity;
66*5113495bSYour Name 	bus_ops->hif_config_irq_by_ceid = &hif_dummy_config_irq_by_ceid;
67*5113495bSYour Name 	bus_ops->hif_enable_grp_irqs = &hif_dummy_enable_grp_irqs;
68*5113495bSYour Name 	bus_ops->hif_disable_grp_irqs = &hif_dummy_enable_grp_irqs;
69*5113495bSYour Name 	bus_ops->hif_config_irq_clear_cpu_affinity =
70*5113495bSYour Name 		&hif_dummy_config_irq_clear_cpu_affinity;
71*5113495bSYour Name #ifdef FEATURE_IRQ_AFFINITY
72*5113495bSYour Name 	bus_ops->hif_set_grp_intr_affinity = &hif_dummy_set_grp_intr_affinity;
73*5113495bSYour Name #endif
74*5113495bSYour Name 	bus_ops->hif_affinity_mgr_set_affinity =
75*5113495bSYour Name 		&hif_dummy_affinity_mgr_set_affinity;
76*5113495bSYour Name }
77*5113495bSYour Name 
78*5113495bSYour Name #define NUM_OPS (sizeof(struct hif_bus_ops) / sizeof(void *))
79*5113495bSYour Name 
80*5113495bSYour Name /**
81*5113495bSYour Name  * hif_verify_basic_ops() - ensure required bus apis are defined
82*5113495bSYour Name  * @hif_sc: hif_context
83*5113495bSYour Name  *
84*5113495bSYour Name  * all bus operations must be defined to avoid crashes
85*5113495bSYour Name  * iterate over the structure and ensure all function pointers
86*5113495bSYour Name  * are non null.
87*5113495bSYour Name  *
88*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS if all the operations are defined
89*5113495bSYour Name  */
hif_verify_basic_ops(struct hif_softc * hif_sc)90*5113495bSYour Name static QDF_STATUS hif_verify_basic_ops(struct hif_softc *hif_sc)
91*5113495bSYour Name {
92*5113495bSYour Name 	struct hif_bus_ops *bus_ops = &hif_sc->bus_ops;
93*5113495bSYour Name 	void **ops_array = (void *)bus_ops;
94*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
95*5113495bSYour Name 	int i;
96*5113495bSYour Name 
97*5113495bSYour Name 	for (i = 0; i < NUM_OPS; i++) {
98*5113495bSYour Name 		if (!ops_array[i]) {
99*5113495bSYour Name 			hif_err("ops_array[%d] is null", i);
100*5113495bSYour Name 			status = QDF_STATUS_E_NOSUPPORT;
101*5113495bSYour Name 		}
102*5113495bSYour Name 	}
103*5113495bSYour Name 	return status;
104*5113495bSYour Name }
105*5113495bSYour Name 
106*5113495bSYour Name /**
107*5113495bSYour Name  * hif_bus_get_context_size - API to return size of the bus specific structure
108*5113495bSYour Name  * @bus_type: bus type
109*5113495bSYour Name  *
110*5113495bSYour Name  * Return: sizeof of hif_pci_softc
111*5113495bSYour Name  */
hif_bus_get_context_size(enum qdf_bus_type bus_type)112*5113495bSYour Name int hif_bus_get_context_size(enum qdf_bus_type bus_type)
113*5113495bSYour Name {
114*5113495bSYour Name 	switch (bus_type) {
115*5113495bSYour Name 	case QDF_BUS_TYPE_PCI:
116*5113495bSYour Name 		return hif_pci_get_context_size();
117*5113495bSYour Name 	case QDF_BUS_TYPE_IPCI:
118*5113495bSYour Name 		return hif_ipci_get_context_size();
119*5113495bSYour Name 	case QDF_BUS_TYPE_AHB:
120*5113495bSYour Name 		return hif_ahb_get_context_size();
121*5113495bSYour Name 	case QDF_BUS_TYPE_SNOC:
122*5113495bSYour Name 		return hif_snoc_get_context_size();
123*5113495bSYour Name 	case QDF_BUS_TYPE_SDIO:
124*5113495bSYour Name 		return hif_sdio_get_context_size();
125*5113495bSYour Name 	case QDF_BUS_TYPE_USB:
126*5113495bSYour Name 		return hif_usb_get_context_size();
127*5113495bSYour Name 	default:
128*5113495bSYour Name 		return 0;
129*5113495bSYour Name 	}
130*5113495bSYour Name }
131*5113495bSYour Name 
132*5113495bSYour Name /**
133*5113495bSYour Name  * hif_bus_open() - initialize the bus_ops and call the bus specific open
134*5113495bSYour Name  * @hif_sc: hif_context
135*5113495bSYour Name  * @bus_type: type of bus being enumerated
136*5113495bSYour Name  *
137*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS or error
138*5113495bSYour Name  */
hif_bus_open(struct hif_softc * hif_sc,enum qdf_bus_type bus_type)139*5113495bSYour Name QDF_STATUS hif_bus_open(struct hif_softc *hif_sc,
140*5113495bSYour Name 			enum qdf_bus_type bus_type)
141*5113495bSYour Name {
142*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_INVAL;
143*5113495bSYour Name 
144*5113495bSYour Name 	hif_initialize_default_ops(hif_sc);
145*5113495bSYour Name 
146*5113495bSYour Name 	switch (bus_type) {
147*5113495bSYour Name 	case QDF_BUS_TYPE_PCI:
148*5113495bSYour Name 		status = hif_initialize_pci_ops(hif_sc);
149*5113495bSYour Name 		break;
150*5113495bSYour Name 	case QDF_BUS_TYPE_IPCI:
151*5113495bSYour Name 		status = hif_initialize_ipci_ops(hif_sc);
152*5113495bSYour Name 		break;
153*5113495bSYour Name 	case QDF_BUS_TYPE_SNOC:
154*5113495bSYour Name 		status = hif_initialize_snoc_ops(&hif_sc->bus_ops);
155*5113495bSYour Name 		break;
156*5113495bSYour Name 	case QDF_BUS_TYPE_AHB:
157*5113495bSYour Name 		status = hif_initialize_ahb_ops(&hif_sc->bus_ops);
158*5113495bSYour Name 		break;
159*5113495bSYour Name 	case QDF_BUS_TYPE_SDIO:
160*5113495bSYour Name 		status = hif_initialize_sdio_ops(hif_sc);
161*5113495bSYour Name 		break;
162*5113495bSYour Name 	case QDF_BUS_TYPE_USB:
163*5113495bSYour Name 		status = hif_initialize_usb_ops(&hif_sc->bus_ops);
164*5113495bSYour Name 		break;
165*5113495bSYour Name 	default:
166*5113495bSYour Name 		status = QDF_STATUS_E_NOSUPPORT;
167*5113495bSYour Name 		break;
168*5113495bSYour Name 	}
169*5113495bSYour Name 
170*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
171*5113495bSYour Name 		hif_err("bus_type: %d not supported", bus_type);
172*5113495bSYour Name 		return status;
173*5113495bSYour Name 	}
174*5113495bSYour Name 
175*5113495bSYour Name 	status = hif_verify_basic_ops(hif_sc);
176*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
177*5113495bSYour Name 		return status;
178*5113495bSYour Name 
179*5113495bSYour Name 	return hif_sc->bus_ops.hif_bus_open(hif_sc, bus_type);
180*5113495bSYour Name }
181*5113495bSYour Name 
182*5113495bSYour Name /**
183*5113495bSYour Name  * hif_bus_close() - close the bus
184*5113495bSYour Name  * @hif_sc: hif_context
185*5113495bSYour Name  */
hif_bus_close(struct hif_softc * hif_sc)186*5113495bSYour Name void hif_bus_close(struct hif_softc *hif_sc)
187*5113495bSYour Name {
188*5113495bSYour Name 	hif_sc->bus_ops.hif_bus_close(hif_sc);
189*5113495bSYour Name }
190*5113495bSYour Name 
191*5113495bSYour Name /**
192*5113495bSYour Name  * hif_bus_prevent_linkdown() - prevent linkdown
193*5113495bSYour Name  * @hif_sc: hif context
194*5113495bSYour Name  * @flag: true = keep bus alive false = let bus go to sleep
195*5113495bSYour Name  *
196*5113495bSYour Name  * Keeps the bus awake during suspend.
197*5113495bSYour Name  */
hif_bus_prevent_linkdown(struct hif_softc * hif_sc,bool flag)198*5113495bSYour Name void hif_bus_prevent_linkdown(struct hif_softc *hif_sc, bool flag)
199*5113495bSYour Name {
200*5113495bSYour Name 	hif_sc->bus_ops.hif_bus_prevent_linkdown(hif_sc, flag);
201*5113495bSYour Name }
202*5113495bSYour Name 
203*5113495bSYour Name 
hif_reset_soc(struct hif_opaque_softc * hif_ctx)204*5113495bSYour Name void hif_reset_soc(struct hif_opaque_softc *hif_ctx)
205*5113495bSYour Name {
206*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
207*5113495bSYour Name 
208*5113495bSYour Name 	hif_sc->bus_ops.hif_reset_soc(hif_sc);
209*5113495bSYour Name }
210*5113495bSYour Name 
hif_bus_early_suspend(struct hif_opaque_softc * hif_ctx)211*5113495bSYour Name int hif_bus_early_suspend(struct hif_opaque_softc *hif_ctx)
212*5113495bSYour Name {
213*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
214*5113495bSYour Name 
215*5113495bSYour Name 	return hif_sc->bus_ops.hif_bus_early_suspend(hif_sc);
216*5113495bSYour Name }
217*5113495bSYour Name 
hif_bus_late_resume(struct hif_opaque_softc * hif_ctx)218*5113495bSYour Name int hif_bus_late_resume(struct hif_opaque_softc *hif_ctx)
219*5113495bSYour Name {
220*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
221*5113495bSYour Name 
222*5113495bSYour Name 	return hif_sc->bus_ops.hif_bus_late_resume(hif_sc);
223*5113495bSYour Name }
224*5113495bSYour Name 
hif_bus_suspend(struct hif_opaque_softc * hif_ctx)225*5113495bSYour Name int hif_bus_suspend(struct hif_opaque_softc *hif_ctx)
226*5113495bSYour Name {
227*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
228*5113495bSYour Name 
229*5113495bSYour Name 	return hif_sc->bus_ops.hif_bus_suspend(hif_sc);
230*5113495bSYour Name }
231*5113495bSYour Name 
hif_bus_resume(struct hif_opaque_softc * hif_ctx)232*5113495bSYour Name int hif_bus_resume(struct hif_opaque_softc *hif_ctx)
233*5113495bSYour Name {
234*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
235*5113495bSYour Name 
236*5113495bSYour Name 	return hif_sc->bus_ops.hif_bus_resume(hif_sc);
237*5113495bSYour Name }
238*5113495bSYour Name 
hif_bus_suspend_noirq(struct hif_opaque_softc * hif_ctx)239*5113495bSYour Name int hif_bus_suspend_noirq(struct hif_opaque_softc *hif_ctx)
240*5113495bSYour Name {
241*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
242*5113495bSYour Name 
243*5113495bSYour Name 	return hif_sc->bus_ops.hif_bus_suspend_noirq(hif_sc);
244*5113495bSYour Name }
245*5113495bSYour Name 
hif_bus_resume_noirq(struct hif_opaque_softc * hif_ctx)246*5113495bSYour Name int hif_bus_resume_noirq(struct hif_opaque_softc *hif_ctx)
247*5113495bSYour Name {
248*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
249*5113495bSYour Name 
250*5113495bSYour Name 	return hif_sc->bus_ops.hif_bus_resume_noirq(hif_sc);
251*5113495bSYour Name }
252*5113495bSYour Name 
hif_target_sleep_state_adjust(struct hif_softc * hif_sc,bool sleep_ok,bool wait_for_it)253*5113495bSYour Name int hif_target_sleep_state_adjust(struct hif_softc *hif_sc,
254*5113495bSYour Name 			      bool sleep_ok, bool wait_for_it)
255*5113495bSYour Name {
256*5113495bSYour Name 	return hif_sc->bus_ops.hif_target_sleep_state_adjust(hif_sc,
257*5113495bSYour Name 			sleep_ok, wait_for_it);
258*5113495bSYour Name }
259*5113495bSYour Name qdf_export_symbol(hif_target_sleep_state_adjust);
260*5113495bSYour Name 
hif_disable_isr(struct hif_opaque_softc * hif_hdl)261*5113495bSYour Name void hif_disable_isr(struct hif_opaque_softc *hif_hdl)
262*5113495bSYour Name {
263*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_hdl);
264*5113495bSYour Name 
265*5113495bSYour Name 	hif_sc->bus_ops.hif_disable_isr(hif_sc);
266*5113495bSYour Name }
267*5113495bSYour Name 
hif_nointrs(struct hif_softc * hif_sc)268*5113495bSYour Name void hif_nointrs(struct hif_softc *hif_sc)
269*5113495bSYour Name {
270*5113495bSYour Name 	hif_sc->bus_ops.hif_nointrs(hif_sc);
271*5113495bSYour Name }
272*5113495bSYour Name 
hif_enable_bus(struct hif_softc * hif_sc,struct device * dev,void * bdev,const struct hif_bus_id * bid,enum hif_enable_type type)273*5113495bSYour Name QDF_STATUS hif_enable_bus(struct hif_softc *hif_sc, struct device *dev,
274*5113495bSYour Name 			  void *bdev, const struct hif_bus_id *bid,
275*5113495bSYour Name 			  enum hif_enable_type type)
276*5113495bSYour Name {
277*5113495bSYour Name 	return hif_sc->bus_ops.hif_enable_bus(hif_sc, dev, bdev, bid, type);
278*5113495bSYour Name }
279*5113495bSYour Name 
hif_disable_bus(struct hif_softc * hif_sc)280*5113495bSYour Name void hif_disable_bus(struct hif_softc *hif_sc)
281*5113495bSYour Name {
282*5113495bSYour Name 	hif_sc->bus_ops.hif_disable_bus(hif_sc);
283*5113495bSYour Name }
284*5113495bSYour Name 
hif_bus_configure(struct hif_softc * hif_sc)285*5113495bSYour Name int hif_bus_configure(struct hif_softc *hif_sc)
286*5113495bSYour Name {
287*5113495bSYour Name 	return hif_sc->bus_ops.hif_bus_configure(hif_sc);
288*5113495bSYour Name }
289*5113495bSYour Name 
hif_get_config_item(struct hif_opaque_softc * hif_ctx,int opcode,void * config,uint32_t config_len)290*5113495bSYour Name QDF_STATUS hif_get_config_item(struct hif_opaque_softc *hif_ctx,
291*5113495bSYour Name 		     int opcode, void *config, uint32_t config_len)
292*5113495bSYour Name {
293*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
294*5113495bSYour Name 
295*5113495bSYour Name 	return hif_sc->bus_ops.hif_get_config_item(hif_sc, opcode, config,
296*5113495bSYour Name 						 config_len);
297*5113495bSYour Name }
298*5113495bSYour Name 
hif_set_mailbox_swap(struct hif_opaque_softc * hif_ctx)299*5113495bSYour Name void hif_set_mailbox_swap(struct hif_opaque_softc *hif_ctx)
300*5113495bSYour Name {
301*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
302*5113495bSYour Name 
303*5113495bSYour Name 	hif_sc->bus_ops.hif_set_mailbox_swap(hif_sc);
304*5113495bSYour Name }
305*5113495bSYour Name 
hif_claim_device(struct hif_opaque_softc * hif_ctx)306*5113495bSYour Name void hif_claim_device(struct hif_opaque_softc *hif_ctx)
307*5113495bSYour Name {
308*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
309*5113495bSYour Name 
310*5113495bSYour Name 	hif_sc->bus_ops.hif_claim_device(hif_sc);
311*5113495bSYour Name }
312*5113495bSYour Name 
hif_shutdown_device(struct hif_opaque_softc * hif_ctx)313*5113495bSYour Name void hif_shutdown_device(struct hif_opaque_softc *hif_ctx)
314*5113495bSYour Name {
315*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
316*5113495bSYour Name 
317*5113495bSYour Name 	hif_sc->bus_ops.hif_shutdown_device(hif_sc);
318*5113495bSYour Name }
319*5113495bSYour Name 
hif_stop(struct hif_opaque_softc * hif_ctx)320*5113495bSYour Name void hif_stop(struct hif_opaque_softc *hif_ctx)
321*5113495bSYour Name {
322*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
323*5113495bSYour Name 
324*5113495bSYour Name 	hif_sc->bus_ops.hif_stop(hif_sc);
325*5113495bSYour Name }
326*5113495bSYour Name 
hif_cancel_deferred_target_sleep(struct hif_softc * hif_sc)327*5113495bSYour Name void hif_cancel_deferred_target_sleep(struct hif_softc *hif_sc)
328*5113495bSYour Name {
329*5113495bSYour Name 	return hif_sc->bus_ops.hif_cancel_deferred_target_sleep(hif_sc);
330*5113495bSYour Name }
331*5113495bSYour Name 
hif_irq_enable(struct hif_softc * hif_sc,int irq_id)332*5113495bSYour Name void hif_irq_enable(struct hif_softc *hif_sc, int irq_id)
333*5113495bSYour Name {
334*5113495bSYour Name 	hif_sc->bus_ops.hif_irq_enable(hif_sc, irq_id);
335*5113495bSYour Name }
336*5113495bSYour Name qdf_export_symbol(hif_irq_enable);
337*5113495bSYour Name 
hif_irq_disable(struct hif_softc * hif_sc,int irq_id)338*5113495bSYour Name void hif_irq_disable(struct hif_softc *hif_sc, int irq_id)
339*5113495bSYour Name {
340*5113495bSYour Name 	hif_sc->bus_ops.hif_irq_disable(hif_sc, irq_id);
341*5113495bSYour Name }
342*5113495bSYour Name 
hif_grp_irq_configure(struct hif_softc * hif_sc,struct hif_exec_context * hif_exec)343*5113495bSYour Name int hif_grp_irq_configure(struct hif_softc *hif_sc,
344*5113495bSYour Name 			  struct hif_exec_context *hif_exec)
345*5113495bSYour Name {
346*5113495bSYour Name 	return hif_sc->bus_ops.hif_grp_irq_configure(hif_sc, hif_exec);
347*5113495bSYour Name }
348*5113495bSYour Name 
hif_grp_irq_deconfigure(struct hif_softc * hif_sc)349*5113495bSYour Name void hif_grp_irq_deconfigure(struct hif_softc *hif_sc)
350*5113495bSYour Name {
351*5113495bSYour Name 	hif_sc->bus_ops.hif_grp_irq_deconfigure(hif_sc);
352*5113495bSYour Name }
353*5113495bSYour Name 
hif_dump_registers(struct hif_opaque_softc * hif_hdl)354*5113495bSYour Name int hif_dump_registers(struct hif_opaque_softc *hif_hdl)
355*5113495bSYour Name {
356*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_hdl);
357*5113495bSYour Name 
358*5113495bSYour Name 	return hif_sc->bus_ops.hif_dump_registers(hif_sc);
359*5113495bSYour Name }
360*5113495bSYour Name 
hif_dump_target_memory(struct hif_opaque_softc * hif_hdl,void * ramdump_base,uint32_t address,uint32_t size)361*5113495bSYour Name void hif_dump_target_memory(struct hif_opaque_softc *hif_hdl,
362*5113495bSYour Name 			    void *ramdump_base,
363*5113495bSYour Name 			    uint32_t address, uint32_t size)
364*5113495bSYour Name {
365*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_hdl);
366*5113495bSYour Name 
367*5113495bSYour Name 	hif_sc->bus_ops.hif_dump_target_memory(hif_sc, ramdump_base,
368*5113495bSYour Name 					       address, size);
369*5113495bSYour Name }
370*5113495bSYour Name 
hif_ipa_get_ce_resource(struct hif_opaque_softc * hif_hdl,qdf_shared_mem_t ** ce_sr,uint32_t * ce_sr_ring_size,qdf_dma_addr_t * ce_reg_paddr)371*5113495bSYour Name void hif_ipa_get_ce_resource(struct hif_opaque_softc *hif_hdl,
372*5113495bSYour Name 			     qdf_shared_mem_t **ce_sr,
373*5113495bSYour Name 			     uint32_t *ce_sr_ring_size,
374*5113495bSYour Name 			     qdf_dma_addr_t *ce_reg_paddr)
375*5113495bSYour Name {
376*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_hdl);
377*5113495bSYour Name 
378*5113495bSYour Name 	hif_sc->bus_ops.hif_ipa_get_ce_resource(hif_sc, ce_sr,
379*5113495bSYour Name 			ce_sr_ring_size, ce_reg_paddr);
380*5113495bSYour Name }
381*5113495bSYour Name 
hif_mask_interrupt_call(struct hif_opaque_softc * hif_hdl)382*5113495bSYour Name void hif_mask_interrupt_call(struct hif_opaque_softc *hif_hdl)
383*5113495bSYour Name {
384*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_hdl);
385*5113495bSYour Name 
386*5113495bSYour Name 	hif_sc->bus_ops.hif_mask_interrupt_call(hif_sc);
387*5113495bSYour Name }
388*5113495bSYour Name 
hif_display_bus_stats(struct hif_opaque_softc * scn)389*5113495bSYour Name void hif_display_bus_stats(struct hif_opaque_softc *scn)
390*5113495bSYour Name {
391*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
392*5113495bSYour Name 
393*5113495bSYour Name 	hif_sc->bus_ops.hif_display_stats(hif_sc);
394*5113495bSYour Name }
395*5113495bSYour Name 
hif_clear_bus_stats(struct hif_opaque_softc * scn)396*5113495bSYour Name void hif_clear_bus_stats(struct hif_opaque_softc *scn)
397*5113495bSYour Name {
398*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
399*5113495bSYour Name 
400*5113495bSYour Name 	hif_sc->bus_ops.hif_clear_stats(hif_sc);
401*5113495bSYour Name }
402*5113495bSYour Name 
403*5113495bSYour Name /**
404*5113495bSYour Name  * hif_enable_power_management() - enable power management after driver load
405*5113495bSYour Name  * @hif_hdl: opaque pointer to the hif context
406*5113495bSYour Name  * @is_packet_log_enabled: true if packet log is enabled
407*5113495bSYour Name  *
408*5113495bSYour Name  * Driver load and firmware download are done in a high performance mode.
409*5113495bSYour Name  * Enable power management after the driver is loaded.
410*5113495bSYour Name  * packet log can require fewer power management features to be enabled.
411*5113495bSYour Name  */
hif_enable_power_management(struct hif_opaque_softc * hif_hdl,bool is_packet_log_enabled)412*5113495bSYour Name void hif_enable_power_management(struct hif_opaque_softc *hif_hdl,
413*5113495bSYour Name 				 bool is_packet_log_enabled)
414*5113495bSYour Name {
415*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_hdl);
416*5113495bSYour Name 
417*5113495bSYour Name 	hif_sc->bus_ops.hif_enable_power_management(hif_sc,
418*5113495bSYour Name 				    is_packet_log_enabled);
419*5113495bSYour Name }
420*5113495bSYour Name 
421*5113495bSYour Name /**
422*5113495bSYour Name  * hif_disable_power_management() - reset the bus power management
423*5113495bSYour Name  * @hif_hdl: opaque pointer to the hif context
424*5113495bSYour Name  *
425*5113495bSYour Name  * return the power management of the bus to its default state.
426*5113495bSYour Name  * This isn't necessarily a complete reversal of its counterpart.
427*5113495bSYour Name  * This should be called when unloading the driver.
428*5113495bSYour Name  */
hif_disable_power_management(struct hif_opaque_softc * hif_hdl)429*5113495bSYour Name void hif_disable_power_management(struct hif_opaque_softc *hif_hdl)
430*5113495bSYour Name {
431*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_hdl);
432*5113495bSYour Name 
433*5113495bSYour Name 	hif_sc->bus_ops.hif_disable_power_management(hif_sc);
434*5113495bSYour Name }
435*5113495bSYour Name 
436*5113495bSYour Name /**
437*5113495bSYour Name  * hif_set_bundle_mode() - enable bundling and set default rx bundle cnt
438*5113495bSYour Name  * @scn: pointer to hif_opaque_softc structure
439*5113495bSYour Name  * @enabled: flag to enable/disable bundling
440*5113495bSYour Name  * @rx_bundle_cnt: bundle count to be used for RX
441*5113495bSYour Name  *
442*5113495bSYour Name  * Return: none
443*5113495bSYour Name  */
hif_set_bundle_mode(struct hif_opaque_softc * scn,bool enabled,int rx_bundle_cnt)444*5113495bSYour Name void hif_set_bundle_mode(struct hif_opaque_softc *scn, bool enabled,
445*5113495bSYour Name 				int rx_bundle_cnt)
446*5113495bSYour Name {
447*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
448*5113495bSYour Name 
449*5113495bSYour Name 	hif_sc->bus_ops.hif_set_bundle_mode(hif_sc, enabled, rx_bundle_cnt);
450*5113495bSYour Name }
451*5113495bSYour Name 
452*5113495bSYour Name /**
453*5113495bSYour Name  * hif_bus_reset_resume() - resume the bus after reset
454*5113495bSYour Name  * @scn: struct hif_opaque_softc
455*5113495bSYour Name  *
456*5113495bSYour Name  * This function is called to tell the driver that USB device has been resumed
457*5113495bSYour Name  * and it has also been reset. The driver should redo any necessary
458*5113495bSYour Name  * initialization. This function resets WLAN SOC.
459*5113495bSYour Name  *
460*5113495bSYour Name  * Return: int 0 for success, non zero for failure
461*5113495bSYour Name  */
hif_bus_reset_resume(struct hif_opaque_softc * scn)462*5113495bSYour Name int hif_bus_reset_resume(struct hif_opaque_softc *scn)
463*5113495bSYour Name {
464*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
465*5113495bSYour Name 
466*5113495bSYour Name 	return hif_sc->bus_ops.hif_bus_reset_resume(hif_sc);
467*5113495bSYour Name }
468*5113495bSYour Name 
hif_apps_irqs_disable(struct hif_opaque_softc * hif_ctx)469*5113495bSYour Name int hif_apps_irqs_disable(struct hif_opaque_softc *hif_ctx)
470*5113495bSYour Name {
471*5113495bSYour Name 	struct hif_softc *scn;
472*5113495bSYour Name 	int i;
473*5113495bSYour Name 
474*5113495bSYour Name 	QDF_BUG(hif_ctx);
475*5113495bSYour Name 	scn = HIF_GET_SOFTC(hif_ctx);
476*5113495bSYour Name 	if (!scn)
477*5113495bSYour Name 		return -EINVAL;
478*5113495bSYour Name 
479*5113495bSYour Name 	if (pld_is_one_msi(scn->qdf_dev->dev))
480*5113495bSYour Name 		return 0;
481*5113495bSYour Name 
482*5113495bSYour Name 	/* if the wake_irq is shared, don't disable it twice */
483*5113495bSYour Name 	for (i = 0; i < scn->ce_count; ++i) {
484*5113495bSYour Name 		int irq = scn->bus_ops.hif_map_ce_to_irq(scn, i);
485*5113495bSYour Name 
486*5113495bSYour Name 		if (irq != scn->wake_irq)
487*5113495bSYour Name 			disable_irq(irq);
488*5113495bSYour Name 	}
489*5113495bSYour Name 
490*5113495bSYour Name 	return 0;
491*5113495bSYour Name }
492*5113495bSYour Name 
hif_apps_irqs_enable(struct hif_opaque_softc * hif_ctx)493*5113495bSYour Name int hif_apps_irqs_enable(struct hif_opaque_softc *hif_ctx)
494*5113495bSYour Name {
495*5113495bSYour Name 	struct hif_softc *scn;
496*5113495bSYour Name 	int i;
497*5113495bSYour Name 
498*5113495bSYour Name 	QDF_BUG(hif_ctx);
499*5113495bSYour Name 	scn = HIF_GET_SOFTC(hif_ctx);
500*5113495bSYour Name 	if (!scn)
501*5113495bSYour Name 		return -EINVAL;
502*5113495bSYour Name 
503*5113495bSYour Name 	if (pld_is_one_msi(scn->qdf_dev->dev))
504*5113495bSYour Name 		return 0;
505*5113495bSYour Name 
506*5113495bSYour Name 	/* if the wake_irq is shared, don't enable it twice */
507*5113495bSYour Name 	for (i = 0; i < scn->ce_count; ++i) {
508*5113495bSYour Name 		int irq = scn->bus_ops.hif_map_ce_to_irq(scn, i);
509*5113495bSYour Name 
510*5113495bSYour Name 		if (irq != scn->wake_irq)
511*5113495bSYour Name 			enable_irq(irq);
512*5113495bSYour Name 	}
513*5113495bSYour Name 
514*5113495bSYour Name 	return 0;
515*5113495bSYour Name }
516*5113495bSYour Name 
hif_apps_wake_irq_disable(struct hif_opaque_softc * hif_ctx)517*5113495bSYour Name int hif_apps_wake_irq_disable(struct hif_opaque_softc *hif_ctx)
518*5113495bSYour Name {
519*5113495bSYour Name 	struct hif_softc *scn;
520*5113495bSYour Name 
521*5113495bSYour Name 	QDF_BUG(hif_ctx);
522*5113495bSYour Name 	scn = HIF_GET_SOFTC(hif_ctx);
523*5113495bSYour Name 	if (!scn)
524*5113495bSYour Name 		return -EINVAL;
525*5113495bSYour Name 
526*5113495bSYour Name 	disable_irq(scn->wake_irq);
527*5113495bSYour Name 
528*5113495bSYour Name 	return 0;
529*5113495bSYour Name }
530*5113495bSYour Name 
hif_apps_wake_irq_enable(struct hif_opaque_softc * hif_ctx)531*5113495bSYour Name int hif_apps_wake_irq_enable(struct hif_opaque_softc *hif_ctx)
532*5113495bSYour Name {
533*5113495bSYour Name 	struct hif_softc *scn;
534*5113495bSYour Name 
535*5113495bSYour Name 	QDF_BUG(hif_ctx);
536*5113495bSYour Name 	scn = HIF_GET_SOFTC(hif_ctx);
537*5113495bSYour Name 	if (!scn)
538*5113495bSYour Name 		return -EINVAL;
539*5113495bSYour Name 
540*5113495bSYour Name 	enable_irq(scn->wake_irq);
541*5113495bSYour Name 
542*5113495bSYour Name 	return 0;
543*5113495bSYour Name }
544*5113495bSYour Name 
hif_apps_disable_irq_wake(struct hif_opaque_softc * hif_ctx)545*5113495bSYour Name int hif_apps_disable_irq_wake(struct hif_opaque_softc *hif_ctx)
546*5113495bSYour Name {
547*5113495bSYour Name 	struct hif_softc *scn;
548*5113495bSYour Name 
549*5113495bSYour Name 	QDF_BUG(hif_ctx);
550*5113495bSYour Name 	scn = HIF_GET_SOFTC(hif_ctx);
551*5113495bSYour Name 	if (!scn)
552*5113495bSYour Name 		return -EINVAL;
553*5113495bSYour Name 
554*5113495bSYour Name 	return disable_irq_wake(scn->wake_irq);
555*5113495bSYour Name }
556*5113495bSYour Name 
hif_apps_enable_irq_wake(struct hif_opaque_softc * hif_ctx)557*5113495bSYour Name int hif_apps_enable_irq_wake(struct hif_opaque_softc *hif_ctx)
558*5113495bSYour Name {
559*5113495bSYour Name 	struct hif_softc *scn;
560*5113495bSYour Name 
561*5113495bSYour Name 	QDF_BUG(hif_ctx);
562*5113495bSYour Name 	scn = HIF_GET_SOFTC(hif_ctx);
563*5113495bSYour Name 	if (!scn)
564*5113495bSYour Name 		return -EINVAL;
565*5113495bSYour Name 
566*5113495bSYour Name 	return enable_irq_wake(scn->wake_irq);
567*5113495bSYour Name }
568*5113495bSYour Name 
hif_apps_disable_irqs_except_wake_irq(struct hif_opaque_softc * hif_ctx)569*5113495bSYour Name int hif_apps_disable_irqs_except_wake_irq(struct hif_opaque_softc *hif_ctx)
570*5113495bSYour Name {
571*5113495bSYour Name 	struct hif_softc *scn;
572*5113495bSYour Name 	int i;
573*5113495bSYour Name 
574*5113495bSYour Name 	QDF_BUG(hif_ctx);
575*5113495bSYour Name 	scn = HIF_GET_SOFTC(hif_ctx);
576*5113495bSYour Name 	if (!scn)
577*5113495bSYour Name 		return -EINVAL;
578*5113495bSYour Name 
579*5113495bSYour Name 	for (i = 0; i < scn->ce_count; ++i) {
580*5113495bSYour Name 		int irq = scn->bus_ops.hif_map_ce_to_irq(scn, i);
581*5113495bSYour Name 
582*5113495bSYour Name 		if (irq != scn->wake_irq)
583*5113495bSYour Name 			disable_irq(irq);
584*5113495bSYour Name 	}
585*5113495bSYour Name 
586*5113495bSYour Name 	return 0;
587*5113495bSYour Name }
588*5113495bSYour Name 
hif_apps_enable_irqs_except_wake_irq(struct hif_opaque_softc * hif_ctx)589*5113495bSYour Name int hif_apps_enable_irqs_except_wake_irq(struct hif_opaque_softc *hif_ctx)
590*5113495bSYour Name {
591*5113495bSYour Name 	struct hif_softc *scn;
592*5113495bSYour Name 	int i;
593*5113495bSYour Name 
594*5113495bSYour Name 	QDF_BUG(hif_ctx);
595*5113495bSYour Name 	scn = HIF_GET_SOFTC(hif_ctx);
596*5113495bSYour Name 	if (!scn)
597*5113495bSYour Name 		return -EINVAL;
598*5113495bSYour Name 
599*5113495bSYour Name 	for (i = 0; i < scn->ce_count; ++i) {
600*5113495bSYour Name 		int irq = scn->bus_ops.hif_map_ce_to_irq(scn, i);
601*5113495bSYour Name 
602*5113495bSYour Name 		if (irq != scn->wake_irq)
603*5113495bSYour Name 			enable_irq(irq);
604*5113495bSYour Name 	}
605*5113495bSYour Name 
606*5113495bSYour Name 	return 0;
607*5113495bSYour Name }
608*5113495bSYour Name 
609*5113495bSYour Name #ifdef WLAN_FEATURE_BMI
hif_needs_bmi(struct hif_opaque_softc * scn)610*5113495bSYour Name bool hif_needs_bmi(struct hif_opaque_softc *scn)
611*5113495bSYour Name {
612*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
613*5113495bSYour Name 
614*5113495bSYour Name 	return hif_sc->bus_ops.hif_needs_bmi(hif_sc);
615*5113495bSYour Name }
616*5113495bSYour Name qdf_export_symbol(hif_needs_bmi);
617*5113495bSYour Name #endif /* WLAN_FEATURE_BMI */
618*5113495bSYour Name 
hif_config_irq_affinity(struct hif_softc * hif_sc)619*5113495bSYour Name void hif_config_irq_affinity(struct hif_softc *hif_sc)
620*5113495bSYour Name {
621*5113495bSYour Name 	hif_sc->bus_ops.hif_config_irq_affinity(hif_sc);
622*5113495bSYour Name }
623*5113495bSYour Name 
hif_config_irq_by_ceid(struct hif_softc * hif_sc,int ce_id)624*5113495bSYour Name int hif_config_irq_by_ceid(struct hif_softc *hif_sc, int ce_id)
625*5113495bSYour Name {
626*5113495bSYour Name 	return hif_sc->bus_ops.hif_config_irq_by_ceid(hif_sc, ce_id);
627*5113495bSYour Name }
628*5113495bSYour Name 
629*5113495bSYour Name #ifdef HIF_CPU_CLEAR_AFFINITY
hif_config_irq_clear_cpu_affinity(struct hif_opaque_softc * scn,int intr_ctxt_id,int cpu)630*5113495bSYour Name void hif_config_irq_clear_cpu_affinity(struct hif_opaque_softc *scn,
631*5113495bSYour Name 				       int intr_ctxt_id, int cpu)
632*5113495bSYour Name {
633*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
634*5113495bSYour Name 
635*5113495bSYour Name 	hif_sc->bus_ops.hif_config_irq_clear_cpu_affinity(hif_sc,
636*5113495bSYour Name 							  intr_ctxt_id, cpu);
637*5113495bSYour Name }
638*5113495bSYour Name 
639*5113495bSYour Name qdf_export_symbol(hif_config_irq_clear_cpu_affinity);
640*5113495bSYour Name #endif
641*5113495bSYour Name 
642*5113495bSYour Name #ifdef HIF_BUS_LOG_INFO
hif_log_bus_info(struct hif_softc * hif_sc,uint8_t * data,unsigned int * offset)643*5113495bSYour Name bool hif_log_bus_info(struct hif_softc *hif_sc, uint8_t *data,
644*5113495bSYour Name 		      unsigned int *offset)
645*5113495bSYour Name {
646*5113495bSYour Name 	if (hif_sc->bus_ops.hif_log_bus_info)
647*5113495bSYour Name 		return hif_sc->bus_ops.hif_log_bus_info(hif_sc, data, offset);
648*5113495bSYour Name 
649*5113495bSYour Name 	return false;
650*5113495bSYour Name }
651*5113495bSYour Name #endif
652*5113495bSYour Name 
hif_apps_grp_irqs_enable(struct hif_opaque_softc * hif_ctx)653*5113495bSYour Name int hif_apps_grp_irqs_enable(struct hif_opaque_softc *hif_ctx)
654*5113495bSYour Name {
655*5113495bSYour Name 	struct hif_exec_context *hif_exec;
656*5113495bSYour Name 	struct hif_softc *scn;
657*5113495bSYour Name 	int i, j;
658*5113495bSYour Name 
659*5113495bSYour Name 	QDF_BUG(hif_ctx);
660*5113495bSYour Name 	scn = HIF_GET_SOFTC(hif_ctx);
661*5113495bSYour Name 	if (!scn)
662*5113495bSYour Name 		return -EINVAL;
663*5113495bSYour Name 
664*5113495bSYour Name 	for (i = 0 ; i < HIF_MAX_GROUP; i++) {
665*5113495bSYour Name 		hif_exec = hif_exec_get_ctx(hif_ctx, i);
666*5113495bSYour Name 		if (!hif_exec)
667*5113495bSYour Name 			continue;
668*5113495bSYour Name 
669*5113495bSYour Name 		for (j = 0; j < hif_exec->numirq; j++)
670*5113495bSYour Name 			pfrm_enable_irq(scn->qdf_dev->dev,
671*5113495bSYour Name 					hif_exec->os_irq[j]);
672*5113495bSYour Name 	}
673*5113495bSYour Name 
674*5113495bSYour Name 	return 0;
675*5113495bSYour Name }
676*5113495bSYour Name 
hif_apps_grp_irqs_disable(struct hif_opaque_softc * hif_ctx)677*5113495bSYour Name int hif_apps_grp_irqs_disable(struct hif_opaque_softc *hif_ctx)
678*5113495bSYour Name {
679*5113495bSYour Name 	struct hif_exec_context *hif_exec;
680*5113495bSYour Name 	struct hif_softc *scn;
681*5113495bSYour Name 	int i, j;
682*5113495bSYour Name 
683*5113495bSYour Name 	QDF_BUG(hif_ctx);
684*5113495bSYour Name 	scn = HIF_GET_SOFTC(hif_ctx);
685*5113495bSYour Name 	if (!scn)
686*5113495bSYour Name 		return -EINVAL;
687*5113495bSYour Name 
688*5113495bSYour Name 	for (i = 0 ; i < HIF_MAX_GROUP; i++) {
689*5113495bSYour Name 		hif_exec = hif_exec_get_ctx(hif_ctx, i);
690*5113495bSYour Name 		if (!hif_exec)
691*5113495bSYour Name 			continue;
692*5113495bSYour Name 
693*5113495bSYour Name 		for (j = 0; j < hif_exec->numirq; j++)
694*5113495bSYour Name 			pfrm_disable_irq(scn->qdf_dev->dev,
695*5113495bSYour Name 					 hif_exec->os_irq[j]);
696*5113495bSYour Name 	}
697*5113495bSYour Name 
698*5113495bSYour Name 	return 0;
699*5113495bSYour Name }
700*5113495bSYour Name 
hif_disable_grp_irqs(struct hif_opaque_softc * scn)701*5113495bSYour Name int hif_disable_grp_irqs(struct hif_opaque_softc *scn)
702*5113495bSYour Name {
703*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
704*5113495bSYour Name 
705*5113495bSYour Name 	return hif_sc->bus_ops.hif_disable_grp_irqs(hif_sc);
706*5113495bSYour Name }
707*5113495bSYour Name 
hif_enable_grp_irqs(struct hif_opaque_softc * scn)708*5113495bSYour Name int hif_enable_grp_irqs(struct hif_opaque_softc *scn)
709*5113495bSYour Name {
710*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
711*5113495bSYour Name 
712*5113495bSYour Name 	return hif_sc->bus_ops.hif_enable_grp_irqs(hif_sc);
713*5113495bSYour Name }
714*5113495bSYour Name 
715*5113495bSYour Name #ifdef FEATURE_IRQ_AFFINITY
hif_set_grp_intr_affinity(struct hif_opaque_softc * scn,uint32_t grp_intr_bitmask,bool perf)716*5113495bSYour Name void hif_set_grp_intr_affinity(struct hif_opaque_softc *scn,
717*5113495bSYour Name 			       uint32_t grp_intr_bitmask, bool perf)
718*5113495bSYour Name {
719*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
720*5113495bSYour Name 
721*5113495bSYour Name 	if (!hif_sc)
722*5113495bSYour Name 		return;
723*5113495bSYour Name 
724*5113495bSYour Name 	hif_sc->bus_ops.hif_set_grp_intr_affinity(hif_sc, grp_intr_bitmask,
725*5113495bSYour Name 						  perf);
726*5113495bSYour Name }
727*5113495bSYour Name #endif
728*5113495bSYour Name 
hif_affinity_mgr_set_affinity(struct hif_opaque_softc * scn)729*5113495bSYour Name void hif_affinity_mgr_set_affinity(struct hif_opaque_softc *scn)
730*5113495bSYour Name {
731*5113495bSYour Name 	struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
732*5113495bSYour Name 
733*5113495bSYour Name 	if (!hif_sc)
734*5113495bSYour Name 		return;
735*5113495bSYour Name 
736*5113495bSYour Name 	if (!hif_sc->bus_ops.hif_affinity_mgr_set_affinity)
737*5113495bSYour Name 		return;
738*5113495bSYour Name 
739*5113495bSYour Name 	hif_sc->bus_ops.hif_affinity_mgr_set_affinity(hif_sc);
740*5113495bSYour Name }
741