1/* SPDX-License-Identifier: BSD-3-Clause-Clear */
2/*
3 * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
5 */
6
7#ifndef ATH12K_HIF_H
8#define ATH12K_HIF_H
9
10#include "core.h"
11
12struct ath12k_hif_ops {
13 u32 (*read32)(struct ath12k_base *ab, u32 address);
14 void (*write32)(struct ath12k_base *ab, u32 address, u32 data);
15 void (*irq_enable)(struct ath12k_base *ab);
16 void (*irq_disable)(struct ath12k_base *ab);
17 int (*start)(struct ath12k_base *ab);
18 void (*stop)(struct ath12k_base *ab);
19 int (*power_up)(struct ath12k_base *ab);
20 void (*power_down)(struct ath12k_base *ab, bool is_suspend);
21 int (*suspend)(struct ath12k_base *ab);
22 int (*resume)(struct ath12k_base *ab);
23 int (*map_service_to_pipe)(struct ath12k_base *ab, u16 service_id,
24 u8 *ul_pipe, u8 *dl_pipe);
25 int (*get_user_msi_vector)(struct ath12k_base *ab, char *user_name,
26 int *num_vectors, u32 *user_base_data,
27 u32 *base_vector);
28 void (*get_msi_address)(struct ath12k_base *ab, u32 *msi_addr_lo,
29 u32 *msi_addr_hi);
30 void (*ce_irq_enable)(struct ath12k_base *ab);
31 void (*ce_irq_disable)(struct ath12k_base *ab);
32 void (*get_ce_msi_idx)(struct ath12k_base *ab, u32 ce_id, u32 *msi_idx);
33 int (*panic_handler)(struct ath12k_base *ab);
34 void (*coredump_download)(struct ath12k_base *ab);
35};
36
37static inline int ath12k_hif_map_service_to_pipe(struct ath12k_base *ab, u16 service_id,
38 u8 *ul_pipe, u8 *dl_pipe)
39{
40 return ab->hif.ops->map_service_to_pipe(ab, service_id,
41 ul_pipe, dl_pipe);
42}
43
44static inline int ath12k_hif_get_user_msi_vector(struct ath12k_base *ab,
45 char *user_name,
46 int *num_vectors,
47 u32 *user_base_data,
48 u32 *base_vector)
49{
50 if (!ab->hif.ops->get_user_msi_vector)
51 return -EOPNOTSUPP;
52
53 return ab->hif.ops->get_user_msi_vector(ab, user_name, num_vectors,
54 user_base_data,
55 base_vector);
56}
57
58static inline void ath12k_hif_get_msi_address(struct ath12k_base *ab,
59 u32 *msi_addr_lo,
60 u32 *msi_addr_hi)
61{
62 if (!ab->hif.ops->get_msi_address)
63 return;
64
65 ab->hif.ops->get_msi_address(ab, msi_addr_lo, msi_addr_hi);
66}
67
68static inline void ath12k_hif_get_ce_msi_idx(struct ath12k_base *ab, u32 ce_id,
69 u32 *msi_data_idx)
70{
71 if (ab->hif.ops->get_ce_msi_idx)
72 ab->hif.ops->get_ce_msi_idx(ab, ce_id, msi_data_idx);
73 else
74 *msi_data_idx = ce_id;
75}
76
77static inline void ath12k_hif_ce_irq_enable(struct ath12k_base *ab)
78{
79 if (ab->hif.ops->ce_irq_enable)
80 ab->hif.ops->ce_irq_enable(ab);
81}
82
83static inline void ath12k_hif_ce_irq_disable(struct ath12k_base *ab)
84{
85 if (ab->hif.ops->ce_irq_disable)
86 ab->hif.ops->ce_irq_disable(ab);
87}
88
89static inline void ath12k_hif_irq_enable(struct ath12k_base *ab)
90{
91 ab->hif.ops->irq_enable(ab);
92}
93
94static inline void ath12k_hif_irq_disable(struct ath12k_base *ab)
95{
96 ab->hif.ops->irq_disable(ab);
97}
98
99static inline int ath12k_hif_suspend(struct ath12k_base *ab)
100{
101 if (ab->hif.ops->suspend)
102 return ab->hif.ops->suspend(ab);
103
104 return 0;
105}
106
107static inline int ath12k_hif_resume(struct ath12k_base *ab)
108{
109 if (ab->hif.ops->resume)
110 return ab->hif.ops->resume(ab);
111
112 return 0;
113}
114
115static inline int ath12k_hif_start(struct ath12k_base *ab)
116{
117 return ab->hif.ops->start(ab);
118}
119
120static inline void ath12k_hif_stop(struct ath12k_base *ab)
121{
122 ab->hif.ops->stop(ab);
123}
124
125static inline u32 ath12k_hif_read32(struct ath12k_base *ab, u32 address)
126{
127 return ab->hif.ops->read32(ab, address);
128}
129
130static inline void ath12k_hif_write32(struct ath12k_base *ab, u32 address,
131 u32 data)
132{
133 ab->hif.ops->write32(ab, address, data);
134}
135
136static inline int ath12k_hif_power_up(struct ath12k_base *ab)
137{
138 if (!ab->hif.ops->power_up)
139 return -EOPNOTSUPP;
140
141 return ab->hif.ops->power_up(ab);
142}
143
144static inline void ath12k_hif_power_down(struct ath12k_base *ab, bool is_suspend)
145{
146 if (!ab->hif.ops->power_down)
147 return;
148
149 ab->hif.ops->power_down(ab, is_suspend);
150}
151
152static inline int ath12k_hif_panic_handler(struct ath12k_base *ab)
153{
154 if (!ab->hif.ops->panic_handler)
155 return NOTIFY_DONE;
156
157 return ab->hif.ops->panic_handler(ab);
158}
159
160static inline void ath12k_hif_coredump_download(struct ath12k_base *ab)
161{
162 if (ab->hif.ops->coredump_download)
163 ab->hif.ops->coredump_download(ab);
164}
165#endif /* ATH12K_HIF_H */
166

source code of linux/drivers/net/wireless/ath/ath12k/hif.h