diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index ac038903d53e..30231855be1f 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -2180,6 +2180,10 @@ struct link_station_info {
  * @tx_bytes: bytes (size of MPDUs) transmitted to this station
  * @tx_retries: cumulative retry counts (MPDUs)
  * @tx_failed: number of failed transmissions (MPDUs) (retries exceeded, no ACK)
+ * @signal: The signal strength, type depends on the wiphy's signal_type.
+ *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
+ * @txrate: last updated unicast bitrate from this station
+ * @rxrate: last updated unicast bitrate to this station
  * @deflink: This holds the default link STA information, for non MLO STA
  *	all link specific STA information is accessed through @deflink.
  * @links: reference to Link sta entries for MLO.
@@ -2218,6 +2222,9 @@ struct station_info {
 	u64 tx_bytes;
 	u32 tx_retries;
 	u32 tx_failed;
+	s8 signal;
+	struct rate_info txrate;
+	struct rate_info rxrate;
 
 	struct link_station_info deflink;
 	/* TODO: Need to check and add protection access to links memory */
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index 4b78b03b1047..2cad17cb64d7 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -2858,6 +2858,33 @@ static void sta_set_link_sinfo(struct sta_info *sta, struct link_station_info *l
 	}
 }
 
+static void sta_set_mld_rate_info(struct rate_info *sinfo_rate,
+				  struct rate_info *link_sinfo_rate)
+{
+	if (link_sinfo_rate->flags)
+		sinfo_rate->flags = link_sinfo_rate->flags;
+	if (link_sinfo_rate->legacy)
+		sinfo_rate->legacy = link_sinfo_rate->legacy;
+	if (link_sinfo_rate->mcs)
+		sinfo_rate->mcs = link_sinfo_rate->mcs;
+	if (link_sinfo_rate->nss)
+		sinfo_rate->nss = link_sinfo_rate->nss;
+	if (link_sinfo_rate->bw)
+		sinfo_rate->bw = link_sinfo_rate->bw;
+	if (link_sinfo_rate->he_gi)
+		sinfo_rate->he_gi = link_sinfo_rate->he_gi;
+	if (link_sinfo_rate->he_dcm)
+		sinfo_rate->he_dcm = link_sinfo_rate->he_dcm;
+	if (link_sinfo_rate->he_ru_alloc)
+		sinfo_rate->he_ru_alloc = link_sinfo_rate->he_ru_alloc;
+	if (link_sinfo_rate->n_bonded_ch)
+		sinfo_rate->n_bonded_ch = link_sinfo_rate->n_bonded_ch;
+	if (link_sinfo_rate->eht_gi)
+		sinfo_rate->eht_gi = link_sinfo_rate->eht_gi;
+	if (link_sinfo_rate->eht_ru_alloc)
+		sinfo_rate->eht_ru_alloc = link_sinfo_rate->eht_ru_alloc;
+}
+
 static void sta_set_mld_sinfo(struct station_info *sinfo, struct sta_info *sta)
 {
 	struct link_station_info *link_sinfo;
@@ -2913,6 +2940,23 @@ static void sta_set_mld_sinfo(struct station_info *sinfo, struct sta_info *sta)
 	sinfo->rx_bytes += sta->rem_link_stats.rx_bytes;
 	sinfo->tx_retries += sta->rem_link_stats.tx_retries;
 	sinfo->tx_failed += sta->rem_link_stats.tx_failed;
+
+	/*TODO: set mld stats for signal based on best values and signal
+	 * for last updated, currently using one of the link to fill stats
+	 */
+	if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL)) {
+		sinfo->signal = link_sinfo->signal;
+		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
+	}
+	if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) {
+		sta_set_mld_rate_info(&sinfo->txrate, &link_sinfo->txrate);
+		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
+	}
+
+	if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) {
+		sta_set_mld_rate_info(&sinfo->rxrate, &link_sinfo->rxrate);
+		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
+	}
 }
 
 void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 06688aa1780f..99d74f67b1a2 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -6839,7 +6839,8 @@ static int nl80211_fill_link_station(struct sk_buff *msg,
 }
 
 static int nl80211_fill_mld_station(struct sk_buff *msg,
-				    struct station_info *sinfo)
+				    struct station_info *sinfo,
+				    struct cfg80211_registered_device *rdev)
 {
 #define PUT_SINFO(attr, memb, type) do {				\
 	BUILD_BUG_ON(sizeof(type) == sizeof(u64));			\
@@ -6862,9 +6863,29 @@ static int nl80211_fill_mld_station(struct sk_buff *msg,
 	PUT_SINFO(TX_RETRIES, tx_retries, u32);
 	PUT_SINFO(TX_FAILED, tx_failed, u32);
 
+	switch (rdev->wiphy.signal_type) {
+	case CFG80211_SIGNAL_TYPE_MBM:
+		PUT_SINFO(SIGNAL, signal, u8);
+		break;
+	default:
+		break;
+	}
+
 #undef PUT_SINFO
 #undef PUT_SINFO_U64
 
+	if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) {
+		if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
+					  NL80211_STA_INFO_TX_BITRATE))
+			return -EMSGSIZE;
+	}
+
+	if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) {
+		if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
+					  NL80211_STA_INFO_RX_BITRATE))
+			return -EMSGSIZE;
+	}
+
 	return 0;
 }
 
@@ -6942,7 +6963,7 @@ static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
 #undef PUT_SINFO_U64
 
 	if (sinfo->valid_links) {
-		ret = nl80211_fill_mld_station(msg, sinfo);
+		ret = nl80211_fill_mld_station(msg, sinfo, rdev);
 		if (ret)
 			goto nla_put_failure;
 
