#define RSN_AKM_PSK                    2       /* Pre-shared Key */
 #define RSN_AKM_SHA256_1X              5       /* SHA256, 802.1X */
 #define RSN_AKM_SHA256_PSK             6       /* SHA256, Pre-shared Key */
+#define RSN_AKM_SAE                    8       /* SAE */
 #define RSN_CAP_LEN                    2       /* Length of RSN capabilities */
 #define RSN_CAP_PTK_REPLAY_CNTR_MASK   (BIT(2) | BIT(3))
 #define RSN_CAP_MFPR_MASK              BIT(6)
                        brcmf_dbg(TRACE, "RSN_AKM_MFP_1X\n");
                        wpa_auth |= WPA2_AUTH_1X_SHA256;
                        break;
+               case RSN_AKM_SAE:
+                       brcmf_dbg(TRACE, "RSN_AKM_SAE\n");
+                       wpa_auth |= WPA3_AUTH_SAE_PSK;
+                       break;
                default:
                        bphy_err(drvr, "Invalid key mgmt info\n");
                }
                                brcmf_dbg(TRACE, "MFP Required\n");
                                mfp = BRCMF_MFP_REQUIRED;
                                /* Firmware only supports mfp required in
-                                * combination with WPA2_AUTH_PSK_SHA256 or
-                                * WPA2_AUTH_1X_SHA256.
+                                * combination with WPA2_AUTH_PSK_SHA256,
+                                * WPA2_AUTH_1X_SHA256, or WPA3_AUTH_SAE_PSK.
                                 */
                                if (!(wpa_auth & (WPA2_AUTH_PSK_SHA256 |
-                                                 WPA2_AUTH_1X_SHA256))) {
+                                                 WPA2_AUTH_1X_SHA256 |
+                                                 WPA3_AUTH_SAE_PSK))) {
                                        err = -EINVAL;
                                        goto exit;
                                }
                        if (err < 0)
                                goto exit;
                }
+               if (crypto->sae_pwd) {
+                       brcmf_dbg(INFO, "using SAE offload\n");
+                       profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_SAE);
+                       err = brcmf_set_sae_password(ifp, crypto->sae_pwd,
+                                                    crypto->sae_pwd_len);
+                       if (err < 0)
+                               goto exit;
+               }
                if (profile->use_fwauth == 0)
                        profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE);
 
                if (profile->use_fwauth != BIT(BRCMF_PROFILE_FWAUTH_NONE)) {
                        if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_PSK))
                                brcmf_set_pmk(ifp, NULL, 0);
+                       if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_SAE))
+                               brcmf_set_sae_password(ifp, NULL, 0);
                        profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE);
                }
 
                        wiphy_ext_feature_set(wiphy,
                                              NL80211_EXT_FEATURE_SAE_OFFLOAD);
        }
-       if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWAUTH))
+       if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWAUTH)) {
                wiphy_ext_feature_set(wiphy,
                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK);
+               if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SAE))
+                       wiphy_ext_feature_set(wiphy,
+                                             NL80211_EXT_FEATURE_SAE_OFFLOAD_AP);
+       }
        wiphy->mgmt_stypes = brcmf_txrx_stypes;
        wiphy->max_remain_on_channel_duration = 5000;
        if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {