Merge tag 'mac80211-next-for-john-2014-11-04' of git://git.kernel.org/pub/scm/linux...
[cascardo/linux.git] / net / mac802154 / driver-ops.h
1 #ifndef __MAC802154_DRVIER_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
11 static inline int
12 drv_xmit_async(struct ieee802154_local *local, struct sk_buff *skb)
13 {
14         return local->ops->xmit_async(&local->hw, skb);
15 }
16
17 static inline int
18 drv_xmit_sync(struct ieee802154_local *local, struct sk_buff *skb)
19 {
20         /* don't allow other operations while sync xmit */
21         ASSERT_RTNL();
22
23         might_sleep();
24
25         return local->ops->xmit_sync(&local->hw, skb);
26 }
27
28 static inline int drv_start(struct ieee802154_local *local)
29 {
30         might_sleep();
31
32         local->started = true;
33         smp_mb();
34
35         return local->ops->start(&local->hw);
36 }
37
38 static inline void drv_stop(struct ieee802154_local *local)
39 {
40         might_sleep();
41
42         local->ops->stop(&local->hw);
43
44         /* sync away all work on the tasklet before clearing started */
45         tasklet_disable(&local->tasklet);
46         tasklet_enable(&local->tasklet);
47
48         barrier();
49
50         local->started = false;
51 }
52
53 static inline int drv_set_channel(struct ieee802154_local *local,
54                                   const u8 page, const u8 channel)
55 {
56         might_sleep();
57
58         return local->ops->set_channel(&local->hw, page, channel);
59 }
60
61 static inline int drv_set_tx_power(struct ieee802154_local *local,
62                                    const s8 dbm)
63 {
64         might_sleep();
65
66         if (!local->ops->set_txpower) {
67                 WARN_ON(1);
68                 return -EOPNOTSUPP;
69         }
70
71         return local->ops->set_txpower(&local->hw, dbm);
72 }
73
74 static inline int drv_set_cca_mode(struct ieee802154_local *local,
75                                    const u8 cca_mode)
76 {
77         might_sleep();
78
79         if (!local->ops->set_cca_mode) {
80                 WARN_ON(1);
81                 return -EOPNOTSUPP;
82         }
83
84         return local->ops->set_cca_mode(&local->hw, cca_mode);
85 }
86
87 static inline int drv_set_lbt_mode(struct ieee802154_local *local,
88                                    const bool mode)
89 {
90         might_sleep();
91
92         if (!local->ops->set_lbt) {
93                 WARN_ON(1);
94                 return -EOPNOTSUPP;
95         }
96
97         return local->ops->set_lbt(&local->hw, mode);
98 }
99
100 static inline int drv_set_cca_ed_level(struct ieee802154_local *local,
101                                        const s32 ed_level)
102 {
103         might_sleep();
104
105         if (!local->ops->set_cca_ed_level) {
106                 WARN_ON(1);
107                 return -EOPNOTSUPP;
108         }
109
110         return local->ops->set_cca_ed_level(&local->hw, ed_level);
111 }
112
113 static inline int drv_set_pan_id(struct ieee802154_local *local,
114                                  const __le16 pan_id)
115 {
116         struct ieee802154_hw_addr_filt filt;
117
118         might_sleep();
119
120         if (!local->ops->set_hw_addr_filt) {
121                 WARN_ON(1);
122                 return -EOPNOTSUPP;
123         }
124
125         filt.pan_id = pan_id;
126
127         return local->ops->set_hw_addr_filt(&local->hw, &filt,
128                                             IEEE802154_AFILT_PANID_CHANGED);
129 }
130
131 static inline int drv_set_extended_addr(struct ieee802154_local *local,
132                                         const __le64 extended_addr)
133 {
134         struct ieee802154_hw_addr_filt filt;
135
136         might_sleep();
137
138         if (!local->ops->set_hw_addr_filt) {
139                 WARN_ON(1);
140                 return -EOPNOTSUPP;
141         }
142
143         filt.ieee_addr = extended_addr;
144
145         return local->ops->set_hw_addr_filt(&local->hw, &filt,
146                                             IEEE802154_AFILT_IEEEADDR_CHANGED);
147 }
148
149 static inline int drv_set_short_addr(struct ieee802154_local *local,
150                                      const __le16 short_addr)
151 {
152         struct ieee802154_hw_addr_filt filt;
153
154         might_sleep();
155
156         if (!local->ops->set_hw_addr_filt) {
157                 WARN_ON(1);
158                 return -EOPNOTSUPP;
159         }
160
161         filt.short_addr = short_addr;
162
163         return local->ops->set_hw_addr_filt(&local->hw, &filt,
164                                             IEEE802154_AFILT_SADDR_CHANGED);
165 }
166
167 static inline int drv_set_pan_coord(struct ieee802154_local *local,
168                                     const bool is_coord)
169 {
170         struct ieee802154_hw_addr_filt filt;
171
172         might_sleep();
173
174         if (!local->ops->set_hw_addr_filt) {
175                 WARN_ON(1);
176                 return -EOPNOTSUPP;
177         }
178
179         filt.pan_coord = is_coord;
180
181         return local->ops->set_hw_addr_filt(&local->hw, &filt,
182                                             IEEE802154_AFILT_PANC_CHANGED);
183 }
184
185 static inline int drv_set_csma_params(struct ieee802154_local *local,
186                                       u8 min_be, u8 max_be,
187                                       u8 max_csma_backoffs)
188 {
189         might_sleep();
190
191         if (!local->ops->set_csma_params) {
192                 WARN_ON(1);
193                 return -EOPNOTSUPP;
194         }
195
196         return local->ops->set_csma_params(&local->hw, min_be, max_be,
197                                            max_csma_backoffs);
198 }
199
200 static inline int drv_set_max_frame_retries(struct ieee802154_local *local,
201                                             s8 max_frame_retries)
202 {
203         might_sleep();
204
205         if (!local->ops->set_frame_retries) {
206                 WARN_ON(1);
207                 return -EOPNOTSUPP;
208         }
209
210         return local->ops->set_frame_retries(&local->hw, max_frame_retries);
211 }
212
213 static inline int drv_set_promiscuous_mode(struct ieee802154_local *local,
214                                            const bool on)
215 {
216         might_sleep();
217
218         if (!local->ops->set_promiscuous_mode) {
219                 WARN_ON(1);
220                 return -EOPNOTSUPP;
221         }
222
223         return local->ops->set_promiscuous_mode(&local->hw, on);
224 }
225
226 #endif /* __MAC802154_DRVIER_OPS */