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/rtl8192c/r92c.h>
32*551b7c5eSAhmad Khalifa #include <dev/rtwn/rtl8192c/r92c_reg.h>
33*551b7c5eSAhmad Khalifa
34*551b7c5eSAhmad Khalifa #include <dev/rtwn/rtl8192e/r92e.h>
35*551b7c5eSAhmad Khalifa
36*551b7c5eSAhmad Khalifa #include <dev/rtwn/rtl8723b/r23b.h>
37*551b7c5eSAhmad Khalifa
38*551b7c5eSAhmad Khalifa #ifndef RTWN_WITHOUT_UCODE
39*551b7c5eSAhmad Khalifa void
r23b_fw_reset(struct rtwn_softc * sc,int reason)40*551b7c5eSAhmad Khalifa r23b_fw_reset(struct rtwn_softc *sc, int reason)
41*551b7c5eSAhmad Khalifa {
42*551b7c5eSAhmad Khalifa switch (reason) {
43*551b7c5eSAhmad Khalifa case RTWN_FW_RESET_DOWNLOAD:
44*551b7c5eSAhmad Khalifa case RTWN_FW_RESET_SHUTDOWN:
45*551b7c5eSAhmad Khalifa return (r92c_fw_reset(sc, reason));
46*551b7c5eSAhmad Khalifa case RTWN_FW_RESET_CHECKSUM:
47*551b7c5eSAhmad Khalifa return (r92e_fw_reset(sc, reason));
48*551b7c5eSAhmad Khalifa }
49*551b7c5eSAhmad Khalifa }
50*551b7c5eSAhmad Khalifa
51*551b7c5eSAhmad Khalifa void
r23b_fw_download_enable(struct rtwn_softc * sc,int enable)52*551b7c5eSAhmad Khalifa r23b_fw_download_enable(struct rtwn_softc *sc, int enable)
53*551b7c5eSAhmad Khalifa {
54*551b7c5eSAhmad Khalifa if (!enable) {
55*551b7c5eSAhmad Khalifa /* MCU download disable. */
56*551b7c5eSAhmad Khalifa rtwn_setbits_1(sc, R92C_MCUFWDL, R92C_MCUFWDL_EN, 0);
57*551b7c5eSAhmad Khalifa return;
58*551b7c5eSAhmad Khalifa }
59*551b7c5eSAhmad Khalifa
60*551b7c5eSAhmad Khalifa /* 8051 enable. */
61*551b7c5eSAhmad Khalifa rtwn_setbits_1_shift(sc, R92C_SYS_FUNC_EN, 0,
62*551b7c5eSAhmad Khalifa R92C_SYS_FUNC_EN_CPUEN, 1);
63*551b7c5eSAhmad Khalifa /* MCU firmware download enable. */
64*551b7c5eSAhmad Khalifa rtwn_setbits_1(sc, R92C_MCUFWDL, 0, R92C_MCUFWDL_EN);
65*551b7c5eSAhmad Khalifa
66*551b7c5eSAhmad Khalifa for (int ntries = 0; ntries <= 100; ntries++) {
67*551b7c5eSAhmad Khalifa uint8_t val;
68*551b7c5eSAhmad Khalifa
69*551b7c5eSAhmad Khalifa val = rtwn_read_1(sc, R92C_MCUFWDL);
70*551b7c5eSAhmad Khalifa if (val & R92C_MCUFWDL_EN)
71*551b7c5eSAhmad Khalifa break;
72*551b7c5eSAhmad Khalifa
73*551b7c5eSAhmad Khalifa rtwn_write_1(sc, R92C_MCUFWDL, val | R92C_MCUFWDL_EN);
74*551b7c5eSAhmad Khalifa rtwn_delay(sc, 1000);
75*551b7c5eSAhmad Khalifa }
76*551b7c5eSAhmad Khalifa
77*551b7c5eSAhmad Khalifa /* 8051 reset. */
78*551b7c5eSAhmad Khalifa rtwn_setbits_1_shift(sc, R92C_MCUFWDL, R92C_MCUFWDL_ROM_DLEN,
79*551b7c5eSAhmad Khalifa 0, 2);
80*551b7c5eSAhmad Khalifa }
81*551b7c5eSAhmad Khalifa #endif
82