1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef __CFG802154_RDEV_OPS
3  #define __CFG802154_RDEV_OPS
4  
5  #include <net/cfg802154.h>
6  
7  #include "core.h"
8  #include "trace.h"
9  
10  static inline struct net_device *
rdev_add_virtual_intf_deprecated(struct cfg802154_registered_device * rdev,const char * name,unsigned char name_assign_type,int type)11  rdev_add_virtual_intf_deprecated(struct cfg802154_registered_device *rdev,
12  				 const char *name,
13  				 unsigned char name_assign_type,
14  				 int type)
15  {
16  	return rdev->ops->add_virtual_intf_deprecated(&rdev->wpan_phy, name,
17  						      name_assign_type, type);
18  }
19  
20  static inline void
rdev_del_virtual_intf_deprecated(struct cfg802154_registered_device * rdev,struct net_device * dev)21  rdev_del_virtual_intf_deprecated(struct cfg802154_registered_device *rdev,
22  				 struct net_device *dev)
23  {
24  	rdev->ops->del_virtual_intf_deprecated(&rdev->wpan_phy, dev);
25  }
26  
27  static inline int
rdev_suspend(struct cfg802154_registered_device * rdev)28  rdev_suspend(struct cfg802154_registered_device *rdev)
29  {
30  	int ret;
31  	trace_802154_rdev_suspend(&rdev->wpan_phy);
32  	ret = rdev->ops->suspend(&rdev->wpan_phy);
33  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
34  	return ret;
35  }
36  
37  static inline int
rdev_resume(struct cfg802154_registered_device * rdev)38  rdev_resume(struct cfg802154_registered_device *rdev)
39  {
40  	int ret;
41  	trace_802154_rdev_resume(&rdev->wpan_phy);
42  	ret = rdev->ops->resume(&rdev->wpan_phy);
43  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
44  	return ret;
45  }
46  
47  static inline int
rdev_add_virtual_intf(struct cfg802154_registered_device * rdev,char * name,unsigned char name_assign_type,enum nl802154_iftype type,__le64 extended_addr)48  rdev_add_virtual_intf(struct cfg802154_registered_device *rdev, char *name,
49  		      unsigned char name_assign_type,
50  		      enum nl802154_iftype type, __le64 extended_addr)
51  {
52  	int ret;
53  
54  	trace_802154_rdev_add_virtual_intf(&rdev->wpan_phy, name, type,
55  					   extended_addr);
56  	ret = rdev->ops->add_virtual_intf(&rdev->wpan_phy, name,
57  					  name_assign_type, type,
58  					  extended_addr);
59  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
60  	return ret;
61  }
62  
63  static inline int
rdev_del_virtual_intf(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev)64  rdev_del_virtual_intf(struct cfg802154_registered_device *rdev,
65  		      struct wpan_dev *wpan_dev)
66  {
67  	int ret;
68  
69  	trace_802154_rdev_del_virtual_intf(&rdev->wpan_phy, wpan_dev);
70  	ret = rdev->ops->del_virtual_intf(&rdev->wpan_phy, wpan_dev);
71  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
72  	return ret;
73  }
74  
75  static inline int
rdev_set_channel(struct cfg802154_registered_device * rdev,u8 page,u8 channel)76  rdev_set_channel(struct cfg802154_registered_device *rdev, u8 page, u8 channel)
77  {
78  	int ret;
79  
80  	trace_802154_rdev_set_channel(&rdev->wpan_phy, page, channel);
81  	ret = rdev->ops->set_channel(&rdev->wpan_phy, page, channel);
82  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
83  	return ret;
84  }
85  
86  static inline int
rdev_set_cca_mode(struct cfg802154_registered_device * rdev,const struct wpan_phy_cca * cca)87  rdev_set_cca_mode(struct cfg802154_registered_device *rdev,
88  		  const struct wpan_phy_cca *cca)
89  {
90  	int ret;
91  
92  	trace_802154_rdev_set_cca_mode(&rdev->wpan_phy, cca);
93  	ret = rdev->ops->set_cca_mode(&rdev->wpan_phy, cca);
94  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
95  	return ret;
96  }
97  
98  static inline int
rdev_set_cca_ed_level(struct cfg802154_registered_device * rdev,s32 ed_level)99  rdev_set_cca_ed_level(struct cfg802154_registered_device *rdev, s32 ed_level)
100  {
101  	int ret;
102  
103  	trace_802154_rdev_set_cca_ed_level(&rdev->wpan_phy, ed_level);
104  	ret = rdev->ops->set_cca_ed_level(&rdev->wpan_phy, ed_level);
105  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
106  	return ret;
107  }
108  
109  static inline int
rdev_set_tx_power(struct cfg802154_registered_device * rdev,s32 power)110  rdev_set_tx_power(struct cfg802154_registered_device *rdev,
111  		  s32 power)
112  {
113  	int ret;
114  
115  	trace_802154_rdev_set_tx_power(&rdev->wpan_phy, power);
116  	ret = rdev->ops->set_tx_power(&rdev->wpan_phy, power);
117  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
118  	return ret;
119  }
120  
121  static inline int
rdev_set_pan_id(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,__le16 pan_id)122  rdev_set_pan_id(struct cfg802154_registered_device *rdev,
123  		struct wpan_dev *wpan_dev, __le16 pan_id)
124  {
125  	int ret;
126  
127  	trace_802154_rdev_set_pan_id(&rdev->wpan_phy, wpan_dev, pan_id);
128  	ret = rdev->ops->set_pan_id(&rdev->wpan_phy, wpan_dev, pan_id);
129  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
130  	return ret;
131  }
132  
133  static inline int
rdev_set_short_addr(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,__le16 short_addr)134  rdev_set_short_addr(struct cfg802154_registered_device *rdev,
135  		    struct wpan_dev *wpan_dev, __le16 short_addr)
136  {
137  	int ret;
138  
139  	trace_802154_rdev_set_short_addr(&rdev->wpan_phy, wpan_dev, short_addr);
140  	ret = rdev->ops->set_short_addr(&rdev->wpan_phy, wpan_dev, short_addr);
141  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
142  	return ret;
143  }
144  
145  static inline int
rdev_set_backoff_exponent(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,u8 min_be,u8 max_be)146  rdev_set_backoff_exponent(struct cfg802154_registered_device *rdev,
147  			  struct wpan_dev *wpan_dev, u8 min_be, u8 max_be)
148  {
149  	int ret;
150  
151  	trace_802154_rdev_set_backoff_exponent(&rdev->wpan_phy, wpan_dev,
152  					       min_be, max_be);
153  	ret = rdev->ops->set_backoff_exponent(&rdev->wpan_phy, wpan_dev,
154  					      min_be, max_be);
155  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
156  	return ret;
157  }
158  
159  static inline int
rdev_set_max_csma_backoffs(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,u8 max_csma_backoffs)160  rdev_set_max_csma_backoffs(struct cfg802154_registered_device *rdev,
161  			   struct wpan_dev *wpan_dev, u8 max_csma_backoffs)
162  {
163  	int ret;
164  
165  	trace_802154_rdev_set_csma_backoffs(&rdev->wpan_phy, wpan_dev,
166  					    max_csma_backoffs);
167  	ret = rdev->ops->set_max_csma_backoffs(&rdev->wpan_phy, wpan_dev,
168  					       max_csma_backoffs);
169  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
170  	return ret;
171  }
172  
173  static inline int
rdev_set_max_frame_retries(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,s8 max_frame_retries)174  rdev_set_max_frame_retries(struct cfg802154_registered_device *rdev,
175  			   struct wpan_dev *wpan_dev, s8 max_frame_retries)
176  {
177  	int ret;
178  
179  	trace_802154_rdev_set_max_frame_retries(&rdev->wpan_phy, wpan_dev,
180  						max_frame_retries);
181  	ret = rdev->ops->set_max_frame_retries(&rdev->wpan_phy, wpan_dev,
182  					       max_frame_retries);
183  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
184  	return ret;
185  }
186  
187  static inline int
rdev_set_lbt_mode(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,bool mode)188  rdev_set_lbt_mode(struct cfg802154_registered_device *rdev,
189  		  struct wpan_dev *wpan_dev, bool mode)
190  {
191  	int ret;
192  
193  	trace_802154_rdev_set_lbt_mode(&rdev->wpan_phy, wpan_dev, mode);
194  	ret = rdev->ops->set_lbt_mode(&rdev->wpan_phy, wpan_dev, mode);
195  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
196  	return ret;
197  }
198  
199  static inline int
rdev_set_ackreq_default(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,bool ackreq)200  rdev_set_ackreq_default(struct cfg802154_registered_device *rdev,
201  			struct wpan_dev *wpan_dev, bool ackreq)
202  {
203  	int ret;
204  
205  	trace_802154_rdev_set_ackreq_default(&rdev->wpan_phy, wpan_dev,
206  					     ackreq);
207  	ret = rdev->ops->set_ackreq_default(&rdev->wpan_phy, wpan_dev, ackreq);
208  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
209  	return ret;
210  }
211  
rdev_trigger_scan(struct cfg802154_registered_device * rdev,struct cfg802154_scan_request * request)212  static inline int rdev_trigger_scan(struct cfg802154_registered_device *rdev,
213  				    struct cfg802154_scan_request *request)
214  {
215  	int ret;
216  
217  	if (!rdev->ops->trigger_scan)
218  		return -EOPNOTSUPP;
219  
220  	trace_802154_rdev_trigger_scan(&rdev->wpan_phy, request);
221  	ret = rdev->ops->trigger_scan(&rdev->wpan_phy, request);
222  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
223  	return ret;
224  }
225  
rdev_abort_scan(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev)226  static inline int rdev_abort_scan(struct cfg802154_registered_device *rdev,
227  				  struct wpan_dev *wpan_dev)
228  {
229  	int ret;
230  
231  	if (!rdev->ops->abort_scan)
232  		return -EOPNOTSUPP;
233  
234  	trace_802154_rdev_abort_scan(&rdev->wpan_phy, wpan_dev);
235  	ret = rdev->ops->abort_scan(&rdev->wpan_phy, wpan_dev);
236  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
237  	return ret;
238  }
239  
rdev_send_beacons(struct cfg802154_registered_device * rdev,struct cfg802154_beacon_request * request)240  static inline int rdev_send_beacons(struct cfg802154_registered_device *rdev,
241  				    struct cfg802154_beacon_request *request)
242  {
243  	int ret;
244  
245  	if (!rdev->ops->send_beacons)
246  		return -EOPNOTSUPP;
247  
248  	trace_802154_rdev_send_beacons(&rdev->wpan_phy, request);
249  	ret = rdev->ops->send_beacons(&rdev->wpan_phy, request);
250  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
251  	return ret;
252  }
253  
rdev_stop_beacons(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev)254  static inline int rdev_stop_beacons(struct cfg802154_registered_device *rdev,
255  				    struct wpan_dev *wpan_dev)
256  {
257  	int ret;
258  
259  	if (!rdev->ops->stop_beacons)
260  		return -EOPNOTSUPP;
261  
262  	trace_802154_rdev_stop_beacons(&rdev->wpan_phy, wpan_dev);
263  	ret = rdev->ops->stop_beacons(&rdev->wpan_phy, wpan_dev);
264  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
265  	return ret;
266  }
267  
rdev_associate(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,struct ieee802154_addr * coord)268  static inline int rdev_associate(struct cfg802154_registered_device *rdev,
269  				 struct wpan_dev *wpan_dev,
270  				 struct ieee802154_addr *coord)
271  {
272  	int ret;
273  
274  	if (!rdev->ops->associate)
275  		return -EOPNOTSUPP;
276  
277  	trace_802154_rdev_associate(&rdev->wpan_phy, wpan_dev, coord);
278  	ret = rdev->ops->associate(&rdev->wpan_phy, wpan_dev, coord);
279  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
280  	return ret;
281  }
282  
rdev_disassociate(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,struct ieee802154_addr * target)283  static inline int rdev_disassociate(struct cfg802154_registered_device *rdev,
284  				    struct wpan_dev *wpan_dev,
285  				    struct ieee802154_addr *target)
286  {
287  	int ret;
288  
289  	if (!rdev->ops->disassociate)
290  		return -EOPNOTSUPP;
291  
292  	trace_802154_rdev_disassociate(&rdev->wpan_phy, wpan_dev, target);
293  	ret = rdev->ops->disassociate(&rdev->wpan_phy, wpan_dev, target);
294  	trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
295  	return ret;
296  }
297  
298  #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
299  /* TODO this is already a nl802154, so move into ieee802154 */
300  static inline void
rdev_get_llsec_table(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,struct ieee802154_llsec_table ** table)301  rdev_get_llsec_table(struct cfg802154_registered_device *rdev,
302  		     struct wpan_dev *wpan_dev,
303  		     struct ieee802154_llsec_table **table)
304  {
305  	rdev->ops->get_llsec_table(&rdev->wpan_phy, wpan_dev, table);
306  }
307  
308  static inline void
rdev_lock_llsec_table(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev)309  rdev_lock_llsec_table(struct cfg802154_registered_device *rdev,
310  		      struct wpan_dev *wpan_dev)
311  {
312  	rdev->ops->lock_llsec_table(&rdev->wpan_phy, wpan_dev);
313  }
314  
315  static inline void
rdev_unlock_llsec_table(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev)316  rdev_unlock_llsec_table(struct cfg802154_registered_device *rdev,
317  			struct wpan_dev *wpan_dev)
318  {
319  	rdev->ops->unlock_llsec_table(&rdev->wpan_phy, wpan_dev);
320  }
321  
322  static inline int
rdev_get_llsec_params(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,struct ieee802154_llsec_params * params)323  rdev_get_llsec_params(struct cfg802154_registered_device *rdev,
324  		      struct wpan_dev *wpan_dev,
325  		      struct ieee802154_llsec_params *params)
326  {
327  	return rdev->ops->get_llsec_params(&rdev->wpan_phy, wpan_dev, params);
328  }
329  
330  static inline int
rdev_set_llsec_params(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,const struct ieee802154_llsec_params * params,u32 changed)331  rdev_set_llsec_params(struct cfg802154_registered_device *rdev,
332  		      struct wpan_dev *wpan_dev,
333  		      const struct ieee802154_llsec_params *params,
334  		      u32 changed)
335  {
336  	return rdev->ops->set_llsec_params(&rdev->wpan_phy, wpan_dev, params,
337  					   changed);
338  }
339  
340  static inline int
rdev_add_llsec_key(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,const struct ieee802154_llsec_key_id * id,const struct ieee802154_llsec_key * key)341  rdev_add_llsec_key(struct cfg802154_registered_device *rdev,
342  		   struct wpan_dev *wpan_dev,
343  		   const struct ieee802154_llsec_key_id *id,
344  		   const struct ieee802154_llsec_key *key)
345  {
346  	return rdev->ops->add_llsec_key(&rdev->wpan_phy, wpan_dev, id, key);
347  }
348  
349  static inline int
rdev_del_llsec_key(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,const struct ieee802154_llsec_key_id * id)350  rdev_del_llsec_key(struct cfg802154_registered_device *rdev,
351  		   struct wpan_dev *wpan_dev,
352  		   const struct ieee802154_llsec_key_id *id)
353  {
354  	return rdev->ops->del_llsec_key(&rdev->wpan_phy, wpan_dev, id);
355  }
356  
357  static inline int
rdev_add_seclevel(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,const struct ieee802154_llsec_seclevel * sl)358  rdev_add_seclevel(struct cfg802154_registered_device *rdev,
359  		  struct wpan_dev *wpan_dev,
360  		  const struct ieee802154_llsec_seclevel *sl)
361  {
362  	return rdev->ops->add_seclevel(&rdev->wpan_phy, wpan_dev, sl);
363  }
364  
365  static inline int
rdev_del_seclevel(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,const struct ieee802154_llsec_seclevel * sl)366  rdev_del_seclevel(struct cfg802154_registered_device *rdev,
367  		  struct wpan_dev *wpan_dev,
368  		  const struct ieee802154_llsec_seclevel *sl)
369  {
370  	return rdev->ops->del_seclevel(&rdev->wpan_phy, wpan_dev, sl);
371  }
372  
373  static inline int
rdev_add_device(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,const struct ieee802154_llsec_device * dev_desc)374  rdev_add_device(struct cfg802154_registered_device *rdev,
375  		struct wpan_dev *wpan_dev,
376  		const struct ieee802154_llsec_device *dev_desc)
377  {
378  	return rdev->ops->add_device(&rdev->wpan_phy, wpan_dev, dev_desc);
379  }
380  
381  static inline int
rdev_del_device(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,__le64 extended_addr)382  rdev_del_device(struct cfg802154_registered_device *rdev,
383  		struct wpan_dev *wpan_dev, __le64 extended_addr)
384  {
385  	return rdev->ops->del_device(&rdev->wpan_phy, wpan_dev, extended_addr);
386  }
387  
388  static inline int
rdev_add_devkey(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,__le64 extended_addr,const struct ieee802154_llsec_device_key * devkey)389  rdev_add_devkey(struct cfg802154_registered_device *rdev,
390  		struct wpan_dev *wpan_dev, __le64 extended_addr,
391  		const struct ieee802154_llsec_device_key *devkey)
392  {
393  	return rdev->ops->add_devkey(&rdev->wpan_phy, wpan_dev, extended_addr,
394  				     devkey);
395  }
396  
397  static inline int
rdev_del_devkey(struct cfg802154_registered_device * rdev,struct wpan_dev * wpan_dev,__le64 extended_addr,const struct ieee802154_llsec_device_key * devkey)398  rdev_del_devkey(struct cfg802154_registered_device *rdev,
399  		struct wpan_dev *wpan_dev, __le64 extended_addr,
400  		const struct ieee802154_llsec_device_key *devkey)
401  {
402  	return rdev->ops->del_devkey(&rdev->wpan_phy, wpan_dev, extended_addr,
403  				     devkey);
404  }
405  #endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
406  
407  #endif /* __CFG802154_RDEV_OPS */
408