#ifndef _LINUX_ETHTOOL_H
 #define _LINUX_ETHTOOL_H
 
+#include <linux/linkmode.h>
 #include <linux/bitmap.h>
 #include <linux/compat.h>
 #include <linux/if_ether.h>
  * next string.
  */
 extern __printf(2, 3) void ethtool_sprintf(u8 **data, const char *fmt, ...);
+
+/* Link mode to forced speed capabilities maps */
+struct ethtool_forced_speed_map {
+       u32             speed;
+       __ETHTOOL_DECLARE_LINK_MODE_MASK(caps);
+
+       const u32       *cap_arr;
+       u32             arr_size;
+};
+
+#define ETHTOOL_FORCED_SPEED_MAP(prefix, value)                                \
+{                                                                      \
+       .speed          = SPEED_##value,                                \
+       .cap_arr        = prefix##_##value,                             \
+       .arr_size       = ARRAY_SIZE(prefix##_##value),                 \
+}
+
+/**
+ * ethtool_forced_speed_maps_init
+ * @maps: Pointer to an array of Ethtool forced speed map
+ * @size: Array size
+ *
+ * Initialize an array of Ethtool forced speed map to Ethtool link modes. This
+ * should be called during driver module init.
+ */
+static inline void
+ethtool_forced_speed_maps_init(struct ethtool_forced_speed_map *maps, u32 size)
+{
+       for (u32 i = 0; i < size; i++) {
+               struct ethtool_forced_speed_map *map = &maps[i];
+
+               linkmode_set_bit_array(map->cap_arr, map->arr_size, map->caps);
+               map->cap_arr = NULL;
+               map->arr_size = 0;
+       }
+}
 #endif /* _LINUX_ETHTOOL_H */
 
 #define __LINKMODE_H
 
 #include <linux/bitmap.h>
+
+static inline void linkmode_set_bit(int nr, volatile unsigned long *addr)
+{
+       __set_bit(nr, addr);
+}
+
+static inline void linkmode_set_bit_array(const int *array, int array_size,
+                                         unsigned long *addr)
+{
+       int i;
+
+       for (i = 0; i < array_size; i++)
+               linkmode_set_bit(array[i], addr);
+}
+
 #include <linux/ethtool.h>
 #include <uapi/linux/ethtool.h>
 
        return bitmap_andnot(dst, src1, src2,  __ETHTOOL_LINK_MODE_MASK_NBITS);
 }
 
-static inline void linkmode_set_bit(int nr, volatile unsigned long *addr)
-{
-       __set_bit(nr, addr);
-}
-
-static inline void linkmode_set_bit_array(const int *array, int array_size,
-                                         unsigned long *addr)
-{
-       int i;
-
-       for (i = 0; i < array_size; i++)
-               linkmode_set_bit(array[i], addr);
-}
-
 static inline void linkmode_clear_bit(int nr, volatile unsigned long *addr)
 {
        __clear_bit(nr, addr);