xref: /freebsd/sys/dev/rtwn/rtl8812a/usb/r12au_attach.c (revision 7453645f2a9411a3f9d982b768bcc323f41cf906)
1*7453645fSAndriy Voskoboinyk /*-
2*7453645fSAndriy Voskoboinyk  * Copyright (c) 2016 Andriy Voskoboinyk <avos@FreeBSD.org>
3*7453645fSAndriy Voskoboinyk  * All rights reserved.
4*7453645fSAndriy Voskoboinyk  *
5*7453645fSAndriy Voskoboinyk  * Redistribution and use in source and binary forms, with or without
6*7453645fSAndriy Voskoboinyk  * modification, are permitted provided that the following conditions
7*7453645fSAndriy Voskoboinyk  * are met:
8*7453645fSAndriy Voskoboinyk  * 1. Redistributions of source code must retain the above copyright
9*7453645fSAndriy Voskoboinyk  *    notice, this list of conditions and the following disclaimer.
10*7453645fSAndriy Voskoboinyk  * 2. Redistributions in binary form must reproduce the above copyright
11*7453645fSAndriy Voskoboinyk  *    notice, this list of conditions and the following disclaimer in the
12*7453645fSAndriy Voskoboinyk  *    documentation and/or other materials provided with the distribution.
13*7453645fSAndriy Voskoboinyk  *
14*7453645fSAndriy Voskoboinyk  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*7453645fSAndriy Voskoboinyk  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*7453645fSAndriy Voskoboinyk  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*7453645fSAndriy Voskoboinyk  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*7453645fSAndriy Voskoboinyk  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*7453645fSAndriy Voskoboinyk  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*7453645fSAndriy Voskoboinyk  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*7453645fSAndriy Voskoboinyk  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*7453645fSAndriy Voskoboinyk  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*7453645fSAndriy Voskoboinyk  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*7453645fSAndriy Voskoboinyk  * SUCH DAMAGE.
25*7453645fSAndriy Voskoboinyk  */
26*7453645fSAndriy Voskoboinyk 
27*7453645fSAndriy Voskoboinyk #include <sys/cdefs.h>
28*7453645fSAndriy Voskoboinyk __FBSDID("$FreeBSD$");
29*7453645fSAndriy Voskoboinyk 
30*7453645fSAndriy Voskoboinyk #include "opt_wlan.h"
31*7453645fSAndriy Voskoboinyk 
32*7453645fSAndriy Voskoboinyk #include <sys/param.h>
33*7453645fSAndriy Voskoboinyk #include <sys/lock.h>
34*7453645fSAndriy Voskoboinyk #include <sys/mutex.h>
35*7453645fSAndriy Voskoboinyk #include <sys/mbuf.h>
36*7453645fSAndriy Voskoboinyk #include <sys/kernel.h>
37*7453645fSAndriy Voskoboinyk #include <sys/socket.h>
38*7453645fSAndriy Voskoboinyk #include <sys/systm.h>
39*7453645fSAndriy Voskoboinyk #include <sys/malloc.h>
40*7453645fSAndriy Voskoboinyk #include <sys/queue.h>
41*7453645fSAndriy Voskoboinyk #include <sys/taskqueue.h>
42*7453645fSAndriy Voskoboinyk #include <sys/bus.h>
43*7453645fSAndriy Voskoboinyk #include <sys/endian.h>
44*7453645fSAndriy Voskoboinyk #include <sys/linker.h>
45*7453645fSAndriy Voskoboinyk 
46*7453645fSAndriy Voskoboinyk #include <net/if.h>
47*7453645fSAndriy Voskoboinyk #include <net/if_var.h>
48*7453645fSAndriy Voskoboinyk #include <net/ethernet.h>
49*7453645fSAndriy Voskoboinyk #include <net/if_media.h>
50*7453645fSAndriy Voskoboinyk 
51*7453645fSAndriy Voskoboinyk #include <net80211/ieee80211_var.h>
52*7453645fSAndriy Voskoboinyk #include <net80211/ieee80211_radiotap.h>
53*7453645fSAndriy Voskoboinyk 
54*7453645fSAndriy Voskoboinyk #include <dev/usb/usb.h>
55*7453645fSAndriy Voskoboinyk #include <dev/usb/usbdi.h>
56*7453645fSAndriy Voskoboinyk 
57*7453645fSAndriy Voskoboinyk #include <dev/rtwn/if_rtwnreg.h>
58*7453645fSAndriy Voskoboinyk #include <dev/rtwn/if_rtwnvar.h>
59*7453645fSAndriy Voskoboinyk 
60*7453645fSAndriy Voskoboinyk #include <dev/rtwn/if_rtwn_nop.h>
61*7453645fSAndriy Voskoboinyk 
62*7453645fSAndriy Voskoboinyk #include <dev/rtwn/usb/rtwn_usb_var.h>
63*7453645fSAndriy Voskoboinyk 
64*7453645fSAndriy Voskoboinyk #include <dev/rtwn/rtl8192c/usb/r92cu.h>
65*7453645fSAndriy Voskoboinyk 
66*7453645fSAndriy Voskoboinyk #include <dev/rtwn/rtl8188e/r88e.h>
67*7453645fSAndriy Voskoboinyk 
68*7453645fSAndriy Voskoboinyk #include <dev/rtwn/rtl8812a/r12a_priv.h>
69*7453645fSAndriy Voskoboinyk #include <dev/rtwn/rtl8812a/r12a_reg.h>
70*7453645fSAndriy Voskoboinyk #include <dev/rtwn/rtl8812a/r12a_var.h>
71*7453645fSAndriy Voskoboinyk #include <dev/rtwn/rtl8812a/r12a_rom_defs.h>
72*7453645fSAndriy Voskoboinyk 
73*7453645fSAndriy Voskoboinyk #include <dev/rtwn/rtl8812a/usb/r12au.h>
74*7453645fSAndriy Voskoboinyk #include <dev/rtwn/rtl8812a/usb/r12au_tx_desc.h>
75*7453645fSAndriy Voskoboinyk 
76*7453645fSAndriy Voskoboinyk 
77*7453645fSAndriy Voskoboinyk void	r12au_attach(struct rtwn_usb_softc *);
78*7453645fSAndriy Voskoboinyk 
79*7453645fSAndriy Voskoboinyk static void
80*7453645fSAndriy Voskoboinyk r12au_postattach(struct rtwn_softc *sc)
81*7453645fSAndriy Voskoboinyk {
82*7453645fSAndriy Voskoboinyk 	struct rtwn_usb_softc *uc = RTWN_USB_SOFTC(sc);
83*7453645fSAndriy Voskoboinyk 	struct r12a_softc *rs = sc->sc_priv;
84*7453645fSAndriy Voskoboinyk 
85*7453645fSAndriy Voskoboinyk 	if (usbd_get_speed(uc->uc_udev) == USB_SPEED_SUPER) {
86*7453645fSAndriy Voskoboinyk 		rs->ac_usb_dma_size = 0x07;
87*7453645fSAndriy Voskoboinyk 		rs->ac_usb_dma_time = 0x1a;
88*7453645fSAndriy Voskoboinyk 	} else {
89*7453645fSAndriy Voskoboinyk 		rs->ac_usb_dma_size = 0x01;
90*7453645fSAndriy Voskoboinyk 		rs->ac_usb_dma_time = 0x10;
91*7453645fSAndriy Voskoboinyk 	}
92*7453645fSAndriy Voskoboinyk 
93*7453645fSAndriy Voskoboinyk 	if (rs->chip & R12A_CHIP_C_CUT)
94*7453645fSAndriy Voskoboinyk 		sc->sc_rf_read = r12a_c_cut_rf_read;
95*7453645fSAndriy Voskoboinyk 	else
96*7453645fSAndriy Voskoboinyk 		sc->sc_rf_read = r12a_rf_read;
97*7453645fSAndriy Voskoboinyk 
98*7453645fSAndriy Voskoboinyk 	if (rs->board_type == R92C_BOARD_TYPE_MINICARD ||
99*7453645fSAndriy Voskoboinyk 	    rs->board_type == R92C_BOARD_TYPE_SOLO ||
100*7453645fSAndriy Voskoboinyk 	    rs->board_type == R92C_BOARD_TYPE_COMBO)
101*7453645fSAndriy Voskoboinyk 		sc->sc_set_led = r88e_set_led;
102*7453645fSAndriy Voskoboinyk 	else
103*7453645fSAndriy Voskoboinyk 		sc->sc_set_led = r12a_set_led;
104*7453645fSAndriy Voskoboinyk 
105*7453645fSAndriy Voskoboinyk 	if (!(rs->ext_pa_2g || rs->ext_lna_2g ||
106*7453645fSAndriy Voskoboinyk 	    rs->ext_pa_5g || rs->ext_lna_5g))
107*7453645fSAndriy Voskoboinyk 		sc->mac_prog = &rtl8812au_mac_no_ext_pa_lna[0];
108*7453645fSAndriy Voskoboinyk 
109*7453645fSAndriy Voskoboinyk 	sc->sc_ic.ic_ioctl = r12a_ioctl_net;
110*7453645fSAndriy Voskoboinyk }
111*7453645fSAndriy Voskoboinyk 
112*7453645fSAndriy Voskoboinyk void
113*7453645fSAndriy Voskoboinyk r12a_vap_preattach(struct rtwn_softc *sc, struct ieee80211vap *vap)
114*7453645fSAndriy Voskoboinyk {
115*7453645fSAndriy Voskoboinyk 	struct r12a_softc *rs = sc->sc_priv;
116*7453645fSAndriy Voskoboinyk 	struct ifnet *ifp = vap->iv_ifp;
117*7453645fSAndriy Voskoboinyk 
118*7453645fSAndriy Voskoboinyk 	ifp->if_capabilities = IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6;
119*7453645fSAndriy Voskoboinyk 	RTWN_LOCK(sc);
120*7453645fSAndriy Voskoboinyk 	if (rs->rs_flags & R12A_RXCKSUM_EN)
121*7453645fSAndriy Voskoboinyk 		ifp->if_capenable |= IFCAP_RXCSUM;
122*7453645fSAndriy Voskoboinyk 	if (rs->rs_flags & R12A_RXCKSUM6_EN)
123*7453645fSAndriy Voskoboinyk 		ifp->if_capenable |= IFCAP_RXCSUM_IPV6;
124*7453645fSAndriy Voskoboinyk 	RTWN_UNLOCK(sc);
125*7453645fSAndriy Voskoboinyk }
126*7453645fSAndriy Voskoboinyk 
127*7453645fSAndriy Voskoboinyk static void
128*7453645fSAndriy Voskoboinyk r12a_attach_private(struct rtwn_softc *sc)
129*7453645fSAndriy Voskoboinyk {
130*7453645fSAndriy Voskoboinyk 	struct r12a_softc *rs;
131*7453645fSAndriy Voskoboinyk 
132*7453645fSAndriy Voskoboinyk 	rs = malloc(sizeof(struct r12a_softc), M_RTWN_PRIV, M_WAITOK | M_ZERO);
133*7453645fSAndriy Voskoboinyk 
134*7453645fSAndriy Voskoboinyk 	rs->rs_flags			= R12A_RXCKSUM_EN | R12A_RXCKSUM6_EN;
135*7453645fSAndriy Voskoboinyk 
136*7453645fSAndriy Voskoboinyk 	rs->rs_fix_spur			= r12a_fix_spur;
137*7453645fSAndriy Voskoboinyk 	rs->rs_set_band_2ghz		= r12a_set_band_2ghz;
138*7453645fSAndriy Voskoboinyk 	rs->rs_set_band_5ghz		= r12a_set_band_5ghz;
139*7453645fSAndriy Voskoboinyk 	rs->rs_init_burstlen		= r12au_init_burstlen;
140*7453645fSAndriy Voskoboinyk 	rs->rs_init_ampdu_fwhw		= r12au_init_ampdu_fwhw;
141*7453645fSAndriy Voskoboinyk 	rs->rs_crystalcap_write		= r12a_crystalcap_write;
142*7453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE
143*7453645fSAndriy Voskoboinyk 	rs->rs_iq_calib_fw_supported	= r12a_iq_calib_fw_supported;
144*7453645fSAndriy Voskoboinyk #endif
145*7453645fSAndriy Voskoboinyk 	rs->rs_iq_calib_sw		= r12a_iq_calib_sw;
146*7453645fSAndriy Voskoboinyk 
147*7453645fSAndriy Voskoboinyk 	rs->ampdu_max_time		= 0x70;
148*7453645fSAndriy Voskoboinyk 
149*7453645fSAndriy Voskoboinyk 	sc->sc_priv = rs;
150*7453645fSAndriy Voskoboinyk }
151*7453645fSAndriy Voskoboinyk 
152*7453645fSAndriy Voskoboinyk void
153*7453645fSAndriy Voskoboinyk r12a_detach_private(struct rtwn_softc *sc)
154*7453645fSAndriy Voskoboinyk {
155*7453645fSAndriy Voskoboinyk 	struct r12a_softc *rs = sc->sc_priv;
156*7453645fSAndriy Voskoboinyk 
157*7453645fSAndriy Voskoboinyk 	free(rs, M_RTWN_PRIV);
158*7453645fSAndriy Voskoboinyk }
159*7453645fSAndriy Voskoboinyk 
160*7453645fSAndriy Voskoboinyk static void
161*7453645fSAndriy Voskoboinyk r12a_read_chipid_vendor(struct rtwn_softc *sc, uint32_t reg_sys_cfg)
162*7453645fSAndriy Voskoboinyk {
163*7453645fSAndriy Voskoboinyk 	struct r12a_softc *rs = sc->sc_priv;
164*7453645fSAndriy Voskoboinyk 
165*7453645fSAndriy Voskoboinyk 	if (MS(reg_sys_cfg, R92C_SYS_CFG_CHIP_VER_RTL) == 1)
166*7453645fSAndriy Voskoboinyk 		rs->chip |= R12A_CHIP_C_CUT;
167*7453645fSAndriy Voskoboinyk }
168*7453645fSAndriy Voskoboinyk 
169*7453645fSAndriy Voskoboinyk static void
170*7453645fSAndriy Voskoboinyk r12au_adj_devcaps(struct rtwn_softc *sc)
171*7453645fSAndriy Voskoboinyk {
172*7453645fSAndriy Voskoboinyk 	/* TODO: LDPC, STBC etc */
173*7453645fSAndriy Voskoboinyk }
174*7453645fSAndriy Voskoboinyk 
175*7453645fSAndriy Voskoboinyk void
176*7453645fSAndriy Voskoboinyk r12au_attach(struct rtwn_usb_softc *uc)
177*7453645fSAndriy Voskoboinyk {
178*7453645fSAndriy Voskoboinyk 	struct rtwn_softc *sc		= &uc->uc_sc;
179*7453645fSAndriy Voskoboinyk 
180*7453645fSAndriy Voskoboinyk 	/* USB part. */
181*7453645fSAndriy Voskoboinyk 	uc->uc_align_rx			= r12au_align_rx;
182*7453645fSAndriy Voskoboinyk 	uc->tx_agg_desc_num		= 1;
183*7453645fSAndriy Voskoboinyk 
184*7453645fSAndriy Voskoboinyk 	/* Common part. */
185*7453645fSAndriy Voskoboinyk 	sc->sc_flags			= RTWN_FLAG_EXT_HDR;
186*7453645fSAndriy Voskoboinyk 
187*7453645fSAndriy Voskoboinyk 	sc->sc_set_chan			= r12a_set_chan;
188*7453645fSAndriy Voskoboinyk 	sc->sc_fill_tx_desc		= r12a_fill_tx_desc;
189*7453645fSAndriy Voskoboinyk 	sc->sc_fill_tx_desc_raw 	= r12a_fill_tx_desc_raw;
190*7453645fSAndriy Voskoboinyk 	sc->sc_fill_tx_desc_null	= r12a_fill_tx_desc_null;
191*7453645fSAndriy Voskoboinyk 	sc->sc_dump_tx_desc		= r12au_dump_tx_desc;
192*7453645fSAndriy Voskoboinyk 	sc->sc_tx_radiotap_flags	= r12a_tx_radiotap_flags;
193*7453645fSAndriy Voskoboinyk 	sc->sc_rx_radiotap_flags	= r12a_rx_radiotap_flags;
194*7453645fSAndriy Voskoboinyk 	sc->sc_get_rssi_cck		= r88e_get_rssi_cck;
195*7453645fSAndriy Voskoboinyk 	sc->sc_get_rssi_ofdm		= r88e_get_rssi_ofdm;
196*7453645fSAndriy Voskoboinyk 	sc->sc_classify_intr		= r12au_classify_intr;
197*7453645fSAndriy Voskoboinyk 	sc->sc_handle_tx_report		= r12a_ratectl_tx_complete;
198*7453645fSAndriy Voskoboinyk 	sc->sc_handle_c2h_report	= r12a_handle_c2h_report;
199*7453645fSAndriy Voskoboinyk 	sc->sc_check_frame		= r12a_check_frame_checksum;
200*7453645fSAndriy Voskoboinyk 	sc->sc_rf_write			= r12a_rf_write;
201*7453645fSAndriy Voskoboinyk 	sc->sc_check_condition		= r12a_check_condition;
202*7453645fSAndriy Voskoboinyk 	sc->sc_efuse_postread		= rtwn_nop_softc;
203*7453645fSAndriy Voskoboinyk 	sc->sc_parse_rom		= r12a_parse_rom;
204*7453645fSAndriy Voskoboinyk 	sc->sc_power_on			= r12a_power_on;
205*7453645fSAndriy Voskoboinyk 	sc->sc_power_off		= r12a_power_off;
206*7453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE
207*7453645fSAndriy Voskoboinyk 	sc->sc_fw_reset			= r12a_fw_reset;
208*7453645fSAndriy Voskoboinyk 	sc->sc_fw_download_enable	= r12a_fw_download_enable;
209*7453645fSAndriy Voskoboinyk #endif
210*7453645fSAndriy Voskoboinyk 	sc->sc_set_page_size		= r12a_set_page_size;
211*7453645fSAndriy Voskoboinyk 	sc->sc_lc_calib			= r12a_lc_calib;
212*7453645fSAndriy Voskoboinyk 	sc->sc_iq_calib			= r12a_iq_calib;
213*7453645fSAndriy Voskoboinyk 	sc->sc_read_chipid_vendor	= r12a_read_chipid_vendor;
214*7453645fSAndriy Voskoboinyk 	sc->sc_adj_devcaps		= r12au_adj_devcaps;
215*7453645fSAndriy Voskoboinyk 	sc->sc_vap_preattach		= r12a_vap_preattach;
216*7453645fSAndriy Voskoboinyk 	sc->sc_postattach		= r12au_postattach;
217*7453645fSAndriy Voskoboinyk 	sc->sc_detach_private		= r12a_detach_private;
218*7453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE
219*7453645fSAndriy Voskoboinyk 	sc->sc_set_media_status		= r12a_set_media_status;
220*7453645fSAndriy Voskoboinyk 	sc->sc_set_rsvd_page		= r88e_set_rsvd_page;
221*7453645fSAndriy Voskoboinyk 	sc->sc_set_pwrmode		= r12a_set_pwrmode;
222*7453645fSAndriy Voskoboinyk 	sc->sc_set_rssi			= rtwn_nop_softc;	/* XXX TODO */
223*7453645fSAndriy Voskoboinyk #else
224*7453645fSAndriy Voskoboinyk 	sc->sc_set_media_status		= rtwn_nop_softc_int;
225*7453645fSAndriy Voskoboinyk #endif
226*7453645fSAndriy Voskoboinyk 	sc->sc_beacon_init		= r12a_beacon_init;
227*7453645fSAndriy Voskoboinyk 	sc->sc_beacon_enable		= r92c_beacon_enable;
228*7453645fSAndriy Voskoboinyk 	sc->sc_beacon_set_rate		= r12a_beacon_set_rate;
229*7453645fSAndriy Voskoboinyk 	sc->sc_beacon_select		= rtwn_nop_softc_int;
230*7453645fSAndriy Voskoboinyk 	sc->sc_temp_measure		= r88e_temp_measure;
231*7453645fSAndriy Voskoboinyk 	sc->sc_temp_read		= r88e_temp_read;
232*7453645fSAndriy Voskoboinyk 	sc->sc_init_tx_agg		= r92cu_init_tx_agg;
233*7453645fSAndriy Voskoboinyk 	sc->sc_init_rx_agg		= r12au_init_rx_agg;
234*7453645fSAndriy Voskoboinyk 	sc->sc_init_ampdu		= r12au_init_ampdu;
235*7453645fSAndriy Voskoboinyk 	sc->sc_init_intr		= r12a_init_intr;
236*7453645fSAndriy Voskoboinyk 	sc->sc_init_edca		= r12a_init_edca;
237*7453645fSAndriy Voskoboinyk 	sc->sc_init_bb			= r12a_init_bb;
238*7453645fSAndriy Voskoboinyk 	sc->sc_init_rf			= r12a_init_rf;
239*7453645fSAndriy Voskoboinyk 	sc->sc_init_antsel		= r12a_init_antsel;
240*7453645fSAndriy Voskoboinyk 	sc->sc_post_init		= r12au_post_init;
241*7453645fSAndriy Voskoboinyk 	sc->sc_init_bcnq1_boundary	= rtwn_nop_int_softc;
242*7453645fSAndriy Voskoboinyk 
243*7453645fSAndriy Voskoboinyk 	sc->chan_list_5ghz[0]		= r12a_chan_5ghz_0;
244*7453645fSAndriy Voskoboinyk 	sc->chan_list_5ghz[1]		= r12a_chan_5ghz_1;
245*7453645fSAndriy Voskoboinyk 	sc->chan_list_5ghz[2]		= r12a_chan_5ghz_2;
246*7453645fSAndriy Voskoboinyk 	sc->chan_num_5ghz[0]		= nitems(r12a_chan_5ghz_0);
247*7453645fSAndriy Voskoboinyk 	sc->chan_num_5ghz[1]		= nitems(r12a_chan_5ghz_1);
248*7453645fSAndriy Voskoboinyk 	sc->chan_num_5ghz[2]		= nitems(r12a_chan_5ghz_2);
249*7453645fSAndriy Voskoboinyk 
250*7453645fSAndriy Voskoboinyk 	sc->mac_prog			= &rtl8812au_mac[0];
251*7453645fSAndriy Voskoboinyk 	sc->mac_size			= nitems(rtl8812au_mac);
252*7453645fSAndriy Voskoboinyk 	sc->bb_prog			= &rtl8812au_bb[0];
253*7453645fSAndriy Voskoboinyk 	sc->bb_size			= nitems(rtl8812au_bb);
254*7453645fSAndriy Voskoboinyk 	sc->agc_prog			= &rtl8812au_agc[0];
255*7453645fSAndriy Voskoboinyk 	sc->agc_size			= nitems(rtl8812au_agc);
256*7453645fSAndriy Voskoboinyk 	sc->rf_prog			= &rtl8812au_rf[0];
257*7453645fSAndriy Voskoboinyk 
258*7453645fSAndriy Voskoboinyk 	sc->name			= "RTL8812AU";
259*7453645fSAndriy Voskoboinyk 	sc->fwname			= "rtwn-rtl8812aufw";
260*7453645fSAndriy Voskoboinyk 	sc->fwsig			= 0x950;
261*7453645fSAndriy Voskoboinyk 
262*7453645fSAndriy Voskoboinyk 	sc->page_count			= R12A_TX_PAGE_COUNT;
263*7453645fSAndriy Voskoboinyk 	sc->pktbuf_count		= R12A_TXPKTBUF_COUNT;
264*7453645fSAndriy Voskoboinyk 
265*7453645fSAndriy Voskoboinyk 	sc->ackto			= 0x80;
266*7453645fSAndriy Voskoboinyk 	sc->npubqpages			= R12A_PUBQ_NPAGES;
267*7453645fSAndriy Voskoboinyk 	sc->page_size			= R12A_TX_PAGE_SIZE;
268*7453645fSAndriy Voskoboinyk 
269*7453645fSAndriy Voskoboinyk 	sc->txdesc_len			= sizeof(struct r12au_tx_desc);
270*7453645fSAndriy Voskoboinyk 	sc->efuse_maxlen		= R12A_EFUSE_MAX_LEN;
271*7453645fSAndriy Voskoboinyk 	sc->efuse_maplen		= R12A_EFUSE_MAP_LEN;
272*7453645fSAndriy Voskoboinyk 	sc->rx_dma_size			= R12A_RX_DMA_BUFFER_SIZE;
273*7453645fSAndriy Voskoboinyk 
274*7453645fSAndriy Voskoboinyk 	sc->macid_limit			= R12A_MACID_MAX + 1;
275*7453645fSAndriy Voskoboinyk 	sc->cam_entry_limit		= R12A_CAM_ENTRY_COUNT;
276*7453645fSAndriy Voskoboinyk 	sc->fwsize_limit		= R12A_MAX_FW_SIZE;
277*7453645fSAndriy Voskoboinyk 	sc->temp_delta			= R88E_CALIB_THRESHOLD;
278*7453645fSAndriy Voskoboinyk 
279*7453645fSAndriy Voskoboinyk 	sc->bcn_status_reg[0]		= R92C_TDECTRL;
280*7453645fSAndriy Voskoboinyk 	sc->bcn_status_reg[1]		= R92C_TDECTRL;
281*7453645fSAndriy Voskoboinyk 	sc->rcr				= R12A_RCR_DIS_CHK_14 |
282*7453645fSAndriy Voskoboinyk 					  R12A_RCR_VHT_ACK |
283*7453645fSAndriy Voskoboinyk 					  R12A_RCR_TCP_OFFLD_EN;
284*7453645fSAndriy Voskoboinyk 
285*7453645fSAndriy Voskoboinyk 	sc->ntxchains			= 2;
286*7453645fSAndriy Voskoboinyk 	sc->nrxchains			= 2;
287*7453645fSAndriy Voskoboinyk 
288*7453645fSAndriy Voskoboinyk 	r12a_attach_private(sc);
289*7453645fSAndriy Voskoboinyk }
290