xref: /linux/net/mac802154/driver-ops.h (revision ca55b2fef3a9373fcfc30f82fd26bc7fccbda732)
1 #ifndef __MAC802154_DRIVER_OPS
2 #define __MAC802154_DRIVER_OPS
3 
4 #include <linux/types.h>
5 #include <linux/rtnetlink.h>
6 
7 #include <net/mac802154.h>
8 
9 #include "ieee802154_i.h"
10 #include "trace.h"
11 
12 static inline int
13 drv_xmit_async(struct ieee802154_local *local, struct sk_buff *skb)
14 {
15 	return local->ops->xmit_async(&local->hw, skb);
16 }
17 
18 static inline int
19 drv_xmit_sync(struct ieee802154_local *local, struct sk_buff *skb)
20 {
21 	/* don't allow other operations while sync xmit */
22 	ASSERT_RTNL();
23 
24 	might_sleep();
25 
26 	return local->ops->xmit_sync(&local->hw, skb);
27 }
28 
29 static inline int drv_start(struct ieee802154_local *local)
30 {
31 	int ret;
32 
33 	might_sleep();
34 
35 	trace_802154_drv_start(local);
36 	local->started = true;
37 	smp_mb();
38 	ret = local->ops->start(&local->hw);
39 	trace_802154_drv_return_int(local, ret);
40 	return ret;
41 }
42 
43 static inline void drv_stop(struct ieee802154_local *local)
44 {
45 	might_sleep();
46 
47 	trace_802154_drv_stop(local);
48 	local->ops->stop(&local->hw);
49 	trace_802154_drv_return_void(local);
50 
51 	/* sync away all work on the tasklet before clearing started */
52 	tasklet_disable(&local->tasklet);
53 	tasklet_enable(&local->tasklet);
54 
55 	barrier();
56 
57 	local->started = false;
58 }
59 
60 static inline int
61 drv_set_channel(struct ieee802154_local *local, u8 page, u8 channel)
62 {
63 	int ret;
64 
65 	might_sleep();
66 
67 	trace_802154_drv_set_channel(local, page, channel);
68 	ret = local->ops->set_channel(&local->hw, page, channel);
69 	trace_802154_drv_return_int(local, ret);
70 	return ret;
71 }
72 
73 static inline int drv_set_tx_power(struct ieee802154_local *local, s32 mbm)
74 {
75 	int ret;
76 
77 	might_sleep();
78 
79 	if (!local->ops->set_txpower) {
80 		WARN_ON(1);
81 		return -EOPNOTSUPP;
82 	}
83 
84 	trace_802154_drv_set_tx_power(local, mbm);
85 	ret = local->ops->set_txpower(&local->hw, mbm);
86 	trace_802154_drv_return_int(local, ret);
87 	return ret;
88 }
89 
90 static inline int drv_set_cca_mode(struct ieee802154_local *local,
91 				   const struct wpan_phy_cca *cca)
92 {
93 	int ret;
94 
95 	might_sleep();
96 
97 	if (!local->ops->set_cca_mode) {
98 		WARN_ON(1);
99 		return -EOPNOTSUPP;
100 	}
101 
102 	trace_802154_drv_set_cca_mode(local, cca);
103 	ret = local->ops->set_cca_mode(&local->hw, cca);
104 	trace_802154_drv_return_int(local, ret);
105 	return ret;
106 }
107 
108 static inline int drv_set_lbt_mode(struct ieee802154_local *local, bool mode)
109 {
110 	int ret;
111 
112 	might_sleep();
113 
114 	if (!local->ops->set_lbt) {
115 		WARN_ON(1);
116 		return -EOPNOTSUPP;
117 	}
118 
119 	trace_802154_drv_set_lbt_mode(local, mode);
120 	ret = local->ops->set_lbt(&local->hw, mode);
121 	trace_802154_drv_return_int(local, ret);
122 	return ret;
123 }
124 
125 static inline int
126 drv_set_cca_ed_level(struct ieee802154_local *local, s32 mbm)
127 {
128 	int ret;
129 
130 	might_sleep();
131 
132 	if (!local->ops->set_cca_ed_level) {
133 		WARN_ON(1);
134 		return -EOPNOTSUPP;
135 	}
136 
137 	trace_802154_drv_set_cca_ed_level(local, mbm);
138 	ret = local->ops->set_cca_ed_level(&local->hw, mbm);
139 	trace_802154_drv_return_int(local, ret);
140 	return ret;
141 }
142 
143 static inline int drv_set_pan_id(struct ieee802154_local *local, __le16 pan_id)
144 {
145 	struct ieee802154_hw_addr_filt filt;
146 	int ret;
147 
148 	might_sleep();
149 
150 	if (!local->ops->set_hw_addr_filt) {
151 		WARN_ON(1);
152 		return -EOPNOTSUPP;
153 	}
154 
155 	filt.pan_id = pan_id;
156 
157 	trace_802154_drv_set_pan_id(local, pan_id);
158 	ret = local->ops->set_hw_addr_filt(&local->hw, &filt,
159 					    IEEE802154_AFILT_PANID_CHANGED);
160 	trace_802154_drv_return_int(local, ret);
161 	return ret;
162 }
163 
164 static inline int
165 drv_set_extended_addr(struct ieee802154_local *local, __le64 extended_addr)
166 {
167 	struct ieee802154_hw_addr_filt filt;
168 	int ret;
169 
170 	might_sleep();
171 
172 	if (!local->ops->set_hw_addr_filt) {
173 		WARN_ON(1);
174 		return -EOPNOTSUPP;
175 	}
176 
177 	filt.ieee_addr = extended_addr;
178 
179 	trace_802154_drv_set_extended_addr(local, extended_addr);
180 	ret = local->ops->set_hw_addr_filt(&local->hw, &filt,
181 					    IEEE802154_AFILT_IEEEADDR_CHANGED);
182 	trace_802154_drv_return_int(local, ret);
183 	return ret;
184 }
185 
186 static inline int
187 drv_set_short_addr(struct ieee802154_local *local, __le16 short_addr)
188 {
189 	struct ieee802154_hw_addr_filt filt;
190 	int ret;
191 
192 	might_sleep();
193 
194 	if (!local->ops->set_hw_addr_filt) {
195 		WARN_ON(1);
196 		return -EOPNOTSUPP;
197 	}
198 
199 	filt.short_addr = short_addr;
200 
201 	trace_802154_drv_set_short_addr(local, short_addr);
202 	ret = local->ops->set_hw_addr_filt(&local->hw, &filt,
203 					    IEEE802154_AFILT_SADDR_CHANGED);
204 	trace_802154_drv_return_int(local, ret);
205 	return ret;
206 }
207 
208 static inline int
209 drv_set_pan_coord(struct ieee802154_local *local, bool is_coord)
210 {
211 	struct ieee802154_hw_addr_filt filt;
212 	int ret;
213 
214 	might_sleep();
215 
216 	if (!local->ops->set_hw_addr_filt) {
217 		WARN_ON(1);
218 		return -EOPNOTSUPP;
219 	}
220 
221 	filt.pan_coord = is_coord;
222 
223 	trace_802154_drv_set_pan_coord(local, is_coord);
224 	ret = local->ops->set_hw_addr_filt(&local->hw, &filt,
225 					    IEEE802154_AFILT_PANC_CHANGED);
226 	trace_802154_drv_return_int(local, ret);
227 	return ret;
228 }
229 
230 static inline int
231 drv_set_csma_params(struct ieee802154_local *local, u8 min_be, u8 max_be,
232 		    u8 max_csma_backoffs)
233 {
234 	int ret;
235 
236 	might_sleep();
237 
238 	if (!local->ops->set_csma_params) {
239 		WARN_ON(1);
240 		return -EOPNOTSUPP;
241 	}
242 
243 	trace_802154_drv_set_csma_params(local, min_be, max_be,
244 					 max_csma_backoffs);
245 	ret = local->ops->set_csma_params(&local->hw, min_be, max_be,
246 					   max_csma_backoffs);
247 	trace_802154_drv_return_int(local, ret);
248 	return ret;
249 }
250 
251 static inline int
252 drv_set_max_frame_retries(struct ieee802154_local *local, s8 max_frame_retries)
253 {
254 	int ret;
255 
256 	might_sleep();
257 
258 	if (!local->ops->set_frame_retries) {
259 		WARN_ON(1);
260 		return -EOPNOTSUPP;
261 	}
262 
263 	trace_802154_drv_set_max_frame_retries(local, max_frame_retries);
264 	ret = local->ops->set_frame_retries(&local->hw, max_frame_retries);
265 	trace_802154_drv_return_int(local, ret);
266 	return ret;
267 }
268 
269 static inline int
270 drv_set_promiscuous_mode(struct ieee802154_local *local, bool on)
271 {
272 	int ret;
273 
274 	might_sleep();
275 
276 	if (!local->ops->set_promiscuous_mode) {
277 		WARN_ON(1);
278 		return -EOPNOTSUPP;
279 	}
280 
281 	trace_802154_drv_set_promiscuous_mode(local, on);
282 	ret = local->ops->set_promiscuous_mode(&local->hw, on);
283 	trace_802154_drv_return_int(local, ret);
284 	return ret;
285 }
286 
287 #endif /* __MAC802154_DRIVER_OPS */
288