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