1 #ifndef __MAC802154_DRIVER_OPS
2 #define __MAC802154_DRIVER_OPS
4 #include <linux/types.h>
5 #include <linux/rtnetlink.h>
7 #include <net/mac802154.h>
9 #include "ieee802154_i.h"
13 drv_xmit_async(struct ieee802154_local
*local
, struct sk_buff
*skb
)
15 return local
->ops
->xmit_async(&local
->hw
, skb
);
19 drv_xmit_sync(struct ieee802154_local
*local
, struct sk_buff
*skb
)
23 return local
->ops
->xmit_sync(&local
->hw
, skb
);
26 static inline int drv_start(struct ieee802154_local
*local
)
32 trace_802154_drv_start(local
);
33 local
->started
= true;
35 ret
= local
->ops
->start(&local
->hw
);
36 trace_802154_drv_return_int(local
, ret
);
40 static inline void drv_stop(struct ieee802154_local
*local
)
44 trace_802154_drv_stop(local
);
45 local
->ops
->stop(&local
->hw
);
46 trace_802154_drv_return_void(local
);
48 /* sync away all work on the tasklet before clearing started */
49 tasklet_disable(&local
->tasklet
);
50 tasklet_enable(&local
->tasklet
);
54 local
->started
= false;
58 drv_set_channel(struct ieee802154_local
*local
, u8 page
, u8 channel
)
64 trace_802154_drv_set_channel(local
, page
, channel
);
65 ret
= local
->ops
->set_channel(&local
->hw
, page
, channel
);
66 trace_802154_drv_return_int(local
, ret
);
70 static inline int drv_set_tx_power(struct ieee802154_local
*local
, s32 mbm
)
76 if (!local
->ops
->set_txpower
) {
81 trace_802154_drv_set_tx_power(local
, mbm
);
82 ret
= local
->ops
->set_txpower(&local
->hw
, mbm
);
83 trace_802154_drv_return_int(local
, ret
);
87 static inline int drv_set_cca_mode(struct ieee802154_local
*local
,
88 const struct wpan_phy_cca
*cca
)
94 if (!local
->ops
->set_cca_mode
) {
99 trace_802154_drv_set_cca_mode(local
, cca
);
100 ret
= local
->ops
->set_cca_mode(&local
->hw
, cca
);
101 trace_802154_drv_return_int(local
, ret
);
105 static inline int drv_set_lbt_mode(struct ieee802154_local
*local
, bool mode
)
111 if (!local
->ops
->set_lbt
) {
116 trace_802154_drv_set_lbt_mode(local
, mode
);
117 ret
= local
->ops
->set_lbt(&local
->hw
, mode
);
118 trace_802154_drv_return_int(local
, ret
);
123 drv_set_cca_ed_level(struct ieee802154_local
*local
, s32 mbm
)
129 if (!local
->ops
->set_cca_ed_level
) {
134 trace_802154_drv_set_cca_ed_level(local
, mbm
);
135 ret
= local
->ops
->set_cca_ed_level(&local
->hw
, mbm
);
136 trace_802154_drv_return_int(local
, ret
);
140 static inline int drv_set_pan_id(struct ieee802154_local
*local
, __le16 pan_id
)
142 struct ieee802154_hw_addr_filt filt
;
147 if (!local
->ops
->set_hw_addr_filt
) {
152 filt
.pan_id
= pan_id
;
154 trace_802154_drv_set_pan_id(local
, pan_id
);
155 ret
= local
->ops
->set_hw_addr_filt(&local
->hw
, &filt
,
156 IEEE802154_AFILT_PANID_CHANGED
);
157 trace_802154_drv_return_int(local
, ret
);
162 drv_set_extended_addr(struct ieee802154_local
*local
, __le64 extended_addr
)
164 struct ieee802154_hw_addr_filt filt
;
169 if (!local
->ops
->set_hw_addr_filt
) {
174 filt
.ieee_addr
= extended_addr
;
176 trace_802154_drv_set_extended_addr(local
, extended_addr
);
177 ret
= local
->ops
->set_hw_addr_filt(&local
->hw
, &filt
,
178 IEEE802154_AFILT_IEEEADDR_CHANGED
);
179 trace_802154_drv_return_int(local
, ret
);
184 drv_set_short_addr(struct ieee802154_local
*local
, __le16 short_addr
)
186 struct ieee802154_hw_addr_filt filt
;
191 if (!local
->ops
->set_hw_addr_filt
) {
196 filt
.short_addr
= short_addr
;
198 trace_802154_drv_set_short_addr(local
, short_addr
);
199 ret
= local
->ops
->set_hw_addr_filt(&local
->hw
, &filt
,
200 IEEE802154_AFILT_SADDR_CHANGED
);
201 trace_802154_drv_return_int(local
, ret
);
206 drv_set_pan_coord(struct ieee802154_local
*local
, bool is_coord
)
208 struct ieee802154_hw_addr_filt filt
;
213 if (!local
->ops
->set_hw_addr_filt
) {
218 filt
.pan_coord
= is_coord
;
220 trace_802154_drv_set_pan_coord(local
, is_coord
);
221 ret
= local
->ops
->set_hw_addr_filt(&local
->hw
, &filt
,
222 IEEE802154_AFILT_PANC_CHANGED
);
223 trace_802154_drv_return_int(local
, ret
);
228 drv_set_csma_params(struct ieee802154_local
*local
, u8 min_be
, u8 max_be
,
229 u8 max_csma_backoffs
)
235 if (!local
->ops
->set_csma_params
) {
240 trace_802154_drv_set_csma_params(local
, min_be
, max_be
,
242 ret
= local
->ops
->set_csma_params(&local
->hw
, min_be
, max_be
,
244 trace_802154_drv_return_int(local
, ret
);
249 drv_set_max_frame_retries(struct ieee802154_local
*local
, s8 max_frame_retries
)
255 if (!local
->ops
->set_frame_retries
) {
260 trace_802154_drv_set_max_frame_retries(local
, max_frame_retries
);
261 ret
= local
->ops
->set_frame_retries(&local
->hw
, max_frame_retries
);
262 trace_802154_drv_return_int(local
, ret
);
267 drv_set_promiscuous_mode(struct ieee802154_local
*local
, bool on
)
273 if (!local
->ops
->set_promiscuous_mode
) {
278 trace_802154_drv_set_promiscuous_mode(local
, on
);
279 ret
= local
->ops
->set_promiscuous_mode(&local
->hw
, on
);
280 trace_802154_drv_return_int(local
, ret
);
284 #endif /* __MAC802154_DRIVER_OPS */