aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-6000.c5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-ucode.c59
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-commands.h59
4 files changed, 109 insertions, 20 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index a4601b58a5db..101630b80c40 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -235,11 +235,10 @@ static void iwl6000g2b_send_bt_config(struct iwl_priv *priv)
235 /* 235 /*
236 * Configure BT coex mode to "no coexistence" when the 236 * Configure BT coex mode to "no coexistence" when the
237 * user disabled BT coexistence, we have no interface 237 * user disabled BT coexistence, we have no interface
238 * (might be in monitor mode), or the interface is in 238 * user disabled BT coexistence, or the interface is in
239 * IBSS mode (no proper uCode support for coex then). 239 * IBSS mode (no proper uCode support for coex then).
240 */ 240 */
241 if (!bt_coex_active || !priv->vif || 241 if (!bt_coex_active || priv->iw_mode == NL80211_IFTYPE_ADHOC) {
242 priv->iw_mode == NL80211_IFTYPE_ADHOC) {
243 bt_cmd.flags = 0; 242 bt_cmd.flags = 0;
244 } else { 243 } else {
245 bt_cmd.flags = IWL6000G2B_BT_FLAG_CHANNEL_INHIBITION | 244 bt_cmd.flags = IWL6000G2B_BT_FLAG_CHANNEL_INHIBITION |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c
index 6f77441cb65a..2dc569bc7e8f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c
@@ -329,6 +329,51 @@ static int iwlagn_send_wimax_coex(struct iwl_priv *priv)
329 sizeof(coex_cmd), &coex_cmd); 329 sizeof(coex_cmd), &coex_cmd);
330} 330}
331 331
332static const u8 iwlagn_bt_prio_tbl[BT_COEX_PRIO_TBL_EVT_MAX] = {
333 ((BT_COEX_PRIO_TBL_PRIO_BYPASS << IWL_BT_COEX_PRIO_TBL_PRIO_POS) |
334 (0 << IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_POS)),
335 ((BT_COEX_PRIO_TBL_PRIO_BYPASS << IWL_BT_COEX_PRIO_TBL_PRIO_POS) |
336 (1 << IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_POS)),
337 ((BT_COEX_PRIO_TBL_PRIO_LOW << IWL_BT_COEX_PRIO_TBL_PRIO_POS) |
338 (0 << IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_POS)),
339 ((BT_COEX_PRIO_TBL_PRIO_LOW << IWL_BT_COEX_PRIO_TBL_PRIO_POS) |
340 (1 << IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_POS)),
341 ((BT_COEX_PRIO_TBL_PRIO_HIGH << IWL_BT_COEX_PRIO_TBL_PRIO_POS) |
342 (0 << IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_POS)),
343 ((BT_COEX_PRIO_TBL_PRIO_HIGH << IWL_BT_COEX_PRIO_TBL_PRIO_POS) |
344 (1 << IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_POS)),
345 ((BT_COEX_PRIO_TBL_PRIO_BYPASS << IWL_BT_COEX_PRIO_TBL_PRIO_POS) |
346 (0 << IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_POS)),
347 ((BT_COEX_PRIO_TBL_PRIO_COEX_OFF << IWL_BT_COEX_PRIO_TBL_PRIO_POS) |
348 (0 << IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_POS)),
349 ((BT_COEX_PRIO_TBL_PRIO_COEX_ON << IWL_BT_COEX_PRIO_TBL_PRIO_POS) |
350 (0 << IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_POS)),
351 0, 0, 0, 0, 0, 0, 0
352};
353
354static void iwlagn_send_prio_tbl(struct iwl_priv *priv)
355{
356 struct iwl_bt_coex_prio_table_cmd prio_tbl_cmd;
357
358 memcpy(prio_tbl_cmd.prio_tbl, iwlagn_bt_prio_tbl,
359 sizeof(iwlagn_bt_prio_tbl));
360 if (iwl_send_cmd_pdu(priv, REPLY_BT_COEX_PRIO_TABLE,
361 sizeof(prio_tbl_cmd), &prio_tbl_cmd))
362 IWL_ERR(priv, "failed to send BT prio tbl command\n");
363}
364
365static void iwlagn_send_bt_env(struct iwl_priv *priv, u8 action, u8 type)
366{
367 struct iwl_bt_coex_prot_env_cmd env_cmd;
368
369 env_cmd.action = action;
370 env_cmd.type = type;
371 if (iwl_send_cmd_pdu(priv, REPLY_BT_COEX_PROT_ENV,
372 sizeof(env_cmd), &env_cmd))
373 IWL_ERR(priv, "failed to send BT env command\n");
374}
375
376
332int iwlagn_alive_notify(struct iwl_priv *priv) 377int iwlagn_alive_notify(struct iwl_priv *priv)
333{ 378{
334 u32 a; 379 u32 a;
@@ -416,6 +461,20 @@ int iwlagn_alive_notify(struct iwl_priv *priv)
416 461
417 spin_unlock_irqrestore(&priv->lock, flags); 462 spin_unlock_irqrestore(&priv->lock, flags);
418 463
464 if (priv->cfg->advanced_bt_coexist) {
465 /* Configure Bluetooth device coexistence support */
466 /* need to perform this before any calibration */
467 priv->cfg->ops->hcmd->send_bt_config(priv);
468 if (bt_coex_active && priv->iw_mode != NL80211_IFTYPE_ADHOC) {
469 iwlagn_send_prio_tbl(priv);
470 iwlagn_send_bt_env(priv, IWL_BT_COEX_ENV_OPEN,
471 BT_COEX_PRIO_TBL_EVT_INIT_CALIB2);
472 iwlagn_send_bt_env(priv, IWL_BT_COEX_ENV_CLOSE,
473 BT_COEX_PRIO_TBL_EVT_INIT_CALIB2);
474 }
475
476 }
477
419 iwlagn_send_wimax_coex(priv); 478 iwlagn_send_wimax_coex(priv);
420 479
421 iwlagn_set_Xtal_calib(priv); 480 iwlagn_set_Xtal_calib(priv);
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 807d697f6239..c17ce823f84d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -2754,8 +2754,10 @@ static void iwl_alive_start(struct iwl_priv *priv)
2754 priv->cfg->ops->hcmd->set_rxon_chain(priv); 2754 priv->cfg->ops->hcmd->set_rxon_chain(priv);
2755 } 2755 }
2756 2756
2757 /* Configure Bluetooth device coexistence support */ 2757 if (!priv->cfg->advanced_bt_coexist) {
2758 priv->cfg->ops->hcmd->send_bt_config(priv); 2758 /* Configure Bluetooth device coexistence support */
2759 priv->cfg->ops->hcmd->send_bt_config(priv);
2760 }
2759 2761
2760 iwl_reset_run_time_calib(priv); 2762 iwl_reset_run_time_calib(priv);
2761 2763
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index 67eaeb6822cb..b45882aa68fe 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -4078,34 +4078,63 @@ struct iwl_bt_coex_profile_notif {
4078 u8 reserved; 4078 u8 reserved;
4079} __attribute__((packed)); 4079} __attribute__((packed));
4080 4080
4081#define IWL_BT_COEX_PRIO_SHARED_ANTENNA 0x1 4081#define IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_POS 0
4082#define IWL_BT_COEX_PRIO_PRIO_MASK 0xe 4082#define IWL_BT_COEX_PRIO_TBL_SHARED_ANTENNA_MSK 0x1
4083#define IWL_BT_COEX_PRIO_PRIO_SHIFT 1 4083#define IWL_BT_COEX_PRIO_TBL_PRIO_POS 1
4084#define IWL_BT_COEX_PRIO_TBL_PRIO_MASK 0x0e
4085#define IWL_BT_COEX_PRIO_TBL_RESERVED_POS 4
4086#define IWL_BT_COEX_PRIO_TBL_RESERVED_MASK 0xf0
4087#define IWL_BT_COEX_PRIO_TBL_PRIO_SHIFT 1
4084 4088
4085/* 4089/*
4086 * BT Coexistence Priority table 4090 * BT Coexistence Priority table
4087 * REPLY_BT_COEX_PRIO_TABLE = 0xcc 4091 * REPLY_BT_COEX_PRIO_TABLE = 0xcc
4088 */ 4092 */
4093enum bt_coex_prio_table_events {
4094 BT_COEX_PRIO_TBL_EVT_INIT_CALIB1 = 0,
4095 BT_COEX_PRIO_TBL_EVT_INIT_CALIB2 = 1,
4096 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_LOW1 = 2,
4097 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_LOW2 = 3, /* DC calib */
4098 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_HIGH1 = 4,
4099 BT_COEX_PRIO_TBL_EVT_PERIODIC_CALIB_HIGH2 = 5,
4100 BT_COEX_PRIO_TBL_EVT_DTIM = 6,
4101 BT_COEX_PRIO_TBL_EVT_SCAN52 = 7,
4102 BT_COEX_PRIO_TBL_EVT_SCAN24 = 8,
4103 BT_COEX_PRIO_TBL_EVT_RESERVED0 = 9,
4104 BT_COEX_PRIO_TBL_EVT_RESERVED1 = 10,
4105 BT_COEX_PRIO_TBL_EVT_RESERVED2 = 11,
4106 BT_COEX_PRIO_TBL_EVT_RESERVED3 = 12,
4107 BT_COEX_PRIO_TBL_EVT_RESERVED4 = 13,
4108 BT_COEX_PRIO_TBL_EVT_RESERVED5 = 14,
4109 BT_COEX_PRIO_TBL_EVT_RESERVED6 = 15,
4110 /* BT_COEX_PRIO_TBL_EVT_MAX should always be last */
4111 BT_COEX_PRIO_TBL_EVT_MAX,
4112};
4113
4114enum bt_coex_prio_table_priorities {
4115 BT_COEX_PRIO_TBL_DISABLED = 0,
4116 BT_COEX_PRIO_TBL_PRIO_LOW = 1,
4117 BT_COEX_PRIO_TBL_PRIO_HIGH = 2,
4118 BT_COEX_PRIO_TBL_PRIO_BYPASS = 3,
4119 BT_COEX_PRIO_TBL_PRIO_COEX_OFF = 4,
4120 BT_COEX_PRIO_TBL_PRIO_COEX_ON = 5,
4121 BT_COEX_PRIO_TBL_PRIO_RSRVD1 = 6,
4122 BT_COEX_PRIO_TBL_PRIO_RSRVD2 = 7,
4123 BT_COEX_PRIO_TBL_MAX,
4124};
4125
4089struct iwl_bt_coex_prio_table_cmd { 4126struct iwl_bt_coex_prio_table_cmd {
4090 u8 init_calib_protection_cfg1, 4127 u8 prio_tbl[BT_COEX_PRIO_TBL_EVT_MAX];
4091 init_calib_protection_cfg2,
4092 init_calib_protection_lowprio_cfg1,
4093 init_calib_protection_lowprio_cfg2,
4094 init_calib_protection_highprio_cfg1,
4095 init_calib_protection_highprio_cfg2,
4096 dtim_protection_prio_cfg,
4097 scan_52_protection_cfg,
4098 scan_24_protection_cfg,
4099 bc_mc_protection_cfg;
4100 u8 reserved[6];
4101} __attribute__((packed)); 4128} __attribute__((packed));
4102 4129
4130#define IWL_BT_COEX_ENV_CLOSE 0
4131#define IWL_BT_COEX_ENV_OPEN 1
4103/* 4132/*
4104 * BT Protection Envelope 4133 * BT Protection Envelope
4105 * REPLY_BT_COEX_PROT_ENV = 0xcd 4134 * REPLY_BT_COEX_PROT_ENV = 0xcd
4106 */ 4135 */
4107struct iwl_bt_coex_prot_env_cmd { 4136struct iwl_bt_coex_prot_env_cmd {
4108 u8 open; /* 0 = closed, 1 = open */ 4137 u8 action; /* 0 = closed, 1 = open */
4109 u8 type; /* 0 .. 15 */ 4138 u8 type; /* 0 .. 15 */
4110 u8 reserved[2]; 4139 u8 reserved[2];
4111} __attribute__((packed)); 4140} __attribute__((packed));