diff options
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | 59 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-commands.h | 59 |
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 | ||
332 | static 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 | |||
354 | static 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 | |||
365 | static 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 | |||
332 | int iwlagn_alive_notify(struct iwl_priv *priv) | 377 | int 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 | */ |
4093 | enum 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 | |||
4114 | enum 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 | |||
4089 | struct iwl_bt_coex_prio_table_cmd { | 4126 | struct 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 | */ |
4107 | struct iwl_bt_coex_prot_env_cmd { | 4136 | struct 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)); |