Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_attach.c
48525 views
1
/*
2
* Copyright (c) 2013 Qualcomm Atheros, Inc.
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 WITH
9
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
* PERFORMANCE OF THIS SOFTWARE.
15
*/
16
17
#include "opt_ah.h"
18
19
#include "ah.h"
20
#include "ah_internal.h"
21
#include "ah_devid.h"
22
23
#include "ar9300/ar9300desc.h"
24
#include "ar9300/ar9300.h"
25
#include "ar9300/ar9300reg.h"
26
#include "ar9300/ar9300phy.h"
27
#include "ar9300/ar9300paprd.h"
28
29
#include "ar9300/ar9300_stub.h"
30
#include "ar9300/ar9300_stub_funcs.h"
31
32
33
/* Add static register initialization vectors */
34
#include "ar9300/ar9300_osprey22.ini"
35
#include "ar9300/ar9330_11.ini"
36
#include "ar9300/ar9330_12.ini"
37
#include "ar9300/ar9340.ini"
38
#include "ar9300/ar9485.ini"
39
#include "ar9300/ar9485_1_1.ini"
40
#include "ar9300/ar9300_jupiter10.ini"
41
/* TODO: convert the 2.0 code to use the new initvals from ath9k */
42
#include "ar9300/ar9300_jupiter20.ini"
43
#include "ar9300/ar9462_2p0_initvals.h"
44
#include "ar9300/ar9462_2p1_initvals.h"
45
#include "ar9300/ar9580.ini"
46
#include "ar9300/ar955x.ini"
47
#include "ar9300/ar953x.ini"
48
#include "ar9300/ar9300_aphrodite10.ini"
49
50
51
/* Include various freebsd specific HAL methods */
52
#include "ar9300/ar9300_freebsd.h"
53
54
/* XXX duplicate in ar9300_radio.c ? */
55
static HAL_BOOL ar9300_get_chip_power_limits(struct ath_hal *ah,
56
struct ieee80211_channel *chan);
57
58
static inline HAL_STATUS ar9300_init_mac_addr(struct ath_hal *ah);
59
static inline HAL_STATUS ar9300_hw_attach(struct ath_hal *ah);
60
static inline void ar9300_hw_detach(struct ath_hal *ah);
61
static int16_t ar9300_get_nf_adjust(struct ath_hal *ah,
62
const HAL_CHANNEL_INTERNAL *c);
63
#if 0
64
int ar9300_get_cal_intervals(struct ath_hal *ah, HAL_CALIBRATION_TIMER **timerp,
65
HAL_CAL_QUERY query);
66
#endif
67
68
#if ATH_TRAFFIC_FAST_RECOVER
69
unsigned long ar9300_get_pll3_sqsum_dvc(struct ath_hal *ah);
70
#endif
71
static int ar9300_init_offsets(struct ath_hal *ah, u_int16_t devid);
72
73
74
static void
75
ar9300_disable_pcie_phy(struct ath_hal *ah);
76
77
static const HAL_PERCAL_DATA iq_cal_single_sample =
78
{IQ_MISMATCH_CAL,
79
MIN_CAL_SAMPLES,
80
PER_MAX_LOG_COUNT,
81
ar9300_iq_cal_collect,
82
ar9300_iq_calibration};
83
84
#if 0
85
static HAL_CALIBRATION_TIMER ar9300_cals[] =
86
{ {IQ_MISMATCH_CAL, /* Cal type */
87
1200000, /* Cal interval */
88
0 /* Cal timestamp */
89
},
90
{TEMP_COMP_CAL,
91
5000,
92
0
93
},
94
};
95
#endif
96
97
#if ATH_PCIE_ERROR_MONITOR
98
99
int ar9300_start_pcie_error_monitor(struct ath_hal *ah, int b_auto_stop)
100
{
101
u_int32_t val;
102
103
/* Clear the counters */
104
OS_REG_WRITE(ah, PCIE_CO_ERR_CTR_CTR0, 0);
105
OS_REG_WRITE(ah, PCIE_CO_ERR_CTR_CTR1, 0);
106
107
/* Read the previous value */
108
val = OS_REG_READ(ah, PCIE_CO_ERR_CTR_CTRL);
109
110
/* Set auto_stop */
111
if (b_auto_stop) {
112
val |=
113
RCVD_ERR_CTR_AUTO_STOP | BAD_TLP_ERR_CTR_AUTO_STOP |
114
BAD_DLLP_ERR_CTR_AUTO_STOP | RPLY_TO_ERR_CTR_AUTO_STOP |
115
RPLY_NUM_RO_ERR_CTR_AUTO_STOP;
116
} else {
117
val &= ~(
118
RCVD_ERR_CTR_AUTO_STOP | BAD_TLP_ERR_CTR_AUTO_STOP |
119
BAD_DLLP_ERR_CTR_AUTO_STOP | RPLY_TO_ERR_CTR_AUTO_STOP |
120
RPLY_NUM_RO_ERR_CTR_AUTO_STOP);
121
}
122
OS_REG_WRITE(ah, PCIE_CO_ERR_CTR_CTRL, val );
123
124
/*
125
* Start to run.
126
* This has to be done separately from the above auto_stop flag setting,
127
* to avoid a HW race condition.
128
*/
129
val |=
130
RCVD_ERR_CTR_RUN | BAD_TLP_ERR_CTR_RUN | BAD_DLLP_ERR_CTR_RUN |
131
RPLY_TO_ERR_CTR_RUN | RPLY_NUM_RO_ERR_CTR_RUN;
132
OS_REG_WRITE(ah, PCIE_CO_ERR_CTR_CTRL, val);
133
134
return 0;
135
}
136
137
int ar9300_read_pcie_error_monitor(struct ath_hal *ah, void* p_read_counters)
138
{
139
u_int32_t val;
140
ar_pcie_error_moniter_counters *p_counters =
141
(ar_pcie_error_moniter_counters*) p_read_counters;
142
143
val = OS_REG_READ(ah, PCIE_CO_ERR_CTR_CTR0);
144
145
p_counters->uc_receiver_errors = MS(val, RCVD_ERR_MASK);
146
p_counters->uc_bad_tlp_errors = MS(val, BAD_TLP_ERR_MASK);
147
p_counters->uc_bad_dllp_errors = MS(val, BAD_DLLP_ERR_MASK);
148
149
val = OS_REG_READ(ah, PCIE_CO_ERR_CTR_CTR1);
150
151
p_counters->uc_replay_timeout_errors = MS(val, RPLY_TO_ERR_MASK);
152
p_counters->uc_replay_number_rollover_errors= MS(val, RPLY_NUM_RO_ERR_MASK);
153
154
return 0;
155
}
156
157
int ar9300_stop_pcie_error_monitor(struct ath_hal *ah)
158
{
159
u_int32_t val;
160
161
/* Read the previous value */
162
val = OS_REG_READ(ah, PCIE_CO_ERR_CTR_CTRL);
163
164
val &= ~(
165
RCVD_ERR_CTR_RUN |
166
BAD_TLP_ERR_CTR_RUN |
167
BAD_DLLP_ERR_CTR_RUN |
168
RPLY_TO_ERR_CTR_RUN |
169
RPLY_NUM_RO_ERR_CTR_RUN);
170
171
/* Start to stop */
172
OS_REG_WRITE(ah, PCIE_CO_ERR_CTR_CTRL, val );
173
174
return 0;
175
}
176
177
#endif /* ATH_PCIE_ERROR_MONITOR */
178
179
#if 0
180
/* WIN32 does not support C99 */
181
static const struct ath_hal_private ar9300hal = {
182
{
183
ar9300_get_rate_table, /* ah_get_rate_table */
184
ar9300_detach, /* ah_detach */
185
186
/* Reset Functions */
187
ar9300_reset, /* ah_reset */
188
ar9300_phy_disable, /* ah_phy_disable */
189
ar9300_disable, /* ah_disable */
190
ar9300_config_pci_power_save, /* ah_config_pci_power_save */
191
ar9300_set_pcu_config, /* ah_set_pcu_config */
192
ar9300_calibration, /* ah_per_calibration */
193
ar9300_reset_cal_valid, /* ah_reset_cal_valid */
194
ar9300_set_tx_power_limit, /* ah_set_tx_power_limit */
195
196
#if ATH_ANT_DIV_COMB
197
ar9300_ant_ctrl_set_lna_div_use_bt_ant, /* ah_ant_ctrl_set_lna_div_use_bt_ant */
198
#endif /* ATH_ANT_DIV_COMB */
199
#ifdef ATH_SUPPORT_DFS
200
ar9300_radar_wait, /* ah_radar_wait */
201
202
/* New DFS functions */
203
ar9300_check_dfs, /* ah_ar_check_dfs */
204
ar9300_dfs_found, /* ah_ar_dfs_found */
205
ar9300_enable_dfs, /* ah_ar_enable_dfs */
206
ar9300_get_dfs_thresh, /* ah_ar_get_dfs_thresh */
207
ar9300_get_dfs_radars, /* ah_ar_get_dfs_radars */
208
ar9300_adjust_difs, /* ah_adjust_difs */
209
ar9300_dfs_config_fft, /* ah_dfs_config_fft */
210
ar9300_dfs_cac_war, /* ah_dfs_cac_war */
211
ar9300_cac_tx_quiet, /* ah_cac_tx_quiet */
212
#endif
213
ar9300_get_extension_channel, /* ah_get_extension_channel */
214
ar9300_is_fast_clock_enabled, /* ah_is_fast_clock_enabled */
215
216
/* Transmit functions */
217
ar9300_update_tx_trig_level, /* ah_update_tx_trig_level */
218
ar9300_get_tx_trig_level, /* ah_get_tx_trig_level */
219
ar9300_setup_tx_queue, /* ah_setup_tx_queue */
220
ar9300_set_tx_queue_props, /* ah_set_tx_queue_props */
221
ar9300_get_tx_queue_props, /* ah_get_tx_queue_props */
222
ar9300_release_tx_queue, /* ah_release_tx_queue */
223
ar9300_reset_tx_queue, /* ah_reset_tx_queue */
224
ar9300_get_tx_dp, /* ah_get_tx_dp */
225
ar9300_set_tx_dp, /* ah_set_tx_dp */
226
ar9300_num_tx_pending, /* ah_num_tx_pending */
227
ar9300_start_tx_dma, /* ah_start_tx_dma */
228
ar9300_stop_tx_dma, /* ah_stop_tx_dma */
229
ar9300_stop_tx_dma_indv_que, /* ah_stop_tx_dma_indv_que */
230
ar9300_abort_tx_dma, /* ah_abort_tx_dma */
231
ar9300_fill_tx_desc, /* ah_fill_tx_desc */
232
ar9300_set_desc_link, /* ah_set_desc_link */
233
ar9300_get_desc_link_ptr, /* ah_get_desc_link_ptr */
234
ar9300_clear_tx_desc_status, /* ah_clear_tx_desc_status */
235
#ifdef ATH_SWRETRY
236
ar9300_clear_dest_mask, /* ah_clear_dest_mask */
237
#endif
238
ar9300_proc_tx_desc, /* ah_proc_tx_desc */
239
ar9300_get_raw_tx_desc, /* ah_get_raw_tx_desc */
240
ar9300_get_tx_rate_code, /* ah_get_tx_rate_code */
241
AH_NULL, /* ah_get_tx_intr_queue */
242
ar9300_tx_req_intr_desc, /* ah_req_tx_intr_desc */
243
ar9300_calc_tx_airtime, /* ah_calc_tx_airtime */
244
ar9300_setup_tx_status_ring, /* ah_setup_tx_status_ring */
245
246
/* RX Functions */
247
ar9300_get_rx_dp, /* ah_get_rx_dp */
248
ar9300_set_rx_dp, /* ah_set_rx_dp */
249
ar9300_enable_receive, /* ah_enable_receive */
250
ar9300_stop_dma_receive, /* ah_stop_dma_receive */
251
ar9300_start_pcu_receive, /* ah_start_pcu_receive */
252
ar9300_stop_pcu_receive, /* ah_stop_pcu_receive */
253
ar9300_set_multicast_filter, /* ah_set_multicast_filter */
254
ar9300_get_rx_filter, /* ah_get_rx_filter */
255
ar9300_set_rx_filter, /* ah_set_rx_filter */
256
ar9300_set_rx_sel_evm, /* ah_set_rx_sel_evm */
257
ar9300_set_rx_abort, /* ah_set_rx_abort */
258
AH_NULL, /* ah_setup_rx_desc */
259
ar9300_proc_rx_desc, /* ah_proc_rx_desc */
260
ar9300_get_rx_key_idx, /* ah_get_rx_key_idx */
261
ar9300_proc_rx_desc_fast, /* ah_proc_rx_desc_fast */
262
ar9300_ani_ar_poll, /* ah_rx_monitor */
263
ar9300_process_mib_intr, /* ah_proc_mib_event */
264
265
/* Misc Functions */
266
ar9300_get_capability, /* ah_get_capability */
267
ar9300_set_capability, /* ah_set_capability */
268
ar9300_get_diag_state, /* ah_get_diag_state */
269
ar9300_get_mac_address, /* ah_get_mac_address */
270
ar9300_set_mac_address, /* ah_set_mac_address */
271
ar9300_get_bss_id_mask, /* ah_get_bss_id_mask */
272
ar9300_set_bss_id_mask, /* ah_set_bss_id_mask */
273
ar9300_set_regulatory_domain, /* ah_set_regulatory_domain */
274
ar9300_set_led_state, /* ah_set_led_state */
275
ar9300_set_power_led_state, /* ah_setpowerledstate */
276
ar9300_set_network_led_state, /* ah_setnetworkledstate */
277
ar9300_write_associd, /* ah_write_associd */
278
ar9300_force_tsf_sync, /* ah_force_tsf_sync */
279
ar9300_gpio_cfg_input, /* ah_gpio_cfg_input */
280
ar9300_gpio_cfg_output, /* ah_gpio_cfg_output */
281
ar9300_gpio_cfg_output_led_off, /* ah_gpio_cfg_output_led_off */
282
ar9300_gpio_get, /* ah_gpio_get */
283
ar9300_gpio_set, /* ah_gpio_set */
284
ar9300_gpio_get_intr, /* ah_gpio_get_intr */
285
ar9300_gpio_set_intr, /* ah_gpio_set_intr */
286
ar9300_gpio_get_polarity, /* ah_gpio_get_polarity */
287
ar9300_gpio_set_polarity, /* ah_gpio_set_polarity */
288
ar9300_gpio_get_mask, /* ah_gpio_get_mask */
289
ar9300_gpio_set_mask, /* ah_gpio_set_mask */
290
ar9300_get_tsf32, /* ah_get_tsf32 */
291
ar9300_get_tsf64, /* ah_get_tsf64 */
292
ar9300_get_tsf2_32, /* ah_get_tsf2_32 */
293
ar9300_reset_tsf, /* ah_reset_tsf */
294
ar9300_detect_card_present, /* ah_detect_card_present */
295
ar9300_update_mib_mac_stats, /* ah_update_mib_mac_stats */
296
ar9300_get_mib_mac_stats, /* ah_get_mib_mac_stats */
297
ar9300_get_rfgain, /* ah_get_rf_gain */
298
ar9300_get_def_antenna, /* ah_get_def_antenna */
299
ar9300_set_def_antenna, /* ah_set_def_antenna */
300
ar9300_set_slot_time, /* ah_set_slot_time */
301
ar9300_set_ack_timeout, /* ah_set_ack_timeout */
302
ar9300_get_ack_timeout, /* ah_get_ack_timeout */
303
ar9300_set_coverage_class, /* ah_set_coverage_class */
304
ar9300_set_quiet, /* ah_set_quiet */
305
ar9300_set_antenna_switch, /* ah_set_antenna_switch */
306
ar9300_get_desc_info, /* ah_get_desc_info */
307
ar9300_select_ant_config, /* ah_select_ant_config */
308
ar9300_ant_ctrl_common_get, /* ah_ant_ctrl_common_get */
309
ar9300_ant_swcom_sel, /* ah_ant_swcom_sel */
310
ar9300_enable_tpc, /* ah_enable_tpc */
311
AH_NULL, /* ah_olpc_temp_compensation */
312
#if ATH_SUPPORT_CRDC
313
ar9300_chain_rssi_diff_compensation,/*ah_chain_rssi_diff_compensation*/
314
#endif
315
ar9300_disable_phy_restart, /* ah_disable_phy_restart */
316
ar9300_enable_keysearch_always,
317
ar9300_interference_is_present, /* ah_interference_is_present */
318
ar9300_disp_tpc_tables, /* ah_disp_tpc_tables */
319
ar9300_get_tpc_tables, /* ah_get_tpc_tables */
320
/* Key Cache Functions */
321
ar9300_get_key_cache_size, /* ah_get_key_cache_size */
322
ar9300_reset_key_cache_entry, /* ah_reset_key_cache_entry */
323
ar9300_is_key_cache_entry_valid, /* ah_is_key_cache_entry_valid */
324
ar9300_set_key_cache_entry, /* ah_set_key_cache_entry */
325
ar9300_set_key_cache_entry_mac, /* ah_set_key_cache_entry_mac */
326
ar9300_print_keycache, /* ah_print_key_cache */
327
#if ATH_SUPPORT_KEYPLUMB_WAR
328
ar9300_check_key_cache_entry, /* ah_check_key_cache_entry */
329
#endif
330
/* Power Management Functions */
331
ar9300_set_power_mode, /* ah_set_power_mode */
332
ar9300_set_sm_power_mode, /* ah_set_sm_ps_mode */
333
#if ATH_WOW
334
ar9300_wow_apply_pattern, /* ah_wow_apply_pattern */
335
ar9300_wow_enable, /* ah_wow_enable */
336
ar9300_wow_wake_up, /* ah_wow_wake_up */
337
#if ATH_WOW_OFFLOAD
338
ar9300_wowoffload_prep, /* ah_wow_offload_prep */
339
ar9300_wowoffload_post, /* ah_wow_offload_post */
340
ar9300_wowoffload_download_rekey_data, /* ah_wow_offload_download_rekey_data */
341
ar9300_wowoffload_retrieve_data, /* ah_wow_offload_retrieve_data */
342
ar9300_wowoffload_download_acer_magic, /* ah_wow_offload_download_acer_magic */
343
ar9300_wowoffload_download_acer_swka, /* ah_wow_offload_download_acer_swka */
344
ar9300_wowoffload_download_arp_info, /* ah_wow_offload_download_arp_info */
345
ar9300_wowoffload_download_ns_info, /* ah_wow_offload_download_ns_info */
346
#endif /* ATH_WOW_OFFLOAD */
347
#endif
348
349
/* Get Channel Noise */
350
ath_hal_get_chan_noise, /* ah_get_chan_noise */
351
ar9300_chain_noise_floor, /* ah_get_chain_noise_floor */
352
ar9300_get_nf_from_reg, /* ah_get_nf_from_reg */
353
ar9300_get_rx_nf_offset, /* ah_get_rx_nf_offset */
354
355
/* Beacon Functions */
356
ar9300_beacon_init, /* ah_beacon_init */
357
ar9300_set_sta_beacon_timers, /* ah_set_station_beacon_timers */
358
359
/* Interrupt Functions */
360
ar9300_is_interrupt_pending, /* ah_is_interrupt_pending */
361
ar9300_get_pending_interrupts, /* ah_get_pending_interrupts */
362
ar9300_get_interrupts, /* ah_get_interrupts */
363
ar9300_set_interrupts, /* ah_set_interrupts */
364
ar9300_set_intr_mitigation_timer, /* ah_set_intr_mitigation_timer */
365
ar9300_get_intr_mitigation_timer, /* ah_get_intr_mitigation_timer */
366
ar9300ForceVCS,
367
ar9300SetDfs3StreamFix,
368
ar9300Get3StreamSignature,
369
370
/* 11n specific functions (NOT applicable to ar9300) */
371
ar9300_set_11n_tx_desc, /* ah_set_11n_tx_desc */
372
/* Update rxchain */
373
ar9300_set_rx_chainmask, /*ah_set_rx_chainmask*/
374
/*Updating locationing register */
375
ar9300_update_loc_ctl_reg, /*ah_update_loc_ctl_reg*/
376
/* Start PAPRD functions */
377
ar9300_set_paprd_tx_desc, /* ah_set_paprd_tx_desc */
378
ar9300_paprd_init_table, /* ah_paprd_init_table */
379
ar9300_paprd_setup_gain_table, /* ah_paprd_setup_gain_table */
380
ar9300_paprd_create_curve, /* ah_paprd_create_curve */
381
ar9300_paprd_is_done, /* ah_paprd_is_done */
382
ar9300_enable_paprd, /* ah_PAPRDEnable */
383
ar9300_populate_paprd_single_table,/* ah_paprd_populate_table */
384
ar9300_is_tx_done, /* ah_is_tx_done */
385
ar9300_paprd_dec_tx_pwr, /* ah_paprd_dec_tx_pwr*/
386
ar9300_paprd_thermal_send, /* ah_paprd_thermal_send */
387
/* End PAPRD functions */
388
ar9300_set_11n_rate_scenario, /* ah_set_11n_rate_scenario */
389
ar9300_set_11n_aggr_first, /* ah_set_11n_aggr_first */
390
ar9300_set_11n_aggr_middle, /* ah_set_11n_aggr_middle */
391
ar9300_set_11n_aggr_last, /* ah_set_11n_aggr_last */
392
ar9300_clr_11n_aggr, /* ah_clr_11n_aggr */
393
ar9300_set_11n_rifs_burst_middle, /* ah_set_11n_rifs_burst_middle */
394
ar9300_set_11n_rifs_burst_last, /* ah_set_11n_rifs_burst_last */
395
ar9300_clr_11n_rifs_burst, /* ah_clr_11n_rifs_burst */
396
ar9300_set_11n_aggr_rifs_burst, /* ah_set_11n_aggr_rifs_burst */
397
ar9300_set_11n_rx_rifs, /* ah_set_11n_rx_rifs */
398
ar9300_set_smart_antenna, /* ah_setSmartAntenna */
399
ar9300_detect_bb_hang, /* ah_detect_bb_hang */
400
ar9300_detect_mac_hang, /* ah_detect_mac_hang */
401
ar9300_set_immunity, /* ah_immunity */
402
ar9300_get_hw_hangs, /* ah_get_hang_types */
403
ar9300_set_11n_burst_duration, /* ah_set_11n_burst_duration */
404
ar9300_set_11n_virtual_more_frag, /* ah_set_11n_virtual_more_frag */
405
ar9300_get_11n_ext_busy, /* ah_get_11n_ext_busy */
406
ar9300_set_11n_mac2040, /* ah_set_11n_mac2040 */
407
ar9300_get_11n_rx_clear, /* ah_get_11n_rx_clear */
408
ar9300_set_11n_rx_clear, /* ah_set_11n_rx_clear */
409
ar9300_get_mib_cycle_counts_pct, /* ah_get_mib_cycle_counts_pct */
410
ar9300_dma_reg_dump, /* ah_dma_reg_dump */
411
412
/* force_ppm specific functions */
413
ar9300_ppm_get_rssi_dump, /* ah_ppm_get_rssi_dump */
414
ar9300_ppm_arm_trigger, /* ah_ppm_arm_trigger */
415
ar9300_ppm_get_trigger, /* ah_ppm_get_trigger */
416
ar9300_ppm_force, /* ah_ppm_force */
417
ar9300_ppm_un_force, /* ah_ppm_un_force */
418
ar9300_ppm_get_force_state, /* ah_ppm_get_force_state */
419
420
ar9300_get_spur_info, /* ah_get_spur_info */
421
ar9300_set_spur_info, /* ah_get_spur_info */
422
423
ar9300_get_min_cca_pwr, /* ah_ar_get_noise_floor_val */
424
425
ar9300_green_ap_ps_on_off, /* ah_set_rx_green_ap_ps_on_off */
426
ar9300_is_single_ant_power_save_possible, /* ah_is_single_ant_power_save_possible */
427
428
/* radio measurement specific functions */
429
ar9300_get_mib_cycle_counts, /* ah_get_mib_cycle_counts */
430
ar9300_get_vow_stats, /* ah_get_vow_stats */
431
ar9300_clear_mib_counters, /* ah_clear_mib_counters */
432
#if ATH_GEN_RANDOMNESS
433
ar9300_get_rssi_chain0, /* ah_get_rssi_chain0 */
434
#endif
435
#ifdef ATH_BT_COEX
436
/* Bluetooth Coexistence functions */
437
ar9300_set_bt_coex_info, /* ah_set_bt_coex_info */
438
ar9300_bt_coex_config, /* ah_bt_coex_config */
439
ar9300_bt_coex_set_qcu_thresh, /* ah_bt_coex_set_qcu_thresh */
440
ar9300_bt_coex_set_weights, /* ah_bt_coex_set_weights */
441
ar9300_bt_coex_setup_bmiss_thresh, /* ah_bt_coex_set_bmiss_thresh */
442
ar9300_bt_coex_set_parameter, /* ah_bt_coex_set_parameter */
443
ar9300_bt_coex_disable, /* ah_bt_coex_disable */
444
ar9300_bt_coex_enable, /* ah_bt_coex_enable */
445
ar9300_get_bt_active_gpio, /* ah_bt_coex_info*/
446
ar9300_get_wlan_active_gpio, /* ah__coex_wlan_info*/
447
#endif
448
/* Generic Timer functions */
449
ar9300_alloc_generic_timer, /* ah_gentimer_alloc */
450
ar9300_free_generic_timer, /* ah_gentimer_free */
451
ar9300_start_generic_timer, /* ah_gentimer_start */
452
ar9300_stop_generic_timer, /* ah_gentimer_stop */
453
ar9300_get_gen_timer_interrupts, /* ah_gentimer_get_intr */
454
455
ar9300_set_dcs_mode, /* ah_set_dcs_mode */
456
ar9300_get_dcs_mode, /* ah_get_dcs_mode */
457
458
#if ATH_ANT_DIV_COMB
459
ar9300_ant_div_comb_get_config, /* ah_get_ant_dvi_comb_conf */
460
ar9300_ant_div_comb_set_config, /* ah_set_ant_dvi_comb_conf */
461
#endif
462
463
ar9300_get_bb_panic_info, /* ah_get_bb_panic_info */
464
ar9300_handle_radar_bb_panic, /* ah_handle_radar_bb_panic */
465
ar9300_set_hal_reset_reason, /* ah_set_hal_reset_reason */
466
467
#if ATH_PCIE_ERROR_MONITOR
468
ar9300_start_pcie_error_monitor, /* ah_start_pcie_error_monitor */
469
ar9300_read_pcie_error_monitor, /* ah_read_pcie_error_monitor*/
470
ar9300_stop_pcie_error_monitor, /* ah_stop_pcie_error_monitor*/
471
#endif /* ATH_PCIE_ERROR_MONITOR */
472
473
#if ATH_SUPPORT_SPECTRAL
474
/* Spectral scan */
475
ar9300_configure_spectral_scan, /* ah_ar_configure_spectral */
476
ar9300_get_spectral_params, /* ah_ar_get_spectral_config */
477
ar9300_start_spectral_scan, /* ah_ar_start_spectral_scan */
478
ar9300_stop_spectral_scan, /* ah_ar_stop_spectral_scan */
479
ar9300_is_spectral_enabled, /* ah_ar_is_spectral_enabled */
480
ar9300_is_spectral_active, /* ah_ar_is_spectral_active */
481
ar9300_get_ctl_chan_nf, /* ah_ar_get_ctl_nf */
482
ar9300_get_ext_chan_nf, /* ah_ar_get_ext_nf */
483
#endif /* ATH_SUPPORT_SPECTRAL */
484
485
486
ar9300_promisc_mode, /* ah_promisc_mode */
487
ar9300_read_pktlog_reg, /* ah_read_pktlog_reg */
488
ar9300_write_pktlog_reg, /* ah_write_pktlog_reg */
489
ar9300_set_proxy_sta, /* ah_set_proxy_sta */
490
ar9300_get_cal_intervals, /* ah_get_cal_intervals */
491
#if ATH_TRAFFIC_FAST_RECOVER
492
ar9300_get_pll3_sqsum_dvc, /* ah_get_pll3_sqsum_dvc */
493
#endif
494
#ifdef ATH_SUPPORT_HTC
495
AH_NULL,
496
#endif
497
498
#ifdef ATH_TX99_DIAG
499
/* Tx99 functions */
500
#ifdef ATH_SUPPORT_HTC
501
AH_NULL,
502
AH_NULL,
503
AH_NULL,
504
AH_NULL,
505
AH_NULL,
506
AH_NULL,
507
AH_NULL,
508
#else
509
AH_NULL,
510
AH_NULL,
511
ar9300_tx99_channel_pwr_update, /* ah_tx99channelpwrupdate */
512
ar9300_tx99_start, /* ah_tx99start */
513
ar9300_tx99_stop, /* ah_tx99stop */
514
ar9300_tx99_chainmsk_setup, /* ah_tx99_chainmsk_setup */
515
ar9300_tx99_set_single_carrier, /* ah_tx99_set_single_carrier */
516
#endif
517
#endif
518
ar9300_chk_rssi_update_tx_pwr,
519
ar9300_is_skip_paprd_by_greentx, /* ah_is_skip_paprd_by_greentx */
520
ar9300_hwgreentx_set_pal_spare, /* ah_hwgreentx_set_pal_spare */
521
#if ATH_SUPPORT_MCI
522
/* MCI Coexistence Functions */
523
ar9300_mci_setup, /* ah_mci_setup */
524
ar9300_mci_send_message, /* ah_mci_send_message */
525
ar9300_mci_get_interrupt, /* ah_mci_get_interrupt */
526
ar9300_mci_state, /* ah_mci_state */
527
ar9300_mci_detach, /* ah_mci_detach */
528
#endif
529
ar9300_reset_hw_beacon_proc_crc, /* ah_reset_hw_beacon_proc_crc */
530
ar9300_get_hw_beacon_rssi, /* ah_get_hw_beacon_rssi */
531
ar9300_set_hw_beacon_rssi_threshold,/*ah_set_hw_beacon_rssi_threshold*/
532
ar9300_reset_hw_beacon_rssi, /* ah_reset_hw_beacon_rssi */
533
ar9300_mat_enable, /* ah_mat_enable */
534
ar9300_dump_keycache, /* ah_dump_keycache */
535
ar9300_is_ani_noise_spur, /* ah_is_ani_noise_spur */
536
ar9300_set_hw_beacon_proc, /* ah_set_hw_beacon_proc */
537
ar9300_set_ctl_pwr, /* ah_set_ctl_pwr */
538
ar9300_set_txchainmaskopt, /* ah_set_txchainmaskopt */
539
},
540
541
ar9300_get_channel_edges, /* ah_get_channel_edges */
542
ar9300_get_wireless_modes, /* ah_get_wireless_modes */
543
ar9300_eeprom_read_word, /* ah_eeprom_read */
544
AH_NULL,
545
ar9300_eeprom_dump_support, /* ah_eeprom_dump */
546
ar9300_get_chip_power_limits, /* ah_get_chip_power_limits */
547
548
ar9300_get_nf_adjust, /* ah_get_nf_adjust */
549
/* rest is zero'd by compiler */
550
};
551
#endif
552
553
/*
554
* Read MAC version/revision information from Chip registers and initialize
555
* local data structures.
556
*/
557
void
558
ar9300_read_revisions(struct ath_hal *ah)
559
{
560
u_int32_t val;
561
562
/* XXX verify if this is the correct way to read revision on Osprey */
563
/* new SREV format for Sowl and later */
564
val = OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_SREV));
565
566
if (AH_PRIVATE(ah)->ah_devid == AR9300_DEVID_AR9340) {
567
/* XXX: AR_SREV register in Wasp reads 0 */
568
AH_PRIVATE(ah)->ah_macVersion = AR_SREV_VERSION_WASP;
569
} else if(AH_PRIVATE(ah)->ah_devid == AR9300_DEVID_QCA955X) {
570
/* XXX: AR_SREV register in Scorpion reads 0 */
571
AH_PRIVATE(ah)->ah_macVersion = AR_SREV_VERSION_SCORPION;
572
} else if(AH_PRIVATE(ah)->ah_devid == AR9300_DEVID_QCA953X) {
573
/* XXX: AR_SREV register in HoneyBEE reads 0 */
574
AH_PRIVATE(ah)->ah_macVersion = AR_SREV_VERSION_HONEYBEE;
575
} else {
576
/*
577
* Include 6-bit Chip Type (masked to 0)
578
* to differentiate from pre-Sowl versions
579
*/
580
AH_PRIVATE(ah)->ah_macVersion =
581
(val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
582
}
583
584
585
586
587
588
#ifdef AH_SUPPORT_HORNET
589
/*
590
* EV74984, due to Hornet 1.1 didn't update WMAC revision,
591
* so that have to read SoC's revision ID instead
592
*/
593
if (AH_PRIVATE(ah)->ah_macVersion == AR_SREV_VERSION_HORNET) {
594
#define AR_SOC_RST_REVISION_ID 0xB8060090
595
#define REG_READ(_reg) *((volatile u_int32_t *)(_reg))
596
if ((REG_READ(AR_SOC_RST_REVISION_ID) & AR_SREV_REVISION_HORNET_11_MASK)
597
== AR_SREV_REVISION_HORNET_11)
598
{
599
AH_PRIVATE(ah)->ah_macRev = AR_SREV_REVISION_HORNET_11;
600
} else {
601
AH_PRIVATE(ah)->ah_macRev = MS(val, AR_SREV_REVISION2);
602
}
603
#undef REG_READ
604
#undef AR_SOC_RST_REVISION_ID
605
} else
606
#endif
607
if (AH_PRIVATE(ah)->ah_macVersion == AR_SREV_VERSION_WASP)
608
{
609
#define AR_SOC_RST_REVISION_ID 0xB8060090
610
#define REG_READ(_reg) *((volatile u_int32_t *)(_reg))
611
612
AH_PRIVATE(ah)->ah_macRev =
613
REG_READ(AR_SOC_RST_REVISION_ID) & AR_SREV_REVISION_WASP_MASK;
614
#undef REG_READ
615
#undef AR_SOC_RST_REVISION_ID
616
}
617
else
618
AH_PRIVATE(ah)->ah_macRev = MS(val, AR_SREV_REVISION2);
619
620
if (AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)) {
621
AH_PRIVATE(ah)->ah_ispcie = AH_TRUE;
622
}
623
else {
624
AH_PRIVATE(ah)->ah_ispcie =
625
(val & AR_SREV_TYPE2_HOST_MODE) ? 0 : 1;
626
}
627
628
}
629
630
/*
631
* Attach for an AR9300 part.
632
*/
633
struct ath_hal *
634
ar9300_attach(u_int16_t devid, HAL_SOFTC sc, HAL_BUS_TAG st,
635
HAL_BUS_HANDLE sh, uint16_t *eepromdata, HAL_OPS_CONFIG *ah_config,
636
HAL_STATUS *status)
637
{
638
struct ath_hal_9300 *ahp;
639
struct ath_hal *ah;
640
struct ath_hal_private *ahpriv;
641
HAL_STATUS ecode;
642
643
HAL_NO_INTERSPERSED_READS;
644
645
/* NB: memory is returned zero'd */
646
ahp = ar9300_new_state(devid, sc, st, sh, eepromdata, ah_config, status);
647
if (ahp == AH_NULL) {
648
return AH_NULL;
649
}
650
ah = &ahp->ah_priv.h;
651
ar9300_init_offsets(ah, devid);
652
ahpriv = AH_PRIVATE(ah);
653
// AH_PRIVATE(ah)->ah_bustype = bustype;
654
655
/* FreeBSD: to make OTP work for now, provide this.. */
656
AH9300(ah)->ah_cal_mem = ath_hal_malloc(HOST_CALDATA_SIZE);
657
if (AH9300(ah)->ah_cal_mem == NULL) {
658
ath_hal_printf(ah, "%s: caldata malloc failed!\n", __func__);
659
ecode = HAL_EIO;
660
goto bad;
661
}
662
663
/*
664
* If eepromdata is not NULL, copy it it into ah_cal_mem.
665
*/
666
if (eepromdata != NULL)
667
OS_MEMCPY(AH9300(ah)->ah_cal_mem, eepromdata, HOST_CALDATA_SIZE);
668
669
/* XXX FreeBSD: enable RX mitigation */
670
ah->ah_config.ath_hal_intr_mitigation_rx = 1;
671
672
/* interrupt mitigation */
673
#ifdef AR5416_INT_MITIGATION
674
if (ah->ah_config.ath_hal_intr_mitigation_rx != 0) {
675
ahp->ah_intr_mitigation_rx = AH_TRUE;
676
}
677
#else
678
/* Enable Rx mitigation (default) */
679
ahp->ah_intr_mitigation_rx = AH_TRUE;
680
ah->ah_config.ath_hal_intr_mitigation_rx = 1;
681
682
#endif
683
#ifdef HOST_OFFLOAD
684
/* Reset default Rx mitigation values for Hornet */
685
if (AR_SREV_HORNET(ah)) {
686
ahp->ah_intr_mitigation_rx = AH_FALSE;
687
#ifdef AR5416_INT_MITIGATION
688
ah->ah_config.ath_hal_intr_mitigation_rx = 0;
689
#endif
690
}
691
#endif
692
693
if (ah->ah_config.ath_hal_intr_mitigation_tx != 0) {
694
ahp->ah_intr_mitigation_tx = AH_TRUE;
695
}
696
697
/*
698
* Read back AR_WA into a permanent copy and set bits 14 and 17.
699
* We need to do this to avoid RMW of this register.
700
* Do this before calling ar9300_set_reset_reg.
701
* If not, the AR_WA register which was inited via EEPROM
702
* will get wiped out.
703
*/
704
ahp->ah_wa_reg_val = OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_WA));
705
/* Set Bits 14 and 17 in the AR_WA register. */
706
ahp->ah_wa_reg_val |=
707
AR_WA_D3_TO_L1_DISABLE | AR_WA_ASPM_TIMER_BASED_DISABLE;
708
709
if (!ar9300_set_reset_reg(ah, HAL_RESET_POWER_ON)) { /* reset chip */
710
HALDEBUG(ah, HAL_DEBUG_RESET, "%s: couldn't reset chip\n", __func__);
711
ecode = HAL_EIO;
712
goto bad;
713
}
714
715
if (AR_SREV_JUPITER(ah)
716
#if ATH_WOW_OFFLOAD
717
&& !HAL_WOW_CTRL(ah, HAL_WOW_OFFLOAD_SET_4004_BIT14)
718
#endif
719
)
720
{
721
/* Jupiter doesn't need bit 14 to be set. */
722
ahp->ah_wa_reg_val &= ~AR_WA_D3_TO_L1_DISABLE;
723
OS_REG_WRITE(ah, AR_HOSTIF_REG(ah, AR_WA), ahp->ah_wa_reg_val);
724
}
725
726
#if ATH_SUPPORT_MCI
727
if (AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)) {
728
#if 1
729
ah->ah_btCoexSetWeights = ar9300_mci_bt_coex_set_weights;
730
ah->ah_btCoexDisable = ar9300_mci_bt_coex_disable;
731
ah->ah_btCoexEnable = ar9300_mci_bt_coex_enable;
732
#endif
733
ahp->ah_mci_ready = AH_FALSE;
734
ahp->ah_mci_bt_state = MCI_BT_SLEEP;
735
ahp->ah_mci_coex_major_version_wlan = MCI_GPM_COEX_MAJOR_VERSION_WLAN;
736
ahp->ah_mci_coex_minor_version_wlan = MCI_GPM_COEX_MINOR_VERSION_WLAN;
737
ahp->ah_mci_coex_major_version_bt = MCI_GPM_COEX_MAJOR_VERSION_DEFAULT;
738
ahp->ah_mci_coex_minor_version_bt = MCI_GPM_COEX_MINOR_VERSION_DEFAULT;
739
ahp->ah_mci_coex_bt_version_known = AH_FALSE;
740
ahp->ah_mci_coex_2g5g_update = AH_TRUE; /* track if 2g5g status sent */
741
/* will be updated before boot up sequence */
742
ahp->ah_mci_coex_is_2g = AH_TRUE;
743
ahp->ah_mci_coex_wlan_channels_update = AH_FALSE;
744
ahp->ah_mci_coex_wlan_channels[0] = 0x00000000;
745
ahp->ah_mci_coex_wlan_channels[1] = 0xffffffff;
746
ahp->ah_mci_coex_wlan_channels[2] = 0xffffffff;
747
ahp->ah_mci_coex_wlan_channels[3] = 0x7fffffff;
748
ahp->ah_mci_query_bt = AH_TRUE; /* In case WLAN start after BT */
749
ahp->ah_mci_unhalt_bt_gpm = AH_TRUE; /* Send UNHALT at beginning */
750
ahp->ah_mci_halted_bt_gpm = AH_FALSE; /* Allow first HALT */
751
ahp->ah_mci_need_flush_btinfo = AH_FALSE;
752
ahp->ah_mci_wlan_cal_seq = 0;
753
ahp->ah_mci_wlan_cal_done = 0;
754
}
755
#endif /* ATH_SUPPORT_MCI */
756
757
#if ATH_WOW_OFFLOAD
758
ahp->ah_mcast_filter_l32_set = 0;
759
ahp->ah_mcast_filter_u32_set = 0;
760
#endif
761
762
if (AR_SREV_HORNET(ah)) {
763
#ifdef AH_SUPPORT_HORNET
764
if (!AR_SREV_HORNET_11(ah)) {
765
/*
766
* Do not check bootstrap register, which cannot be trusted
767
* due to s26 switch issue on CUS164/AP121.
768
*/
769
ahp->clk_25mhz = 1;
770
HALDEBUG(AH_NULL, HAL_DEBUG_UNMASKABLE, "Bootstrap clock 25MHz\n");
771
} else {
772
/* check bootstrap clock setting */
773
#define AR_SOC_SEL_25M_40M 0xB80600AC
774
#define REG_WRITE(_reg, _val) *((volatile u_int32_t *)(_reg)) = (_val);
775
#define REG_READ(_reg) (*((volatile u_int32_t *)(_reg)))
776
if (REG_READ(AR_SOC_SEL_25M_40M) & 0x1) {
777
ahp->clk_25mhz = 0;
778
HALDEBUG(AH_NULL, HAL_DEBUG_UNMASKABLE,
779
"Bootstrap clock 40MHz\n");
780
} else {
781
ahp->clk_25mhz = 1;
782
HALDEBUG(AH_NULL, HAL_DEBUG_UNMASKABLE,
783
"Bootstrap clock 25MHz\n");
784
}
785
#undef REG_READ
786
#undef REG_WRITE
787
#undef AR_SOC_SEL_25M_40M
788
}
789
#endif /* AH_SUPPORT_HORNET */
790
}
791
792
if (AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah)) {
793
/* check bootstrap clock setting */
794
#define AR9340_SOC_SEL_25M_40M 0xB80600B0
795
#define AR9340_REF_CLK_40 (1 << 4) /* 0 - 25MHz 1 - 40 MHz */
796
#define REG_READ(_reg) (*((volatile u_int32_t *)(_reg)))
797
if (REG_READ(AR9340_SOC_SEL_25M_40M) & AR9340_REF_CLK_40) {
798
ahp->clk_25mhz = 0;
799
HALDEBUG(AH_NULL, HAL_DEBUG_UNMASKABLE, "Bootstrap clock 40MHz\n");
800
} else {
801
ahp->clk_25mhz = 1;
802
HALDEBUG(AH_NULL, HAL_DEBUG_UNMASKABLE, "Bootstrap clock 25MHz\n");
803
}
804
#undef REG_READ
805
#undef AR9340_SOC_SEL_25M_40M
806
#undef AR9340_REF_CLK_40
807
}
808
809
if (AR_SREV_HONEYBEE(ah)) {
810
ahp->clk_25mhz = 1;
811
}
812
813
ar9300_init_pll(ah, AH_NULL);
814
815
if (!ar9300_set_power_mode(ah, HAL_PM_AWAKE, AH_TRUE)) {
816
HALDEBUG(ah, HAL_DEBUG_RESET, "%s: couldn't wakeup chip\n", __func__);
817
ecode = HAL_EIO;
818
goto bad;
819
}
820
821
/* No serialization of Register Accesses needed. */
822
ah->ah_config.ah_serialise_reg_war = SER_REG_MODE_OFF;
823
HALDEBUG(ah, HAL_DEBUG_RESET, "%s: ah_serialise_reg_war is %d\n",
824
__func__, ah->ah_config.ah_serialise_reg_war);
825
826
/*
827
* Add mac revision check when needed.
828
* - Osprey 1.0 and 2.0 no longer supported.
829
*/
830
if (((ahpriv->ah_macVersion == AR_SREV_VERSION_OSPREY) &&
831
(ahpriv->ah_macRev <= AR_SREV_REVISION_OSPREY_20)) ||
832
(ahpriv->ah_macVersion != AR_SREV_VERSION_OSPREY &&
833
ahpriv->ah_macVersion != AR_SREV_VERSION_WASP &&
834
ahpriv->ah_macVersion != AR_SREV_VERSION_HORNET &&
835
ahpriv->ah_macVersion != AR_SREV_VERSION_POSEIDON &&
836
ahpriv->ah_macVersion != AR_SREV_VERSION_SCORPION &&
837
ahpriv->ah_macVersion != AR_SREV_VERSION_HONEYBEE &&
838
ahpriv->ah_macVersion != AR_SREV_VERSION_JUPITER &&
839
ahpriv->ah_macVersion != AR_SREV_VERSION_APHRODITE) ) {
840
HALDEBUG(ah, HAL_DEBUG_RESET,
841
"%s: Mac Chip Rev 0x%02x.%x is not supported by this driver\n",
842
__func__,
843
ahpriv->ah_macVersion,
844
ahpriv->ah_macRev);
845
ecode = HAL_ENOTSUPP;
846
goto bad;
847
}
848
849
AH_PRIVATE(ah)->ah_phyRev = OS_REG_READ(ah, AR_PHY_CHIP_ID);
850
851
/* Setup supported calibrations */
852
ahp->ah_iq_cal_data.cal_data = &iq_cal_single_sample;
853
ahp->ah_supp_cals = IQ_MISMATCH_CAL;
854
855
/* Enable ANI */
856
ahp->ah_ani_function = HAL_ANI_ALL;
857
858
/* Enable RIFS */
859
ahp->ah_rifs_enabled = AH_TRUE;
860
861
/* by default, stop RX also in abort txdma, due to
862
"Unable to stop TxDMA" msg observed */
863
ahp->ah_abort_txdma_norx = AH_TRUE;
864
865
/* do not use optional tx chainmask by default */
866
ahp->ah_tx_chainmaskopt = 0;
867
868
ahp->ah_skip_rx_iq_cal = AH_FALSE;
869
ahp->ah_rx_cal_complete = AH_FALSE;
870
ahp->ah_rx_cal_chan = 0;
871
ahp->ah_rx_cal_chan_flag = 0;
872
873
HALDEBUG(ah, HAL_DEBUG_RESET,
874
"%s: This Mac Chip Rev 0x%02x.%x is \n", __func__,
875
ahpriv->ah_macVersion,
876
ahpriv->ah_macRev);
877
878
if (AR_SREV_HORNET_12(ah)) {
879
/* mac */
880
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
881
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
882
ar9331_hornet1_2_mac_core,
883
ARRAY_LENGTH(ar9331_hornet1_2_mac_core), 2);
884
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
885
ar9331_hornet1_2_mac_postamble,
886
ARRAY_LENGTH(ar9331_hornet1_2_mac_postamble), 5);
887
888
/* bb */
889
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE], NULL, 0, 0);
890
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
891
ar9331_hornet1_2_baseband_core,
892
ARRAY_LENGTH(ar9331_hornet1_2_baseband_core), 2);
893
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
894
ar9331_hornet1_2_baseband_postamble,
895
ARRAY_LENGTH(ar9331_hornet1_2_baseband_postamble), 5);
896
897
/* radio */
898
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
899
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
900
ar9331_hornet1_2_radio_core,
901
ARRAY_LENGTH(ar9331_hornet1_2_radio_core), 2);
902
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST], NULL, 0, 0);
903
904
/* soc */
905
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
906
ar9331_hornet1_2_soc_preamble,
907
ARRAY_LENGTH(ar9331_hornet1_2_soc_preamble), 2);
908
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
909
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST],
910
ar9331_hornet1_2_soc_postamble,
911
ARRAY_LENGTH(ar9331_hornet1_2_soc_postamble), 2);
912
913
/* rx/tx gain */
914
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
915
ar9331_common_rx_gain_hornet1_2,
916
ARRAY_LENGTH(ar9331_common_rx_gain_hornet1_2), 2);
917
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
918
ar9331_modes_lowest_ob_db_tx_gain_hornet1_2,
919
ARRAY_LENGTH(ar9331_modes_lowest_ob_db_tx_gain_hornet1_2), 5);
920
921
ah->ah_config.ath_hal_pcie_power_save_enable = 0;
922
923
/* Japan 2484Mhz CCK settings */
924
INIT_INI_ARRAY(&ahp->ah_ini_japan2484,
925
ar9331_hornet1_2_baseband_core_txfir_coeff_japan_2484,
926
ARRAY_LENGTH(
927
ar9331_hornet1_2_baseband_core_txfir_coeff_japan_2484), 2);
928
929
#if 0 /* ATH_WOW */
930
/* SerDes values during WOW sleep */
931
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_wow, ar9300_pcie_phy_awow,
932
ARRAY_LENGTH(ar9300_pcie_phy_awow), 2);
933
#endif
934
935
/* additional clock settings */
936
if (AH9300(ah)->clk_25mhz) {
937
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
938
ar9331_hornet1_2_xtal_25M,
939
ARRAY_LENGTH(ar9331_hornet1_2_xtal_25M), 2);
940
} else {
941
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
942
ar9331_hornet1_2_xtal_40M,
943
ARRAY_LENGTH(ar9331_hornet1_2_xtal_40M), 2);
944
}
945
946
} else if (AR_SREV_HORNET_11(ah)) {
947
/* mac */
948
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
949
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
950
ar9331_hornet1_1_mac_core,
951
ARRAY_LENGTH(ar9331_hornet1_1_mac_core), 2);
952
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
953
ar9331_hornet1_1_mac_postamble,
954
ARRAY_LENGTH(ar9331_hornet1_1_mac_postamble), 5);
955
956
/* bb */
957
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE], NULL, 0, 0);
958
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
959
ar9331_hornet1_1_baseband_core,
960
ARRAY_LENGTH(ar9331_hornet1_1_baseband_core), 2);
961
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
962
ar9331_hornet1_1_baseband_postamble,
963
ARRAY_LENGTH(ar9331_hornet1_1_baseband_postamble), 5);
964
965
/* radio */
966
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
967
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
968
ar9331_hornet1_1_radio_core,
969
ARRAY_LENGTH(ar9331_hornet1_1_radio_core), 2);
970
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST], NULL, 0, 0);
971
972
/* soc */
973
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
974
ar9331_hornet1_1_soc_preamble,
975
ARRAY_LENGTH(ar9331_hornet1_1_soc_preamble), 2);
976
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
977
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST],
978
ar9331_hornet1_1_soc_postamble,
979
ARRAY_LENGTH(ar9331_hornet1_1_soc_postamble), 2);
980
981
/* rx/tx gain */
982
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
983
ar9331_common_rx_gain_hornet1_1,
984
ARRAY_LENGTH(ar9331_common_rx_gain_hornet1_1), 2);
985
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
986
ar9331_modes_lowest_ob_db_tx_gain_hornet1_1,
987
ARRAY_LENGTH(ar9331_modes_lowest_ob_db_tx_gain_hornet1_1), 5);
988
989
ah->ah_config.ath_hal_pcie_power_save_enable = 0;
990
991
/* Japan 2484Mhz CCK settings */
992
INIT_INI_ARRAY(&ahp->ah_ini_japan2484,
993
ar9331_hornet1_1_baseband_core_txfir_coeff_japan_2484,
994
ARRAY_LENGTH(
995
ar9331_hornet1_1_baseband_core_txfir_coeff_japan_2484), 2);
996
997
#if 0 /* ATH_WOW */
998
/* SerDes values during WOW sleep */
999
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_wow, ar9300_pcie_phy_awow,
1000
N(ar9300_pcie_phy_awow), 2);
1001
#endif
1002
1003
/* additional clock settings */
1004
if (AH9300(ah)->clk_25mhz) {
1005
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
1006
ar9331_hornet1_1_xtal_25M,
1007
ARRAY_LENGTH(ar9331_hornet1_1_xtal_25M), 2);
1008
} else {
1009
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
1010
ar9331_hornet1_1_xtal_40M,
1011
ARRAY_LENGTH(ar9331_hornet1_1_xtal_40M), 2);
1012
}
1013
1014
} else if (AR_SREV_POSEIDON_11_OR_LATER(ah)) {
1015
/* mac */
1016
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
1017
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
1018
ar9485_poseidon1_1_mac_core,
1019
ARRAY_LENGTH( ar9485_poseidon1_1_mac_core), 2);
1020
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
1021
ar9485_poseidon1_1_mac_postamble,
1022
ARRAY_LENGTH(ar9485_poseidon1_1_mac_postamble), 5);
1023
1024
/* bb */
1025
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE],
1026
ar9485_poseidon1_1, ARRAY_LENGTH(ar9485_poseidon1_1), 2);
1027
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
1028
ar9485_poseidon1_1_baseband_core,
1029
ARRAY_LENGTH(ar9485_poseidon1_1_baseband_core), 2);
1030
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
1031
ar9485_poseidon1_1_baseband_postamble,
1032
ARRAY_LENGTH(ar9485_poseidon1_1_baseband_postamble), 5);
1033
1034
/* radio */
1035
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
1036
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
1037
ar9485_poseidon1_1_radio_core,
1038
ARRAY_LENGTH(ar9485_poseidon1_1_radio_core), 2);
1039
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST],
1040
ar9485_poseidon1_1_radio_postamble,
1041
ARRAY_LENGTH(ar9485_poseidon1_1_radio_postamble), 2);
1042
1043
/* soc */
1044
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
1045
ar9485_poseidon1_1_soc_preamble,
1046
ARRAY_LENGTH(ar9485_poseidon1_1_soc_preamble), 2);
1047
1048
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
1049
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST], NULL, 0, 0);
1050
1051
/* rx/tx gain */
1052
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
1053
ar9485_common_wo_xlna_rx_gain_poseidon1_1,
1054
ARRAY_LENGTH(ar9485_common_wo_xlna_rx_gain_poseidon1_1), 2);
1055
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
1056
ar9485_modes_lowest_ob_db_tx_gain_poseidon1_1,
1057
ARRAY_LENGTH(ar9485_modes_lowest_ob_db_tx_gain_poseidon1_1), 5);
1058
1059
/* Japan 2484Mhz CCK settings */
1060
INIT_INI_ARRAY(&ahp->ah_ini_japan2484,
1061
ar9485_poseidon1_1_baseband_core_txfir_coeff_japan_2484,
1062
ARRAY_LENGTH(
1063
ar9485_poseidon1_1_baseband_core_txfir_coeff_japan_2484), 2);
1064
1065
/* Load PCIE SERDES settings from INI */
1066
if (ah->ah_config.ath_hal_pcie_clock_req) {
1067
/* Pci-e Clock Request = 1 */
1068
if (ah->ah_config.ath_hal_pll_pwr_save
1069
& AR_PCIE_PLL_PWRSAVE_CONTROL)
1070
{
1071
/* Sleep Setting */
1072
if (ah->ah_config.ath_hal_pll_pwr_save &
1073
AR_PCIE_PLL_PWRSAVE_ON_D3)
1074
{
1075
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1076
ar9485_poseidon1_1_pcie_phy_clkreq_enable_L1,
1077
ARRAY_LENGTH(
1078
ar9485_poseidon1_1_pcie_phy_clkreq_enable_L1),
1079
2);
1080
} else {
1081
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1082
ar9485_poseidon1_1_pcie_phy_pll_on_clkreq_enable_L1,
1083
ARRAY_LENGTH(
1084
ar9485_poseidon1_1_pcie_phy_pll_on_clkreq_enable_L1),
1085
2);
1086
}
1087
/* Awake Setting */
1088
if (ah->ah_config.ath_hal_pll_pwr_save &
1089
AR_PCIE_PLL_PWRSAVE_ON_D0)
1090
{
1091
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1092
ar9485_poseidon1_1_pcie_phy_clkreq_enable_L1,
1093
ARRAY_LENGTH(
1094
ar9485_poseidon1_1_pcie_phy_clkreq_enable_L1),
1095
2);
1096
} else {
1097
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1098
ar9485_poseidon1_1_pcie_phy_pll_on_clkreq_enable_L1,
1099
ARRAY_LENGTH(
1100
ar9485_poseidon1_1_pcie_phy_pll_on_clkreq_enable_L1),
1101
2);
1102
}
1103
1104
} else {
1105
/*Use driver default setting*/
1106
/* Sleep Setting */
1107
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1108
ar9485_poseidon1_1_pcie_phy_clkreq_enable_L1,
1109
ARRAY_LENGTH(ar9485_poseidon1_1_pcie_phy_clkreq_enable_L1),
1110
2);
1111
/* Awake Setting */
1112
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1113
ar9485_poseidon1_1_pcie_phy_clkreq_enable_L1,
1114
ARRAY_LENGTH(ar9485_poseidon1_1_pcie_phy_clkreq_enable_L1),
1115
2);
1116
}
1117
} else {
1118
/* Pci-e Clock Request = 0 */
1119
if (ah->ah_config.ath_hal_pll_pwr_save
1120
& AR_PCIE_PLL_PWRSAVE_CONTROL)
1121
{
1122
/* Sleep Setting */
1123
if (ah->ah_config.ath_hal_pll_pwr_save &
1124
AR_PCIE_PLL_PWRSAVE_ON_D3)
1125
{
1126
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1127
ar9485_poseidon1_1_pcie_phy_clkreq_disable_L1,
1128
ARRAY_LENGTH(
1129
ar9485_poseidon1_1_pcie_phy_clkreq_disable_L1),
1130
2);
1131
} else {
1132
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1133
ar9485_poseidon1_1_pcie_phy_pll_on_clkreq_disable_L1,
1134
ARRAY_LENGTH(
1135
ar9485_poseidon1_1_pcie_phy_pll_on_clkreq_disable_L1),
1136
2);
1137
}
1138
/* Awake Setting */
1139
if (ah->ah_config.ath_hal_pll_pwr_save &
1140
AR_PCIE_PLL_PWRSAVE_ON_D0)
1141
{
1142
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1143
ar9485_poseidon1_1_pcie_phy_clkreq_disable_L1,
1144
ARRAY_LENGTH(
1145
ar9485_poseidon1_1_pcie_phy_clkreq_disable_L1),
1146
2);
1147
} else {
1148
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1149
ar9485_poseidon1_1_pcie_phy_pll_on_clkreq_disable_L1,
1150
ARRAY_LENGTH(
1151
ar9485_poseidon1_1_pcie_phy_pll_on_clkreq_disable_L1),
1152
2);
1153
}
1154
1155
} else {
1156
/*Use driver default setting*/
1157
/* Sleep Setting */
1158
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1159
ar9485_poseidon1_1_pcie_phy_clkreq_disable_L1,
1160
ARRAY_LENGTH(ar9485_poseidon1_1_pcie_phy_clkreq_disable_L1),
1161
2);
1162
/* Awake Setting */
1163
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1164
ar9485_poseidon1_1_pcie_phy_clkreq_disable_L1,
1165
ARRAY_LENGTH(ar9485_poseidon1_1_pcie_phy_clkreq_disable_L1),
1166
2);
1167
}
1168
}
1169
/* pcie ps setting will honor registry setting, default is 0 */
1170
//ah->ah_config.ath_hal_pciePowerSaveEnable = 0;
1171
} else if (AR_SREV_POSEIDON(ah)) {
1172
/* mac */
1173
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
1174
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
1175
ar9485_poseidon1_0_mac_core,
1176
ARRAY_LENGTH(ar9485_poseidon1_0_mac_core), 2);
1177
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
1178
ar9485_poseidon1_0_mac_postamble,
1179
ARRAY_LENGTH(ar9485_poseidon1_0_mac_postamble), 5);
1180
1181
/* bb */
1182
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE],
1183
ar9485_poseidon1_0,
1184
ARRAY_LENGTH(ar9485_poseidon1_0), 2);
1185
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
1186
ar9485_poseidon1_0_baseband_core,
1187
ARRAY_LENGTH(ar9485_poseidon1_0_baseband_core), 2);
1188
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
1189
ar9485_poseidon1_0_baseband_postamble,
1190
ARRAY_LENGTH(ar9485_poseidon1_0_baseband_postamble), 5);
1191
1192
/* radio */
1193
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
1194
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
1195
ar9485_poseidon1_0_radio_core,
1196
ARRAY_LENGTH(ar9485_poseidon1_0_radio_core), 2);
1197
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST],
1198
ar9485_poseidon1_0_radio_postamble,
1199
ARRAY_LENGTH(ar9485_poseidon1_0_radio_postamble), 2);
1200
1201
/* soc */
1202
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
1203
ar9485_poseidon1_0_soc_preamble,
1204
ARRAY_LENGTH(ar9485_poseidon1_0_soc_preamble), 2);
1205
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
1206
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST], NULL, 0, 0);
1207
1208
/* rx/tx gain */
1209
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
1210
ar9485Common_wo_xlna_rx_gain_poseidon1_0,
1211
ARRAY_LENGTH(ar9485Common_wo_xlna_rx_gain_poseidon1_0), 2);
1212
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
1213
ar9485Modes_lowest_ob_db_tx_gain_poseidon1_0,
1214
ARRAY_LENGTH(ar9485Modes_lowest_ob_db_tx_gain_poseidon1_0), 5);
1215
1216
/* Japan 2484Mhz CCK settings */
1217
INIT_INI_ARRAY(&ahp->ah_ini_japan2484,
1218
ar9485_poseidon1_0_baseband_core_txfir_coeff_japan_2484,
1219
ARRAY_LENGTH(
1220
ar9485_poseidon1_0_baseband_core_txfir_coeff_japan_2484), 2);
1221
1222
/* Load PCIE SERDES settings from INI */
1223
if (ah->ah_config.ath_hal_pcie_clock_req) {
1224
/* Pci-e Clock Request = 1 */
1225
if (ah->ah_config.ath_hal_pll_pwr_save
1226
& AR_PCIE_PLL_PWRSAVE_CONTROL)
1227
{
1228
/* Sleep Setting */
1229
if (ah->ah_config.ath_hal_pll_pwr_save &
1230
AR_PCIE_PLL_PWRSAVE_ON_D3)
1231
{
1232
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1233
ar9485_poseidon1_0_pcie_phy_clkreq_enable_L1,
1234
ARRAY_LENGTH(
1235
ar9485_poseidon1_0_pcie_phy_clkreq_enable_L1),
1236
2);
1237
} else {
1238
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1239
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_enable_L1,
1240
ARRAY_LENGTH(
1241
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_enable_L1),
1242
2);
1243
}
1244
/* Awake Setting */
1245
if (ah->ah_config.ath_hal_pll_pwr_save &
1246
AR_PCIE_PLL_PWRSAVE_ON_D0)
1247
{
1248
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1249
ar9485_poseidon1_0_pcie_phy_clkreq_enable_L1,
1250
ARRAY_LENGTH(
1251
ar9485_poseidon1_0_pcie_phy_clkreq_enable_L1),
1252
2);
1253
} else {
1254
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1255
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_enable_L1,
1256
ARRAY_LENGTH(
1257
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_enable_L1),
1258
2);
1259
}
1260
1261
} else {
1262
/*Use driver default setting*/
1263
/* Sleep Setting */
1264
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1265
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_enable_L1,
1266
ARRAY_LENGTH(
1267
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_enable_L1),
1268
2);
1269
/* Awake Setting */
1270
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1271
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_enable_L1,
1272
ARRAY_LENGTH(
1273
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_enable_L1),
1274
2);
1275
}
1276
} else {
1277
/* Pci-e Clock Request = 0 */
1278
if (ah->ah_config.ath_hal_pll_pwr_save
1279
& AR_PCIE_PLL_PWRSAVE_CONTROL)
1280
{
1281
/* Sleep Setting */
1282
if (ah->ah_config.ath_hal_pll_pwr_save &
1283
AR_PCIE_PLL_PWRSAVE_ON_D3)
1284
{
1285
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1286
ar9485_poseidon1_0_pcie_phy_clkreq_disable_L1,
1287
ARRAY_LENGTH(
1288
ar9485_poseidon1_0_pcie_phy_clkreq_disable_L1),
1289
2);
1290
} else {
1291
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1292
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_disable_L1,
1293
ARRAY_LENGTH(
1294
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_disable_L1),
1295
2);
1296
}
1297
/* Awake Setting */
1298
if (ah->ah_config.ath_hal_pll_pwr_save &
1299
AR_PCIE_PLL_PWRSAVE_ON_D0)
1300
{
1301
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1302
ar9485_poseidon1_0_pcie_phy_clkreq_disable_L1,
1303
ARRAY_LENGTH(
1304
ar9485_poseidon1_0_pcie_phy_clkreq_disable_L1),
1305
2);
1306
} else {
1307
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1308
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_disable_L1,
1309
ARRAY_LENGTH(
1310
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_disable_L1),
1311
2);
1312
}
1313
1314
} else {
1315
/*Use driver default setting*/
1316
/* Sleep Setting */
1317
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1318
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_disable_L1,
1319
ARRAY_LENGTH(
1320
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_disable_L1),
1321
2);
1322
/* Awake Setting */
1323
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1324
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_disable_L1,
1325
ARRAY_LENGTH(
1326
ar9485_poseidon1_0_pcie_phy_pll_on_clkreq_disable_L1),
1327
2);
1328
}
1329
}
1330
/* pcie ps setting will honor registry setting, default is 0 */
1331
/*ah->ah_config.ath_hal_pcie_power_save_enable = 0;*/
1332
1333
#if 0 /* ATH_WOW */
1334
/* SerDes values during WOW sleep */
1335
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_wow, ar9300_pcie_phy_awow,
1336
ARRAY_LENGTH(ar9300_pcie_phy_awow), 2);
1337
#endif
1338
1339
} else if (AR_SREV_WASP(ah)) {
1340
/* mac */
1341
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
1342
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
1343
ar9340_wasp_1p0_mac_core,
1344
ARRAY_LENGTH(ar9340_wasp_1p0_mac_core), 2);
1345
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
1346
ar9340_wasp_1p0_mac_postamble,
1347
ARRAY_LENGTH(ar9340_wasp_1p0_mac_postamble), 5);
1348
1349
/* bb */
1350
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE], NULL, 0, 0);
1351
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
1352
ar9340_wasp_1p0_baseband_core,
1353
ARRAY_LENGTH(ar9340_wasp_1p0_baseband_core), 2);
1354
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
1355
ar9340_wasp_1p0_baseband_postamble,
1356
ARRAY_LENGTH(ar9340_wasp_1p0_baseband_postamble), 5);
1357
1358
/* radio */
1359
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
1360
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
1361
ar9340_wasp_1p0_radio_core,
1362
ARRAY_LENGTH(ar9340_wasp_1p0_radio_core), 2);
1363
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST],
1364
ar9340_wasp_1p0_radio_postamble,
1365
ARRAY_LENGTH(ar9340_wasp_1p0_radio_postamble), 5);
1366
1367
/* soc */
1368
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
1369
ar9340_wasp_1p0_soc_preamble,
1370
ARRAY_LENGTH(ar9340_wasp_1p0_soc_preamble), 2);
1371
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
1372
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST],
1373
ar9340_wasp_1p0_soc_postamble,
1374
ARRAY_LENGTH(ar9340_wasp_1p0_soc_postamble), 5);
1375
1376
/* rx/tx gain */
1377
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
1378
ar9340Common_wo_xlna_rx_gain_table_wasp_1p0,
1379
ARRAY_LENGTH(ar9340Common_wo_xlna_rx_gain_table_wasp_1p0), 2);
1380
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
1381
ar9340Modes_high_ob_db_tx_gain_table_wasp_1p0,
1382
ARRAY_LENGTH(ar9340Modes_high_ob_db_tx_gain_table_wasp_1p0), 5);
1383
1384
ah->ah_config.ath_hal_pcie_power_save_enable = 0;
1385
1386
/* Fast clock modal settings */
1387
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
1388
ar9340Modes_fast_clock_wasp_1p0,
1389
ARRAY_LENGTH(ar9340Modes_fast_clock_wasp_1p0), 3);
1390
1391
/* XXX TODO: need to add this for freebsd; it's missing from the current .ini files */
1392
#if 0
1393
/* Japan 2484Mhz CCK settings */
1394
INIT_INI_ARRAY(&ahp->ah_ini_japan2484,
1395
ar9340_wasp_1p0_baseband_core_txfir_coeff_japan_2484,
1396
ARRAY_LENGTH(
1397
ar9340_wasp_1p0_baseband_core_txfir_coeff_japan_2484), 2);
1398
#endif
1399
1400
/* Additional setttings for 40Mhz */
1401
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional_40mhz,
1402
ar9340_wasp_1p0_radio_core_40M,
1403
ARRAY_LENGTH(ar9340_wasp_1p0_radio_core_40M), 2);
1404
1405
/* DFS */
1406
INIT_INI_ARRAY(&ahp->ah_ini_dfs,
1407
ar9340_wasp_1p0_baseband_postamble_dfs_channel,
1408
ARRAY_LENGTH(ar9340_wasp_1p0_baseband_postamble_dfs_channel), 3);
1409
} else if (AR_SREV_SCORPION(ah)) {
1410
/* mac */
1411
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
1412
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
1413
ar955x_scorpion_1p0_mac_core,
1414
ARRAY_LENGTH(ar955x_scorpion_1p0_mac_core), 2);
1415
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
1416
ar955x_scorpion_1p0_mac_postamble,
1417
ARRAY_LENGTH(ar955x_scorpion_1p0_mac_postamble), 5);
1418
1419
/* bb */
1420
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE], NULL, 0, 0);
1421
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
1422
ar955x_scorpion_1p0_baseband_core,
1423
ARRAY_LENGTH(ar955x_scorpion_1p0_baseband_core), 2);
1424
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
1425
ar955x_scorpion_1p0_baseband_postamble,
1426
ARRAY_LENGTH(ar955x_scorpion_1p0_baseband_postamble), 5);
1427
1428
/* radio */
1429
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
1430
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
1431
ar955x_scorpion_1p0_radio_core,
1432
ARRAY_LENGTH(ar955x_scorpion_1p0_radio_core), 2);
1433
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST],
1434
ar955x_scorpion_1p0_radio_postamble,
1435
ARRAY_LENGTH(ar955x_scorpion_1p0_radio_postamble), 5);
1436
1437
/* soc */
1438
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
1439
ar955x_scorpion_1p0_soc_preamble,
1440
ARRAY_LENGTH(ar955x_scorpion_1p0_soc_preamble), 2);
1441
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
1442
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST],
1443
ar955x_scorpion_1p0_soc_postamble,
1444
ARRAY_LENGTH(ar955x_scorpion_1p0_soc_postamble), 5);
1445
1446
/* rx/tx gain */
1447
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
1448
ar955xCommon_wo_xlna_rx_gain_table_scorpion_1p0,
1449
ARRAY_LENGTH(ar955xCommon_wo_xlna_rx_gain_table_scorpion_1p0), 2);
1450
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_bounds,
1451
ar955xCommon_wo_xlna_rx_gain_bounds_scorpion_1p0,
1452
ARRAY_LENGTH(ar955xCommon_wo_xlna_rx_gain_bounds_scorpion_1p0), 5);
1453
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
1454
ar955xModes_no_xpa_tx_gain_table_scorpion_1p0,
1455
ARRAY_LENGTH(ar955xModes_no_xpa_tx_gain_table_scorpion_1p0), 5);
1456
1457
/*ath_hal_pciePowerSaveEnable should be 2 for OWL/Condor and 0 for merlin */
1458
ah->ah_config.ath_hal_pcie_power_save_enable = 0;
1459
1460
/* Fast clock modal settings */
1461
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
1462
ar955xModes_fast_clock_scorpion_1p0,
1463
ARRAY_LENGTH(ar955xModes_fast_clock_scorpion_1p0), 3);
1464
1465
/* Additional setttings for 40Mhz */
1466
//INIT_INI_ARRAY(&ahp->ah_ini_modes_additional_40M,
1467
// ar955x_scorpion_1p0_radio_core_40M,
1468
// ARRAY_LENGTH(ar955x_scorpion_1p0_radio_core_40M), 2);
1469
} else if (AR_SREV_HONEYBEE(ah)) {
1470
/* mac */
1471
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
1472
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
1473
qca953x_honeybee_1p0_mac_core,
1474
ARRAY_LENGTH(qca953x_honeybee_1p0_mac_core), 2);
1475
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
1476
qca953x_honeybee_1p0_mac_postamble,
1477
ARRAY_LENGTH(qca953x_honeybee_1p0_mac_postamble), 5);
1478
1479
/* bb */
1480
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE], NULL, 0, 0);
1481
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
1482
qca953x_honeybee_1p0_baseband_core,
1483
ARRAY_LENGTH(qca953x_honeybee_1p0_baseband_core), 2);
1484
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
1485
qca953x_honeybee_1p0_baseband_postamble,
1486
ARRAY_LENGTH(qca953x_honeybee_1p0_baseband_postamble), 5);
1487
1488
/* radio */
1489
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
1490
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
1491
qca953x_honeybee_1p0_radio_core,
1492
ARRAY_LENGTH(qca953x_honeybee_1p0_radio_core), 2);
1493
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST],
1494
qca953x_honeybee_1p0_radio_postamble,
1495
ARRAY_LENGTH(qca953x_honeybee_1p0_radio_postamble), 5);
1496
1497
/* soc */
1498
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
1499
qca953x_honeybee_1p0_soc_preamble,
1500
ARRAY_LENGTH(qca953x_honeybee_1p0_soc_preamble), 2);
1501
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
1502
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST],
1503
qca953x_honeybee_1p0_soc_postamble,
1504
ARRAY_LENGTH(qca953x_honeybee_1p0_soc_postamble), 5);
1505
1506
/* rx/tx gain */
1507
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
1508
qca953xCommon_wo_xlna_rx_gain_table_honeybee_1p0,
1509
ARRAY_LENGTH(qca953xCommon_wo_xlna_rx_gain_table_honeybee_1p0), 2);
1510
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_bounds,
1511
qca953xCommon_wo_xlna_rx_gain_bounds_honeybee_1p0,
1512
ARRAY_LENGTH(qca953xCommon_wo_xlna_rx_gain_bounds_honeybee_1p0), 5);
1513
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
1514
qca953xModes_no_xpa_tx_gain_table_honeybee_1p0,
1515
ARRAY_LENGTH(qca953xModes_no_xpa_tx_gain_table_honeybee_1p0), 2);
1516
1517
/*ath_hal_pciePowerSaveEnable should be 2 for OWL/Condor and 0 for merlin */
1518
ah->ah_config.ath_hal_pcie_power_save_enable = 0;
1519
1520
/* Fast clock modal settings */
1521
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
1522
qca953xModes_fast_clock_honeybee_1p0,
1523
ARRAY_LENGTH(qca953xModes_fast_clock_honeybee_1p0), 3);
1524
1525
/* Additional setttings for 40Mhz */
1526
//INIT_INI_ARRAY(&ahp->ah_ini_modes_additional_40M,
1527
// qca953x_honeybee_1p0_radio_core_40M,
1528
// ARRAY_LENGTH(qca953x_honeybee_1p0_radio_core_40M), 2);
1529
1530
} else if (AR_SREV_JUPITER_10(ah)) {
1531
/* Jupiter: new INI format (pre, core, post arrays per subsystem) */
1532
1533
/* mac */
1534
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
1535
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
1536
ar9300_jupiter_1p0_mac_core,
1537
ARRAY_LENGTH(ar9300_jupiter_1p0_mac_core), 2);
1538
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
1539
ar9300_jupiter_1p0_mac_postamble,
1540
ARRAY_LENGTH(ar9300_jupiter_1p0_mac_postamble), 5);
1541
1542
/* bb */
1543
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE], NULL, 0, 0);
1544
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
1545
ar9300_jupiter_1p0_baseband_core,
1546
ARRAY_LENGTH(ar9300_jupiter_1p0_baseband_core), 2);
1547
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
1548
ar9300_jupiter_1p0_baseband_postamble,
1549
ARRAY_LENGTH(ar9300_jupiter_1p0_baseband_postamble), 5);
1550
1551
/* radio */
1552
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
1553
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
1554
ar9300_jupiter_1p0_radio_core,
1555
ARRAY_LENGTH(ar9300_jupiter_1p0_radio_core), 2);
1556
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST],
1557
ar9300_jupiter_1p0_radio_postamble,
1558
ARRAY_LENGTH(ar9300_jupiter_1p0_radio_postamble), 5);
1559
1560
/* soc */
1561
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
1562
ar9300_jupiter_1p0_soc_preamble,
1563
ARRAY_LENGTH(ar9300_jupiter_1p0_soc_preamble), 2);
1564
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
1565
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST],
1566
ar9300_jupiter_1p0_soc_postamble,
1567
ARRAY_LENGTH(ar9300_jupiter_1p0_soc_postamble), 5);
1568
1569
/* rx/tx gain */
1570
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
1571
ar9300_common_rx_gain_table_jupiter_1p0,
1572
ARRAY_LENGTH(ar9300_common_rx_gain_table_jupiter_1p0), 2);
1573
1574
/* Load PCIE SERDES settings from INI */
1575
if (ah->ah_config.ath_hal_pcie_clock_req) {
1576
/* Pci-e Clock Request = 1 */
1577
/*
1578
* PLL ON + clkreq enable is not a valid combination,
1579
* thus to ignore ath_hal_pll_pwr_save, use PLL OFF.
1580
*/
1581
{
1582
/*Use driver default setting*/
1583
/* Awake -> Sleep Setting */
1584
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1585
ar9300_pcie_phy_clkreq_enable_L1_jupiter_1p0,
1586
ARRAY_LENGTH(ar9300_pcie_phy_clkreq_enable_L1_jupiter_1p0),
1587
2);
1588
/* Sleep -> Awake Setting */
1589
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1590
ar9300_pcie_phy_clkreq_enable_L1_jupiter_1p0,
1591
ARRAY_LENGTH(ar9300_pcie_phy_clkreq_enable_L1_jupiter_1p0),
1592
2);
1593
}
1594
}
1595
else {
1596
/*
1597
* Since Jupiter 1.0 and 2.0 share the same device id and will be
1598
* installed with same INF, but Jupiter 1.0 has issue with PLL OFF.
1599
*
1600
* Force Jupiter 1.0 to use ON/ON setting.
1601
*/
1602
ah->ah_config.ath_hal_pll_pwr_save = 0;
1603
/* Pci-e Clock Request = 0 */
1604
if (ah->ah_config.ath_hal_pll_pwr_save &
1605
AR_PCIE_PLL_PWRSAVE_CONTROL)
1606
{
1607
/* Awake -> Sleep Setting */
1608
if (ah->ah_config.ath_hal_pll_pwr_save &
1609
AR_PCIE_PLL_PWRSAVE_ON_D3)
1610
{
1611
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1612
ar9300_pcie_phy_clkreq_disable_L1_jupiter_1p0,
1613
ARRAY_LENGTH(
1614
ar9300_pcie_phy_clkreq_disable_L1_jupiter_1p0),
1615
2);
1616
}
1617
else {
1618
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1619
ar9300_pcie_phy_pll_on_clkreq_disable_L1_jupiter_1p0,
1620
ARRAY_LENGTH(
1621
ar9300_pcie_phy_pll_on_clkreq_disable_L1_jupiter_1p0),
1622
2);
1623
}
1624
/* Sleep -> Awake Setting */
1625
if (ah->ah_config.ath_hal_pll_pwr_save &
1626
AR_PCIE_PLL_PWRSAVE_ON_D0)
1627
{
1628
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1629
ar9300_pcie_phy_clkreq_disable_L1_jupiter_1p0,
1630
ARRAY_LENGTH(
1631
ar9300_pcie_phy_clkreq_disable_L1_jupiter_1p0),
1632
2);
1633
}
1634
else {
1635
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1636
ar9300_pcie_phy_pll_on_clkreq_disable_L1_jupiter_1p0,
1637
ARRAY_LENGTH(
1638
ar9300_pcie_phy_pll_on_clkreq_disable_L1_jupiter_1p0),
1639
2);
1640
}
1641
1642
}
1643
else {
1644
/*Use driver default setting*/
1645
/* Awake -> Sleep Setting */
1646
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1647
ar9300_pcie_phy_pll_on_clkreq_disable_L1_jupiter_1p0,
1648
ARRAY_LENGTH(
1649
ar9300_pcie_phy_pll_on_clkreq_disable_L1_jupiter_1p0),
1650
2);
1651
/* Sleep -> Awake Setting */
1652
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1653
ar9300_pcie_phy_pll_on_clkreq_disable_L1_jupiter_1p0,
1654
ARRAY_LENGTH(
1655
ar9300_pcie_phy_pll_on_clkreq_disable_L1_jupiter_1p0),
1656
2);
1657
}
1658
}
1659
/*
1660
* ath_hal_pcie_power_save_enable should be 2 for OWL/Condor and
1661
* 0 for merlin
1662
*/
1663
ah->ah_config.ath_hal_pcie_power_save_enable = 0;
1664
1665
#if 0 // ATH_WOW
1666
/* SerDes values during WOW sleep */
1667
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_wow, ar9300_pcie_phy_AWOW,
1668
ARRAY_LENGTH(ar9300_pcie_phy_AWOW), 2);
1669
#endif
1670
1671
/* Fast clock modal settings */
1672
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
1673
ar9300_modes_fast_clock_jupiter_1p0,
1674
ARRAY_LENGTH(ar9300_modes_fast_clock_jupiter_1p0), 3);
1675
INIT_INI_ARRAY(&ahp->ah_ini_japan2484,
1676
ar9300_jupiter_1p0_baseband_core_txfir_coeff_japan_2484,
1677
ARRAY_LENGTH(
1678
ar9300_jupiter_1p0_baseband_core_txfir_coeff_japan_2484), 2);
1679
1680
}
1681
else if (AR_SREV_JUPITER_20_OR_LATER(ah)) {
1682
/* Jupiter: new INI format (pre, core, post arrays per subsystem) */
1683
1684
/* FreeBSD: just override the registers for jupiter 2.1 */
1685
/* XXX TODO: refactor this stuff out; reinit all the 2.1 registers */
1686
1687
/* mac */
1688
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
1689
1690
if (AR_SREV_JUPITER_21(ah)) {
1691
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
1692
ar9462_2p1_mac_core,
1693
ARRAY_LENGTH(ar9462_2p1_mac_core), 2);
1694
} else {
1695
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
1696
ar9300_jupiter_2p0_mac_core,
1697
ARRAY_LENGTH(ar9300_jupiter_2p0_mac_core), 2);
1698
}
1699
1700
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
1701
ar9300_jupiter_2p0_mac_postamble,
1702
ARRAY_LENGTH(ar9300_jupiter_2p0_mac_postamble), 5);
1703
1704
/* bb */
1705
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE], NULL, 0, 0);
1706
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
1707
ar9300_jupiter_2p0_baseband_core,
1708
ARRAY_LENGTH(ar9300_jupiter_2p0_baseband_core), 2);
1709
1710
if (AR_SREV_JUPITER_21(ah)) {
1711
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
1712
ar9462_2p1_baseband_postamble,
1713
ARRAY_LENGTH(ar9462_2p1_baseband_postamble), 5);
1714
} else {
1715
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
1716
ar9300_jupiter_2p0_baseband_postamble,
1717
ARRAY_LENGTH(ar9300_jupiter_2p0_baseband_postamble), 5);
1718
}
1719
1720
/* radio */
1721
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
1722
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
1723
ar9300_jupiter_2p0_radio_core,
1724
ARRAY_LENGTH(ar9300_jupiter_2p0_radio_core), 2);
1725
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST],
1726
ar9300_jupiter_2p0_radio_postamble,
1727
ARRAY_LENGTH(ar9300_jupiter_2p0_radio_postamble), 5);
1728
INIT_INI_ARRAY(&ahp->ah_ini_radio_post_sys2ant,
1729
ar9300_jupiter_2p0_radio_postamble_sys2ant,
1730
ARRAY_LENGTH(ar9300_jupiter_2p0_radio_postamble_sys2ant), 5);
1731
1732
/* soc */
1733
if (AR_SREV_JUPITER_21(ah)) {
1734
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
1735
ar9462_2p1_soc_preamble,
1736
ARRAY_LENGTH(ar9462_2p1_soc_preamble), 2);
1737
} else {
1738
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
1739
ar9300_jupiter_2p0_soc_preamble,
1740
ARRAY_LENGTH(ar9300_jupiter_2p0_soc_preamble), 2);
1741
}
1742
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
1743
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST],
1744
ar9300_jupiter_2p0_soc_postamble,
1745
ARRAY_LENGTH(ar9300_jupiter_2p0_soc_postamble), 5);
1746
1747
/* rx/tx gain */
1748
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
1749
ar9300Common_rx_gain_table_jupiter_2p0,
1750
ARRAY_LENGTH(ar9300Common_rx_gain_table_jupiter_2p0), 2);
1751
1752
/* BTCOEX */
1753
INIT_INI_ARRAY(&ahp->ah_ini_BTCOEX_MAX_TXPWR,
1754
ar9300_jupiter_2p0_BTCOEX_MAX_TXPWR_table,
1755
ARRAY_LENGTH(ar9300_jupiter_2p0_BTCOEX_MAX_TXPWR_table), 2);
1756
1757
/* Load PCIE SERDES settings from INI */
1758
if (ah->ah_config.ath_hal_pcie_clock_req) {
1759
/* Pci-e Clock Request = 1 */
1760
/*
1761
* PLL ON + clkreq enable is not a valid combination,
1762
* thus to ignore ath_hal_pll_pwr_save, use PLL OFF.
1763
*/
1764
{
1765
/*Use driver default setting*/
1766
/* Awake -> Sleep Setting */
1767
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1768
ar9300_PciePhy_clkreq_enable_L1_jupiter_2p0,
1769
ARRAY_LENGTH(ar9300_PciePhy_clkreq_enable_L1_jupiter_2p0),
1770
2);
1771
/* Sleep -> Awake Setting */
1772
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1773
ar9300_PciePhy_clkreq_enable_L1_jupiter_2p0,
1774
ARRAY_LENGTH(ar9300_PciePhy_clkreq_enable_L1_jupiter_2p0),
1775
2);
1776
}
1777
}
1778
else {
1779
/* Pci-e Clock Request = 0 */
1780
if (ah->ah_config.ath_hal_pll_pwr_save &
1781
AR_PCIE_PLL_PWRSAVE_CONTROL)
1782
{
1783
/* Awake -> Sleep Setting */
1784
if (ah->ah_config.ath_hal_pll_pwr_save &
1785
AR_PCIE_PLL_PWRSAVE_ON_D3)
1786
{
1787
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1788
ar9300_PciePhy_clkreq_disable_L1_jupiter_2p0,
1789
ARRAY_LENGTH(
1790
ar9300_PciePhy_clkreq_disable_L1_jupiter_2p0),
1791
2);
1792
}
1793
else {
1794
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1795
ar9300_PciePhy_pll_on_clkreq_disable_L1_jupiter_2p0,
1796
ARRAY_LENGTH(
1797
ar9300_PciePhy_pll_on_clkreq_disable_L1_jupiter_2p0),
1798
2);
1799
}
1800
/* Sleep -> Awake Setting */
1801
if (ah->ah_config.ath_hal_pll_pwr_save &
1802
AR_PCIE_PLL_PWRSAVE_ON_D0)
1803
{
1804
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1805
ar9300_PciePhy_clkreq_disable_L1_jupiter_2p0,
1806
ARRAY_LENGTH(
1807
ar9300_PciePhy_clkreq_disable_L1_jupiter_2p0),
1808
2);
1809
}
1810
else {
1811
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1812
ar9300_PciePhy_pll_on_clkreq_disable_L1_jupiter_2p0,
1813
ARRAY_LENGTH(
1814
ar9300_PciePhy_pll_on_clkreq_disable_L1_jupiter_2p0),
1815
2);
1816
}
1817
1818
}
1819
else {
1820
/*Use driver default setting*/
1821
/* Awake -> Sleep Setting */
1822
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1823
ar9300_PciePhy_pll_on_clkreq_disable_L1_jupiter_2p0,
1824
ARRAY_LENGTH(
1825
ar9300_PciePhy_pll_on_clkreq_disable_L1_jupiter_2p0),
1826
2);
1827
/* Sleep -> Awake Setting */
1828
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
1829
ar9300_PciePhy_pll_on_clkreq_disable_L1_jupiter_2p0,
1830
ARRAY_LENGTH(
1831
ar9300_PciePhy_pll_on_clkreq_disable_L1_jupiter_2p0),
1832
2);
1833
}
1834
}
1835
1836
/*
1837
* ath_hal_pcie_power_save_enable should be 2 for OWL/Condor and
1838
* 0 for merlin
1839
*/
1840
ah->ah_config.ath_hal_pcie_power_save_enable = 0;
1841
1842
#if 0 // ATH_WOW
1843
/* SerDes values during WOW sleep */
1844
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_wow, ar9300_pcie_phy_AWOW,
1845
ARRAY_LENGTH(ar9300_pcie_phy_AWOW), 2);
1846
#endif
1847
1848
/* Fast clock modal settings */
1849
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
1850
ar9300Modes_fast_clock_jupiter_2p0,
1851
ARRAY_LENGTH(ar9300Modes_fast_clock_jupiter_2p0), 3);
1852
INIT_INI_ARRAY(&ahp->ah_ini_japan2484,
1853
ar9300_jupiter_2p0_baseband_core_txfir_coeff_japan_2484,
1854
ARRAY_LENGTH(
1855
ar9300_jupiter_2p0_baseband_core_txfir_coeff_japan_2484), 2);
1856
1857
} else if (AR_SREV_APHRODITE(ah)) {
1858
/* Aphrodite: new INI format (pre, core, post arrays per subsystem) */
1859
1860
/* mac */
1861
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
1862
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
1863
ar956X_aphrodite_1p0_mac_core,
1864
ARRAY_LENGTH(ar956X_aphrodite_1p0_mac_core), 2);
1865
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
1866
ar956X_aphrodite_1p0_mac_postamble,
1867
ARRAY_LENGTH(ar956X_aphrodite_1p0_mac_postamble), 5);
1868
1869
/* bb */
1870
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE], NULL, 0, 0);
1871
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
1872
ar956X_aphrodite_1p0_baseband_core,
1873
ARRAY_LENGTH(ar956X_aphrodite_1p0_baseband_core), 2);
1874
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
1875
ar956X_aphrodite_1p0_baseband_postamble,
1876
ARRAY_LENGTH(ar956X_aphrodite_1p0_baseband_postamble), 5);
1877
1878
//mark jupiter have but aphrodite don't have
1879
// /* radio */
1880
// INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
1881
// INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
1882
// ar9300_aphrodite_1p0_radio_core,
1883
// ARRAY_LENGTH(ar9300_aphrodite_1p0_radio_core), 2);
1884
// INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST],
1885
// ar9300_aphrodite_1p0_radio_postamble,
1886
// ARRAY_LENGTH(ar9300_aphrodite_1p0_radio_postamble), 5);
1887
1888
/* soc */
1889
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
1890
ar956X_aphrodite_1p0_soc_preamble,
1891
ARRAY_LENGTH(ar956X_aphrodite_1p0_soc_preamble), 2);
1892
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
1893
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST],
1894
ar956X_aphrodite_1p0_soc_postamble,
1895
ARRAY_LENGTH(ar956X_aphrodite_1p0_soc_postamble), 5);
1896
1897
/* rx/tx gain */
1898
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
1899
ar956XCommon_rx_gain_table_aphrodite_1p0,
1900
ARRAY_LENGTH(ar956XCommon_rx_gain_table_aphrodite_1p0), 2);
1901
//INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
1902
// ar956XModes_lowest_ob_db_tx_gain_table_aphrodite_1p0,
1903
// ARRAY_LENGTH(ar956XModes_lowest_ob_db_tx_gain_table_aphrodite_1p0),
1904
// 5);
1905
1906
1907
/*
1908
* ath_hal_pcie_power_save_enable should be 2 for OWL/Condor and
1909
* 0 for merlin
1910
*/
1911
ah->ah_config.ath_hal_pcie_power_save_enable = 0;
1912
1913
#if 0 // ATH_WOW
1914
/* SerDes values during WOW sleep */
1915
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_wow, ar9300_pcie_phy_AWOW,
1916
ARRAY_LENGTH(ar9300_pcie_phy_AWOW), 2);
1917
#endif
1918
/* Fast clock modal settings */
1919
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
1920
ar956XModes_fast_clock_aphrodite_1p0,
1921
ARRAY_LENGTH(ar956XModes_fast_clock_aphrodite_1p0), 3);
1922
1923
} else if (AR_SREV_AR9580(ah)) {
1924
/*
1925
* AR9580/Peacock -
1926
* new INI format (pre, core, post arrays per subsystem)
1927
*/
1928
1929
/* mac */
1930
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
1931
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
1932
ar9300_ar9580_1p0_mac_core,
1933
ARRAY_LENGTH(ar9300_ar9580_1p0_mac_core), 2);
1934
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
1935
ar9300_ar9580_1p0_mac_postamble,
1936
ARRAY_LENGTH(ar9300_ar9580_1p0_mac_postamble), 5);
1937
1938
/* bb */
1939
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE], NULL, 0, 0);
1940
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
1941
ar9300_ar9580_1p0_baseband_core,
1942
ARRAY_LENGTH(ar9300_ar9580_1p0_baseband_core), 2);
1943
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
1944
ar9300_ar9580_1p0_baseband_postamble,
1945
ARRAY_LENGTH(ar9300_ar9580_1p0_baseband_postamble), 5);
1946
1947
/* radio */
1948
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
1949
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
1950
ar9300_ar9580_1p0_radio_core,
1951
ARRAY_LENGTH(ar9300_ar9580_1p0_radio_core), 2);
1952
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST],
1953
ar9300_ar9580_1p0_radio_postamble,
1954
ARRAY_LENGTH(ar9300_ar9580_1p0_radio_postamble), 5);
1955
1956
/* soc */
1957
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
1958
ar9300_ar9580_1p0_soc_preamble,
1959
ARRAY_LENGTH(ar9300_ar9580_1p0_soc_preamble), 2);
1960
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
1961
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST],
1962
ar9300_ar9580_1p0_soc_postamble,
1963
ARRAY_LENGTH(ar9300_ar9580_1p0_soc_postamble), 5);
1964
1965
/* rx/tx gain */
1966
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
1967
ar9300_common_rx_gain_table_ar9580_1p0,
1968
ARRAY_LENGTH(ar9300_common_rx_gain_table_ar9580_1p0), 2);
1969
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
1970
ar9300Modes_lowest_ob_db_tx_gain_table_ar9580_1p0,
1971
ARRAY_LENGTH(ar9300Modes_lowest_ob_db_tx_gain_table_ar9580_1p0), 5);
1972
1973
/* DFS */
1974
INIT_INI_ARRAY(&ahp->ah_ini_dfs,
1975
ar9300_ar9580_1p0_baseband_postamble_dfs_channel,
1976
ARRAY_LENGTH(ar9300_ar9580_1p0_baseband_postamble_dfs_channel), 3);
1977
1978
1979
/* Load PCIE SERDES settings from INI */
1980
1981
/*D3 Setting */
1982
if (ah->ah_config.ath_hal_pcie_clock_req) {
1983
if (ah->ah_config.ath_hal_pll_pwr_save &
1984
AR_PCIE_PLL_PWRSAVE_CONTROL)
1985
{ //registry control
1986
if (ah->ah_config.ath_hal_pll_pwr_save &
1987
AR_PCIE_PLL_PWRSAVE_ON_D3)
1988
{ //bit1, in to D3
1989
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1990
ar9300PciePhy_clkreq_enable_L1_ar9580_1p0,
1991
ARRAY_LENGTH(ar9300PciePhy_clkreq_enable_L1_ar9580_1p0),
1992
2);
1993
} else {
1994
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
1995
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0,
1996
ARRAY_LENGTH(
1997
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0),
1998
2);
1999
}
2000
} else {//no registry control, default is pll on
2001
INIT_INI_ARRAY(
2002
&ahp->ah_ini_pcie_serdes,
2003
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0,
2004
ARRAY_LENGTH(
2005
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0),
2006
2);
2007
}
2008
} else {
2009
if (ah->ah_config.ath_hal_pll_pwr_save &
2010
AR_PCIE_PLL_PWRSAVE_CONTROL)
2011
{ //registry control
2012
if (ah->ah_config.ath_hal_pll_pwr_save &
2013
AR_PCIE_PLL_PWRSAVE_ON_D3)
2014
{ //bit1, in to D3
2015
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
2016
ar9300PciePhy_clkreq_disable_L1_ar9580_1p0,
2017
ARRAY_LENGTH(
2018
ar9300PciePhy_clkreq_disable_L1_ar9580_1p0),
2019
2);
2020
} else {
2021
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
2022
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0,
2023
ARRAY_LENGTH(
2024
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0),
2025
2);
2026
}
2027
} else {//no registry control, default is pll on
2028
INIT_INI_ARRAY(
2029
&ahp->ah_ini_pcie_serdes,
2030
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0,
2031
ARRAY_LENGTH(
2032
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0),
2033
2);
2034
}
2035
}
2036
2037
/*D0 Setting */
2038
if (ah->ah_config.ath_hal_pcie_clock_req) {
2039
if (ah->ah_config.ath_hal_pll_pwr_save &
2040
AR_PCIE_PLL_PWRSAVE_CONTROL)
2041
{ //registry control
2042
if (ah->ah_config.ath_hal_pll_pwr_save &
2043
AR_PCIE_PLL_PWRSAVE_ON_D0)
2044
{ //bit2, out of D3
2045
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
2046
ar9300PciePhy_clkreq_enable_L1_ar9580_1p0,
2047
ARRAY_LENGTH(ar9300PciePhy_clkreq_enable_L1_ar9580_1p0),
2048
2);
2049
2050
} else {
2051
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
2052
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0,
2053
ARRAY_LENGTH(
2054
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0),
2055
2);
2056
}
2057
} else { //no registry control, default is pll on
2058
INIT_INI_ARRAY(
2059
&ahp->ah_ini_pcie_serdes_low_power,
2060
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0,
2061
ARRAY_LENGTH(
2062
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0),
2063
2);
2064
}
2065
} else {
2066
if (ah->ah_config.ath_hal_pll_pwr_save &
2067
AR_PCIE_PLL_PWRSAVE_CONTROL)
2068
{//registry control
2069
if (ah->ah_config.ath_hal_pll_pwr_save &
2070
AR_PCIE_PLL_PWRSAVE_ON_D0)
2071
{//bit2, out of D3
2072
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
2073
ar9300PciePhy_clkreq_disable_L1_ar9580_1p0,
2074
ARRAY_LENGTH(ar9300PciePhy_clkreq_disable_L1_ar9580_1p0),
2075
2);
2076
} else {
2077
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
2078
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0,
2079
ARRAY_LENGTH(
2080
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0),
2081
2);
2082
}
2083
} else { //no registry control, default is pll on
2084
INIT_INI_ARRAY(
2085
&ahp->ah_ini_pcie_serdes_low_power,
2086
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0,
2087
ARRAY_LENGTH(
2088
ar9300PciePhy_pll_on_clkreq_disable_L1_ar9580_1p0),
2089
2);
2090
}
2091
}
2092
2093
ah->ah_config.ath_hal_pcie_power_save_enable = 0;
2094
2095
#if 0 /* ATH_WOW */
2096
/* SerDes values during WOW sleep */
2097
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_wow, ar9300_pcie_phy_awow,
2098
ARRAY_LENGTH(ar9300_pcie_phy_awow), 2);
2099
#endif
2100
2101
/* Fast clock modal settings */
2102
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
2103
ar9300Modes_fast_clock_ar9580_1p0,
2104
ARRAY_LENGTH(ar9300Modes_fast_clock_ar9580_1p0), 3);
2105
INIT_INI_ARRAY(&ahp->ah_ini_japan2484,
2106
ar9300_ar9580_1p0_baseband_core_txfir_coeff_japan_2484,
2107
ARRAY_LENGTH(
2108
ar9300_ar9580_1p0_baseband_core_txfir_coeff_japan_2484), 2);
2109
2110
} else {
2111
/*
2112
* Osprey 2.2 - new INI format (pre, core, post arrays per subsystem)
2113
*/
2114
2115
/* mac */
2116
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_PRE], NULL, 0, 0);
2117
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_CORE],
2118
ar9300_osprey_2p2_mac_core,
2119
ARRAY_LENGTH(ar9300_osprey_2p2_mac_core), 2);
2120
INIT_INI_ARRAY(&ahp->ah_ini_mac[ATH_INI_POST],
2121
ar9300_osprey_2p2_mac_postamble,
2122
ARRAY_LENGTH(ar9300_osprey_2p2_mac_postamble), 5);
2123
2124
/* bb */
2125
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_PRE], NULL, 0, 0);
2126
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_CORE],
2127
ar9300_osprey_2p2_baseband_core,
2128
ARRAY_LENGTH(ar9300_osprey_2p2_baseband_core), 2);
2129
INIT_INI_ARRAY(&ahp->ah_ini_bb[ATH_INI_POST],
2130
ar9300_osprey_2p2_baseband_postamble,
2131
ARRAY_LENGTH(ar9300_osprey_2p2_baseband_postamble), 5);
2132
2133
/* radio */
2134
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_PRE], NULL, 0, 0);
2135
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_CORE],
2136
ar9300_osprey_2p2_radio_core,
2137
ARRAY_LENGTH(ar9300_osprey_2p2_radio_core), 2);
2138
INIT_INI_ARRAY(&ahp->ah_ini_radio[ATH_INI_POST],
2139
ar9300_osprey_2p2_radio_postamble,
2140
ARRAY_LENGTH(ar9300_osprey_2p2_radio_postamble), 5);
2141
2142
/* soc */
2143
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_PRE],
2144
ar9300_osprey_2p2_soc_preamble,
2145
ARRAY_LENGTH(ar9300_osprey_2p2_soc_preamble), 2);
2146
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_CORE], NULL, 0, 0);
2147
INIT_INI_ARRAY(&ahp->ah_ini_soc[ATH_INI_POST],
2148
ar9300_osprey_2p2_soc_postamble,
2149
ARRAY_LENGTH(ar9300_osprey_2p2_soc_postamble), 5);
2150
2151
/* rx/tx gain */
2152
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
2153
ar9300_common_rx_gain_table_osprey_2p2,
2154
ARRAY_LENGTH(ar9300_common_rx_gain_table_osprey_2p2), 2);
2155
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
2156
ar9300_modes_lowest_ob_db_tx_gain_table_osprey_2p2,
2157
ARRAY_LENGTH(ar9300_modes_lowest_ob_db_tx_gain_table_osprey_2p2), 5);
2158
2159
/* DFS */
2160
INIT_INI_ARRAY(&ahp->ah_ini_dfs,
2161
ar9300_osprey_2p2_baseband_postamble_dfs_channel,
2162
ARRAY_LENGTH(ar9300_osprey_2p2_baseband_postamble_dfs_channel), 3);
2163
2164
/* Load PCIE SERDES settings from INI */
2165
2166
/*D3 Setting */
2167
if (ah->ah_config.ath_hal_pcie_clock_req) {
2168
if (ah->ah_config.ath_hal_pll_pwr_save &
2169
AR_PCIE_PLL_PWRSAVE_CONTROL)
2170
{ //registry control
2171
if (ah->ah_config.ath_hal_pll_pwr_save &
2172
AR_PCIE_PLL_PWRSAVE_ON_D3)
2173
{ //bit1, in to D3
2174
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
2175
ar9300PciePhy_clkreq_enable_L1_osprey_2p2,
2176
ARRAY_LENGTH(ar9300PciePhy_clkreq_enable_L1_osprey_2p2),
2177
2);
2178
} else {
2179
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
2180
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2,
2181
ARRAY_LENGTH(
2182
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2),
2183
2);
2184
}
2185
} else {//no registry control, default is pll on
2186
#ifndef ATH_BUS_PM
2187
INIT_INI_ARRAY(
2188
&ahp->ah_ini_pcie_serdes,
2189
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2,
2190
ARRAY_LENGTH(
2191
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2),
2192
2);
2193
#else
2194
//no registry control, default is pll off
2195
INIT_INI_ARRAY(
2196
&ahp->ah_ini_pcie_serdes,
2197
ar9300PciePhy_clkreq_disable_L1_osprey_2p2,
2198
ARRAY_LENGTH(
2199
ar9300PciePhy_clkreq_disable_L1_osprey_2p2),
2200
2);
2201
#endif
2202
2203
}
2204
} else {
2205
if (ah->ah_config.ath_hal_pll_pwr_save &
2206
AR_PCIE_PLL_PWRSAVE_CONTROL)
2207
{ //registry control
2208
if (ah->ah_config.ath_hal_pll_pwr_save &
2209
AR_PCIE_PLL_PWRSAVE_ON_D3)
2210
{ //bit1, in to D3
2211
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
2212
ar9300PciePhy_clkreq_disable_L1_osprey_2p2,
2213
ARRAY_LENGTH(
2214
ar9300PciePhy_clkreq_disable_L1_osprey_2p2),
2215
2);
2216
} else {
2217
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes,
2218
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2,
2219
ARRAY_LENGTH(
2220
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2),
2221
2);
2222
}
2223
} else {
2224
#ifndef ATH_BUS_PM
2225
//no registry control, default is pll on
2226
INIT_INI_ARRAY(
2227
&ahp->ah_ini_pcie_serdes,
2228
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2,
2229
ARRAY_LENGTH(
2230
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2),
2231
2);
2232
#else
2233
//no registry control, default is pll off
2234
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes, ar9300PciePhy_clkreq_disable_L1_osprey_2p2,
2235
ARRAY_LENGTH(ar9300PciePhy_clkreq_disable_L1_osprey_2p2), 2);
2236
#endif
2237
}
2238
}
2239
2240
/*D0 Setting */
2241
if (ah->ah_config.ath_hal_pcie_clock_req) {
2242
if (ah->ah_config.ath_hal_pll_pwr_save &
2243
AR_PCIE_PLL_PWRSAVE_CONTROL)
2244
{ //registry control
2245
if (ah->ah_config.ath_hal_pll_pwr_save &
2246
AR_PCIE_PLL_PWRSAVE_ON_D0)
2247
{ //bit2, out of D3
2248
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
2249
ar9300PciePhy_clkreq_enable_L1_osprey_2p2,
2250
ARRAY_LENGTH(ar9300PciePhy_clkreq_enable_L1_osprey_2p2),
2251
2);
2252
2253
} else {
2254
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
2255
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2,
2256
ARRAY_LENGTH(
2257
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2),
2258
2);
2259
}
2260
} else { //no registry control, default is pll on
2261
INIT_INI_ARRAY(
2262
&ahp->ah_ini_pcie_serdes_low_power,
2263
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2,
2264
ARRAY_LENGTH(
2265
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2),
2266
2);
2267
}
2268
} else {
2269
if (ah->ah_config.ath_hal_pll_pwr_save &
2270
AR_PCIE_PLL_PWRSAVE_CONTROL)
2271
{//registry control
2272
if (ah->ah_config.ath_hal_pll_pwr_save &
2273
AR_PCIE_PLL_PWRSAVE_ON_D0)
2274
{//bit2, out of D3
2275
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
2276
ar9300PciePhy_clkreq_disable_L1_osprey_2p2,
2277
ARRAY_LENGTH(ar9300PciePhy_clkreq_disable_L1_osprey_2p2),
2278
2);
2279
} else {
2280
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_low_power,
2281
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2,
2282
ARRAY_LENGTH(
2283
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2),
2284
2);
2285
}
2286
} else { //no registry control, default is pll on
2287
INIT_INI_ARRAY(
2288
&ahp->ah_ini_pcie_serdes_low_power,
2289
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2,
2290
ARRAY_LENGTH(
2291
ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p2),
2292
2);
2293
}
2294
}
2295
2296
ah->ah_config.ath_hal_pcie_power_save_enable = 0;
2297
2298
#ifdef ATH_BUS_PM
2299
/*Use HAL to config PCI powersave by writing into the SerDes Registers */
2300
ah->ah_config.ath_hal_pcie_ser_des_write = 1;
2301
#endif
2302
2303
#if 0 /* ATH_WOW */
2304
/* SerDes values during WOW sleep */
2305
INIT_INI_ARRAY(&ahp->ah_ini_pcie_serdes_wow, ar9300_pcie_phy_awow,
2306
ARRAY_LENGTH(ar9300_pcie_phy_awow), 2);
2307
#endif
2308
2309
/* Fast clock modal settings */
2310
INIT_INI_ARRAY(&ahp->ah_ini_modes_additional,
2311
ar9300Modes_fast_clock_osprey_2p2,
2312
ARRAY_LENGTH(ar9300Modes_fast_clock_osprey_2p2), 3);
2313
INIT_INI_ARRAY(&ahp->ah_ini_japan2484,
2314
ar9300_osprey_2p2_baseband_core_txfir_coeff_japan_2484,
2315
ARRAY_LENGTH(
2316
ar9300_osprey_2p2_baseband_core_txfir_coeff_japan_2484), 2);
2317
2318
}
2319
2320
if(AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah))
2321
{
2322
#define AR_SOC_RST_OTP_INTF 0xB80600B4
2323
#define REG_READ(_reg) *((volatile u_int32_t *)(_reg))
2324
2325
ahp->ah_enterprise_mode = REG_READ(AR_SOC_RST_OTP_INTF);
2326
if (AR_SREV_SCORPION(ah)) {
2327
ahp->ah_enterprise_mode = ahp->ah_enterprise_mode << 12;
2328
}
2329
ath_hal_printf (ah, "Enterprise mode: 0x%08x\n", ahp->ah_enterprise_mode);
2330
#undef REG_READ
2331
#undef AR_SOC_RST_OTP_INTF
2332
} else {
2333
ahp->ah_enterprise_mode = OS_REG_READ(ah, AR_ENT_OTP);
2334
}
2335
2336
2337
if (ahpriv->ah_ispcie) {
2338
ar9300_config_pci_power_save(ah, 0, 0);
2339
} else {
2340
ar9300_disable_pcie_phy(ah);
2341
}
2342
#if 0
2343
ath_hal_printf(ah, "%s: calling ar9300_hw_attach\n", __func__);
2344
#endif
2345
ecode = ar9300_hw_attach(ah);
2346
if (ecode != HAL_OK) {
2347
goto bad;
2348
}
2349
2350
/* set gain table pointers according to values read from the eeprom */
2351
ar9300_tx_gain_table_apply(ah);
2352
ar9300_rx_gain_table_apply(ah);
2353
2354
/*
2355
**
2356
** Got everything we need now to setup the capabilities.
2357
*/
2358
2359
if (!ar9300_fill_capability_info(ah)) {
2360
HALDEBUG(ah, HAL_DEBUG_RESET,
2361
"%s:failed ar9300_fill_capability_info\n", __func__);
2362
ecode = HAL_EEREAD;
2363
goto bad;
2364
}
2365
ecode = ar9300_init_mac_addr(ah);
2366
if (ecode != HAL_OK) {
2367
HALDEBUG(ah, HAL_DEBUG_RESET,
2368
"%s: failed initializing mac address\n", __func__);
2369
goto bad;
2370
}
2371
2372
/*
2373
* Initialize receive buffer size to MAC default
2374
*/
2375
ahp->rx_buf_size = HAL_RXBUFSIZE_DEFAULT;
2376
2377
#if ATH_WOW
2378
#if 0
2379
/*
2380
* Needs to be removed once we stop using XB92 XXX
2381
* FIXME: Check with latest boards too - SriniK
2382
*/
2383
ar9300_wow_set_gpio_reset_low(ah);
2384
#endif
2385
2386
/*
2387
* Clear the Wow Status.
2388
*/
2389
OS_REG_WRITE(ah, AR_HOSTIF_REG(ah, AR_PCIE_PM_CTRL),
2390
OS_REG_READ(ah, AR_HOSTIF_REG(ah, AR_PCIE_PM_CTRL)) |
2391
AR_PMCTRL_WOW_PME_CLR);
2392
OS_REG_WRITE(ah, AR_WOW_PATTERN_REG,
2393
AR_WOW_CLEAR_EVENTS(OS_REG_READ(ah, AR_WOW_PATTERN_REG)));
2394
#endif
2395
2396
/*
2397
* Set the cur_trig_level to a value that works all modes - 11a/b/g or 11n
2398
* with aggregation enabled or disabled.
2399
*/
2400
ahp->ah_tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
2401
2402
if (AR_SREV_HORNET(ah)) {
2403
ahp->nf_2GHz.nominal = AR_PHY_CCA_NOM_VAL_HORNET_2GHZ;
2404
ahp->nf_2GHz.max = AR_PHY_CCA_MAX_GOOD_VAL_OSPREY_2GHZ;
2405
ahp->nf_2GHz.min = AR_PHY_CCA_MIN_GOOD_VAL_OSPREY_2GHZ;
2406
ahp->nf_5GHz.nominal = AR_PHY_CCA_NOM_VAL_OSPREY_5GHZ;
2407
ahp->nf_5GHz.max = AR_PHY_CCA_MAX_GOOD_VAL_OSPREY_5GHZ;
2408
ahp->nf_5GHz.min = AR_PHY_CCA_MIN_GOOD_VAL_OSPREY_5GHZ;
2409
ahp->nf_cw_int_delta = AR_PHY_CCA_CW_INT_DELTA;
2410
} else if(AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)){
2411
ahp->nf_2GHz.nominal = AR_PHY_CCA_NOM_VAL_JUPITER_2GHZ;
2412
ahp->nf_2GHz.max = AR_PHY_CCA_MAX_GOOD_VAL_OSPREY_2GHZ;
2413
ahp->nf_2GHz.min = AR_PHY_CCA_MIN_GOOD_VAL_JUPITER_2GHZ;
2414
ahp->nf_5GHz.nominal = AR_PHY_CCA_NOM_VAL_JUPITER_5GHZ;
2415
ahp->nf_5GHz.max = AR_PHY_CCA_MAX_GOOD_VAL_OSPREY_5GHZ;
2416
ahp->nf_5GHz.min = AR_PHY_CCA_MIN_GOOD_VAL_JUPITER_5GHZ;
2417
ahp->nf_cw_int_delta = AR_PHY_CCA_CW_INT_DELTA;
2418
} else {
2419
ahp->nf_2GHz.nominal = AR_PHY_CCA_NOM_VAL_OSPREY_2GHZ;
2420
ahp->nf_2GHz.max = AR_PHY_CCA_MAX_GOOD_VAL_OSPREY_2GHZ;
2421
ahp->nf_2GHz.min = AR_PHY_CCA_MIN_GOOD_VAL_OSPREY_2GHZ;
2422
if (AR_SREV_AR9580(ah) || AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah)) {
2423
ahp->nf_5GHz.nominal = AR_PHY_CCA_NOM_VAL_PEACOCK_5GHZ;
2424
} else {
2425
ahp->nf_5GHz.nominal = AR_PHY_CCA_NOM_VAL_OSPREY_5GHZ;
2426
}
2427
ahp->nf_5GHz.max = AR_PHY_CCA_MAX_GOOD_VAL_OSPREY_5GHZ;
2428
ahp->nf_5GHz.min = AR_PHY_CCA_MIN_GOOD_VAL_OSPREY_5GHZ;
2429
ahp->nf_cw_int_delta = AR_PHY_CCA_CW_INT_DELTA;
2430
}
2431
2432
2433
2434
2435
/* init BB Panic Watchdog timeout */
2436
if (AR_SREV_HORNET(ah)) {
2437
ahp->ah_bb_panic_timeout_ms = HAL_BB_PANIC_WD_TMO_HORNET;
2438
} else {
2439
ahp->ah_bb_panic_timeout_ms = HAL_BB_PANIC_WD_TMO;
2440
}
2441
2442
2443
/*
2444
* Determine whether tx IQ calibration HW should be enabled,
2445
* and whether tx IQ calibration should be performed during
2446
* AGC calibration, or separately.
2447
*/
2448
if (AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)) {
2449
/*
2450
* Register not initialized yet. This flag will be re-initialized
2451
* after INI loading following each reset.
2452
*/
2453
ahp->tx_iq_cal_enable = 1;
2454
/* if tx IQ cal is enabled, do it together with AGC cal */
2455
ahp->tx_iq_cal_during_agc_cal = 1;
2456
} else if (AR_SREV_POSEIDON_OR_LATER(ah) && !AR_SREV_WASP(ah)) {
2457
ahp->tx_iq_cal_enable = 1;
2458
ahp->tx_iq_cal_during_agc_cal = 1;
2459
} else {
2460
/* osprey, hornet, wasp */
2461
ahp->tx_iq_cal_enable = 1;
2462
ahp->tx_iq_cal_during_agc_cal = 0;
2463
}
2464
return ah;
2465
2466
bad:
2467
if (ahp) {
2468
ar9300_detach((struct ath_hal *) ahp);
2469
}
2470
if (status) {
2471
*status = ecode;
2472
}
2473
return AH_NULL;
2474
}
2475
2476
void
2477
ar9300_detach(struct ath_hal *ah)
2478
{
2479
HALASSERT(ah != AH_NULL);
2480
HALASSERT(ah->ah_magic == AR9300_MAGIC);
2481
2482
/* Make sure that chip is awake before writing to it */
2483
if (!ar9300_set_power_mode(ah, HAL_PM_AWAKE, AH_TRUE)) {
2484
HALDEBUG(ah, HAL_DEBUG_UNMASKABLE,
2485
"%s: failed to wake up chip\n",
2486
__func__);
2487
}
2488
2489
ar9300_hw_detach(ah);
2490
ar9300_set_power_mode(ah, HAL_PM_FULL_SLEEP, AH_TRUE);
2491
2492
// ath_hal_hdprintf_deregister(ah);
2493
2494
if (AH9300(ah)->ah_cal_mem)
2495
ath_hal_free(AH9300(ah)->ah_cal_mem);
2496
AH9300(ah)->ah_cal_mem = AH_NULL;
2497
2498
ath_hal_free(ah);
2499
}
2500
2501
struct ath_hal_9300 *
2502
ar9300_new_state(u_int16_t devid, HAL_SOFTC sc,
2503
HAL_BUS_TAG st, HAL_BUS_HANDLE sh,
2504
uint16_t *eepromdata,
2505
HAL_OPS_CONFIG *ah_config,
2506
HAL_STATUS *status)
2507
{
2508
static const u_int8_t defbssidmask[IEEE80211_ADDR_LEN] =
2509
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2510
struct ath_hal_9300 *ahp;
2511
struct ath_hal *ah;
2512
2513
/* NB: memory is returned zero'd */
2514
ahp = ath_hal_malloc(sizeof(struct ath_hal_9300));
2515
if (ahp == AH_NULL) {
2516
HALDEBUG(AH_NULL, HAL_DEBUG_UNMASKABLE,
2517
"%s: cannot allocate memory for state block\n",
2518
__func__);
2519
*status = HAL_ENOMEM;
2520
return AH_NULL;
2521
}
2522
2523
ah = &ahp->ah_priv.h;
2524
/* set initial values */
2525
2526
/* stub everything first */
2527
ar9300_set_stub_functions(ah);
2528
2529
/* setup the FreeBSD HAL methods */
2530
ar9300_attach_freebsd_ops(ah);
2531
2532
/* These are private to this particular file, so .. */
2533
ah->ah_disablePCIE = ar9300_disable_pcie_phy;
2534
AH_PRIVATE(ah)->ah_getNfAdjust = ar9300_get_nf_adjust;
2535
AH_PRIVATE(ah)->ah_getChipPowerLimits = ar9300_get_chip_power_limits;
2536
2537
#if 0
2538
/* Attach Osprey structure as default hal structure */
2539
OS_MEMCPY(&ahp->ah_priv.priv, &ar9300hal, sizeof(ahp->ah_priv.priv));
2540
#endif
2541
2542
#if 0
2543
AH_PRIVATE(ah)->amem_handle = amem_handle;
2544
AH_PRIVATE(ah)->ah_osdev = osdev;
2545
#endif
2546
ah->ah_sc = sc;
2547
ah->ah_st = st;
2548
ah->ah_sh = sh;
2549
ah->ah_magic = AR9300_MAGIC;
2550
AH_PRIVATE(ah)->ah_devid = devid;
2551
2552
AH_PRIVATE(ah)->ah_flags = 0;
2553
2554
/*
2555
** Initialize factory defaults in the private space
2556
*/
2557
// ath_hal_factory_defaults(AH_PRIVATE(ah), hal_conf_parm);
2558
ar9300_config_defaults_freebsd(ah, ah_config);
2559
2560
/* XXX FreeBSD: cal is always in EEPROM */
2561
#if 0
2562
if (!hal_conf_parm->calInFlash) {
2563
AH_PRIVATE(ah)->ah_flags |= AH_USE_EEPROM;
2564
}
2565
#endif
2566
AH_PRIVATE(ah)->ah_flags |= AH_USE_EEPROM;
2567
2568
#if 0
2569
if (ar9300_eep_data_in_flash(ah)) {
2570
ahp->ah_priv.priv.ah_eeprom_read = ar9300_flash_read;
2571
ahp->ah_priv.priv.ah_eeprom_dump = AH_NULL;
2572
} else {
2573
ahp->ah_priv.priv.ah_eeprom_read = ar9300_eeprom_read_word;
2574
}
2575
#endif
2576
2577
/* XXX FreeBSD - for now, just supports EEPROM reading */
2578
ahp->ah_priv.ah_eepromRead = ar9300_eeprom_read_word;
2579
2580
AH_PRIVATE(ah)->ah_powerLimit = MAX_RATE_POWER;
2581
AH_PRIVATE(ah)->ah_tpScale = HAL_TP_SCALE_MAX; /* no scaling */
2582
2583
ahp->ah_atim_window = 0; /* [0..1000] */
2584
2585
ahp->ah_diversity_control =
2586
ah->ah_config.ath_hal_diversity_control;
2587
ahp->ah_antenna_switch_swap =
2588
ah->ah_config.ath_hal_antenna_switch_swap;
2589
2590
/*
2591
* Enable MIC handling.
2592
*/
2593
ahp->ah_sta_id1_defaults = AR_STA_ID1_CRPT_MIC_ENABLE;
2594
ahp->ah_enable32k_hz_clock = DONT_USE_32KHZ;/* XXX */
2595
ahp->ah_slot_time = (u_int) -1;
2596
ahp->ah_ack_timeout = (u_int) -1;
2597
OS_MEMCPY(&ahp->ah_bssid_mask, defbssidmask, IEEE80211_ADDR_LEN);
2598
2599
/*
2600
* 11g-specific stuff
2601
*/
2602
ahp->ah_g_beacon_rate = 0; /* adhoc beacon fixed rate */
2603
2604
/* SM power mode: Attach time, disable any setting */
2605
ahp->ah_sm_power_mode = HAL_SMPS_DEFAULT;
2606
2607
return ahp;
2608
}
2609
2610
HAL_BOOL
2611
ar9300_chip_test(struct ath_hal *ah)
2612
{
2613
/*u_int32_t reg_addr[2] = { AR_STA_ID0, AR_PHY_BASE+(8 << 2) };*/
2614
u_int32_t reg_addr[2] = { AR_STA_ID0 };
2615
u_int32_t reg_hold[2];
2616
u_int32_t pattern_data[4] =
2617
{ 0x55555555, 0xaaaaaaaa, 0x66666666, 0x99999999 };
2618
int i, j;
2619
2620
/* Test PHY & MAC registers */
2621
for (i = 0; i < 1; i++) {
2622
u_int32_t addr = reg_addr[i];
2623
u_int32_t wr_data, rd_data;
2624
2625
reg_hold[i] = OS_REG_READ(ah, addr);
2626
for (j = 0; j < 0x100; j++) {
2627
wr_data = (j << 16) | j;
2628
OS_REG_WRITE(ah, addr, wr_data);
2629
rd_data = OS_REG_READ(ah, addr);
2630
if (rd_data != wr_data) {
2631
HALDEBUG(ah, HAL_DEBUG_REGIO,
2632
"%s: address test failed addr: "
2633
"0x%08x - wr:0x%08x != rd:0x%08x\n",
2634
__func__, addr, wr_data, rd_data);
2635
return AH_FALSE;
2636
}
2637
}
2638
for (j = 0; j < 4; j++) {
2639
wr_data = pattern_data[j];
2640
OS_REG_WRITE(ah, addr, wr_data);
2641
rd_data = OS_REG_READ(ah, addr);
2642
if (wr_data != rd_data) {
2643
HALDEBUG(ah, HAL_DEBUG_REGIO,
2644
"%s: address test failed addr: "
2645
"0x%08x - wr:0x%08x != rd:0x%08x\n",
2646
__func__, addr, wr_data, rd_data);
2647
return AH_FALSE;
2648
}
2649
}
2650
OS_REG_WRITE(ah, reg_addr[i], reg_hold[i]);
2651
}
2652
OS_DELAY(100);
2653
return AH_TRUE;
2654
}
2655
2656
/*
2657
* Store the channel edges for the requested operational mode
2658
*/
2659
HAL_BOOL
2660
ar9300_get_channel_edges(struct ath_hal *ah,
2661
u_int16_t flags, u_int16_t *low, u_int16_t *high)
2662
{
2663
struct ath_hal_private *ahpriv = AH_PRIVATE(ah);
2664
HAL_CAPABILITIES *p_cap = &ahpriv->ah_caps;
2665
2666
if (flags & IEEE80211_CHAN_5GHZ) {
2667
*low = p_cap->halLow5GhzChan;
2668
*high = p_cap->halHigh5GhzChan;
2669
return AH_TRUE;
2670
}
2671
if ((flags & IEEE80211_CHAN_2GHZ)) {
2672
*low = p_cap->halLow2GhzChan;
2673
*high = p_cap->halHigh2GhzChan;
2674
2675
return AH_TRUE;
2676
}
2677
return AH_FALSE;
2678
}
2679
2680
HAL_BOOL
2681
ar9300_regulatory_domain_override(struct ath_hal *ah, u_int16_t regdmn)
2682
{
2683
AH_PRIVATE(ah)->ah_currentRD = regdmn;
2684
return AH_TRUE;
2685
}
2686
2687
/*
2688
* Fill all software cached or static hardware state information.
2689
* Return failure if capabilities are to come from EEPROM and
2690
* cannot be read.
2691
*/
2692
HAL_BOOL
2693
ar9300_fill_capability_info(struct ath_hal *ah)
2694
{
2695
#define AR_KEYTABLE_SIZE 128
2696
struct ath_hal_9300 *ahp = AH9300(ah);
2697
struct ath_hal_private *ahpriv = AH_PRIVATE(ah);
2698
HAL_CAPABILITIES *p_cap = &ahpriv->ah_caps;
2699
u_int16_t cap_field = 0, eeval;
2700
2701
ahpriv->ah_devType = (u_int16_t)ar9300_eeprom_get(ahp, EEP_DEV_TYPE);
2702
eeval = ar9300_eeprom_get(ahp, EEP_REG_0);
2703
2704
/* XXX record serial number */
2705
AH_PRIVATE(ah)->ah_currentRD = eeval;
2706
2707
/* Always enable fast clock; leave it up to EEPROM and channel */
2708
p_cap->halSupportsFastClock5GHz = AH_TRUE;
2709
2710
p_cap->halIntrMitigation = AH_TRUE;
2711
eeval = ar9300_eeprom_get(ahp, EEP_REG_1);
2712
AH_PRIVATE(ah)->ah_currentRDext = eeval | AR9300_RDEXT_DEFAULT;
2713
2714
/* Read the capability EEPROM location */
2715
cap_field = ar9300_eeprom_get(ahp, EEP_OP_CAP);
2716
2717
/* Construct wireless mode from EEPROM */
2718
p_cap->halWirelessModes = 0;
2719
eeval = ar9300_eeprom_get(ahp, EEP_OP_MODE);
2720
2721
/*
2722
* XXX FreeBSD specific: for now, set ath_hal_ht_enable to 1,
2723
* or we won't have 11n support.
2724
*/
2725
ah->ah_config.ath_hal_ht_enable = 1;
2726
2727
if (eeval & AR9300_OPFLAGS_11A) {
2728
p_cap->halWirelessModes |= HAL_MODE_11A |
2729
((!ah->ah_config.ath_hal_ht_enable ||
2730
(eeval & AR9300_OPFLAGS_N_5G_HT20)) ? 0 :
2731
(HAL_MODE_11NA_HT20 | ((eeval & AR9300_OPFLAGS_N_5G_HT40) ? 0 :
2732
(HAL_MODE_11NA_HT40PLUS | HAL_MODE_11NA_HT40MINUS))));
2733
}
2734
if (eeval & AR9300_OPFLAGS_11G) {
2735
p_cap->halWirelessModes |= HAL_MODE_11B | HAL_MODE_11G |
2736
((!ah->ah_config.ath_hal_ht_enable ||
2737
(eeval & AR9300_OPFLAGS_N_2G_HT20)) ? 0 :
2738
(HAL_MODE_11NG_HT20 | ((eeval & AR9300_OPFLAGS_N_2G_HT40) ? 0 :
2739
(HAL_MODE_11NG_HT40PLUS | HAL_MODE_11NG_HT40MINUS))));
2740
}
2741
2742
/* Get chainamsks from eeprom */
2743
p_cap->halTxChainMask = ar9300_eeprom_get(ahp, EEP_TX_MASK);
2744
p_cap->halRxChainMask = ar9300_eeprom_get(ahp, EEP_RX_MASK);
2745
2746
2747
2748
#define owl_get_ntxchains(_txchainmask) \
2749
(((_txchainmask >> 2) & 1) + ((_txchainmask >> 1) & 1) + (_txchainmask & 1))
2750
2751
/* FreeBSD: Update number of TX/RX streams */
2752
p_cap->halTxStreams = owl_get_ntxchains(p_cap->halTxChainMask);
2753
p_cap->halRxStreams = owl_get_ntxchains(p_cap->halRxChainMask);
2754
#undef owl_get_ntxchains
2755
2756
/*
2757
* This being a newer chip supports TKIP non-splitmic mode.
2758
*
2759
*/
2760
ahp->ah_misc_mode |= AR_PCU_MIC_NEW_LOC_ENA;
2761
p_cap->halTkipMicTxRxKeySupport = AH_TRUE;
2762
2763
p_cap->halLow2GhzChan = 2312;
2764
p_cap->halHigh2GhzChan = 2732;
2765
2766
p_cap->halLow5GhzChan = 4920;
2767
p_cap->halHigh5GhzChan = 6100;
2768
2769
p_cap->halCipherCkipSupport = AH_FALSE;
2770
p_cap->halCipherTkipSupport = AH_TRUE;
2771
p_cap->halCipherAesCcmSupport = AH_TRUE;
2772
2773
p_cap->halMicCkipSupport = AH_FALSE;
2774
p_cap->halMicTkipSupport = AH_TRUE;
2775
p_cap->halMicAesCcmSupport = AH_TRUE;
2776
2777
p_cap->halChanSpreadSupport = AH_TRUE;
2778
p_cap->halSleepAfterBeaconBroken = AH_TRUE;
2779
2780
p_cap->halBurstSupport = AH_TRUE;
2781
p_cap->halChapTuningSupport = AH_TRUE;
2782
p_cap->halTurboPrimeSupport = AH_TRUE;
2783
p_cap->halFastFramesSupport = AH_TRUE;
2784
2785
p_cap->halTurboGSupport = p_cap->halWirelessModes & HAL_MODE_108G;
2786
2787
// p_cap->hal_xr_support = AH_FALSE;
2788
2789
p_cap->halHTSupport =
2790
ah->ah_config.ath_hal_ht_enable ? AH_TRUE : AH_FALSE;
2791
2792
p_cap->halGTTSupport = AH_TRUE;
2793
p_cap->halPSPollBroken = AH_TRUE; /* XXX fixed in later revs? */
2794
p_cap->halNumMRRetries = 4; /* Hardware supports 4 MRR */
2795
p_cap->halHTSGI20Support = AH_TRUE;
2796
p_cap->halVEOLSupport = AH_TRUE;
2797
p_cap->halBssIdMaskSupport = AH_TRUE;
2798
/* Bug 26802, fixed in later revs? */
2799
p_cap->halMcastKeySrchSupport = AH_TRUE;
2800
p_cap->halTsfAddSupport = AH_TRUE;
2801
2802
if (cap_field & AR_EEPROM_EEPCAP_MAXQCU) {
2803
p_cap->halTotalQueues = MS(cap_field, AR_EEPROM_EEPCAP_MAXQCU);
2804
} else {
2805
p_cap->halTotalQueues = HAL_NUM_TX_QUEUES;
2806
}
2807
2808
if (cap_field & AR_EEPROM_EEPCAP_KC_ENTRIES) {
2809
p_cap->halKeyCacheSize =
2810
1 << MS(cap_field, AR_EEPROM_EEPCAP_KC_ENTRIES);
2811
} else {
2812
p_cap->halKeyCacheSize = AR_KEYTABLE_SIZE;
2813
}
2814
p_cap->halFastCCSupport = AH_TRUE;
2815
// p_cap->hal_num_mr_retries = 4;
2816
// ahp->hal_tx_trig_level_max = MAX_TX_FIFO_THRESHOLD;
2817
2818
p_cap->halNumGpioPins = AR9382_MAX_GPIO_PIN_NUM;
2819
2820
#if 0
2821
/* XXX Verify support in Osprey */
2822
if (AR_SREV_MERLIN_10_OR_LATER(ah)) {
2823
p_cap->halWowSupport = AH_TRUE;
2824
p_cap->hal_wow_match_pattern_exact = AH_TRUE;
2825
if (AR_SREV_MERLIN(ah)) {
2826
p_cap->hal_wow_pattern_match_dword = AH_TRUE;
2827
}
2828
} else {
2829
p_cap->halWowSupport = AH_FALSE;
2830
p_cap->hal_wow_match_pattern_exact = AH_FALSE;
2831
}
2832
#endif
2833
p_cap->halWowSupport = AH_TRUE;
2834
p_cap->halWowMatchPatternExact = AH_TRUE;
2835
if (AR_SREV_POSEIDON(ah)) {
2836
p_cap->halWowMatchPatternExact = AH_TRUE;
2837
}
2838
2839
p_cap->halCSTSupport = AH_TRUE;
2840
2841
p_cap->halRifsRxSupport = AH_TRUE;
2842
p_cap->halRifsTxSupport = AH_TRUE;
2843
2844
#define IEEE80211_AMPDU_LIMIT_MAX (65536)
2845
p_cap->halRtsAggrLimit = IEEE80211_AMPDU_LIMIT_MAX;
2846
#undef IEEE80211_AMPDU_LIMIT_MAX
2847
2848
p_cap->halMfpSupport = ah->ah_config.ath_hal_mfp_support;
2849
2850
p_cap->halForcePpmSupport = AH_TRUE;
2851
p_cap->halHwBeaconProcSupport = AH_TRUE;
2852
2853
/* ar9300 - has the HW UAPSD trigger support,
2854
* but it has the following limitations
2855
* The power state change from the following
2856
* frames are not put in High priority queue.
2857
* i) Mgmt frames
2858
* ii) NoN QoS frames
2859
* iii) QoS frames form the access categories for which
2860
* UAPSD is not enabled.
2861
* so we can not enable this feature currently.
2862
* could be enabled, if these limitations are fixed
2863
* in later versions of ar9300 chips
2864
*/
2865
p_cap->halHasUapsdSupport = AH_FALSE;
2866
2867
/* Number of buffers that can be help in a single TxD */
2868
p_cap->halNumTxMaps = 4;
2869
2870
p_cap->halTxDescLen = sizeof(struct ar9300_txc);
2871
p_cap->halTxStatusLen = sizeof(struct ar9300_txs);
2872
p_cap->halRxStatusLen = sizeof(struct ar9300_rxs);
2873
2874
p_cap->halRxHpFifoDepth = HAL_HP_RXFIFO_DEPTH;
2875
p_cap->halRxLpFifoDepth = HAL_LP_RXFIFO_DEPTH;
2876
2877
/* Enable extension channel DFS support */
2878
p_cap->halUseCombinedRadarRssi = AH_TRUE;
2879
p_cap->halExtChanDfsSupport = AH_TRUE;
2880
#if ATH_SUPPORT_SPECTRAL
2881
p_cap->halSpectralScanSupport = AH_TRUE;
2882
#endif
2883
ahpriv->ah_rfsilent = ar9300_eeprom_get(ahp, EEP_RF_SILENT);
2884
if (ahpriv->ah_rfsilent & EEP_RFSILENT_ENABLED) {
2885
ahp->ah_gpio_select = MS(ahpriv->ah_rfsilent, EEP_RFSILENT_GPIO_SEL);
2886
ahp->ah_polarity = MS(ahpriv->ah_rfsilent, EEP_RFSILENT_POLARITY);
2887
2888
ath_hal_enable_rfkill(ah, AH_TRUE);
2889
p_cap->halRfSilentSupport = AH_TRUE;
2890
}
2891
2892
/* XXX */
2893
p_cap->halWpsPushButtonSupport = AH_FALSE;
2894
2895
#ifdef ATH_BT_COEX
2896
p_cap->halBtCoexSupport = AH_TRUE;
2897
p_cap->halBtCoexApsmWar = AH_FALSE;
2898
#endif
2899
2900
p_cap->halGenTimerSupport = AH_TRUE;
2901
ahp->ah_avail_gen_timers = ~((1 << AR_FIRST_NDP_TIMER) - 1);
2902
ahp->ah_avail_gen_timers &= (1 << AR_NUM_GEN_TIMERS) - 1;
2903
/*
2904
* According to Kyungwan, generic timer 0 and 8 are special
2905
* timers. Remove timer 8 from the available gen timer list.
2906
* Jupiter testing shows timer won't trigger with timer 8.
2907
*/
2908
ahp->ah_avail_gen_timers &= ~(1 << AR_GEN_TIMER_RESERVED);
2909
2910
if (AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)) {
2911
#if ATH_SUPPORT_MCI
2912
if (ah->ah_config.ath_hal_mci_config & ATH_MCI_CONFIG_DISABLE_MCI)
2913
{
2914
p_cap->halMciSupport = AH_FALSE;
2915
}
2916
else
2917
#endif
2918
{
2919
p_cap->halMciSupport = (ahp->ah_enterprise_mode &
2920
AR_ENT_OTP_49GHZ_DISABLE) ? AH_FALSE: AH_TRUE;
2921
}
2922
HALDEBUG(AH_NULL, HAL_DEBUG_UNMASKABLE,
2923
"%s: (MCI) MCI support = %d\n",
2924
__func__, p_cap->halMciSupport);
2925
}
2926
else {
2927
p_cap->halMciSupport = AH_FALSE;
2928
}
2929
2930
/* XXX TODO: jupiter 2.1? */
2931
if (AR_SREV_JUPITER_20(ah)) {
2932
p_cap->halRadioRetentionSupport = AH_TRUE;
2933
} else {
2934
p_cap->halRadioRetentionSupport = AH_FALSE;
2935
}
2936
2937
p_cap->halAutoSleepSupport = AH_TRUE;
2938
2939
p_cap->halMbssidAggrSupport = AH_TRUE;
2940
// p_cap->hal_proxy_sta_support = AH_TRUE;
2941
2942
/* XXX Mark it true after it is verfied as fixed */
2943
p_cap->hal4kbSplitTransSupport = AH_FALSE;
2944
2945
/* Read regulatory domain flag */
2946
if (AH_PRIVATE(ah)->ah_currentRDext & (1 << REG_EXT_JAPAN_MIDBAND)) {
2947
/*
2948
* If REG_EXT_JAPAN_MIDBAND is set, turn on U1 EVEN, U2, and MIDBAND.
2949
*/
2950
p_cap->halRegCap =
2951
AR_EEPROM_EEREGCAP_EN_KK_NEW_11A |
2952
AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN |
2953
AR_EEPROM_EEREGCAP_EN_KK_U2 |
2954
AR_EEPROM_EEREGCAP_EN_KK_MIDBAND;
2955
} else {
2956
p_cap->halRegCap =
2957
AR_EEPROM_EEREGCAP_EN_KK_NEW_11A | AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN;
2958
}
2959
2960
/* For AR9300 and above, midband channels are always supported */
2961
p_cap->halRegCap |= AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND;
2962
2963
p_cap->halNumAntCfg5GHz =
2964
ar9300_eeprom_get_num_ant_config(ahp, HAL_FREQ_BAND_5GHZ);
2965
p_cap->halNumAntCfg2GHz =
2966
ar9300_eeprom_get_num_ant_config(ahp, HAL_FREQ_BAND_2GHZ);
2967
2968
/* STBC supported */
2969
p_cap->halRxStbcSupport = 1; /* number of streams for STBC recieve. */
2970
if (AR_SREV_HORNET(ah) || AR_SREV_POSEIDON(ah) || AR_SREV_APHRODITE(ah)) {
2971
p_cap->halTxStbcSupport = 0;
2972
} else {
2973
p_cap->halTxStbcSupport = 1;
2974
}
2975
2976
p_cap->halEnhancedDmaSupport = AH_TRUE;
2977
p_cap->halEnhancedDfsSupport = AH_TRUE;
2978
2979
/*
2980
* EV61133 (missing interrupts due to AR_ISR_RAC).
2981
* Fixed in Osprey 2.0.
2982
*/
2983
p_cap->halIsrRacSupport = AH_TRUE;
2984
2985
/* XXX FreeBSD won't support TKIP and WEP aggregation */
2986
#if 0
2987
p_cap->hal_wep_tkip_aggr_support = AH_TRUE;
2988
p_cap->hal_wep_tkip_aggr_num_tx_delim = 10; /* TBD */
2989
p_cap->hal_wep_tkip_aggr_num_rx_delim = 10; /* TBD */
2990
p_cap->hal_wep_tkip_max_ht_rate = 15; /* TBD */
2991
#endif
2992
2993
/*
2994
* XXX FreeBSD won't need these; but eventually add them
2995
* and add the WARs - AGGR extra delim WAR is useful to know
2996
* about.
2997
*/
2998
#if 0
2999
p_cap->hal_cfend_fix_support = AH_FALSE;
3000
p_cap->hal_aggr_extra_delim_war = AH_FALSE;
3001
#endif
3002
p_cap->halTxTstampPrecision = 32;
3003
p_cap->halRxTstampPrecision = 32;
3004
p_cap->halRxTxAbortSupport = AH_TRUE;
3005
p_cap->hal_ani_poll_interval = AR9300_ANI_POLLINTERVAL;
3006
p_cap->hal_channel_switch_time_usec = AR9300_CHANNEL_SWITCH_TIME_USEC;
3007
3008
/* Transmit Beamforming supported, fill capabilities */
3009
p_cap->halPaprdEnabled = ar9300_eeprom_get(ahp, EEP_PAPRD_ENABLED);
3010
p_cap->halChanHalfRate =
3011
!(ahp->ah_enterprise_mode & AR_ENT_OTP_10MHZ_DISABLE);
3012
p_cap->halChanQuarterRate =
3013
!(ahp->ah_enterprise_mode & AR_ENT_OTP_5MHZ_DISABLE);
3014
3015
if(AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)){
3016
/* There is no AR_ENT_OTP_49GHZ_DISABLE feature in Jupiter, now the bit is used to disable BT. */
3017
p_cap->hal49GhzSupport = 1;
3018
} else {
3019
p_cap->hal49GhzSupport = !(ahp->ah_enterprise_mode & AR_ENT_OTP_49GHZ_DISABLE);
3020
}
3021
3022
if (AR_SREV_POSEIDON(ah) || AR_SREV_HORNET(ah) || AR_SREV_APHRODITE(ah)) {
3023
/* LDPC supported */
3024
/* Poseidon doesn't support LDPC, or it will cause receiver CRC Error */
3025
p_cap->halLDPCSupport = AH_FALSE;
3026
/* PCI_E LCR offset */
3027
if (AR_SREV_POSEIDON(ah)) {
3028
p_cap->hal_pcie_lcr_offset = 0x80; /*for Poseidon*/
3029
}
3030
/*WAR method for APSM L0s with Poseidon 1.0*/
3031
if (AR_SREV_POSEIDON_10(ah)) {
3032
p_cap->hal_pcie_lcr_extsync_en = AH_TRUE;
3033
}
3034
} else {
3035
p_cap->halLDPCSupport = AH_TRUE;
3036
}
3037
3038
/* XXX is this a flag, or a chainmask number? */
3039
p_cap->halApmEnable = !! ar9300_eeprom_get(ahp, EEP_CHAIN_MASK_REDUCE);
3040
#if ATH_ANT_DIV_COMB
3041
if (AR_SREV_HORNET(ah) || AR_SREV_POSEIDON_11_OR_LATER(ah) || AR_SREV_APHRODITE(ah)) {
3042
if (ahp->ah_diversity_control == HAL_ANT_VARIABLE) {
3043
u_int8_t ant_div_control1 =
3044
ar9300_eeprom_get(ahp, EEP_ANTDIV_control);
3045
/* if enable_lnadiv is 0x1 and enable_fast_div is 0x1,
3046
* we enable the diversity-combining algorithm.
3047
*/
3048
if ((ant_div_control1 >> 0x6) == 0x3) {
3049
p_cap->halAntDivCombSupport = AH_TRUE;
3050
}
3051
p_cap->halAntDivCombSupportOrg = p_cap->halAntDivCombSupport;
3052
}
3053
}
3054
#endif /* ATH_ANT_DIV_COMB */
3055
3056
/*
3057
* FreeBSD: enable LNA mixing if the chip is Hornet or Poseidon.
3058
*/
3059
if (AR_SREV_HORNET(ah) || AR_SREV_POSEIDON_11_OR_LATER(ah)) {
3060
p_cap->halRxUsingLnaMixing = AH_TRUE;
3061
}
3062
3063
/*
3064
* AR5416 and later NICs support MYBEACON filtering.
3065
*/
3066
p_cap->halRxDoMyBeacon = AH_TRUE;
3067
3068
#if ATH_WOW_OFFLOAD
3069
if (AR_SREV_JUPITER_20_OR_LATER(ah) || AR_SREV_APHRODITE(ah)) {
3070
p_cap->hal_wow_gtk_offload_support = AH_TRUE;
3071
p_cap->hal_wow_arp_offload_support = AH_TRUE;
3072
p_cap->hal_wow_ns_offload_support = AH_TRUE;
3073
p_cap->hal_wow_4way_hs_wakeup_support = AH_TRUE;
3074
p_cap->hal_wow_acer_magic_support = AH_TRUE;
3075
p_cap->hal_wow_acer_swka_support = AH_TRUE;
3076
} else {
3077
p_cap->hal_wow_gtk_offload_support = AH_FALSE;
3078
p_cap->hal_wow_arp_offload_support = AH_FALSE;
3079
p_cap->hal_wow_ns_offload_support = AH_FALSE;
3080
p_cap->hal_wow_4way_hs_wakeup_support = AH_FALSE;
3081
p_cap->hal_wow_acer_magic_support = AH_FALSE;
3082
p_cap->hal_wow_acer_swka_support = AH_FALSE;
3083
}
3084
#endif /* ATH_WOW_OFFLOAD */
3085
3086
3087
return AH_TRUE;
3088
#undef AR_KEYTABLE_SIZE
3089
}
3090
3091
#if 0
3092
static HAL_BOOL
3093
ar9300_get_chip_power_limits(struct ath_hal *ah, HAL_CHANNEL *chans,
3094
u_int32_t nchans)
3095
{
3096
struct ath_hal_9300 *ahp = AH9300(ah);
3097
3098
return ahp->ah_rf_hal.get_chip_power_lim(ah, chans, nchans);
3099
}
3100
#endif
3101
/* XXX FreeBSD */
3102
3103
static HAL_BOOL
3104
ar9300_get_chip_power_limits(struct ath_hal *ah,
3105
struct ieee80211_channel *chan)
3106
{
3107
3108
chan->ic_maxpower = AR9300_MAX_RATE_POWER;
3109
chan->ic_minpower = 0;
3110
3111
return AH_TRUE;
3112
}
3113
3114
/*
3115
* Disable PLL when in L0s as well as receiver clock when in L1.
3116
* This power saving option must be enabled through the Serdes.
3117
*
3118
* Programming the Serdes must go through the same 288 bit serial shift
3119
* register as the other analog registers. Hence the 9 writes.
3120
*
3121
* XXX Clean up the magic numbers.
3122
*/
3123
void
3124
ar9300_config_pci_power_save(struct ath_hal *ah, int restore, int power_off)
3125
{
3126
struct ath_hal_9300 *ahp = AH9300(ah);
3127
int i;
3128
3129
if (AH_PRIVATE(ah)->ah_ispcie != AH_TRUE) {
3130
return;
3131
}
3132
3133
/*
3134
* Increase L1 Entry Latency. Some WB222 boards don't have
3135
* this change in eeprom/OTP.
3136
*/
3137
if (AR_SREV_JUPITER(ah)) {
3138
u_int32_t val = ah->ah_config.ath_hal_war70c;
3139
if ((val & 0xff000000) == 0x17000000) {
3140
val &= 0x00ffffff;
3141
val |= 0x27000000;
3142
OS_REG_WRITE(ah, 0x570c, val);
3143
}
3144
}
3145
3146
/* Do not touch SERDES registers */
3147
if (ah->ah_config.ath_hal_pcie_power_save_enable == 2) {
3148
return;
3149
}
3150
3151
/* Nothing to do on restore for 11N */
3152
if (!restore) {
3153
/* set bit 19 to allow forcing of pcie core into L1 state */
3154
OS_REG_SET_BIT(ah,
3155
AR_HOSTIF_REG(ah, AR_PCIE_PM_CTRL), AR_PCIE_PM_CTRL_ENA);
3156
3157
/*
3158
* Set PCIE workaround config only if requested, else use the reset
3159
* value of this register.
3160
*/
3161
if (ah->ah_config.ath_hal_pcie_waen) {
3162
OS_REG_WRITE(ah,
3163
AR_HOSTIF_REG(ah, AR_WA),
3164
ah->ah_config.ath_hal_pcie_waen);
3165
} else {
3166
/* Set Bits 17 and 14 in the AR_WA register. */
3167
OS_REG_WRITE(ah, AR_HOSTIF_REG(ah, AR_WA), ahp->ah_wa_reg_val);
3168
}
3169
}
3170
3171
/* Configure PCIE after Ini init. SERDES values now come from ini file */
3172
if (ah->ah_config.ath_hal_pcie_ser_des_write) {
3173
if (power_off) {
3174
for (i = 0; i < ahp->ah_ini_pcie_serdes.ia_rows; i++) {
3175
OS_REG_WRITE(ah,
3176
INI_RA(&ahp->ah_ini_pcie_serdes, i, 0),
3177
INI_RA(&ahp->ah_ini_pcie_serdes, i, 1));
3178
}
3179
} else {
3180
for (i = 0; i < ahp->ah_ini_pcie_serdes_low_power.ia_rows; i++) {
3181
OS_REG_WRITE(ah,
3182
INI_RA(&ahp->ah_ini_pcie_serdes_low_power, i, 0),
3183
INI_RA(&ahp->ah_ini_pcie_serdes_low_power, i, 1));
3184
}
3185
}
3186
}
3187
3188
}
3189
3190
/*
3191
* Recipe from charles to turn off PCIe PHY in PCI mode for power savings
3192
*/
3193
void
3194
ar9300_disable_pcie_phy(struct ath_hal *ah)
3195
{
3196
/* Osprey does not support PCI mode */
3197
}
3198
3199
static inline HAL_STATUS
3200
ar9300_init_mac_addr(struct ath_hal *ah)
3201
{
3202
u_int32_t sum;
3203
int i;
3204
u_int16_t eeval;
3205
struct ath_hal_9300 *ahp = AH9300(ah);
3206
u_int32_t EEP_MAC [] = { EEP_MAC_LSW, EEP_MAC_MID, EEP_MAC_MSW };
3207
3208
sum = 0;
3209
for (i = 0; i < 3; i++) {
3210
eeval = ar9300_eeprom_get(ahp, EEP_MAC[i]);
3211
sum += eeval;
3212
ahp->ah_macaddr[2*i] = eeval >> 8;
3213
ahp->ah_macaddr[2*i + 1] = eeval & 0xff;
3214
}
3215
if (sum == 0 || sum == 0xffff*3) {
3216
HALDEBUG(ah, HAL_DEBUG_EEPROM, "%s: mac address read failed: %s\n",
3217
__func__, ath_hal_ether_sprintf(ahp->ah_macaddr));
3218
return HAL_EEBADMAC;
3219
}
3220
3221
return HAL_OK;
3222
}
3223
3224
/*
3225
* Code for the "real" chip i.e. non-emulation. Review and revisit
3226
* when actual hardware is at hand.
3227
*/
3228
static inline HAL_STATUS
3229
ar9300_hw_attach(struct ath_hal *ah)
3230
{
3231
HAL_STATUS ecode;
3232
3233
if (!ar9300_chip_test(ah)) {
3234
HALDEBUG(ah, HAL_DEBUG_REGIO,
3235
"%s: hardware self-test failed\n", __func__);
3236
return HAL_ESELFTEST;
3237
}
3238
3239
#if 0
3240
ath_hal_printf(ah, "%s: calling ar9300_eeprom_attach\n", __func__);
3241
#endif
3242
ecode = ar9300_eeprom_attach(ah);
3243
ath_hal_printf(ah, "%s: ar9300_eeprom_attach returned %d\n", __func__, ecode);
3244
if (ecode != HAL_OK) {
3245
return ecode;
3246
}
3247
if (!ar9300_rf_attach(ah, &ecode)) {
3248
HALDEBUG(ah, HAL_DEBUG_RESET, "%s: RF setup failed, status %u\n",
3249
__func__, ecode);
3250
}
3251
3252
if (ecode != HAL_OK) {
3253
return ecode;
3254
}
3255
ar9300_ani_attach(ah);
3256
3257
return HAL_OK;
3258
}
3259
3260
static inline void
3261
ar9300_hw_detach(struct ath_hal *ah)
3262
{
3263
/* XXX EEPROM allocated state */
3264
ar9300_ani_detach(ah);
3265
}
3266
3267
static int16_t
3268
ar9300_get_nf_adjust(struct ath_hal *ah, const HAL_CHANNEL_INTERNAL *c)
3269
{
3270
return 0;
3271
}
3272
3273
void
3274
ar9300_set_immunity(struct ath_hal *ah, HAL_BOOL enable)
3275
{
3276
struct ath_hal_9300 *ahp = AH9300(ah);
3277
u_int32_t m1_thresh_low = enable ? 127 : ahp->ah_immunity_vals[0],
3278
m2_thresh_low = enable ? 127 : ahp->ah_immunity_vals[1],
3279
m1_thresh = enable ? 127 : ahp->ah_immunity_vals[2],
3280
m2_thresh = enable ? 127 : ahp->ah_immunity_vals[3],
3281
m2_count_thr = enable ? 31 : ahp->ah_immunity_vals[4],
3282
m2_count_thr_low = enable ? 63 : ahp->ah_immunity_vals[5];
3283
3284
if (ahp->ah_immunity_on == enable) {
3285
return;
3286
}
3287
3288
ahp->ah_immunity_on = enable;
3289
3290
OS_REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
3291
AR_PHY_SFCORR_LOW_M1_THRESH_LOW, m1_thresh_low);
3292
OS_REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
3293
AR_PHY_SFCORR_LOW_M2_THRESH_LOW, m2_thresh_low);
3294
OS_REG_RMW_FIELD(ah, AR_PHY_SFCORR,
3295
AR_PHY_SFCORR_M1_THRESH, m1_thresh);
3296
OS_REG_RMW_FIELD(ah, AR_PHY_SFCORR,
3297
AR_PHY_SFCORR_M2_THRESH, m2_thresh);
3298
OS_REG_RMW_FIELD(ah, AR_PHY_SFCORR,
3299
AR_PHY_SFCORR_M2COUNT_THR, m2_count_thr);
3300
OS_REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
3301
AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW, m2_count_thr_low);
3302
3303
OS_REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
3304
AR_PHY_SFCORR_EXT_M1_THRESH_LOW, m1_thresh_low);
3305
OS_REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
3306
AR_PHY_SFCORR_EXT_M2_THRESH_LOW, m2_thresh_low);
3307
OS_REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
3308
AR_PHY_SFCORR_EXT_M1_THRESH, m1_thresh);
3309
OS_REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
3310
AR_PHY_SFCORR_EXT_M2_THRESH, m2_thresh);
3311
3312
if (!enable) {
3313
OS_REG_SET_BIT(ah, AR_PHY_SFCORR_LOW,
3314
AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
3315
} else {
3316
OS_REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW,
3317
AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
3318
}
3319
}
3320
3321
/* XXX FreeBSD: I'm not sure how to implement this.. */
3322
#if 0
3323
int
3324
ar9300_get_cal_intervals(struct ath_hal *ah, HAL_CALIBRATION_TIMER **timerp,
3325
HAL_CAL_QUERY query)
3326
{
3327
#define AR9300_IS_CHAIN_RX_IQCAL_INVALID(_ah, _reg) \
3328
((OS_REG_READ((_ah), _reg) & 0x3fff) == 0)
3329
#define AR9300_IS_RX_IQCAL_DISABLED(_ah) \
3330
(!(OS_REG_READ((_ah), AR_PHY_RX_IQCAL_CORR_B0) & \
3331
AR_PHY_RX_IQCAL_CORR_IQCORR_ENABLE))
3332
/* Avoid comilation warnings. Variables are not used when EMULATION. */
3333
struct ath_hal_9300 *ahp = AH9300(ah);
3334
u_int8_t rxchainmask = ahp->ah_rx_chainmask, i;
3335
int rx_iqcal_invalid = 0, num_chains = 0;
3336
static const u_int32_t offset_array[3] = {
3337
AR_PHY_RX_IQCAL_CORR_B0,
3338
AR_PHY_RX_IQCAL_CORR_B1,
3339
AR_PHY_RX_IQCAL_CORR_B2};
3340
3341
*timerp = ar9300_cals;
3342
3343
switch (query) {
3344
case HAL_QUERY_CALS:
3345
return AR9300_NUM_CAL_TYPES;
3346
case HAL_QUERY_RERUN_CALS:
3347
for (i = 0; i < AR9300_MAX_CHAINS; i++) {
3348
if (rxchainmask & (1 << i)) {
3349
num_chains++;
3350
}
3351
}
3352
for (i = 0; i < num_chains; i++) {
3353
if (AR_SREV_POSEIDON(ah) || AR_SREV_APHRODITE(ah)) {
3354
HALASSERT(num_chains == 0x1);
3355
}
3356
if (AR9300_IS_CHAIN_RX_IQCAL_INVALID(ah, offset_array[i])) {
3357
rx_iqcal_invalid = 1;
3358
}
3359
}
3360
if (AR9300_IS_RX_IQCAL_DISABLED(ah)) {
3361
rx_iqcal_invalid = 1;
3362
}
3363
3364
return rx_iqcal_invalid;
3365
default:
3366
HALASSERT(0);
3367
}
3368
return 0;
3369
}
3370
#endif
3371
3372
#if ATH_TRAFFIC_FAST_RECOVER
3373
#define PLL3 0x16188
3374
#define PLL3_DO_MEAS_MASK 0x40000000
3375
#define PLL4 0x1618c
3376
#define PLL4_MEAS_DONE 0x8
3377
#define SQSUM_DVC_MASK 0x007ffff8
3378
unsigned long
3379
ar9300_get_pll3_sqsum_dvc(struct ath_hal *ah)
3380
{
3381
if (AR_SREV_HORNET(ah) || AR_SREV_POSEIDON(ah) || AR_SREV_WASP(ah) || AR_SREV_SCORPION(ah)) {
3382
OS_REG_WRITE(ah, PLL3, (OS_REG_READ(ah, PLL3) & ~(PLL3_DO_MEAS_MASK)));
3383
OS_DELAY(100);
3384
OS_REG_WRITE(ah, PLL3, (OS_REG_READ(ah, PLL3) | PLL3_DO_MEAS_MASK));
3385
3386
while ( (OS_REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) {
3387
OS_DELAY(100);
3388
}
3389
3390
return (( OS_REG_READ(ah, PLL3) & SQSUM_DVC_MASK ) >> 3);
3391
} else {
3392
HALDEBUG(ah, HAL_DEBUG_UNMASKABLE,
3393
"%s: unable to get pll3_sqsum_dvc\n",
3394
__func__);
3395
return 0;
3396
}
3397
}
3398
#endif
3399
3400
3401
#define RX_GAIN_TABLE_LENGTH 128
3402
// this will be called if rfGainCAP is enabled and rfGainCAP setting is changed,
3403
// or rxGainTable setting is changed
3404
HAL_BOOL ar9300_rf_gain_cap_apply(struct ath_hal *ah, int is_2GHz)
3405
{
3406
int i, done = 0, i_rx_gain = 32;
3407
u_int32_t rf_gain_cap;
3408
u_int32_t rx_gain_value, a_Byte, rx_gain_value_caped;
3409
static u_int32_t rx_gain_table[RX_GAIN_TABLE_LENGTH * 2][2];
3410
ar9300_eeprom_t *eep = &AH9300(ah)->ah_eeprom;
3411
struct ath_hal_9300 *ahp = AH9300(ah);
3412
3413
if ( !((eep->base_eep_header.misc_configuration & 0x80) >> 7) )
3414
return AH_FALSE;
3415
3416
if (is_2GHz)
3417
{
3418
rf_gain_cap = (u_int32_t) eep->modal_header_2g.rf_gain_cap;
3419
}
3420
else
3421
{
3422
rf_gain_cap = (u_int32_t) eep->modal_header_5g.rf_gain_cap;
3423
}
3424
3425
if (rf_gain_cap == 0)
3426
return AH_FALSE;
3427
3428
for (i = 0; i< RX_GAIN_TABLE_LENGTH * 2; i++)
3429
{
3430
if (AR_SREV_AR9580(ah))
3431
{
3432
// BB_rx_ocgain2
3433
i_rx_gain = 128 + 32;
3434
switch (ar9300_rx_gain_index_get(ah))
3435
{
3436
case 0:
3437
rx_gain_table[i][0] =
3438
ar9300_common_rx_gain_table_ar9580_1p0[i][0];
3439
rx_gain_table[i][1] =
3440
ar9300_common_rx_gain_table_ar9580_1p0[i][1];
3441
break;
3442
case 1:
3443
rx_gain_table[i][0] =
3444
ar9300_common_wo_xlna_rx_gain_table_ar9580_1p0[i][0];
3445
rx_gain_table[i][1] =
3446
ar9300_common_wo_xlna_rx_gain_table_ar9580_1p0[i][1];
3447
break;
3448
}
3449
}
3450
else if (AR_SREV_OSPREY_22(ah))
3451
{
3452
i_rx_gain = 128 + 32;
3453
switch (ar9300_rx_gain_index_get(ah))
3454
{
3455
case 0:
3456
rx_gain_table[i][0] = ar9300_common_rx_gain_table_osprey_2p2[i][0];
3457
rx_gain_table[i][1] = ar9300_common_rx_gain_table_osprey_2p2[i][1];
3458
break;
3459
case 1:
3460
rx_gain_table[i][0] =
3461
ar9300Common_wo_xlna_rx_gain_table_osprey_2p2[i][0];
3462
rx_gain_table[i][1] =
3463
ar9300Common_wo_xlna_rx_gain_table_osprey_2p2[i][1];
3464
break;
3465
}
3466
}
3467
else
3468
{
3469
return AH_FALSE;
3470
}
3471
}
3472
3473
while (1)
3474
{
3475
rx_gain_value = rx_gain_table[i_rx_gain][1];
3476
rx_gain_value_caped = rx_gain_value;
3477
a_Byte = rx_gain_value & (0x000000FF);
3478
if (a_Byte>rf_gain_cap)
3479
{
3480
rx_gain_value_caped = (rx_gain_value_caped &
3481
(0xFFFFFF00)) + rf_gain_cap;
3482
}
3483
a_Byte = rx_gain_value & (0x0000FF00);
3484
if ( a_Byte > ( rf_gain_cap << 8 ) )
3485
{
3486
rx_gain_value_caped = (rx_gain_value_caped &
3487
(0xFFFF00FF)) + (rf_gain_cap<<8);
3488
}
3489
a_Byte = rx_gain_value & (0x00FF0000);
3490
if ( a_Byte > ( rf_gain_cap << 16 ) )
3491
{
3492
rx_gain_value_caped = (rx_gain_value_caped &
3493
(0xFF00FFFF)) + (rf_gain_cap<<16);
3494
}
3495
a_Byte = rx_gain_value & (0xFF000000);
3496
if ( a_Byte > ( rf_gain_cap << 24 ) )
3497
{
3498
rx_gain_value_caped = (rx_gain_value_caped &
3499
(0x00FFFFFF)) + (rf_gain_cap<<24);
3500
}
3501
else
3502
{
3503
done = 1;
3504
}
3505
HALDEBUG(ah, HAL_DEBUG_RESET,
3506
"%s: rx_gain_address: %x, rx_gain_value: %x rx_gain_value_caped: %x\n",
3507
__func__, rx_gain_table[i_rx_gain][0], rx_gain_value, rx_gain_value_caped);
3508
if (rx_gain_value_caped != rx_gain_value)
3509
{
3510
rx_gain_table[i_rx_gain][1] = rx_gain_value_caped;
3511
}
3512
if (done == 1)
3513
break;
3514
i_rx_gain ++;
3515
}
3516
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain, rx_gain_table, ARRAY_LENGTH(rx_gain_table), 2);
3517
return AH_TRUE;
3518
}
3519
3520
3521
void ar9300_rx_gain_table_apply(struct ath_hal *ah)
3522
{
3523
struct ath_hal_9300 *ahp = AH9300(ah);
3524
//struct ath_hal_private *ahpriv = AH_PRIVATE(ah);
3525
u_int32_t xlan_gpio_cfg;
3526
u_int8_t i;
3527
3528
if (AR_SREV_OSPREY(ah) || AR_SREV_AR9580(ah))
3529
{
3530
// this will be called if rxGainTable setting is changed
3531
if (ar9300_rf_gain_cap_apply(ah, 1))
3532
return;
3533
}
3534
3535
switch (ar9300_rx_gain_index_get(ah))
3536
{
3537
case 2:
3538
if (AR_SREV_JUPITER_10(ah)) {
3539
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3540
ar9300_common_mixed_rx_gain_table_jupiter_1p0,
3541
ARRAY_LENGTH(ar9300_common_mixed_rx_gain_table_jupiter_1p0), 2);
3542
break;
3543
}
3544
else if (AR_SREV_JUPITER_20(ah)) {
3545
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3546
ar9300Common_mixed_rx_gain_table_jupiter_2p0,
3547
ARRAY_LENGTH(ar9300Common_mixed_rx_gain_table_jupiter_2p0), 2);
3548
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_bb_core,
3549
ar9462_2p0_baseband_core_mix_rxgain,
3550
ARRAY_LENGTH(ar9462_2p0_baseband_core_mix_rxgain), 2);
3551
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_bb_postamble,
3552
ar9462_2p0_baseband_postamble_mix_rxgain,
3553
ARRAY_LENGTH(ar9462_2p0_baseband_postamble_mix_rxgain), 2);
3554
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_xlna,
3555
ar9462_2p0_baseband_postamble_5g_xlna,
3556
ARRAY_LENGTH(ar9462_2p0_baseband_postamble_5g_xlna), 2);
3557
break;
3558
}
3559
else if (AR_SREV_JUPITER_21(ah)) {
3560
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3561
ar9462_2p1_common_mixed_rx_gain,
3562
ARRAY_LENGTH(ar9462_2p1_common_mixed_rx_gain), 2);
3563
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_bb_core,
3564
ar9462_2p1_baseband_core_mix_rxgain,
3565
ARRAY_LENGTH(ar9462_2p1_baseband_core_mix_rxgain), 2);
3566
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_bb_postamble,
3567
ar9462_2p1_baseband_postamble_mix_rxgain,
3568
ARRAY_LENGTH(ar9462_2p1_baseband_postamble_mix_rxgain), 2);
3569
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_xlna,
3570
ar9462_2p1_baseband_postamble_5g_xlna,
3571
ARRAY_LENGTH(ar9462_2p1_baseband_postamble_5g_xlna), 2);
3572
3573
break;
3574
}
3575
case 3:
3576
if (AR_SREV_JUPITER_21(ah)) {
3577
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3578
ar9462_2p1_common_5g_xlna_only_rxgain,
3579
ARRAY_LENGTH(ar9462_2p1_common_5g_xlna_only_rxgain), 2);
3580
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_xlna,
3581
ar9462_2p1_baseband_postamble_5g_xlna,
3582
ARRAY_LENGTH(ar9462_2p1_baseband_postamble_5g_xlna), 2);
3583
} else if (AR_SREV_JUPITER_20(ah)) {
3584
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3585
ar9462_2p0_common_5g_xlna_only_rxgain,
3586
ARRAY_LENGTH(ar9462_2p0_common_5g_xlna_only_rxgain), 2);
3587
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_xlna,
3588
ar9462_2p0_baseband_postamble_5g_xlna,
3589
ARRAY_LENGTH(ar9462_2p0_baseband_postamble_5g_xlna), 2);
3590
}
3591
break;
3592
case 0:
3593
default:
3594
if (AR_SREV_HORNET_12(ah)) {
3595
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3596
ar9331_common_rx_gain_hornet1_2,
3597
ARRAY_LENGTH(ar9331_common_rx_gain_hornet1_2), 2);
3598
} else if (AR_SREV_HORNET_11(ah)) {
3599
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3600
ar9331_common_rx_gain_hornet1_1,
3601
ARRAY_LENGTH(ar9331_common_rx_gain_hornet1_1), 2);
3602
} else if (AR_SREV_POSEIDON_11_OR_LATER(ah)) {
3603
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3604
ar9485_common_wo_xlna_rx_gain_poseidon1_1,
3605
ARRAY_LENGTH(ar9485_common_wo_xlna_rx_gain_poseidon1_1), 2);
3606
/* XXX FreeBSD: this needs to be revisited!! */
3607
xlan_gpio_cfg = ah->ah_config.ath_hal_ext_lna_ctl_gpio;
3608
if (xlan_gpio_cfg) {
3609
for (i = 0; i < 32; i++) {
3610
if (xlan_gpio_cfg & (1 << i)) {
3611
/*
3612
* XXX FreeBSD: definitely make sure this
3613
* results in the correct value being written
3614
* to the hardware, or weird crap is very likely
3615
* to occur!
3616
*/
3617
ath_hal_gpioCfgOutput(ah, i,
3618
HAL_GPIO_OUTPUT_MUX_PCIE_ATTENTION_LED);
3619
}
3620
}
3621
}
3622
3623
} else if (AR_SREV_POSEIDON(ah)) {
3624
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3625
ar9485Common_wo_xlna_rx_gain_poseidon1_0,
3626
ARRAY_LENGTH(ar9485Common_wo_xlna_rx_gain_poseidon1_0), 2);
3627
} else if (AR_SREV_JUPITER_10(ah)) {
3628
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3629
ar9300_common_rx_gain_table_jupiter_1p0,
3630
ARRAY_LENGTH(ar9300_common_rx_gain_table_jupiter_1p0), 2);
3631
} else if (AR_SREV_JUPITER_20(ah)) {
3632
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3633
ar9300Common_rx_gain_table_jupiter_2p0,
3634
ARRAY_LENGTH(ar9300Common_rx_gain_table_jupiter_2p0), 2);
3635
} else if (AR_SREV_JUPITER_21(ah)) {
3636
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3637
ar9462_2p1_common_rx_gain,
3638
ARRAY_LENGTH(ar9462_2p1_common_rx_gain), 2);
3639
} else if (AR_SREV_AR9580(ah)) {
3640
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3641
ar9300_common_rx_gain_table_ar9580_1p0,
3642
ARRAY_LENGTH(ar9300_common_rx_gain_table_ar9580_1p0), 2);
3643
} else if (AR_SREV_WASP(ah)) {
3644
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3645
ar9340Common_rx_gain_table_wasp_1p0,
3646
ARRAY_LENGTH(ar9340Common_rx_gain_table_wasp_1p0), 2);
3647
} else if (AR_SREV_SCORPION(ah)) {
3648
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3649
ar955xCommon_rx_gain_table_scorpion_1p0,
3650
ARRAY_LENGTH(ar955xCommon_rx_gain_table_scorpion_1p0), 2);
3651
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_bounds,
3652
ar955xCommon_rx_gain_bounds_scorpion_1p0,
3653
ARRAY_LENGTH(ar955xCommon_rx_gain_bounds_scorpion_1p0), 5);
3654
} else if (AR_SREV_HONEYBEE(ah)) {
3655
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3656
qca953xCommon_rx_gain_table_honeybee_1p0,
3657
ARRAY_LENGTH(qca953xCommon_rx_gain_table_honeybee_1p0), 2);
3658
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_bounds,
3659
qca953xCommon_rx_gain_bounds_honeybee_1p0,
3660
ARRAY_LENGTH(qca953xCommon_rx_gain_bounds_honeybee_1p0), 5);
3661
} else {
3662
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3663
ar9300_common_rx_gain_table_osprey_2p2,
3664
ARRAY_LENGTH(ar9300_common_rx_gain_table_osprey_2p2), 2);
3665
}
3666
break;
3667
case 1:
3668
if (AR_SREV_HORNET_12(ah)) {
3669
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3670
ar9331_common_wo_xlna_rx_gain_hornet1_2,
3671
ARRAY_LENGTH(ar9331_common_wo_xlna_rx_gain_hornet1_2), 2);
3672
} else if (AR_SREV_HORNET_11(ah)) {
3673
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3674
ar9331_common_wo_xlna_rx_gain_hornet1_1,
3675
ARRAY_LENGTH(ar9331_common_wo_xlna_rx_gain_hornet1_1), 2);
3676
} else if (AR_SREV_POSEIDON_11_OR_LATER(ah)) {
3677
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3678
ar9485_common_wo_xlna_rx_gain_poseidon1_1,
3679
ARRAY_LENGTH(ar9485_common_wo_xlna_rx_gain_poseidon1_1), 2);
3680
} else if (AR_SREV_POSEIDON(ah)) {
3681
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3682
ar9485Common_wo_xlna_rx_gain_poseidon1_0,
3683
ARRAY_LENGTH(ar9485Common_wo_xlna_rx_gain_poseidon1_0), 2);
3684
} else if (AR_SREV_JUPITER_10(ah)) {
3685
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3686
ar9300_common_wo_xlna_rx_gain_table_jupiter_1p0,
3687
ARRAY_LENGTH(ar9300_common_wo_xlna_rx_gain_table_jupiter_1p0),
3688
2);
3689
} else if (AR_SREV_JUPITER_20(ah)) {
3690
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3691
ar9300Common_wo_xlna_rx_gain_table_jupiter_2p0,
3692
ARRAY_LENGTH(ar9300Common_wo_xlna_rx_gain_table_jupiter_2p0),
3693
2);
3694
} else if (AR_SREV_JUPITER_21(ah)) {
3695
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3696
ar9462_2p1_common_wo_xlna_rx_gain,
3697
ARRAY_LENGTH(ar9462_2p1_common_wo_xlna_rx_gain),
3698
2);
3699
} else if (AR_SREV_APHRODITE(ah)) {
3700
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3701
ar956XCommon_wo_xlna_rx_gain_table_aphrodite_1p0,
3702
ARRAY_LENGTH(ar956XCommon_wo_xlna_rx_gain_table_aphrodite_1p0),
3703
2);
3704
} else if (AR_SREV_AR9580(ah)) {
3705
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3706
ar9300_common_wo_xlna_rx_gain_table_ar9580_1p0,
3707
ARRAY_LENGTH(ar9300_common_wo_xlna_rx_gain_table_ar9580_1p0), 2);
3708
} else if (AR_SREV_WASP(ah)) {
3709
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3710
ar9340Common_wo_xlna_rx_gain_table_wasp_1p0,
3711
ARRAY_LENGTH(ar9340Common_wo_xlna_rx_gain_table_wasp_1p0), 2);
3712
} else if (AR_SREV_SCORPION(ah)) {
3713
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3714
ar955xCommon_wo_xlna_rx_gain_table_scorpion_1p0,
3715
ARRAY_LENGTH(ar955xCommon_wo_xlna_rx_gain_table_scorpion_1p0), 2);
3716
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_bounds,
3717
ar955xCommon_wo_xlna_rx_gain_bounds_scorpion_1p0,
3718
ARRAY_LENGTH(ar955xCommon_wo_xlna_rx_gain_bounds_scorpion_1p0), 5);
3719
} else if (AR_SREV_HONEYBEE(ah)) {
3720
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3721
qca953xCommon_wo_xlna_rx_gain_table_honeybee_1p0,
3722
ARRAY_LENGTH(qca953xCommon_wo_xlna_rx_gain_table_honeybee_1p0), 2);
3723
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain_bounds,
3724
qca953xCommon_wo_xlna_rx_gain_bounds_honeybee_1p0,
3725
ARRAY_LENGTH(qca953xCommon_wo_xlna_rx_gain_bounds_honeybee_1p0), 5);
3726
} else {
3727
INIT_INI_ARRAY(&ahp->ah_ini_modes_rxgain,
3728
ar9300Common_wo_xlna_rx_gain_table_osprey_2p2,
3729
ARRAY_LENGTH(ar9300Common_wo_xlna_rx_gain_table_osprey_2p2), 2);
3730
}
3731
break;
3732
}
3733
}
3734
3735
void ar9300_tx_gain_table_apply(struct ath_hal *ah)
3736
{
3737
struct ath_hal_9300 *ahp = AH9300(ah);
3738
3739
switch (ar9300_tx_gain_index_get(ah))
3740
{
3741
case 0:
3742
default:
3743
if (AR_SREV_HORNET_12(ah)) {
3744
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3745
ar9331_modes_lowest_ob_db_tx_gain_hornet1_2,
3746
ARRAY_LENGTH(ar9331_modes_lowest_ob_db_tx_gain_hornet1_2), 5);
3747
} else if (AR_SREV_HORNET_11(ah)) {
3748
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3749
ar9331_modes_lowest_ob_db_tx_gain_hornet1_1,
3750
ARRAY_LENGTH(ar9331_modes_lowest_ob_db_tx_gain_hornet1_1), 5);
3751
} else if (AR_SREV_POSEIDON_11_OR_LATER(ah)) {
3752
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3753
ar9485_modes_lowest_ob_db_tx_gain_poseidon1_1,
3754
ARRAY_LENGTH(ar9485_modes_lowest_ob_db_tx_gain_poseidon1_1), 5);
3755
} else if (AR_SREV_POSEIDON(ah)) {
3756
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3757
ar9485Modes_lowest_ob_db_tx_gain_poseidon1_0,
3758
ARRAY_LENGTH(ar9485Modes_lowest_ob_db_tx_gain_poseidon1_0), 5);
3759
} else if (AR_SREV_AR9580(ah)) {
3760
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3761
ar9300Modes_lowest_ob_db_tx_gain_table_ar9580_1p0,
3762
ARRAY_LENGTH(ar9300Modes_lowest_ob_db_tx_gain_table_ar9580_1p0),
3763
5);
3764
} else if (AR_SREV_WASP(ah)) {
3765
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3766
ar9340Modes_lowest_ob_db_tx_gain_table_wasp_1p0,
3767
ARRAY_LENGTH(ar9340Modes_lowest_ob_db_tx_gain_table_wasp_1p0),
3768
5);
3769
} else if (AR_SREV_SCORPION(ah)) {
3770
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3771
ar955xModes_xpa_tx_gain_table_scorpion_1p0,
3772
ARRAY_LENGTH(ar955xModes_xpa_tx_gain_table_scorpion_1p0),
3773
9);
3774
} else if (AR_SREV_JUPITER_10(ah)) {
3775
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3776
ar9300_modes_low_ob_db_tx_gain_table_jupiter_1p0,
3777
ARRAY_LENGTH(ar9300_modes_low_ob_db_tx_gain_table_jupiter_1p0),
3778
5);
3779
} else if (AR_SREV_JUPITER_20(ah)) {
3780
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3781
ar9300Modes_low_ob_db_tx_gain_table_jupiter_2p0,
3782
ARRAY_LENGTH(ar9300Modes_low_ob_db_tx_gain_table_jupiter_2p0),
3783
5);
3784
} else if (AR_SREV_JUPITER_21(ah)) {
3785
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3786
ar9462_2p1_modes_low_ob_db_tx_gain,
3787
ARRAY_LENGTH(ar9462_2p1_modes_low_ob_db_tx_gain),
3788
5);
3789
} else if (AR_SREV_HONEYBEE(ah)) {
3790
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3791
qca953xModes_xpa_tx_gain_table_honeybee_1p0,
3792
ARRAY_LENGTH(qca953xModes_xpa_tx_gain_table_honeybee_1p0),
3793
2);
3794
} else if (AR_SREV_APHRODITE(ah)) {
3795
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3796
ar956XModes_low_ob_db_tx_gain_table_aphrodite_1p0,
3797
ARRAY_LENGTH(ar956XModes_low_ob_db_tx_gain_table_aphrodite_1p0),
3798
5);
3799
} else {
3800
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3801
ar9300_modes_lowest_ob_db_tx_gain_table_osprey_2p2,
3802
ARRAY_LENGTH(ar9300_modes_lowest_ob_db_tx_gain_table_osprey_2p2),
3803
5);
3804
}
3805
break;
3806
case 1:
3807
if (AR_SREV_HORNET_12(ah)) {
3808
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3809
ar9331_modes_high_ob_db_tx_gain_hornet1_2,
3810
ARRAY_LENGTH(ar9331_modes_high_ob_db_tx_gain_hornet1_2), 5);
3811
} else if (AR_SREV_HORNET_11(ah)) {
3812
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3813
ar9331_modes_high_ob_db_tx_gain_hornet1_1,
3814
ARRAY_LENGTH(ar9331_modes_high_ob_db_tx_gain_hornet1_1), 5);
3815
} else if (AR_SREV_POSEIDON_11_OR_LATER(ah)) {
3816
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3817
ar9485_modes_high_ob_db_tx_gain_poseidon1_1,
3818
ARRAY_LENGTH(ar9485_modes_high_ob_db_tx_gain_poseidon1_1), 5);
3819
} else if (AR_SREV_POSEIDON(ah)) {
3820
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3821
ar9485Modes_high_ob_db_tx_gain_poseidon1_0,
3822
ARRAY_LENGTH(ar9485Modes_high_ob_db_tx_gain_poseidon1_0), 5);
3823
} else if (AR_SREV_AR9580(ah)) {
3824
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3825
ar9300Modes_high_ob_db_tx_gain_table_ar9580_1p0,
3826
ARRAY_LENGTH(ar9300Modes_high_ob_db_tx_gain_table_ar9580_1p0),
3827
5);
3828
} else if (AR_SREV_WASP(ah)) {
3829
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3830
ar9340Modes_high_ob_db_tx_gain_table_wasp_1p0,
3831
ARRAY_LENGTH(ar9340Modes_high_ob_db_tx_gain_table_wasp_1p0), 5);
3832
} else if (AR_SREV_SCORPION(ah)) {
3833
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3834
ar955xModes_no_xpa_tx_gain_table_scorpion_1p0,
3835
ARRAY_LENGTH(ar955xModes_no_xpa_tx_gain_table_scorpion_1p0), 9);
3836
} else if (AR_SREV_JUPITER_10(ah)) {
3837
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3838
ar9300_modes_high_ob_db_tx_gain_table_jupiter_1p0,
3839
ARRAY_LENGTH(
3840
ar9300_modes_high_ob_db_tx_gain_table_jupiter_1p0), 5);
3841
} else if (AR_SREV_JUPITER_20(ah)) {
3842
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3843
ar9300Modes_high_ob_db_tx_gain_table_jupiter_2p0,
3844
ARRAY_LENGTH(
3845
ar9300Modes_high_ob_db_tx_gain_table_jupiter_2p0), 5);
3846
} else if (AR_SREV_JUPITER_21(ah)) {
3847
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3848
ar9462_2p1_modes_high_ob_db_tx_gain,
3849
ARRAY_LENGTH(
3850
ar9462_2p1_modes_high_ob_db_tx_gain), 5);
3851
} else if (AR_SREV_APHRODITE(ah)) {
3852
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3853
ar956XModes_high_ob_db_tx_gain_table_aphrodite_1p0,
3854
ARRAY_LENGTH(
3855
ar956XModes_high_ob_db_tx_gain_table_aphrodite_1p0), 5);
3856
} else if (AR_SREV_HONEYBEE(ah)) {
3857
if (AR_SREV_HONEYBEE_11(ah)) {
3858
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3859
qca953xModes_no_xpa_tx_gain_table_honeybee_1p1,
3860
ARRAY_LENGTH(qca953xModes_no_xpa_tx_gain_table_honeybee_1p1), 2);
3861
} else {
3862
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3863
qca953xModes_no_xpa_tx_gain_table_honeybee_1p0,
3864
ARRAY_LENGTH(qca953xModes_no_xpa_tx_gain_table_honeybee_1p0), 2);
3865
}
3866
} else {
3867
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3868
ar9300Modes_high_ob_db_tx_gain_table_osprey_2p2,
3869
ARRAY_LENGTH(ar9300Modes_high_ob_db_tx_gain_table_osprey_2p2),
3870
5);
3871
}
3872
break;
3873
case 2:
3874
if (AR_SREV_HORNET_12(ah)) {
3875
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3876
ar9331_modes_low_ob_db_tx_gain_hornet1_2,
3877
ARRAY_LENGTH(ar9331_modes_low_ob_db_tx_gain_hornet1_2), 5);
3878
} else if (AR_SREV_HORNET_11(ah)) {
3879
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3880
ar9331_modes_low_ob_db_tx_gain_hornet1_1,
3881
ARRAY_LENGTH(ar9331_modes_low_ob_db_tx_gain_hornet1_1), 5);
3882
} else if (AR_SREV_POSEIDON_11_OR_LATER(ah)) {
3883
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3884
ar9485_modes_low_ob_db_tx_gain_poseidon1_1,
3885
ARRAY_LENGTH(ar9485_modes_low_ob_db_tx_gain_poseidon1_1), 5);
3886
} else if (AR_SREV_POSEIDON(ah)) {
3887
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3888
ar9485Modes_low_ob_db_tx_gain_poseidon1_0,
3889
ARRAY_LENGTH(ar9485Modes_low_ob_db_tx_gain_poseidon1_0), 5);
3890
} else if (AR_SREV_AR9580(ah)) {
3891
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3892
ar9300Modes_low_ob_db_tx_gain_table_ar9580_1p0,
3893
ARRAY_LENGTH(ar9300Modes_low_ob_db_tx_gain_table_ar9580_1p0),
3894
5);
3895
} else if (AR_SREV_WASP(ah)) {
3896
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3897
ar9340Modes_low_ob_db_tx_gain_table_wasp_1p0,
3898
ARRAY_LENGTH(ar9340Modes_low_ob_db_tx_gain_table_wasp_1p0), 5);
3899
} else if (AR_SREV_APHRODITE(ah)) {
3900
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3901
ar956XModes_low_ob_db_tx_gain_table_aphrodite_1p0,
3902
ARRAY_LENGTH(ar956XModes_low_ob_db_tx_gain_table_aphrodite_1p0), 5);
3903
} else {
3904
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3905
ar9300Modes_low_ob_db_tx_gain_table_osprey_2p2,
3906
ARRAY_LENGTH(ar9300Modes_low_ob_db_tx_gain_table_osprey_2p2),
3907
5);
3908
}
3909
break;
3910
case 3:
3911
if (AR_SREV_HORNET_12(ah)) {
3912
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3913
ar9331_modes_high_power_tx_gain_hornet1_2,
3914
ARRAY_LENGTH(ar9331_modes_high_power_tx_gain_hornet1_2), 5);
3915
} else if (AR_SREV_HORNET_11(ah)) {
3916
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3917
ar9331_modes_high_power_tx_gain_hornet1_1,
3918
ARRAY_LENGTH(ar9331_modes_high_power_tx_gain_hornet1_1), 5);
3919
} else if (AR_SREV_POSEIDON_11_OR_LATER(ah)) {
3920
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3921
ar9485_modes_high_power_tx_gain_poseidon1_1,
3922
ARRAY_LENGTH(ar9485_modes_high_power_tx_gain_poseidon1_1), 5);
3923
} else if (AR_SREV_POSEIDON(ah)) {
3924
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3925
ar9485Modes_high_power_tx_gain_poseidon1_0,
3926
ARRAY_LENGTH(ar9485Modes_high_power_tx_gain_poseidon1_0), 5);
3927
} else if (AR_SREV_AR9580(ah)) {
3928
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3929
ar9300Modes_high_power_tx_gain_table_ar9580_1p0,
3930
ARRAY_LENGTH(ar9300Modes_high_power_tx_gain_table_ar9580_1p0),
3931
5);
3932
} else if (AR_SREV_WASP(ah)) {
3933
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3934
ar9340Modes_high_power_tx_gain_table_wasp_1p0,
3935
ARRAY_LENGTH(ar9340Modes_high_power_tx_gain_table_wasp_1p0),
3936
5);
3937
} else if (AR_SREV_APHRODITE(ah)) {
3938
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3939
ar956XModes_high_power_tx_gain_table_aphrodite_1p0,
3940
ARRAY_LENGTH(ar956XModes_high_power_tx_gain_table_aphrodite_1p0), 5);
3941
} else {
3942
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3943
ar9300Modes_high_power_tx_gain_table_osprey_2p2,
3944
ARRAY_LENGTH(ar9300Modes_high_power_tx_gain_table_osprey_2p2),
3945
5);
3946
}
3947
break;
3948
case 4:
3949
if (AR_SREV_WASP(ah)) {
3950
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3951
ar9340Modes_mixed_ob_db_tx_gain_table_wasp_1p0,
3952
ARRAY_LENGTH(ar9340Modes_mixed_ob_db_tx_gain_table_wasp_1p0),
3953
5);
3954
} else if (AR_SREV_AR9580(ah)) {
3955
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3956
ar9300_modes_mixed_ob_db_tx_gain_table_ar9580_1p0,
3957
ARRAY_LENGTH(ar9300_modes_mixed_ob_db_tx_gain_table_ar9580_1p0),
3958
5);
3959
} else {
3960
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3961
ar9300Modes_mixed_ob_db_tx_gain_table_osprey_2p2,
3962
ARRAY_LENGTH(ar9300Modes_mixed_ob_db_tx_gain_table_osprey_2p2),
3963
5);
3964
}
3965
break;
3966
case 5:
3967
/* HW Green TX */
3968
if (AR_SREV_POSEIDON(ah)) {
3969
if (AR_SREV_POSEIDON_11_OR_LATER(ah)) {
3970
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3971
ar9485_modes_green_ob_db_tx_gain_poseidon1_1,
3972
sizeof(ar9485_modes_green_ob_db_tx_gain_poseidon1_1) /
3973
sizeof(ar9485_modes_green_ob_db_tx_gain_poseidon1_1[0]), 5);
3974
} else {
3975
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3976
ar9485_modes_green_ob_db_tx_gain_poseidon1_0,
3977
sizeof(ar9485_modes_green_ob_db_tx_gain_poseidon1_0) /
3978
sizeof(ar9485_modes_green_ob_db_tx_gain_poseidon1_0[0]), 5);
3979
}
3980
ahp->ah_hw_green_tx_enable = 1;
3981
}
3982
else if (AR_SREV_WASP(ah)) {
3983
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3984
ar9340_modes_ub124_tx_gain_table_wasp_1p0,
3985
sizeof(ar9340_modes_ub124_tx_gain_table_wasp_1p0) /
3986
sizeof(ar9340_modes_ub124_tx_gain_table_wasp_1p0[0]), 5);
3987
}
3988
else if (AR_SREV_AR9580(ah)) {
3989
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3990
ar9300_modes_type5_tx_gain_table_ar9580_1p0,
3991
ARRAY_LENGTH( ar9300_modes_type5_tx_gain_table_ar9580_1p0),
3992
5);
3993
}
3994
else if (AR_SREV_OSPREY_22(ah)) {
3995
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
3996
ar9300_modes_number_5_tx_gain_table_osprey_2p2,
3997
ARRAY_LENGTH( ar9300_modes_number_5_tx_gain_table_osprey_2p2),
3998
5);
3999
}
4000
break;
4001
case 6:
4002
if (AR_SREV_WASP(ah)) {
4003
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
4004
ar9340_modes_low_ob_db_and_spur_tx_gain_table_wasp_1p0,
4005
sizeof(ar9340_modes_low_ob_db_and_spur_tx_gain_table_wasp_1p0) /
4006
sizeof(ar9340_modes_low_ob_db_and_spur_tx_gain_table_wasp_1p0[0]), 5);
4007
}
4008
/* HW Green TX */
4009
else if (AR_SREV_POSEIDON(ah)) {
4010
if (AR_SREV_POSEIDON_11_OR_LATER(ah)) {
4011
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
4012
ar9485_modes_green_spur_ob_db_tx_gain_poseidon1_1,
4013
sizeof(ar9485_modes_green_spur_ob_db_tx_gain_poseidon1_1) /
4014
sizeof(ar9485_modes_green_spur_ob_db_tx_gain_poseidon1_1[0]),
4015
5);
4016
}
4017
ahp->ah_hw_green_tx_enable = 1;
4018
}
4019
else if (AR_SREV_AR9580(ah)) {
4020
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
4021
ar9300_modes_type6_tx_gain_table_ar9580_1p0,
4022
ARRAY_LENGTH( ar9300_modes_type6_tx_gain_table_ar9580_1p0),
4023
5);
4024
}
4025
break;
4026
case 7:
4027
if (AR_SREV_WASP(ah)) {
4028
INIT_INI_ARRAY(&ahp->ah_ini_modes_txgain,
4029
ar9340Modes_cus227_tx_gain_table_wasp_1p0,
4030
sizeof(ar9340Modes_cus227_tx_gain_table_wasp_1p0) /
4031
sizeof(ar9340Modes_cus227_tx_gain_table_wasp_1p0[0]), 5);
4032
}
4033
break;
4034
}
4035
}
4036
4037
#if ATH_ANT_DIV_COMB
4038
void
4039
ar9300_ant_div_comb_get_config(struct ath_hal *ah,
4040
HAL_ANT_COMB_CONFIG *div_comb_conf)
4041
{
4042
u_int32_t reg_val = OS_REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
4043
div_comb_conf->main_lna_conf =
4044
MULTICHAIN_GAIN_CTRL__ANT_DIV_MAIN_LNACONF__READ(reg_val);
4045
div_comb_conf->alt_lna_conf =
4046
MULTICHAIN_GAIN_CTRL__ANT_DIV_ALT_LNACONF__READ(reg_val);
4047
div_comb_conf->fast_div_bias =
4048
MULTICHAIN_GAIN_CTRL__ANT_FAST_DIV_BIAS__READ(reg_val);
4049
if (AR_SREV_HORNET_11(ah)) {
4050
div_comb_conf->antdiv_configgroup = HAL_ANTDIV_CONFIG_GROUP_1;
4051
} else if (AR_SREV_POSEIDON_11_OR_LATER(ah)) {
4052
div_comb_conf->antdiv_configgroup = HAL_ANTDIV_CONFIG_GROUP_2;
4053
} else {
4054
div_comb_conf->antdiv_configgroup = DEFAULT_ANTDIV_CONFIG_GROUP;
4055
}
4056
4057
/*
4058
* XXX TODO: allow the HAL to override the rssithres and fast_div_bias
4059
* values (eg CUS198.)
4060
*/
4061
}
4062
4063
void
4064
ar9300_ant_div_comb_set_config(struct ath_hal *ah,
4065
HAL_ANT_COMB_CONFIG *div_comb_conf)
4066
{
4067
u_int32_t reg_val;
4068
struct ath_hal_9300 *ahp = AH9300(ah);
4069
4070
/* DO NOTHING when set to fixed antenna for manufacturing purpose */
4071
if (AR_SREV_POSEIDON(ah) && ( ahp->ah_diversity_control == HAL_ANT_FIXED_A
4072
|| ahp->ah_diversity_control == HAL_ANT_FIXED_B)) {
4073
return;
4074
}
4075
reg_val = OS_REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
4076
reg_val &= ~(MULTICHAIN_GAIN_CTRL__ANT_DIV_MAIN_LNACONF__MASK |
4077
MULTICHAIN_GAIN_CTRL__ANT_DIV_ALT_LNACONF__MASK |
4078
MULTICHAIN_GAIN_CTRL__ANT_FAST_DIV_BIAS__MASK |
4079
MULTICHAIN_GAIN_CTRL__ANT_DIV_MAIN_GAINTB__MASK |
4080
MULTICHAIN_GAIN_CTRL__ANT_DIV_ALT_GAINTB__MASK );
4081
reg_val |=
4082
MULTICHAIN_GAIN_CTRL__ANT_DIV_MAIN_GAINTB__WRITE(
4083
div_comb_conf->main_gaintb);
4084
reg_val |=
4085
MULTICHAIN_GAIN_CTRL__ANT_DIV_ALT_GAINTB__WRITE(
4086
div_comb_conf->alt_gaintb);
4087
reg_val |=
4088
MULTICHAIN_GAIN_CTRL__ANT_DIV_MAIN_LNACONF__WRITE(
4089
div_comb_conf->main_lna_conf);
4090
reg_val |=
4091
MULTICHAIN_GAIN_CTRL__ANT_DIV_ALT_LNACONF__WRITE(
4092
div_comb_conf->alt_lna_conf);
4093
reg_val |=
4094
MULTICHAIN_GAIN_CTRL__ANT_FAST_DIV_BIAS__WRITE(
4095
div_comb_conf->fast_div_bias);
4096
OS_REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, reg_val);
4097
4098
}
4099
#endif /* ATH_ANT_DIV_COMB */
4100
4101
static void
4102
ar9300_init_hostif_offsets(struct ath_hal *ah)
4103
{
4104
AR_HOSTIF_REG(ah, AR_RC) =
4105
AR9300_HOSTIF_OFFSET(HOST_INTF_RESET_CONTROL);
4106
AR_HOSTIF_REG(ah, AR_WA) =
4107
AR9300_HOSTIF_OFFSET(HOST_INTF_WORK_AROUND);
4108
AR_HOSTIF_REG(ah, AR_PM_STATE) =
4109
AR9300_HOSTIF_OFFSET(HOST_INTF_PM_STATE);
4110
AR_HOSTIF_REG(ah, AR_H_INFOL) =
4111
AR9300_HOSTIF_OFFSET(HOST_INTF_CXPL_DEBUG_INFOL);
4112
AR_HOSTIF_REG(ah, AR_H_INFOH) =
4113
AR9300_HOSTIF_OFFSET(HOST_INTF_CXPL_DEBUG_INFOH);
4114
AR_HOSTIF_REG(ah, AR_PCIE_PM_CTRL) =
4115
AR9300_HOSTIF_OFFSET(HOST_INTF_PM_CTRL);
4116
AR_HOSTIF_REG(ah, AR_HOST_TIMEOUT) =
4117
AR9300_HOSTIF_OFFSET(HOST_INTF_TIMEOUT);
4118
AR_HOSTIF_REG(ah, AR_EEPROM) =
4119
AR9300_HOSTIF_OFFSET(HOST_INTF_EEPROM_CTRL);
4120
AR_HOSTIF_REG(ah, AR_SREV) =
4121
AR9300_HOSTIF_OFFSET(HOST_INTF_SREV);
4122
AR_HOSTIF_REG(ah, AR_INTR_SYNC_CAUSE) =
4123
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_SYNC_CAUSE);
4124
AR_HOSTIF_REG(ah, AR_INTR_SYNC_CAUSE_CLR) =
4125
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_SYNC_CAUSE);
4126
AR_HOSTIF_REG(ah, AR_INTR_SYNC_ENABLE) =
4127
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_SYNC_ENABLE);
4128
AR_HOSTIF_REG(ah, AR_INTR_ASYNC_MASK) =
4129
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_ASYNC_MASK);
4130
AR_HOSTIF_REG(ah, AR_INTR_SYNC_MASK) =
4131
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_SYNC_MASK);
4132
AR_HOSTIF_REG(ah, AR_INTR_ASYNC_CAUSE_CLR) =
4133
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_ASYNC_CAUSE);
4134
AR_HOSTIF_REG(ah, AR_INTR_ASYNC_CAUSE) =
4135
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_ASYNC_CAUSE);
4136
AR_HOSTIF_REG(ah, AR_INTR_ASYNC_ENABLE) =
4137
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_ASYNC_ENABLE);
4138
AR_HOSTIF_REG(ah, AR_PCIE_SERDES) =
4139
AR9300_HOSTIF_OFFSET(HOST_INTF_PCIE_PHY_RW);
4140
AR_HOSTIF_REG(ah, AR_PCIE_SERDES2) =
4141
AR9300_HOSTIF_OFFSET(HOST_INTF_PCIE_PHY_LOAD);
4142
AR_HOSTIF_REG(ah, AR_GPIO_OUT) =
4143
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_OUT);
4144
AR_HOSTIF_REG(ah, AR_GPIO_IN) =
4145
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_IN);
4146
AR_HOSTIF_REG(ah, AR_GPIO_OE_OUT) =
4147
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_OE);
4148
AR_HOSTIF_REG(ah, AR_GPIO_OE1_OUT) =
4149
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_OE1);
4150
AR_HOSTIF_REG(ah, AR_GPIO_INTR_POL) =
4151
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_INTR_POLAR);
4152
AR_HOSTIF_REG(ah, AR_GPIO_INPUT_EN_VAL) =
4153
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_INPUT_VALUE);
4154
AR_HOSTIF_REG(ah, AR_GPIO_INPUT_MUX1) =
4155
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_INPUT_MUX1);
4156
AR_HOSTIF_REG(ah, AR_GPIO_INPUT_MUX2) =
4157
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_INPUT_MUX2);
4158
AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX1) =
4159
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_OUTPUT_MUX1);
4160
AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX2) =
4161
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_OUTPUT_MUX2);
4162
AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX3) =
4163
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_OUTPUT_MUX3);
4164
AR_HOSTIF_REG(ah, AR_INPUT_STATE) =
4165
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_INPUT_STATE);
4166
AR_HOSTIF_REG(ah, AR_SPARE) =
4167
AR9300_HOSTIF_OFFSET(HOST_INTF_SPARE);
4168
AR_HOSTIF_REG(ah, AR_PCIE_CORE_RESET_EN) =
4169
AR9300_HOSTIF_OFFSET(HOST_INTF_PCIE_CORE_RST_EN);
4170
AR_HOSTIF_REG(ah, AR_CLKRUN) =
4171
AR9300_HOSTIF_OFFSET(HOST_INTF_CLKRUN);
4172
AR_HOSTIF_REG(ah, AR_EEPROM_STATUS_DATA) =
4173
AR9300_HOSTIF_OFFSET(HOST_INTF_EEPROM_STS);
4174
AR_HOSTIF_REG(ah, AR_OBS) =
4175
AR9300_HOSTIF_OFFSET(HOST_INTF_OBS_CTRL);
4176
AR_HOSTIF_REG(ah, AR_RFSILENT) =
4177
AR9300_HOSTIF_OFFSET(HOST_INTF_RFSILENT);
4178
AR_HOSTIF_REG(ah, AR_GPIO_PDPU) =
4179
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_PDPU);
4180
AR_HOSTIF_REG(ah, AR_GPIO_DS) =
4181
AR9300_HOSTIF_OFFSET(HOST_INTF_GPIO_DS);
4182
AR_HOSTIF_REG(ah, AR_MISC) =
4183
AR9300_HOSTIF_OFFSET(HOST_INTF_MISC);
4184
AR_HOSTIF_REG(ah, AR_PCIE_MSI) =
4185
AR9300_HOSTIF_OFFSET(HOST_INTF_PCIE_MSI);
4186
#if 0 /* Offsets are not defined in reg_map structure */
4187
AR_HOSTIF_REG(ah, AR_TSF_SNAPSHOT_BT_ACTIVE) =
4188
AR9300_HOSTIF_OFFSET(HOST_INTF_TSF_SNAPSHOT_BT_ACTIVE);
4189
AR_HOSTIF_REG(ah, AR_TSF_SNAPSHOT_BT_PRIORITY) =
4190
AR9300_HOSTIF_OFFSET(HOST_INTF_TSF_SNAPSHOT_BT_PRIORITY);
4191
AR_HOSTIF_REG(ah, AR_TSF_SNAPSHOT_BT_CNTL) =
4192
AR9300_HOSTIF_OFFSET(HOST_INTF_MAC_TSF_SNAPSHOT_BT_CNTL);
4193
#endif
4194
AR_HOSTIF_REG(ah, AR_PCIE_PHY_LATENCY_NFTS_ADJ) =
4195
AR9300_HOSTIF_OFFSET(HOST_INTF_PCIE_PHY_LATENCY_NFTS_ADJ);
4196
AR_HOSTIF_REG(ah, AR_TDMA_CCA_CNTL) =
4197
AR9300_HOSTIF_OFFSET(HOST_INTF_MAC_TDMA_CCA_CNTL);
4198
AR_HOSTIF_REG(ah, AR_TXAPSYNC) =
4199
AR9300_HOSTIF_OFFSET(HOST_INTF_MAC_TXAPSYNC);
4200
AR_HOSTIF_REG(ah, AR_TXSYNC_INIT_SYNC_TMR) =
4201
AR9300_HOSTIF_OFFSET(HOST_INTF_MAC_TXSYNC_INITIAL_SYNC_TMR);
4202
AR_HOSTIF_REG(ah, AR_INTR_PRIO_SYNC_CAUSE) =
4203
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_SYNC_CAUSE);
4204
AR_HOSTIF_REG(ah, AR_INTR_PRIO_SYNC_ENABLE) =
4205
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_SYNC_ENABLE);
4206
AR_HOSTIF_REG(ah, AR_INTR_PRIO_ASYNC_MASK) =
4207
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_ASYNC_MASK);
4208
AR_HOSTIF_REG(ah, AR_INTR_PRIO_SYNC_MASK) =
4209
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_SYNC_MASK);
4210
AR_HOSTIF_REG(ah, AR_INTR_PRIO_ASYNC_CAUSE) =
4211
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_ASYNC_CAUSE);
4212
AR_HOSTIF_REG(ah, AR_INTR_PRIO_ASYNC_ENABLE) =
4213
AR9300_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_ASYNC_ENABLE);
4214
}
4215
4216
static void
4217
ar9340_init_hostif_offsets(struct ath_hal *ah)
4218
{
4219
AR_HOSTIF_REG(ah, AR_RC) =
4220
AR9340_HOSTIF_OFFSET(HOST_INTF_RESET_CONTROL);
4221
AR_HOSTIF_REG(ah, AR_WA) =
4222
AR9340_HOSTIF_OFFSET(HOST_INTF_WORK_AROUND);
4223
AR_HOSTIF_REG(ah, AR_PCIE_PM_CTRL) =
4224
AR9340_HOSTIF_OFFSET(HOST_INTF_PM_CTRL);
4225
AR_HOSTIF_REG(ah, AR_HOST_TIMEOUT) =
4226
AR9340_HOSTIF_OFFSET(HOST_INTF_TIMEOUT);
4227
AR_HOSTIF_REG(ah, AR_SREV) =
4228
AR9340_HOSTIF_OFFSET(HOST_INTF_SREV);
4229
AR_HOSTIF_REG(ah, AR_INTR_SYNC_CAUSE) =
4230
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_SYNC_CAUSE);
4231
AR_HOSTIF_REG(ah, AR_INTR_SYNC_CAUSE_CLR) =
4232
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_SYNC_CAUSE);
4233
AR_HOSTIF_REG(ah, AR_INTR_SYNC_ENABLE) =
4234
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_SYNC_ENABLE);
4235
AR_HOSTIF_REG(ah, AR_INTR_ASYNC_MASK) =
4236
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_ASYNC_MASK);
4237
AR_HOSTIF_REG(ah, AR_INTR_SYNC_MASK) =
4238
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_SYNC_MASK);
4239
AR_HOSTIF_REG(ah, AR_INTR_ASYNC_CAUSE_CLR) =
4240
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_ASYNC_CAUSE);
4241
AR_HOSTIF_REG(ah, AR_INTR_ASYNC_CAUSE) =
4242
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_ASYNC_CAUSE);
4243
AR_HOSTIF_REG(ah, AR_INTR_ASYNC_ENABLE) =
4244
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_ASYNC_ENABLE);
4245
AR_HOSTIF_REG(ah, AR_GPIO_OUT) =
4246
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_OUT);
4247
AR_HOSTIF_REG(ah, AR_GPIO_IN) =
4248
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_IN);
4249
AR_HOSTIF_REG(ah, AR_GPIO_OE_OUT) =
4250
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_OE);
4251
AR_HOSTIF_REG(ah, AR_GPIO_OE1_OUT) =
4252
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_OE1);
4253
AR_HOSTIF_REG(ah, AR_GPIO_INTR_POL) =
4254
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_INTR_POLAR);
4255
AR_HOSTIF_REG(ah, AR_GPIO_INPUT_EN_VAL) =
4256
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_INPUT_VALUE);
4257
AR_HOSTIF_REG(ah, AR_GPIO_INPUT_MUX1) =
4258
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_INPUT_MUX1);
4259
AR_HOSTIF_REG(ah, AR_GPIO_INPUT_MUX2) =
4260
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_INPUT_MUX2);
4261
AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX1) =
4262
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_OUTPUT_MUX1);
4263
AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX2) =
4264
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_OUTPUT_MUX2);
4265
AR_HOSTIF_REG(ah, AR_GPIO_OUTPUT_MUX3) =
4266
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_OUTPUT_MUX3);
4267
AR_HOSTIF_REG(ah, AR_INPUT_STATE) =
4268
AR9340_HOSTIF_OFFSET(HOST_INTF_GPIO_INPUT_STATE);
4269
AR_HOSTIF_REG(ah, AR_CLKRUN) =
4270
AR9340_HOSTIF_OFFSET(HOST_INTF_CLKRUN);
4271
AR_HOSTIF_REG(ah, AR_EEPROM_STATUS_DATA) =
4272
AR9340_HOSTIF_OFFSET(HOST_INTF_EEPROM_STS);
4273
AR_HOSTIF_REG(ah, AR_OBS) =
4274
AR9340_HOSTIF_OFFSET(HOST_INTF_OBS_CTRL);
4275
AR_HOSTIF_REG(ah, AR_RFSILENT) =
4276
AR9340_HOSTIF_OFFSET(HOST_INTF_RFSILENT);
4277
AR_HOSTIF_REG(ah, AR_MISC) =
4278
AR9340_HOSTIF_OFFSET(HOST_INTF_MISC);
4279
AR_HOSTIF_REG(ah, AR_PCIE_MSI) =
4280
AR9340_HOSTIF_OFFSET(HOST_INTF_PCIE_MSI);
4281
AR_HOSTIF_REG(ah, AR_TDMA_CCA_CNTL) =
4282
AR9340_HOSTIF_OFFSET(HOST_INTF_MAC_TDMA_CCA_CNTL);
4283
AR_HOSTIF_REG(ah, AR_TXAPSYNC) =
4284
AR9340_HOSTIF_OFFSET(HOST_INTF_MAC_TXAPSYNC);
4285
AR_HOSTIF_REG(ah, AR_TXSYNC_INIT_SYNC_TMR) =
4286
AR9340_HOSTIF_OFFSET(HOST_INTF_MAC_TXSYNC_INITIAL_SYNC_TMR);
4287
AR_HOSTIF_REG(ah, AR_INTR_PRIO_SYNC_CAUSE) =
4288
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_SYNC_CAUSE);
4289
AR_HOSTIF_REG(ah, AR_INTR_PRIO_SYNC_ENABLE) =
4290
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_SYNC_ENABLE);
4291
AR_HOSTIF_REG(ah, AR_INTR_PRIO_ASYNC_MASK) =
4292
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_ASYNC_MASK);
4293
AR_HOSTIF_REG(ah, AR_INTR_PRIO_SYNC_MASK) =
4294
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_SYNC_MASK);
4295
AR_HOSTIF_REG(ah, AR_INTR_PRIO_ASYNC_CAUSE) =
4296
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_ASYNC_CAUSE);
4297
AR_HOSTIF_REG(ah, AR_INTR_PRIO_ASYNC_ENABLE) =
4298
AR9340_HOSTIF_OFFSET(HOST_INTF_INTR_PRIORITY_ASYNC_ENABLE);
4299
}
4300
4301
/*
4302
* Host interface register offsets are different for Osprey and Wasp
4303
* and hence store the offsets in hal structure
4304
*/
4305
static int ar9300_init_offsets(struct ath_hal *ah, u_int16_t devid)
4306
{
4307
if (devid == AR9300_DEVID_AR9340) {
4308
ar9340_init_hostif_offsets(ah);
4309
} else {
4310
ar9300_init_hostif_offsets(ah);
4311
}
4312
return 0;
4313
}
4314
4315
4316
static const char*
4317
ar9300_probe(uint16_t vendorid, uint16_t devid)
4318
{
4319
if (vendorid != ATHEROS_VENDOR_ID)
4320
return AH_NULL;
4321
4322
switch (devid) {
4323
case AR9300_DEVID_AR9380_PCIE: /* PCIE (Osprey) */
4324
return "Atheros AR938x";
4325
case AR9300_DEVID_AR9340: /* Wasp */
4326
return "Atheros AR934x";
4327
case AR9300_DEVID_AR9485_PCIE: /* Poseidon */
4328
return "Atheros AR9485";
4329
case AR9300_DEVID_AR9580_PCIE: /* Peacock */
4330
return "Atheros AR9580";
4331
case AR9300_DEVID_AR946X_PCIE: /* AR9462, AR9463, AR9482 */
4332
return "Atheros AR946x/AR948x";
4333
case AR9300_DEVID_AR9330: /* Hornet */
4334
return "Atheros AR933x";
4335
case AR9300_DEVID_QCA955X: /* Scorpion */
4336
return "Qualcomm Atheros QCA955x";
4337
case AR9300_DEVID_QCA9565: /* Aphrodite */
4338
return "Qualcomm Atheros AR9565";
4339
case AR9300_DEVID_QCA953X: /* Honeybee */
4340
return "Qualcomm Atheros QCA953x";
4341
case AR9300_DEVID_AR1111_PCIE:
4342
return "Atheros AR1111";
4343
default:
4344
return AH_NULL;
4345
}
4346
4347
return AH_NULL;
4348
}
4349
4350
AH_CHIP(AR9300, ar9300_probe, ar9300_attach);
4351
4352
4353