Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[firefly-linux-kernel-4.4.55.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         /* 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 */