linux/net/mac80211/driver-ops.h
<<
>>
Prefs
   1#ifndef __MAC80211_DRIVER_OPS
   2#define __MAC80211_DRIVER_OPS
   3
   4#include <net/mac80211.h>
   5#include "ieee80211_i.h"
   6#include "driver-trace.h"
   7
   8static inline int drv_tx(struct ieee80211_local *local, struct sk_buff *skb)
   9{
  10        return local->ops->tx(&local->hw, skb);
  11}
  12
  13static inline int drv_start(struct ieee80211_local *local)
  14{
  15        int ret;
  16
  17        local->started = true;
  18        smp_mb();
  19        ret = local->ops->start(&local->hw);
  20        trace_drv_start(local, ret);
  21        return ret;
  22}
  23
  24static inline void drv_stop(struct ieee80211_local *local)
  25{
  26        local->ops->stop(&local->hw);
  27        trace_drv_stop(local);
  28
  29        /* sync away all work on the tasklet before clearing started */
  30        tasklet_disable(&local->tasklet);
  31        tasklet_enable(&local->tasklet);
  32
  33        barrier();
  34
  35        local->started = false;
  36}
  37
  38static inline int drv_add_interface(struct ieee80211_local *local,
  39                                    struct ieee80211_if_init_conf *conf)
  40{
  41        int ret = local->ops->add_interface(&local->hw, conf);
  42        trace_drv_add_interface(local, conf->mac_addr, conf->vif, ret);
  43        return ret;
  44}
  45
  46static inline void drv_remove_interface(struct ieee80211_local *local,
  47                                        struct ieee80211_if_init_conf *conf)
  48{
  49        local->ops->remove_interface(&local->hw, conf);
  50        trace_drv_remove_interface(local, conf->mac_addr, conf->vif);
  51}
  52
  53static inline int drv_config(struct ieee80211_local *local, u32 changed)
  54{
  55        int ret = local->ops->config(&local->hw, changed);
  56        trace_drv_config(local, changed, ret);
  57        return ret;
  58}
  59
  60static inline void drv_bss_info_changed(struct ieee80211_local *local,
  61                                        struct ieee80211_vif *vif,
  62                                        struct ieee80211_bss_conf *info,
  63                                        u32 changed)
  64{
  65        if (local->ops->bss_info_changed)
  66                local->ops->bss_info_changed(&local->hw, vif, info, changed);
  67        trace_drv_bss_info_changed(local, vif, info, changed);
  68}
  69
  70static inline u64 drv_prepare_multicast(struct ieee80211_local *local,
  71                                        int mc_count,
  72                                        struct dev_addr_list *mc_list)
  73{
  74        u64 ret = 0;
  75
  76        if (local->ops->prepare_multicast)
  77                ret = local->ops->prepare_multicast(&local->hw, mc_count,
  78                                                    mc_list);
  79
  80        trace_drv_prepare_multicast(local, mc_count, ret);
  81
  82        return ret;
  83}
  84
  85static inline void drv_configure_filter(struct ieee80211_local *local,
  86                                        unsigned int changed_flags,
  87                                        unsigned int *total_flags,
  88                                        u64 multicast)
  89{
  90        might_sleep();
  91
  92        local->ops->configure_filter(&local->hw, changed_flags, total_flags,
  93                                     multicast);
  94        trace_drv_configure_filter(local, changed_flags, total_flags,
  95                                   multicast);
  96}
  97
  98static inline int drv_set_tim(struct ieee80211_local *local,
  99                              struct ieee80211_sta *sta, bool set)
 100{
 101        int ret = 0;
 102        if (local->ops->set_tim)
 103                ret = local->ops->set_tim(&local->hw, sta, set);
 104        trace_drv_set_tim(local, sta, set, ret);
 105        return ret;
 106}
 107
 108static inline int drv_set_key(struct ieee80211_local *local,
 109                              enum set_key_cmd cmd, struct ieee80211_vif *vif,
 110                              struct ieee80211_sta *sta,
 111                              struct ieee80211_key_conf *key)
 112{
 113        int ret = local->ops->set_key(&local->hw, cmd, vif, sta, key);
 114        trace_drv_set_key(local, cmd, vif, sta, key, ret);
 115        return ret;
 116}
 117
 118static inline void drv_update_tkip_key(struct ieee80211_local *local,
 119                                       struct ieee80211_key_conf *conf,
 120                                       const u8 *address, u32 iv32,
 121                                       u16 *phase1key)
 122{
 123        if (local->ops->update_tkip_key)
 124                local->ops->update_tkip_key(&local->hw, conf, address,
 125                                            iv32, phase1key);
 126        trace_drv_update_tkip_key(local, conf, address, iv32);
 127}
 128
 129static inline int drv_hw_scan(struct ieee80211_local *local,
 130                              struct cfg80211_scan_request *req)
 131{
 132        int ret = local->ops->hw_scan(&local->hw, req);
 133        trace_drv_hw_scan(local, req, ret);
 134        return ret;
 135}
 136
 137static inline void drv_sw_scan_start(struct ieee80211_local *local)
 138{
 139        if (local->ops->sw_scan_start)
 140                local->ops->sw_scan_start(&local->hw);
 141        trace_drv_sw_scan_start(local);
 142}
 143
 144static inline void drv_sw_scan_complete(struct ieee80211_local *local)
 145{
 146        if (local->ops->sw_scan_complete)
 147                local->ops->sw_scan_complete(&local->hw);
 148        trace_drv_sw_scan_complete(local);
 149}
 150
 151static inline int drv_get_stats(struct ieee80211_local *local,
 152                                struct ieee80211_low_level_stats *stats)
 153{
 154        int ret = -EOPNOTSUPP;
 155
 156        if (local->ops->get_stats)
 157                ret = local->ops->get_stats(&local->hw, stats);
 158        trace_drv_get_stats(local, stats, ret);
 159
 160        return ret;
 161}
 162
 163static inline void drv_get_tkip_seq(struct ieee80211_local *local,
 164                                    u8 hw_key_idx, u32 *iv32, u16 *iv16)
 165{
 166        if (local->ops->get_tkip_seq)
 167                local->ops->get_tkip_seq(&local->hw, hw_key_idx, iv32, iv16);
 168        trace_drv_get_tkip_seq(local, hw_key_idx, iv32, iv16);
 169}
 170
 171static inline int drv_set_rts_threshold(struct ieee80211_local *local,
 172                                        u32 value)
 173{
 174        int ret = 0;
 175        if (local->ops->set_rts_threshold)
 176                ret = local->ops->set_rts_threshold(&local->hw, value);
 177        trace_drv_set_rts_threshold(local, value, ret);
 178        return ret;
 179}
 180
 181static inline void drv_sta_notify(struct ieee80211_local *local,
 182                                  struct ieee80211_vif *vif,
 183                                  enum sta_notify_cmd cmd,
 184                                  struct ieee80211_sta *sta)
 185{
 186        if (local->ops->sta_notify)
 187                local->ops->sta_notify(&local->hw, vif, cmd, sta);
 188        trace_drv_sta_notify(local, vif, cmd, sta);
 189}
 190
 191static inline int drv_conf_tx(struct ieee80211_local *local, u16 queue,
 192                              const struct ieee80211_tx_queue_params *params)
 193{
 194        int ret = -EOPNOTSUPP;
 195        if (local->ops->conf_tx)
 196                ret = local->ops->conf_tx(&local->hw, queue, params);
 197        trace_drv_conf_tx(local, queue, params, ret);
 198        return ret;
 199}
 200
 201static inline int drv_get_tx_stats(struct ieee80211_local *local,
 202                                   struct ieee80211_tx_queue_stats *stats)
 203{
 204        int ret = local->ops->get_tx_stats(&local->hw, stats);
 205        trace_drv_get_tx_stats(local, stats, ret);
 206        return ret;
 207}
 208
 209static inline u64 drv_get_tsf(struct ieee80211_local *local)
 210{
 211        u64 ret = -1ULL;
 212        if (local->ops->get_tsf)
 213                ret = local->ops->get_tsf(&local->hw);
 214        trace_drv_get_tsf(local, ret);
 215        return ret;
 216}
 217
 218static inline void drv_set_tsf(struct ieee80211_local *local, u64 tsf)
 219{
 220        if (local->ops->set_tsf)
 221                local->ops->set_tsf(&local->hw, tsf);
 222        trace_drv_set_tsf(local, tsf);
 223}
 224
 225static inline void drv_reset_tsf(struct ieee80211_local *local)
 226{
 227        if (local->ops->reset_tsf)
 228                local->ops->reset_tsf(&local->hw);
 229        trace_drv_reset_tsf(local);
 230}
 231
 232static inline int drv_tx_last_beacon(struct ieee80211_local *local)
 233{
 234        int ret = 1;
 235        if (local->ops->tx_last_beacon)
 236                ret = local->ops->tx_last_beacon(&local->hw);
 237        trace_drv_tx_last_beacon(local, ret);
 238        return ret;
 239}
 240
 241static inline int drv_ampdu_action(struct ieee80211_local *local,
 242                                   enum ieee80211_ampdu_mlme_action action,
 243                                   struct ieee80211_sta *sta, u16 tid,
 244                                   u16 *ssn)
 245{
 246        int ret = -EOPNOTSUPP;
 247        if (local->ops->ampdu_action)
 248                ret = local->ops->ampdu_action(&local->hw, action,
 249                                               sta, tid, ssn);
 250        trace_drv_ampdu_action(local, action, sta, tid, ssn, ret);
 251        return ret;
 252}
 253
 254
 255static inline void drv_rfkill_poll(struct ieee80211_local *local)
 256{
 257        if (local->ops->rfkill_poll)
 258                local->ops->rfkill_poll(&local->hw);
 259}
 260#endif /* __MAC80211_DRIVER_OPS */
 261
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.