cfg->wowl.active = true;
 }
 
+static int brcmf_keepalive_start(struct brcmf_if *ifp, unsigned int interval)
+{
+       struct brcmf_mkeep_alive_pkt_le kalive = {0};
+       int ret = 0;
+
+       /* Configure Null function/data keepalive */
+       kalive.version = cpu_to_le16(1);
+       kalive.period_msec = cpu_to_le16(interval * MSEC_PER_SEC);
+       kalive.len_bytes = cpu_to_le16(0);
+       kalive.keep_alive_id = cpu_to_le16(0);
+
+       ret = brcmf_fil_iovar_data_set(ifp, "mkeep_alive", &kalive, sizeof(kalive));
+       if (ret)
+               brcmf_err("keep-alive packet config failed, ret=%d\n", ret);
+
+       return ret;
+}
+
 static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
                                  struct cfg80211_wowlan *wowl)
 {
        } else {
                /* Configure WOWL paramaters */
                brcmf_configure_wowl(cfg, ifp, wowl);
+
+               /* Prevent disassociation due to inactivity with keep-alive */
+               brcmf_keepalive_start(ifp, 30);
        }
 
 exit:
 
        struct brcmf_gscan_bucket_config bucket[1];
 };
 
+/**
+ * struct brcmf_mkeep_alive_pkt_le - configuration data for keep-alive frame.
+ *
+ * @version: version for mkeep_alive
+ * @length: length of fixed parameters in the structure.
+ * @period_msec: keep-alive period in milliseconds.
+ * @len_bytes: size of the data.
+ * @keep_alive_id: ID  (0 - 3).
+ * @data: keep-alive frame data.
+ */
+struct brcmf_mkeep_alive_pkt_le {
+       __le16  version;
+       __le16  length;
+       __le32  period_msec;
+       __le16  len_bytes;
+       u8   keep_alive_id;
+       u8   data[0];
+} __packed;
+
 #endif /* FWIL_TYPES_H_ */