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