|
@@ -423,6 +423,7 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
|
|
|
struct ath6kl_vif *vif = netdev_priv(dev);
|
|
|
int status;
|
|
|
u8 nw_subtype = (ar->p2p) ? SUBTYPE_P2PDEV : SUBTYPE_NONE;
|
|
|
+ u16 interval;
|
|
|
|
|
|
ath6kl_cfg80211_sscan_disable(vif);
|
|
|
|
|
@@ -577,6 +578,20 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
|
|
|
vif->grp_crypto_len, vif->ch_hint);
|
|
|
|
|
|
vif->reconnect_flag = 0;
|
|
|
+
|
|
|
+ if (vif->nw_type == INFRA_NETWORK) {
|
|
|
+ interval = max(vif->listen_intvl_t,
|
|
|
+ (u16) ATH6KL_MAX_WOW_LISTEN_INTL);
|
|
|
+ status = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
+ interval,
|
|
|
+ 0);
|
|
|
+ if (status) {
|
|
|
+ ath6kl_err("couldn't set listen intervel\n");
|
|
|
+ up(&ar->sem);
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
status = ath6kl_wmi_connect_cmd(ar->wmi, vif->fw_vif_idx, vif->nw_type,
|
|
|
vif->dot11_auth_mode, vif->auth_mode,
|
|
|
vif->prwise_crypto,
|
|
@@ -1911,7 +1926,7 @@ static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
|
|
|
struct ath6kl_vif *vif;
|
|
|
int ret, left;
|
|
|
u32 filter = 0;
|
|
|
- u16 i;
|
|
|
+ u16 i, bmiss_time;
|
|
|
u8 index = 0;
|
|
|
__be32 ips[MAX_IP_ADDRS];
|
|
|
|
|
@@ -1950,6 +1965,30 @@ static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
|
|
|
|
|
|
netif_stop_queue(vif->ndev);
|
|
|
|
|
|
+ if (vif->nw_type != AP_NETWORK) {
|
|
|
+ ret = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
+ ATH6KL_MAX_WOW_LISTEN_INTL,
|
|
|
+ 0);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ /* Set listen interval x 15 times as bmiss time */
|
|
|
+ bmiss_time = ATH6KL_MAX_WOW_LISTEN_INTL * 15;
|
|
|
+ if (bmiss_time > ATH6KL_MAX_BMISS_TIME)
|
|
|
+ bmiss_time = ATH6KL_MAX_BMISS_TIME;
|
|
|
+
|
|
|
+ ret = ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
+ bmiss_time, 0);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
+ 0xFFFF, 0, 0xFFFF, 0, 0, 0,
|
|
|
+ 0, 0, 0, 0);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
ar->state = ATH6KL_STATE_SUSPENDING;
|
|
|
|
|
|
/* Setup own IP addr for ARP agent. */
|
|
@@ -2041,6 +2080,23 @@ static int ath6kl_wow_resume(struct ath6kl *ar)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ if (vif->nw_type != AP_NETWORK) {
|
|
|
+ ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
+ 0, 0, 0, 0, 0, 0, 3, 0, 0, 0);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
+ vif->listen_intvl_t, 0);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
+ vif->bmiss_time_t, 0);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
ar->state = ATH6KL_STATE_ON;
|
|
|
|
|
|
netif_wake_queue(vif->ndev);
|
|
@@ -3034,6 +3090,7 @@ struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
|
|
|
vif->fw_vif_idx = fw_vif_idx;
|
|
|
vif->nw_type = vif->next_mode = nw_type;
|
|
|
vif->listen_intvl_t = ATH6KL_DEFAULT_LISTEN_INTVAL;
|
|
|
+ vif->bmiss_time_t = ATH6KL_DEFAULT_BMISS_TIME;
|
|
|
|
|
|
memcpy(ndev->dev_addr, ar->mac_addr, ETH_ALEN);
|
|
|
if (fw_vif_idx != 0)
|