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