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