brcmfmac: keep ARP and ND offload enabled during WOWL
authorHante Meuleman <meuleman@broadcom.com>
Wed, 17 Feb 2016 10:27:05 +0000 (11:27 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 7 Mar 2016 12:14:59 +0000 (14:14 +0200)
Currently ARP and ND (IPv6 Neigbor Discovery) offload get disabled
on entering suspend. However when firmwares support the wowl_cap
iovar then these offload routines can be kept enabled as they
will work during WOWL as well.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h

index 6d849bb2e27c9b21029f9185424762d2e41b21a4..5609a79df1c16e7903e9ded2e50472e70515fdd8 100644 (file)
@@ -3556,7 +3556,8 @@ static s32 brcmf_cfg80211_resume(struct wiphy *wiphy)
                brcmf_report_wowl_wakeind(wiphy, ifp);
                brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0);
                brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0);
-               brcmf_configure_arp_nd_offload(ifp, true);
+               if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ARP_ND))
+                       brcmf_configure_arp_nd_offload(ifp, true);
                brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM,
                                      cfg->wowl.pre_pmmode);
                cfg->wowl.active = false;
@@ -3580,7 +3581,8 @@ static void brcmf_configure_wowl(struct brcmf_cfg80211_info *cfg,
 
        brcmf_dbg(TRACE, "Suspend, wowl config.\n");
 
-       brcmf_configure_arp_nd_offload(ifp, false);
+       if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ARP_ND))
+               brcmf_configure_arp_nd_offload(ifp, false);
        brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PM, &cfg->wowl.pre_pmmode);
        brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, PM_MAX);
 
index 098732a0c91b48264a56c1eb019b1f592d570761..bfa19bb632b78cae341c723b28ab649e0c74b2f4 100644 (file)
@@ -147,6 +147,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
        if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL)) {
                err = brcmf_fil_iovar_int_get(ifp, "wowl_cap", &wowl_cap);
                if (!err) {
+                       ifp->drvr->feat_flags |= BIT(BRCMF_FEAT_WOWL_ARP_ND);
                        if (wowl_cap & BRCMF_WOWL_PFN_FOUND)
                                ifp->drvr->feat_flags |=
                                        BIT(BRCMF_FEAT_WOWL_ND);
index f940c29bcfafb361b2c38319ee6d3c0ae1e43dde..a3efa35a5c214de0d359cbfe83b1f90301f396e6 100644 (file)
@@ -29,6 +29,7 @@
  * SCAN_RANDOM_MAC: Random MAC during (net detect) scheduled scan.
  * WOWL_ND: WOWL net detect (PNO)
  * WOWL_GTK: (WOWL) GTK rekeying offload
+ * WOWL_ARP_ND: ARP and Neighbor Discovery offload support during WOWL.
  */
 #define BRCMF_FEAT_LIST \
        BRCMF_FEAT_DEF(MBSS) \
@@ -40,7 +41,8 @@
        BRCMF_FEAT_DEF(TDLS) \
        BRCMF_FEAT_DEF(SCAN_RANDOM_MAC) \
        BRCMF_FEAT_DEF(WOWL_ND) \
-       BRCMF_FEAT_DEF(WOWL_GTK)
+       BRCMF_FEAT_DEF(WOWL_GTK) \
+       BRCMF_FEAT_DEF(WOWL_ARP_ND)
 
 /*
  * Quirks: