xref: /openbmc/linux/net/mac802154/driver-ops.h (revision b6eea9ca)
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 
32b6eea9caSAlexander Aring 	return local->ops->start(&local->hw);
33b6eea9caSAlexander Aring }
34b6eea9caSAlexander Aring 
35b6eea9caSAlexander Aring static inline void drv_stop(struct ieee802154_local *local)
36b6eea9caSAlexander Aring {
37b6eea9caSAlexander Aring 	might_sleep();
38b6eea9caSAlexander Aring 
39b6eea9caSAlexander Aring 	local->ops->stop(&local->hw);
40b6eea9caSAlexander Aring }
41b6eea9caSAlexander Aring 
42b6eea9caSAlexander Aring static inline int drv_set_channel(struct ieee802154_local *local,
43b6eea9caSAlexander Aring 				  const u8 page, const u8 channel)
44b6eea9caSAlexander Aring {
45b6eea9caSAlexander Aring 	might_sleep();
46b6eea9caSAlexander Aring 
47b6eea9caSAlexander Aring 	return local->ops->set_channel(&local->hw, page, channel);
48b6eea9caSAlexander Aring }
49b6eea9caSAlexander Aring 
50b6eea9caSAlexander Aring static inline int drv_set_tx_power(struct ieee802154_local *local,
51b6eea9caSAlexander Aring 				   const s8 dbm)
52b6eea9caSAlexander Aring {
53b6eea9caSAlexander Aring 	might_sleep();
54b6eea9caSAlexander Aring 
55b6eea9caSAlexander Aring 	if (!local->ops->set_txpower) {
56b6eea9caSAlexander Aring 		WARN_ON(1);
57b6eea9caSAlexander Aring 		return -EOPNOTSUPP;
58b6eea9caSAlexander Aring 	}
59b6eea9caSAlexander Aring 
60b6eea9caSAlexander Aring 	return local->ops->set_txpower(&local->hw, dbm);
61b6eea9caSAlexander Aring }
62b6eea9caSAlexander Aring 
63b6eea9caSAlexander Aring static inline int drv_set_cca_mode(struct ieee802154_local *local,
64b6eea9caSAlexander Aring 				   const u8 cca_mode)
65b6eea9caSAlexander Aring {
66b6eea9caSAlexander Aring 	might_sleep();
67b6eea9caSAlexander Aring 
68b6eea9caSAlexander Aring 	if (!local->ops->set_cca_mode) {
69b6eea9caSAlexander Aring 		WARN_ON(1);
70b6eea9caSAlexander Aring 		return -EOPNOTSUPP;
71b6eea9caSAlexander Aring 	}
72b6eea9caSAlexander Aring 
73b6eea9caSAlexander Aring 	return local->ops->set_cca_mode(&local->hw, cca_mode);
74b6eea9caSAlexander Aring }
75b6eea9caSAlexander Aring 
76b6eea9caSAlexander Aring static inline int drv_set_lbt_mode(struct ieee802154_local *local,
77b6eea9caSAlexander Aring 				   const bool mode)
78b6eea9caSAlexander Aring {
79b6eea9caSAlexander Aring 	might_sleep();
80b6eea9caSAlexander Aring 
81b6eea9caSAlexander Aring 	if (!local->ops->set_lbt) {
82b6eea9caSAlexander Aring 		WARN_ON(1);
83b6eea9caSAlexander Aring 		return -EOPNOTSUPP;
84b6eea9caSAlexander Aring 	}
85b6eea9caSAlexander Aring 
86b6eea9caSAlexander Aring 	return local->ops->set_lbt(&local->hw, mode);
87b6eea9caSAlexander Aring }
88b6eea9caSAlexander Aring 
89b6eea9caSAlexander Aring static inline int drv_set_cca_ed_level(struct ieee802154_local *local,
90b6eea9caSAlexander Aring 				       const s32 ed_level)
91b6eea9caSAlexander Aring {
92b6eea9caSAlexander Aring 	might_sleep();
93b6eea9caSAlexander Aring 
94b6eea9caSAlexander Aring 	if (!local->ops->set_cca_ed_level) {
95b6eea9caSAlexander Aring 		WARN_ON(1);
96b6eea9caSAlexander Aring 		return -EOPNOTSUPP;
97b6eea9caSAlexander Aring 	}
98b6eea9caSAlexander Aring 
99b6eea9caSAlexander Aring 	return local->ops->set_cca_ed_level(&local->hw, ed_level);
100b6eea9caSAlexander Aring }
101b6eea9caSAlexander Aring 
102b6eea9caSAlexander Aring static inline int drv_set_pan_id(struct ieee802154_local *local,
103b6eea9caSAlexander Aring 				 const __le16 pan_id)
104b6eea9caSAlexander Aring {
105b6eea9caSAlexander Aring 	struct ieee802154_hw_addr_filt filt;
106b6eea9caSAlexander Aring 
107b6eea9caSAlexander Aring 	might_sleep();
108b6eea9caSAlexander Aring 
109b6eea9caSAlexander Aring 	if (!local->ops->set_hw_addr_filt) {
110b6eea9caSAlexander Aring 		WARN_ON(1);
111b6eea9caSAlexander Aring 		return -EOPNOTSUPP;
112b6eea9caSAlexander Aring 	}
113b6eea9caSAlexander Aring 
114b6eea9caSAlexander Aring 	filt.pan_id = pan_id;
115b6eea9caSAlexander Aring 
116b6eea9caSAlexander Aring 	return local->ops->set_hw_addr_filt(&local->hw, &filt,
117b6eea9caSAlexander Aring 					    IEEE802154_AFILT_PANID_CHANGED);
118b6eea9caSAlexander Aring }
119b6eea9caSAlexander Aring 
120b6eea9caSAlexander Aring static inline int drv_set_extended_addr(struct ieee802154_local *local,
121b6eea9caSAlexander Aring 					const __le64 extended_addr)
122b6eea9caSAlexander Aring {
123b6eea9caSAlexander Aring 	struct ieee802154_hw_addr_filt filt;
124b6eea9caSAlexander Aring 
125b6eea9caSAlexander Aring 	might_sleep();
126b6eea9caSAlexander Aring 
127b6eea9caSAlexander Aring 	if (!local->ops->set_hw_addr_filt) {
128b6eea9caSAlexander Aring 		WARN_ON(1);
129b6eea9caSAlexander Aring 		return -EOPNOTSUPP;
130b6eea9caSAlexander Aring 	}
131b6eea9caSAlexander Aring 
132b6eea9caSAlexander Aring 	filt.ieee_addr = extended_addr;
133b6eea9caSAlexander Aring 
134b6eea9caSAlexander Aring 	return local->ops->set_hw_addr_filt(&local->hw, &filt,
135b6eea9caSAlexander Aring 					    IEEE802154_AFILT_IEEEADDR_CHANGED);
136b6eea9caSAlexander Aring }
137b6eea9caSAlexander Aring 
138b6eea9caSAlexander Aring static inline int drv_set_short_addr(struct ieee802154_local *local,
139b6eea9caSAlexander Aring 				     const __le16 short_addr)
140b6eea9caSAlexander Aring {
141b6eea9caSAlexander Aring 	struct ieee802154_hw_addr_filt filt;
142b6eea9caSAlexander Aring 
143b6eea9caSAlexander Aring 	might_sleep();
144b6eea9caSAlexander Aring 
145b6eea9caSAlexander Aring 	if (!local->ops->set_hw_addr_filt) {
146b6eea9caSAlexander Aring 		WARN_ON(1);
147b6eea9caSAlexander Aring 		return -EOPNOTSUPP;
148b6eea9caSAlexander Aring 	}
149b6eea9caSAlexander Aring 
150b6eea9caSAlexander Aring 	filt.short_addr = short_addr;
151b6eea9caSAlexander Aring 
152b6eea9caSAlexander Aring 	return local->ops->set_hw_addr_filt(&local->hw, &filt,
153b6eea9caSAlexander Aring 					    IEEE802154_AFILT_SADDR_CHANGED);
154b6eea9caSAlexander Aring }
155b6eea9caSAlexander Aring 
156b6eea9caSAlexander Aring static inline int drv_set_pan_coord(struct ieee802154_local *local,
157b6eea9caSAlexander Aring 				    const bool is_coord)
158b6eea9caSAlexander Aring {
159b6eea9caSAlexander Aring 	struct ieee802154_hw_addr_filt filt;
160b6eea9caSAlexander Aring 
161b6eea9caSAlexander Aring 	might_sleep();
162b6eea9caSAlexander Aring 
163b6eea9caSAlexander Aring 	if (!local->ops->set_hw_addr_filt) {
164b6eea9caSAlexander Aring 		WARN_ON(1);
165b6eea9caSAlexander Aring 		return -EOPNOTSUPP;
166b6eea9caSAlexander Aring 	}
167b6eea9caSAlexander Aring 
168b6eea9caSAlexander Aring 	filt.pan_coord = is_coord;
169b6eea9caSAlexander Aring 
170b6eea9caSAlexander Aring 	return local->ops->set_hw_addr_filt(&local->hw, &filt,
171b6eea9caSAlexander Aring 					    IEEE802154_AFILT_PANC_CHANGED);
172b6eea9caSAlexander Aring }
173b6eea9caSAlexander Aring 
174b6eea9caSAlexander Aring static inline int drv_set_csma_params(struct ieee802154_local *local,
175b6eea9caSAlexander Aring 				      u8 min_be, u8 max_be,
176b6eea9caSAlexander Aring 				      u8 max_csma_backoffs)
177b6eea9caSAlexander Aring {
178b6eea9caSAlexander Aring 	might_sleep();
179b6eea9caSAlexander Aring 
180b6eea9caSAlexander Aring 	if (!local->ops->set_csma_params) {
181b6eea9caSAlexander Aring 		WARN_ON(1);
182b6eea9caSAlexander Aring 		return -EOPNOTSUPP;
183b6eea9caSAlexander Aring 	}
184b6eea9caSAlexander Aring 
185b6eea9caSAlexander Aring 	return local->ops->set_csma_params(&local->hw, min_be, max_be,
186b6eea9caSAlexander Aring 					   max_csma_backoffs);
187b6eea9caSAlexander Aring }
188b6eea9caSAlexander Aring 
189b6eea9caSAlexander Aring static inline int drv_set_max_frame_retries(struct ieee802154_local *local,
190b6eea9caSAlexander Aring 					    s8 max_frame_retries)
191b6eea9caSAlexander Aring {
192b6eea9caSAlexander Aring 	might_sleep();
193b6eea9caSAlexander Aring 
194b6eea9caSAlexander Aring 	if (!local->ops->set_frame_retries) {
195b6eea9caSAlexander Aring 		WARN_ON(1);
196b6eea9caSAlexander Aring 		return -EOPNOTSUPP;
197b6eea9caSAlexander Aring 	}
198b6eea9caSAlexander Aring 
199b6eea9caSAlexander Aring 	return local->ops->set_frame_retries(&local->hw, max_frame_retries);
200b6eea9caSAlexander Aring }
201b6eea9caSAlexander Aring 
202b6eea9caSAlexander Aring #endif /* __MAC802154_DRVIER_OPS */
203