xref: /linux/net/mac802154/driver-ops.h (revision 93d90ad708b8da6efc0e487b66111aa9db7f70c7)
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
54 drv_set_channel(struct ieee802154_local *local, u8 page, 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, s8 dbm)
62 {
63 	might_sleep();
64 
65 	if (!local->ops->set_txpower) {
66 		WARN_ON(1);
67 		return -EOPNOTSUPP;
68 	}
69 
70 	return local->ops->set_txpower(&local->hw, dbm);
71 }
72 
73 static inline int drv_set_cca_mode(struct ieee802154_local *local, u8 cca_mode)
74 {
75 	might_sleep();
76 
77 	if (!local->ops->set_cca_mode) {
78 		WARN_ON(1);
79 		return -EOPNOTSUPP;
80 	}
81 
82 	return local->ops->set_cca_mode(&local->hw, cca_mode);
83 }
84 
85 static inline int drv_set_lbt_mode(struct ieee802154_local *local, bool mode)
86 {
87 	might_sleep();
88 
89 	if (!local->ops->set_lbt) {
90 		WARN_ON(1);
91 		return -EOPNOTSUPP;
92 	}
93 
94 	return local->ops->set_lbt(&local->hw, mode);
95 }
96 
97 static inline int
98 drv_set_cca_ed_level(struct ieee802154_local *local, s32 ed_level)
99 {
100 	might_sleep();
101 
102 	if (!local->ops->set_cca_ed_level) {
103 		WARN_ON(1);
104 		return -EOPNOTSUPP;
105 	}
106 
107 	return local->ops->set_cca_ed_level(&local->hw, ed_level);
108 }
109 
110 static inline int drv_set_pan_id(struct ieee802154_local *local, __le16 pan_id)
111 {
112 	struct ieee802154_hw_addr_filt filt;
113 
114 	might_sleep();
115 
116 	if (!local->ops->set_hw_addr_filt) {
117 		WARN_ON(1);
118 		return -EOPNOTSUPP;
119 	}
120 
121 	filt.pan_id = pan_id;
122 
123 	return local->ops->set_hw_addr_filt(&local->hw, &filt,
124 					    IEEE802154_AFILT_PANID_CHANGED);
125 }
126 
127 static inline int
128 drv_set_extended_addr(struct ieee802154_local *local, __le64 extended_addr)
129 {
130 	struct ieee802154_hw_addr_filt filt;
131 
132 	might_sleep();
133 
134 	if (!local->ops->set_hw_addr_filt) {
135 		WARN_ON(1);
136 		return -EOPNOTSUPP;
137 	}
138 
139 	filt.ieee_addr = extended_addr;
140 
141 	return local->ops->set_hw_addr_filt(&local->hw, &filt,
142 					    IEEE802154_AFILT_IEEEADDR_CHANGED);
143 }
144 
145 static inline int
146 drv_set_short_addr(struct ieee802154_local *local, __le16 short_addr)
147 {
148 	struct ieee802154_hw_addr_filt filt;
149 
150 	might_sleep();
151 
152 	if (!local->ops->set_hw_addr_filt) {
153 		WARN_ON(1);
154 		return -EOPNOTSUPP;
155 	}
156 
157 	filt.short_addr = short_addr;
158 
159 	return local->ops->set_hw_addr_filt(&local->hw, &filt,
160 					    IEEE802154_AFILT_SADDR_CHANGED);
161 }
162 
163 static inline int
164 drv_set_pan_coord(struct ieee802154_local *local, bool is_coord)
165 {
166 	struct ieee802154_hw_addr_filt filt;
167 
168 	might_sleep();
169 
170 	if (!local->ops->set_hw_addr_filt) {
171 		WARN_ON(1);
172 		return -EOPNOTSUPP;
173 	}
174 
175 	filt.pan_coord = is_coord;
176 
177 	return local->ops->set_hw_addr_filt(&local->hw, &filt,
178 					    IEEE802154_AFILT_PANC_CHANGED);
179 }
180 
181 static inline int
182 drv_set_csma_params(struct ieee802154_local *local, u8 min_be, u8 max_be,
183 		    u8 max_csma_backoffs)
184 {
185 	might_sleep();
186 
187 	if (!local->ops->set_csma_params) {
188 		WARN_ON(1);
189 		return -EOPNOTSUPP;
190 	}
191 
192 	return local->ops->set_csma_params(&local->hw, min_be, max_be,
193 					   max_csma_backoffs);
194 }
195 
196 static inline int
197 drv_set_max_frame_retries(struct ieee802154_local *local, s8 max_frame_retries)
198 {
199 	might_sleep();
200 
201 	if (!local->ops->set_frame_retries) {
202 		WARN_ON(1);
203 		return -EOPNOTSUPP;
204 	}
205 
206 	return local->ops->set_frame_retries(&local->hw, max_frame_retries);
207 }
208 
209 static inline int
210 drv_set_promiscuous_mode(struct ieee802154_local *local, bool on)
211 {
212 	might_sleep();
213 
214 	if (!local->ops->set_promiscuous_mode) {
215 		WARN_ON(1);
216 		return -EOPNOTSUPP;
217 	}
218 
219 	return local->ops->set_promiscuous_mode(&local->hw, on);
220 }
221 
222 #endif /* __MAC802154_DRVIER_OPS */
223