1300016Sadrian/*
2300016Sadrian
3300016Sadrian  Broadcom B43 wireless driver
4300016Sadrian
5300016Sadrian  N-PHY core code.
6300016Sadrian
7300016Sadrian  Copyright (c) 2008 Michael Buesch <m@bues.ch>
8300016Sadrian  Copyright (c) 2010 Rafa�� Mi��ecki <zajec5@gmail.com>
9300016Sadrian  Copyright (c) 2016 Adrian Chadd <adrian@FreeBSD.org>
10300016Sadrian
11300016Sadrian  This program is free software; you can redistribute it and/or modify
12300016Sadrian  it under the terms of the GNU General Public License as published by
13300016Sadrian  the Free Software Foundation; either version 2 of the License, or
14300016Sadrian  (at your option) any later version.
15300016Sadrian
16300016Sadrian  This program is distributed in the hope that it will be useful,
17300016Sadrian  but WITHOUT ANY WARRANTY; without even the implied warranty of
18300016Sadrian  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19300016Sadrian  GNU General Public License for more details.
20300016Sadrian
21300016Sadrian  You should have received a copy of the GNU General Public License
22300016Sadrian  along with this program; see the file COPYING.  If not, write to
23300016Sadrian  the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
24300016Sadrian  Boston, MA 02110-1301, USA.
25300016Sadrian
26300016Sadrian*/
27300016Sadrian
28300016Sadrian/*
29300016Sadrian * $FreeBSD$
30300016Sadrian */
31300016Sadrian
32300016Sadrian#ifndef	__IF_BWN_PHY_N_CORE_H__
33300016Sadrian#define	__IF_BWN_PHY_N_CORE_H__
34300016Sadrian
35300016Sadrianstruct bwn_mac;
36300016Sadrian
37300016Sadrianenum b43_nphy_spur_avoid {
38300016Sadrian	BWN_SPUR_AVOID_DISABLE,
39300016Sadrian	BWN_SPUR_AVOID_AUTO,
40300016Sadrian	BWN_SPUR_AVOID_FORCE,
41300016Sadrian};
42300016Sadrian
43300016Sadrian/*
44300016Sadrian * TODO: determine whether center_freq is the primary
45300016Sadrian * channel centre frequency or the actual centre centre
46300016Sadrian * frequency (eg radio tuning.)  It /looks/ like it's
47300016Sadrian * actual channel centre.
48300016Sadrian */
49300016Sadrianstruct bwn_chanspec {
50300016Sadrian	uint16_t center_freq;
51300016Sadrian	/* This is HT40U, HT40D, HT20, no-HT 20, etc */
52300016Sadrian	bwn_chan_type_t channel_type;
53300016Sadrian};
54300016Sadrian
55300016Sadrianstruct bwn_phy_n_iq_comp {
56300016Sadrian	int16_t a0;
57300016Sadrian	int16_t b0;
58300016Sadrian	int16_t a1;
59300016Sadrian	int16_t b1;
60300016Sadrian};
61300016Sadrian
62300016Sadrianstruct bwn_phy_n_rssical_cache {
63300016Sadrian	uint16_t rssical_radio_regs_2G[2];
64300016Sadrian	uint16_t rssical_phy_regs_2G[12];
65300016Sadrian
66300016Sadrian	uint16_t rssical_radio_regs_5G[2];
67300016Sadrian	uint16_t rssical_phy_regs_5G[12];
68300016Sadrian};
69300016Sadrian
70300016Sadrianstruct bwn_phy_n_cal_cache {
71300016Sadrian	uint16_t txcal_radio_regs_2G[8];
72300016Sadrian	uint16_t txcal_coeffs_2G[8];
73300016Sadrian	struct bwn_phy_n_iq_comp rxcal_coeffs_2G;
74300016Sadrian
75300016Sadrian	uint16_t txcal_radio_regs_5G[8];
76300016Sadrian	uint16_t txcal_coeffs_5G[8];
77300016Sadrian	struct bwn_phy_n_iq_comp rxcal_coeffs_5G;
78300016Sadrian};
79300016Sadrian
80300016Sadrianstruct bwn_phy_n_txpwrindex {
81300016Sadrian	int8_t index;
82300016Sadrian	int8_t index_internal;
83300016Sadrian	int8_t index_internal_save;
84300016Sadrian	uint16_t AfectrlOverride;
85300016Sadrian	uint16_t AfeCtrlDacGain;
86300016Sadrian	uint16_t rad_gain;
87300016Sadrian	uint8_t bbmult;
88300016Sadrian	uint16_t iqcomp_a;
89300016Sadrian	uint16_t iqcomp_b;
90300016Sadrian	uint16_t locomp;
91300016Sadrian};
92300016Sadrian
93300016Sadrianstruct bwn_phy_n_pwr_ctl_info {
94300016Sadrian	uint8_t idle_tssi_2g;
95300016Sadrian	uint8_t idle_tssi_5g;
96300016Sadrian};
97300016Sadrian
98300016Sadrianstruct bwn_phy_n {
99300016Sadrian	uint8_t antsel_type;
100300016Sadrian	uint8_t cal_orig_pwr_idx[2];
101300016Sadrian	uint8_t measure_hold;
102300016Sadrian	uint8_t phyrxchain;
103300016Sadrian	uint8_t hw_phyrxchain;
104300016Sadrian	uint8_t hw_phytxchain;
105300016Sadrian	uint8_t perical;
106300016Sadrian	uint32_t deaf_count;
107300016Sadrian	uint32_t rxcalparams;
108300016Sadrian	bool hang_avoid;
109300016Sadrian	bool mute;
110300016Sadrian	uint16_t papd_epsilon_offset[2];
111300016Sadrian	int32_t preamble_override;
112300016Sadrian	uint32_t bb_mult_save;
113300016Sadrian
114300016Sadrian	bool gain_boost;
115300016Sadrian	bool elna_gain_config;
116300016Sadrian	bool band5g_pwrgain;
117300016Sadrian	bool use_int_tx_iq_lo_cal;
118300016Sadrian	bool lpf_bw_overrode_for_sample_play;
119300016Sadrian
120300016Sadrian	uint8_t mphase_cal_phase_id;
121300016Sadrian	uint16_t mphase_txcal_cmdidx;
122300016Sadrian	uint16_t mphase_txcal_numcmds;
123300016Sadrian	uint16_t mphase_txcal_bestcoeffs[11];
124300016Sadrian
125300016Sadrian	bool txpwrctrl;
126300016Sadrian	bool pwg_gain_5ghz;
127300016Sadrian	uint8_t tx_pwr_idx[2];
128300016Sadrian	int8_t tx_power_offset[101];
129300016Sadrian	uint16_t adj_pwr_tbl[84];
130300016Sadrian	uint16_t txcal_bbmult;
131300016Sadrian	uint16_t txiqlocal_bestc[11];
132300016Sadrian	bool txiqlocal_coeffsvalid;
133300016Sadrian	struct bwn_phy_n_txpwrindex txpwrindex[2];
134300016Sadrian	struct bwn_phy_n_pwr_ctl_info pwr_ctl_info[2];
135300016Sadrian	struct bwn_chanspec txiqlocal_chanspec;
136300016Sadrian	struct bwn_ppr tx_pwr_max_ppr;
137300016Sadrian	uint16_t tx_pwr_last_recalc_freq;
138300016Sadrian	int tx_pwr_last_recalc_limit;
139300016Sadrian
140300016Sadrian	uint8_t txrx_chain;
141300016Sadrian	uint16_t tx_rx_cal_phy_saveregs[11];
142300016Sadrian	uint16_t tx_rx_cal_radio_saveregs[22];
143300016Sadrian
144300016Sadrian	uint16_t rfctrl_intc1_save;
145300016Sadrian	uint16_t rfctrl_intc2_save;
146300016Sadrian
147300016Sadrian	uint16_t classifier_state;
148300016Sadrian	uint16_t clip_state[2];
149300016Sadrian
150300016Sadrian	enum b43_nphy_spur_avoid spur_avoid;
151300016Sadrian	bool aband_spurwar_en;
152300016Sadrian	bool gband_spurwar_en;
153300016Sadrian
154300016Sadrian	bool ipa2g_on;
155300016Sadrian	struct bwn_chanspec iqcal_chanspec_2G;
156300016Sadrian	struct bwn_chanspec rssical_chanspec_2G;
157300016Sadrian
158300016Sadrian	bool ipa5g_on;
159300016Sadrian	struct bwn_chanspec iqcal_chanspec_5G;
160300016Sadrian	struct bwn_chanspec rssical_chanspec_5G;
161300016Sadrian
162300016Sadrian	struct bwn_phy_n_rssical_cache rssical_cache;
163300016Sadrian	struct bwn_phy_n_cal_cache cal_cache;
164300016Sadrian	bool crsminpwr_adjusted;
165300016Sadrian	bool noisevars_adjusted;
166300016Sadrian};
167300016Sadrian
168300016Sadrianextern	bwn_txpwr_result_t bwn_nphy_op_recalc_txpower(struct bwn_mac *mac, bool ignore_tssi);
169300016Sadrianextern	int bwn_nphy_op_allocate(struct bwn_mac *mac);
170300016Sadrianextern	void bwn_nphy_op_prepare_structs(struct bwn_mac *mac);
171300016Sadrianextern	void bwn_nphy_op_free(struct bwn_mac *mac);
172300016Sadrianextern	int bwn_nphy_op_init(struct bwn_mac *mac);
173300016Sadrianextern	void bwn_nphy_op_maskset(struct bwn_mac *mac, uint16_t reg, uint16_t mask, uint16_t set);
174300016Sadrianextern	uint16_t bwn_nphy_op_radio_read(struct bwn_mac *mac, uint16_t reg);
175300016Sadrianextern	void bwn_nphy_op_radio_write(struct bwn_mac *mac, uint16_t reg, uint16_t value);
176300016Sadrianextern	void bwn_nphy_op_software_rfkill(struct bwn_mac *mac, bool blocked);
177300016Sadrianextern	void bwn_nphy_op_switch_analog(struct bwn_mac *mac, bool on);
178300016Sadrianextern	int bwn_nphy_op_switch_channel(struct bwn_mac *mac, unsigned int new_channel);
179300016Sadrianextern	unsigned int bwn_nphy_op_get_default_chan(struct bwn_mac *mac);
180300016Sadrian
181300016Sadrian#endif	/* __IF_BWN_PHY_N_CORE_H__ */
182