1 #ifndef __MAC802154_DRVIER_OPS 2 #define __MAC802154_DRIVER_OPS 3 4 #include <linux/types.h> 5 #include <linux/rtnetlink.h> 6 7 #include <net/mac802154.h> 8 9 #include "ieee802154_i.h" 10 11 static inline int 12 drv_xmit_async(struct ieee802154_local *local, struct sk_buff *skb) 13 { 14 return local->ops->xmit_async(&local->hw, skb); 15 } 16 17 static inline int 18 drv_xmit_sync(struct ieee802154_local *local, struct sk_buff *skb) 19 { 20 /* don't allow other operations while sync xmit */ 21 ASSERT_RTNL(); 22 23 might_sleep(); 24 25 return local->ops->xmit_sync(&local->hw, skb); 26 } 27 28 static inline int drv_start(struct ieee802154_local *local) 29 { 30 might_sleep(); 31 32 local->started = true; 33 smp_mb(); 34 35 return local->ops->start(&local->hw); 36 } 37 38 static inline void drv_stop(struct ieee802154_local *local) 39 { 40 might_sleep(); 41 42 local->ops->stop(&local->hw); 43 44 /* sync away all work on the tasklet before clearing started */ 45 tasklet_disable(&local->tasklet); 46 tasklet_enable(&local->tasklet); 47 48 barrier(); 49 50 local->started = false; 51 } 52 53 static inline int 54 drv_set_channel(struct ieee802154_local *local, u8 page, u8 channel) 55 { 56 might_sleep(); 57 58 return local->ops->set_channel(&local->hw, page, channel); 59 } 60 61 static inline int drv_set_tx_power(struct ieee802154_local *local, s8 dbm) 62 { 63 might_sleep(); 64 65 if (!local->ops->set_txpower) { 66 WARN_ON(1); 67 return -EOPNOTSUPP; 68 } 69 70 return local->ops->set_txpower(&local->hw, dbm); 71 } 72 73 static inline int drv_set_cca_mode(struct ieee802154_local *local, u8 cca_mode) 74 { 75 might_sleep(); 76 77 if (!local->ops->set_cca_mode) { 78 WARN_ON(1); 79 return -EOPNOTSUPP; 80 } 81 82 return local->ops->set_cca_mode(&local->hw, cca_mode); 83 } 84 85 static inline int drv_set_lbt_mode(struct ieee802154_local *local, bool mode) 86 { 87 might_sleep(); 88 89 if (!local->ops->set_lbt) { 90 WARN_ON(1); 91 return -EOPNOTSUPP; 92 } 93 94 return local->ops->set_lbt(&local->hw, mode); 95 } 96 97 static inline int 98 drv_set_cca_ed_level(struct ieee802154_local *local, s32 ed_level) 99 { 100 might_sleep(); 101 102 if (!local->ops->set_cca_ed_level) { 103 WARN_ON(1); 104 return -EOPNOTSUPP; 105 } 106 107 return local->ops->set_cca_ed_level(&local->hw, ed_level); 108 } 109 110 static inline int drv_set_pan_id(struct ieee802154_local *local, __le16 pan_id) 111 { 112 struct ieee802154_hw_addr_filt filt; 113 114 might_sleep(); 115 116 if (!local->ops->set_hw_addr_filt) { 117 WARN_ON(1); 118 return -EOPNOTSUPP; 119 } 120 121 filt.pan_id = pan_id; 122 123 return local->ops->set_hw_addr_filt(&local->hw, &filt, 124 IEEE802154_AFILT_PANID_CHANGED); 125 } 126 127 static inline int 128 drv_set_extended_addr(struct ieee802154_local *local, __le64 extended_addr) 129 { 130 struct ieee802154_hw_addr_filt filt; 131 132 might_sleep(); 133 134 if (!local->ops->set_hw_addr_filt) { 135 WARN_ON(1); 136 return -EOPNOTSUPP; 137 } 138 139 filt.ieee_addr = extended_addr; 140 141 return local->ops->set_hw_addr_filt(&local->hw, &filt, 142 IEEE802154_AFILT_IEEEADDR_CHANGED); 143 } 144 145 static inline int 146 drv_set_short_addr(struct ieee802154_local *local, __le16 short_addr) 147 { 148 struct ieee802154_hw_addr_filt filt; 149 150 might_sleep(); 151 152 if (!local->ops->set_hw_addr_filt) { 153 WARN_ON(1); 154 return -EOPNOTSUPP; 155 } 156 157 filt.short_addr = short_addr; 158 159 return local->ops->set_hw_addr_filt(&local->hw, &filt, 160 IEEE802154_AFILT_SADDR_CHANGED); 161 } 162 163 static inline int 164 drv_set_pan_coord(struct ieee802154_local *local, bool is_coord) 165 { 166 struct ieee802154_hw_addr_filt filt; 167 168 might_sleep(); 169 170 if (!local->ops->set_hw_addr_filt) { 171 WARN_ON(1); 172 return -EOPNOTSUPP; 173 } 174 175 filt.pan_coord = is_coord; 176 177 return local->ops->set_hw_addr_filt(&local->hw, &filt, 178 IEEE802154_AFILT_PANC_CHANGED); 179 } 180 181 static inline int 182 drv_set_csma_params(struct ieee802154_local *local, u8 min_be, u8 max_be, 183 u8 max_csma_backoffs) 184 { 185 might_sleep(); 186 187 if (!local->ops->set_csma_params) { 188 WARN_ON(1); 189 return -EOPNOTSUPP; 190 } 191 192 return local->ops->set_csma_params(&local->hw, min_be, max_be, 193 max_csma_backoffs); 194 } 195 196 static inline int 197 drv_set_max_frame_retries(struct ieee802154_local *local, s8 max_frame_retries) 198 { 199 might_sleep(); 200 201 if (!local->ops->set_frame_retries) { 202 WARN_ON(1); 203 return -EOPNOTSUPP; 204 } 205 206 return local->ops->set_frame_retries(&local->hw, max_frame_retries); 207 } 208 209 static inline int 210 drv_set_promiscuous_mode(struct ieee802154_local *local, bool on) 211 { 212 might_sleep(); 213 214 if (!local->ops->set_promiscuous_mode) { 215 WARN_ON(1); 216 return -EOPNOTSUPP; 217 } 218 219 return local->ops->set_promiscuous_mode(&local->hw, on); 220 } 221 222 #endif /* __MAC802154_DRVIER_OPS */ 223