16c92544dSBjoern A. Zeeb /* SPDX-License-Identifier: ISC */
26c92544dSBjoern A. Zeeb /*
36c92544dSBjoern A. Zeeb * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
46c92544dSBjoern A. Zeeb */
56c92544dSBjoern A. Zeeb
66c92544dSBjoern A. Zeeb #ifndef __MT76x2_EEPROM_H
76c92544dSBjoern A. Zeeb #define __MT76x2_EEPROM_H
86c92544dSBjoern A. Zeeb
96c92544dSBjoern A. Zeeb #include "../mt76x02_eeprom.h"
106c92544dSBjoern A. Zeeb
116c92544dSBjoern A. Zeeb enum mt76x2_cal_channel_group {
126c92544dSBjoern A. Zeeb MT_CH_5G_JAPAN,
136c92544dSBjoern A. Zeeb MT_CH_5G_UNII_1,
146c92544dSBjoern A. Zeeb MT_CH_5G_UNII_2,
156c92544dSBjoern A. Zeeb MT_CH_5G_UNII_2E_1,
166c92544dSBjoern A. Zeeb MT_CH_5G_UNII_2E_2,
176c92544dSBjoern A. Zeeb MT_CH_5G_UNII_3,
186c92544dSBjoern A. Zeeb __MT_CH_MAX
196c92544dSBjoern A. Zeeb };
206c92544dSBjoern A. Zeeb
216c92544dSBjoern A. Zeeb struct mt76x2_tx_power_info {
226c92544dSBjoern A. Zeeb u8 target_power;
236c92544dSBjoern A. Zeeb
246c92544dSBjoern A. Zeeb s8 delta_bw40;
256c92544dSBjoern A. Zeeb s8 delta_bw80;
266c92544dSBjoern A. Zeeb
276c92544dSBjoern A. Zeeb struct {
286c92544dSBjoern A. Zeeb s8 tssi_slope;
296c92544dSBjoern A. Zeeb s8 tssi_offset;
306c92544dSBjoern A. Zeeb s8 target_power;
316c92544dSBjoern A. Zeeb s8 delta;
326c92544dSBjoern A. Zeeb } chain[MT_MAX_CHAINS];
336c92544dSBjoern A. Zeeb };
346c92544dSBjoern A. Zeeb
356c92544dSBjoern A. Zeeb struct mt76x2_temp_comp {
366c92544dSBjoern A. Zeeb u8 temp_25_ref;
376c92544dSBjoern A. Zeeb int lower_bound; /* J */
386c92544dSBjoern A. Zeeb int upper_bound; /* J */
396c92544dSBjoern A. Zeeb unsigned int high_slope; /* J / dB */
406c92544dSBjoern A. Zeeb unsigned int low_slope; /* J / dB */
416c92544dSBjoern A. Zeeb };
426c92544dSBjoern A. Zeeb
43cbb3ec25SBjoern A. Zeeb void mt76x2_get_rate_power(struct mt76x02_dev *dev, struct mt76x02_rate_power *t,
446c92544dSBjoern A. Zeeb struct ieee80211_channel *chan);
456c92544dSBjoern A. Zeeb void mt76x2_get_power_info(struct mt76x02_dev *dev,
466c92544dSBjoern A. Zeeb struct mt76x2_tx_power_info *t,
476c92544dSBjoern A. Zeeb struct ieee80211_channel *chan);
486c92544dSBjoern A. Zeeb int mt76x2_get_temp_comp(struct mt76x02_dev *dev, struct mt76x2_temp_comp *t);
496c92544dSBjoern A. Zeeb void mt76x2_read_rx_gain(struct mt76x02_dev *dev);
506c92544dSBjoern A. Zeeb
516c92544dSBjoern A. Zeeb static inline bool
mt76x2_has_ext_lna(struct mt76x02_dev * dev)526c92544dSBjoern A. Zeeb mt76x2_has_ext_lna(struct mt76x02_dev *dev)
536c92544dSBjoern A. Zeeb {
546c92544dSBjoern A. Zeeb u32 val = mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_1);
556c92544dSBjoern A. Zeeb
566c92544dSBjoern A. Zeeb if (dev->mphy.chandef.chan->band == NL80211_BAND_2GHZ)
576c92544dSBjoern A. Zeeb return val & MT_EE_NIC_CONF_1_LNA_EXT_2G;
586c92544dSBjoern A. Zeeb else
596c92544dSBjoern A. Zeeb return val & MT_EE_NIC_CONF_1_LNA_EXT_5G;
606c92544dSBjoern A. Zeeb }
616c92544dSBjoern A. Zeeb
626c92544dSBjoern A. Zeeb static inline bool
mt76x2_temp_tx_alc_enabled(struct mt76x02_dev * dev)636c92544dSBjoern A. Zeeb mt76x2_temp_tx_alc_enabled(struct mt76x02_dev *dev)
646c92544dSBjoern A. Zeeb {
656c92544dSBjoern A. Zeeb u16 val;
666c92544dSBjoern A. Zeeb
676c92544dSBjoern A. Zeeb val = mt76x02_eeprom_get(dev, MT_EE_TX_POWER_EXT_PA_5G);
686c92544dSBjoern A. Zeeb if (!(val & BIT(15)))
696c92544dSBjoern A. Zeeb return false;
706c92544dSBjoern A. Zeeb
716c92544dSBjoern A. Zeeb return mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_1) &
726c92544dSBjoern A. Zeeb MT_EE_NIC_CONF_1_TEMP_TX_ALC;
736c92544dSBjoern A. Zeeb }
746c92544dSBjoern A. Zeeb
756c92544dSBjoern A. Zeeb static inline bool
mt76x2_tssi_enabled(struct mt76x02_dev * dev)766c92544dSBjoern A. Zeeb mt76x2_tssi_enabled(struct mt76x02_dev *dev)
776c92544dSBjoern A. Zeeb {
786c92544dSBjoern A. Zeeb return !mt76x2_temp_tx_alc_enabled(dev) &&
796c92544dSBjoern A. Zeeb (mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_1) &
806c92544dSBjoern A. Zeeb MT_EE_NIC_CONF_1_TX_ALC_EN);
816c92544dSBjoern A. Zeeb }
826c92544dSBjoern A. Zeeb
836c92544dSBjoern A. Zeeb #endif
84