u8 dtim_count;
        u8 dtim_period;
        const struct ieee80211_addba_ext_ie *addba_ext_ie;
+       const struct ieee80211_s1g_cap *s1g_capab;
+       const struct ieee80211_s1g_oper_ie *s1g_oper;
+       const struct ieee80211_s1g_bcn_compat_ie *s1g_bcn_compat;
 
        /* length of them, respectively */
        u8 ext_capab_len;
 
        ieee80211_verify_alignment(&rx);
 
        if (unlikely(ieee80211_is_probe_resp(hdr->frame_control) ||
-                    ieee80211_is_beacon(hdr->frame_control)))
+                    ieee80211_is_beacon(hdr->frame_control) ||
+                    ieee80211_is_s1g_beacon(hdr->frame_control)))
                ieee80211_scan_rx(local, skb);
 
        if (ieee80211_is_data(fc)) {
 
                          struct ieee80211_mgmt *mgmt, size_t len,
                          struct ieee80211_channel *channel)
 {
-       bool beacon = ieee80211_is_beacon(mgmt->frame_control);
+       bool beacon = ieee80211_is_beacon(mgmt->frame_control) ||
+                     ieee80211_is_s1g_beacon(mgmt->frame_control);
        struct cfg80211_bss *cbss, *non_tx_cbss;
        struct ieee80211_bss *bss, *non_tx_bss;
        struct cfg80211_inform_bss bss_meta = {
                elements = mgmt->u.probe_resp.variable;
                baselen = offsetof(struct ieee80211_mgmt,
                                   u.probe_resp.variable);
+       } else if (ieee80211_is_s1g_beacon(mgmt->frame_control)) {
+               struct ieee80211_ext *ext = (void *) mgmt;
+
+               baselen = offsetof(struct ieee80211_ext, u.s1g_beacon.variable);
+               elements = ext->u.s1g_beacon.variable;
        } else {
                baselen = offsetof(struct ieee80211_mgmt, u.beacon.variable);
                elements = mgmt->u.beacon.variable;
        struct ieee80211_bss *bss;
        struct ieee80211_channel *channel;
 
-       if (skb->len < 24 ||
-           (!ieee80211_is_probe_resp(mgmt->frame_control) &&
-            !ieee80211_is_beacon(mgmt->frame_control)))
+       if (ieee80211_is_s1g_beacon(mgmt->frame_control)) {
+               if (skb->len < 15)
+                       return;
+       } else if (skb->len < 24 ||
+                (!ieee80211_is_probe_resp(mgmt->frame_control) &&
+                 !ieee80211_is_beacon(mgmt->frame_control)))
                return;
 
        sdata1 = rcu_dereference(local->scan_sdata);
 
                case WLAN_EID_LINK_ID:
                case WLAN_EID_BSS_MAX_IDLE_PERIOD:
                case WLAN_EID_RSNX:
+               case WLAN_EID_S1G_BCN_COMPAT:
+               case WLAN_EID_S1G_CAPABILITIES:
+               case WLAN_EID_S1G_OPERATION:
+               case WLAN_EID_S1G_SHORT_BCN_INTERVAL:
                /*
                 * not listing WLAN_EID_CHANNEL_SWITCH_WRAPPER -- it seems possible
                 * that if the content gets bigger it might be needed more than once
                                                                &crc : NULL,
                                                          elem, elems);
                        break;
+               case WLAN_EID_S1G_CAPABILITIES:
+                       if (elen == sizeof(*elems->s1g_capab))
+                               elems->s1g_capab = (void *)pos;
+                       else
+                               elem_parse_failed = true;
+                       break;
+               case WLAN_EID_S1G_OPERATION:
+                       if (elen == sizeof(*elems->s1g_oper))
+                               elems->s1g_oper = (void *)pos;
+                       else
+                               elem_parse_failed = true;
+                       break;
+               case WLAN_EID_S1G_BCN_COMPAT:
+                       if (elen == sizeof(*elems->s1g_bcn_compat))
+                               elems->s1g_bcn_compat = (void *)pos;
+                       else
+                               elem_parse_failed = true;
+                       break;
                default:
                        break;
                }