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