iwlagn: disable gen2b BT coexistence in IBSS

IBSS doesn't allow for coexistence, so it
should be disabled.

Additionally, disable reacting to the BT
profile notification when in IBSS mode,
it likely won't be sent by the device to
start with though.

Also, in IBSS mode, BT coexistence isn't as fully-featured
and we must use a single antenna only. So instead of
peppering the code with new checks, simply pretend
we are in high BT traffic load, which has the needed
effect of disabling antenna B use.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index f049ebc..5141944 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -217,7 +217,14 @@
 	BUILD_BUG_ON(sizeof(iwl6000g2b_def_3w_lookup) !=
 			sizeof(bt_cmd.bt3_lookup_table));
 
-	if (!bt_coex_active) {
+	/*
+	 * Configure BT coex mode to "no coexistence" when the
+	 * user disabled BT coexistence, we have no interface
+	 * (might be in monitor mode), or the interface is in
+	 * IBSS mode (no proper uCode support for coex then).
+	 */
+	if (!bt_coex_active || !priv->vif ||
+	    priv->iw_mode == NL80211_IFTYPE_ADHOC) {
 		bt_cmd.flags = 0;
 	} else {
 		bt_cmd.flags = IWL6000G2B_BT_FLAG_CHANNEL_INHIBITION |
@@ -426,18 +433,23 @@
 			coex->uart_msg[3], coex->uart_msg[4], coex->uart_msg[5],
 			coex->uart_msg[6], coex->uart_msg[7]);
 
-	if (coex->bt_traffic_load != priv->bt_traffic_load) {
-		priv->bt_traffic_load = coex->bt_traffic_load;
+	priv->notif_bt_traffic_load = coex->bt_traffic_load;
 
-		queue_work(priv->workqueue, &priv->bt_traffic_change_work);
+	if (priv->iw_mode != NL80211_IFTYPE_ADHOC) {
+		if (coex->bt_traffic_load != priv->bt_traffic_load) {
+			priv->bt_traffic_load = coex->bt_traffic_load;
+
+			queue_work(priv->workqueue,
+				   &priv->bt_traffic_change_work);
+		}
+
+		/* FIXME: add defines for this check */
+		priv->bt_sco_active = coex->uart_msg[3] & 1;
+		if (priv->bt_sco_active)
+			sco_cmd.flags |= IWL6000G2B_BT_SCO_ACTIVE;
+		iwl_send_cmd_pdu_async(priv, REPLY_BT_COEX_SCO,
+				       sizeof(sco_cmd), &sco_cmd, NULL);
 	}
-
-	/* FIXME: add defines for this check */
-	priv->bt_sco_active = coex->uart_msg[3] & 1;
-	if (priv->bt_sco_active)
-		sco_cmd.flags |= IWL6000G2B_BT_SCO_ACTIVE;
-	iwl_send_cmd_pdu_async(priv, REPLY_BT_COEX_SCO,
-			       sizeof(sco_cmd), &sco_cmd, NULL);
 }
 
 void iwl6000g2b_rx_handler_setup(struct iwl_priv *priv)