return 0;
 }
 
+static int
+ieee80211_set_s1g_short_beacon(struct ieee80211_sub_if_data *sdata,
+                              struct ieee80211_link_data *link,
+                              struct cfg80211_s1g_short_beacon *params)
+{
+       struct s1g_short_beacon_data *new;
+       struct s1g_short_beacon_data *old =
+               sdata_dereference(link->u.ap.s1g_short_beacon, sdata);
+       size_t new_len =
+               sizeof(*new) + params->short_head_len + params->short_tail_len;
+
+       if (!params->update)
+               return 0;
+
+       if (!params->short_head)
+               return -EINVAL;
+
+       new = kzalloc(new_len, GFP_KERNEL);
+       if (!new)
+               return -ENOMEM;
+
+       /* Memory layout: | struct | head | tail | */
+       new->short_head = (u8 *)new + sizeof(*new);
+       new->short_head_len = params->short_head_len;
+       memcpy(new->short_head, params->short_head, params->short_head_len);
+
+       if (params->short_tail) {
+               new->short_tail = new->short_head + params->short_head_len;
+               new->short_tail_len = params->short_tail_len;
+               memcpy(new->short_tail, params->short_tail,
+                      params->short_tail_len);
+       }
+
+       rcu_assign_pointer(link->u.ap.s1g_short_beacon, new);
+
+       if (old)
+               kfree_rcu(old, rcu_head);
+
+       return 0;
+}
+
 static int ieee80211_set_ftm_responder_params(
                                struct ieee80211_sub_if_data *sdata,
                                const u8 *lci, size_t lci_len,
        link_conf->twt_responder = params->twt_responder;
        link_conf->he_obss_pd = params->he_obss_pd;
        link_conf->he_bss_color = params->beacon.he_bss_color;
-       sdata->vif.cfg.s1g = params->chandef.chan->band ==
-                                 NL80211_BAND_S1GHZ;
+       link_conf->s1g_long_beacon_period = params->s1g_long_beacon_period;
+       sdata->vif.cfg.s1g = params->chandef.chan->band == NL80211_BAND_S1GHZ;
 
        sdata->vif.cfg.ssid_len = params->ssid_len;
        if (params->ssid_len)
        if (err < 0)
                goto error;
 
+       if (sdata->vif.cfg.s1g) {
+               err = ieee80211_set_s1g_short_beacon(sdata, link,
+                                                    ¶ms->s1g_short_beacon);
+               if (err < 0)
+                       goto error;
+       }
+
        err = drv_start_ap(sdata->local, sdata, link_conf);
        if (err) {
                old = sdata_dereference(link->u.ap.beacon, sdata);
        if (err < 0)
                return err;
 
+       if (link->u.ap.s1g_short_beacon) {
+               err = ieee80211_set_s1g_short_beacon(sdata, link,
+                                                    ¶ms->s1g_short_beacon);
+               if (err < 0)
+                       return err;
+       }
+
        if (beacon->he_bss_color_valid &&
            beacon->he_bss_color.enabled != link_conf->he_bss_color.enabled) {
                link_conf->he_bss_color.enabled = beacon->he_bss_color.enabled;
        struct probe_resp *old_probe_resp;
        struct fils_discovery_data *old_fils_discovery;
        struct unsol_bcast_probe_resp_data *old_unsol_bcast_probe_resp;
+       struct s1g_short_beacon_data *old_s1g_short_beacon;
        struct cfg80211_chan_def chandef;
        struct ieee80211_link_data *link =
                sdata_dereference(sdata->link[link_id], sdata);
        old_unsol_bcast_probe_resp =
                sdata_dereference(link->u.ap.unsol_bcast_probe_resp,
                                  sdata);
+       old_s1g_short_beacon =
+               sdata_dereference(link->u.ap.s1g_short_beacon, sdata);
 
        /* abort any running channel switch or color change */
        link_conf->csa_active = false;
        RCU_INIT_POINTER(link->u.ap.probe_resp, NULL);
        RCU_INIT_POINTER(link->u.ap.fils_discovery, NULL);
        RCU_INIT_POINTER(link->u.ap.unsol_bcast_probe_resp, NULL);
+       RCU_INIT_POINTER(link->u.ap.s1g_short_beacon, NULL);
        kfree_rcu(old_beacon, rcu_head);
        if (old_probe_resp)
                kfree_rcu(old_probe_resp, rcu_head);
                kfree_rcu(old_fils_discovery, rcu_head);
        if (old_unsol_bcast_probe_resp)
                kfree_rcu(old_unsol_bcast_probe_resp, rcu_head);
+       if (old_s1g_short_beacon)
+               kfree_rcu(old_s1g_short_beacon, rcu_head);
 
        kfree(link_conf->ftmr_params);
        link_conf->ftmr_params = NULL;
        link_conf->enable_beacon = false;
        sdata->beacon_rate_set = false;
        sdata->vif.cfg.ssid_len = 0;
+       sdata->vif.cfg.s1g = false;
        clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
        ieee80211_link_info_change_notify(sdata, link,
                                          BSS_CHANGED_BEACON_ENABLED);