diff options
author | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2010-01-22 17:22:51 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-01-25 16:36:23 -0500 |
commit | 06702a735eacf8679e9ff0d49eb3c989bc6b96ce (patch) | |
tree | ca4fe8620d8b3af01d673899ddbd038133411a19 /drivers/net/wireless/iwlwifi | |
parent | dab1c161fed18eb6b3472bdbfd827264caae097f (diff) |
iwlwifi: module parameter to enable/disable bt co-exist
Adding "bt_coex_active" module parameter for iwlcore to enable/disable
BT coexist; if bt_coex_active is true (default), uCode will do kill/defer
every time the priority line is asserted (BT is sending signals on the
priority line in the PCIx). By disable the bt_coex_active, uCode will
ignore the BT activity and perform the normal operation.
Users might experience transmit issue on some platform due to this
WiFi/BT co-exist problem. The possible symptoms are: NetworkManager and
other similar programs can scan and find all the available APs, but will
timeout and unable to associate with any of the APs; no out-going frames
can be found with wireless sniffer tools.
On those platforms, WiFi communication can be restored by set "bt_coex_active"
module parameter to "false"
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-commands.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 29 |
2 files changed, 31 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index ce538946f3ff..c2f31eb26bef 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
@@ -2261,6 +2261,9 @@ struct iwl_link_quality_cmd { | |||
2261 | #define BT_ENABLE_PRIORITY BIT(1) | 2261 | #define BT_ENABLE_PRIORITY BIT(1) |
2262 | #define BT_ENABLE_2_WIRE BIT(2) | 2262 | #define BT_ENABLE_2_WIRE BIT(2) |
2263 | 2263 | ||
2264 | #define BT_COEX_DISABLE (0x0) | ||
2265 | #define BT_COEX_ENABLE (BT_ENABLE_CHANNEL_ANNOUNCE | BT_ENABLE_PRIORITY) | ||
2266 | |||
2264 | #define BT_LEAD_TIME_MIN (0x0) | 2267 | #define BT_LEAD_TIME_MIN (0x0) |
2265 | #define BT_LEAD_TIME_DEF (0x1E) | 2268 | #define BT_LEAD_TIME_DEF (0x1E) |
2266 | #define BT_LEAD_TIME_MAX (0xFF) | 2269 | #define BT_LEAD_TIME_MAX (0xFF) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index d625aa8fe7a2..1cfabd6be0b8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -47,6 +47,26 @@ MODULE_VERSION(IWLWIFI_VERSION); | |||
47 | MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR); | 47 | MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR); |
48 | MODULE_LICENSE("GPL"); | 48 | MODULE_LICENSE("GPL"); |
49 | 49 | ||
50 | /* | ||
51 | * set bt_coex_active to true, uCode will do kill/defer | ||
52 | * every time the priority line is asserted (BT is sending signals on the | ||
53 | * priority line in the PCIx). | ||
54 | * set bt_coex_active to false, uCode will ignore the BT activity and | ||
55 | * perform the normal operation | ||
56 | * | ||
57 | * User might experience transmit issue on some platform due to WiFi/BT | ||
58 | * co-exist problem. The possible behaviors are: | ||
59 | * Able to scan and finding all the available AP | ||
60 | * Not able to associate with any AP | ||
61 | * On those platforms, WiFi communication can be restored by set | ||
62 | * "bt_coex_active" module parameter to "false" | ||
63 | * | ||
64 | * default: bt_coex_active = true (BT_COEX_ENABLE) | ||
65 | */ | ||
66 | static bool bt_coex_active = true; | ||
67 | module_param(bt_coex_active, bool, S_IRUGO); | ||
68 | MODULE_PARM_DESC(bt_coex_active, "enable wifi/bluetooth co-exist\n"); | ||
69 | |||
50 | static struct iwl_wimax_coex_event_entry cu_priorities[COEX_NUM_OF_EVENTS] = { | 70 | static struct iwl_wimax_coex_event_entry cu_priorities[COEX_NUM_OF_EVENTS] = { |
51 | {COEX_CU_UNASSOC_IDLE_RP, COEX_CU_UNASSOC_IDLE_WP, | 71 | {COEX_CU_UNASSOC_IDLE_RP, COEX_CU_UNASSOC_IDLE_WP, |
52 | 0, COEX_UNASSOC_IDLE_FLAGS}, | 72 | 0, COEX_UNASSOC_IDLE_FLAGS}, |
@@ -1977,13 +1997,20 @@ EXPORT_SYMBOL(iwl_isr_legacy); | |||
1977 | int iwl_send_bt_config(struct iwl_priv *priv) | 1997 | int iwl_send_bt_config(struct iwl_priv *priv) |
1978 | { | 1998 | { |
1979 | struct iwl_bt_cmd bt_cmd = { | 1999 | struct iwl_bt_cmd bt_cmd = { |
1980 | .flags = BT_ENABLE_CHANNEL_ANNOUNCE | BT_ENABLE_PRIORITY, | ||
1981 | .lead_time = BT_LEAD_TIME_DEF, | 2000 | .lead_time = BT_LEAD_TIME_DEF, |
1982 | .max_kill = BT_MAX_KILL_DEF, | 2001 | .max_kill = BT_MAX_KILL_DEF, |
1983 | .kill_ack_mask = 0, | 2002 | .kill_ack_mask = 0, |
1984 | .kill_cts_mask = 0, | 2003 | .kill_cts_mask = 0, |
1985 | }; | 2004 | }; |
1986 | 2005 | ||
2006 | if (!bt_coex_active) | ||
2007 | bt_cmd.flags = BT_COEX_DISABLE; | ||
2008 | else | ||
2009 | bt_cmd.flags = BT_COEX_ENABLE; | ||
2010 | |||
2011 | IWL_DEBUG_INFO(priv, "BT coex %s\n", | ||
2012 | (bt_cmd.flags == BT_COEX_DISABLE) ? "disable" : "active"); | ||
2013 | |||
1987 | return iwl_send_cmd_pdu(priv, REPLY_BT_CONFIG, | 2014 | return iwl_send_cmd_pdu(priv, REPLY_BT_CONFIG, |
1988 | sizeof(struct iwl_bt_cmd), &bt_cmd); | 2015 | sizeof(struct iwl_bt_cmd), &bt_cmd); |
1989 | } | 2016 | } |