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 
11 enum 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 
21 struct 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 
35 struct 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 
43 void mt76x2_get_rate_power(struct mt76x02_dev *dev, struct mt76x02_rate_power *t,
44 			   struct ieee80211_channel *chan);
45 void mt76x2_get_power_info(struct mt76x02_dev *dev,
46 			   struct mt76x2_tx_power_info *t,
47 			   struct ieee80211_channel *chan);
48 int mt76x2_get_temp_comp(struct mt76x02_dev *dev, struct mt76x2_temp_comp *t);
49 void mt76x2_read_rx_gain(struct mt76x02_dev *dev);
50 
51 static inline bool
mt76x2_has_ext_lna(struct mt76x02_dev * dev)52 mt76x2_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 
62 static inline bool
mt76x2_temp_tx_alc_enabled(struct mt76x02_dev * dev)63 mt76x2_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 
75 static inline bool
mt76x2_tssi_enabled(struct mt76x02_dev * dev)76 mt76x2_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