nrelease - fix/improve livecd
[dragonfly.git] / sys / dev / netif / iwn / if_iwn_chip_cfg.h
1 /*-
2  * Copyright (c) 2013 Cedric GROSS <cg@cgross.info>
3  * Copyright (c) 2011 Intel Corporation
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  *
17  * $FreeBSD$
18  */
19
20 #ifndef __IF_IWN_CHIP_CFG_H__
21 #define __IF_IWN_CHIP_CFG_H__
22
23 /* ==========================================================================
24  *                                  NIC PARAMETERS
25  *
26  * ==========================================================================
27  */
28
29 /*
30  * Flags for managing calibration result. See calib_need
31  * in iwn_base_params struct
32  *
33  * These are bitmasks that determine which indexes in the calibcmd
34  * array are pushed up.
35  */
36 #define IWN_FLG_NEED_PHY_CALIB_DC               (1<<0)
37 #define IWN_FLG_NEED_PHY_CALIB_LO               (1<<1)
38 #define IWN_FLG_NEED_PHY_CALIB_TX_IQ            (1<<2)
39 #define IWN_FLG_NEED_PHY_CALIB_TX_IQ_PERIODIC   (1<<3)
40 #define IWN_FLG_NEED_PHY_CALIB_BASE_BAND        (1<<4)
41 /*
42  * These aren't (yet) included in the calibcmd array, but
43  * are used as flags for which calibrations to use.
44  *
45  * XXX I think they should be named differently and
46  * stuffed in a different member in the config struct!
47  */
48 #define IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET      (1<<5)
49 #define IWN_FLG_NEED_PHY_CALIB_CRYSTAL          (1<<6)
50 #define IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSETv2    (1<<7)
51
52 /*
53  * Each chip has a different threshold for PLCP errors that should trigger a
54  * retune.
55  */
56 #define IWN_PLCP_ERR_DEFAULT_THRESHOLD          50
57 #define IWN_PLCP_ERR_LONG_THRESHOLD             100
58 #define IWN_PLCP_ERR_EXT_LONG_THRESHOLD         200
59
60 /*
61  * Define some parameters for managing different NIC.
62  * Refer to linux specific file like iwl-xxxx.c to determine correct value
63  * for NIC.
64  *
65  * @max_ll_items: max number of OTP blocks
66  * @shadow_ram_support: shadow support for OTP memory
67  * @shadow_reg_enable: HW shadhow register bit
68  * @no_idle_support: do not support idle mode
69  * @advanced_bt_coexist : Advanced BT management
70  * @bt_session_2 : NIC need a new struct for configure BT coexistence. Needed
71  *   only if advanced_bt_coexist is true
72  * @bt_sco_disable :
73  * @additional_nic_config: For 6005 series
74  * @iq_invert : ? But need it for N 2000 series
75  * @regulatory_bands : XXX
76  * @enhanced_TX_power : EEPROM Has advanced TX power options. Set 'True'
77  *    if update_enhanced_txpower = iwl_eeprom_enhanced_txpower.
78  *    See iwl-agn-devices.c file to determine that(enhanced_txpower)
79  * @need_temp_offset_calib : Need to compute some temp offset for calibration.
80  * @calib_need : Use IWN_FLG_NEED_PHY_CALIB_* flags to specify which
81  *    calibration data ucode need. See calib_init_cfg in iwl-xxxx.c
82  *    linux kernel file
83  * @support_hostap: Define IEEE80211_C_HOSTAP for ic_caps
84  * @no_multi_vaps: See iwn_vap_create
85  * @additional_gp_drv_bit : Specific bit to defined during nic_config
86  * @bt_mode: BT configuration mode
87  */
88 enum bt_mode_enum {
89         IWN_BT_NONE,
90         IWN_BT_SIMPLE,
91         IWN_BT_ADVANCED
92 };
93
94 struct iwn_base_params {
95         uint32_t        pll_cfg_val;
96         const uint16_t  max_ll_items;
97 #define IWN_OTP_MAX_LL_ITEMS_1000               (3)     /* OTP blocks for 1000 */
98 #define IWN_OTP_MAX_LL_ITEMS_6x00               (4)     /* OTP blocks for 6x00 */
99 #define IWN_OTP_MAX_LL_ITEMS_6x50               (7)     /* OTP blocks for 6x50 */
100 #define IWN_OTP_MAX_LL_ITEMS_2x00               (4)     /* OTP blocks for 2x00 */
101         const bool      shadow_ram_support;
102         const bool      shadow_reg_enable;
103         const bool      bt_session_2;
104         const bool      bt_sco_disable;
105         const bool      additional_nic_config;
106         const uint32_t  *regulatory_bands;
107         const bool      enhanced_TX_power;
108         const uint16_t  calib_need;
109         const bool      support_hostap;
110         const bool      no_multi_vaps;
111         uint8_t additional_gp_drv_bit;
112         enum bt_mode_enum       bt_mode;
113         uint32_t        plcp_err_threshold;
114 };
115
116 static const struct iwn_base_params iwn5000_base_params = {
117         .pll_cfg_val = IWN_ANA_PLL_INIT,        /* pll_cfg_val; */
118         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_6x00,      /* max_ll_items */
119         .shadow_ram_support = false,    /* shadow_ram_support */
120         .shadow_reg_enable = false,     /* shadow_reg_enable */
121         .bt_session_2 = false,  /* bt_session_2 */
122         .bt_sco_disable = true, /* bt_sco_disable */
123         .additional_nic_config = false, /* additional_nic_config */
124         .regulatory_bands = iwn5000_regulatory_bands,   /* regulatory_bands */
125         .enhanced_TX_power = false,     /* enhanced_TX_power */
126         .calib_need =
127             ( IWN_FLG_NEED_PHY_CALIB_LO
128             | IWN_FLG_NEED_PHY_CALIB_TX_IQ_PERIODIC
129             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
130             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND ),
131         .support_hostap = false,        /* support_hostap */
132         .no_multi_vaps = true,  /* no_multi_vaps */
133         .additional_gp_drv_bit = IWN_GP_DRIVER_NONE,    /* additional_gp_drv_bit */
134         .bt_mode = IWN_BT_NONE, /* bt_mode */
135         .plcp_err_threshold = IWN_PLCP_ERR_LONG_THRESHOLD,
136 };
137
138 /*
139  * 4965 support
140  */
141 static const struct iwn_base_params iwn4965_base_params = {
142         .pll_cfg_val = 0,                               /* pll_cfg_val; */
143         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_6x00,      /* max_ll_items - ignored for 4965 */
144         .shadow_ram_support = true,     /* shadow_ram_support */
145         .shadow_reg_enable = false,     /* shadow_reg_enable */
146         .bt_session_2 = false,  /* bt_session_2 XXX unknown? */
147         .bt_sco_disable = true, /* bt_sco_disable XXX unknown? */
148         .additional_nic_config = false, /* additional_nic_config - not for 4965 */
149         .regulatory_bands = iwn5000_regulatory_bands,   /* regulatory_bands */
150         .enhanced_TX_power = false,     /* enhanced_TX_power - not for 4965 */
151         .calib_need =
152             (IWN_FLG_NEED_PHY_CALIB_DC
153             | IWN_FLG_NEED_PHY_CALIB_LO
154             | IWN_FLG_NEED_PHY_CALIB_TX_IQ_PERIODIC
155             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
156             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND ),
157         .support_hostap = false,        /* support_hostap - XXX should work on fixing! */
158         .no_multi_vaps = true,  /* no_multi_vaps - XXX should work on fixing!  */
159         .additional_gp_drv_bit = IWN_GP_DRIVER_NONE,    /* additional_gp_drv_bit */
160         .bt_mode = IWN_BT_SIMPLE,       /* bt_mode */
161         .plcp_err_threshold = IWN_PLCP_ERR_DEFAULT_THRESHOLD,
162 };
163
164
165 static const struct iwn_base_params iwn2000_base_params = {
166         .pll_cfg_val = 0,
167         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_2x00,
168         .shadow_ram_support = true,
169         .shadow_reg_enable = false,
170         .bt_session_2 = false,
171         .bt_sco_disable = true,
172         .additional_nic_config = false,
173         .regulatory_bands = iwn2030_regulatory_bands,
174         .enhanced_TX_power = true,
175         .calib_need =
176             (IWN_FLG_NEED_PHY_CALIB_DC
177             | IWN_FLG_NEED_PHY_CALIB_LO
178             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
179             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND
180             | IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSETv2 ),
181         .support_hostap = true,
182         .no_multi_vaps = false,
183         .additional_gp_drv_bit = IWN_GP_DRIVER_REG_BIT_RADIO_IQ_INVERT,
184         .bt_mode = IWN_BT_NONE,
185         .plcp_err_threshold = IWN_PLCP_ERR_DEFAULT_THRESHOLD,
186 };
187
188 static const struct iwn_base_params iwn2030_base_params = {
189         .pll_cfg_val = 0,
190         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_2x00,
191         .shadow_ram_support = true,
192         .shadow_reg_enable = false,     /* XXX check? */
193         .bt_session_2 = true,
194         .bt_sco_disable = true,
195         .additional_nic_config = false,
196         .regulatory_bands = iwn2030_regulatory_bands,
197         .enhanced_TX_power = true,
198         .calib_need =
199             (IWN_FLG_NEED_PHY_CALIB_DC
200             | IWN_FLG_NEED_PHY_CALIB_LO
201             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
202             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND
203             | IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSETv2 ),
204         .support_hostap = true,
205         .no_multi_vaps = false,
206         .additional_gp_drv_bit = IWN_GP_DRIVER_REG_BIT_RADIO_IQ_INVERT,
207         .bt_mode = IWN_BT_ADVANCED,
208         .plcp_err_threshold = IWN_PLCP_ERR_DEFAULT_THRESHOLD,
209 };
210
211 static const struct iwn_base_params iwn1000_base_params = {
212         .pll_cfg_val = IWN_ANA_PLL_INIT,
213         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_1000,
214         .shadow_ram_support = false,
215         .shadow_reg_enable = false,     /* XXX check? */
216         .bt_session_2 = false,
217         .bt_sco_disable = false,
218         .additional_nic_config = false,
219         .regulatory_bands = iwn5000_regulatory_bands,
220         .enhanced_TX_power = false,
221         .calib_need =
222             ( IWN_FLG_NEED_PHY_CALIB_LO
223             | IWN_FLG_NEED_PHY_CALIB_TX_IQ_PERIODIC
224             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
225             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND
226             ),
227         .support_hostap = false,
228         .no_multi_vaps = true,
229         .additional_gp_drv_bit = IWN_GP_DRIVER_NONE,
230         /* XXX 1000 - no BT */
231         .bt_mode = IWN_BT_SIMPLE,
232         .plcp_err_threshold = IWN_PLCP_ERR_EXT_LONG_THRESHOLD,
233 };
234 static const struct iwn_base_params iwn_6000_base_params = {
235         .pll_cfg_val = 0,
236         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_6x00,
237         .shadow_ram_support = true,
238         .shadow_reg_enable = true,
239         .bt_session_2 = false,
240         .bt_sco_disable = false,
241         .additional_nic_config = false,
242         .regulatory_bands = iwn6000_regulatory_bands,
243         .enhanced_TX_power = true,
244         .calib_need =
245             (IWN_FLG_NEED_PHY_CALIB_DC
246             | IWN_FLG_NEED_PHY_CALIB_LO
247             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
248             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND ),
249         .support_hostap = false,
250         .no_multi_vaps = true,
251         .additional_gp_drv_bit = IWN_GP_DRIVER_NONE,
252         .bt_mode = IWN_BT_SIMPLE,
253         .plcp_err_threshold = IWN_PLCP_ERR_DEFAULT_THRESHOLD,
254 };
255 static const struct iwn_base_params iwn_6000i_base_params = {
256         .pll_cfg_val = 0,
257         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_6x00,
258         .shadow_ram_support = true,
259         .shadow_reg_enable = true,
260         .bt_session_2 = false,
261         .bt_sco_disable = true,
262         .additional_nic_config = false,
263         .regulatory_bands = iwn6000_regulatory_bands,
264         .enhanced_TX_power = true,
265         .calib_need =
266             (IWN_FLG_NEED_PHY_CALIB_DC
267             | IWN_FLG_NEED_PHY_CALIB_LO
268             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
269             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND ),
270         .support_hostap = false,
271         .no_multi_vaps = true,
272         .additional_gp_drv_bit = IWN_GP_DRIVER_NONE,
273         .bt_mode = IWN_BT_SIMPLE,
274         .plcp_err_threshold = IWN_PLCP_ERR_DEFAULT_THRESHOLD,
275 };
276 static const struct iwn_base_params iwn_6000g2_base_params = {
277         .pll_cfg_val = 0,
278         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_6x00,
279         .shadow_ram_support = true,
280         .shadow_reg_enable = true,
281         .bt_session_2 = false,
282         .bt_sco_disable = true,
283         .additional_nic_config = false,
284         .regulatory_bands = iwn6000_regulatory_bands,
285         .enhanced_TX_power = true,
286         .calib_need =
287             (IWN_FLG_NEED_PHY_CALIB_DC
288             | IWN_FLG_NEED_PHY_CALIB_LO
289             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
290             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND
291             | IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET ),
292         .support_hostap = false,
293         .no_multi_vaps = true,
294         .additional_gp_drv_bit = 0,
295         .bt_mode = IWN_BT_SIMPLE,
296         .plcp_err_threshold = IWN_PLCP_ERR_DEFAULT_THRESHOLD,
297 };
298
299 static const struct iwn_base_params iwn_6050_base_params = {
300         .pll_cfg_val = 0,
301         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_6x50,
302         .shadow_ram_support = true,
303         .shadow_reg_enable = true,
304         .bt_session_2 = false,
305         .bt_sco_disable = true,
306         .additional_nic_config = true,
307         .regulatory_bands = iwn6000_regulatory_bands,
308         .enhanced_TX_power = true,
309         .calib_need =
310             (IWN_FLG_NEED_PHY_CALIB_LO
311             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
312             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND ),
313         .support_hostap = false,
314         .no_multi_vaps = true,
315         .additional_gp_drv_bit = IWN_GP_DRIVER_NONE,
316         .bt_mode = IWN_BT_SIMPLE,
317         .plcp_err_threshold = IWN_PLCP_ERR_DEFAULT_THRESHOLD,
318 };
319 static const struct iwn_base_params iwn_6150_base_params = {
320         .pll_cfg_val = 0,
321         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_6x50,
322         .shadow_ram_support = true,
323         .shadow_reg_enable = true,
324         .bt_session_2 = false,
325         .bt_sco_disable = true,
326         .additional_nic_config = true,
327         .regulatory_bands = iwn6000_regulatory_bands,
328         .enhanced_TX_power = true,
329         .calib_need =
330             (IWN_FLG_NEED_PHY_CALIB_LO
331             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
332             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND),
333         .support_hostap = false,
334         .no_multi_vaps = true,
335         .additional_gp_drv_bit = IWN_GP_DRIVER_6050_1X2,
336         .bt_mode = IWN_BT_SIMPLE,
337         .plcp_err_threshold = IWN_PLCP_ERR_DEFAULT_THRESHOLD,
338 };
339
340 /* IWL_DEVICE_6035 & IWL_DEVICE_6030 */
341 static const struct iwn_base_params iwn_6000g2b_base_params = {
342         .pll_cfg_val = 0,
343         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_6x00,
344         .shadow_ram_support = true,
345         .shadow_reg_enable = true,
346         .bt_session_2 = false,
347         .bt_sco_disable = true,
348         .additional_nic_config = false,
349         .regulatory_bands = iwn6000_regulatory_bands,
350         .enhanced_TX_power = true,
351         .calib_need =
352             (IWN_FLG_NEED_PHY_CALIB_DC
353             | IWN_FLG_NEED_PHY_CALIB_LO
354             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
355             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND
356             | IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET ),
357         .support_hostap = false,
358         .no_multi_vaps = true,
359         .additional_gp_drv_bit = IWN_GP_DRIVER_NONE,
360         .bt_mode = IWN_BT_ADVANCED,
361         .plcp_err_threshold = IWN_PLCP_ERR_DEFAULT_THRESHOLD,
362 };
363
364 /*
365  * 6235 series NICs.
366  */
367 static const struct iwn_base_params iwn_6235_base_params = {
368         .pll_cfg_val = 0,
369         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_6x00,
370         .shadow_ram_support = true,
371         .shadow_reg_enable = true,
372         .bt_session_2 = false,
373         .bt_sco_disable = true,
374         .additional_nic_config = true,
375         .regulatory_bands = iwn6000_regulatory_bands,
376         .enhanced_TX_power = true,
377         .calib_need =
378             (IWN_FLG_NEED_PHY_CALIB_DC
379             | IWN_FLG_NEED_PHY_CALIB_LO
380             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
381             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND
382             | IWN_FLG_NEED_PHY_CALIB_TEMP_OFFSET ),
383         .support_hostap = false,
384         .no_multi_vaps = true,
385         /* XXX 1x2? This NIC is 2x2, right? */
386         .additional_gp_drv_bit = IWN_GP_DRIVER_6050_1X2,
387         .bt_mode = IWN_BT_ADVANCED,
388         .plcp_err_threshold = IWN_PLCP_ERR_DEFAULT_THRESHOLD,
389 };
390
391 static const struct iwn_base_params iwn_5x50_base_params = {
392         .pll_cfg_val = IWN_ANA_PLL_INIT,
393         .max_ll_items = IWN_OTP_MAX_LL_ITEMS_6x00,
394         .shadow_ram_support = true,
395         .shadow_reg_enable = false,
396         .bt_session_2 = false,
397         .bt_sco_disable = true,
398         .additional_nic_config = false,
399         .regulatory_bands = iwn5000_regulatory_bands,
400         .enhanced_TX_power =false,
401         .calib_need =
402             (IWN_FLG_NEED_PHY_CALIB_DC
403             | IWN_FLG_NEED_PHY_CALIB_LO
404             | IWN_FLG_NEED_PHY_CALIB_TX_IQ
405             | IWN_FLG_NEED_PHY_CALIB_BASE_BAND ),
406         .support_hostap = false,
407         .no_multi_vaps = true,
408         .additional_gp_drv_bit = IWN_GP_DRIVER_NONE,
409         .bt_mode = IWN_BT_SIMPLE,
410         .plcp_err_threshold = IWN_PLCP_ERR_LONG_THRESHOLD,
411 };
412
413 #endif  /* __IF_IWN_CHIP_CFG_H__ */