1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 /* Copyright Fiona Klute <fiona.klute@gmx.de> */ 3 4 #include <linux/of_net.h> 5 #include "main.h" 6 #include "coex.h" 7 #include "debug.h" 8 #include "mac.h" 9 #include "phy.h" 10 #include "reg.h" 11 #include "rx.h" 12 #include "rtw8703b.h" 13 #include "rtw8703b_tables.h" 14 #include "rtw8723x.h" 15 16 #define BIT_MASK_TXQ_INIT (BIT(7)) 17 #define WLAN_RL_VAL 0x3030 18 /* disable BAR */ 19 #define WLAN_BAR_VAL 0x0201ffff 20 #define WLAN_PIFS_VAL 0 21 #define WLAN_RX_PKT_LIMIT 0x18 22 #define WLAN_SLOT_TIME 0x09 23 #define WLAN_SPEC_SIFS 0x100a 24 #define WLAN_MAX_AGG_NR 0x1f 25 #define WLAN_AMPDU_MAX_TIME 0x70 26 27 /* unit is 32us */ 28 #define TBTT_PROHIBIT_SETUP_TIME 0x04 29 #define TBTT_PROHIBIT_HOLD_TIME 0x80 30 #define TBTT_PROHIBIT_HOLD_TIME_STOP_BCN 0x64 31 32 #define TRANS_SEQ_END \ 33 0xFFFF, \ 34 RTW_PWR_CUT_ALL_MSK, \ 35 RTW_PWR_INTF_ALL_MSK, \ 36 0, \ 37 RTW_PWR_CMD_END, 0, 0 38 39 /* rssi in percentage % (dbm = % - 100) */ 40 /* These are used to select simple signal quality levels, might need 41 * tweaking. Same for rf_para tables below. 42 */ 43 static const u8 wl_rssi_step_8703b[] = {60, 50, 44, 30}; 44 static const u8 bt_rssi_step_8703b[] = {30, 30, 30, 30}; 45 static const struct coex_5g_afh_map afh_5g_8703b[] = { {0, 0, 0} }; 46 47 /* Actually decreasing wifi TX power/RX gain isn't implemented in 48 * rtw8703b, but hopefully adjusting the BT side helps. 49 */ 50 static const struct coex_rf_para rf_para_tx_8703b[] = { 51 {0, 0, false, 7}, /* for normal */ 52 {0, 10, false, 7}, /* for WL-CPT */ 53 {1, 0, true, 4}, 54 {1, 2, true, 4}, 55 {1, 10, true, 4}, 56 {1, 15, true, 4} 57 }; 58 59 static const struct coex_rf_para rf_para_rx_8703b[] = { 60 {0, 0, false, 7}, /* for normal */ 61 {0, 10, false, 7}, /* for WL-CPT */ 62 {1, 0, true, 5}, 63 {1, 2, true, 5}, 64 {1, 10, true, 5}, 65 {1, 15, true, 5} 66 }; 67 68 static const u32 rtw8703b_ofdm_swing_table[] = { 69 0x0b40002d, /* 0, -15.0dB */ 70 0x0c000030, /* 1, -14.5dB */ 71 0x0cc00033, /* 2, -14.0dB */ 72 0x0d800036, /* 3, -13.5dB */ 73 0x0e400039, /* 4, -13.0dB */ 74 0x0f00003c, /* 5, -12.5dB */ 75 0x10000040, /* 6, -12.0dB */ 76 0x11000044, /* 7, -11.5dB */ 77 0x12000048, /* 8, -11.0dB */ 78 0x1300004c, /* 9, -10.5dB */ 79 0x14400051, /* 10, -10.0dB */ 80 0x15800056, /* 11, -9.5dB */ 81 0x16c0005b, /* 12, -9.0dB */ 82 0x18000060, /* 13, -8.5dB */ 83 0x19800066, /* 14, -8.0dB */ 84 0x1b00006c, /* 15, -7.5dB */ 85 0x1c800072, /* 16, -7.0dB */ 86 0x1e400079, /* 17, -6.5dB */ 87 0x20000080, /* 18, -6.0dB */ 88 0x22000088, /* 19, -5.5dB */ 89 0x24000090, /* 20, -5.0dB */ 90 0x26000098, /* 21, -4.5dB */ 91 0x288000a2, /* 22, -4.0dB */ 92 0x2ac000ab, /* 23, -3.5dB */ 93 0x2d4000b5, /* 24, -3.0dB */ 94 0x300000c0, /* 25, -2.5dB */ 95 0x32c000cb, /* 26, -2.0dB */ 96 0x35c000d7, /* 27, -1.5dB */ 97 0x390000e4, /* 28, -1.0dB */ 98 0x3c8000f2, /* 29, -0.5dB */ 99 0x40000100, /* 30, +0dB */ 100 0x43c0010f, /* 31, +0.5dB */ 101 0x47c0011f, /* 32, +1.0dB */ 102 0x4c000130, /* 33, +1.5dB */ 103 0x50800142, /* 34, +2.0dB */ 104 0x55400155, /* 35, +2.5dB */ 105 0x5a400169, /* 36, +3.0dB */ 106 0x5fc0017f, /* 37, +3.5dB */ 107 0x65400195, /* 38, +4.0dB */ 108 0x6b8001ae, /* 39, +4.5dB */ 109 0x71c001c7, /* 40, +5.0dB */ 110 0x788001e2, /* 41, +5.5dB */ 111 0x7f8001fe /* 42, +6.0dB */ 112 }; 113 114 static const u32 rtw8703b_cck_pwr_regs[] = { 115 0x0a22, 0x0a23, 0x0a24, 0x0a25, 0x0a26, 0x0a27, 0x0a28, 0x0a29, 116 0x0a9a, 0x0a9b, 0x0a9c, 0x0a9d, 0x0aa0, 0x0aa1, 0x0aa2, 0x0aa3, 117 }; 118 119 static const u8 rtw8703b_cck_swing_table[][16] = { 120 {0x44, 0x42, 0x3C, 0x33, 0x28, 0x1C, 0x13, 0x0B, 0x05, 0x02, 121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-16dB*/ 122 {0x48, 0x46, 0x3F, 0x36, 0x2A, 0x1E, 0x14, 0x0B, 0x05, 0x02, 123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-15.5dB*/ 124 {0x4D, 0x4A, 0x43, 0x39, 0x2C, 0x20, 0x15, 0x0C, 0x06, 0x02, 125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-15dB*/ 126 {0x51, 0x4F, 0x47, 0x3C, 0x2F, 0x22, 0x16, 0x0D, 0x06, 0x02, 127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-14.5dB*/ 128 {0x56, 0x53, 0x4B, 0x40, 0x32, 0x24, 0x17, 0x0E, 0x06, 0x02, 129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-14dB*/ 130 {0x5B, 0x58, 0x50, 0x43, 0x35, 0x26, 0x19, 0x0E, 0x07, 0x02, 131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-13.5dB*/ 132 {0x60, 0x5D, 0x54, 0x47, 0x38, 0x28, 0x1A, 0x0F, 0x07, 0x02, 133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-13dB*/ 134 {0x66, 0x63, 0x59, 0x4C, 0x3B, 0x2B, 0x1C, 0x10, 0x08, 0x02, 135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-12.5dB*/ 136 {0x6C, 0x69, 0x5F, 0x50, 0x3F, 0x2D, 0x1E, 0x11, 0x08, 0x03, 137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-12dB*/ 138 {0x73, 0x6F, 0x64, 0x55, 0x42, 0x30, 0x1F, 0x12, 0x08, 0x03, 139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-11.5dB*/ 140 {0x79, 0x76, 0x6A, 0x5A, 0x46, 0x33, 0x21, 0x13, 0x09, 0x03, 141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-11dB*/ 142 {0x81, 0x7C, 0x71, 0x5F, 0x4A, 0x36, 0x23, 0x14, 0x0A, 0x03, 143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-10.5dB*/ 144 {0x88, 0x84, 0x77, 0x65, 0x4F, 0x39, 0x25, 0x15, 0x0A, 0x03, 145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-10dB*/ 146 {0x90, 0x8C, 0x7E, 0x6B, 0x54, 0x3C, 0x27, 0x17, 0x0B, 0x03, 147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-9.5dB*/ 148 {0x99, 0x94, 0x86, 0x71, 0x58, 0x40, 0x2A, 0x18, 0x0B, 0x04, 149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-9dB*/ 150 {0xA2, 0x9D, 0x8E, 0x78, 0x5E, 0x43, 0x2C, 0x19, 0x0C, 0x04, 151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-8.5dB*/ 152 {0xAC, 0xA6, 0x96, 0x7F, 0x63, 0x47, 0x2F, 0x1B, 0x0D, 0x04, 153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-8dB*/ 154 {0xB6, 0xB0, 0x9F, 0x87, 0x69, 0x4C, 0x32, 0x1D, 0x0D, 0x04, 155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-7.5dB*/ 156 {0xC1, 0xBA, 0xA8, 0x8F, 0x6F, 0x50, 0x35, 0x1E, 0x0E, 0x04, 157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-7dB*/ 158 {0xCC, 0xC5, 0xB2, 0x97, 0x76, 0x55, 0x38, 0x20, 0x0F, 0x05, 159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-6.5dB*/ 160 {0xD8, 0xD1, 0xBD, 0xA0, 0x7D, 0x5A, 0x3B, 0x22, 0x10, 0x05, 161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /*-6dB*/ 162 }; 163 164 #define RTW_OFDM_SWING_TABLE_SIZE ARRAY_SIZE(rtw8703b_ofdm_swing_table) 165 #define RTW_CCK_SWING_TABLE_SIZE ARRAY_SIZE(rtw8703b_cck_swing_table) 166 167 static const struct rtw_pwr_seq_cmd trans_pre_enable_8703b[] = { 168 /* set up external crystal (XTAL) */ 169 {REG_PAD_CTRL1 + 2, 170 RTW_PWR_CUT_ALL_MSK, 171 RTW_PWR_INTF_ALL_MSK, 172 RTW_PWR_ADDR_MAC, 173 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)}, 174 /* set CLK_REQ to high active */ 175 {0x0069, 176 RTW_PWR_CUT_ALL_MSK, 177 RTW_PWR_INTF_ALL_MSK, 178 RTW_PWR_ADDR_MAC, 179 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)}, 180 /* unlock ISO/CLK/power control register */ 181 {REG_RSV_CTRL, 182 RTW_PWR_CUT_ALL_MSK, 183 RTW_PWR_INTF_ALL_MSK, 184 RTW_PWR_ADDR_MAC, 185 RTW_PWR_CMD_WRITE, 0xff, 0}, 186 {TRANS_SEQ_END}, 187 }; 188 189 static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8703b[] = { 190 {0x0005, 191 RTW_PWR_CUT_ALL_MSK, 192 RTW_PWR_INTF_ALL_MSK, 193 RTW_PWR_ADDR_MAC, 194 RTW_PWR_CMD_WRITE, BIT(7), 0}, 195 {TRANS_SEQ_END}, 196 }; 197 198 static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8703b[] = { 199 {0x0023, 200 RTW_PWR_CUT_ALL_MSK, 201 RTW_PWR_INTF_SDIO_MSK, 202 RTW_PWR_ADDR_MAC, 203 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)}, 204 {0x0007, 205 RTW_PWR_CUT_ALL_MSK, 206 RTW_PWR_INTF_SDIO_MSK | RTW_PWR_INTF_USB_MSK, 207 RTW_PWR_ADDR_MAC, 208 RTW_PWR_CMD_WRITE, 0xFF, 0x20}, 209 {0x0006, 210 RTW_PWR_CUT_ALL_MSK, 211 RTW_PWR_INTF_ALL_MSK, 212 RTW_PWR_ADDR_MAC, 213 RTW_PWR_CMD_WRITE, BIT(0), 0}, 214 {0x0005, 215 RTW_PWR_CUT_ALL_MSK, 216 RTW_PWR_INTF_ALL_MSK, 217 RTW_PWR_ADDR_MAC, 218 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)}, 219 {TRANS_SEQ_END}, 220 }; 221 222 static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8703b[] = { 223 {0x0020, 224 RTW_PWR_CUT_ALL_MSK, 225 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 226 RTW_PWR_ADDR_MAC, 227 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 228 {0x0067, 229 RTW_PWR_CUT_ALL_MSK, 230 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 231 RTW_PWR_ADDR_MAC, 232 RTW_PWR_CMD_WRITE, BIT(4), 0}, 233 {0x0001, 234 RTW_PWR_CUT_ALL_MSK, 235 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 236 RTW_PWR_ADDR_MAC, 237 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS}, 238 {0x0000, 239 RTW_PWR_CUT_ALL_MSK, 240 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 241 RTW_PWR_ADDR_MAC, 242 RTW_PWR_CMD_WRITE, BIT(5), 0}, 243 {0x0005, 244 RTW_PWR_CUT_ALL_MSK, 245 RTW_PWR_INTF_ALL_MSK, 246 RTW_PWR_ADDR_MAC, 247 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0}, 248 {0x0075, 249 RTW_PWR_CUT_ALL_MSK, 250 RTW_PWR_INTF_PCI_MSK, 251 RTW_PWR_ADDR_MAC, 252 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 253 {0x0004, 254 RTW_PWR_CUT_ALL_MSK, 255 RTW_PWR_INTF_PCI_MSK, 256 RTW_PWR_ADDR_MAC, 257 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)}, 258 {0x0004, 259 RTW_PWR_CUT_ALL_MSK, 260 RTW_PWR_INTF_PCI_MSK, 261 RTW_PWR_ADDR_MAC, 262 RTW_PWR_CMD_WRITE, BIT(3), 0}, 263 /* wait for power ready */ 264 {0x0006, 265 RTW_PWR_CUT_ALL_MSK, 266 RTW_PWR_INTF_ALL_MSK, 267 RTW_PWR_ADDR_MAC, 268 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)}, 269 {0x0075, 270 RTW_PWR_CUT_ALL_MSK, 271 RTW_PWR_INTF_PCI_MSK, 272 RTW_PWR_ADDR_MAC, 273 RTW_PWR_CMD_WRITE, BIT(0), 0}, 274 {0x0006, 275 RTW_PWR_CUT_ALL_MSK, 276 RTW_PWR_INTF_ALL_MSK, 277 RTW_PWR_ADDR_MAC, 278 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 279 {0x0005, 280 RTW_PWR_CUT_ALL_MSK, 281 RTW_PWR_INTF_ALL_MSK, 282 RTW_PWR_ADDR_MAC, 283 RTW_PWR_CMD_WRITE, BIT(7), 0}, 284 {0x0005, 285 RTW_PWR_CUT_ALL_MSK, 286 RTW_PWR_INTF_ALL_MSK, 287 RTW_PWR_ADDR_MAC, 288 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0}, 289 {0x0005, 290 RTW_PWR_CUT_ALL_MSK, 291 RTW_PWR_INTF_ALL_MSK, 292 RTW_PWR_ADDR_MAC, 293 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 294 {0x0005, 295 RTW_PWR_CUT_ALL_MSK, 296 RTW_PWR_INTF_ALL_MSK, 297 RTW_PWR_ADDR_MAC, 298 RTW_PWR_CMD_POLLING, BIT(0), 0}, 299 {0x0010, 300 RTW_PWR_CUT_ALL_MSK, 301 RTW_PWR_INTF_ALL_MSK, 302 RTW_PWR_ADDR_MAC, 303 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)}, 304 {0x0049, 305 RTW_PWR_CUT_ALL_MSK, 306 RTW_PWR_INTF_ALL_MSK, 307 RTW_PWR_ADDR_MAC, 308 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)}, 309 {0x0063, 310 RTW_PWR_CUT_ALL_MSK, 311 RTW_PWR_INTF_ALL_MSK, 312 RTW_PWR_ADDR_MAC, 313 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)}, 314 {0x0062, 315 RTW_PWR_CUT_ALL_MSK, 316 RTW_PWR_INTF_ALL_MSK, 317 RTW_PWR_ADDR_MAC, 318 RTW_PWR_CMD_WRITE, BIT(1), 0}, 319 {0x0058, 320 RTW_PWR_CUT_ALL_MSK, 321 RTW_PWR_INTF_ALL_MSK, 322 RTW_PWR_ADDR_MAC, 323 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 324 {0x005A, 325 RTW_PWR_CUT_ALL_MSK, 326 RTW_PWR_INTF_ALL_MSK, 327 RTW_PWR_ADDR_MAC, 328 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)}, 329 {0x0068, 330 RTW_PWR_CUT_TEST_MSK, 331 RTW_PWR_INTF_ALL_MSK, 332 RTW_PWR_ADDR_MAC, 333 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)}, 334 {0x0069, 335 RTW_PWR_CUT_ALL_MSK, 336 RTW_PWR_INTF_ALL_MSK, 337 RTW_PWR_ADDR_MAC, 338 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)}, 339 {TRANS_SEQ_END}, 340 }; 341 342 static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8703b[] = { 343 {0x001f, 344 RTW_PWR_CUT_ALL_MSK, 345 RTW_PWR_INTF_ALL_MSK, 346 RTW_PWR_ADDR_MAC, 347 RTW_PWR_CMD_WRITE, 0xff, 0}, 348 {0x0049, 349 RTW_PWR_CUT_ALL_MSK, 350 RTW_PWR_INTF_ALL_MSK, 351 RTW_PWR_ADDR_MAC, 352 RTW_PWR_CMD_WRITE, BIT(1), 0}, 353 {0x0006, 354 RTW_PWR_CUT_ALL_MSK, 355 RTW_PWR_INTF_ALL_MSK, 356 RTW_PWR_ADDR_MAC, 357 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 358 {0x0005, 359 RTW_PWR_CUT_ALL_MSK, 360 RTW_PWR_INTF_ALL_MSK, 361 RTW_PWR_ADDR_MAC, 362 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)}, 363 {0x0005, 364 RTW_PWR_CUT_ALL_MSK, 365 RTW_PWR_INTF_ALL_MSK, 366 RTW_PWR_ADDR_MAC, 367 RTW_PWR_CMD_POLLING, BIT(1), 0}, 368 {0x0010, 369 RTW_PWR_CUT_ALL_MSK, 370 RTW_PWR_INTF_ALL_MSK, 371 RTW_PWR_ADDR_MAC, 372 RTW_PWR_CMD_WRITE, BIT(6), 0}, 373 {0x0000, 374 RTW_PWR_CUT_ALL_MSK, 375 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 376 RTW_PWR_ADDR_MAC, 377 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)}, 378 {0x0020, 379 RTW_PWR_CUT_ALL_MSK, 380 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 381 RTW_PWR_ADDR_MAC, 382 RTW_PWR_CMD_WRITE, BIT(0), 0}, 383 {TRANS_SEQ_END}, 384 }; 385 386 static const struct rtw_pwr_seq_cmd trans_act_to_reset_mcu_8703b[] = { 387 {REG_SYS_FUNC_EN + 1, 388 RTW_PWR_CUT_ALL_MSK, 389 RTW_PWR_INTF_SDIO_MSK, 390 RTW_PWR_ADDR_MAC, 391 RTW_PWR_CMD_WRITE, BIT_FEN_CPUEN, 0}, 392 /* reset MCU ready */ 393 {REG_MCUFW_CTRL, 394 RTW_PWR_CUT_ALL_MSK, 395 RTW_PWR_INTF_SDIO_MSK, 396 RTW_PWR_ADDR_MAC, 397 RTW_PWR_CMD_WRITE, 0xff, 0}, 398 /* reset MCU IO wrapper */ 399 {REG_RSV_CTRL + 1, 400 RTW_PWR_CUT_ALL_MSK, 401 RTW_PWR_INTF_SDIO_MSK, 402 RTW_PWR_ADDR_MAC, 403 RTW_PWR_CMD_WRITE, BIT(0), 0}, 404 {REG_RSV_CTRL + 1, 405 RTW_PWR_CUT_ALL_MSK, 406 RTW_PWR_INTF_SDIO_MSK, 407 RTW_PWR_ADDR_MAC, 408 RTW_PWR_CMD_WRITE, BIT(0), 1}, 409 {TRANS_SEQ_END}, 410 }; 411 412 static const struct rtw_pwr_seq_cmd trans_act_to_lps_8703b[] = { 413 {0x0301, 414 RTW_PWR_CUT_ALL_MSK, 415 RTW_PWR_INTF_ALL_MSK, 416 RTW_PWR_ADDR_MAC, 417 RTW_PWR_CMD_WRITE, 0xff, 0xff}, 418 {0x0522, 419 RTW_PWR_CUT_ALL_MSK, 420 RTW_PWR_INTF_ALL_MSK, 421 RTW_PWR_ADDR_MAC, 422 RTW_PWR_CMD_WRITE, 0xff, 0xff}, 423 {0x05f8, 424 RTW_PWR_CUT_ALL_MSK, 425 RTW_PWR_INTF_ALL_MSK, 426 RTW_PWR_ADDR_MAC, 427 RTW_PWR_CMD_POLLING, 0xff, 0}, 428 {0x05f9, 429 RTW_PWR_CUT_ALL_MSK, 430 RTW_PWR_INTF_ALL_MSK, 431 RTW_PWR_ADDR_MAC, 432 RTW_PWR_CMD_POLLING, 0xff, 0}, 433 {0x05fa, 434 RTW_PWR_CUT_ALL_MSK, 435 RTW_PWR_INTF_ALL_MSK, 436 RTW_PWR_ADDR_MAC, 437 RTW_PWR_CMD_POLLING, 0xff, 0}, 438 {0x05fb, 439 RTW_PWR_CUT_ALL_MSK, 440 RTW_PWR_INTF_ALL_MSK, 441 RTW_PWR_ADDR_MAC, 442 RTW_PWR_CMD_POLLING, 0xff, 0}, 443 {0x0002, 444 RTW_PWR_CUT_ALL_MSK, 445 RTW_PWR_INTF_ALL_MSK, 446 RTW_PWR_ADDR_MAC, 447 RTW_PWR_CMD_WRITE, BIT(0), 0}, 448 {0x0002, 449 RTW_PWR_CUT_ALL_MSK, 450 RTW_PWR_INTF_ALL_MSK, 451 RTW_PWR_ADDR_MAC, 452 RTW_PWR_CMD_DELAY, 0, RTW_PWR_DELAY_US}, 453 {0x0002, 454 RTW_PWR_CUT_ALL_MSK, 455 RTW_PWR_INTF_ALL_MSK, 456 RTW_PWR_ADDR_MAC, 457 RTW_PWR_CMD_WRITE, BIT(1), 0}, 458 {0x0100, 459 RTW_PWR_CUT_ALL_MSK, 460 RTW_PWR_INTF_ALL_MSK, 461 RTW_PWR_ADDR_MAC, 462 RTW_PWR_CMD_WRITE, 0xff, 0x03}, 463 {0x0101, 464 RTW_PWR_CUT_ALL_MSK, 465 RTW_PWR_INTF_ALL_MSK, 466 RTW_PWR_ADDR_MAC, 467 RTW_PWR_CMD_WRITE, BIT(1), 0}, 468 {0x0093, 469 RTW_PWR_CUT_ALL_MSK, 470 RTW_PWR_INTF_SDIO_MSK, 471 RTW_PWR_ADDR_MAC, 472 RTW_PWR_CMD_WRITE, 0xff, 0}, 473 {0x0553, 474 RTW_PWR_CUT_ALL_MSK, 475 RTW_PWR_INTF_ALL_MSK, 476 RTW_PWR_ADDR_MAC, 477 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)}, 478 {TRANS_SEQ_END}, 479 }; 480 481 static const struct rtw_pwr_seq_cmd * const card_enable_flow_8703b[] = { 482 trans_pre_enable_8703b, 483 trans_carddis_to_cardemu_8703b, 484 trans_cardemu_to_act_8703b, 485 NULL 486 }; 487 488 static const struct rtw_pwr_seq_cmd * const card_disable_flow_8703b[] = { 489 trans_act_to_lps_8703b, 490 trans_act_to_reset_mcu_8703b, 491 trans_act_to_cardemu_8703b, 492 trans_cardemu_to_carddis_8703b, 493 NULL 494 }; 495 496 static const struct rtw_page_table page_table_8703b[] = { 497 {12, 2, 2, 0, 1}, 498 {12, 2, 2, 0, 1}, 499 {12, 2, 2, 0, 1}, 500 {12, 2, 2, 0, 1}, 501 {12, 2, 2, 0, 1}, 502 }; 503 504 static const struct rtw_rqpn rqpn_table_8703b[] = { 505 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 506 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 507 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 508 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 509 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 510 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 511 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 512 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH, 513 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 514 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 515 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 516 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 517 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 518 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 519 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 520 }; 521 522 static void try_mac_from_devicetree(struct rtw_dev *rtwdev) 523 { 524 struct device_node *node = rtwdev->dev->of_node; 525 struct rtw_efuse *efuse = &rtwdev->efuse; 526 int ret; 527 528 if (node) { 529 ret = of_get_mac_address(node, efuse->addr); 530 if (ret == 0) { 531 rtw_dbg(rtwdev, RTW_DBG_EFUSE, 532 "got wifi mac address from DT: %pM\n", 533 efuse->addr); 534 } 535 } 536 } 537 538 static int rtw8703b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) 539 { 540 struct rtw_efuse *efuse = &rtwdev->efuse; 541 int ret; 542 543 ret = rtw8723x_read_efuse(rtwdev, log_map); 544 if (ret != 0) 545 return ret; 546 547 if (!is_valid_ether_addr(efuse->addr)) 548 try_mac_from_devicetree(rtwdev); 549 550 return 0; 551 } 552 553 static void rtw8703b_pwrtrack_init(struct rtw_dev *rtwdev) 554 { 555 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 556 u8 path; 557 558 /* TODO: The vendor driver selects these using tables in 559 * halrf_powertracking_ce.c, functions are called 560 * get_swing_index and get_cck_swing_index. There the current 561 * fixed values are only the defaults in case no match is 562 * found. 563 */ 564 dm_info->default_ofdm_index = 30; 565 dm_info->default_cck_index = 20; 566 567 for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) { 568 ewma_thermal_init(&dm_info->avg_thermal[path]); 569 dm_info->delta_power_index[path] = 0; 570 } 571 dm_info->pwr_trk_triggered = false; 572 dm_info->pwr_trk_init_trigger = true; 573 dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k; 574 dm_info->txagc_remnant_cck = 0; 575 dm_info->txagc_remnant_ofdm[RF_PATH_A] = 0; 576 } 577 578 static void rtw8703b_phy_set_param(struct rtw_dev *rtwdev) 579 { 580 u8 xtal_cap = rtwdev->efuse.crystal_cap & 0x3F; 581 582 /* power on BB/RF domain */ 583 rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, 584 BIT_FEN_EN_25_1 | BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB); 585 rtw_write8_set(rtwdev, REG_RF_CTRL, 586 BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB); 587 rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, 0x0780); 588 rtw_write8(rtwdev, REG_AFE_CTRL1 + 1, 0x80); 589 590 rtw_phy_load_tables(rtwdev); 591 592 rtw_write32_clr(rtwdev, REG_RCR, BIT_RCR_ADF); 593 /* 0xff is from vendor driver, rtw8723d uses 594 * BIT_HIQ_NO_LMT_EN_ROOT. Comment in vendor driver: "Packet 595 * in Hi Queue Tx immediately". I wonder if setting all bits 596 * is really necessary. 597 */ 598 rtw_write8_set(rtwdev, REG_HIQ_NO_LMT_EN, 0xff); 599 rtw_write16_set(rtwdev, REG_AFE_CTRL_4, BIT_CK320M_AFE_EN | BIT_EN_SYN); 600 601 rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL, 602 xtal_cap | (xtal_cap << 6)); 603 rtw_write32_set(rtwdev, REG_FPGA0_RFMOD, BIT_CCKEN | BIT_OFDMEN); 604 605 /* Init EDCA */ 606 rtw_write16(rtwdev, REG_SPEC_SIFS, WLAN_SPEC_SIFS); 607 rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, WLAN_SPEC_SIFS); 608 rtw_write16(rtwdev, REG_SIFS, WLAN_SPEC_SIFS); /* CCK */ 609 rtw_write16(rtwdev, REG_SIFS + 2, WLAN_SPEC_SIFS); /* OFDM */ 610 /* TXOP */ 611 rtw_write32(rtwdev, REG_EDCA_VO_PARAM, 0x002FA226); 612 rtw_write32(rtwdev, REG_EDCA_VI_PARAM, 0x005EA324); 613 rtw_write32(rtwdev, REG_EDCA_BE_PARAM, 0x005EA42B); 614 rtw_write32(rtwdev, REG_EDCA_BK_PARAM, 0x0000A44F); 615 616 /* Init retry */ 617 rtw_write8(rtwdev, REG_ACKTO, 0x40); 618 619 /* Set up RX aggregation. sdio.c also sets DMA mode, but not 620 * the burst parameters. 621 */ 622 rtw_write8(rtwdev, REG_RXDMA_MODE, 623 BIT_DMA_MODE | 624 FIELD_PREP_CONST(BIT_MASK_AGG_BURST_NUM, AGG_BURST_NUM) | 625 FIELD_PREP_CONST(BIT_MASK_AGG_BURST_SIZE, AGG_BURST_SIZE)); 626 627 /* Init beacon parameters */ 628 rtw_write8(rtwdev, REG_BCN_CTRL, 629 BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION | BIT_EN_TXBCN_RPT); 630 rtw_write8(rtwdev, REG_TBTT_PROHIBIT, TBTT_PROHIBIT_SETUP_TIME); 631 rtw_write8(rtwdev, REG_TBTT_PROHIBIT + 1, 632 TBTT_PROHIBIT_HOLD_TIME_STOP_BCN & 0xFF); 633 rtw_write8(rtwdev, REG_TBTT_PROHIBIT + 2, 634 (rtw_read8(rtwdev, REG_TBTT_PROHIBIT + 2) & 0xF0) 635 | (TBTT_PROHIBIT_HOLD_TIME_STOP_BCN >> 8)); 636 637 /* configure packet burst */ 638 rtw_write8_set(rtwdev, REG_SINGLE_AMPDU_CTRL, BIT_EN_SINGLE_APMDU); 639 rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RX_PKT_LIMIT); 640 rtw_write8(rtwdev, REG_MAX_AGGR_NUM, WLAN_MAX_AGG_NR); 641 rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_VAL); 642 rtw_write8_clr(rtwdev, REG_FWHW_TXQ_CTRL, BIT_MASK_TXQ_INIT); 643 rtw_write8(rtwdev, REG_AMPDU_MAX_TIME, WLAN_AMPDU_MAX_TIME); 644 645 rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME); 646 rtw_write16(rtwdev, REG_RETRY_LIMIT, WLAN_RL_VAL); 647 rtw_write32(rtwdev, REG_BAR_MODE_CTRL, WLAN_BAR_VAL); 648 rtw_write16(rtwdev, REG_ATIMWND, 0x2); 649 650 rtw_phy_init(rtwdev); 651 652 if (rtw_read32_mask(rtwdev, REG_BB_AMP, BIT_MASK_RX_LNA) != 0) { 653 rtwdev->dm_info.rx_cck_agc_report_type = 1; 654 } else { 655 rtwdev->dm_info.rx_cck_agc_report_type = 0; 656 rtw_warn(rtwdev, "unexpected cck agc report type"); 657 } 658 659 rtw8723x_lck(rtwdev); 660 661 rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50); 662 rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x20); 663 664 rtw8703b_pwrtrack_init(rtwdev); 665 } 666 667 static bool rtw8703b_check_spur_ov_thres(struct rtw_dev *rtwdev, 668 u32 freq, u32 thres) 669 { 670 bool ret = false; 671 672 rtw_write32(rtwdev, REG_ANALOG_P4, DIS_3WIRE); 673 rtw_write32(rtwdev, REG_PSDFN, freq); 674 rtw_write32(rtwdev, REG_PSDFN, START_PSD | freq); 675 676 msleep(30); 677 if (rtw_read32(rtwdev, REG_PSDRPT) >= thres) 678 ret = true; 679 680 rtw_write32(rtwdev, REG_PSDFN, freq); 681 rtw_write32(rtwdev, REG_ANALOG_P4, EN_3WIRE); 682 683 return ret; 684 } 685 686 static void rtw8703b_cfg_notch(struct rtw_dev *rtwdev, u8 channel, bool notch) 687 { 688 if (!notch) { 689 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x1f); 690 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0); 691 rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000); 692 rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000); 693 rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000); 694 rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000); 695 rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0); 696 return; 697 } 698 699 switch (channel) { 700 case 5: 701 fallthrough; 702 case 13: 703 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0xb); 704 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1); 705 rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x06000000); 706 rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000); 707 rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000); 708 rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000); 709 rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1); 710 break; 711 case 6: 712 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x4); 713 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1); 714 rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000600); 715 rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000); 716 rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000); 717 rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000); 718 rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1); 719 break; 720 case 7: 721 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x3); 722 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1); 723 rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000); 724 rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000); 725 rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000); 726 rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x06000000); 727 rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1); 728 break; 729 case 8: 730 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0xa); 731 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1); 732 rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000); 733 rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000); 734 rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000); 735 rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000380); 736 rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1); 737 break; 738 case 14: 739 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x5); 740 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1); 741 rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000); 742 rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000); 743 rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000); 744 rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00180000); 745 rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1); 746 break; 747 default: 748 rtw_warn(rtwdev, 749 "Bug: Notch filter enable called for channel %u!", 750 channel); 751 rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0); 752 rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0); 753 break; 754 } 755 } 756 757 static void rtw8703b_spur_cal(struct rtw_dev *rtwdev, u8 channel) 758 { 759 bool notch; 760 u32 freq; 761 762 if (channel == 5) { 763 freq = FREQ_CH5; 764 } else if (channel == 6) { 765 freq = FREQ_CH6; 766 } else if (channel == 7) { 767 freq = FREQ_CH7; 768 } else if (channel == 8) { 769 freq = FREQ_CH8; 770 } else if (channel == 13) { 771 freq = FREQ_CH13; 772 } else if (channel == 14) { 773 freq = FREQ_CH14; 774 } else { 775 rtw8703b_cfg_notch(rtwdev, channel, false); 776 return; 777 } 778 779 notch = rtw8703b_check_spur_ov_thres(rtwdev, freq, SPUR_THRES); 780 rtw8703b_cfg_notch(rtwdev, channel, notch); 781 } 782 783 static void rtw8703b_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) 784 { 785 u32 rf_cfgch_a; 786 u32 rf_cfgch_b; 787 /* default value for 20M */ 788 u32 rf_rck = 0x00000C08; 789 790 rf_cfgch_a = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK); 791 rf_cfgch_b = rtw_read_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK); 792 793 rf_cfgch_a &= ~RFCFGCH_CHANNEL_MASK; 794 rf_cfgch_b &= ~RFCFGCH_CHANNEL_MASK; 795 rf_cfgch_a |= (channel & RFCFGCH_CHANNEL_MASK); 796 rf_cfgch_b |= (channel & RFCFGCH_CHANNEL_MASK); 797 798 rf_cfgch_a &= ~RFCFGCH_BW_MASK; 799 switch (bw) { 800 case RTW_CHANNEL_WIDTH_20: 801 rf_cfgch_a |= RFCFGCH_BW_20M; 802 break; 803 case RTW_CHANNEL_WIDTH_40: 804 rf_cfgch_a |= RFCFGCH_BW_40M; 805 rf_rck = 0x00000C4C; 806 break; 807 default: 808 break; 809 } 810 811 rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_cfgch_a); 812 rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_cfgch_b); 813 814 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK1, RFREG_MASK, rf_rck); 815 rtw8703b_spur_cal(rtwdev, channel); 816 } 817 818 #define CCK_DFIR_NR_8703B 2 819 static const struct rtw_backup_info cck_dfir_cfg[][CCK_DFIR_NR_8703B] = { 820 [0] = { 821 { .len = 4, .reg = REG_CCK_TXSF2, .val = 0x5A7DA0BD }, 822 { .len = 4, .reg = REG_CCK_DBG, .val = 0x0000223B }, 823 }, 824 [1] = { 825 { .len = 4, .reg = REG_CCK_TXSF2, .val = 0x00000000 }, 826 { .len = 4, .reg = REG_CCK_DBG, .val = 0x00000000 }, 827 }, 828 }; 829 830 static void rtw8703b_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw, 831 u8 primary_ch_idx) 832 { 833 const struct rtw_backup_info *cck_dfir; 834 int i; 835 836 cck_dfir = channel <= 13 ? cck_dfir_cfg[0] : cck_dfir_cfg[1]; 837 838 for (i = 0; i < CCK_DFIR_NR_8703B; i++, cck_dfir++) 839 rtw_write32(rtwdev, cck_dfir->reg, cck_dfir->val); 840 841 switch (bw) { 842 case RTW_CHANNEL_WIDTH_20: 843 rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x0); 844 rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x0); 845 rtw_write32_mask(rtwdev, REG_OFDM0_TX_PSD_NOISE, 846 GENMASK(31, 30), 0x0); 847 rtw_write32(rtwdev, REG_BBRX_DFIR, 0x4A880000); 848 rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x19F60000); 849 break; 850 case RTW_CHANNEL_WIDTH_40: 851 rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x1); 852 rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x1); 853 rtw_write32(rtwdev, REG_BBRX_DFIR, 0x40100000); 854 rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x51F60000); 855 rtw_write32_mask(rtwdev, REG_CCK0_SYS, BIT_CCK_SIDE_BAND, 856 primary_ch_idx == RTW_SC_20_UPPER ? 1 : 0); 857 rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, 0xC00, 858 primary_ch_idx == RTW_SC_20_UPPER ? 2 : 1); 859 860 rtw_write32_mask(rtwdev, REG_BB_PWR_SAV5_11N, GENMASK(27, 26), 861 primary_ch_idx == RTW_SC_20_UPPER ? 1 : 2); 862 break; 863 default: 864 break; 865 } 866 } 867 868 static void rtw8703b_set_channel(struct rtw_dev *rtwdev, u8 channel, 869 u8 bw, u8 primary_chan_idx) 870 { 871 rtw8703b_set_channel_rf(rtwdev, channel, bw); 872 rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx); 873 rtw8703b_set_channel_bb(rtwdev, channel, bw, primary_chan_idx); 874 } 875 876 /* Not all indices are valid, based on available data. None of the 877 * known valid values are positive, so use 0x7f as "invalid". 878 */ 879 #define LNA_IDX_INVALID 0x7f 880 static const s8 lna_gain_table[16] = { 881 -2, LNA_IDX_INVALID, LNA_IDX_INVALID, LNA_IDX_INVALID, 882 -6, LNA_IDX_INVALID, LNA_IDX_INVALID, -19, 883 -32, LNA_IDX_INVALID, -36, -42, 884 LNA_IDX_INVALID, LNA_IDX_INVALID, LNA_IDX_INVALID, -48, 885 }; 886 887 static s8 get_cck_rx_pwr(struct rtw_dev *rtwdev, u8 lna_idx, u8 vga_idx) 888 { 889 s8 lna_gain = 0; 890 891 if (lna_idx < ARRAY_SIZE(lna_gain_table)) 892 lna_gain = lna_gain_table[lna_idx]; 893 894 if (lna_gain >= 0) { 895 rtw_warn(rtwdev, "incorrect lna index (%d)\n", lna_idx); 896 return -120; 897 } 898 899 return lna_gain - 2 * vga_idx; 900 } 901 902 static void query_phy_status_cck(struct rtw_dev *rtwdev, u8 *phy_raw, 903 struct rtw_rx_pkt_stat *pkt_stat) 904 { 905 struct phy_status_8703b *phy_status = (struct phy_status_8703b *)phy_raw; 906 u8 vga_idx = phy_status->cck_agc_rpt_ofdm_cfosho_a & VGA_BITS; 907 u8 lna_idx = phy_status->cck_agc_rpt_ofdm_cfosho_a & LNA_L_BITS; 908 s8 rx_power; 909 910 if (rtwdev->dm_info.rx_cck_agc_report_type == 1) 911 lna_idx = FIELD_PREP(BIT_LNA_H_MASK, 912 phy_status->cck_rpt_b_ofdm_cfosho_b & LNA_H_BIT) 913 | FIELD_PREP(BIT_LNA_L_MASK, lna_idx); 914 else 915 lna_idx = FIELD_PREP(BIT_LNA_L_MASK, lna_idx); 916 rx_power = get_cck_rx_pwr(rtwdev, lna_idx, vga_idx); 917 918 pkt_stat->rx_power[RF_PATH_A] = rx_power; 919 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1); 920 rtwdev->dm_info.rssi[RF_PATH_A] = pkt_stat->rssi; 921 pkt_stat->signal_power = rx_power; 922 } 923 924 static void query_phy_status_ofdm(struct rtw_dev *rtwdev, u8 *phy_raw, 925 struct rtw_rx_pkt_stat *pkt_stat) 926 { 927 struct phy_status_8703b *phy_status = (struct phy_status_8703b *)phy_raw; 928 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 929 s8 val_s8; 930 931 val_s8 = phy_status->path_agc[RF_PATH_A].gain & 0x3F; 932 pkt_stat->rx_power[RF_PATH_A] = (val_s8 * 2) - 110; 933 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1); 934 pkt_stat->rx_snr[RF_PATH_A] = (s8)(phy_status->path_rxsnr[RF_PATH_A] / 2); 935 936 /* signal power reported by HW */ 937 val_s8 = phy_status->cck_sig_qual_ofdm_pwdb_all >> 1; 938 pkt_stat->signal_power = (val_s8 & 0x7f) - 110; 939 940 pkt_stat->rx_evm[RF_PATH_A] = phy_status->stream_rxevm[RF_PATH_A]; 941 pkt_stat->cfo_tail[RF_PATH_A] = phy_status->path_cfotail[RF_PATH_A]; 942 943 dm_info->curr_rx_rate = pkt_stat->rate; 944 dm_info->rssi[RF_PATH_A] = pkt_stat->rssi; 945 dm_info->rx_snr[RF_PATH_A] = pkt_stat->rx_snr[RF_PATH_A] >> 1; 946 /* convert to KHz (used only for debugfs) */ 947 dm_info->cfo_tail[RF_PATH_A] = (pkt_stat->cfo_tail[RF_PATH_A] * 5) >> 1; 948 949 /* (EVM value as s8 / 2) is dbm, should usually be in -33 to 0 950 * range. rx_evm_dbm needs the absolute (positive) value. 951 */ 952 val_s8 = (s8)pkt_stat->rx_evm[RF_PATH_A]; 953 val_s8 = clamp_t(s8, -val_s8 >> 1, 0, 64); 954 val_s8 &= 0x3F; /* 64->0: second path of 1SS rate is 64 */ 955 dm_info->rx_evm_dbm[RF_PATH_A] = val_s8; 956 } 957 958 static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status, 959 struct rtw_rx_pkt_stat *pkt_stat) 960 { 961 if (pkt_stat->rate <= DESC_RATE11M) 962 query_phy_status_cck(rtwdev, phy_status, pkt_stat); 963 else 964 query_phy_status_ofdm(rtwdev, phy_status, pkt_stat); 965 } 966 967 #define ADDA_ON_VAL_8703B 0x03c00014 968 969 static 970 void rtw8703b_iqk_config_mac(struct rtw_dev *rtwdev, 971 const struct rtw8723x_iqk_backup_regs *backup) 972 { 973 rtw_write8(rtwdev, rtw8723x_common.iqk_mac8_regs[0], 0x3F); 974 for (int i = 1; i < RTW8723X_IQK_MAC8_REG_NUM; i++) 975 rtw_write8(rtwdev, rtw8723x_common.iqk_mac8_regs[i], 976 backup->mac8[i] & (~BIT(3))); 977 } 978 979 #define IQK_LTE_WRITE_VAL_8703B 0x00007700 980 #define IQK_DELAY_TIME_8703B 4 981 982 static void rtw8703b_iqk_one_shot(struct rtw_dev *rtwdev, bool tx) 983 { 984 u32 regval; 985 ktime_t t; 986 s64 dur; 987 int ret; 988 989 /* enter IQK mode */ 990 rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK); 991 rtw8723x_iqk_config_lte_path_gnt(rtwdev, IQK_LTE_WRITE_VAL_8703B); 992 993 /* One shot, LOK & IQK */ 994 rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, 0xf9000000); 995 rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, 0xf8000000); 996 997 t = ktime_get(); 998 msleep(IQK_DELAY_TIME_8703B); 999 ret = read_poll_timeout(rtw_read32, regval, regval != 0, 1000, 1000 100000, false, rtwdev, 1001 REG_IQK_RDY); 1002 dur = ktime_us_delta(ktime_get(), t); 1003 1004 if (ret) 1005 rtw_warn(rtwdev, "[IQK] %s timed out after %lldus!\n", 1006 tx ? "TX" : "RX", dur); 1007 else 1008 rtw_dbg(rtwdev, RTW_DBG_RFK, 1009 "[IQK] %s done after %lldus\n", 1010 tx ? "TX" : "RX", dur); 1011 } 1012 1013 static void rtw8703b_iqk_txrx_path_post(struct rtw_dev *rtwdev, 1014 const struct rtw8723x_iqk_backup_regs *backup) 1015 { 1016 rtw8723x_iqk_restore_lte_path_gnt(rtwdev, backup); 1017 rtw_write32(rtwdev, REG_BB_SEL_BTG, backup->bb_sel_btg); 1018 1019 /* leave IQK mode */ 1020 rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK); 1021 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, 0x800, 0x0); 1022 } 1023 1024 static u8 rtw8703b_iqk_check_tx_failed(struct rtw_dev *rtwdev) 1025 { 1026 s32 tx_x, tx_y; 1027 u32 tx_fail; 1028 1029 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xeac = 0x%x\n", 1030 rtw_read32(rtwdev, REG_IQK_RES_RY)); 1031 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe94 = 0x%x, 0xe9c = 0x%x\n", 1032 rtw_read32(rtwdev, REG_IQK_RES_TX), 1033 rtw_read32(rtwdev, REG_IQK_RES_TY)); 1034 rtw_dbg(rtwdev, RTW_DBG_RFK, 1035 "[IQK] 0xe90(before IQK) = 0x%x, 0xe98(after IQK) = 0x%x\n", 1036 rtw_read32(rtwdev, REG_IQK_RDY), 1037 rtw_read32(rtwdev, 0xe98)); 1038 1039 tx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_TX_FAIL); 1040 tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX); 1041 tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY); 1042 1043 if (!tx_fail && tx_x != IQK_TX_X_ERR && tx_y != IQK_TX_Y_ERR) 1044 return IQK_TX_OK; 1045 1046 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] A TX IQK failed\n"); 1047 1048 return 0; 1049 } 1050 1051 static u8 rtw8703b_iqk_check_rx_failed(struct rtw_dev *rtwdev) 1052 { 1053 s32 rx_x, rx_y; 1054 u32 rx_fail; 1055 1056 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xea4 = 0x%x, 0xeac = 0x%x\n", 1057 rtw_read32(rtwdev, REG_IQK_RES_RX), 1058 rtw_read32(rtwdev, REG_IQK_RES_RY)); 1059 1060 rtw_dbg(rtwdev, RTW_DBG_RFK, 1061 "[IQK] 0xea0(before IQK) = 0x%x, 0xea8(after IQK) = 0x%x\n", 1062 rtw_read32(rtwdev, 0xea0), 1063 rtw_read32(rtwdev, 0xea8)); 1064 1065 rx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_RX_FAIL); 1066 rx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX); 1067 rx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY); 1068 rx_y = abs(iqkxy_to_s32(rx_y)); 1069 1070 if (!rx_fail && rx_x != IQK_RX_X_ERR && rx_y != IQK_RX_Y_ERR && 1071 rx_x < IQK_RX_X_UPPER && rx_x > IQK_RX_X_LOWER && 1072 rx_y < IQK_RX_Y_LMT) 1073 return IQK_RX_OK; 1074 1075 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] A RX IQK failed\n"); 1076 1077 return 0; 1078 } 1079 1080 static u8 rtw8703b_iqk_tx_path(struct rtw_dev *rtwdev, 1081 const struct rtw8723x_iqk_backup_regs *backup) 1082 { 1083 u8 status; 1084 1085 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A TX IQK!\n"); 1086 1087 /* IQK setting */ 1088 rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00); 1089 rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800); 1090 rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x18008c1c); 1091 rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c); 1092 rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c); 1093 rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c); 1094 rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x8214030f); 1095 rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28110000); 1096 rtw_write32(rtwdev, REG_TXIQK_PI_B, 0x82110000); 1097 rtw_write32(rtwdev, REG_RXIQK_PI_B, 0x28110000); 1098 1099 /* LO calibration setting */ 1100 rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x00462911); 1101 1102 /* leave IQK mode */ 1103 rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, 0xffffff00, 0x000000); 1104 1105 /* PA, PAD setting */ 1106 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, 0x800, 0x1); 1107 rtw_write_rf(rtwdev, RF_PATH_A, 0x55, 0x7f, 0x7); 1108 rtw_write_rf(rtwdev, RF_PATH_A, 0x7f, RFREG_MASK, 0xd400); 1109 1110 rtw8703b_iqk_one_shot(rtwdev, true); 1111 status = rtw8703b_iqk_check_tx_failed(rtwdev); 1112 1113 rtw8703b_iqk_txrx_path_post(rtwdev, backup); 1114 1115 return status; 1116 } 1117 1118 static u8 rtw8703b_iqk_rx_path(struct rtw_dev *rtwdev, 1119 const struct rtw8723x_iqk_backup_regs *backup) 1120 { 1121 u8 status; 1122 u32 tx_x, tx_y; 1123 1124 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A RX IQK step 1!\n"); 1125 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @A RX IQK1 = 0x%x\n", 1126 rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3)); 1127 rtw_write32(rtwdev, REG_BB_SEL_BTG, 0x99000000); 1128 1129 /* disable IQC mode */ 1130 rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK); 1131 1132 /* IQK setting */ 1133 rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00); 1134 rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800); 1135 1136 /* path IQK setting */ 1137 rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x18008c1c); 1138 rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c); 1139 rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c); 1140 rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c); 1141 rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x8214030f); 1142 rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28110000); 1143 rtw_write32(rtwdev, REG_TXIQK_PI_B, 0x82110000); 1144 rtw_write32(rtwdev, REG_RXIQK_PI_B, 0x28110000); 1145 1146 /* LOK setting */ 1147 rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a911); 1148 1149 /* RX IQK mode */ 1150 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, 0x80000, 0x1); 1151 rtw_write_rf(rtwdev, RF_PATH_A, 0x30, RFREG_MASK, 0x30000); 1152 rtw_write_rf(rtwdev, RF_PATH_A, 0x31, RFREG_MASK, 0x00007); 1153 rtw_write_rf(rtwdev, RF_PATH_A, 0x32, RFREG_MASK, 0x57db7); 1154 1155 rtw8703b_iqk_one_shot(rtwdev, true); 1156 /* leave IQK mode */ 1157 rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, 0xffffff00, 0x000000); 1158 status = rtw8703b_iqk_check_tx_failed(rtwdev); 1159 1160 if (!status) 1161 goto restore; 1162 1163 /* second round */ 1164 tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX); 1165 tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY); 1166 1167 rtw_write32(rtwdev, REG_TXIQK_11N, BIT_SET_TXIQK_11N(tx_x, tx_y)); 1168 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe40 = 0x%x u4tmp = 0x%x\n", 1169 rtw_read32(rtwdev, REG_TXIQK_11N), 1170 BIT_SET_TXIQK_11N(tx_x, tx_y)); 1171 1172 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A RX IQK step 2!\n"); 1173 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @A RX IQK 2 = 0x%x\n", 1174 rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3)); 1175 1176 /* IQK setting */ 1177 rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800); 1178 rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x38008c1c); 1179 rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x18008c1c); 1180 rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c); 1181 rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c); 1182 rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82110000); 1183 rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160c1f); 1184 rtw_write32(rtwdev, REG_TXIQK_PI_B, 0x82110000); 1185 rtw_write32(rtwdev, REG_RXIQK_PI_B, 0x28110000); 1186 1187 /* LO calibration setting */ 1188 rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a8d1); 1189 1190 /* leave IQK mode */ 1191 rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, 0xffffff00, 0x000000); 1192 /* modify RX IQK mode table */ 1193 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, 0x80000, 0x1); 1194 /* RF_RCK_OS, RF_TXPA_G1, RF_TXPA_G2 */ 1195 rtw_write_rf(rtwdev, RF_PATH_A, 0x30, RFREG_MASK, 0x30000); 1196 rtw_write_rf(rtwdev, RF_PATH_A, 0x31, RFREG_MASK, 0x00007); 1197 rtw_write_rf(rtwdev, RF_PATH_A, 0x32, RFREG_MASK, 0xf7d77); 1198 1199 /* PA, PAD setting */ 1200 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, 0x800, 0x1); 1201 rtw_write_rf(rtwdev, RF_PATH_A, 0x55, 0x7f, 0x5); 1202 1203 rtw8703b_iqk_one_shot(rtwdev, false); 1204 status |= rtw8703b_iqk_check_rx_failed(rtwdev); 1205 1206 restore: 1207 rtw8703b_iqk_txrx_path_post(rtwdev, backup); 1208 1209 return status; 1210 } 1211 1212 static 1213 void rtw8703b_iqk_one_round(struct rtw_dev *rtwdev, s32 result[][IQK_NR], u8 t, 1214 const struct rtw8723x_iqk_backup_regs *backup) 1215 { 1216 u32 i; 1217 u8 a_ok; 1218 1219 rtw_dbg(rtwdev, RTW_DBG_RFK, 1220 "[IQK] IQ Calibration for 1T1R_S0/S1 for %d times\n", t); 1221 1222 rtw8723x_iqk_path_adda_on(rtwdev, ADDA_ON_VAL_8703B); 1223 rtw8703b_iqk_config_mac(rtwdev, backup); 1224 rtw_write32_mask(rtwdev, REG_CCK_ANT_SEL_11N, 0x0f000000, 0xf); 1225 rtw_write32(rtwdev, REG_BB_RX_PATH_11N, 0x03a05600); 1226 rtw_write32(rtwdev, REG_TRMUX_11N, 0x000800e4); 1227 rtw_write32(rtwdev, REG_BB_PWR_SAV1_11N, 0x25204000); 1228 1229 for (i = 0; i < PATH_IQK_RETRY; i++) { 1230 a_ok = rtw8703b_iqk_tx_path(rtwdev, backup); 1231 if (a_ok == IQK_TX_OK) { 1232 rtw_dbg(rtwdev, RTW_DBG_RFK, 1233 "[IQK] path A TX IQK success!\n"); 1234 result[t][IQK_S1_TX_X] = 1235 rtw_read32_mask(rtwdev, REG_IQK_RES_TX, 1236 BIT_MASK_RES_TX); 1237 result[t][IQK_S1_TX_Y] = 1238 rtw_read32_mask(rtwdev, REG_IQK_RES_TY, 1239 BIT_MASK_RES_TY); 1240 break; 1241 } 1242 1243 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A TX IQK fail!\n"); 1244 result[t][IQK_S1_TX_X] = 0x100; 1245 result[t][IQK_S1_TX_Y] = 0x0; 1246 } 1247 1248 for (i = 0; i < PATH_IQK_RETRY; i++) { 1249 a_ok = rtw8703b_iqk_rx_path(rtwdev, backup); 1250 if (a_ok == (IQK_TX_OK | IQK_RX_OK)) { 1251 rtw_dbg(rtwdev, RTW_DBG_RFK, 1252 "[IQK] path A RX IQK success!\n"); 1253 result[t][IQK_S1_RX_X] = 1254 rtw_read32_mask(rtwdev, REG_IQK_RES_RX, 1255 BIT_MASK_RES_RX); 1256 result[t][IQK_S1_RX_Y] = 1257 rtw_read32_mask(rtwdev, REG_IQK_RES_RY, 1258 BIT_MASK_RES_RY); 1259 break; 1260 } 1261 1262 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A RX IQK fail!\n"); 1263 result[t][IQK_S1_RX_X] = 0x100; 1264 result[t][IQK_S1_RX_Y] = 0x0; 1265 } 1266 1267 if (a_ok == 0x0) 1268 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A IQK fail!\n"); 1269 1270 rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK); 1271 mdelay(1); 1272 } 1273 1274 static 1275 void rtw8703b_iqk_fill_a_matrix(struct rtw_dev *rtwdev, const s32 result[]) 1276 { 1277 u32 tmp_rx_iqi = 0x40000100 & GENMASK(31, 16); 1278 s32 tx1_a, tx1_a_ext; 1279 s32 tx1_c, tx1_c_ext; 1280 s32 oldval_1; 1281 s32 x, y; 1282 1283 if (result[IQK_S1_TX_X] == 0) 1284 return; 1285 1286 oldval_1 = rtw_read32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, 1287 BIT_MASK_TXIQ_ELM_D); 1288 1289 x = iqkxy_to_s32(result[IQK_S1_TX_X]); 1290 tx1_a = iqk_mult(x, oldval_1, &tx1_a_ext); 1291 rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, 1292 BIT_MASK_TXIQ_ELM_A, tx1_a); 1293 rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, 1294 BIT_MASK_OFDM0_EXT_A, tx1_a_ext); 1295 1296 y = iqkxy_to_s32(result[IQK_S1_TX_Y]); 1297 tx1_c = iqk_mult(y, oldval_1, &tx1_c_ext); 1298 rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS, 1299 BIT_SET_TXIQ_ELM_C1(tx1_c)); 1300 rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, 1301 BIT_MASK_TXIQ_ELM_C, BIT_SET_TXIQ_ELM_C2(tx1_c)); 1302 rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, 1303 BIT_MASK_OFDM0_EXT_C, tx1_c_ext); 1304 1305 rtw_dbg(rtwdev, RTW_DBG_RFK, 1306 "[IQK] X = 0x%x, TX1_A = 0x%x, oldval_1 0x%x\n", 1307 x, tx1_a, oldval_1); 1308 rtw_dbg(rtwdev, RTW_DBG_RFK, 1309 "[IQK] Y = 0x%x, TX1_C = 0x%x\n", y, tx1_c); 1310 1311 if (result[IQK_S1_RX_X] == 0) 1312 return; 1313 1314 tmp_rx_iqi |= FIELD_PREP(BIT_MASK_RXIQ_S1_X, result[IQK_S1_RX_X]); 1315 tmp_rx_iqi |= FIELD_PREP(BIT_MASK_RXIQ_S1_Y1, result[IQK_S1_RX_Y]); 1316 rtw_write32(rtwdev, REG_A_RXIQI, tmp_rx_iqi); 1317 rtw_write32_mask(rtwdev, REG_RXIQK_MATRIX_LSB_11N, BIT_MASK_RXIQ_S1_Y2, 1318 BIT_SET_RXIQ_S1_Y2(result[IQK_S1_RX_Y])); 1319 } 1320 1321 static void rtw8703b_phy_calibration(struct rtw_dev *rtwdev) 1322 { 1323 /* For some reason path A is called S1 and B S0 in shared 1324 * rtw88 calibration data. 1325 */ 1326 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1327 struct rtw8723x_iqk_backup_regs backup; 1328 u8 final_candidate = IQK_ROUND_INVALID; 1329 s32 result[IQK_ROUND_SIZE][IQK_NR]; 1330 bool good; 1331 u8 i, j; 1332 1333 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] Start!\n"); 1334 1335 memset(result, 0, sizeof(result)); 1336 1337 rtw8723x_iqk_backup_path_ctrl(rtwdev, &backup); 1338 rtw8723x_iqk_backup_lte_path_gnt(rtwdev, &backup); 1339 rtw8723x_iqk_backup_regs(rtwdev, &backup); 1340 1341 for (i = IQK_ROUND_0; i <= IQK_ROUND_2; i++) { 1342 rtw8723x_iqk_config_path_ctrl(rtwdev); 1343 rtw8723x_iqk_config_lte_path_gnt(rtwdev, IQK_LTE_WRITE_VAL_8703B); 1344 1345 rtw8703b_iqk_one_round(rtwdev, result, i, &backup); 1346 1347 rtw_dbg(rtwdev, RTW_DBG_RFK, 1348 "[IQK] back to BB mode, load original values!\n"); 1349 if (i > IQK_ROUND_0) 1350 rtw8723x_iqk_restore_regs(rtwdev, &backup); 1351 rtw8723x_iqk_restore_lte_path_gnt(rtwdev, &backup); 1352 rtw8723x_iqk_restore_path_ctrl(rtwdev, &backup); 1353 1354 for (j = IQK_ROUND_0; j < i; j++) { 1355 good = rtw8723x_iqk_similarity_cmp(rtwdev, result, j, i); 1356 1357 if (good) { 1358 final_candidate = j; 1359 rtw_dbg(rtwdev, RTW_DBG_RFK, 1360 "[IQK] cmp %d:%d final_candidate is %x\n", 1361 j, i, final_candidate); 1362 goto iqk_done; 1363 } 1364 } 1365 } 1366 1367 if (final_candidate == IQK_ROUND_INVALID) { 1368 s32 reg_tmp = 0; 1369 1370 for (i = 0; i < IQK_NR; i++) 1371 reg_tmp += result[IQK_ROUND_HYBRID][i]; 1372 1373 if (reg_tmp != 0) { 1374 final_candidate = IQK_ROUND_HYBRID; 1375 } else { 1376 WARN(1, "IQK failed\n"); 1377 goto out; 1378 } 1379 } 1380 1381 iqk_done: 1382 /* only path A is calibrated in rtl8703b */ 1383 rtw8703b_iqk_fill_a_matrix(rtwdev, result[final_candidate]); 1384 1385 dm_info->iqk.result.s1_x = result[final_candidate][IQK_S1_TX_X]; 1386 dm_info->iqk.result.s1_y = result[final_candidate][IQK_S1_TX_Y]; 1387 dm_info->iqk.result.s0_x = result[final_candidate][IQK_S0_TX_X]; 1388 dm_info->iqk.result.s0_y = result[final_candidate][IQK_S0_TX_Y]; 1389 dm_info->iqk.done = true; 1390 1391 out: 1392 rtw_write32(rtwdev, REG_BB_SEL_BTG, backup.bb_sel_btg); 1393 1394 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] final_candidate is %x\n", 1395 final_candidate); 1396 1397 for (i = IQK_ROUND_0; i < IQK_ROUND_SIZE; i++) 1398 rtw_dbg(rtwdev, RTW_DBG_RFK, 1399 "[IQK] Result %u: rege94_s1=%x rege9c_s1=%x regea4_s1=%x regeac_s1=%x rege94_s0=%x rege9c_s0=%x regea4_s0=%x regeac_s0=%x %s\n", 1400 i, 1401 result[i][0], result[i][1], result[i][2], result[i][3], 1402 result[i][4], result[i][5], result[i][6], result[i][7], 1403 final_candidate == i ? "(final candidate)" : ""); 1404 1405 rtw_dbg(rtwdev, RTW_DBG_RFK, 1406 "[IQK] 0xc80 = 0x%x 0xc94 = 0x%x 0xc14 = 0x%x 0xca0 = 0x%x\n", 1407 rtw_read32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE), 1408 rtw_read32(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N), 1409 rtw_read32(rtwdev, REG_A_RXIQI), 1410 rtw_read32(rtwdev, REG_RXIQK_MATRIX_LSB_11N)); 1411 rtw_dbg(rtwdev, RTW_DBG_RFK, 1412 "[IQK] 0xcd0 = 0x%x 0xcd4 = 0x%x 0xcd8 = 0x%x\n", 1413 rtw_read32(rtwdev, REG_TXIQ_AB_S0), 1414 rtw_read32(rtwdev, REG_TXIQ_CD_S0), 1415 rtw_read32(rtwdev, REG_RXIQ_AB_S0)); 1416 1417 rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] Finished.\n"); 1418 } 1419 1420 static void rtw8703b_set_iqk_matrix_by_result(struct rtw_dev *rtwdev, 1421 u32 ofdm_swing, u8 rf_path) 1422 { 1423 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1424 s32 ele_A, ele_D, ele_C; 1425 s32 ele_A_ext, ele_C_ext, ele_D_ext; 1426 s32 iqk_result_x; 1427 s32 iqk_result_y; 1428 s32 value32; 1429 1430 switch (rf_path) { 1431 default: 1432 case RF_PATH_A: 1433 iqk_result_x = dm_info->iqk.result.s1_x; 1434 iqk_result_y = dm_info->iqk.result.s1_y; 1435 break; 1436 case RF_PATH_B: 1437 iqk_result_x = dm_info->iqk.result.s0_x; 1438 iqk_result_y = dm_info->iqk.result.s0_y; 1439 break; 1440 } 1441 1442 /* new element D */ 1443 ele_D = OFDM_SWING_D(ofdm_swing); 1444 iqk_mult(iqk_result_x, ele_D, &ele_D_ext); 1445 /* new element A */ 1446 iqk_result_x = iqkxy_to_s32(iqk_result_x); 1447 ele_A = iqk_mult(iqk_result_x, ele_D, &ele_A_ext); 1448 /* new element C */ 1449 iqk_result_y = iqkxy_to_s32(iqk_result_y); 1450 ele_C = iqk_mult(iqk_result_y, ele_D, &ele_C_ext); 1451 1452 switch (rf_path) { 1453 case RF_PATH_A: 1454 default: 1455 /* write new elements A, C, D, and element B is always 0 */ 1456 value32 = BIT_SET_TXIQ_ELM_ACD(ele_A, ele_C, ele_D); 1457 rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, value32); 1458 value32 = BIT_SET_TXIQ_ELM_C1(ele_C); 1459 rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS, 1460 value32); 1461 value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD); 1462 value32 &= ~BIT_MASK_OFDM0_EXTS; 1463 value32 |= BIT_SET_OFDM0_EXTS(ele_A_ext, ele_C_ext, ele_D_ext); 1464 rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32); 1465 break; 1466 1467 case RF_PATH_B: 1468 /* write new elements A, C, D, and element B is always 0 */ 1469 value32 = BIT_SET_TXIQ_ELM_ACD(ele_A, ele_C, ele_D); 1470 rtw_write32(rtwdev, REG_OFDM_0_XB_TX_IQ_IMBALANCE, value32); 1471 value32 = BIT_SET_TXIQ_ELM_C1(ele_C); 1472 rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXB_LSB2_11N, MASKH4BITS, 1473 value32); 1474 value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD); 1475 value32 &= ~BIT_MASK_OFDM0_EXTS_B; 1476 value32 |= BIT_SET_OFDM0_EXTS_B(ele_A_ext, ele_C_ext, ele_D_ext); 1477 rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32); 1478 break; 1479 } 1480 } 1481 1482 static void rtw8703b_set_iqk_matrix(struct rtw_dev *rtwdev, s8 ofdm_index, 1483 u8 rf_path) 1484 { 1485 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1486 s32 value32; 1487 u32 ofdm_swing; 1488 1489 ofdm_index = clamp_t(s8, ofdm_index, 0, RTW_OFDM_SWING_TABLE_SIZE - 1); 1490 1491 ofdm_swing = rtw8703b_ofdm_swing_table[ofdm_index]; 1492 1493 if (dm_info->iqk.done) { 1494 rtw8703b_set_iqk_matrix_by_result(rtwdev, ofdm_swing, rf_path); 1495 return; 1496 } 1497 1498 switch (rf_path) { 1499 case RF_PATH_A: 1500 default: 1501 rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, ofdm_swing); 1502 rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS, 1503 0x00); 1504 1505 value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD); 1506 value32 &= ~BIT_MASK_OFDM0_EXTS; 1507 rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32); 1508 break; 1509 1510 case RF_PATH_B: 1511 rtw_write32(rtwdev, REG_OFDM_0_XB_TX_IQ_IMBALANCE, ofdm_swing); 1512 rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXB_LSB2_11N, MASKH4BITS, 1513 0x00); 1514 1515 value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD); 1516 value32 &= ~BIT_MASK_OFDM0_EXTS_B; 1517 rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32); 1518 break; 1519 } 1520 } 1521 1522 static void rtw8703b_pwrtrack_set_ofdm_pwr(struct rtw_dev *rtwdev, s8 swing_idx, 1523 s8 txagc_idx) 1524 { 1525 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1526 1527 dm_info->txagc_remnant_ofdm[RF_PATH_A] = txagc_idx; 1528 1529 /* Only path A is calibrated for rtl8703b */ 1530 rtw8703b_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A); 1531 } 1532 1533 static void rtw8703b_pwrtrack_set_cck_pwr(struct rtw_dev *rtwdev, s8 swing_idx, 1534 s8 txagc_idx) 1535 { 1536 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1537 1538 dm_info->txagc_remnant_cck = txagc_idx; 1539 1540 swing_idx = clamp_t(s8, swing_idx, 0, RTW_CCK_SWING_TABLE_SIZE - 1); 1541 1542 BUILD_BUG_ON(ARRAY_SIZE(rtw8703b_cck_pwr_regs) 1543 != ARRAY_SIZE(rtw8703b_cck_swing_table[0])); 1544 1545 for (int i = 0; i < ARRAY_SIZE(rtw8703b_cck_pwr_regs); i++) 1546 rtw_write8(rtwdev, rtw8703b_cck_pwr_regs[i], 1547 rtw8703b_cck_swing_table[swing_idx][i]); 1548 } 1549 1550 static void rtw8703b_pwrtrack_set(struct rtw_dev *rtwdev, u8 path) 1551 { 1552 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1553 struct rtw_hal *hal = &rtwdev->hal; 1554 u8 limit_ofdm; 1555 u8 limit_cck = 21; 1556 s8 final_ofdm_swing_index; 1557 s8 final_cck_swing_index; 1558 1559 limit_ofdm = rtw8723x_pwrtrack_get_limit_ofdm(rtwdev); 1560 1561 final_ofdm_swing_index = dm_info->default_ofdm_index + 1562 dm_info->delta_power_index[path]; 1563 final_cck_swing_index = dm_info->default_cck_index + 1564 dm_info->delta_power_index[path]; 1565 1566 if (final_ofdm_swing_index > limit_ofdm) 1567 rtw8703b_pwrtrack_set_ofdm_pwr(rtwdev, limit_ofdm, 1568 final_ofdm_swing_index - limit_ofdm); 1569 else if (final_ofdm_swing_index < 0) 1570 rtw8703b_pwrtrack_set_ofdm_pwr(rtwdev, 0, 1571 final_ofdm_swing_index); 1572 else 1573 rtw8703b_pwrtrack_set_ofdm_pwr(rtwdev, final_ofdm_swing_index, 0); 1574 1575 if (final_cck_swing_index > limit_cck) 1576 rtw8703b_pwrtrack_set_cck_pwr(rtwdev, limit_cck, 1577 final_cck_swing_index - limit_cck); 1578 else if (final_cck_swing_index < 0) 1579 rtw8703b_pwrtrack_set_cck_pwr(rtwdev, 0, 1580 final_cck_swing_index); 1581 else 1582 rtw8703b_pwrtrack_set_cck_pwr(rtwdev, final_cck_swing_index, 0); 1583 1584 rtw_phy_set_tx_power_level(rtwdev, hal->current_channel); 1585 } 1586 1587 static void rtw8703b_phy_pwrtrack(struct rtw_dev *rtwdev) 1588 { 1589 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1590 struct rtw_swing_table swing_table; 1591 u8 thermal_value, delta, path; 1592 bool do_iqk = false; 1593 1594 rtw_phy_config_swing_table(rtwdev, &swing_table); 1595 1596 if (rtwdev->efuse.thermal_meter[0] == 0xff) 1597 return; 1598 1599 thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00); 1600 1601 rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A); 1602 1603 do_iqk = rtw_phy_pwrtrack_need_iqk(rtwdev); 1604 1605 if (do_iqk) 1606 rtw8723x_lck(rtwdev); 1607 1608 if (dm_info->pwr_trk_init_trigger) 1609 dm_info->pwr_trk_init_trigger = false; 1610 else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value, 1611 RF_PATH_A)) 1612 goto iqk; 1613 1614 delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A); 1615 1616 delta = min_t(u8, delta, RTW_PWR_TRK_TBL_SZ - 1); 1617 1618 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { 1619 s8 delta_cur, delta_last; 1620 1621 delta_last = dm_info->delta_power_index[path]; 1622 delta_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, &swing_table, 1623 path, RF_PATH_A, delta); 1624 if (delta_last == delta_cur) 1625 continue; 1626 1627 dm_info->delta_power_index[path] = delta_cur; 1628 rtw8703b_pwrtrack_set(rtwdev, path); 1629 } 1630 1631 rtw8723x_pwrtrack_set_xtal(rtwdev, RF_PATH_A, delta); 1632 1633 iqk: 1634 if (do_iqk) 1635 rtw8703b_phy_calibration(rtwdev); 1636 } 1637 1638 static void rtw8703b_pwr_track(struct rtw_dev *rtwdev) 1639 { 1640 struct rtw_efuse *efuse = &rtwdev->efuse; 1641 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1642 1643 if (efuse->power_track_type != 0) { 1644 rtw_warn(rtwdev, "unsupported power track type"); 1645 return; 1646 } 1647 1648 if (!dm_info->pwr_trk_triggered) { 1649 rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, 1650 GENMASK(17, 16), 0x03); 1651 dm_info->pwr_trk_triggered = true; 1652 return; 1653 } 1654 1655 rtw8703b_phy_pwrtrack(rtwdev); 1656 dm_info->pwr_trk_triggered = false; 1657 } 1658 1659 static void rtw8703b_coex_set_gnt_fix(struct rtw_dev *rtwdev) 1660 { 1661 } 1662 1663 static void rtw8703b_coex_set_gnt_debug(struct rtw_dev *rtwdev) 1664 { 1665 } 1666 1667 static void rtw8703b_coex_set_rfe_type(struct rtw_dev *rtwdev) 1668 { 1669 struct rtw_coex *coex = &rtwdev->coex; 1670 struct rtw_coex_rfe *coex_rfe = &coex->rfe; 1671 1672 coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option; 1673 coex_rfe->ant_switch_polarity = 0; 1674 coex_rfe->ant_switch_exist = false; 1675 coex_rfe->ant_switch_with_bt = false; 1676 coex_rfe->ant_switch_diversity = false; 1677 coex_rfe->wlg_at_btg = true; 1678 1679 /* disable LTE coex on wifi side */ 1680 rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0x0); 1681 rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff); 1682 rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff); 1683 } 1684 1685 static void rtw8703b_coex_set_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr) 1686 { 1687 } 1688 1689 static void rtw8703b_coex_set_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain) 1690 { 1691 } 1692 1693 static const u8 rtw8703b_pwrtrk_2gb_n[] = { 1694 0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 1695 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11 1696 }; 1697 1698 static const u8 rtw8703b_pwrtrk_2gb_p[] = { 1699 0, 1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 7, 1700 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15 1701 }; 1702 1703 static const u8 rtw8703b_pwrtrk_2ga_n[] = { 1704 0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 1705 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11 1706 }; 1707 1708 static const u8 rtw8703b_pwrtrk_2ga_p[] = { 1709 0, 1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 7, 1710 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15 1711 }; 1712 1713 static const u8 rtw8703b_pwrtrk_2g_cck_b_n[] = { 1714 0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 1715 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11 1716 }; 1717 1718 static const u8 rtw8703b_pwrtrk_2g_cck_b_p[] = { 1719 0, 0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6, 1720 7, 7, 8, 8, 8, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13 1721 }; 1722 1723 static const u8 rtw8703b_pwrtrk_2g_cck_a_n[] = { 1724 0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 1725 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11 1726 }; 1727 1728 static const u8 rtw8703b_pwrtrk_2g_cck_a_p[] = { 1729 0, 0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6, 1730 7, 7, 8, 8, 8, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13 1731 }; 1732 1733 static const s8 rtw8703b_pwrtrk_xtal_n[] = { 1734 0, 0, 0, -1, -1, -1, -1, -2, -2, -2, -3, -3, -3, -3, -3, 1735 -4, -2, -2, -1, -1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 1736 }; 1737 1738 static const s8 rtw8703b_pwrtrk_xtal_p[] = { 1739 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 1, 0, -1, -1, -1, 1740 -2, -3, -7, -9, -10, -11, -14, -16, -18, -20, -22, -24, -26, -28, -30 1741 }; 1742 1743 static const struct rtw_pwr_track_tbl rtw8703b_rtw_pwr_track_tbl = { 1744 .pwrtrk_2gb_n = rtw8703b_pwrtrk_2gb_n, 1745 .pwrtrk_2gb_p = rtw8703b_pwrtrk_2gb_p, 1746 .pwrtrk_2ga_n = rtw8703b_pwrtrk_2ga_n, 1747 .pwrtrk_2ga_p = rtw8703b_pwrtrk_2ga_p, 1748 .pwrtrk_2g_cckb_n = rtw8703b_pwrtrk_2g_cck_b_n, 1749 .pwrtrk_2g_cckb_p = rtw8703b_pwrtrk_2g_cck_b_p, 1750 .pwrtrk_2g_ccka_n = rtw8703b_pwrtrk_2g_cck_a_n, 1751 .pwrtrk_2g_ccka_p = rtw8703b_pwrtrk_2g_cck_a_p, 1752 .pwrtrk_xtal_n = rtw8703b_pwrtrk_xtal_n, 1753 .pwrtrk_xtal_p = rtw8703b_pwrtrk_xtal_p, 1754 }; 1755 1756 static const struct rtw_rfe_def rtw8703b_rfe_defs[] = { 1757 [0] = { .phy_pg_tbl = &rtw8703b_bb_pg_tbl, 1758 .txpwr_lmt_tbl = &rtw8703b_txpwr_lmt_tbl, 1759 .pwr_track_tbl = &rtw8703b_rtw_pwr_track_tbl, }, 1760 }; 1761 1762 /* Shared-Antenna Coex Table */ 1763 static const struct coex_table_para table_sant_8703b[] = { 1764 {0xffffffff, 0xffffffff}, /* case-0 */ 1765 {0x55555555, 0x55555555}, 1766 {0x66555555, 0x66555555}, 1767 {0xaaaaaaaa, 0xaaaaaaaa}, 1768 {0x5a5a5a5a, 0x5a5a5a5a}, 1769 {0xfafafafa, 0xfafafafa}, /* case-5 */ 1770 {0x6a5a5555, 0xaaaaaaaa}, 1771 {0x6a5a56aa, 0x6a5a56aa}, 1772 {0x6a5a5a5a, 0x6a5a5a5a}, 1773 {0x66555555, 0x5a5a5a5a}, 1774 {0x66555555, 0x6a5a5a5a}, /* case-10 */ 1775 {0x66555555, 0x6a5a5aaa}, 1776 {0x66555555, 0x5a5a5aaa}, 1777 {0x66555555, 0x6aaa5aaa}, 1778 {0x66555555, 0xaaaa5aaa}, 1779 {0x66555555, 0xaaaaaaaa}, /* case-15 */ 1780 {0xffff55ff, 0xfafafafa}, 1781 {0xffff55ff, 0x6afa5afa}, 1782 {0xaaffffaa, 0xfafafafa}, 1783 {0xaa5555aa, 0x5a5a5a5a}, 1784 {0xaa5555aa, 0x6a5a5a5a}, /* case-20 */ 1785 {0xaa5555aa, 0xaaaaaaaa}, 1786 {0xffffffff, 0x5a5a5a5a}, 1787 {0xffffffff, 0x5a5a5a5a}, 1788 {0xffffffff, 0x55555555}, 1789 {0xffffffff, 0x5a5a5aaa}, /* case-25 */ 1790 {0x55555555, 0x5a5a5a5a}, 1791 {0x55555555, 0xaaaaaaaa}, 1792 {0x55555555, 0x6a5a6a5a}, 1793 {0x66556655, 0x66556655}, 1794 {0x66556aaa, 0x6a5a6aaa}, /* case-30 */ 1795 {0xffffffff, 0x5aaa5aaa}, 1796 {0x56555555, 0x5a5a5aaa}, 1797 }; 1798 1799 /* Shared-Antenna TDMA */ 1800 static const struct coex_tdma_para tdma_sant_8703b[] = { 1801 { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */ 1802 { {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */ 1803 { {0x61, 0x3a, 0x03, 0x11, 0x11} }, 1804 { {0x61, 0x30, 0x03, 0x11, 0x11} }, 1805 { {0x61, 0x20, 0x03, 0x11, 0x11} }, 1806 { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */ 1807 { {0x61, 0x45, 0x03, 0x11, 0x10} }, 1808 { {0x61, 0x3a, 0x03, 0x11, 0x10} }, 1809 { {0x61, 0x30, 0x03, 0x11, 0x10} }, 1810 { {0x61, 0x20, 0x03, 0x11, 0x10} }, 1811 { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */ 1812 { {0x61, 0x08, 0x03, 0x11, 0x14} }, 1813 { {0x61, 0x08, 0x03, 0x10, 0x14} }, 1814 { {0x51, 0x08, 0x03, 0x10, 0x54} }, 1815 { {0x51, 0x08, 0x03, 0x10, 0x55} }, 1816 { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */ 1817 { {0x51, 0x45, 0x03, 0x10, 0x50} }, 1818 { {0x51, 0x3a, 0x03, 0x10, 0x50} }, 1819 { {0x51, 0x30, 0x03, 0x10, 0x50} }, 1820 { {0x51, 0x20, 0x03, 0x10, 0x50} }, 1821 { {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */ 1822 { {0x51, 0x4a, 0x03, 0x10, 0x50} }, 1823 { {0x51, 0x0c, 0x03, 0x10, 0x54} }, 1824 { {0x55, 0x08, 0x03, 0x10, 0x54} }, 1825 { {0x65, 0x10, 0x03, 0x11, 0x10} }, 1826 { {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */ 1827 { {0x51, 0x08, 0x03, 0x10, 0x50} }, 1828 { {0x61, 0x08, 0x03, 0x11, 0x11} }, 1829 }; 1830 1831 static const struct rtw_chip_ops rtw8703b_ops = { 1832 .power_on = rtw_power_on, 1833 .power_off = rtw_power_off, 1834 .mac_init = rtw8723x_mac_init, 1835 .dump_fw_crash = NULL, 1836 .shutdown = NULL, 1837 .read_efuse = rtw8703b_read_efuse, 1838 .phy_set_param = rtw8703b_phy_set_param, 1839 .set_channel = rtw8703b_set_channel, 1840 .query_phy_status = query_phy_status, 1841 .read_rf = rtw_phy_read_rf_sipi, 1842 .write_rf = rtw_phy_write_rf_reg_sipi, 1843 .set_tx_power_index = rtw8723x_set_tx_power_index, 1844 .set_antenna = NULL, 1845 .cfg_ldo25 = rtw8723x_cfg_ldo25, 1846 .efuse_grant = rtw8723x_efuse_grant, 1847 .set_ampdu_factor = NULL, 1848 .false_alarm_statistics = rtw8723x_false_alarm_statistics, 1849 .phy_calibration = rtw8703b_phy_calibration, 1850 .dpk_track = NULL, 1851 /* 8723d uses REG_CSRATIO to set dm_info.cck_pd_default, which 1852 * is used in its cck_pd_set function. According to comments 1853 * in the vendor driver code it doesn't exist in this chip 1854 * generation, only 0xa0a ("ODM_CCK_PD_THRESH", which is only 1855 * *written* to). 1856 */ 1857 .cck_pd_set = NULL, 1858 .pwr_track = rtw8703b_pwr_track, 1859 .config_bfee = NULL, 1860 .set_gid_table = NULL, 1861 .cfg_csi_rate = NULL, 1862 .adaptivity_init = NULL, 1863 .adaptivity = NULL, 1864 .cfo_init = NULL, 1865 .cfo_track = NULL, 1866 .config_tx_path = NULL, 1867 .config_txrx_mode = NULL, 1868 .fill_txdesc_checksum = rtw8723x_fill_txdesc_checksum, 1869 1870 /* for coex */ 1871 .coex_set_init = rtw8723x_coex_cfg_init, 1872 .coex_set_ant_switch = NULL, 1873 .coex_set_gnt_fix = rtw8703b_coex_set_gnt_fix, 1874 .coex_set_gnt_debug = rtw8703b_coex_set_gnt_debug, 1875 .coex_set_rfe_type = rtw8703b_coex_set_rfe_type, 1876 .coex_set_wl_tx_power = rtw8703b_coex_set_wl_tx_power, 1877 .coex_set_wl_rx_gain = rtw8703b_coex_set_wl_rx_gain, 1878 }; 1879 1880 const struct rtw_chip_info rtw8703b_hw_spec = { 1881 .ops = &rtw8703b_ops, 1882 .id = RTW_CHIP_TYPE_8703B, 1883 1884 .fw_name = "rtw88/rtw8703b_fw.bin", 1885 .wlan_cpu = RTW_WCPU_8051, 1886 .tx_pkt_desc_sz = 40, 1887 .tx_buf_desc_sz = 16, 1888 .rx_pkt_desc_sz = 24, 1889 .rx_buf_desc_sz = 8, 1890 .phy_efuse_size = 256, 1891 .log_efuse_size = 512, 1892 .ptct_efuse_size = 15, 1893 .txff_size = 32768, 1894 .rxff_size = 16384, 1895 .rsvd_drv_pg_num = 8, 1896 .band = RTW_BAND_2G, 1897 .page_size = TX_PAGE_SIZE, 1898 .csi_buf_pg_num = 0, 1899 .dig_min = 0x20, 1900 .txgi_factor = 1, 1901 .is_pwr_by_rate_dec = true, 1902 .rx_ldpc = false, 1903 .tx_stbc = false, 1904 .max_power_index = 0x3f, 1905 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16, 1906 .usb_tx_agg_desc_num = 1, /* Not sure if this chip has USB interface */ 1907 .hw_feature_report = true, 1908 .c2h_ra_report_size = 7, 1909 .old_datarate_fb_limit = true, 1910 1911 .path_div_supported = false, 1912 .ht_supported = true, 1913 .vht_supported = false, 1914 .lps_deep_mode_supported = 0, 1915 1916 .sys_func_en = 0xFD, 1917 .pwr_on_seq = card_enable_flow_8703b, 1918 .pwr_off_seq = card_disable_flow_8703b, 1919 .rqpn_table = rqpn_table_8703b, 1920 .prioq_addrs = &rtw8723x_common.prioq_addrs, 1921 .page_table = page_table_8703b, 1922 /* used only in pci.c, not needed for SDIO devices */ 1923 .intf_table = NULL, 1924 1925 .dig = rtw8723x_common.dig, 1926 .dig_cck = rtw8723x_common.dig_cck, 1927 1928 .rf_sipi_addr = {0x840, 0x844}, 1929 .rf_sipi_read_addr = rtw8723x_common.rf_sipi_addr, 1930 .fix_rf_phy_num = 2, 1931 .ltecoex_addr = &rtw8723x_common.ltecoex_addr, 1932 1933 .mac_tbl = &rtw8703b_mac_tbl, 1934 .agc_tbl = &rtw8703b_agc_tbl, 1935 .bb_tbl = &rtw8703b_bb_tbl, 1936 .rf_tbl = {&rtw8703b_rf_a_tbl}, 1937 1938 .rfe_defs = rtw8703b_rfe_defs, 1939 .rfe_defs_size = ARRAY_SIZE(rtw8703b_rfe_defs), 1940 1941 .iqk_threshold = 8, 1942 1943 /* WOWLAN firmware exists, but not implemented yet */ 1944 .wow_fw_name = "rtw88/rtw8703b_wow_fw.bin", 1945 .wowlan_stub = NULL, 1946 .max_scan_ie_len = IEEE80211_MAX_DATA_LEN, 1947 1948 /* Vendor driver has a time-based format, converted from 1949 * 20180330 1950 */ 1951 .coex_para_ver = 0x0133ed6a, 1952 .bt_desired_ver = 0x1c, 1953 .scbd_support = true, 1954 .new_scbd10_def = true, 1955 .ble_hid_profile_support = false, 1956 .wl_mimo_ps_support = false, 1957 .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF, 1958 .bt_rssi_type = COEX_BTRSSI_RATIO, 1959 .ant_isolation = 15, 1960 .rssi_tolerance = 2, 1961 .bt_rssi_step = bt_rssi_step_8703b, 1962 .wl_rssi_step = wl_rssi_step_8703b, 1963 /* sant -> shared antenna, nsant -> non-shared antenna 1964 * Not sure if 8703b versions with non-shard antenna even exist. 1965 */ 1966 .table_sant_num = ARRAY_SIZE(table_sant_8703b), 1967 .table_sant = table_sant_8703b, 1968 .table_nsant_num = 0, 1969 .table_nsant = NULL, 1970 .tdma_sant_num = ARRAY_SIZE(tdma_sant_8703b), 1971 .tdma_sant = tdma_sant_8703b, 1972 .tdma_nsant_num = 0, 1973 .tdma_nsant = NULL, 1974 .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8703b), 1975 .wl_rf_para_tx = rf_para_tx_8703b, 1976 .wl_rf_para_rx = rf_para_rx_8703b, 1977 .bt_afh_span_bw20 = 0x20, 1978 .bt_afh_span_bw40 = 0x30, 1979 .afh_5g_num = ARRAY_SIZE(afh_5g_8703b), 1980 .afh_5g = afh_5g_8703b, 1981 /* REG_BTG_SEL doesn't seem to have a counterpart in the 1982 * vendor driver. Mathematically it's REG_PAD_CTRL1 + 3. 1983 * 1984 * It is used in the cardemu_to_act power sequence by though 1985 * (by address, 0x0067), comment: "0x67[0] = 0 to disable 1986 * BT_GPS_SEL pins" That seems to fit. 1987 */ 1988 .btg_reg = NULL, 1989 /* These registers are used to read (and print) from if 1990 * CONFIG_RTW88_DEBUGFS is enabled. 1991 */ 1992 .coex_info_hw_regs_num = 0, 1993 .coex_info_hw_regs = NULL, 1994 }; 1995 EXPORT_SYMBOL(rtw8703b_hw_spec); 1996 1997 MODULE_FIRMWARE("rtw88/rtw8703b_fw.bin"); 1998 MODULE_FIRMWARE("rtw88/rtw8703b_wow_fw.bin"); 1999 2000 MODULE_AUTHOR("Fiona Klute <fiona.klute@gmx.de>"); 2001 MODULE_DESCRIPTION("Realtek 802.11n wireless 8703b driver"); 2002 MODULE_LICENSE("Dual BSD/GPL"); 2003