1/* SPDX-License-Identifier: ISC */
2/*
3 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
4 */
5
6#ifndef __MT76x2_EEPROM_H
7#define __MT76x2_EEPROM_H
8
9#include "../mt76x02_eeprom.h"
10
11enum mt76x2_cal_channel_group {
12	MT_CH_5G_JAPAN,
13	MT_CH_5G_UNII_1,
14	MT_CH_5G_UNII_2,
15	MT_CH_5G_UNII_2E_1,
16	MT_CH_5G_UNII_2E_2,
17	MT_CH_5G_UNII_3,
18	__MT_CH_MAX
19};
20
21struct mt76x2_tx_power_info {
22	u8 target_power;
23
24	s8 delta_bw40;
25	s8 delta_bw80;
26
27	struct {
28		s8 tssi_slope;
29		s8 tssi_offset;
30		s8 target_power;
31		s8 delta;
32	} chain[MT_MAX_CHAINS];
33};
34
35struct mt76x2_temp_comp {
36	u8 temp_25_ref;
37	int lower_bound; /* J */
38	int upper_bound; /* J */
39	unsigned int high_slope; /* J / dB */
40	unsigned int low_slope; /* J / dB */
41};
42
43void mt76x2_get_rate_power(struct mt76x02_dev *dev, struct mt76x02_rate_power *t,
44			   struct ieee80211_channel *chan);
45void mt76x2_get_power_info(struct mt76x02_dev *dev,
46			   struct mt76x2_tx_power_info *t,
47			   struct ieee80211_channel *chan);
48int mt76x2_get_temp_comp(struct mt76x02_dev *dev, struct mt76x2_temp_comp *t);
49void mt76x2_read_rx_gain(struct mt76x02_dev *dev);
50
51static inline bool
52mt76x2_has_ext_lna(struct mt76x02_dev *dev)
53{
54	u32 val = mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_1);
55
56	if (dev->mphy.chandef.chan->band == NL80211_BAND_2GHZ)
57		return val & MT_EE_NIC_CONF_1_LNA_EXT_2G;
58	else
59		return val & MT_EE_NIC_CONF_1_LNA_EXT_5G;
60}
61
62static inline bool
63mt76x2_temp_tx_alc_enabled(struct mt76x02_dev *dev)
64{
65	u16 val;
66
67	val = mt76x02_eeprom_get(dev, MT_EE_TX_POWER_EXT_PA_5G);
68	if (!(val & BIT(15)))
69		return false;
70
71	return mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_1) &
72	       MT_EE_NIC_CONF_1_TEMP_TX_ALC;
73}
74
75static inline bool
76mt76x2_tssi_enabled(struct mt76x02_dev *dev)
77{
78	return !mt76x2_temp_tx_alc_enabled(dev) &&
79	       (mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_1) &
80		MT_EE_NIC_CONF_1_TX_ALC_EN);
81}
82
83#endif
84