diff mbox series

[3/4] UBUNTU: SAUCE: Redpine: Add deep sleep enable before connection

Message ID 1519913599-30203-4-git-send-email-amitkarwar@gmail.com
State New
Headers show
Series Redpine: wowlan enhancements | expand

Commit Message

Amitkumar Karwar March 1, 2018, 2:13 p.m. UTC
From: Sanjay Kumar Konduri <sanjay.konduri@redpinesignals.com>

BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1742090
BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1742094

As in coex mode radio will be shared between BT and WLAN,
we need enable deep sleep before scan. Before scan deep
sleep can be disabled and re-enabed after scan. For any TX
frame before assoc, deep sleep shall be disable.

Signed-off-by: Sanjay Kumar Konduri <sanjay.konduri@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
---
 ubuntu/rsi/rsi_91x_mac80211.c |  7 ++++++-
 ubuntu/rsi/rsi_91x_mgmt.c     | 18 +++++++++++++++---
 ubuntu/rsi/rsi_91x_ps.c       |  2 +-
 3 files changed, 22 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/ubuntu/rsi/rsi_91x_mac80211.c b/ubuntu/rsi/rsi_91x_mac80211.c
index 2983c73..36c0cfd 100644
--- a/ubuntu/rsi/rsi_91x_mac80211.c
+++ b/ubuntu/rsi/rsi_91x_mac80211.c
@@ -549,7 +549,8 @@  static void rsi_mac80211_tx(struct ieee80211_hw *hw,
 	struct rsi_hw *adapter = hw->priv;
 	struct rsi_common *common = adapter->priv;
 	struct ieee80211_hdr *wlh = (struct ieee80211_hdr *)skb->data;
-  struct ieee80211_vif *vif = adapter->vifs[adapter->sc_nvifs - 1];
+	struct ieee80211_vif *vif = adapter->vifs[adapter->sc_nvifs - 1];
+	struct ieee80211_bss_conf *bss = &adapter->vifs[0]->bss_conf;
 
 #ifdef CONFIG_VEN_RSI_WOW
 	if (common->wow_flags & RSI_WOW_ENABLED) {
@@ -561,6 +562,10 @@  static void rsi_mac80211_tx(struct ieee80211_hw *hw,
 		ieee80211_free_txskb(common->priv->hw, skb);
 		return;
 	}
+	if ((!bss->assoc) &&
+	    (adapter->ps_state == PS_ENABLED) &&
+	    (vif->type == NL80211_IFTYPE_STATION))
+		rsi_disable_ps(adapter);
 
   if ((common->coex_mode == 4) &&
       (vif->type == NL80211_IFTYPE_STATION) &&
diff --git a/ubuntu/rsi/rsi_91x_mgmt.c b/ubuntu/rsi/rsi_91x_mgmt.c
index c66e14d..11b2046 100644
--- a/ubuntu/rsi/rsi_91x_mgmt.c
+++ b/ubuntu/rsi/rsi_91x_mgmt.c
@@ -2068,11 +2068,12 @@  EXPORT_SYMBOL_GPL(rsi_send_rx_filter_frame);
 int rsi_send_ps_request(struct rsi_hw *adapter, bool enable)
 {
 	struct rsi_common *common = adapter->priv;
-	struct ieee80211_bss_conf *bss = &adapter->vifs[0]->bss_conf;
+	struct ieee80211_bss_conf *bss;
 	struct rsi_request_ps *ps = NULL;
 	struct rsi_ps_info *ps_info = NULL;
 	struct sk_buff *skb = NULL;
 	int frame_len = sizeof(*ps);
+	bool assoc;
 
 	skb = dev_alloc_skb(frame_len);
 	if (!skb)
@@ -2110,7 +2111,16 @@  int rsi_send_ps_request(struct rsi_hw *adapter, bool enable)
 	ps->ps_sleep.sleep_duration =
 		cpu_to_le32(ps_info->deep_sleep_wakeup_period);
 
-	if (bss->assoc)
+	if (adapter->sc_nvifs == 0) {
+		assoc = false;
+	} else {
+		bss = &adapter->vifs[0]->bss_conf;
+		if (bss->assoc)
+			assoc = true;
+		else
+			assoc = false;
+	}
+	if (assoc)
 		ps->ps_sleep.connected_sleep = CONNECTED_SLEEP;
 	else
 		ps->ps_sleep.connected_sleep = DEEP_SLEEP;
@@ -2396,6 +2406,7 @@  void rsi_scan_start(struct work_struct *work)
 		return;
 
 	common->scan_in_prog = true;
+	rsi_disable_ps(common->priv);
 	
 	for (ii =0; ii < scan_req->n_channels ; ii++) {
 		if (common->iface_down)
@@ -2458,7 +2469,7 @@  void rsi_scan_start(struct work_struct *work)
 
 	del_timer(&common->scan_timer);
 	common->scan_in_prog = false;
-
+	rsi_enable_ps(common->priv);
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0))
 	info.aborted = false;
 	ieee80211_scan_completed(common->priv->hw, &info);
@@ -2653,6 +2664,7 @@  static int rsi_handle_ta_confirm(struct rsi_common *common, u8 *msg)
 					complete(&common->wlan_init_completion);
 					common->reinit_hw = false;
 				} else {
+					rsi_enable_ps(adapter);
 					return rsi_mac80211_attach(common);
 				}
 			}
diff --git a/ubuntu/rsi/rsi_91x_ps.c b/ubuntu/rsi/rsi_91x_ps.c
index 61294a2..8fa1a3b 100644
--- a/ubuntu/rsi/rsi_91x_ps.c
+++ b/ubuntu/rsi/rsi_91x_ps.c
@@ -100,7 +100,7 @@  void rsi_default_ps_params(struct rsi_hw *adapter)
 	ps_info->num_bcns_per_lis_int = 0;
 	ps_info->dtim_interval_duration = 0;
 	ps_info->num_dtims_per_sleep = 0;
-	ps_info->deep_sleep_wakeup_period = 200;
+	ps_info->deep_sleep_wakeup_period = 0;
 }
 EXPORT_SYMBOL_GPL(rsi_default_ps_params);