linux/net/mac802154/driver-ops.h
<<
>>
Prefs
   1#ifndef __MAC802154_DRIVER_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#include "trace.h"
  11
  12static inline int
  13drv_xmit_async(struct ieee802154_local *local, struct sk_buff *skb)
  14{
  15        return local->ops->xmit_async(&local->hw, skb);
  16}
  17
  18static inline int
  19drv_xmit_sync(struct ieee802154_local *local, struct sk_buff *skb)
  20{
  21        might_sleep();
  22
  23        return local->ops->xmit_sync(&local->hw, skb);
  24}
  25
  26static inline int drv_start(struct ieee802154_local *local)
  27{
  28        int ret;
  29
  30        might_sleep();
  31
  32        trace_802154_drv_start(local);
  33        local->started = true;
  34        smp_mb();
  35        ret = local->ops->start(&local->hw);
  36        trace_802154_drv_return_int(local, ret);
  37        return ret;
  38}
  39
  40static inline void drv_stop(struct ieee802154_local *local)
  41{
  42        might_sleep();
  43
  44        trace_802154_drv_stop(local);
  45        local->ops->stop(&local->hw);
  46        trace_802154_drv_return_void(local);
  47
  48        /* sync away all work on the tasklet before clearing started */
  49        tasklet_disable(&local->tasklet);
  50        tasklet_enable(&local->tasklet);
  51
  52        barrier();
  53
  54        local->started = false;
  55}
  56
  57static inline int
  58drv_set_channel(struct ieee802154_local *local, u8 page, u8 channel)
  59{
  60        int ret;
  61
  62        might_sleep();
  63
  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);
  67        return ret;
  68}
  69
  70static inline int drv_set_tx_power(struct ieee802154_local *local, s32 mbm)
  71{
  72        int ret;
  73
  74        might_sleep();
  75
  76        if (!local->ops->set_txpower) {
  77                WARN_ON(1);
  78                return -EOPNOTSUPP;
  79        }
  80
  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);
  84        return ret;
  85}
  86
  87static inline int drv_set_cca_mode(struct ieee802154_local *local,
  88                                   const struct wpan_phy_cca *cca)
  89{
  90        int ret;
  91
  92        might_sleep();
  93
  94        if (!local->ops->set_cca_mode) {
  95                WARN_ON(1);
  96                return -EOPNOTSUPP;
  97        }
  98
  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);
 102        return ret;
 103}
 104
 105static inline int drv_set_lbt_mode(struct ieee802154_local *local, bool mode)
 106{
 107        int ret;
 108
 109        might_sleep();
 110
 111        if (!local->ops->set_lbt) {
 112                WARN_ON(1);
 113                return -EOPNOTSUPP;
 114        }
 115
 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);
 119        return ret;
 120}
 121
 122static inline int
 123drv_set_cca_ed_level(struct ieee802154_local *local, s32 mbm)
 124{
 125        int ret;
 126
 127        might_sleep();
 128
 129        if (!local->ops->set_cca_ed_level) {
 130                WARN_ON(1);
 131                return -EOPNOTSUPP;
 132        }
 133
 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);
 137        return ret;
 138}
 139
 140static inline int drv_set_pan_id(struct ieee802154_local *local, __le16 pan_id)
 141{
 142        struct ieee802154_hw_addr_filt filt;
 143        int ret;
 144
 145        might_sleep();
 146
 147        if (!local->ops->set_hw_addr_filt) {
 148                WARN_ON(1);
 149                return -EOPNOTSUPP;
 150        }
 151
 152        filt.pan_id = pan_id;
 153
 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);
 158        return ret;
 159}
 160
 161static inline int
 162drv_set_extended_addr(struct ieee802154_local *local, __le64 extended_addr)
 163{
 164        struct ieee802154_hw_addr_filt filt;
 165        int ret;
 166
 167        might_sleep();
 168
 169        if (!local->ops->set_hw_addr_filt) {
 170                WARN_ON(1);
 171                return -EOPNOTSUPP;
 172        }
 173
 174        filt.ieee_addr = extended_addr;
 175
 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);
 180        return ret;
 181}
 182
 183static inline int
 184drv_set_short_addr(struct ieee802154_local *local, __le16 short_addr)
 185{
 186        struct ieee802154_hw_addr_filt filt;
 187        int ret;
 188
 189        might_sleep();
 190
 191        if (!local->ops->set_hw_addr_filt) {
 192                WARN_ON(1);
 193                return -EOPNOTSUPP;
 194        }
 195
 196        filt.short_addr = short_addr;
 197
 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);
 202        return ret;
 203}
 204
 205static inline int
 206drv_set_pan_coord(struct ieee802154_local *local, bool is_coord)
 207{
 208        struct ieee802154_hw_addr_filt filt;
 209        int ret;
 210
 211        might_sleep();
 212
 213        if (!local->ops->set_hw_addr_filt) {
 214                WARN_ON(1);
 215                return -EOPNOTSUPP;
 216        }
 217
 218        filt.pan_coord = is_coord;
 219
 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);
 224        return ret;
 225}
 226
 227static inline int
 228drv_set_csma_params(struct ieee802154_local *local, u8 min_be, u8 max_be,
 229                    u8 max_csma_backoffs)
 230{
 231        int ret;
 232
 233        might_sleep();
 234
 235        if (!local->ops->set_csma_params) {
 236                WARN_ON(1);
 237                return -EOPNOTSUPP;
 238        }
 239
 240        trace_802154_drv_set_csma_params(local, min_be, max_be,
 241                                         max_csma_backoffs);
 242        ret = local->ops->set_csma_params(&local->hw, min_be, max_be,
 243                                           max_csma_backoffs);
 244        trace_802154_drv_return_int(local, ret);
 245        return ret;
 246}
 247
 248static inline int
 249drv_set_max_frame_retries(struct ieee802154_local *local, s8 max_frame_retries)
 250{
 251        int ret;
 252
 253        might_sleep();
 254
 255        if (!local->ops->set_frame_retries) {
 256                WARN_ON(1);
 257                return -EOPNOTSUPP;
 258        }
 259
 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);
 263        return ret;
 264}
 265
 266static inline int
 267drv_set_promiscuous_mode(struct ieee802154_local *local, bool on)
 268{
 269        int ret;
 270
 271        might_sleep();
 272
 273        if (!local->ops->set_promiscuous_mode) {
 274                WARN_ON(1);
 275                return -EOPNOTSUPP;
 276        }
 277
 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);
 281        return ret;
 282}
 283
 284#endif /* __MAC802154_DRIVER_OPS */
 285