xref: /freebsd/sys/dev/rtwn/rtl8723b/usb/r23bu_attach.c (revision 551b7c5e12bfea623a47edf97ad5689732a1233f)
1 /*
2  * Copyright (c) 2026 Ahmad Khalifa <vexeduxr@FreeBSD.org>
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  */
6 
7 #include <sys/param.h>
8 #include <sys/lock.h>
9 #include <sys/mutex.h>
10 #include <sys/mbuf.h>
11 #include <sys/kernel.h>
12 #include <sys/socket.h>
13 #include <sys/systm.h>
14 #include <sys/malloc.h>
15 #include <sys/queue.h>
16 #include <sys/taskqueue.h>
17 #include <sys/bus.h>
18 #include <sys/endian.h>
19 #include <sys/linker.h>
20 
21 #include <net/if.h>
22 #include <net/ethernet.h>
23 #include <net/if_media.h>
24 
25 #include <net80211/ieee80211_var.h>
26 #include <net80211/ieee80211_radiotap.h>
27 
28 #include <dev/rtwn/if_rtwnreg.h>
29 #include <dev/rtwn/if_rtwnvar.h>
30 #include <dev/rtwn/if_rtwn_nop.h>
31 
32 #include <dev/rtwn/usb/rtwn_usb_var.h>
33 
34 #include <dev/rtwn/rtl8188e/r88e.h>
35 
36 #include <dev/rtwn/rtl8192c/r92c.h>
37 #include <dev/rtwn/rtl8192c/r92c_reg.h>
38 
39 #include <dev/rtwn/rtl8192c/usb/r92cu.h>
40 
41 #include <dev/rtwn/rtl8192e/r92e.h>
42 #include <dev/rtwn/rtl8192e/r92e_var.h>
43 
44 #include <dev/rtwn/rtl8723b/r23b.h>
45 #include <dev/rtwn/rtl8723b/r23b_var.h>
46 #include <dev/rtwn/rtl8723b/r23b_priv.h>
47 
48 #include <dev/rtwn/rtl8723b/usb/r23bu.h>
49 
50 #include <dev/rtwn/rtl8812a/r12a_tx_desc.h>
51 
52 #include <dev/rtwn/rtl8812a/usb/r12au.h>
53 
54 #include <dev/rtwn/rtl8821a/r21a_reg.h>
55 
56 #include <dev/rtwn/rtl8821a/usb/r21au.h>
57 
58 void	r23bu_attach(struct rtwn_usb_softc *);
59 
60 static void
r23bu_attach_private(struct rtwn_softc * sc)61 r23bu_attach_private(struct rtwn_softc *sc)
62 {
63 	struct r23b_softc *rs;
64 
65 	sc->sc_priv = rs = malloc(sizeof(struct r23b_softc),
66 	    M_RTWN_PRIV, M_WAITOK | M_ZERO);
67 
68 	rs->super.ac_usb_dma_size = 0x3;
69 	rs->super.ac_usb_dma_time = 0x20;
70 }
71 
72 static void
r23bu_detach_private(struct rtwn_softc * sc)73 r23bu_detach_private(struct rtwn_softc *sc)
74 {
75 	struct r23b_softc *rs = sc->sc_priv;
76 
77 	free(rs, M_RTWN_PRIV);
78 }
79 
80 void
r23bu_attach(struct rtwn_usb_softc * uc)81 r23bu_attach(struct rtwn_usb_softc *uc)
82 {
83 	struct rtwn_softc *sc = &uc->uc_sc;
84 
85 	/* USB part. */
86 	uc->uc_align_rx			= r12au_align_rx;
87 	uc->tx_agg_desc_num		= 0x6;
88 
89 	/* Common part. */
90 	sc->sc_flags			= RTWN_FLAG_EXT_HDR;
91 
92 	sc->sc_set_chan			= r92e_set_chan;
93 	sc->sc_fill_tx_desc		= r12a_fill_tx_desc;
94 	sc->sc_fill_tx_desc_raw		= r12a_fill_tx_desc_raw;
95 	sc->sc_fill_tx_desc_null	= r12a_fill_tx_desc_null;
96 	sc->sc_dump_tx_desc		= r12au_dump_tx_desc;
97 	sc->sc_tx_radiotap_flags	= r12a_tx_radiotap_flags;
98 	sc->sc_rx_radiotap_flags	= r12a_rx_radiotap_flags;
99 	sc->sc_get_rx_stats		= r12a_get_rx_stats;
100 	sc->sc_get_rssi_cck		= r23b_get_rssi_cck;
101 	sc->sc_get_rssi_ofdm		= r88e_get_rssi_ofdm;
102 	sc->sc_classify_intr		= r12au_classify_intr;
103 	sc->sc_handle_tx_report		= r12a_ratectl_tx_complete;
104 	sc->sc_handle_tx_report2	= rtwn_nop_softc_uint8_int;
105 	sc->sc_handle_c2h_report	= r92e_handle_c2h_report;
106 	sc->sc_check_frame		= rtwn_nop_int_softc_mbuf;
107 	sc->sc_rf_read			= r92e_rf_read;
108 	sc->sc_rf_write			= r23b_rf_write;
109 	sc->sc_check_condition		= r92c_check_condition;
110 	sc->sc_efuse_postread		= rtwn_nop_softc;
111 	sc->sc_efuse_preread		= r23b_efuse_preread;
112 	sc->sc_parse_rom		= r23bu_parse_rom;
113 	sc->sc_set_led			= r23b_set_led;
114 	sc->sc_power_on			= r23bu_power_on;
115 	sc->sc_power_off		= r23bu_power_off;
116 #ifndef RTWN_WITHOUT_UCODE
117 	sc->sc_fw_reset			= r23b_fw_reset;
118 	sc->sc_fw_download_enable	= r23b_fw_download_enable;
119 #endif
120 	sc->sc_llt_init			= r92e_llt_init;
121 	sc->sc_set_page_size		= r23b_set_page_size;
122 	sc->sc_lc_calib			= r23b_lc_calib;
123 	sc->sc_iq_calib			= r23b_iq_calib;
124 	sc->sc_read_chipid_vendor	= rtwn_nop_softc_uint32;
125 	sc->sc_adj_devcaps		= rtwn_nop_softc;
126 	sc->sc_vap_preattach		= rtwn_nop_softc_vap;
127 	sc->sc_postattach		= rtwn_nop_softc;
128 	sc->sc_detach_private		= r23bu_detach_private;
129 #ifndef RTWN_WITHOUT_UCODE
130 	sc->sc_set_media_status		= r12a_set_media_status;
131 	sc->sc_set_rsvd_page		= r88e_set_rsvd_page;
132 	sc->sc_set_pwrmode		= r12a_set_pwrmode;
133 	sc->sc_set_rssi			= rtwn_nop_softc; /* XXX TODO */
134 #else
135 	sc->sc_set_media_status		= rtwn_nop_softc_int;
136 #endif
137 	sc->sc_beacon_init		= r12a_beacon_init;
138 	sc->sc_beacon_enable		= r92c_beacon_enable;
139 	sc->sc_sta_beacon_enable	= r12a_sta_beacon_enable;
140 	sc->sc_beacon_set_rate		= r12a_beacon_set_rate;
141 	sc->sc_beacon_select		= r21a_beacon_select;
142 	sc->sc_temp_measure		= r23b_temp_measure;
143 	sc->sc_temp_read		= r88e_temp_read;
144 	sc->sc_init_tx_agg		= r21au_init_tx_agg;
145 	sc->sc_init_rx_agg		= r23bu_init_rx_agg;
146 	sc->sc_init_ampdu		= r23bu_init_ampdu;
147 	sc->sc_init_intr		= r92cu_init_intr;
148 	sc->sc_init_edca		= r92c_init_edca;
149 	sc->sc_init_bb			= r23bu_init_bb;
150 	sc->sc_init_rf			= r23b_init_rf;
151 	sc->sc_init_antsel		= r23b_init_antsel;
152 	sc->sc_post_init		= r23b_post_init;
153 	sc->sc_init_bcnq1_boundary	= rtwn_nop_int_softc;
154 	sc->sc_set_tx_power		= r92e_set_tx_power;
155 
156 	sc->mac_prog			= &rtl8723b_mac[0];
157 	sc->mac_size			= nitems(rtl8723b_mac);
158 	sc->bb_prog			= &rtl8723b_bb[0];
159 	sc->bb_size			= nitems(rtl8723b_bb);
160 	sc->agc_prog			= &rtl8723b_agc[0];
161 	sc->agc_size			= nitems(rtl8723b_agc);
162 	sc->rf_prog			= &rtl8723b_rf[0];
163 
164 	sc->name			= "RTL8723BU";
165 	sc->fwname			= "rtwn-rtl8723bufw";
166 	sc->fwsig			= 0x530;
167 
168 	sc->page_count			= R23B_TX_PAGE_COUNT;
169 	sc->pktbuf_count		= 0;			/* Unused */
170 	sc->ackto			= 0x40;
171 
172 	sc->npubqpages			= R23B_PUBQ_NPAGES;
173 	sc->nhqpages			= R23B_HPQ_NPAGES;
174 	sc->nlqpages			= R23B_LPQ_NPAGES;
175 	sc->nnqpages			= R23B_NPQ_NPAGES;
176 
177 	sc->page_size			= R92C_TX_PAGE_SIZE;
178 	sc->txdesc_len			= sizeof(struct r12a_tx_desc);
179 	sc->efuse_maxlen		= R23B_EFUSE_MAX_LEN;
180 	sc->efuse_maplen		= R23B_EFUSE_MAP_LEN;
181 	sc->rx_dma_size			= R23B_RX_DMA_BUFFER_SIZE;
182 
183 	sc->macid_limit			= R12A_MACID_MAX + 1;
184 	sc->macid_rpt2_max_num		= 2;
185 	sc->cam_entry_limit		= R12A_CAM_ENTRY_COUNT;
186 	sc->fwsize_limit		= R12A_MAX_FW_SIZE;
187 	sc->temp_delta			= R23B_CALIB_THRESHOLD;
188 
189 	sc->bcn_status_reg[0]		= R92C_TDECTRL;
190 	sc->bcn_status_reg[1]		= R21A_DWBCN1_CTRL;
191 	sc->rcr				= 0;
192 
193 	sc->ntxchains			= 1;
194 	sc->nrxchains			= 1;
195 
196 	r23bu_attach_private(sc);
197 }
198