aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac802154/driver-ops.h
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2014-10-28 13:21:20 -0400
committerMarcel Holtmann <marcel@holtmann.org>2014-10-28 18:19:07 -0400
commitb6eea9ca354aeb80d358ff52d046bb8a26bd2b17 (patch)
treeb3789b53065ecec56d9d327073ec897a87d01c0e /net/mac802154/driver-ops.h
parente37d2ec82a222f1819e7793a27bc052999a379fb (diff)
mac802154: introduce driver-ops header
This patch introduce a driver-ops header file with function wrappers to call the driver ops. These wrappers checking on right context information and warn if optional driver ops are called when these aren't implemented. This behaviour is like mac80211 driver-ops header file, just without function tracing calls. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/mac802154/driver-ops.h')
-rw-r--r--net/mac802154/driver-ops.h202
1 files changed, 202 insertions, 0 deletions
diff --git a/net/mac802154/driver-ops.h b/net/mac802154/driver-ops.h
new file mode 100644
index 000000000000..bf7980bbceff
--- /dev/null
+++ b/net/mac802154/driver-ops.h
@@ -0,0 +1,202 @@
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
11static inline int
12drv_xmit_async(struct ieee802154_local *local, struct sk_buff *skb)
13{
14 return local->ops->xmit_async(&local->hw, skb);
15}
16
17static inline int
18drv_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
28static inline int drv_start(struct ieee802154_local *local)
29{
30 might_sleep();
31
32 return local->ops->start(&local->hw);
33}
34
35static inline void drv_stop(struct ieee802154_local *local)
36{
37 might_sleep();
38
39 local->ops->stop(&local->hw);
40}
41
42static inline int drv_set_channel(struct ieee802154_local *local,
43 const u8 page, const u8 channel)
44{
45 might_sleep();
46
47 return local->ops->set_channel(&local->hw, page, channel);
48}
49
50static inline int drv_set_tx_power(struct ieee802154_local *local,
51 const s8 dbm)
52{
53 might_sleep();
54
55 if (!local->ops->set_txpower) {
56 WARN_ON(1);
57 return -EOPNOTSUPP;
58 }
59
60 return local->ops->set_txpower(&local->hw, dbm);
61}
62
63static inline int drv_set_cca_mode(struct ieee802154_local *local,
64 const u8 cca_mode)
65{
66 might_sleep();
67
68 if (!local->ops->set_cca_mode) {
69 WARN_ON(1);
70 return -EOPNOTSUPP;
71 }
72
73 return local->ops->set_cca_mode(&local->hw, cca_mode);
74}
75
76static inline int drv_set_lbt_mode(struct ieee802154_local *local,
77 const bool mode)
78{
79 might_sleep();
80
81 if (!local->ops->set_lbt) {
82 WARN_ON(1);
83 return -EOPNOTSUPP;
84 }
85
86 return local->ops->set_lbt(&local->hw, mode);
87}
88
89static inline int drv_set_cca_ed_level(struct ieee802154_local *local,
90 const s32 ed_level)
91{
92 might_sleep();
93
94 if (!local->ops->set_cca_ed_level) {
95 WARN_ON(1);
96 return -EOPNOTSUPP;
97 }
98
99 return local->ops->set_cca_ed_level(&local->hw, ed_level);
100}
101
102static inline int drv_set_pan_id(struct ieee802154_local *local,
103 const __le16 pan_id)
104{
105 struct ieee802154_hw_addr_filt filt;
106
107 might_sleep();
108
109 if (!local->ops->set_hw_addr_filt) {
110 WARN_ON(1);
111 return -EOPNOTSUPP;
112 }
113
114 filt.pan_id = pan_id;
115
116 return local->ops->set_hw_addr_filt(&local->hw, &filt,
117 IEEE802154_AFILT_PANID_CHANGED);
118}
119
120static inline int drv_set_extended_addr(struct ieee802154_local *local,
121 const __le64 extended_addr)
122{
123 struct ieee802154_hw_addr_filt filt;
124
125 might_sleep();
126
127 if (!local->ops->set_hw_addr_filt) {
128 WARN_ON(1);
129 return -EOPNOTSUPP;
130 }
131
132 filt.ieee_addr = extended_addr;
133
134 return local->ops->set_hw_addr_filt(&local->hw, &filt,
135 IEEE802154_AFILT_IEEEADDR_CHANGED);
136}
137
138static inline int drv_set_short_addr(struct ieee802154_local *local,
139 const __le16 short_addr)
140{
141 struct ieee802154_hw_addr_filt filt;
142
143 might_sleep();
144
145 if (!local->ops->set_hw_addr_filt) {
146 WARN_ON(1);
147 return -EOPNOTSUPP;
148 }
149
150 filt.short_addr = short_addr;
151
152 return local->ops->set_hw_addr_filt(&local->hw, &filt,
153 IEEE802154_AFILT_SADDR_CHANGED);
154}
155
156static inline int drv_set_pan_coord(struct ieee802154_local *local,
157 const bool is_coord)
158{
159 struct ieee802154_hw_addr_filt filt;
160
161 might_sleep();
162
163 if (!local->ops->set_hw_addr_filt) {
164 WARN_ON(1);
165 return -EOPNOTSUPP;
166 }
167
168 filt.pan_coord = is_coord;
169
170 return local->ops->set_hw_addr_filt(&local->hw, &filt,
171 IEEE802154_AFILT_PANC_CHANGED);
172}
173
174static inline int drv_set_csma_params(struct ieee802154_local *local,
175 u8 min_be, u8 max_be,
176 u8 max_csma_backoffs)
177{
178 might_sleep();
179
180 if (!local->ops->set_csma_params) {
181 WARN_ON(1);
182 return -EOPNOTSUPP;
183 }
184
185 return local->ops->set_csma_params(&local->hw, min_be, max_be,
186 max_csma_backoffs);
187}
188
189static inline int drv_set_max_frame_retries(struct ieee802154_local *local,
190 s8 max_frame_retries)
191{
192 might_sleep();
193
194 if (!local->ops->set_frame_retries) {
195 WARN_ON(1);
196 return -EOPNOTSUPP;
197 }
198
199 return local->ops->set_frame_retries(&local->hw, max_frame_retries);
200}
201
202#endif /* __MAC802154_DRVIER_OPS */