aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorWey-Yi Guy <wey-yi.w.guy@intel.com>2010-12-07 11:06:31 -0500
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2010-12-13 18:53:24 -0500
commit50619ac9ba48f5ab0c6bcfa10f5d50e4115cdca8 (patch)
treeef9b7a7d4af9ac4c6f9faef0d6082e8338b257a3 /drivers/net
parent33c68770a8605d84aea35c2cd90009edfc4b161a (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')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c3
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-6000.c3
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c16
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-prph.h2
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
598struct iwl_cfg iwl5150_agn_cfg = { 599struct 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
613struct iwl_cfg iwl5150_abg_cfg = { 615struct 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
627MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX)); 630MODULE_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
787struct iwl_cfg iwl6150_bgn_cfg = { 788struct 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
802struct iwl_cfg iwl6050_2abg_cfg = { 804struct 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
816struct iwl_cfg iwl6000_3agn_cfg = { 819struct 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)