blob: 52260b2d0eba454ef40ff1ebceb0f281e4212efb [file] [log] [blame]
Henry Ptasinskia9533e72010-09-08 21:04:42 -07001/*
2 * Copyright (c) 2010 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#ifndef _wlc_phy_h_
18#define _wlc_phy_h_
19
Henry Ptasinskia9533e72010-09-08 21:04:42 -070020#include <wlioctl.h>
21#include <siutils.h>
22#include <d11.h>
23#include <wlc_phy_shim.h>
24
25#define IDCODE_VER_MASK 0x0000000f
26#define IDCODE_VER_SHIFT 0
27#define IDCODE_MFG_MASK 0x00000fff
28#define IDCODE_MFG_SHIFT 0
29#define IDCODE_ID_MASK 0x0ffff000
30#define IDCODE_ID_SHIFT 12
31#define IDCODE_REV_MASK 0xf0000000
32#define IDCODE_REV_SHIFT 28
33
34#define NORADIO_ID 0xe4f5
35#define NORADIO_IDCODE 0x4e4f5246
36
37#define BCM2055_ID 0x2055
38#define BCM2055_IDCODE 0x02055000
39#define BCM2055A0_IDCODE 0x1205517f
40
41#define BCM2056_ID 0x2056
42#define BCM2056_IDCODE 0x02056000
43#define BCM2056A0_IDCODE 0x1205617f
44
45#define BCM2057_ID 0x2057
46#define BCM2057_IDCODE 0x02057000
47#define BCM2057A0_IDCODE 0x1205717f
48
49#define BCM2064_ID 0x2064
50#define BCM2064_IDCODE 0x02064000
51#define BCM2064A0_IDCODE 0x0206417f
52
Greg Kroah-Hartman0965ae82010-10-12 12:50:15 -070053#define PHY_TPC_HW_OFF false
Greg Kroah-Hartman0f0881b2010-10-12 12:15:18 -070054#define PHY_TPC_HW_ON true
Henry Ptasinskia9533e72010-09-08 21:04:42 -070055
56#define PHY_PERICAL_DRIVERUP 1
57#define PHY_PERICAL_WATCHDOG 2
58#define PHY_PERICAL_PHYINIT 3
59#define PHY_PERICAL_JOIN_BSS 4
60#define PHY_PERICAL_START_IBSS 5
61#define PHY_PERICAL_UP_BSS 6
62#define PHY_PERICAL_CHAN 7
63#define PHY_FULLCAL 8
64
65#define PHY_PERICAL_DISABLE 0
66#define PHY_PERICAL_SPHASE 1
67#define PHY_PERICAL_MPHASE 2
68#define PHY_PERICAL_MANUAL 3
69
70#define PHY_HOLD_FOR_ASSOC 1
71#define PHY_HOLD_FOR_SCAN 2
72#define PHY_HOLD_FOR_RM 4
73#define PHY_HOLD_FOR_PLT 8
74#define PHY_HOLD_FOR_MUTE 16
75#define PHY_HOLD_FOR_NOT_ASSOC 0x20
76
77#define PHY_MUTE_FOR_PREISM 1
78#define PHY_MUTE_ALL 0xffffffff
79
80#define PHY_NOISE_FIXED_VAL (-95)
81#define PHY_NOISE_FIXED_VAL_NPHY (-92)
82#define PHY_NOISE_FIXED_VAL_LCNPHY (-92)
83
84#define PHY_MODE_CAL 0x0002
85#define PHY_MODE_NOISEM 0x0004
86
87#define WLC_TXPWR_DB_FACTOR 4
88
89#define WLC_NUM_RATES_CCK 4
90#define WLC_NUM_RATES_OFDM 8
91#define WLC_NUM_RATES_MCS_1_STREAM 8
92#define WLC_NUM_RATES_MCS_2_STREAM 8
93#define WLC_NUM_RATES_MCS_3_STREAM 8
94#define WLC_NUM_RATES_MCS_4_STREAM 8
95typedef struct txpwr_limits {
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -070096 u8 cck[WLC_NUM_RATES_CCK];
97 u8 ofdm[WLC_NUM_RATES_OFDM];
Henry Ptasinskia9533e72010-09-08 21:04:42 -070098
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -070099 u8 ofdm_cdd[WLC_NUM_RATES_OFDM];
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700100
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700101 u8 ofdm_40_siso[WLC_NUM_RATES_OFDM];
102 u8 ofdm_40_cdd[WLC_NUM_RATES_OFDM];
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700103
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700104 u8 mcs_20_siso[WLC_NUM_RATES_MCS_1_STREAM];
105 u8 mcs_20_cdd[WLC_NUM_RATES_MCS_1_STREAM];
106 u8 mcs_20_stbc[WLC_NUM_RATES_MCS_1_STREAM];
107 u8 mcs_20_mimo[WLC_NUM_RATES_MCS_2_STREAM];
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700108
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700109 u8 mcs_40_siso[WLC_NUM_RATES_MCS_1_STREAM];
110 u8 mcs_40_cdd[WLC_NUM_RATES_MCS_1_STREAM];
111 u8 mcs_40_stbc[WLC_NUM_RATES_MCS_1_STREAM];
112 u8 mcs_40_mimo[WLC_NUM_RATES_MCS_2_STREAM];
113 u8 mcs32;
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700114} txpwr_limits_t;
115
116typedef struct {
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700117 u8 vec[MAXCHANNEL / NBBY];
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700118} chanvec_t;
119
120struct rpc_info;
121typedef struct shared_phy shared_phy_t;
122
123struct phy_pub;
124
125#ifdef WLC_HIGH_ONLY
126typedef struct wlc_rpc_phy wlc_phy_t;
127#else
128typedef struct phy_pub wlc_phy_t;
129#endif
130
131typedef struct shared_phy_params {
132 void *osh;
133 si_t *sih;
134 void *physhim;
135 uint unit;
136 uint corerev;
137 uint bustype;
138 uint buscorerev;
139 char *vars;
Greg Kroah-Hartman7d4df482010-10-07 17:04:47 -0700140 u16 vid;
141 u16 did;
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700142 uint chip;
143 uint chiprev;
144 uint chippkg;
145 uint sromrev;
146 uint boardtype;
147 uint boardrev;
148 uint boardvendor;
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -0700149 u32 boardflags;
150 u32 boardflags2;
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700151} shared_phy_params_t;
152
153#ifdef WLC_LOW
154
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400155extern shared_phy_t *wlc_phy_shared_attach(shared_phy_params_t *shp);
156extern void wlc_phy_shared_detach(shared_phy_t *phy_sh);
157extern wlc_phy_t *wlc_phy_attach(shared_phy_t *sh, void *regs, int bandtype,
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700158 char *vars);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400159extern void wlc_phy_detach(wlc_phy_t *ppi);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700160
Greg Kroah-Hartman7d4df482010-10-07 17:04:47 -0700161extern bool wlc_phy_get_phyversion(wlc_phy_t *pih, u16 *phytype,
162 u16 *phyrev, u16 *radioid,
163 u16 *radiover);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400164extern bool wlc_phy_get_encore(wlc_phy_t *pih);
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -0700165extern u32 wlc_phy_get_coreflags(wlc_phy_t *pih);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700166
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400167extern void wlc_phy_hw_clk_state_upd(wlc_phy_t *ppi, bool newstate);
168extern void wlc_phy_hw_state_upd(wlc_phy_t *ppi, bool newstate);
169extern void wlc_phy_init(wlc_phy_t *ppi, chanspec_t chanspec);
170extern void wlc_phy_watchdog(wlc_phy_t *ppi);
171extern int wlc_phy_down(wlc_phy_t *ppi);
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -0700172extern u32 wlc_phy_clk_bwbits(wlc_phy_t *pih);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400173extern void wlc_phy_cal_init(wlc_phy_t *ppi);
174extern void wlc_phy_antsel_init(wlc_phy_t *ppi, bool lut_init);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700175
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400176extern void wlc_phy_chanspec_set(wlc_phy_t *ppi, chanspec_t chanspec);
177extern chanspec_t wlc_phy_chanspec_get(wlc_phy_t *ppi);
178extern void wlc_phy_chanspec_radio_set(wlc_phy_t *ppi, chanspec_t newch);
Greg Kroah-Hartman7d4df482010-10-07 17:04:47 -0700179extern u16 wlc_phy_bw_state_get(wlc_phy_t *ppi);
180extern void wlc_phy_bw_state_set(wlc_phy_t *ppi, u16 bw);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700181
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400182extern void wlc_phy_rssi_compute(wlc_phy_t *pih, void *ctx);
183extern void wlc_phy_por_inform(wlc_phy_t *ppi);
184extern void wlc_phy_noise_sample_intr(wlc_phy_t *ppi);
185extern bool wlc_phy_bist_check_phy(wlc_phy_t *ppi);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700186
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400187extern void wlc_phy_set_deaf(wlc_phy_t *ppi, bool user_flag);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700188
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400189extern void wlc_phy_switch_radio(wlc_phy_t *ppi, bool on);
190extern void wlc_phy_anacore(wlc_phy_t *ppi, bool on);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700191
192#endif /* WLC_LOW */
193
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400194extern void wlc_phy_BSSinit(wlc_phy_t *ppi, bool bonlyap, int rssi);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700195
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400196extern void wlc_phy_chanspec_ch14_widefilter_set(wlc_phy_t *ppi,
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700197 bool wide_filter);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400198extern void wlc_phy_chanspec_band_validch(wlc_phy_t *ppi, uint band,
199 chanvec_t *channels);
200extern chanspec_t wlc_phy_chanspec_band_firstch(wlc_phy_t *ppi, uint band);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700201
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400202extern void wlc_phy_txpower_sromlimit(wlc_phy_t *ppi, uint chan,
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700203 u8 *_min_, u8 *_max_, int rate);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400204extern void wlc_phy_txpower_sromlimit_max_get(wlc_phy_t *ppi, uint chan,
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700205 u8 *_max_, u8 *_min_);
Greg Kroah-Hartman3e264162010-10-08 11:11:13 -0700206extern void wlc_phy_txpower_boardlimit_band(wlc_phy_t *ppi, uint band, s32 *,
207 s32 *, u32 *);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400208extern void wlc_phy_txpower_limit_set(wlc_phy_t *ppi, struct txpwr_limits *,
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700209 chanspec_t chanspec);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400210extern int wlc_phy_txpower_get(wlc_phy_t *ppi, uint *qdbm, bool *override);
211extern int wlc_phy_txpower_set(wlc_phy_t *ppi, uint qdbm, bool override);
212extern void wlc_phy_txpower_target_set(wlc_phy_t *ppi, struct txpwr_limits *);
213extern bool wlc_phy_txpower_hw_ctrl_get(wlc_phy_t *ppi);
214extern void wlc_phy_txpower_hw_ctrl_set(wlc_phy_t *ppi, bool hwpwrctrl);
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700215extern u8 wlc_phy_txpower_get_target_min(wlc_phy_t *ppi);
216extern u8 wlc_phy_txpower_get_target_max(wlc_phy_t *ppi);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400217extern bool wlc_phy_txpower_ipa_ison(wlc_phy_t *pih);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700218
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700219extern void wlc_phy_stf_chain_init(wlc_phy_t *pih, u8 txchain,
220 u8 rxchain);
221extern void wlc_phy_stf_chain_set(wlc_phy_t *pih, u8 txchain,
222 u8 rxchain);
223extern void wlc_phy_stf_chain_get(wlc_phy_t *pih, u8 *txchain,
224 u8 *rxchain);
225extern u8 wlc_phy_stf_chain_active_get(wlc_phy_t *pih);
Greg Kroah-Hartman562c8852010-10-05 11:04:17 -0700226extern s8 wlc_phy_stf_ssmode_get(wlc_phy_t *pih, chanspec_t chanspec);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400227extern void wlc_phy_ldpc_override_set(wlc_phy_t *ppi, bool val);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700228
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700229extern void wlc_phy_cal_perical(wlc_phy_t *ppi, u8 reason);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400230extern void wlc_phy_noise_sample_request_external(wlc_phy_t *ppi);
231extern void wlc_phy_edcrs_lock(wlc_phy_t *pih, bool lock);
232extern void wlc_phy_cal_papd_recal(wlc_phy_t *ppi);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700233
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700234extern void wlc_phy_ant_rxdiv_set(wlc_phy_t *ppi, u8 val);
235extern bool wlc_phy_ant_rxdiv_get(wlc_phy_t *ppi, u8 *pval);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400236extern void wlc_phy_clear_tssi(wlc_phy_t *ppi);
237extern void wlc_phy_hold_upd(wlc_phy_t *ppi, mbool id, bool val);
238extern void wlc_phy_mute_upd(wlc_phy_t *ppi, bool val, mbool flags);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700239
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700240extern void wlc_phy_antsel_type_set(wlc_phy_t *ppi, u8 antsel_type);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700241
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400242extern void wlc_phy_txpower_get_current(wlc_phy_t *ppi, tx_power_t *power,
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700243 uint channel);
244
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400245extern void wlc_phy_initcal_enable(wlc_phy_t *pih, bool initcal);
246extern bool wlc_phy_test_ison(wlc_phy_t *ppi);
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700247extern void wlc_phy_txpwr_percent_set(wlc_phy_t *ppi, u8 txpwr_percent);
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400248extern void wlc_phy_ofdm_rateset_war(wlc_phy_t *pih, bool war);
249extern void wlc_phy_bf_preempt_enable(wlc_phy_t *pih, bool bf_preempt);
Greg Kroah-Hartman66cbd3a2010-10-08 11:05:47 -0700250extern void wlc_phy_machwcap_set(wlc_phy_t *ppi, u32 machwcap);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700251
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400252extern void wlc_phy_runbist_config(wlc_phy_t *ppi, bool start_end);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700253
Jason Cooper7cc4a4c2010-09-14 09:45:30 -0400254extern void wlc_phy_freqtrack_start(wlc_phy_t *ppi);
255extern void wlc_phy_freqtrack_end(wlc_phy_t *ppi);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700256
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700257extern const u8 *wlc_phy_get_ofdm_rate_lookup(void);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700258
Greg Kroah-Hartman562c8852010-10-05 11:04:17 -0700259extern s8 wlc_phy_get_tx_power_offset_by_mcs(wlc_phy_t *ppi,
Greg Kroah-Hartmane868ab02010-10-05 10:14:26 -0700260 u8 mcs_offset);
Greg Kroah-Hartman562c8852010-10-05 11:04:17 -0700261extern s8 wlc_phy_get_tx_power_offset(wlc_phy_t *ppi, u8 tbl_offset);
Henry Ptasinskia9533e72010-09-08 21:04:42 -0700262#endif /* _wlc_phy_h_ */