linux/drivers/net/wireless/intel/iwlwifi/dvm/agn.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
   2/*
   3 * Copyright (C) 2005-2014 Intel Corporation
   4 */
   5#ifndef __iwl_agn_h__
   6#define __iwl_agn_h__
   7
   8#include "iwl-config.h"
   9
  10#include "dev.h"
  11
  12/* The first 11 queues (0-10) are used otherwise */
  13#define IWLAGN_FIRST_AMPDU_QUEUE        11
  14
  15/* AUX (TX during scan dwell) queue */
  16#define IWL_AUX_QUEUE           10
  17
  18#define IWL_INVALID_STATION     255
  19
  20/* device operations */
  21extern const struct iwl_dvm_cfg iwl_dvm_1000_cfg;
  22extern const struct iwl_dvm_cfg iwl_dvm_2000_cfg;
  23extern const struct iwl_dvm_cfg iwl_dvm_105_cfg;
  24extern const struct iwl_dvm_cfg iwl_dvm_2030_cfg;
  25extern const struct iwl_dvm_cfg iwl_dvm_5000_cfg;
  26extern const struct iwl_dvm_cfg iwl_dvm_5150_cfg;
  27extern const struct iwl_dvm_cfg iwl_dvm_6000_cfg;
  28extern const struct iwl_dvm_cfg iwl_dvm_6005_cfg;
  29extern const struct iwl_dvm_cfg iwl_dvm_6050_cfg;
  30extern const struct iwl_dvm_cfg iwl_dvm_6030_cfg;
  31
  32
  33#define TIME_UNIT               1024
  34
  35/*****************************************************
  36* DRIVER STATUS FUNCTIONS
  37******************************************************/
  38#define STATUS_RF_KILL_HW       0
  39#define STATUS_CT_KILL          1
  40#define STATUS_ALIVE            2
  41#define STATUS_READY            3
  42#define STATUS_EXIT_PENDING     5
  43#define STATUS_STATISTICS       6
  44#define STATUS_SCANNING         7
  45#define STATUS_SCAN_ABORTING    8
  46#define STATUS_SCAN_HW          9
  47#define STATUS_FW_ERROR         10
  48#define STATUS_CHANNEL_SWITCH_PENDING 11
  49#define STATUS_SCAN_COMPLETE    12
  50#define STATUS_POWER_PMI        13
  51
  52struct iwl_ucode_capabilities;
  53
  54extern const struct ieee80211_ops iwlagn_hw_ops;
  55
  56static inline void iwl_set_calib_hdr(struct iwl_calib_hdr *hdr, u8 cmd)
  57{
  58        hdr->op_code = cmd;
  59        hdr->first_group = 0;
  60        hdr->groups_num = 1;
  61        hdr->data_valid = 1;
  62}
  63
  64void iwl_down(struct iwl_priv *priv);
  65void iwl_cancel_deferred_work(struct iwl_priv *priv);
  66void iwlagn_prepare_restart(struct iwl_priv *priv);
  67void iwl_rx_dispatch(struct iwl_op_mode *op_mode, struct napi_struct *napi,
  68                     struct iwl_rx_cmd_buffer *rxb);
  69
  70bool iwl_check_for_ct_kill(struct iwl_priv *priv);
  71
  72void iwlagn_lift_passive_no_rx(struct iwl_priv *priv);
  73
  74/* MAC80211 */
  75struct ieee80211_hw *iwl_alloc_all(void);
  76int iwlagn_mac_setup_register(struct iwl_priv *priv,
  77                              const struct iwl_ucode_capabilities *capa);
  78void iwlagn_mac_unregister(struct iwl_priv *priv);
  79
  80/* commands */
  81int iwl_dvm_send_cmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd);
  82int iwl_dvm_send_cmd_pdu(struct iwl_priv *priv, u8 id,
  83                         u32 flags, u16 len, const void *data);
  84
  85/* RXON */
  86void iwl_connection_init_rx_config(struct iwl_priv *priv,
  87                                   struct iwl_rxon_context *ctx);
  88int iwlagn_set_pan_params(struct iwl_priv *priv);
  89int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
  90void iwlagn_set_rxon_chain(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
  91int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed);
  92void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
  93                             struct ieee80211_vif *vif,
  94                             struct ieee80211_bss_conf *bss_conf,
  95                             u32 changes);
  96void iwlagn_config_ht40(struct ieee80211_conf *conf,
  97                        struct iwl_rxon_context *ctx);
  98void iwl_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_config *ht_conf);
  99void iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch,
 100                         struct iwl_rxon_context *ctx);
 101void iwl_set_flags_for_band(struct iwl_priv *priv,
 102                            struct iwl_rxon_context *ctx,
 103                            enum nl80211_band band,
 104                            struct ieee80211_vif *vif);
 105
 106/* uCode */
 107int iwl_send_bt_env(struct iwl_priv *priv, u8 action, u8 type);
 108void iwl_send_prio_tbl(struct iwl_priv *priv);
 109int iwl_init_alive_start(struct iwl_priv *priv);
 110int iwl_run_init_ucode(struct iwl_priv *priv);
 111int iwl_load_ucode_wait_alive(struct iwl_priv *priv,
 112                              enum iwl_ucode_type ucode_type);
 113int iwl_send_calib_results(struct iwl_priv *priv);
 114int iwl_calib_set(struct iwl_priv *priv,
 115                  const struct iwl_calib_hdr *cmd, int len);
 116void iwl_calib_free_results(struct iwl_priv *priv);
 117int iwl_dump_nic_event_log(struct iwl_priv *priv, bool full_log,
 118                            char **buf);
 119int iwlagn_hw_valid_rtc_data_addr(u32 addr);
 120
 121/* lib */
 122int iwlagn_send_tx_power(struct iwl_priv *priv);
 123void iwlagn_temperature(struct iwl_priv *priv);
 124int iwlagn_txfifo_flush(struct iwl_priv *priv, u32 scd_q_msk);
 125void iwlagn_dev_txfifo_flush(struct iwl_priv *priv);
 126int iwlagn_send_beacon_cmd(struct iwl_priv *priv);
 127int iwl_send_statistics_request(struct iwl_priv *priv,
 128                                u8 flags, bool clear);
 129
 130static inline const struct ieee80211_supported_band *iwl_get_hw_mode(
 131                        struct iwl_priv *priv, enum nl80211_band band)
 132{
 133        return priv->hw->wiphy->bands[band];
 134}
 135
 136#ifdef CONFIG_PM_SLEEP
 137int iwlagn_send_patterns(struct iwl_priv *priv,
 138                         struct cfg80211_wowlan *wowlan);
 139int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan);
 140#endif
 141
 142/* rx */
 143int iwlagn_hwrate_to_mac80211_idx(u32 rate_n_flags, enum nl80211_band band);
 144void iwl_setup_rx_handlers(struct iwl_priv *priv);
 145void iwl_chswitch_done(struct iwl_priv *priv, bool is_success);
 146
 147
 148/* tx */
 149int iwlagn_tx_skb(struct iwl_priv *priv,
 150                  struct ieee80211_sta *sta,
 151                  struct sk_buff *skb);
 152int iwlagn_tx_agg_start(struct iwl_priv *priv, struct ieee80211_vif *vif,
 153                        struct ieee80211_sta *sta, u16 tid, u16 *ssn);
 154int iwlagn_tx_agg_oper(struct iwl_priv *priv, struct ieee80211_vif *vif,
 155                        struct ieee80211_sta *sta, u16 tid, u8 buf_size);
 156int iwlagn_tx_agg_stop(struct iwl_priv *priv, struct ieee80211_vif *vif,
 157                       struct ieee80211_sta *sta, u16 tid);
 158int iwlagn_tx_agg_flush(struct iwl_priv *priv, struct ieee80211_vif *vif,
 159                        struct ieee80211_sta *sta, u16 tid);
 160void iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
 161                                   struct iwl_rx_cmd_buffer *rxb);
 162void iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb);
 163
 164static inline u32 iwl_tx_status_to_mac80211(u32 status)
 165{
 166        status &= TX_STATUS_MSK;
 167
 168        switch (status) {
 169        case TX_STATUS_SUCCESS:
 170        case TX_STATUS_DIRECT_DONE:
 171                return IEEE80211_TX_STAT_ACK;
 172        case TX_STATUS_FAIL_DEST_PS:
 173        case TX_STATUS_FAIL_PASSIVE_NO_RX:
 174                return IEEE80211_TX_STAT_TX_FILTERED;
 175        default:
 176                return 0;
 177        }
 178}
 179
 180static inline bool iwl_is_tx_success(u32 status)
 181{
 182        status &= TX_STATUS_MSK;
 183        return (status == TX_STATUS_SUCCESS) ||
 184               (status == TX_STATUS_DIRECT_DONE);
 185}
 186
 187u8 iwl_toggle_tx_ant(struct iwl_priv *priv, u8 ant_idx, u8 valid);
 188
 189/* scan */
 190void iwlagn_post_scan(struct iwl_priv *priv);
 191int iwl_force_rf_reset(struct iwl_priv *priv, bool external);
 192void iwl_init_scan_params(struct iwl_priv *priv);
 193int iwl_scan_cancel(struct iwl_priv *priv);
 194void iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms);
 195void iwl_force_scan_end(struct iwl_priv *priv);
 196void iwl_internal_short_hw_scan(struct iwl_priv *priv);
 197void iwl_setup_rx_scan_handlers(struct iwl_priv *priv);
 198void iwl_setup_scan_deferred_work(struct iwl_priv *priv);
 199void iwl_cancel_scan_deferred_work(struct iwl_priv *priv);
 200int __must_check iwl_scan_initiate(struct iwl_priv *priv,
 201                                   struct ieee80211_vif *vif,
 202                                   enum iwl_scan_type scan_type,
 203                                   enum nl80211_band band);
 204
 205/* For faster active scanning, scan will move to the next channel if fewer than
 206 * PLCP_QUIET_THRESH packets are heard on this channel within
 207 * ACTIVE_QUIET_TIME after sending probe request.  This shortens the dwell
 208 * time if it's a quiet channel (nothing responded to our probe, and there's
 209 * no other traffic).
 210 * Disable "quiet" feature by setting PLCP_QUIET_THRESH to 0. */
 211#define IWL_ACTIVE_QUIET_TIME       cpu_to_le16(10)  /* msec */
 212#define IWL_PLCP_QUIET_THRESH       cpu_to_le16(1)  /* packets */
 213
 214#define IWL_SCAN_CHECK_WATCHDOG         (HZ * 15)
 215
 216
 217/* bt coex */
 218void iwlagn_send_advance_bt_config(struct iwl_priv *priv);
 219void iwlagn_bt_rx_handler_setup(struct iwl_priv *priv);
 220void iwlagn_bt_setup_deferred_work(struct iwl_priv *priv);
 221void iwlagn_bt_cancel_deferred_work(struct iwl_priv *priv);
 222void iwlagn_bt_coex_rssi_monitor(struct iwl_priv *priv);
 223void iwlagn_bt_adjust_rssi_monitor(struct iwl_priv *priv, bool rssi_ena);
 224
 225static inline bool iwl_advanced_bt_coexist(struct iwl_priv *priv)
 226{
 227        return priv->lib->bt_params &&
 228               priv->lib->bt_params->advanced_bt_coexist;
 229}
 230
 231#ifdef CONFIG_IWLWIFI_DEBUG
 232const char *iwl_get_tx_fail_reason(u32 status);
 233const char *iwl_get_agg_tx_fail_reason(u16 status);
 234#else
 235static inline const char *iwl_get_tx_fail_reason(u32 status) { return ""; }
 236static inline const char *iwl_get_agg_tx_fail_reason(u16 status) { return ""; }
 237#endif
 238
 239
 240/* station management */
 241int iwlagn_manage_ibss_station(struct iwl_priv *priv,
 242                               struct ieee80211_vif *vif, bool add);
 243#define IWL_STA_DRIVER_ACTIVE BIT(0) /* driver entry is active */
 244#define IWL_STA_UCODE_ACTIVE  BIT(1) /* ucode entry is active */
 245#define IWL_STA_UCODE_INPROGRESS  BIT(2) /* ucode entry is in process of
 246                                            being activated */
 247#define IWL_STA_LOCAL BIT(3) /* station state not directed by mac80211;
 248                                (this is for the IBSS BSSID stations) */
 249#define IWL_STA_BCAST BIT(4) /* this station is the special bcast station */
 250
 251
 252void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
 253void iwl_clear_ucode_stations(struct iwl_priv *priv,
 254                              struct iwl_rxon_context *ctx);
 255void iwl_dealloc_bcast_stations(struct iwl_priv *priv);
 256int iwl_get_free_ucode_key_offset(struct iwl_priv *priv);
 257int iwl_send_add_sta(struct iwl_priv *priv,
 258                     struct iwl_addsta_cmd *sta, u8 flags);
 259int iwl_add_station_common(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 260                           const u8 *addr, bool is_ap,
 261                           struct ieee80211_sta *sta, u8 *sta_id_r);
 262int iwl_remove_station(struct iwl_priv *priv, const u8 sta_id,
 263                       const u8 *addr);
 264void iwl_deactivate_station(struct iwl_priv *priv, const u8 sta_id,
 265                            const u8 *addr);
 266u8 iwl_prep_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 267                    const u8 *addr, bool is_ap, struct ieee80211_sta *sta);
 268
 269int iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 270                    struct iwl_link_quality_cmd *lq, u8 flags, bool init);
 271void iwl_add_sta_callback(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb);
 272int iwl_sta_update_ht(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 273                      struct ieee80211_sta *sta);
 274
 275bool iwl_is_ht40_tx_allowed(struct iwl_priv *priv,
 276                            struct iwl_rxon_context *ctx,
 277                            struct ieee80211_sta *sta);
 278
 279static inline int iwl_sta_id(struct ieee80211_sta *sta)
 280{
 281        if (WARN_ON(!sta))
 282                return IWL_INVALID_STATION;
 283
 284        return ((struct iwl_station_priv *)sta->drv_priv)->sta_id;
 285}
 286
 287int iwlagn_alloc_bcast_station(struct iwl_priv *priv,
 288                               struct iwl_rxon_context *ctx);
 289int iwlagn_add_bssid_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 290                             const u8 *addr, u8 *sta_id_r);
 291int iwl_remove_default_wep_key(struct iwl_priv *priv,
 292                               struct iwl_rxon_context *ctx,
 293                               struct ieee80211_key_conf *key);
 294int iwl_set_default_wep_key(struct iwl_priv *priv,
 295                            struct iwl_rxon_context *ctx,
 296                            struct ieee80211_key_conf *key);
 297int iwl_restore_default_wep_keys(struct iwl_priv *priv,
 298                                 struct iwl_rxon_context *ctx);
 299int iwl_set_dynamic_key(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 300                        struct ieee80211_key_conf *key,
 301                        struct ieee80211_sta *sta);
 302int iwl_remove_dynamic_key(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 303                           struct ieee80211_key_conf *key,
 304                           struct ieee80211_sta *sta);
 305void iwl_update_tkip_key(struct iwl_priv *priv,
 306                         struct ieee80211_vif *vif,
 307                         struct ieee80211_key_conf *keyconf,
 308                         struct ieee80211_sta *sta, u32 iv32, u16 *phase1key);
 309int iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid);
 310int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
 311                         int tid, u16 ssn);
 312int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
 313                        int tid);
 314void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt);
 315int iwl_update_bcast_station(struct iwl_priv *priv,
 316                             struct iwl_rxon_context *ctx);
 317int iwl_update_bcast_stations(struct iwl_priv *priv);
 318
 319/* rate */
 320static inline u32 iwl_ant_idx_to_flags(u8 ant_idx)
 321{
 322        return BIT(ant_idx) << RATE_MCS_ANT_POS;
 323}
 324
 325static inline u8 iwl_hw_get_rate(__le32 rate_n_flags)
 326{
 327        return le32_to_cpu(rate_n_flags) & RATE_MCS_RATE_MSK;
 328}
 329
 330static inline __le32 iwl_hw_set_rate_n_flags(u8 rate, u32 flags)
 331{
 332        return cpu_to_le32(flags|(u32)rate);
 333}
 334
 335int iwl_alive_start(struct iwl_priv *priv);
 336
 337#ifdef CONFIG_IWLWIFI_DEBUG
 338void iwl_print_rx_config_cmd(struct iwl_priv *priv,
 339                             enum iwl_rxon_context_id ctxid);
 340#else
 341static inline void iwl_print_rx_config_cmd(struct iwl_priv *priv,
 342                                           enum iwl_rxon_context_id ctxid)
 343{
 344}
 345#endif
 346
 347/* status checks */
 348
 349static inline int iwl_is_ready(struct iwl_priv *priv)
 350{
 351        /* The adapter is 'ready' if READY EXIT_PENDING is not set */
 352        return test_bit(STATUS_READY, &priv->status) &&
 353               !test_bit(STATUS_EXIT_PENDING, &priv->status);
 354}
 355
 356static inline int iwl_is_alive(struct iwl_priv *priv)
 357{
 358        return test_bit(STATUS_ALIVE, &priv->status);
 359}
 360
 361static inline int iwl_is_rfkill(struct iwl_priv *priv)
 362{
 363        return test_bit(STATUS_RF_KILL_HW, &priv->status);
 364}
 365
 366static inline int iwl_is_ctkill(struct iwl_priv *priv)
 367{
 368        return test_bit(STATUS_CT_KILL, &priv->status);
 369}
 370
 371static inline int iwl_is_ready_rf(struct iwl_priv *priv)
 372{
 373        if (iwl_is_rfkill(priv))
 374                return 0;
 375
 376        return iwl_is_ready(priv);
 377}
 378
 379static inline void iwl_dvm_set_pmi(struct iwl_priv *priv, bool state)
 380{
 381        if (state)
 382                set_bit(STATUS_POWER_PMI, &priv->status);
 383        else
 384                clear_bit(STATUS_POWER_PMI, &priv->status);
 385        iwl_trans_set_pmi(priv->trans, state);
 386}
 387
 388#ifdef CONFIG_IWLWIFI_DEBUGFS
 389void iwl_dbgfs_register(struct iwl_priv *priv, struct dentry *dbgfs_dir);
 390#else
 391static inline void iwl_dbgfs_register(struct iwl_priv *priv,
 392                                      struct dentry *dbgfs_dir) { }
 393#endif /* CONFIG_IWLWIFI_DEBUGFS */
 394
 395#ifdef CONFIG_IWLWIFI_DEBUG
 396#define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...) \
 397do {                                                                    \
 398        if (!iwl_is_rfkill((m)))                                        \
 399                IWL_ERR(m, fmt, ##args);                                \
 400        else                                                            \
 401                __iwl_err((m)->dev, true,                               \
 402                          !iwl_have_debug_level(IWL_DL_RADIO),          \
 403                          fmt, ##args);                                 \
 404} while (0)
 405#else
 406#define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...) \
 407do {                                                                    \
 408        if (!iwl_is_rfkill((m)))                                        \
 409                IWL_ERR(m, fmt, ##args);                                \
 410        else                                                            \
 411                __iwl_err((m)->dev, true, true, fmt, ##args);   \
 412} while (0)
 413#endif                          /* CONFIG_IWLWIFI_DEBUG */
 414
 415#endif /* __iwl_agn_h__ */
 416