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