xref: /openbmc/linux/net/mac802154/driver-ops.h (revision 538181a8)
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 #endif /* __MAC802154_DRVIER_OPS */
214