From 2ef7e1ac2b108e61a05f72cede319cf6fdbfbae7 Mon Sep 17 00:00:00 2001
From: "Angus Ainslie (Purism)" <angus@akkea.ca>
Date: Tue, 26 Feb 2019 13:02:19 -0700
Subject: [PATCH] net: wireless: rsi: Add the antenna diversity patch

To enable the diversity set the module parameter antenna_diversity=1

insmod rsi_91x.ko rsi_zone_enabled=1 dev_oper_mode=13 antenna_diversity=1
---
 drivers/net/wireless/rsi/rsi_91x_mac80211.c | 33 ++++++++++++++++++++-
 drivers/net/wireless/rsi/rsi_91x_main.c     | 13 ++++++++
 drivers/net/wireless/rsi/rsi_91x_mgmt.c     |  6 ----
 drivers/net/wireless/rsi/rsi_main.h         |  4 +++
 4 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index 3ed789d41f3a0..09f676f2720f0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -399,6 +399,26 @@ static void rsi_set_min_rate(struct ieee80211_hw *hw,
 	rsi_dbg(INFO_ZONE, "Min Rate = %d\n", common->min_rate);
 }
 
+static void rsi_trigger_antenna_change(struct rsi_common *common)
+{
+	common->rsi_scan_count++;
+	if (common->rsi_scan_count > MAX_SCAN_PER_ANTENNA) {
+		common->rsi_scan_count = 0;
+		if (common->ant_in_use == ANTENNA_SEL_INT)
+			common->obm_ant_sel_val = ANTENNA_SEL_UFL;
+		else
+			common->obm_ant_sel_val = ANTENNA_SEL_INT;
+		if (rsi_set_antenna(common, common->obm_ant_sel_val)) {
+			rsi_dbg(ERR_ZONE, "Failed to change antenna to %d\n",
+				common->obm_ant_sel_val);
+		} else {
+			rsi_dbg(ERR_ZONE, "Antenna is changed to %d\n",
+				common->obm_ant_sel_val);
+			common->ant_in_use = common->obm_ant_sel_val;
+		}
+	}
+	return;
+}
 
 #ifdef CONFIG_HW_SCAN_OFFLOAD
 #define MAX_HW_SCAN_SSID 1
