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