linux/drivers/net/wireless/mediatek/mt76/mt76x02.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: ISC */
   2/*
   3 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
   4 * Copyright (C) 2018 Stanislaw Gruszka <stf_xl@wp.pl>
   5 */
   6
   7#ifndef __MT76x02_H
   8#define __MT76x02_H
   9
  10#include <linux/kfifo.h>
  11
  12#include "mt76.h"
  13#include "mt76x02_regs.h"
  14#include "mt76x02_mac.h"
  15#include "mt76x02_dfs.h"
  16#include "mt76x02_dma.h"
  17
  18#define MT76x02_TX_RING_SIZE    512
  19#define MT76x02_PSD_RING_SIZE   128
  20#define MT76x02_N_WCIDS 128
  21#define MT_CALIBRATE_INTERVAL   HZ
  22#define MT_MAC_WORK_INTERVAL    (HZ / 10)
  23
  24#define MT_WATCHDOG_TIME        (HZ / 10)
  25#define MT_TX_HANG_TH           10
  26
  27#define MT_MAX_CHAINS           2
  28struct mt76x02_rx_freq_cal {
  29        s8 high_gain[MT_MAX_CHAINS];
  30        s8 rssi_offset[MT_MAX_CHAINS];
  31        s8 lna_gain;
  32        u32 mcu_gain;
  33        s16 temp_offset;
  34        u8 freq_offset;
  35};
  36
  37struct mt76x02_calibration {
  38        struct mt76x02_rx_freq_cal rx;
  39
  40        u8 agc_gain_init[MT_MAX_CHAINS];
  41        u8 agc_gain_cur[MT_MAX_CHAINS];
  42
  43        u16 false_cca;
  44        s8 avg_rssi_all;
  45        s8 agc_gain_adjust;
  46        s8 agc_lowest_gain;
  47        s8 low_gain;
  48
  49        s8 temp_vco;
  50        s8 temp;
  51
  52        bool init_cal_done;
  53        bool tssi_cal_done;
  54        bool tssi_comp_pending;
  55        bool dpd_cal_done;
  56        bool channel_cal_done;
  57        bool gain_init_done;
  58
  59        int tssi_target;
  60        s8 tssi_dc;
  61};
  62
  63struct mt76x02_beacon_ops {
  64        unsigned int nslots;
  65        unsigned int slot_size;
  66        void (*pre_tbtt_enable)(struct mt76x02_dev *dev, bool en);
  67        void (*beacon_enable)(struct mt76x02_dev *dev, bool en);
  68};
  69
  70#define mt76x02_beacon_enable(dev, enable)      \
  71        (dev)->beacon_ops->beacon_enable(dev, enable)
  72#define mt76x02_pre_tbtt_enable(dev, enable)    \
  73        (dev)->beacon_ops->pre_tbtt_enable(dev, enable)
  74
  75struct mt76x02_dev {
  76        union { /* must be first */
  77                struct mt76_dev mt76;
  78                struct mt76_phy mphy;
  79        };
  80
  81        struct mac_address macaddr_list[8];
  82
  83        struct mutex phy_mutex;
  84
  85        u8 txdone_seq;
  86        DECLARE_KFIFO_PTR(txstatus_fifo, struct mt76x02_tx_status);
  87        spinlock_t txstatus_fifo_lock;
  88        u32 tx_airtime;
  89        u32 ampdu_ref;
  90
  91        struct sk_buff *rx_head;
  92
  93        struct delayed_work cal_work;
  94        struct delayed_work wdt_work;
  95
  96        struct hrtimer pre_tbtt_timer;
  97        struct work_struct pre_tbtt_work;
  98
  99        const struct mt76x02_beacon_ops *beacon_ops;
 100
 101        u8 beacon_data_count;
 102
 103        u8 tbtt_count;
 104
 105        u32 tx_hang_reset;
 106        u8 tx_hang_check;
 107        u8 mcu_timeout;
 108
 109        struct mt76x02_calibration cal;
 110
 111        int txpower_conf;
 112        s8 target_power;
 113        s8 target_power_delta[2];
 114        bool enable_tpc;
 115
 116        bool no_2ghz;
 117
 118        s16 coverage_class;
 119        u8 slottime;
 120
 121        struct mt76x02_dfs_pattern_detector dfs_pd;
 122
 123        /* edcca monitor */
 124        unsigned long ed_trigger_timeout;
 125        bool ed_tx_blocked;
 126        bool ed_monitor;
 127        u8 ed_monitor_enabled;
 128        u8 ed_monitor_learning;
 129        u8 ed_trigger;
 130        u8 ed_silent;
 131        ktime_t ed_time;
 132};
 133
 134extern struct ieee80211_rate mt76x02_rates[12];
 135
 136void mt76x02_init_device(struct mt76x02_dev *dev);
 137void mt76x02_configure_filter(struct ieee80211_hw *hw,
 138                              unsigned int changed_flags,
 139                              unsigned int *total_flags, u64 multicast);
 140int mt76x02_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 141                    struct ieee80211_sta *sta);
 142void mt76x02_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 143                        struct ieee80211_sta *sta);
 144
 145void mt76x02_config_mac_addr_list(struct mt76x02_dev *dev);
 146
 147int mt76x02_add_interface(struct ieee80211_hw *hw,
 148                          struct ieee80211_vif *vif);
 149void mt76x02_remove_interface(struct ieee80211_hw *hw,
 150                              struct ieee80211_vif *vif);
 151
 152int mt76x02_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 153                         struct ieee80211_ampdu_params *params);
 154int mt76x02_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 155                    struct ieee80211_vif *vif, struct ieee80211_sta *sta,
 156                    struct ieee80211_key_conf *key);
 157int mt76x02_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 158                    u16 queue, const struct ieee80211_tx_queue_params *params);
 159void mt76x02_sta_rate_tbl_update(struct ieee80211_hw *hw,
 160                                 struct ieee80211_vif *vif,
 161                                 struct ieee80211_sta *sta);
 162s8 mt76x02_tx_get_max_txpwr_adj(struct mt76x02_dev *dev,
 163                                const struct ieee80211_tx_rate *rate);
 164s8 mt76x02_tx_get_txpwr_adj(struct mt76x02_dev *dev, s8 txpwr,
 165                            s8 max_txpwr_adj);
 166void mt76x02_wdt_work(struct work_struct *work);
 167void mt76x02_tx_set_txpwr_auto(struct mt76x02_dev *dev, s8 txpwr);
 168void mt76x02_set_tx_ackto(struct mt76x02_dev *dev);
 169void mt76x02_set_coverage_class(struct ieee80211_hw *hw,
 170                                s16 coverage_class);
 171int mt76x02_set_rts_threshold(struct ieee80211_hw *hw, u32 val);
 172void mt76x02_remove_hdr_pad(struct sk_buff *skb, int len);
 173bool mt76x02_tx_status_data(struct mt76_dev *mdev, u8 *update);
 174void mt76x02_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
 175                          struct sk_buff *skb);
 176void mt76x02_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q);
 177irqreturn_t mt76x02_irq_handler(int irq, void *dev_instance);
 178void mt76x02_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
 179                struct sk_buff *skb);
 180int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi,
 181                           enum mt76_txq_id qid, struct mt76_wcid *wcid,
 182                           struct ieee80211_sta *sta,
 183                           struct mt76_tx_info *tx_info);
 184void mt76x02_sw_scan_complete(struct ieee80211_hw *hw,
 185                              struct ieee80211_vif *vif);
 186void mt76x02_sta_ps(struct mt76_dev *dev, struct ieee80211_sta *sta, bool ps);
 187void mt76x02_bss_info_changed(struct ieee80211_hw *hw,
 188                              struct ieee80211_vif *vif,
 189                              struct ieee80211_bss_conf *info, u32 changed);
 190void mt76x02_reconfig_complete(struct ieee80211_hw *hw,
 191                               enum ieee80211_reconfig_type reconfig_type);
 192
 193struct beacon_bc_data {
 194        struct mt76x02_dev *dev;
 195        struct sk_buff_head q;
 196        struct sk_buff *tail[8];
 197};
 198
 199void mt76x02_init_beacon_config(struct mt76x02_dev *dev);
 200void mt76x02e_init_beacon_config(struct mt76x02_dev *dev);
 201void mt76x02_resync_beacon_timer(struct mt76x02_dev *dev);
 202void mt76x02_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif);
 203void mt76x02_enqueue_buffered_bc(struct mt76x02_dev *dev,
 204                                 struct beacon_bc_data *data,
 205                                 int max_nframes);
 206
 207void mt76x02_mac_start(struct mt76x02_dev *dev);
 208
 209void mt76x02_init_debugfs(struct mt76x02_dev *dev);
 210
 211static inline bool is_mt76x0(struct mt76x02_dev *dev)
 212{
 213        return mt76_chip(&dev->mt76) == 0x7610 ||
 214               mt76_chip(&dev->mt76) == 0x7630 ||
 215               mt76_chip(&dev->mt76) == 0x7650;
 216}
 217
 218static inline bool is_mt76x2(struct mt76x02_dev *dev)
 219{
 220        return mt76_chip(&dev->mt76) == 0x7612 ||
 221               mt76_chip(&dev->mt76) == 0x7632 ||
 222               mt76_chip(&dev->mt76) == 0x7662 ||
 223               mt76_chip(&dev->mt76) == 0x7602;
 224}
 225
 226static inline void mt76x02_irq_enable(struct mt76x02_dev *dev, u32 mask)
 227{
 228        mt76_set_irq_mask(&dev->mt76, MT_INT_MASK_CSR, 0, mask);
 229}
 230
 231static inline void mt76x02_irq_disable(struct mt76x02_dev *dev, u32 mask)
 232{
 233        mt76_set_irq_mask(&dev->mt76, MT_INT_MASK_CSR, mask, 0);
 234}
 235
 236static inline bool
 237mt76x02_wait_for_txrx_idle(struct mt76_dev *dev)
 238{
 239        return __mt76_poll_msec(dev, MT_MAC_STATUS,
 240                                MT_MAC_STATUS_TX | MT_MAC_STATUS_RX,
 241                                0, 100);
 242}
 243
 244static inline struct mt76x02_sta *
 245mt76x02_rx_get_sta(struct mt76_dev *dev, u8 idx)
 246{
 247        struct mt76_wcid *wcid;
 248
 249        if (idx >= MT76x02_N_WCIDS)
 250                return NULL;
 251
 252        wcid = rcu_dereference(dev->wcid[idx]);
 253        if (!wcid)
 254                return NULL;
 255
 256        return container_of(wcid, struct mt76x02_sta, wcid);
 257}
 258
 259static inline struct mt76_wcid *
 260mt76x02_rx_get_sta_wcid(struct mt76x02_sta *sta, bool unicast)
 261{
 262        if (!sta)
 263                return NULL;
 264
 265        if (unicast)
 266                return &sta->wcid;
 267        else
 268                return &sta->vif->group_wcid;
 269}
 270
 271#endif /* __MT76x02_H */
 272