diff options
author | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2010-12-07 11:06:31 -0500 |
---|---|---|
committer | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2010-12-13 18:53:24 -0500 |
commit | 50619ac9ba48f5ab0c6bcfa10f5d50e4115cdca8 (patch) | |
tree | ef9b7a7d4af9ac4c6f9faef0d6082e8338b257a3 /drivers/net/wireless/iwlwifi | |
parent | 33c68770a8605d84aea35c2cd90009edfc4b161a (diff) |
iwlwifi: do not reload fw if WiMAX own the RF
For WiFi/WiMAX combo devices, if WiMAX own the RF, WiFi driver
try to access RF and fail. This is the W/A to To avoid WiFi keep
reloading firmware and try to access RF again.
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-prph.h | 2 |
5 files changed, 25 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index 8435e5a4e69d..34af9e0cfa43 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -593,6 +593,7 @@ struct iwl_cfg iwl5350_agn_cfg = { | |||
593 | .base_params = &iwl5000_base_params, | 593 | .base_params = &iwl5000_base_params, |
594 | .ht_params = &iwl5000_ht_params, | 594 | .ht_params = &iwl5000_ht_params, |
595 | .led_mode = IWL_LED_BLINK, | 595 | .led_mode = IWL_LED_BLINK, |
596 | .internal_wimax_coex = true, | ||
596 | }; | 597 | }; |
597 | 598 | ||
598 | struct iwl_cfg iwl5150_agn_cfg = { | 599 | struct iwl_cfg iwl5150_agn_cfg = { |
@@ -608,6 +609,7 @@ struct iwl_cfg iwl5150_agn_cfg = { | |||
608 | .ht_params = &iwl5000_ht_params, | 609 | .ht_params = &iwl5000_ht_params, |
609 | .need_dc_calib = true, | 610 | .need_dc_calib = true, |
610 | .led_mode = IWL_LED_BLINK, | 611 | .led_mode = IWL_LED_BLINK, |
612 | .internal_wimax_coex = true, | ||
611 | }; | 613 | }; |
612 | 614 | ||
613 | struct iwl_cfg iwl5150_abg_cfg = { | 615 | struct iwl_cfg iwl5150_abg_cfg = { |
@@ -622,6 +624,7 @@ struct iwl_cfg iwl5150_abg_cfg = { | |||
622 | .base_params = &iwl5000_base_params, | 624 | .base_params = &iwl5000_base_params, |
623 | .need_dc_calib = true, | 625 | .need_dc_calib = true, |
624 | .led_mode = IWL_LED_BLINK, | 626 | .led_mode = IWL_LED_BLINK, |
627 | .internal_wimax_coex = true, | ||
625 | }; | 628 | }; |
626 | 629 | ||
627 | MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX)); | 630 | MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX)); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index 8a789241704f..fe5f6d0a6539 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c | |||
@@ -782,6 +782,7 @@ struct iwl_cfg iwl6050_2agn_cfg = { | |||
782 | .ht_params = &iwl6000_ht_params, | 782 | .ht_params = &iwl6000_ht_params, |
783 | .need_dc_calib = true, | 783 | .need_dc_calib = true, |
784 | .led_mode = IWL_LED_BLINK, | 784 | .led_mode = IWL_LED_BLINK, |
785 | .internal_wimax_coex = true, | ||
785 | }; | 786 | }; |
786 | 787 | ||
787 | struct iwl_cfg iwl6150_bgn_cfg = { | 788 | struct iwl_cfg iwl6150_bgn_cfg = { |
@@ -797,6 +798,7 @@ struct iwl_cfg iwl6150_bgn_cfg = { | |||
797 | .ht_params = &iwl6000_ht_params, | 798 | .ht_params = &iwl6000_ht_params, |
798 | .need_dc_calib = true, | 799 | .need_dc_calib = true, |
799 | .led_mode = IWL_LED_RF_STATE, | 800 | .led_mode = IWL_LED_RF_STATE, |
801 | .internal_wimax_coex = true, | ||
800 | }; | 802 | }; |
801 | 803 | ||
802 | struct iwl_cfg iwl6050_2abg_cfg = { | 804 | struct iwl_cfg iwl6050_2abg_cfg = { |
@@ -811,6 +813,7 @@ struct iwl_cfg iwl6050_2abg_cfg = { | |||
811 | .base_params = &iwl6050_base_params, | 813 | .base_params = &iwl6050_base_params, |
812 | .need_dc_calib = true, | 814 | .need_dc_calib = true, |
813 | .led_mode = IWL_LED_BLINK, | 815 | .led_mode = IWL_LED_BLINK, |
816 | .internal_wimax_coex = true, | ||
814 | }; | 817 | }; |
815 | 818 | ||
816 | struct iwl_cfg iwl6000_3agn_cfg = { | 819 | struct iwl_cfg iwl6000_3agn_cfg = { |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index d62b92518417..06cdc60ff87f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -957,6 +957,22 @@ void iwl_irq_handle_error(struct iwl_priv *priv) | |||
957 | /* Cancel currently queued command. */ | 957 | /* Cancel currently queued command. */ |
958 | clear_bit(STATUS_HCMD_ACTIVE, &priv->status); | 958 | clear_bit(STATUS_HCMD_ACTIVE, &priv->status); |
959 | 959 | ||
960 | /* W/A for WiFi/WiMAX coex and WiMAX own the RF */ | ||
961 | if (priv->cfg->internal_wimax_coex && | ||
962 | (!(iwl_read_prph(priv, APMG_CLK_CTRL_REG) & | ||
963 | APMS_CLK_VAL_MRB_FUNC_MODE) || | ||
964 | (iwl_read_prph(priv, APMG_PS_CTRL_REG) & | ||
965 | APMG_PS_CTRL_VAL_RESET_REQ))) { | ||
966 | wake_up_interruptible(&priv->wait_command_queue); | ||
967 | /* | ||
968 | *Keep the restart process from trying to send host | ||
969 | * commands by clearing the INIT status bit | ||
970 | */ | ||
971 | clear_bit(STATUS_READY, &priv->status); | ||
972 | IWL_ERR(priv, "RF is used by WiMAX\n"); | ||
973 | return; | ||
974 | } | ||
975 | |||
960 | IWL_ERR(priv, "Loaded firmware version: %s\n", | 976 | IWL_ERR(priv, "Loaded firmware version: %s\n", |
961 | priv->hw->wiphy->fw_version); | 977 | priv->hw->wiphy->fw_version); |
962 | 978 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index d0b86f5e28c2..f80685ad2674 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
@@ -365,6 +365,7 @@ struct iwl_ht_params { | |||
365 | * @led_mode: 0=blinking, 1=On(RF On)/Off(RF Off) | 365 | * @led_mode: 0=blinking, 1=On(RF On)/Off(RF Off) |
366 | * @adv_pm: advance power management | 366 | * @adv_pm: advance power management |
367 | * @rx_with_siso_diversity: 1x1 device with rx antenna diversity | 367 | * @rx_with_siso_diversity: 1x1 device with rx antenna diversity |
368 | * @internal_wimax_coex: internal wifi/wimax combo device | ||
368 | * | 369 | * |
369 | * We enable the driver to be backward compatible wrt API version. The | 370 | * We enable the driver to be backward compatible wrt API version. The |
370 | * driver specifies which APIs it supports (with @ucode_api_max being the | 371 | * driver specifies which APIs it supports (with @ucode_api_max being the |
@@ -414,6 +415,7 @@ struct iwl_cfg { | |||
414 | enum iwl_led_mode led_mode; | 415 | enum iwl_led_mode led_mode; |
415 | const bool adv_pm; | 416 | const bool adv_pm; |
416 | const bool rx_with_siso_diversity; | 417 | const bool rx_with_siso_diversity; |
418 | const bool internal_wimax_coex; | ||
417 | }; | 419 | }; |
418 | 420 | ||
419 | /*************************** | 421 | /*************************** |
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h index 5469655646ae..86f5123bccda 100644 --- a/drivers/net/wireless/iwlwifi/iwl-prph.h +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h | |||
@@ -83,10 +83,10 @@ | |||
83 | #define APMG_DIGITAL_SVR_REG (APMG_BASE + 0x0058) | 83 | #define APMG_DIGITAL_SVR_REG (APMG_BASE + 0x0058) |
84 | #define APMG_ANALOG_SVR_REG (APMG_BASE + 0x006C) | 84 | #define APMG_ANALOG_SVR_REG (APMG_BASE + 0x006C) |
85 | 85 | ||
86 | #define APMS_CLK_VAL_MRB_FUNC_MODE (0x00000001) | ||
86 | #define APMG_CLK_VAL_DMA_CLK_RQT (0x00000200) | 87 | #define APMG_CLK_VAL_DMA_CLK_RQT (0x00000200) |
87 | #define APMG_CLK_VAL_BSM_CLK_RQT (0x00000800) | 88 | #define APMG_CLK_VAL_BSM_CLK_RQT (0x00000800) |
88 | 89 | ||
89 | |||
90 | #define APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS (0x00400000) | 90 | #define APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS (0x00400000) |
91 | #define APMG_PS_CTRL_VAL_RESET_REQ (0x04000000) | 91 | #define APMG_PS_CTRL_VAL_RESET_REQ (0x04000000) |
92 | #define APMG_PS_CTRL_MSK_PWR_SRC (0x03000000) | 92 | #define APMG_PS_CTRL_MSK_PWR_SRC (0x03000000) |