*     by %parent_bssid.
  * @parent_bssid: the BSS according to which %parent_tsf is set. This is set to
  *     the BSS that requested the scan in which the beacon/probe was received.
+ * @chains: bitmask for filled values in @chain_signal.
+ * @chain_signal: per-chain signal strength of last received BSS in dBm.
  */
 struct cfg80211_inform_bss {
        struct ieee80211_channel *chan;
        u64 boottime_ns;
        u64 parent_tsf;
        u8 parent_bssid[ETH_ALEN] __aligned(2);
+       u8 chains;
+       s8 chain_signal[IEEE80211_MAX_CHAINS];
 };
 
 /**
  *     that holds the beacon data. @beacon_ies is still valid, of course, and
  *     points to the same data as hidden_beacon_bss->beacon_ies in that case.
  * @signal: signal strength value (type depends on the wiphy's signal_type)
+ * @chains: bitmask for filled values in @chain_signal.
+ * @chain_signal: per-chain signal strength of last received BSS in dBm.
  * @priv: private area for driver use, has at least wiphy->bss_priv_size bytes
  */
 struct cfg80211_bss {
        u16 capability;
 
        u8 bssid[ETH_ALEN];
+       u8 chains;
+       s8 chain_signal[IEEE80211_MAX_CHAINS];
 
        u8 priv[0] __aligned(sizeof(void *));
 };
 
  *     @NL80211_BSS_PARENT_BSSID. (u64).
  * @NL80211_BSS_PARENT_BSSID: the BSS according to which @NL80211_BSS_PARENT_TSF
  *     is set.
+ * @NL80211_BSS_CHAIN_SIGNAL: per-chain signal strength of last BSS update.
+ *     Contains a nested array of signal strength attributes (u8, dBm),
+ *     using the nesting index as the antenna number.
  * @__NL80211_BSS_AFTER_LAST: internal
  * @NL80211_BSS_MAX: highest BSS attribute
  */
        NL80211_BSS_PAD,
        NL80211_BSS_PARENT_TSF,
        NL80211_BSS_PARENT_BSSID,
+       NL80211_BSS_CHAIN_SIGNAL,
 
        /* keep last */
        __NL80211_BSS_AFTER_LAST,
 
                              intbss->ts_boottime, NL80211_BSS_PAD))
                goto nla_put_failure;
 
+       if (!nl80211_put_signal(msg, intbss->pub.chains,
+                               intbss->pub.chain_signal,
+                               NL80211_BSS_CHAIN_SIGNAL))
+               goto nla_put_failure;
+
        switch (rdev->wiphy.signal_type) {
        case CFG80211_SIGNAL_TYPE_MBM:
                if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
 
                found->ts = tmp->ts;
                found->ts_boottime = tmp->ts_boottime;
                found->parent_tsf = tmp->parent_tsf;
+               found->pub.chains = tmp->pub.chains;
+               memcpy(found->pub.chain_signal, tmp->pub.chain_signal,
+                      IEEE80211_MAX_CHAINS);
                ether_addr_copy(found->parent_bssid, tmp->parent_bssid);
        } else {
                struct cfg80211_internal_bss *new;
        tmp.pub.capability = le16_to_cpu(mgmt->u.probe_resp.capab_info);
        tmp.ts_boottime = data->boottime_ns;
        tmp.parent_tsf = data->parent_tsf;
+       tmp.pub.chains = data->chains;
+       memcpy(tmp.pub.chain_signal, data->chain_signal, IEEE80211_MAX_CHAINS);
        ether_addr_copy(tmp.parent_bssid, data->parent_bssid);
 
        signal_valid = abs(data->chan->center_freq - channel->center_freq) <=