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