* @beacon_next: beacon data to be used after the color change
  * @count: number of beacons until the color change
  * @color: the color used after the change
+ * @link_id: defines the link on which color change is expected during MLO.
+ *     0 in case of non-MLO.
  */
 struct cfg80211_color_change_settings {
        struct cfg80211_beacon_data beacon_color_change;
        struct cfg80211_beacon_data beacon_next;
        u8 count;
        u8 color;
+       u8 link_id;
 };
 
 /**
  * @cmd: the actual event we want to notify
  * @count: the number of TBTTs until the color change happens
  * @color_bitmap: representations of the colors that the local BSS is aware of
+ * @link_id: valid link_id in case of MLO or 0 for non-MLO.
  *
  * Return: 0 on success. Non-zero on error.
  */
 int cfg80211_bss_color_notify(struct net_device *dev,
                              enum nl80211_commands cmd, u8 count,
-                             u64 color_bitmap);
+                             u64 color_bitmap, u8 link_id);
 
 /**
  * cfg80211_obss_color_collision_notify - notify about bss color collision
  * @dev: network device
  * @color_bitmap: representations of the colors that the local BSS is aware of
+ * @link_id: valid link_id in case of MLO or 0 for non-MLO.
  *
  * Return: 0 on success. Non-zero on error.
  */
 static inline int cfg80211_obss_color_collision_notify(struct net_device *dev,
-                                                      u64 color_bitmap)
+                                                      u64 color_bitmap,
+                                                      u8 link_id)
 {
        return cfg80211_bss_color_notify(dev, NL80211_CMD_OBSS_COLOR_COLLISION,
-                                        0, color_bitmap);
+                                        0, color_bitmap, link_id);
 }
 
 /**
  * cfg80211_color_change_started_notify - notify color change start
  * @dev: the device on which the color is switched
  * @count: the number of TBTTs until the color change happens
+ * @link_id: valid link_id in case of MLO or 0 for non-MLO.
  *
  * Inform the userspace about the color change that has started.
  *
  * Return: 0 on success. Non-zero on error.
  */
 static inline int cfg80211_color_change_started_notify(struct net_device *dev,
-                                                      u8 count)
+                                                      u8 count, u8 link_id)
 {
        return cfg80211_bss_color_notify(dev, NL80211_CMD_COLOR_CHANGE_STARTED,
-                                        count, 0);
+                                        count, 0, link_id);
 }
 
 /**
  * cfg80211_color_change_aborted_notify - notify color change abort
  * @dev: the device on which the color is switched
+ * @link_id: valid link_id in case of MLO or 0 for non-MLO.
  *
  * Inform the userspace about the color change that has aborted.
  *
  * Return: 0 on success. Non-zero on error.
  */
-static inline int cfg80211_color_change_aborted_notify(struct net_device *dev)
+static inline int cfg80211_color_change_aborted_notify(struct net_device *dev,
+                                                      u8 link_id)
 {
        return cfg80211_bss_color_notify(dev, NL80211_CMD_COLOR_CHANGE_ABORTED,
-                                        0, 0);
+                                        0, 0, link_id);
 }
 
 /**
  * cfg80211_color_change_notify - notify color change completion
  * @dev: the device on which the color was switched
+ * @link_id: valid link_id in case of MLO or 0 for non-MLO.
  *
  * Inform the userspace about the color change that has completed.
  *
  * Return: 0 on success. Non-zero on error.
  */
-static inline int cfg80211_color_change_notify(struct net_device *dev)
+static inline int cfg80211_color_change_notify(struct net_device *dev,
+                                              u8 link_id)
 {
        return cfg80211_bss_color_notify(dev,
                                         NL80211_CMD_COLOR_CHANGE_COMPLETED,
-                                        0, 0);
+                                        0, 0, link_id);
 }
 
 /**
 
 
        ieee80211_free_next_beacon(&sdata->deflink);
 
-       cfg80211_color_change_aborted_notify(sdata->dev);
+       cfg80211_color_change_aborted_notify(sdata->dev, 0);
 }
 
 static int
 
        err = ieee80211_set_after_color_change_beacon(sdata, &changed);
        if (err) {
-               cfg80211_color_change_aborted_notify(sdata->dev);
+               cfg80211_color_change_aborted_notify(sdata->dev, 0);
                return err;
        }
 
        ieee80211_color_change_bss_config_notify(sdata,
                                                 sdata->vif.bss_conf.color_change_color,
                                                 1, changed);
-       cfg80211_color_change_notify(sdata->dev);
+       cfg80211_color_change_notify(sdata->dev, 0);
 
        return 0;
 }
                             color_collision_detect_work);
        struct ieee80211_sub_if_data *sdata = link->sdata;
 
-       cfg80211_obss_color_collision_notify(sdata->dev, link->color_bitmap);
+       cfg80211_obss_color_collision_notify(sdata->dev, link->color_bitmap, 0);
 }
 
 void ieee80211_color_change_finish(struct ieee80211_vif *vif)
        sdata->vif.bss_conf.color_change_active = true;
        sdata->vif.bss_conf.color_change_color = params->color;
 
-       cfg80211_color_change_started_notify(sdata->dev, params->count);
+       cfg80211_color_change_started_notify(sdata->dev, params->count, 0);
 
        if (changed)
                ieee80211_color_change_bss_config_notify(sdata, 0, 0, changed);
 
                params.counter_offset_presp = offset;
        }
 
+       params.link_id = nl80211_link_id(info->attrs);
        err = rdev_color_change(rdev, dev, ¶ms);
 
 out:
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nl80211_color_change,
                .flags = GENL_UNS_ADMIN_PERM,
-               .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
+               .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
+                                        NL80211_FLAG_MLO_VALID_LINK_ID),
        },
        {
                .cmd = NL80211_CMD_SET_FILS_AAD,
 
 int cfg80211_bss_color_notify(struct net_device *dev,
                              enum nl80211_commands cmd, u8 count,
-                             u64 color_bitmap)
+                             u64 color_bitmap, u8 link_id)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct wiphy *wiphy = wdev->wiphy;
        if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
                goto nla_put_failure;
 
+       if (wdev->valid_links &&
+           nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
+               goto nla_put_failure;
+
        if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED &&
            nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count))
                goto nla_put_failure;
 
                __field(u8, count)
                __field(u16, bcn_ofs)
                __field(u16, pres_ofs)
+               __field(u8, link_id)
        ),
        TP_fast_assign(
                WIPHY_ASSIGN;
                __entry->count = params->count;
                __entry->bcn_ofs = params->counter_offset_beacon;
                __entry->pres_ofs = params->counter_offset_presp;
+               __entry->link_id = params->link_id;
        ),
        TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT
-                 ", count: %u",
+                 ", count: %u, link_id: %d",
                  WIPHY_PR_ARG, NETDEV_PR_ARG,
-                 __entry->count)
+                 __entry->count, __entry->link_id)
 );
 
 TRACE_EVENT(rdev_set_radar_background,