1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __MAC802154_DRIVER_OPS
3 #define __MAC802154_DRIVER_OPS
5 #include <linux/types.h>
6 #include <linux/rtnetlink.h>
8 #include <net/mac802154.h>
10 #include "ieee802154_i.h"
14 drv_xmit_async(struct ieee802154_local
*local
, struct sk_buff
*skb
)
16 return local
->ops
->xmit_async(&local
->hw
, skb
);
20 drv_xmit_sync(struct ieee802154_local
*local
, struct sk_buff
*skb
)
24 return local
->ops
->xmit_sync(&local
->hw
, skb
);
27 static inline int drv_start(struct ieee802154_local
*local
)
33 trace_802154_drv_start(local
);
34 local
->started
= true;
36 ret
= local
->ops
->start(&local
->hw
);
37 trace_802154_drv_return_int(local
, ret
);
41 static inline void drv_stop(struct ieee802154_local
*local
)
45 trace_802154_drv_stop(local
);
46 local
->ops
->stop(&local
->hw
);
47 trace_802154_drv_return_void(local
);
49 /* sync away all work on the tasklet before clearing started */
50 tasklet_disable(&local
->tasklet
);
51 tasklet_enable(&local
->tasklet
);
55 local
->started
= false;
59 drv_set_channel(struct ieee802154_local
*local
, u8 page
, u8 channel
)
65 trace_802154_drv_set_channel(local
, page
, channel
);
66 ret
= local
->ops
->set_channel(&local
->hw
, page
, channel
);
67 trace_802154_drv_return_int(local
, ret
);
71 static inline int drv_set_tx_power(struct ieee802154_local
*local
, s32 mbm
)
77 if (!local
->ops
->set_txpower
) {
82 trace_802154_drv_set_tx_power(local
, mbm
);
83 ret
= local
->ops
->set_txpower(&local
->hw
, mbm
);
84 trace_802154_drv_return_int(local
, ret
);
88 static inline int drv_set_cca_mode(struct ieee802154_local
*local
,
89 const struct wpan_phy_cca
*cca
)
95 if (!local
->ops
->set_cca_mode
) {
100 trace_802154_drv_set_cca_mode(local
, cca
);
101 ret
= local
->ops
->set_cca_mode(&local
->hw
, cca
);
102 trace_802154_drv_return_int(local
, ret
);
106 static inline int drv_set_lbt_mode(struct ieee802154_local
*local
, bool mode
)
112 if (!local
->ops
->set_lbt
) {
117 trace_802154_drv_set_lbt_mode(local
, mode
);
118 ret
= local
->ops
->set_lbt(&local
->hw
, mode
);
119 trace_802154_drv_return_int(local
, ret
);
124 drv_set_cca_ed_level(struct ieee802154_local
*local
, s32 mbm
)
130 if (!local
->ops
->set_cca_ed_level
) {
135 trace_802154_drv_set_cca_ed_level(local
, mbm
);
136 ret
= local
->ops
->set_cca_ed_level(&local
->hw
, mbm
);
137 trace_802154_drv_return_int(local
, ret
);
141 static inline int drv_set_pan_id(struct ieee802154_local
*local
, __le16 pan_id
)
143 struct ieee802154_hw_addr_filt filt
;
148 if (!local
->ops
->set_hw_addr_filt
) {
153 filt
.pan_id
= pan_id
;
155 trace_802154_drv_set_pan_id(local
, pan_id
);
156 ret
= local
->ops
->set_hw_addr_filt(&local
->hw
, &filt
,
157 IEEE802154_AFILT_PANID_CHANGED
);
158 trace_802154_drv_return_int(local
, ret
);
163 drv_set_extended_addr(struct ieee802154_local
*local
, __le64 extended_addr
)
165 struct ieee802154_hw_addr_filt filt
;
170 if (!local
->ops
->set_hw_addr_filt
) {
175 filt
.ieee_addr
= extended_addr
;
177 trace_802154_drv_set_extended_addr(local
, extended_addr
);
178 ret
= local
->ops
->set_hw_addr_filt(&local
->hw
, &filt
,
179 IEEE802154_AFILT_IEEEADDR_CHANGED
);
180 trace_802154_drv_return_int(local
, ret
);
185 drv_set_short_addr(struct ieee802154_local
*local
, __le16 short_addr
)
187 struct ieee802154_hw_addr_filt filt
;
192 if (!local
->ops
->set_hw_addr_filt
) {
197 filt
.short_addr
= short_addr
;
199 trace_802154_drv_set_short_addr(local
, short_addr
);
200 ret
= local
->ops
->set_hw_addr_filt(&local
->hw
, &filt
,
201 IEEE802154_AFILT_SADDR_CHANGED
);
202 trace_802154_drv_return_int(local
, ret
);
207 drv_set_pan_coord(struct ieee802154_local
*local
, bool is_coord
)
209 struct ieee802154_hw_addr_filt filt
;
214 if (!local
->ops
->set_hw_addr_filt
) {
219 filt
.pan_coord
= is_coord
;
221 trace_802154_drv_set_pan_coord(local
, is_coord
);
222 ret
= local
->ops
->set_hw_addr_filt(&local
->hw
, &filt
,
223 IEEE802154_AFILT_PANC_CHANGED
);
224 trace_802154_drv_return_int(local
, ret
);
229 drv_set_csma_params(struct ieee802154_local
*local
, u8 min_be
, u8 max_be
,
230 u8 max_csma_backoffs
)
236 if (!local
->ops
->set_csma_params
) {
241 trace_802154_drv_set_csma_params(local
, min_be
, max_be
,
243 ret
= local
->ops
->set_csma_params(&local
->hw
, min_be
, max_be
,
245 trace_802154_drv_return_int(local
, ret
);
250 drv_set_max_frame_retries(struct ieee802154_local
*local
, s8 max_frame_retries
)
256 if (!local
->ops
->set_frame_retries
) {
261 trace_802154_drv_set_max_frame_retries(local
, max_frame_retries
);
262 ret
= local
->ops
->set_frame_retries(&local
->hw
, max_frame_retries
);
263 trace_802154_drv_return_int(local
, ret
);
268 drv_set_promiscuous_mode(struct ieee802154_local
*local
, bool on
)
274 if (!local
->ops
->set_promiscuous_mode
) {
279 trace_802154_drv_set_promiscuous_mode(local
, on
);
280 ret
= local
->ops
->set_promiscuous_mode(&local
->hw
, on
);
281 trace_802154_drv_return_int(local
, ret
);
285 #endif /* __MAC802154_DRIVER_OPS */