@@ -26,6 +26,155 @@ static const struct rtw89_efuse_block_cfg rtw8922a_efuse_blocks[] = {
26
26
[RTW89_EFUSE_BLOCK_ADIE ] = {.offset = 0x70000 , .size = 0x10 },
27
27
};
28
28
29
+ static void rtw8922a_efuse_parsing_tssi (struct rtw89_dev * rtwdev ,
30
+ struct rtw8922a_efuse * map )
31
+ {
32
+ struct rtw8922a_tssi_offset * ofst [] = {& map -> path_a_tssi , & map -> path_b_tssi };
33
+ u8 * bw40_1s_tssi_6g_ofst [] = {map -> bw40_1s_tssi_6g_a , map -> bw40_1s_tssi_6g_b };
34
+ struct rtw89_tssi_info * tssi = & rtwdev -> tssi ;
35
+ u8 i , j ;
36
+
37
+ tssi -> thermal [RF_PATH_A ] = map -> path_a_therm ;
38
+ tssi -> thermal [RF_PATH_B ] = map -> path_b_therm ;
39
+
40
+ for (i = 0 ; i < RF_PATH_NUM_8922A ; i ++ ) {
41
+ memcpy (tssi -> tssi_cck [i ], ofst [i ]-> cck_tssi ,
42
+ sizeof (ofst [i ]-> cck_tssi ));
43
+
44
+ for (j = 0 ; j < TSSI_CCK_CH_GROUP_NUM ; j ++ )
45
+ rtw89_debug (rtwdev , RTW89_DBG_TSSI ,
46
+ "[TSSI][EFUSE] path=%d cck[%d]=0x%x\n" ,
47
+ i , j , tssi -> tssi_cck [i ][j ]);
48
+
49
+ memcpy (tssi -> tssi_mcs [i ], ofst [i ]-> bw40_tssi ,
50
+ sizeof (ofst [i ]-> bw40_tssi ));
51
+ memcpy (tssi -> tssi_mcs [i ] + TSSI_MCS_2G_CH_GROUP_NUM ,
52
+ ofst [i ]-> bw40_1s_tssi_5g , sizeof (ofst [i ]-> bw40_1s_tssi_5g ));
53
+ memcpy (tssi -> tssi_6g_mcs [i ], bw40_1s_tssi_6g_ofst [i ],
54
+ sizeof (tssi -> tssi_6g_mcs [i ]));
55
+
56
+ for (j = 0 ; j < TSSI_MCS_CH_GROUP_NUM ; j ++ )
57
+ rtw89_debug (rtwdev , RTW89_DBG_TSSI ,
58
+ "[TSSI][EFUSE] path=%d mcs[%d]=0x%x\n" ,
59
+ i , j , tssi -> tssi_mcs [i ][j ]);
60
+ }
61
+ }
62
+
63
+ static void rtw8922a_efuse_parsing_gain_offset (struct rtw89_dev * rtwdev ,
64
+ struct rtw8922a_efuse * map )
65
+ {
66
+ struct rtw89_phy_efuse_gain * gain = & rtwdev -> efuse_gain ;
67
+ bool all_0xff = true, all_0x00 = true;
68
+ int i , j ;
69
+ u8 t ;
70
+
71
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_2G_CCK ] = map -> rx_gain_a ._2g_cck ;
72
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_2G_CCK ] = map -> rx_gain_b ._2g_cck ;
73
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_2G_OFDM ] = map -> rx_gain_a ._2g_ofdm ;
74
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_2G_OFDM ] = map -> rx_gain_b ._2g_ofdm ;
75
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_5G_LOW ] = map -> rx_gain_a ._5g_low ;
76
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_5G_LOW ] = map -> rx_gain_b ._5g_low ;
77
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_5G_MID ] = map -> rx_gain_a ._5g_mid ;
78
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_5G_MID ] = map -> rx_gain_b ._5g_mid ;
79
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_5G_HIGH ] = map -> rx_gain_a ._5g_high ;
80
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_5G_HIGH ] = map -> rx_gain_b ._5g_high ;
81
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_6G_L0 ] = map -> rx_gain_6g_a ._6g_l0 ;
82
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_6G_L0 ] = map -> rx_gain_6g_b ._6g_l0 ;
83
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_6G_L1 ] = map -> rx_gain_6g_a ._6g_l1 ;
84
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_6G_L1 ] = map -> rx_gain_6g_b ._6g_l1 ;
85
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_6G_M0 ] = map -> rx_gain_6g_a ._6g_m0 ;
86
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_6G_M0 ] = map -> rx_gain_6g_b ._6g_m0 ;
87
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_6G_M1 ] = map -> rx_gain_6g_a ._6g_m1 ;
88
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_6G_M1 ] = map -> rx_gain_6g_b ._6g_m1 ;
89
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_6G_H0 ] = map -> rx_gain_6g_a ._6g_h0 ;
90
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_6G_H0 ] = map -> rx_gain_6g_b ._6g_h0 ;
91
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_6G_H1 ] = map -> rx_gain_6g_a ._6g_h1 ;
92
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_6G_H1 ] = map -> rx_gain_6g_b ._6g_h1 ;
93
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_6G_UH0 ] = map -> rx_gain_6g_a ._6g_uh0 ;
94
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_6G_UH0 ] = map -> rx_gain_6g_b ._6g_uh0 ;
95
+ gain -> offset [RF_PATH_A ][RTW89_GAIN_OFFSET_6G_UH1 ] = map -> rx_gain_6g_a ._6g_uh1 ;
96
+ gain -> offset [RF_PATH_B ][RTW89_GAIN_OFFSET_6G_UH1 ] = map -> rx_gain_6g_b ._6g_uh1 ;
97
+
98
+ for (i = RF_PATH_A ; i <= RF_PATH_B ; i ++ )
99
+ for (j = 0 ; j < RTW89_GAIN_OFFSET_NR ; j ++ ) {
100
+ t = gain -> offset [i ][j ];
101
+ if (t != 0xff )
102
+ all_0xff = false;
103
+ if (t != 0x0 )
104
+ all_0x00 = false;
105
+
106
+ /* transform: sign-bit + U(7,2) to S(8,2) */
107
+ if (t & 0x80 )
108
+ gain -> offset [i ][j ] = (t ^ 0x7f ) + 1 ;
109
+ }
110
+
111
+ gain -> offset_valid = !all_0xff && !all_0x00 ;
112
+ }
113
+
114
+ static void rtw8922a_read_efuse_mac_addr (struct rtw89_dev * rtwdev , u32 addr )
115
+ {
116
+ struct rtw89_efuse * efuse = & rtwdev -> efuse ;
117
+ u16 val ;
118
+ int i ;
119
+
120
+ for (i = 0 ; i < ETH_ALEN ; i += 2 , addr += 2 ) {
121
+ val = rtw89_read16 (rtwdev , addr );
122
+ efuse -> addr [i ] = val & 0xff ;
123
+ efuse -> addr [i + 1 ] = val >> 8 ;
124
+ }
125
+ }
126
+
127
+ static int rtw8922a_read_efuse_pci_sdio (struct rtw89_dev * rtwdev , u8 * log_map )
128
+ {
129
+ struct rtw89_efuse * efuse = & rtwdev -> efuse ;
130
+
131
+ if (rtwdev -> hci .type == RTW89_HCI_TYPE_PCIE )
132
+ rtw8922a_read_efuse_mac_addr (rtwdev , 0x3104 );
133
+ else
134
+ ether_addr_copy (efuse -> addr , log_map + 0x001A );
135
+
136
+ return 0 ;
137
+ }
138
+
139
+ static int rtw8922a_read_efuse_usb (struct rtw89_dev * rtwdev , u8 * log_map )
140
+ {
141
+ rtw8922a_read_efuse_mac_addr (rtwdev , 0x4078 );
142
+
143
+ return 0 ;
144
+ }
145
+
146
+ static int rtw8922a_read_efuse_rf (struct rtw89_dev * rtwdev , u8 * log_map )
147
+ {
148
+ struct rtw8922a_efuse * map = (struct rtw8922a_efuse * )log_map ;
149
+ struct rtw89_efuse * efuse = & rtwdev -> efuse ;
150
+
151
+ efuse -> rfe_type = map -> rfe_type ;
152
+ efuse -> xtal_cap = map -> xtal_k ;
153
+ efuse -> country_code [0 ] = map -> country_code [0 ];
154
+ efuse -> country_code [1 ] = map -> country_code [1 ];
155
+ rtw8922a_efuse_parsing_tssi (rtwdev , map );
156
+ rtw8922a_efuse_parsing_gain_offset (rtwdev , map );
157
+
158
+ rtw89_info (rtwdev , "chip rfe_type is %d\n" , efuse -> rfe_type );
159
+
160
+ return 0 ;
161
+ }
162
+
163
+ static int rtw8922a_read_efuse (struct rtw89_dev * rtwdev , u8 * log_map ,
164
+ enum rtw89_efuse_block block )
165
+ {
166
+ switch (block ) {
167
+ case RTW89_EFUSE_BLOCK_HCI_DIG_PCIE_SDIO :
168
+ return rtw8922a_read_efuse_pci_sdio (rtwdev , log_map );
169
+ case RTW89_EFUSE_BLOCK_HCI_DIG_USB :
170
+ return rtw8922a_read_efuse_usb (rtwdev , log_map );
171
+ case RTW89_EFUSE_BLOCK_RF :
172
+ return rtw8922a_read_efuse_rf (rtwdev , log_map );
173
+ default :
174
+ return 0 ;
175
+ }
176
+ }
177
+
29
178
#ifdef CONFIG_PM
30
179
static const struct wiphy_wowlan_support rtw_wowlan_stub_8922a = {
31
180
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT ,
@@ -36,6 +185,7 @@ static const struct wiphy_wowlan_support rtw_wowlan_stub_8922a = {
36
185
#endif
37
186
38
187
static const struct rtw89_chip_ops rtw8922a_chip_ops = {
188
+ .read_efuse = rtw8922a_read_efuse ,
39
189
};
40
190
41
191
const struct rtw89_chip_info rtw8922a_chip_info = {
0 commit comments