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 Khalifar23bu_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 Khalifar23bu_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 Khalifar23bu_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