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 
4121