diff options
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | 27 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-commands.h | 10 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 1 |
5 files changed, 50 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index a45929ef22ec..4810258aefd9 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c | |||
@@ -204,6 +204,8 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv) | |||
204 | BIT(IWL_CALIB_BASE_BAND); | 204 | BIT(IWL_CALIB_BASE_BAND); |
205 | if (priv->cfg->need_dc_calib) | 205 | if (priv->cfg->need_dc_calib) |
206 | priv->hw_params.calib_rt_cfg |= BIT(IWL_CALIB_CFG_DC_IDX); | 206 | priv->hw_params.calib_rt_cfg |= BIT(IWL_CALIB_CFG_DC_IDX); |
207 | if (priv->cfg->need_temp_offset_calib) | ||
208 | priv->hw_params.calib_init_cfg |= BIT(IWL_CALIB_TEMP_OFFSET); | ||
207 | 209 | ||
208 | priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS; | 210 | priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS; |
209 | 211 | ||
@@ -536,6 +538,7 @@ struct iwl_cfg iwl6000g2a_2agn_cfg = { | |||
536 | .base_params = &iwl6000_base_params, | 538 | .base_params = &iwl6000_base_params, |
537 | .ht_params = &iwl6000_ht_params, | 539 | .ht_params = &iwl6000_ht_params, |
538 | .need_dc_calib = true, | 540 | .need_dc_calib = true, |
541 | .need_temp_offset_calib = true, | ||
539 | }; | 542 | }; |
540 | 543 | ||
541 | struct iwl_cfg iwl6000g2a_2abg_cfg = { | 544 | struct iwl_cfg iwl6000g2a_2abg_cfg = { |
@@ -552,6 +555,7 @@ struct iwl_cfg iwl6000g2a_2abg_cfg = { | |||
552 | .mod_params = &iwlagn_mod_params, | 555 | .mod_params = &iwlagn_mod_params, |
553 | .base_params = &iwl6000_base_params, | 556 | .base_params = &iwl6000_base_params, |
554 | .need_dc_calib = true, | 557 | .need_dc_calib = true, |
558 | .need_temp_offset_calib = true, | ||
555 | }; | 559 | }; |
556 | 560 | ||
557 | struct iwl_cfg iwl6000g2a_2bg_cfg = { | 561 | struct iwl_cfg iwl6000g2a_2bg_cfg = { |
@@ -568,6 +572,7 @@ struct iwl_cfg iwl6000g2a_2bg_cfg = { | |||
568 | .mod_params = &iwlagn_mod_params, | 572 | .mod_params = &iwlagn_mod_params, |
569 | .base_params = &iwl6000_base_params, | 573 | .base_params = &iwl6000_base_params, |
570 | .need_dc_calib = true, | 574 | .need_dc_calib = true, |
575 | .need_temp_offset_calib = true, | ||
571 | }; | 576 | }; |
572 | 577 | ||
573 | struct iwl_cfg iwl6000g2b_2agn_cfg = { | 578 | struct iwl_cfg iwl6000g2b_2agn_cfg = { |
@@ -586,6 +591,7 @@ struct iwl_cfg iwl6000g2b_2agn_cfg = { | |||
586 | .bt_params = &iwl6000_bt_params, | 591 | .bt_params = &iwl6000_bt_params, |
587 | .ht_params = &iwl6000_ht_params, | 592 | .ht_params = &iwl6000_ht_params, |
588 | .need_dc_calib = true, | 593 | .need_dc_calib = true, |
594 | .need_temp_offset_calib = true, | ||
589 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ | 595 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ |
590 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, | 596 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, |
591 | }; | 597 | }; |
@@ -605,6 +611,7 @@ struct iwl_cfg iwl6000g2b_2abg_cfg = { | |||
605 | .base_params = &iwl6000_base_params, | 611 | .base_params = &iwl6000_base_params, |
606 | .bt_params = &iwl6000_bt_params, | 612 | .bt_params = &iwl6000_bt_params, |
607 | .need_dc_calib = true, | 613 | .need_dc_calib = true, |
614 | .need_temp_offset_calib = true, | ||
608 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ | 615 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ |
609 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, | 616 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, |
610 | }; | 617 | }; |
@@ -625,6 +632,7 @@ struct iwl_cfg iwl6000g2b_2bgn_cfg = { | |||
625 | .bt_params = &iwl6000_bt_params, | 632 | .bt_params = &iwl6000_bt_params, |
626 | .ht_params = &iwl6000_ht_params, | 633 | .ht_params = &iwl6000_ht_params, |
627 | .need_dc_calib = true, | 634 | .need_dc_calib = true, |
635 | .need_temp_offset_calib = true, | ||
628 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ | 636 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ |
629 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, | 637 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, |
630 | }; | 638 | }; |
@@ -644,6 +652,7 @@ struct iwl_cfg iwl6000g2b_2bg_cfg = { | |||
644 | .base_params = &iwl6000_base_params, | 652 | .base_params = &iwl6000_base_params, |
645 | .bt_params = &iwl6000_bt_params, | 653 | .bt_params = &iwl6000_bt_params, |
646 | .need_dc_calib = true, | 654 | .need_dc_calib = true, |
655 | .need_temp_offset_calib = true, | ||
647 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ | 656 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ |
648 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, | 657 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, |
649 | }; | 658 | }; |
@@ -664,6 +673,7 @@ struct iwl_cfg iwl6000g2b_bgn_cfg = { | |||
664 | .bt_params = &iwl6000_bt_params, | 673 | .bt_params = &iwl6000_bt_params, |
665 | .ht_params = &iwl6000_ht_params, | 674 | .ht_params = &iwl6000_ht_params, |
666 | .need_dc_calib = true, | 675 | .need_dc_calib = true, |
676 | .need_temp_offset_calib = true, | ||
667 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ | 677 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ |
668 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, | 678 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, |
669 | }; | 679 | }; |
@@ -683,6 +693,7 @@ struct iwl_cfg iwl6000g2b_bg_cfg = { | |||
683 | .base_params = &iwl6000_base_params, | 693 | .base_params = &iwl6000_base_params, |
684 | .bt_params = &iwl6000_bt_params, | 694 | .bt_params = &iwl6000_bt_params, |
685 | .need_dc_calib = true, | 695 | .need_dc_calib = true, |
696 | .need_temp_offset_calib = true, | ||
686 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ | 697 | /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */ |
687 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, | 698 | .scan_tx_antennas[IEEE80211_BAND_2GHZ] = ANT_A, |
688 | }; | 699 | }; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c index 3a9537953875..703621107dac 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | |||
@@ -215,6 +215,25 @@ static int iwlagn_set_Xtal_calib(struct iwl_priv *priv) | |||
215 | (u8 *)&cmd, sizeof(cmd)); | 215 | (u8 *)&cmd, sizeof(cmd)); |
216 | } | 216 | } |
217 | 217 | ||
218 | static int iwlagn_set_temperature_offset_calib(struct iwl_priv *priv) | ||
219 | { | ||
220 | struct iwl_calib_temperature_offset_cmd cmd; | ||
221 | __le16 *offset_calib = | ||
222 | (__le16 *)iwl_eeprom_query_addr(priv, EEPROM_5000_TEMPERATURE); | ||
223 | cmd.hdr.op_code = IWL_PHY_CALIBRATE_TEMP_OFFSET_CMD; | ||
224 | cmd.hdr.first_group = 0; | ||
225 | cmd.hdr.groups_num = 1; | ||
226 | cmd.hdr.data_valid = 1; | ||
227 | cmd.radio_sensor_offset = le16_to_cpu(offset_calib[1]); | ||
228 | if (!(cmd.radio_sensor_offset)) | ||
229 | cmd.radio_sensor_offset = DEFAULT_RADIO_SENSOR_OFFSET; | ||
230 | cmd.reserved = 0; | ||
231 | IWL_DEBUG_CALIB(priv, "Radio sensor offset: %d\n", | ||
232 | cmd.radio_sensor_offset); | ||
233 | return iwl_calib_set(&priv->calib_results[IWL_CALIB_TEMP_OFFSET], | ||
234 | (u8 *)&cmd, sizeof(cmd)); | ||
235 | } | ||
236 | |||
218 | static int iwlagn_send_calib_cfg(struct iwl_priv *priv) | 237 | static int iwlagn_send_calib_cfg(struct iwl_priv *priv) |
219 | { | 238 | { |
220 | struct iwl_calib_cfg_cmd calib_cfg_cmd; | 239 | struct iwl_calib_cfg_cmd calib_cfg_cmd; |
@@ -321,6 +340,14 @@ void iwlagn_init_alive_start(struct iwl_priv *priv) | |||
321 | 340 | ||
322 | } | 341 | } |
323 | iwlagn_send_calib_cfg(priv); | 342 | iwlagn_send_calib_cfg(priv); |
343 | |||
344 | /** | ||
345 | * temperature offset calibration is only needed for runtime ucode, | ||
346 | * so prepare the value now. | ||
347 | */ | ||
348 | if (priv->cfg->need_temp_offset_calib) | ||
349 | iwlagn_set_temperature_offset_calib(priv); | ||
350 | |||
324 | return; | 351 | return; |
325 | 352 | ||
326 | restart: | 353 | restart: |
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index 74b78d858936..424801abc80e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
@@ -3794,7 +3794,8 @@ enum { | |||
3794 | IWL_PHY_CALIBRATE_CRYSTAL_FRQ_CMD = 15, | 3794 | IWL_PHY_CALIBRATE_CRYSTAL_FRQ_CMD = 15, |
3795 | IWL_PHY_CALIBRATE_BASE_BAND_CMD = 16, | 3795 | IWL_PHY_CALIBRATE_BASE_BAND_CMD = 16, |
3796 | IWL_PHY_CALIBRATE_TX_IQ_PERD_CMD = 17, | 3796 | IWL_PHY_CALIBRATE_TX_IQ_PERD_CMD = 17, |
3797 | IWL_MAX_STANDARD_PHY_CALIBRATE_TBL_SIZE = 18, | 3797 | IWL_PHY_CALIBRATE_TEMP_OFFSET_CMD = 18, |
3798 | IWL_MAX_STANDARD_PHY_CALIBRATE_TBL_SIZE = 19, | ||
3798 | }; | 3799 | }; |
3799 | 3800 | ||
3800 | #define IWL_MAX_PHY_CALIBRATE_TBL_SIZE (253) | 3801 | #define IWL_MAX_PHY_CALIBRATE_TBL_SIZE (253) |
@@ -3864,6 +3865,13 @@ struct iwl_calib_xtal_freq_cmd { | |||
3864 | u8 pad[2]; | 3865 | u8 pad[2]; |
3865 | } __packed; | 3866 | } __packed; |
3866 | 3867 | ||
3868 | #define DEFAULT_RADIO_SENSOR_OFFSET 2700 | ||
3869 | struct iwl_calib_temperature_offset_cmd { | ||
3870 | struct iwl_calib_hdr hdr; | ||
3871 | s16 radio_sensor_offset; | ||
3872 | s16 reserved; | ||
3873 | } __packed; | ||
3874 | |||
3867 | /* IWL_PHY_CALIBRATE_CHAIN_NOISE_RESET_CMD */ | 3875 | /* IWL_PHY_CALIBRATE_CHAIN_NOISE_RESET_CMD */ |
3868 | struct iwl_calib_chain_noise_reset_cmd { | 3876 | struct iwl_calib_chain_noise_reset_cmd { |
3869 | struct iwl_calib_hdr hdr; | 3877 | struct iwl_calib_hdr hdr; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index a5e12b70c594..64527def059f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
@@ -342,6 +342,7 @@ struct iwl_ht_params { | |||
342 | * @ucode_api_min: Lowest version of uCode API supported by driver. | 342 | * @ucode_api_min: Lowest version of uCode API supported by driver. |
343 | * @pa_type: used by 6000 series only to identify the type of Power Amplifier | 343 | * @pa_type: used by 6000 series only to identify the type of Power Amplifier |
344 | * @need_dc_calib: need to perform init dc calibration | 344 | * @need_dc_calib: need to perform init dc calibration |
345 | * @need_temp_offset_calib: need to perform temperature offset calibration | ||
345 | * @scan_antennas: available antenna for scan operation | 346 | * @scan_antennas: available antenna for scan operation |
346 | * | 347 | * |
347 | * We enable the driver to be backward compatible wrt API version. The | 348 | * We enable the driver to be backward compatible wrt API version. The |
@@ -386,6 +387,7 @@ struct iwl_cfg { | |||
386 | struct iwl_bt_params *bt_params; | 387 | struct iwl_bt_params *bt_params; |
387 | enum iwl_pa_type pa_type; /* if used set to IWL_PA_SYSTEM */ | 388 | enum iwl_pa_type pa_type; /* if used set to IWL_PA_SYSTEM */ |
388 | const bool need_dc_calib; /* if used set to true */ | 389 | const bool need_dc_calib; /* if used set to true */ |
390 | const bool need_temp_offset_calib; /* if used set to true */ | ||
389 | u8 scan_rx_antennas[IEEE80211_NUM_BANDS]; | 391 | u8 scan_rx_antennas[IEEE80211_NUM_BANDS]; |
390 | u8 scan_tx_antennas[IEEE80211_NUM_BANDS]; | 392 | u8 scan_tx_antennas[IEEE80211_NUM_BANDS]; |
391 | }; | 393 | }; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 2c57dbd2de19..de43e1350ed1 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -835,6 +835,7 @@ enum iwl_calib { | |||
835 | IWL_CALIB_TX_IQ, | 835 | IWL_CALIB_TX_IQ, |
836 | IWL_CALIB_TX_IQ_PERD, | 836 | IWL_CALIB_TX_IQ_PERD, |
837 | IWL_CALIB_BASE_BAND, | 837 | IWL_CALIB_BASE_BAND, |
838 | IWL_CALIB_TEMP_OFFSET, | ||
838 | IWL_CALIB_MAX | 839 | IWL_CALIB_MAX |
839 | }; | 840 | }; |
840 | 841 | ||