1*551b7c5eSAhmad Khalifa /*
2*551b7c5eSAhmad Khalifa * Copyright (c) 2026 Ahmad Khalifa <vexeduxr@FreeBSD.org>
3*551b7c5eSAhmad Khalifa *
4*551b7c5eSAhmad Khalifa * SPDX-License-Identifier: BSD-2-Clause
5*551b7c5eSAhmad Khalifa */
6*551b7c5eSAhmad Khalifa
7*551b7c5eSAhmad Khalifa #include <sys/param.h>
8*551b7c5eSAhmad Khalifa #include <sys/lock.h>
9*551b7c5eSAhmad Khalifa #include <sys/mutex.h>
10*551b7c5eSAhmad Khalifa #include <sys/mbuf.h>
11*551b7c5eSAhmad Khalifa #include <sys/kernel.h>
12*551b7c5eSAhmad Khalifa #include <sys/socket.h>
13*551b7c5eSAhmad Khalifa #include <sys/systm.h>
14*551b7c5eSAhmad Khalifa #include <sys/malloc.h>
15*551b7c5eSAhmad Khalifa #include <sys/queue.h>
16*551b7c5eSAhmad Khalifa #include <sys/taskqueue.h>
17*551b7c5eSAhmad Khalifa #include <sys/bus.h>
18*551b7c5eSAhmad Khalifa #include <sys/endian.h>
19*551b7c5eSAhmad Khalifa #include <sys/linker.h>
20*551b7c5eSAhmad Khalifa
21*551b7c5eSAhmad Khalifa #include <net/if.h>
22*551b7c5eSAhmad Khalifa #include <net/ethernet.h>
23*551b7c5eSAhmad Khalifa #include <net/if_media.h>
24*551b7c5eSAhmad Khalifa
25*551b7c5eSAhmad Khalifa #include <net80211/ieee80211_var.h>
26*551b7c5eSAhmad Khalifa #include <net80211/ieee80211_radiotap.h>
27*551b7c5eSAhmad Khalifa
28*551b7c5eSAhmad Khalifa #include <dev/rtwn/if_rtwnreg.h>
29*551b7c5eSAhmad Khalifa #include <dev/rtwn/if_rtwnvar.h>
30*551b7c5eSAhmad Khalifa
31*551b7c5eSAhmad Khalifa #include <dev/rtwn/rtl8188e/r88e_reg.h>
32*551b7c5eSAhmad Khalifa
33*551b7c5eSAhmad Khalifa #include <dev/rtwn/rtl8192c/r92c_reg.h>
34*551b7c5eSAhmad Khalifa
35*551b7c5eSAhmad Khalifa #include <dev/rtwn/rtl8723b/r23b.h>
36*551b7c5eSAhmad Khalifa
37*551b7c5eSAhmad Khalifa void
r23b_rf_write(struct rtwn_softc * sc,int chain,uint8_t addr,uint32_t val)38*551b7c5eSAhmad Khalifa r23b_rf_write(struct rtwn_softc *sc, int chain, uint8_t addr, uint32_t val)
39*551b7c5eSAhmad Khalifa {
40*551b7c5eSAhmad Khalifa uint32_t reg;
41*551b7c5eSAhmad Khalifa
42*551b7c5eSAhmad Khalifa rtwn_write_4(sc, R92C_LSSI_PARAM(chain),
43*551b7c5eSAhmad Khalifa SM(R88E_LSSI_PARAM_ADDR, addr) | SM(R92C_LSSI_PARAM_DATA, val));
44*551b7c5eSAhmad Khalifa
45*551b7c5eSAhmad Khalifa /*
46*551b7c5eSAhmad Khalifa * The vendor driver claims that writing to 0xb6 may fail under high
47*551b7c5eSAhmad Khalifa * temperature conditions, but only attempts to retry during RF init.
48*551b7c5eSAhmad Khalifa *
49*551b7c5eSAhmad Khalifa * It is not mentioned why 0xb2 is also special.
50*551b7c5eSAhmad Khalifa */
51*551b7c5eSAhmad Khalifa switch (addr) {
52*551b7c5eSAhmad Khalifa case 0xb6:
53*551b7c5eSAhmad Khalifa rtwn_delay(sc, 1);
54*551b7c5eSAhmad Khalifa
55*551b7c5eSAhmad Khalifa reg = rtwn_rf_read(sc, chain, addr);
56*551b7c5eSAhmad Khalifa rtwn_delay(sc, 1);
57*551b7c5eSAhmad Khalifa
58*551b7c5eSAhmad Khalifa for (int retry = 0; (reg & ~0xff) != (val & ~0xff) &&
59*551b7c5eSAhmad Khalifa retry < 6; retry++) {
60*551b7c5eSAhmad Khalifa rtwn_write_4(sc, R92C_LSSI_PARAM(chain),
61*551b7c5eSAhmad Khalifa SM(R88E_LSSI_PARAM_ADDR, addr) |
62*551b7c5eSAhmad Khalifa SM(R92C_LSSI_PARAM_DATA, val));
63*551b7c5eSAhmad Khalifa rtwn_delay(sc, 1);
64*551b7c5eSAhmad Khalifa
65*551b7c5eSAhmad Khalifa reg = rtwn_rf_read(sc, chain, addr);
66*551b7c5eSAhmad Khalifa }
67*551b7c5eSAhmad Khalifa break;
68*551b7c5eSAhmad Khalifa case 0xb2:
69*551b7c5eSAhmad Khalifa rtwn_delay(sc, 1);
70*551b7c5eSAhmad Khalifa
71*551b7c5eSAhmad Khalifa reg = rtwn_rf_read(sc, chain, addr);
72*551b7c5eSAhmad Khalifa rtwn_delay(sc, 1);
73*551b7c5eSAhmad Khalifa
74*551b7c5eSAhmad Khalifa for (int retry = 0; reg != val && retry < 6; retry++) {
75*551b7c5eSAhmad Khalifa rtwn_write_4(sc, R92C_LSSI_PARAM(chain),
76*551b7c5eSAhmad Khalifa SM(R88E_LSSI_PARAM_ADDR, addr) |
77*551b7c5eSAhmad Khalifa SM(R92C_LSSI_PARAM_DATA, val));
78*551b7c5eSAhmad Khalifa rtwn_delay(sc, 1);
79*551b7c5eSAhmad Khalifa
80*551b7c5eSAhmad Khalifa rtwn_rf_write(sc, chain, R92C_RF_CHNLBW, 0x0fc07);
81*551b7c5eSAhmad Khalifa rtwn_delay(sc, 1);
82*551b7c5eSAhmad Khalifa
83*551b7c5eSAhmad Khalifa reg = rtwn_rf_read(sc, chain, addr);
84*551b7c5eSAhmad Khalifa }
85*551b7c5eSAhmad Khalifa break;
86*551b7c5eSAhmad Khalifa }
87*551b7c5eSAhmad Khalifa }
88