162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. 562306a36Sopenharmony_ci * Copyright (C) 2019 Intel Corporation 662306a36Sopenharmony_ci *****************************************************************************/ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/units.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* 1162306a36Sopenharmony_ci * DVM device-specific data & functions 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci#include "iwl-io.h" 1462306a36Sopenharmony_ci#include "iwl-prph.h" 1562306a36Sopenharmony_ci#include "iwl-eeprom-parse.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include "agn.h" 1862306a36Sopenharmony_ci#include "dev.h" 1962306a36Sopenharmony_ci#include "commands.h" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* 2362306a36Sopenharmony_ci * 1000 series 2462306a36Sopenharmony_ci * =========== 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* 2862306a36Sopenharmony_ci * For 1000, use advance thermal throttling critical temperature threshold, 2962306a36Sopenharmony_ci * but legacy thermal management implementation for now. 3062306a36Sopenharmony_ci * This is for the reason of 1000 uCode using advance thermal throttling API 3162306a36Sopenharmony_ci * but not implement ct_kill_exit based on ct_kill exit temperature 3262306a36Sopenharmony_ci * so the thermal throttling will still based on legacy thermal throttling 3362306a36Sopenharmony_ci * management. 3462306a36Sopenharmony_ci * The code here need to be modified once 1000 uCode has the advanced thermal 3562306a36Sopenharmony_ci * throttling algorithm in place 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_cistatic void iwl1000_set_ct_threshold(struct iwl_priv *priv) 3862306a36Sopenharmony_ci{ 3962306a36Sopenharmony_ci /* want Celsius */ 4062306a36Sopenharmony_ci priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD_LEGACY; 4162306a36Sopenharmony_ci priv->hw_params.ct_kill_exit_threshold = CT_KILL_EXIT_THRESHOLD; 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci/* NIC configuration for 1000 series */ 4562306a36Sopenharmony_cistatic void iwl1000_nic_config(struct iwl_priv *priv) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci /* Setting digital SVR for 1000 card to 1.32V */ 4862306a36Sopenharmony_ci /* locking is acquired in iwl_set_bits_mask_prph() function */ 4962306a36Sopenharmony_ci iwl_set_bits_mask_prph(priv->trans, APMG_DIGITAL_SVR_REG, 5062306a36Sopenharmony_ci APMG_SVR_DIGITAL_VOLTAGE_1_32, 5162306a36Sopenharmony_ci ~APMG_SVR_VOLTAGE_CONFIG_BIT_MSK); 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/** 5562306a36Sopenharmony_ci * iwl_beacon_time_mask_low - mask of lower 32 bit of beacon time 5662306a36Sopenharmony_ci * @priv: pointer to iwl_priv data structure 5762306a36Sopenharmony_ci * @tsf_bits: number of bits need to shift for masking) 5862306a36Sopenharmony_ci */ 5962306a36Sopenharmony_cistatic inline u32 iwl_beacon_time_mask_low(struct iwl_priv *priv, 6062306a36Sopenharmony_ci u16 tsf_bits) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci return (1 << tsf_bits) - 1; 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/** 6662306a36Sopenharmony_ci * iwl_beacon_time_mask_high - mask of higher 32 bit of beacon time 6762306a36Sopenharmony_ci * @priv: pointer to iwl_priv data structure 6862306a36Sopenharmony_ci * @tsf_bits: number of bits need to shift for masking) 6962306a36Sopenharmony_ci */ 7062306a36Sopenharmony_cistatic inline u32 iwl_beacon_time_mask_high(struct iwl_priv *priv, 7162306a36Sopenharmony_ci u16 tsf_bits) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci return ((1 << (32 - tsf_bits)) - 1) << tsf_bits; 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* 7762306a36Sopenharmony_ci * extended beacon time format 7862306a36Sopenharmony_ci * time in usec will be changed into a 32-bit value in extended:internal format 7962306a36Sopenharmony_ci * the extended part is the beacon counts 8062306a36Sopenharmony_ci * the internal part is the time in usec within one beacon interval 8162306a36Sopenharmony_ci */ 8262306a36Sopenharmony_cistatic u32 iwl_usecs_to_beacons(struct iwl_priv *priv, u32 usec, 8362306a36Sopenharmony_ci u32 beacon_interval) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci u32 quot; 8662306a36Sopenharmony_ci u32 rem; 8762306a36Sopenharmony_ci u32 interval = beacon_interval * TIME_UNIT; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci if (!interval || !usec) 9062306a36Sopenharmony_ci return 0; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci quot = (usec / interval) & 9362306a36Sopenharmony_ci (iwl_beacon_time_mask_high(priv, IWLAGN_EXT_BEACON_TIME_POS) >> 9462306a36Sopenharmony_ci IWLAGN_EXT_BEACON_TIME_POS); 9562306a36Sopenharmony_ci rem = (usec % interval) & iwl_beacon_time_mask_low(priv, 9662306a36Sopenharmony_ci IWLAGN_EXT_BEACON_TIME_POS); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci return (quot << IWLAGN_EXT_BEACON_TIME_POS) + rem; 9962306a36Sopenharmony_ci} 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci/* base is usually what we get from ucode with each received frame, 10262306a36Sopenharmony_ci * the same as HW timer counter counting down 10362306a36Sopenharmony_ci */ 10462306a36Sopenharmony_cistatic __le32 iwl_add_beacon_time(struct iwl_priv *priv, u32 base, 10562306a36Sopenharmony_ci u32 addon, u32 beacon_interval) 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci u32 base_low = base & iwl_beacon_time_mask_low(priv, 10862306a36Sopenharmony_ci IWLAGN_EXT_BEACON_TIME_POS); 10962306a36Sopenharmony_ci u32 addon_low = addon & iwl_beacon_time_mask_low(priv, 11062306a36Sopenharmony_ci IWLAGN_EXT_BEACON_TIME_POS); 11162306a36Sopenharmony_ci u32 interval = beacon_interval * TIME_UNIT; 11262306a36Sopenharmony_ci u32 res = (base & iwl_beacon_time_mask_high(priv, 11362306a36Sopenharmony_ci IWLAGN_EXT_BEACON_TIME_POS)) + 11462306a36Sopenharmony_ci (addon & iwl_beacon_time_mask_high(priv, 11562306a36Sopenharmony_ci IWLAGN_EXT_BEACON_TIME_POS)); 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci if (base_low > addon_low) 11862306a36Sopenharmony_ci res += base_low - addon_low; 11962306a36Sopenharmony_ci else if (base_low < addon_low) { 12062306a36Sopenharmony_ci res += interval + base_low - addon_low; 12162306a36Sopenharmony_ci res += (1 << IWLAGN_EXT_BEACON_TIME_POS); 12262306a36Sopenharmony_ci } else 12362306a36Sopenharmony_ci res += (1 << IWLAGN_EXT_BEACON_TIME_POS); 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci return cpu_to_le32(res); 12662306a36Sopenharmony_ci} 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic const struct iwl_sensitivity_ranges iwl1000_sensitivity = { 12962306a36Sopenharmony_ci .min_nrg_cck = 95, 13062306a36Sopenharmony_ci .auto_corr_min_ofdm = 90, 13162306a36Sopenharmony_ci .auto_corr_min_ofdm_mrc = 170, 13262306a36Sopenharmony_ci .auto_corr_min_ofdm_x1 = 120, 13362306a36Sopenharmony_ci .auto_corr_min_ofdm_mrc_x1 = 240, 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci .auto_corr_max_ofdm = 120, 13662306a36Sopenharmony_ci .auto_corr_max_ofdm_mrc = 210, 13762306a36Sopenharmony_ci .auto_corr_max_ofdm_x1 = 155, 13862306a36Sopenharmony_ci .auto_corr_max_ofdm_mrc_x1 = 290, 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci .auto_corr_min_cck = 125, 14162306a36Sopenharmony_ci .auto_corr_max_cck = 200, 14262306a36Sopenharmony_ci .auto_corr_min_cck_mrc = 170, 14362306a36Sopenharmony_ci .auto_corr_max_cck_mrc = 400, 14462306a36Sopenharmony_ci .nrg_th_cck = 95, 14562306a36Sopenharmony_ci .nrg_th_ofdm = 95, 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci .barker_corr_th_min = 190, 14862306a36Sopenharmony_ci .barker_corr_th_min_mrc = 390, 14962306a36Sopenharmony_ci .nrg_th_cca = 62, 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistatic void iwl1000_hw_set_hw_params(struct iwl_priv *priv) 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci iwl1000_set_ct_threshold(priv); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci /* Set initial sensitivity parameters */ 15762306a36Sopenharmony_ci priv->hw_params.sens = &iwl1000_sensitivity; 15862306a36Sopenharmony_ci} 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ciconst struct iwl_dvm_cfg iwl_dvm_1000_cfg = { 16162306a36Sopenharmony_ci .set_hw_params = iwl1000_hw_set_hw_params, 16262306a36Sopenharmony_ci .nic_config = iwl1000_nic_config, 16362306a36Sopenharmony_ci .temperature = iwlagn_temperature, 16462306a36Sopenharmony_ci .support_ct_kill_exit = true, 16562306a36Sopenharmony_ci .plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF, 16662306a36Sopenharmony_ci .chain_noise_scale = 1000, 16762306a36Sopenharmony_ci}; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci/* 17162306a36Sopenharmony_ci * 2000 series 17262306a36Sopenharmony_ci * =========== 17362306a36Sopenharmony_ci */ 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistatic void iwl2000_set_ct_threshold(struct iwl_priv *priv) 17662306a36Sopenharmony_ci{ 17762306a36Sopenharmony_ci /* want Celsius */ 17862306a36Sopenharmony_ci priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD; 17962306a36Sopenharmony_ci priv->hw_params.ct_kill_exit_threshold = CT_KILL_EXIT_THRESHOLD; 18062306a36Sopenharmony_ci} 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci/* NIC configuration for 2000 series */ 18362306a36Sopenharmony_cistatic void iwl2000_nic_config(struct iwl_priv *priv) 18462306a36Sopenharmony_ci{ 18562306a36Sopenharmony_ci iwl_set_bit(priv->trans, CSR_GP_DRIVER_REG, 18662306a36Sopenharmony_ci CSR_GP_DRIVER_REG_BIT_RADIO_IQ_INVER); 18762306a36Sopenharmony_ci} 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistatic const struct iwl_sensitivity_ranges iwl2000_sensitivity = { 19062306a36Sopenharmony_ci .min_nrg_cck = 97, 19162306a36Sopenharmony_ci .auto_corr_min_ofdm = 80, 19262306a36Sopenharmony_ci .auto_corr_min_ofdm_mrc = 128, 19362306a36Sopenharmony_ci .auto_corr_min_ofdm_x1 = 105, 19462306a36Sopenharmony_ci .auto_corr_min_ofdm_mrc_x1 = 192, 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci .auto_corr_max_ofdm = 145, 19762306a36Sopenharmony_ci .auto_corr_max_ofdm_mrc = 232, 19862306a36Sopenharmony_ci .auto_corr_max_ofdm_x1 = 110, 19962306a36Sopenharmony_ci .auto_corr_max_ofdm_mrc_x1 = 232, 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci .auto_corr_min_cck = 125, 20262306a36Sopenharmony_ci .auto_corr_max_cck = 175, 20362306a36Sopenharmony_ci .auto_corr_min_cck_mrc = 160, 20462306a36Sopenharmony_ci .auto_corr_max_cck_mrc = 310, 20562306a36Sopenharmony_ci .nrg_th_cck = 97, 20662306a36Sopenharmony_ci .nrg_th_ofdm = 100, 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci .barker_corr_th_min = 190, 20962306a36Sopenharmony_ci .barker_corr_th_min_mrc = 390, 21062306a36Sopenharmony_ci .nrg_th_cca = 62, 21162306a36Sopenharmony_ci}; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_cistatic void iwl2000_hw_set_hw_params(struct iwl_priv *priv) 21462306a36Sopenharmony_ci{ 21562306a36Sopenharmony_ci iwl2000_set_ct_threshold(priv); 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci /* Set initial sensitivity parameters */ 21862306a36Sopenharmony_ci priv->hw_params.sens = &iwl2000_sensitivity; 21962306a36Sopenharmony_ci} 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ciconst struct iwl_dvm_cfg iwl_dvm_2000_cfg = { 22262306a36Sopenharmony_ci .set_hw_params = iwl2000_hw_set_hw_params, 22362306a36Sopenharmony_ci .nic_config = iwl2000_nic_config, 22462306a36Sopenharmony_ci .temperature = iwlagn_temperature, 22562306a36Sopenharmony_ci .adv_thermal_throttle = true, 22662306a36Sopenharmony_ci .support_ct_kill_exit = true, 22762306a36Sopenharmony_ci .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, 22862306a36Sopenharmony_ci .chain_noise_scale = 1000, 22962306a36Sopenharmony_ci .hd_v2 = true, 23062306a36Sopenharmony_ci .need_temp_offset_calib = true, 23162306a36Sopenharmony_ci .temp_offset_v2 = true, 23262306a36Sopenharmony_ci}; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ciconst struct iwl_dvm_cfg iwl_dvm_105_cfg = { 23562306a36Sopenharmony_ci .set_hw_params = iwl2000_hw_set_hw_params, 23662306a36Sopenharmony_ci .nic_config = iwl2000_nic_config, 23762306a36Sopenharmony_ci .temperature = iwlagn_temperature, 23862306a36Sopenharmony_ci .adv_thermal_throttle = true, 23962306a36Sopenharmony_ci .support_ct_kill_exit = true, 24062306a36Sopenharmony_ci .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, 24162306a36Sopenharmony_ci .chain_noise_scale = 1000, 24262306a36Sopenharmony_ci .hd_v2 = true, 24362306a36Sopenharmony_ci .need_temp_offset_calib = true, 24462306a36Sopenharmony_ci .temp_offset_v2 = true, 24562306a36Sopenharmony_ci .adv_pm = true, 24662306a36Sopenharmony_ci}; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistatic const struct iwl_dvm_bt_params iwl2030_bt_params = { 24962306a36Sopenharmony_ci /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 25062306a36Sopenharmony_ci .advanced_bt_coexist = true, 25162306a36Sopenharmony_ci .agg_time_limit = BT_AGG_THRESHOLD_DEF, 25262306a36Sopenharmony_ci .bt_init_traffic_load = IWL_BT_COEX_TRAFFIC_LOAD_NONE, 25362306a36Sopenharmony_ci .bt_prio_boost = IWLAGN_BT_PRIO_BOOST_DEFAULT32, 25462306a36Sopenharmony_ci .bt_sco_disable = true, 25562306a36Sopenharmony_ci .bt_session_2 = true, 25662306a36Sopenharmony_ci}; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ciconst struct iwl_dvm_cfg iwl_dvm_2030_cfg = { 25962306a36Sopenharmony_ci .set_hw_params = iwl2000_hw_set_hw_params, 26062306a36Sopenharmony_ci .nic_config = iwl2000_nic_config, 26162306a36Sopenharmony_ci .temperature = iwlagn_temperature, 26262306a36Sopenharmony_ci .adv_thermal_throttle = true, 26362306a36Sopenharmony_ci .support_ct_kill_exit = true, 26462306a36Sopenharmony_ci .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, 26562306a36Sopenharmony_ci .chain_noise_scale = 1000, 26662306a36Sopenharmony_ci .hd_v2 = true, 26762306a36Sopenharmony_ci .bt_params = &iwl2030_bt_params, 26862306a36Sopenharmony_ci .need_temp_offset_calib = true, 26962306a36Sopenharmony_ci .temp_offset_v2 = true, 27062306a36Sopenharmony_ci .adv_pm = true, 27162306a36Sopenharmony_ci}; 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci/* 27462306a36Sopenharmony_ci * 5000 series 27562306a36Sopenharmony_ci * =========== 27662306a36Sopenharmony_ci */ 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci/* NIC configuration for 5000 series */ 27962306a36Sopenharmony_cistatic const struct iwl_sensitivity_ranges iwl5000_sensitivity = { 28062306a36Sopenharmony_ci .min_nrg_cck = 100, 28162306a36Sopenharmony_ci .auto_corr_min_ofdm = 90, 28262306a36Sopenharmony_ci .auto_corr_min_ofdm_mrc = 170, 28362306a36Sopenharmony_ci .auto_corr_min_ofdm_x1 = 105, 28462306a36Sopenharmony_ci .auto_corr_min_ofdm_mrc_x1 = 220, 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci .auto_corr_max_ofdm = 120, 28762306a36Sopenharmony_ci .auto_corr_max_ofdm_mrc = 210, 28862306a36Sopenharmony_ci .auto_corr_max_ofdm_x1 = 120, 28962306a36Sopenharmony_ci .auto_corr_max_ofdm_mrc_x1 = 240, 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci .auto_corr_min_cck = 125, 29262306a36Sopenharmony_ci .auto_corr_max_cck = 200, 29362306a36Sopenharmony_ci .auto_corr_min_cck_mrc = 200, 29462306a36Sopenharmony_ci .auto_corr_max_cck_mrc = 400, 29562306a36Sopenharmony_ci .nrg_th_cck = 100, 29662306a36Sopenharmony_ci .nrg_th_ofdm = 100, 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci .barker_corr_th_min = 190, 29962306a36Sopenharmony_ci .barker_corr_th_min_mrc = 390, 30062306a36Sopenharmony_ci .nrg_th_cca = 62, 30162306a36Sopenharmony_ci}; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistatic const struct iwl_sensitivity_ranges iwl5150_sensitivity = { 30462306a36Sopenharmony_ci .min_nrg_cck = 95, 30562306a36Sopenharmony_ci .auto_corr_min_ofdm = 90, 30662306a36Sopenharmony_ci .auto_corr_min_ofdm_mrc = 170, 30762306a36Sopenharmony_ci .auto_corr_min_ofdm_x1 = 105, 30862306a36Sopenharmony_ci .auto_corr_min_ofdm_mrc_x1 = 220, 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci .auto_corr_max_ofdm = 120, 31162306a36Sopenharmony_ci .auto_corr_max_ofdm_mrc = 210, 31262306a36Sopenharmony_ci /* max = min for performance bug in 5150 DSP */ 31362306a36Sopenharmony_ci .auto_corr_max_ofdm_x1 = 105, 31462306a36Sopenharmony_ci .auto_corr_max_ofdm_mrc_x1 = 220, 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci .auto_corr_min_cck = 125, 31762306a36Sopenharmony_ci .auto_corr_max_cck = 200, 31862306a36Sopenharmony_ci .auto_corr_min_cck_mrc = 170, 31962306a36Sopenharmony_ci .auto_corr_max_cck_mrc = 400, 32062306a36Sopenharmony_ci .nrg_th_cck = 95, 32162306a36Sopenharmony_ci .nrg_th_ofdm = 95, 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci .barker_corr_th_min = 190, 32462306a36Sopenharmony_ci .barker_corr_th_min_mrc = 390, 32562306a36Sopenharmony_ci .nrg_th_cca = 62, 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci#define IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF (-5) 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_cistatic s32 iwl_temp_calib_to_offset(struct iwl_priv *priv) 33162306a36Sopenharmony_ci{ 33262306a36Sopenharmony_ci u16 temperature, voltage; 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci temperature = le16_to_cpu(priv->nvm_data->kelvin_temperature); 33562306a36Sopenharmony_ci voltage = le16_to_cpu(priv->nvm_data->kelvin_voltage); 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci /* offset = temp - volt / coeff */ 33862306a36Sopenharmony_ci return (s32)(temperature - 33962306a36Sopenharmony_ci voltage / IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF); 34062306a36Sopenharmony_ci} 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_cistatic void iwl5150_set_ct_threshold(struct iwl_priv *priv) 34362306a36Sopenharmony_ci{ 34462306a36Sopenharmony_ci const s32 volt2temp_coef = IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF; 34562306a36Sopenharmony_ci s32 threshold = (s32)celsius_to_kelvin(CT_KILL_THRESHOLD_LEGACY) - 34662306a36Sopenharmony_ci iwl_temp_calib_to_offset(priv); 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci priv->hw_params.ct_kill_threshold = threshold * volt2temp_coef; 34962306a36Sopenharmony_ci} 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_cistatic void iwl5000_set_ct_threshold(struct iwl_priv *priv) 35262306a36Sopenharmony_ci{ 35362306a36Sopenharmony_ci /* want Celsius */ 35462306a36Sopenharmony_ci priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD_LEGACY; 35562306a36Sopenharmony_ci} 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cistatic void iwl5000_hw_set_hw_params(struct iwl_priv *priv) 35862306a36Sopenharmony_ci{ 35962306a36Sopenharmony_ci iwl5000_set_ct_threshold(priv); 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci /* Set initial sensitivity parameters */ 36262306a36Sopenharmony_ci priv->hw_params.sens = &iwl5000_sensitivity; 36362306a36Sopenharmony_ci} 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistatic void iwl5150_hw_set_hw_params(struct iwl_priv *priv) 36662306a36Sopenharmony_ci{ 36762306a36Sopenharmony_ci iwl5150_set_ct_threshold(priv); 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci /* Set initial sensitivity parameters */ 37062306a36Sopenharmony_ci priv->hw_params.sens = &iwl5150_sensitivity; 37162306a36Sopenharmony_ci} 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_cistatic void iwl5150_temperature(struct iwl_priv *priv) 37462306a36Sopenharmony_ci{ 37562306a36Sopenharmony_ci u32 vt = 0; 37662306a36Sopenharmony_ci s32 offset = iwl_temp_calib_to_offset(priv); 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci vt = le32_to_cpu(priv->statistics.common.temperature); 37962306a36Sopenharmony_ci vt = vt / IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF + offset; 38062306a36Sopenharmony_ci /* now vt hold the temperature in Kelvin */ 38162306a36Sopenharmony_ci priv->temperature = kelvin_to_celsius(vt); 38262306a36Sopenharmony_ci iwl_tt_handler(priv); 38362306a36Sopenharmony_ci} 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_cistatic int iwl5000_hw_channel_switch(struct iwl_priv *priv, 38662306a36Sopenharmony_ci struct ieee80211_channel_switch *ch_switch) 38762306a36Sopenharmony_ci{ 38862306a36Sopenharmony_ci /* 38962306a36Sopenharmony_ci * MULTI-FIXME 39062306a36Sopenharmony_ci * See iwlagn_mac_channel_switch. 39162306a36Sopenharmony_ci */ 39262306a36Sopenharmony_ci struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; 39362306a36Sopenharmony_ci struct iwl5000_channel_switch_cmd cmd; 39462306a36Sopenharmony_ci u32 switch_time_in_usec, ucode_switch_time; 39562306a36Sopenharmony_ci u16 ch; 39662306a36Sopenharmony_ci u32 tsf_low; 39762306a36Sopenharmony_ci u8 switch_count; 39862306a36Sopenharmony_ci u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval); 39962306a36Sopenharmony_ci struct ieee80211_vif *vif = ctx->vif; 40062306a36Sopenharmony_ci struct iwl_host_cmd hcmd = { 40162306a36Sopenharmony_ci .id = REPLY_CHANNEL_SWITCH, 40262306a36Sopenharmony_ci .len = { sizeof(cmd), }, 40362306a36Sopenharmony_ci .data = { &cmd, }, 40462306a36Sopenharmony_ci }; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci cmd.band = priv->band == NL80211_BAND_2GHZ; 40762306a36Sopenharmony_ci ch = ch_switch->chandef.chan->hw_value; 40862306a36Sopenharmony_ci IWL_DEBUG_11H(priv, "channel switch from %d to %d\n", 40962306a36Sopenharmony_ci ctx->active.channel, ch); 41062306a36Sopenharmony_ci cmd.channel = cpu_to_le16(ch); 41162306a36Sopenharmony_ci cmd.rxon_flags = ctx->staging.flags; 41262306a36Sopenharmony_ci cmd.rxon_filter_flags = ctx->staging.filter_flags; 41362306a36Sopenharmony_ci switch_count = ch_switch->count; 41462306a36Sopenharmony_ci tsf_low = ch_switch->timestamp & 0x0ffffffff; 41562306a36Sopenharmony_ci /* 41662306a36Sopenharmony_ci * calculate the ucode channel switch time 41762306a36Sopenharmony_ci * adding TSF as one of the factor for when to switch 41862306a36Sopenharmony_ci */ 41962306a36Sopenharmony_ci if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) { 42062306a36Sopenharmony_ci if (switch_count > ((priv->ucode_beacon_time - tsf_low) / 42162306a36Sopenharmony_ci beacon_interval)) { 42262306a36Sopenharmony_ci switch_count -= (priv->ucode_beacon_time - 42362306a36Sopenharmony_ci tsf_low) / beacon_interval; 42462306a36Sopenharmony_ci } else 42562306a36Sopenharmony_ci switch_count = 0; 42662306a36Sopenharmony_ci } 42762306a36Sopenharmony_ci if (switch_count <= 1) 42862306a36Sopenharmony_ci cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time); 42962306a36Sopenharmony_ci else { 43062306a36Sopenharmony_ci switch_time_in_usec = 43162306a36Sopenharmony_ci vif->bss_conf.beacon_int * switch_count * TIME_UNIT; 43262306a36Sopenharmony_ci ucode_switch_time = iwl_usecs_to_beacons(priv, 43362306a36Sopenharmony_ci switch_time_in_usec, 43462306a36Sopenharmony_ci beacon_interval); 43562306a36Sopenharmony_ci cmd.switch_time = iwl_add_beacon_time(priv, 43662306a36Sopenharmony_ci priv->ucode_beacon_time, 43762306a36Sopenharmony_ci ucode_switch_time, 43862306a36Sopenharmony_ci beacon_interval); 43962306a36Sopenharmony_ci } 44062306a36Sopenharmony_ci IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n", 44162306a36Sopenharmony_ci cmd.switch_time); 44262306a36Sopenharmony_ci cmd.expect_beacon = 44362306a36Sopenharmony_ci ch_switch->chandef.chan->flags & IEEE80211_CHAN_RADAR; 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci return iwl_dvm_send_cmd(priv, &hcmd); 44662306a36Sopenharmony_ci} 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ciconst struct iwl_dvm_cfg iwl_dvm_5000_cfg = { 44962306a36Sopenharmony_ci .set_hw_params = iwl5000_hw_set_hw_params, 45062306a36Sopenharmony_ci .set_channel_switch = iwl5000_hw_channel_switch, 45162306a36Sopenharmony_ci .temperature = iwlagn_temperature, 45262306a36Sopenharmony_ci .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF, 45362306a36Sopenharmony_ci .chain_noise_scale = 1000, 45462306a36Sopenharmony_ci .no_idle_support = true, 45562306a36Sopenharmony_ci}; 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ciconst struct iwl_dvm_cfg iwl_dvm_5150_cfg = { 45862306a36Sopenharmony_ci .set_hw_params = iwl5150_hw_set_hw_params, 45962306a36Sopenharmony_ci .set_channel_switch = iwl5000_hw_channel_switch, 46062306a36Sopenharmony_ci .temperature = iwl5150_temperature, 46162306a36Sopenharmony_ci .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF, 46262306a36Sopenharmony_ci .chain_noise_scale = 1000, 46362306a36Sopenharmony_ci .no_idle_support = true, 46462306a36Sopenharmony_ci .no_xtal_calib = true, 46562306a36Sopenharmony_ci}; 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_ci/* 47062306a36Sopenharmony_ci * 6000 series 47162306a36Sopenharmony_ci * =========== 47262306a36Sopenharmony_ci */ 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_cistatic void iwl6000_set_ct_threshold(struct iwl_priv *priv) 47562306a36Sopenharmony_ci{ 47662306a36Sopenharmony_ci /* want Celsius */ 47762306a36Sopenharmony_ci priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD; 47862306a36Sopenharmony_ci priv->hw_params.ct_kill_exit_threshold = CT_KILL_EXIT_THRESHOLD; 47962306a36Sopenharmony_ci} 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci/* NIC configuration for 6000 series */ 48262306a36Sopenharmony_cistatic void iwl6000_nic_config(struct iwl_priv *priv) 48362306a36Sopenharmony_ci{ 48462306a36Sopenharmony_ci switch (priv->trans->trans_cfg->device_family) { 48562306a36Sopenharmony_ci case IWL_DEVICE_FAMILY_6005: 48662306a36Sopenharmony_ci case IWL_DEVICE_FAMILY_6030: 48762306a36Sopenharmony_ci case IWL_DEVICE_FAMILY_6000: 48862306a36Sopenharmony_ci break; 48962306a36Sopenharmony_ci case IWL_DEVICE_FAMILY_6000i: 49062306a36Sopenharmony_ci /* 2x2 IPA phy type */ 49162306a36Sopenharmony_ci iwl_write32(priv->trans, CSR_GP_DRIVER_REG, 49262306a36Sopenharmony_ci CSR_GP_DRIVER_REG_BIT_RADIO_SKU_2x2_IPA); 49362306a36Sopenharmony_ci break; 49462306a36Sopenharmony_ci case IWL_DEVICE_FAMILY_6050: 49562306a36Sopenharmony_ci /* Indicate calibration version to uCode. */ 49662306a36Sopenharmony_ci if (priv->nvm_data->calib_version >= 6) 49762306a36Sopenharmony_ci iwl_set_bit(priv->trans, CSR_GP_DRIVER_REG, 49862306a36Sopenharmony_ci CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6); 49962306a36Sopenharmony_ci break; 50062306a36Sopenharmony_ci case IWL_DEVICE_FAMILY_6150: 50162306a36Sopenharmony_ci /* Indicate calibration version to uCode. */ 50262306a36Sopenharmony_ci if (priv->nvm_data->calib_version >= 6) 50362306a36Sopenharmony_ci iwl_set_bit(priv->trans, CSR_GP_DRIVER_REG, 50462306a36Sopenharmony_ci CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6); 50562306a36Sopenharmony_ci iwl_set_bit(priv->trans, CSR_GP_DRIVER_REG, 50662306a36Sopenharmony_ci CSR_GP_DRIVER_REG_BIT_6050_1x2); 50762306a36Sopenharmony_ci break; 50862306a36Sopenharmony_ci default: 50962306a36Sopenharmony_ci WARN_ON(1); 51062306a36Sopenharmony_ci } 51162306a36Sopenharmony_ci} 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_cistatic const struct iwl_sensitivity_ranges iwl6000_sensitivity = { 51462306a36Sopenharmony_ci .min_nrg_cck = 110, 51562306a36Sopenharmony_ci .auto_corr_min_ofdm = 80, 51662306a36Sopenharmony_ci .auto_corr_min_ofdm_mrc = 128, 51762306a36Sopenharmony_ci .auto_corr_min_ofdm_x1 = 105, 51862306a36Sopenharmony_ci .auto_corr_min_ofdm_mrc_x1 = 192, 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci .auto_corr_max_ofdm = 145, 52162306a36Sopenharmony_ci .auto_corr_max_ofdm_mrc = 232, 52262306a36Sopenharmony_ci .auto_corr_max_ofdm_x1 = 110, 52362306a36Sopenharmony_ci .auto_corr_max_ofdm_mrc_x1 = 232, 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci .auto_corr_min_cck = 125, 52662306a36Sopenharmony_ci .auto_corr_max_cck = 175, 52762306a36Sopenharmony_ci .auto_corr_min_cck_mrc = 160, 52862306a36Sopenharmony_ci .auto_corr_max_cck_mrc = 310, 52962306a36Sopenharmony_ci .nrg_th_cck = 110, 53062306a36Sopenharmony_ci .nrg_th_ofdm = 110, 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_ci .barker_corr_th_min = 190, 53362306a36Sopenharmony_ci .barker_corr_th_min_mrc = 336, 53462306a36Sopenharmony_ci .nrg_th_cca = 62, 53562306a36Sopenharmony_ci}; 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_cistatic void iwl6000_hw_set_hw_params(struct iwl_priv *priv) 53862306a36Sopenharmony_ci{ 53962306a36Sopenharmony_ci iwl6000_set_ct_threshold(priv); 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci /* Set initial sensitivity parameters */ 54262306a36Sopenharmony_ci priv->hw_params.sens = &iwl6000_sensitivity; 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci} 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_cistatic int iwl6000_hw_channel_switch(struct iwl_priv *priv, 54762306a36Sopenharmony_ci struct ieee80211_channel_switch *ch_switch) 54862306a36Sopenharmony_ci{ 54962306a36Sopenharmony_ci /* 55062306a36Sopenharmony_ci * MULTI-FIXME 55162306a36Sopenharmony_ci * See iwlagn_mac_channel_switch. 55262306a36Sopenharmony_ci */ 55362306a36Sopenharmony_ci struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; 55462306a36Sopenharmony_ci struct iwl6000_channel_switch_cmd *cmd; 55562306a36Sopenharmony_ci u32 switch_time_in_usec, ucode_switch_time; 55662306a36Sopenharmony_ci u16 ch; 55762306a36Sopenharmony_ci u32 tsf_low; 55862306a36Sopenharmony_ci u8 switch_count; 55962306a36Sopenharmony_ci u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval); 56062306a36Sopenharmony_ci struct ieee80211_vif *vif = ctx->vif; 56162306a36Sopenharmony_ci struct iwl_host_cmd hcmd = { 56262306a36Sopenharmony_ci .id = REPLY_CHANNEL_SWITCH, 56362306a36Sopenharmony_ci .len = { sizeof(*cmd), }, 56462306a36Sopenharmony_ci .dataflags[0] = IWL_HCMD_DFL_NOCOPY, 56562306a36Sopenharmony_ci }; 56662306a36Sopenharmony_ci int err; 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_ci cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); 56962306a36Sopenharmony_ci if (!cmd) 57062306a36Sopenharmony_ci return -ENOMEM; 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_ci hcmd.data[0] = cmd; 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci cmd->band = priv->band == NL80211_BAND_2GHZ; 57562306a36Sopenharmony_ci ch = ch_switch->chandef.chan->hw_value; 57662306a36Sopenharmony_ci IWL_DEBUG_11H(priv, "channel switch from %u to %u\n", 57762306a36Sopenharmony_ci ctx->active.channel, ch); 57862306a36Sopenharmony_ci cmd->channel = cpu_to_le16(ch); 57962306a36Sopenharmony_ci cmd->rxon_flags = ctx->staging.flags; 58062306a36Sopenharmony_ci cmd->rxon_filter_flags = ctx->staging.filter_flags; 58162306a36Sopenharmony_ci switch_count = ch_switch->count; 58262306a36Sopenharmony_ci tsf_low = ch_switch->timestamp & 0x0ffffffff; 58362306a36Sopenharmony_ci /* 58462306a36Sopenharmony_ci * calculate the ucode channel switch time 58562306a36Sopenharmony_ci * adding TSF as one of the factor for when to switch 58662306a36Sopenharmony_ci */ 58762306a36Sopenharmony_ci if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) { 58862306a36Sopenharmony_ci if (switch_count > ((priv->ucode_beacon_time - tsf_low) / 58962306a36Sopenharmony_ci beacon_interval)) { 59062306a36Sopenharmony_ci switch_count -= (priv->ucode_beacon_time - 59162306a36Sopenharmony_ci tsf_low) / beacon_interval; 59262306a36Sopenharmony_ci } else 59362306a36Sopenharmony_ci switch_count = 0; 59462306a36Sopenharmony_ci } 59562306a36Sopenharmony_ci if (switch_count <= 1) 59662306a36Sopenharmony_ci cmd->switch_time = cpu_to_le32(priv->ucode_beacon_time); 59762306a36Sopenharmony_ci else { 59862306a36Sopenharmony_ci switch_time_in_usec = 59962306a36Sopenharmony_ci vif->bss_conf.beacon_int * switch_count * TIME_UNIT; 60062306a36Sopenharmony_ci ucode_switch_time = iwl_usecs_to_beacons(priv, 60162306a36Sopenharmony_ci switch_time_in_usec, 60262306a36Sopenharmony_ci beacon_interval); 60362306a36Sopenharmony_ci cmd->switch_time = iwl_add_beacon_time(priv, 60462306a36Sopenharmony_ci priv->ucode_beacon_time, 60562306a36Sopenharmony_ci ucode_switch_time, 60662306a36Sopenharmony_ci beacon_interval); 60762306a36Sopenharmony_ci } 60862306a36Sopenharmony_ci IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n", 60962306a36Sopenharmony_ci cmd->switch_time); 61062306a36Sopenharmony_ci cmd->expect_beacon = 61162306a36Sopenharmony_ci ch_switch->chandef.chan->flags & IEEE80211_CHAN_RADAR; 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_ci err = iwl_dvm_send_cmd(priv, &hcmd); 61462306a36Sopenharmony_ci kfree(cmd); 61562306a36Sopenharmony_ci return err; 61662306a36Sopenharmony_ci} 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_ciconst struct iwl_dvm_cfg iwl_dvm_6000_cfg = { 61962306a36Sopenharmony_ci .set_hw_params = iwl6000_hw_set_hw_params, 62062306a36Sopenharmony_ci .set_channel_switch = iwl6000_hw_channel_switch, 62162306a36Sopenharmony_ci .nic_config = iwl6000_nic_config, 62262306a36Sopenharmony_ci .temperature = iwlagn_temperature, 62362306a36Sopenharmony_ci .adv_thermal_throttle = true, 62462306a36Sopenharmony_ci .support_ct_kill_exit = true, 62562306a36Sopenharmony_ci .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, 62662306a36Sopenharmony_ci .chain_noise_scale = 1000, 62762306a36Sopenharmony_ci}; 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_ciconst struct iwl_dvm_cfg iwl_dvm_6005_cfg = { 63062306a36Sopenharmony_ci .set_hw_params = iwl6000_hw_set_hw_params, 63162306a36Sopenharmony_ci .set_channel_switch = iwl6000_hw_channel_switch, 63262306a36Sopenharmony_ci .nic_config = iwl6000_nic_config, 63362306a36Sopenharmony_ci .temperature = iwlagn_temperature, 63462306a36Sopenharmony_ci .adv_thermal_throttle = true, 63562306a36Sopenharmony_ci .support_ct_kill_exit = true, 63662306a36Sopenharmony_ci .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, 63762306a36Sopenharmony_ci .chain_noise_scale = 1000, 63862306a36Sopenharmony_ci .need_temp_offset_calib = true, 63962306a36Sopenharmony_ci}; 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_ciconst struct iwl_dvm_cfg iwl_dvm_6050_cfg = { 64262306a36Sopenharmony_ci .set_hw_params = iwl6000_hw_set_hw_params, 64362306a36Sopenharmony_ci .set_channel_switch = iwl6000_hw_channel_switch, 64462306a36Sopenharmony_ci .nic_config = iwl6000_nic_config, 64562306a36Sopenharmony_ci .temperature = iwlagn_temperature, 64662306a36Sopenharmony_ci .adv_thermal_throttle = true, 64762306a36Sopenharmony_ci .support_ct_kill_exit = true, 64862306a36Sopenharmony_ci .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, 64962306a36Sopenharmony_ci .chain_noise_scale = 1500, 65062306a36Sopenharmony_ci}; 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_cistatic const struct iwl_dvm_bt_params iwl6000_bt_params = { 65362306a36Sopenharmony_ci /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ 65462306a36Sopenharmony_ci .advanced_bt_coexist = true, 65562306a36Sopenharmony_ci .agg_time_limit = BT_AGG_THRESHOLD_DEF, 65662306a36Sopenharmony_ci .bt_init_traffic_load = IWL_BT_COEX_TRAFFIC_LOAD_NONE, 65762306a36Sopenharmony_ci .bt_prio_boost = IWLAGN_BT_PRIO_BOOST_DEFAULT, 65862306a36Sopenharmony_ci .bt_sco_disable = true, 65962306a36Sopenharmony_ci}; 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_ciconst struct iwl_dvm_cfg iwl_dvm_6030_cfg = { 66262306a36Sopenharmony_ci .set_hw_params = iwl6000_hw_set_hw_params, 66362306a36Sopenharmony_ci .set_channel_switch = iwl6000_hw_channel_switch, 66462306a36Sopenharmony_ci .nic_config = iwl6000_nic_config, 66562306a36Sopenharmony_ci .temperature = iwlagn_temperature, 66662306a36Sopenharmony_ci .adv_thermal_throttle = true, 66762306a36Sopenharmony_ci .support_ct_kill_exit = true, 66862306a36Sopenharmony_ci .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, 66962306a36Sopenharmony_ci .chain_noise_scale = 1000, 67062306a36Sopenharmony_ci .bt_params = &iwl6000_bt_params, 67162306a36Sopenharmony_ci .need_temp_offset_calib = true, 67262306a36Sopenharmony_ci .adv_pm = true, 67362306a36Sopenharmony_ci}; 674