@@ -433,11 +453,17 @@ static int rsi_mac80211_hw_scan_start(struct ieee80211_hw *hw,
 	mutex_lock(&common->mutex);
 
 	if (!bss->assoc) {
+		if (common->antenna_diversity)
+			rsi_trigger_antenna_change(common);
+
 		common->scan_request = scan_req;
 		common->scan_vif = vif;
 		common->scan_in_prog = false;
 		queue_work(common->scan_workqueue, &common->scan_work);
 	} else {
+		/* Upon connection, make scan count to 0 */
+		common->rsi_scan_count = 0;
+
 		/* Wait for EAPOL4 completion before starting bg scan */
 		if ((bss->assoc_capability & BIT(4))) {	
 			if (!common->start_bgscan) {
@@ -2318,9 +2344,14 @@ static void rsi_mac80211_sw_scan_start(struct ieee80211_hw *hw,
 
 	if (common->p2p_enabled)
 		return;
-	if (!bss->assoc)
+	if (!bss->assoc) {
+		if (common->antenna_diversity)
+			rsi_trigger_antenna_change(common);
 		return;
+	}
 
+	/* Upon connection, make scan count to 0 */
+	common->rsi_scan_count = 0;
 	mutex_lock(&common->mutex);
 
 	if (!rsi_send_bgscan_params(common, 1)) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c b/drivers/net/wireless/rsi/rsi_91x_main.c
index 7e985a4f2f7e4..66bb6bc5d89d6 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -75,12 +75,14 @@ bool host_intf_on_demand;
  * Default sleep clock derivation source is RC clock.
  */
 bool crystal_as_sleep_clk;
+bool antenna_diversity;
 u16 feature_bitmap_9116;
 u8 bt_rf_type = 0x01;
 u8 ble_tx_pwr_inx =  0x1E;
 u8 ble_pwr_save_options = 0x02;
 u8 bt_rf_tx_power_mode;
 u8 bt_rf_rx_power_mode;
+u8 antenna_sel = ANTENNA_SEL_UFL;
 
 module_param(bt_rf_type, byte, 0);
 module_param(ble_tx_pwr_inx, byte, 0);
@@ -125,6 +127,14 @@ module_param(crystal_as_sleep_clk, bool, 0);
 MODULE_PARM_DESC(crystal_as_sleep_clk, "\nSleep clock selection (0) RC clock \
 as sleep clock (1) 32KHz crystal as sleep clock\n");
 
+module_param(antenna_diversity, bool, 0);
+MODULE_PARM_DESC(antenna_diversity, "\n Anetanna diversity selection(Only for \
+STA mode).\n '0' for disable and '1' for enable\n");
+
+module_param(antenna_sel, byte, 0);
+MODULE_PARM_DESC(antenna_sel, "\n Antenna selection. '2' for  intenal antenna \
+and '3' for External antenna\n");
+
 module_param(feature_bitmap_9116, ushort, 0);
 MODULE_PARM_DESC(feature_bitmap_9116, "\n9116 Feature Bitmap BIT(0) 0: AGC_PD \
 Enable, 1: AGC_PD Disable BIT(7:1) Reserved\n");
@@ -599,6 +609,8 @@ struct rsi_hw *rsi_91x_init(void)
 	common->feature_bitmap_9116 = feature_bitmap_9116;
 	common->host_intf_on_demand = host_intf_on_demand;
 	common->bt_rf_type = bt_rf_type;
+	common->obm_ant_sel_val = antenna_sel;
+	common->antenna_diversity = antenna_diversity;
 	common->ble_tx_pwr_inx = ble_tx_pwr_inx;
 	common->ble_pwr_save_options = ble_pwr_save_options;
 	common->bt_rf_tx_power_mode = bt_rf_tx_power_mode;
@@ -622,6 +634,7 @@ struct rsi_hw *rsi_91x_init(void)
 	rsi_default_ps_params(adapter);
 	spin_lock_init(&adapter->ps_lock);
 	common->uapsd_bitmap = 0;
+	common->rsi_scan_count = 0;
 
 	/* BGScan related */
 	init_bgscan_params(common);
diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
index 3a40cd0e10006..5776ac244186b 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
@@ -628,12 +628,6 @@ static void rsi_set_default_parameters(struct rsi_common *common)
 	common->country_code = 840; /* Default US */
 	common->wlan_rf_power_mode = 0;
 	common->bt_rf_power_mode = 0;
-#ifndef CONFIG_RSI_PURISM
-	common->obm_ant_sel_val = 2;
-#else
-	common->obm_ant_sel_val = 3;
-#endif
-	common->antenna_diversity = 0;
 	common->tx_power = RSI_TXPOWER_MAX;
 	common->dtim_cnt = 2;
 	common->beacon_interval = 100;
diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h
index aeabe72a5b9ad..91d37adec53a8 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -72,6 +72,9 @@ struct rsi_hw;
 #define ACS_TIMEOUT_TYPE	15
 #define ACS_TIMEOUT_TIME	150
 
+/* Antenna Diversity */
+#define MAX_SCAN_PER_ANTENNA		2
+
 extern u16 rsi_zone_enabled;
 extern __printf(2, 3) void rsi_dbg(u32 zone, const char *fmt, ...);
 void rsi_hex_dump(u32 zone, char *msg_str, const u8 *msg, u32 len);
@@ -521,6 +524,7 @@ struct rsi_common {
 	u8 bt_rf_tx_power_mode;
 	u8 bt_rf_rx_power_mode;
 	u8 load_image_no;
+	u8 rsi_scan_count;
 };
 
 enum host_intf {
-- 
GitLab