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)61r23bu_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)73r23bu_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)81r23bu_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