#include "reg.h"
 #include "ps.h"
 
-int wl1271_acx_wake_up_conditions(struct wl1271 *wl, struct wl12xx_vif *wlvif)
+int wl1271_acx_wake_up_conditions(struct wl1271 *wl, struct wl12xx_vif *wlvif,
+                                 u8 wake_up_event, u8 listen_interval)
 {
        struct acx_wake_up_condition *wake_up;
        int ret;
 
-       wl1271_debug(DEBUG_ACX, "acx wake up conditions");
+       wl1271_debug(DEBUG_ACX, "acx wake up conditions (wake_up_event %d listen_interval %d)",
+                    wake_up_event, listen_interval);
 
        wake_up = kzalloc(sizeof(*wake_up), GFP_KERNEL);
        if (!wake_up) {
        }
 
        wake_up->role_id = wlvif->role_id;
-       wake_up->wake_up_event = wl->conf.conn.wake_up_event;
-       wake_up->listen_interval = wl->conf.conn.listen_interval;
+       wake_up->wake_up_event = wake_up_event;
+       wake_up->listen_interval = listen_interval;
 
        ret = wl1271_cmd_configure(wl, ACX_WAKE_UP_CONDITIONS,
                                   wake_up, sizeof(*wake_up));
 
        .conn = {
                .wake_up_event               = CONF_WAKE_UP_EVENT_DTIM,
                .listen_interval             = 1,
+               .suspend_wake_up_event       = CONF_WAKE_UP_EVENT_N_DTIM,
+               .suspend_listen_interval     = 3,
                .bcn_filt_mode               = CONF_BCN_FILT_MODE_ENABLED,
                .bcn_filt_ie_count           = 2,
                .bcn_filt_ie = {
 };
 
 #ifdef CONFIG_PM
+static int wl1271_configure_suspend_sta(struct wl1271 *wl,
+                                       struct wl12xx_vif *wlvif)
+{
+       int ret = 0;
+
+       mutex_lock(&wl->mutex);
+
+       if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
+               goto out_unlock;
+
+       ret = wl1271_ps_elp_wakeup(wl);
+       if (ret < 0)
+               goto out_unlock;
+
+       ret = wl1271_acx_wake_up_conditions(wl, wlvif,
+                                   wl->conf.conn.suspend_wake_up_event,
+                                   wl->conf.conn.suspend_listen_interval);
+
+       if (ret < 0)
+               wl1271_error("suspend: set wake up conditions failed: %d", ret);
+
+
+       wl1271_ps_elp_sleep(wl);
+
+out_unlock:
+       mutex_unlock(&wl->mutex);
+       return ret;
+
+}
 
 static int wl1271_configure_suspend_ap(struct wl1271 *wl,
                                       struct wl12xx_vif *wlvif)
 static int wl1271_configure_suspend(struct wl1271 *wl,
                                    struct wl12xx_vif *wlvif)
 {
+       if (wlvif->bss_type == BSS_TYPE_STA_BSS)
+               return wl1271_configure_suspend_sta(wl, wlvif);
        if (wlvif->bss_type == BSS_TYPE_AP_BSS)
                return wl1271_configure_suspend_ap(wl, wlvif);
        return 0;
 static void wl1271_configure_resume(struct wl1271 *wl,
                                    struct wl12xx_vif *wlvif)
 {
-       int ret;
+       int ret = 0;
        bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS;
+       bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
 
-       if (!is_ap)
+       if ((!is_ap) && (!is_sta))
                return;
 
        mutex_lock(&wl->mutex);
        if (ret < 0)
                goto out;
 
-       wl1271_acx_beacon_filter_opt(wl, wlvif, false);
+       if (is_sta) {
+               ret = wl1271_acx_wake_up_conditions(wl, wlvif,
+                                   wl->conf.conn.wake_up_event,
+                                   wl->conf.conn.listen_interval);
+
+               if (ret < 0)
+                       wl1271_error("resume: wake up conditions failed: %d",
+                                    ret);
+
+       } else if (is_ap) {
+               ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
+       }
 
        wl1271_ps_elp_sleep(wl);
 out:
 
                wl1271_debug(DEBUG_PSM, "entering psm (mode=%d,timeout=%u)",
                             mode, timeout);
 
-               ret = wl1271_acx_wake_up_conditions(wl, wlvif);
+               ret = wl1271_acx_wake_up_conditions(wl, wlvif,
+                                           wl->conf.conn.wake_up_event,
+                                           wl->conf.conn.listen_interval);
                if (ret < 0) {
                        wl1271_error("couldn't set wake up conditions");
                        return ret;