return -EMSGSIZE;
 }
 
-static const struct nla_policy bitset_policy[ETHTOOL_A_BITSET_MAX + 1] = {
-       [ETHTOOL_A_BITSET_UNSPEC]       = { .type = NLA_REJECT },
+static const struct nla_policy bitset_policy[] = {
        [ETHTOOL_A_BITSET_NOMASK]       = { .type = NLA_FLAG },
        [ETHTOOL_A_BITSET_SIZE]         = NLA_POLICY_MAX(NLA_U32,
                                                         ETHNL_MAX_BITSET_SIZE),
        [ETHTOOL_A_BITSET_MASK]         = { .type = NLA_BINARY },
 };
 
-static const struct nla_policy bit_policy[ETHTOOL_A_BITSET_BIT_MAX + 1] = {
-       [ETHTOOL_A_BITSET_BIT_UNSPEC]   = { .type = NLA_REJECT },
+static const struct nla_policy bit_policy[] = {
        [ETHTOOL_A_BITSET_BIT_INDEX]    = { .type = NLA_U32 },
        [ETHTOOL_A_BITSET_BIT_NAME]     = { .type = NLA_NUL_STRING },
        [ETHTOOL_A_BITSET_BIT_VALUE]    = { .type = NLA_FLAG },
  */
 int ethnl_bitset_is_compact(const struct nlattr *bitset, bool *compact)
 {
-       struct nlattr *tb[ETHTOOL_A_BITSET_MAX + 1];
+       struct nlattr *tb[ARRAY_SIZE(bitset_policy)];
        int ret;
 
-       ret = nla_parse_nested(tb, ETHTOOL_A_BITSET_MAX, bitset,
+       ret = nla_parse_nested(tb, ARRAY_SIZE(bitset_policy) - 1, bitset,
                               bitset_policy, NULL);
        if (ret < 0)
                return ret;
                           ethnl_string_array_t names,
                           struct netlink_ext_ack *extack)
 {
-       struct nlattr *tb[ETHTOOL_A_BITSET_BIT_MAX + 1];
+       struct nlattr *tb[ARRAY_SIZE(bit_policy)];
        int ret, idx;
 
-       ret = nla_parse_nested(tb, ETHTOOL_A_BITSET_BIT_MAX, bit_attr,
+       ret = nla_parse_nested(tb, ARRAY_SIZE(bit_policy) - 1, bit_attr,
                               bit_policy, extack);
        if (ret < 0)
                return ret;
                          const struct nlattr *attr, ethnl_string_array_t names,
                          struct netlink_ext_ack *extack, bool *mod)
 {
-       struct nlattr *tb[ETHTOOL_A_BITSET_MAX + 1];
+       struct nlattr *tb[ARRAY_SIZE(bitset_policy)];
        unsigned int change_bits;
        bool no_mask;
        int ret;
 
        if (!attr)
                return 0;
-       ret = nla_parse_nested(tb, ETHTOOL_A_BITSET_MAX, attr, bitset_policy,
-                              extack);
+       ret = nla_parse_nested(tb, ARRAY_SIZE(bitset_policy) - 1, attr,
+                              bitset_policy, extack);
        if (ret < 0)
                return ret;
 
                       ethnl_string_array_t names,
                       struct netlink_ext_ack *extack)
 {
-       struct nlattr *tb[ETHTOOL_A_BITSET_MAX + 1];
+       struct nlattr *tb[ARRAY_SIZE(bitset_policy)];
        const struct nlattr *bit_attr;
        bool no_mask;
        int rem;
 
        if (!attr)
                return 0;
-       ret = nla_parse_nested(tb, ETHTOOL_A_BITSET_MAX, attr, bitset_policy,
-                              extack);
+       ret = nla_parse_nested(tb, ARRAY_SIZE(bitset_policy) - 1, attr,
+                              bitset_policy, extack);
        if (ret < 0)
                return ret;
        no_mask = tb[ETHTOOL_A_BITSET_NOMASK];
 
  */
 #define MAX_CABLE_LENGTH_CM (150 * 100)
 
-const struct nla_policy
-ethnl_cable_test_act_policy[ETHTOOL_A_CABLE_TEST_MAX + 1] = {
-       [ETHTOOL_A_CABLE_TEST_UNSPEC]           = { .type = NLA_REJECT },
+const struct nla_policy ethnl_cable_test_act_policy[] = {
        [ETHTOOL_A_CABLE_TEST_HEADER]           = { .type = NLA_NESTED },
 };
 
        struct ethnl_req_info           base;
 };
 
-static const struct nla_policy
-cable_test_tdr_act_cfg_policy[ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX + 1] = {
+static const struct nla_policy cable_test_tdr_act_cfg_policy[] = {
        [ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST]    = { .type = NLA_U32 },
        [ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST]     = { .type = NLA_U32 },
        [ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP]     = { .type = NLA_U32 },
        [ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR]     = { .type = NLA_U8 },
 };
 
-const struct nla_policy
-ethnl_cable_test_tdr_act_policy[ETHTOOL_A_CABLE_TEST_TDR_MAX + 1] = {
-       [ETHTOOL_A_CABLE_TEST_TDR_UNSPEC]       = { .type = NLA_REJECT },
+const struct nla_policy ethnl_cable_test_tdr_act_policy[] = {
        [ETHTOOL_A_CABLE_TEST_TDR_HEADER]       = { .type = NLA_NESTED },
        [ETHTOOL_A_CABLE_TEST_TDR_CFG]          = { .type = NLA_NESTED },
 };
                                        struct genl_info *info,
                                        struct phy_tdr_config *cfg)
 {
-       struct nlattr *tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX + 1];
+       struct nlattr *tb[ARRAY_SIZE(cable_test_tdr_act_cfg_policy)];
        int ret;
 
        cfg->first = 100;
        if (!nest)
                return 0;
 
-       ret = nla_parse_nested(tb, ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX, nest,
-                              cable_test_tdr_act_cfg_policy, info->extack);
+       ret = nla_parse_nested(tb,
+                              ARRAY_SIZE(cable_test_tdr_act_cfg_policy) - 1,
+                              nest, cable_test_tdr_act_cfg_policy,
+                              info->extack);
        if (ret < 0)
                return ret;
 
 
 #define CHANNELS_REPDATA(__reply_base) \
        container_of(__reply_base, struct channels_reply_data, base)
 
-const struct nla_policy
-ethnl_channels_get_policy[ETHTOOL_A_CHANNELS_MAX + 1] = {
-       [ETHTOOL_A_CHANNELS_UNSPEC]             = { .type = NLA_REJECT },
+const struct nla_policy ethnl_channels_get_policy[] = {
        [ETHTOOL_A_CHANNELS_HEADER]             = { .type = NLA_NESTED },
-       [ETHTOOL_A_CHANNELS_RX_MAX]             = { .type = NLA_REJECT },
-       [ETHTOOL_A_CHANNELS_TX_MAX]             = { .type = NLA_REJECT },
-       [ETHTOOL_A_CHANNELS_OTHER_MAX]          = { .type = NLA_REJECT },
-       [ETHTOOL_A_CHANNELS_COMBINED_MAX]       = { .type = NLA_REJECT },
-       [ETHTOOL_A_CHANNELS_RX_COUNT]           = { .type = NLA_REJECT },
-       [ETHTOOL_A_CHANNELS_TX_COUNT]           = { .type = NLA_REJECT },
-       [ETHTOOL_A_CHANNELS_OTHER_COUNT]        = { .type = NLA_REJECT },
-       [ETHTOOL_A_CHANNELS_COMBINED_COUNT]     = { .type = NLA_REJECT },
 };
 
 static int channels_prepare_data(const struct ethnl_req_info *req_base,
 
 /* CHANNELS_SET */
 
-const struct nla_policy
-ethnl_channels_set_policy[ETHTOOL_A_CHANNELS_MAX + 1] = {
-       [ETHTOOL_A_CHANNELS_UNSPEC]             = { .type = NLA_REJECT },
+const struct nla_policy ethnl_channels_set_policy[] = {
        [ETHTOOL_A_CHANNELS_HEADER]             = { .type = NLA_NESTED },
-       [ETHTOOL_A_CHANNELS_RX_MAX]             = { .type = NLA_REJECT },
-       [ETHTOOL_A_CHANNELS_TX_MAX]             = { .type = NLA_REJECT },
-       [ETHTOOL_A_CHANNELS_OTHER_MAX]          = { .type = NLA_REJECT },
-       [ETHTOOL_A_CHANNELS_COMBINED_MAX]       = { .type = NLA_REJECT },
        [ETHTOOL_A_CHANNELS_RX_COUNT]           = { .type = NLA_U32 },
        [ETHTOOL_A_CHANNELS_TX_COUNT]           = { .type = NLA_U32 },
        [ETHTOOL_A_CHANNELS_OTHER_COUNT]        = { .type = NLA_U32 },
 
 __CHECK_SUPPORTED_OFFSET(COALESCE_TX_MAX_FRAMES_HIGH);
 __CHECK_SUPPORTED_OFFSET(COALESCE_RATE_SAMPLE_INTERVAL);
 
-const struct nla_policy
-ethnl_coalesce_get_policy[ETHTOOL_A_COALESCE_MAX + 1] = {
-       [ETHTOOL_A_COALESCE_UNSPEC]             = { .type = NLA_REJECT },
+const struct nla_policy ethnl_coalesce_get_policy[] = {
        [ETHTOOL_A_COALESCE_HEADER]             = { .type = NLA_NESTED },
-       [ETHTOOL_A_COALESCE_RX_USECS]           = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_RX_MAX_FRAMES]      = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_RX_USECS_IRQ]       = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ]  = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_TX_USECS]           = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_TX_MAX_FRAMES]      = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_TX_USECS_IRQ]       = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ]  = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_STATS_BLOCK_USECS]  = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX]    = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX]    = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_PKT_RATE_LOW]       = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_RX_USECS_LOW]       = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW]  = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_TX_USECS_LOW]       = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW]  = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_PKT_RATE_HIGH]      = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_RX_USECS_HIGH]      = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH] = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_TX_USECS_HIGH]      = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH] = { .type = NLA_REJECT },
-       [ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL] = { .type = NLA_REJECT },
 };
 
 static int coalesce_prepare_data(const struct ethnl_req_info *req_base,
 
 /* COALESCE_SET */
 
-const struct nla_policy
-ethnl_coalesce_set_policy[ETHTOOL_A_COALESCE_MAX + 1] = {
-       [ETHTOOL_A_COALESCE_UNSPEC]             = { .type = NLA_REJECT },
+const struct nla_policy ethnl_coalesce_set_policy[] = {
        [ETHTOOL_A_COALESCE_HEADER]             = { .type = NLA_NESTED },
        [ETHTOOL_A_COALESCE_RX_USECS]           = { .type = NLA_U32 },
        [ETHTOOL_A_COALESCE_RX_MAX_FRAMES]      = { .type = NLA_U32 },
 
 #define DEBUG_REPDATA(__reply_base) \
        container_of(__reply_base, struct debug_reply_data, base)
 
-const struct nla_policy ethnl_debug_get_policy[ETHTOOL_A_DEBUG_MAX + 1] = {
-       [ETHTOOL_A_DEBUG_UNSPEC]        = { .type = NLA_REJECT },
+const struct nla_policy ethnl_debug_get_policy[] = {
        [ETHTOOL_A_DEBUG_HEADER]        = { .type = NLA_NESTED },
-       [ETHTOOL_A_DEBUG_MSGMASK]       = { .type = NLA_REJECT },
 };
 
 static int debug_prepare_data(const struct ethnl_req_info *req_base,
 
 /* DEBUG_SET */
 
-const struct nla_policy ethnl_debug_set_policy[ETHTOOL_A_DEBUG_MAX + 1] = {
-       [ETHTOOL_A_DEBUG_UNSPEC]        = { .type = NLA_REJECT },
+const struct nla_policy ethnl_debug_set_policy[] = {
        [ETHTOOL_A_DEBUG_HEADER]        = { .type = NLA_NESTED },
        [ETHTOOL_A_DEBUG_MSGMASK]       = { .type = NLA_NESTED },
 };
 
 #define EEE_REPDATA(__reply_base) \
        container_of(__reply_base, struct eee_reply_data, base)
 
-const struct nla_policy ethnl_eee_get_policy[ETHTOOL_A_EEE_MAX + 1] = {
-       [ETHTOOL_A_EEE_UNSPEC]          = { .type = NLA_REJECT },
+const struct nla_policy ethnl_eee_get_policy[] = {
        [ETHTOOL_A_EEE_HEADER]          = { .type = NLA_NESTED },
-       [ETHTOOL_A_EEE_MODES_OURS]      = { .type = NLA_REJECT },
-       [ETHTOOL_A_EEE_MODES_PEER]      = { .type = NLA_REJECT },
-       [ETHTOOL_A_EEE_ACTIVE]          = { .type = NLA_REJECT },
-       [ETHTOOL_A_EEE_ENABLED]         = { .type = NLA_REJECT },
-       [ETHTOOL_A_EEE_TX_LPI_ENABLED]  = { .type = NLA_REJECT },
-       [ETHTOOL_A_EEE_TX_LPI_TIMER]    = { .type = NLA_REJECT },
 };
 
 static int eee_prepare_data(const struct ethnl_req_info *req_base,
 
 /* EEE_SET */
 
-const struct nla_policy ethnl_eee_set_policy[ETHTOOL_A_EEE_MAX + 1] = {
-       [ETHTOOL_A_EEE_UNSPEC]          = { .type = NLA_REJECT },
+const struct nla_policy ethnl_eee_set_policy[] = {
        [ETHTOOL_A_EEE_HEADER]          = { .type = NLA_NESTED },
        [ETHTOOL_A_EEE_MODES_OURS]      = { .type = NLA_NESTED },
-       [ETHTOOL_A_EEE_MODES_PEER]      = { .type = NLA_REJECT },
-       [ETHTOOL_A_EEE_ACTIVE]          = { .type = NLA_REJECT },
        [ETHTOOL_A_EEE_ENABLED]         = { .type = NLA_U8 },
        [ETHTOOL_A_EEE_TX_LPI_ENABLED]  = { .type = NLA_U8 },
        [ETHTOOL_A_EEE_TX_LPI_TIMER]    = { .type = NLA_U32 },
 
 #define FEATURES_REPDATA(__reply_base) \
        container_of(__reply_base, struct features_reply_data, base)
 
-const struct nla_policy
-ethnl_features_get_policy[ETHTOOL_A_FEATURES_MAX + 1] = {
-       [ETHTOOL_A_FEATURES_UNSPEC]     = { .type = NLA_REJECT },
+const struct nla_policy ethnl_features_get_policy[] = {
        [ETHTOOL_A_FEATURES_HEADER]     = { .type = NLA_NESTED },
-       [ETHTOOL_A_FEATURES_HW]         = { .type = NLA_REJECT },
-       [ETHTOOL_A_FEATURES_WANTED]     = { .type = NLA_REJECT },
-       [ETHTOOL_A_FEATURES_ACTIVE]     = { .type = NLA_REJECT },
-       [ETHTOOL_A_FEATURES_NOCHANGE]   = { .type = NLA_REJECT },
 };
 
 static void ethnl_features_to_bitmap32(u32 *dest, netdev_features_t src)
 
 /* FEATURES_SET */
 
-const struct nla_policy
-ethnl_features_set_policy[ETHTOOL_A_FEATURES_MAX + 1] = {
-       [ETHTOOL_A_FEATURES_UNSPEC]     = { .type = NLA_REJECT },
+const struct nla_policy ethnl_features_set_policy[] = {
        [ETHTOOL_A_FEATURES_HEADER]     = { .type = NLA_NESTED },
-       [ETHTOOL_A_FEATURES_HW]         = { .type = NLA_REJECT },
        [ETHTOOL_A_FEATURES_WANTED]     = { .type = NLA_NESTED },
-       [ETHTOOL_A_FEATURES_ACTIVE]     = { .type = NLA_REJECT },
-       [ETHTOOL_A_FEATURES_NOCHANGE]   = { .type = NLA_REJECT },
 };
 
 static void ethnl_features_to_bitmap(unsigned long *dest, netdev_features_t val)
 
 #define LINKINFO_REPDATA(__reply_base) \
        container_of(__reply_base, struct linkinfo_reply_data, base)
 
-const struct nla_policy
-ethnl_linkinfo_get_policy[ETHTOOL_A_LINKINFO_MAX + 1] = {
-       [ETHTOOL_A_LINKINFO_UNSPEC]             = { .type = NLA_REJECT },
+const struct nla_policy ethnl_linkinfo_get_policy[] = {
        [ETHTOOL_A_LINKINFO_HEADER]             = { .type = NLA_NESTED },
-       [ETHTOOL_A_LINKINFO_PORT]               = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKINFO_PHYADDR]            = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKINFO_TP_MDIX]            = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKINFO_TP_MDIX_CTRL]       = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKINFO_TRANSCEIVER]        = { .type = NLA_REJECT },
 };
 
 static int linkinfo_prepare_data(const struct ethnl_req_info *req_base,
 
 /* LINKINFO_SET */
 
-const struct nla_policy
-ethnl_linkinfo_set_policy[ETHTOOL_A_LINKINFO_MAX + 1] = {
-       [ETHTOOL_A_LINKINFO_UNSPEC]             = { .type = NLA_REJECT },
+const struct nla_policy ethnl_linkinfo_set_policy[] = {
        [ETHTOOL_A_LINKINFO_HEADER]             = { .type = NLA_NESTED },
        [ETHTOOL_A_LINKINFO_PORT]               = { .type = NLA_U8 },
        [ETHTOOL_A_LINKINFO_PHYADDR]            = { .type = NLA_U8 },
-       [ETHTOOL_A_LINKINFO_TP_MDIX]            = { .type = NLA_REJECT },
        [ETHTOOL_A_LINKINFO_TP_MDIX_CTRL]       = { .type = NLA_U8 },
-       [ETHTOOL_A_LINKINFO_TRANSCEIVER]        = { .type = NLA_REJECT },
 };
 
 int ethnl_set_linkinfo(struct sk_buff *skb, struct genl_info *info)
 
 #define LINKMODES_REPDATA(__reply_base) \
        container_of(__reply_base, struct linkmodes_reply_data, base)
 
-const struct nla_policy
-ethnl_linkmodes_get_policy[ETHTOOL_A_LINKMODES_MAX + 1] = {
-       [ETHTOOL_A_LINKMODES_UNSPEC]            = { .type = NLA_REJECT },
+const struct nla_policy ethnl_linkmodes_get_policy[] = {
        [ETHTOOL_A_LINKMODES_HEADER]            = { .type = NLA_NESTED },
-       [ETHTOOL_A_LINKMODES_AUTONEG]           = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKMODES_OURS]              = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKMODES_PEER]              = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKMODES_SPEED]             = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKMODES_DUPLEX]            = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG]  = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE]        = { .type = NLA_REJECT },
 };
 
 static int linkmodes_prepare_data(const struct ethnl_req_info *req_base,
        __DEFINE_LINK_MODE_PARAMS(100, FX, Full),
 };
 
-const struct nla_policy
-ethnl_linkmodes_set_policy[ETHTOOL_A_LINKMODES_MAX + 1] = {
-       [ETHTOOL_A_LINKMODES_UNSPEC]            = { .type = NLA_REJECT },
+const struct nla_policy ethnl_linkmodes_set_policy[] = {
        [ETHTOOL_A_LINKMODES_HEADER]            = { .type = NLA_NESTED },
        [ETHTOOL_A_LINKMODES_AUTONEG]           = { .type = NLA_U8 },
        [ETHTOOL_A_LINKMODES_OURS]              = { .type = NLA_NESTED },
-       [ETHTOOL_A_LINKMODES_PEER]              = { .type = NLA_REJECT },
        [ETHTOOL_A_LINKMODES_SPEED]             = { .type = NLA_U32 },
        [ETHTOOL_A_LINKMODES_DUPLEX]            = { .type = NLA_U8 },
        [ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG]  = { .type = NLA_U8 },
-       [ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE]        = { .type = NLA_REJECT },
 };
 
 /* Set advertised link modes to all supported modes matching requested speed
 
 #define LINKSTATE_REPDATA(__reply_base) \
        container_of(__reply_base, struct linkstate_reply_data, base)
 
-const struct nla_policy
-ethnl_linkstate_get_policy[ETHTOOL_A_LINKSTATE_MAX + 1] = {
-       [ETHTOOL_A_LINKSTATE_UNSPEC]            = { .type = NLA_REJECT },
+const struct nla_policy ethnl_linkstate_get_policy[] = {
        [ETHTOOL_A_LINKSTATE_HEADER]            = { .type = NLA_NESTED },
-       [ETHTOOL_A_LINKSTATE_LINK]              = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKSTATE_SQI]               = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKSTATE_SQI_MAX]           = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKSTATE_EXT_STATE]         = { .type = NLA_REJECT },
-       [ETHTOOL_A_LINKSTATE_EXT_SUBSTATE]      = { .type = NLA_REJECT },
 };
 
 static int linkstate_get_sqi(struct net_device *dev)
 
 static bool ethnl_ok __read_mostly;
 static u32 ethnl_bcast_seq;
 
-static const struct nla_policy ethnl_header_policy[ETHTOOL_A_HEADER_MAX + 1] = {
-       [ETHTOOL_A_HEADER_UNSPEC]       = { .type = NLA_REJECT },
+static const struct nla_policy ethnl_header_policy[] = {
        [ETHTOOL_A_HEADER_DEV_INDEX]    = { .type = NLA_U32 },
        [ETHTOOL_A_HEADER_DEV_NAME]     = { .type = NLA_NUL_STRING,
                                            .len = ALTIFNAMSIZ - 1 },
                               const struct nlattr *header, struct net *net,
                               struct netlink_ext_ack *extack, bool require_dev)
 {
-       struct nlattr *tb[ETHTOOL_A_HEADER_MAX + 1];
+       struct nlattr *tb[ARRAY_SIZE(ethnl_header_policy)];
        const struct nlattr *devname_attr;
        struct net_device *dev = NULL;
        u32 flags = 0;
                NL_SET_ERR_MSG(extack, "request header missing");
                return -EINVAL;
        }
-       ret = nla_parse_nested(tb, ETHTOOL_A_HEADER_MAX, header,
+       ret = nla_parse_nested(tb, ARRAY_SIZE(ethnl_header_policy) - 1, header,
                               ethnl_header_policy, extack);
        if (ret < 0)
                return ret;
 
 extern const struct ethnl_request_ops ethnl_eee_request_ops;
 extern const struct ethnl_request_ops ethnl_tsinfo_request_ops;
 
-extern const struct nla_policy ethnl_strset_get_policy[ETHTOOL_A_STRSET_MAX + 1];
-extern const struct nla_policy ethnl_linkinfo_get_policy[ETHTOOL_A_LINKINFO_MAX + 1];
-extern const struct nla_policy ethnl_linkinfo_set_policy[ETHTOOL_A_LINKINFO_MAX + 1];
-extern const struct nla_policy ethnl_linkmodes_get_policy[ETHTOOL_A_LINKMODES_MAX + 1];
-extern const struct nla_policy ethnl_linkmodes_set_policy[ETHTOOL_A_LINKMODES_MAX + 1];
-extern const struct nla_policy ethnl_linkstate_get_policy[ETHTOOL_A_LINKSTATE_MAX + 1];
-extern const struct nla_policy ethnl_debug_get_policy[ETHTOOL_A_DEBUG_MAX + 1];
-extern const struct nla_policy ethnl_debug_set_policy[ETHTOOL_A_DEBUG_MAX + 1];
-extern const struct nla_policy ethnl_wol_get_policy[ETHTOOL_A_WOL_MAX + 1];
-extern const struct nla_policy ethnl_wol_set_policy[ETHTOOL_A_WOL_MAX + 1];
-extern const struct nla_policy ethnl_features_get_policy[ETHTOOL_A_FEATURES_MAX + 1];
-extern const struct nla_policy ethnl_features_set_policy[ETHTOOL_A_FEATURES_MAX + 1];
-extern const struct nla_policy ethnl_privflags_get_policy[ETHTOOL_A_PRIVFLAGS_MAX + 1];
-extern const struct nla_policy ethnl_privflags_set_policy[ETHTOOL_A_PRIVFLAGS_MAX + 1];
-extern const struct nla_policy ethnl_rings_get_policy[ETHTOOL_A_RINGS_MAX + 1];
-extern const struct nla_policy ethnl_rings_set_policy[ETHTOOL_A_RINGS_MAX + 1];
-extern const struct nla_policy ethnl_channels_get_policy[ETHTOOL_A_CHANNELS_MAX + 1];
-extern const struct nla_policy ethnl_channels_set_policy[ETHTOOL_A_CHANNELS_MAX + 1];
-extern const struct nla_policy ethnl_coalesce_get_policy[ETHTOOL_A_COALESCE_MAX + 1];
-extern const struct nla_policy ethnl_coalesce_set_policy[ETHTOOL_A_COALESCE_MAX + 1];
-extern const struct nla_policy ethnl_pause_get_policy[ETHTOOL_A_PAUSE_MAX + 1];
-extern const struct nla_policy ethnl_pause_set_policy[ETHTOOL_A_PAUSE_MAX + 1];
-extern const struct nla_policy ethnl_eee_get_policy[ETHTOOL_A_EEE_MAX + 1];
-extern const struct nla_policy ethnl_eee_set_policy[ETHTOOL_A_EEE_MAX + 1];
-extern const struct nla_policy ethnl_tsinfo_get_policy[ETHTOOL_A_TSINFO_MAX + 1];
-extern const struct nla_policy ethnl_cable_test_act_policy[ETHTOOL_A_CABLE_TEST_MAX + 1];
-extern const struct nla_policy ethnl_cable_test_tdr_act_policy[ETHTOOL_A_CABLE_TEST_TDR_MAX + 1];
-extern const struct nla_policy ethnl_tunnel_info_get_policy[ETHTOOL_A_TUNNEL_INFO_MAX + 1];
+extern const struct nla_policy ethnl_strset_get_policy[ETHTOOL_A_STRSET_STRINGSETS + 1];
+extern const struct nla_policy ethnl_linkinfo_get_policy[ETHTOOL_A_LINKINFO_HEADER + 1];
+extern const struct nla_policy ethnl_linkinfo_set_policy[ETHTOOL_A_LINKINFO_TP_MDIX_CTRL + 1];
+extern const struct nla_policy ethnl_linkmodes_get_policy[ETHTOOL_A_LINKMODES_HEADER + 1];
+extern const struct nla_policy ethnl_linkmodes_set_policy[ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG + 1];
+extern const struct nla_policy ethnl_linkstate_get_policy[ETHTOOL_A_LINKSTATE_HEADER + 1];
+extern const struct nla_policy ethnl_debug_get_policy[ETHTOOL_A_DEBUG_HEADER + 1];
+extern const struct nla_policy ethnl_debug_set_policy[ETHTOOL_A_DEBUG_MSGMASK + 1];
+extern const struct nla_policy ethnl_wol_get_policy[ETHTOOL_A_WOL_HEADER + 1];
+extern const struct nla_policy ethnl_wol_set_policy[ETHTOOL_A_WOL_SOPASS + 1];
+extern const struct nla_policy ethnl_features_get_policy[ETHTOOL_A_FEATURES_HEADER + 1];
+extern const struct nla_policy ethnl_features_set_policy[ETHTOOL_A_FEATURES_WANTED + 1];
+extern const struct nla_policy ethnl_privflags_get_policy[ETHTOOL_A_PRIVFLAGS_HEADER + 1];
+extern const struct nla_policy ethnl_privflags_set_policy[ETHTOOL_A_PRIVFLAGS_FLAGS + 1];
+extern const struct nla_policy ethnl_rings_get_policy[ETHTOOL_A_RINGS_HEADER + 1];
+extern const struct nla_policy ethnl_rings_set_policy[ETHTOOL_A_RINGS_TX + 1];
+extern const struct nla_policy ethnl_channels_get_policy[ETHTOOL_A_CHANNELS_HEADER + 1];
+extern const struct nla_policy ethnl_channels_set_policy[ETHTOOL_A_CHANNELS_COMBINED_COUNT + 1];
+extern const struct nla_policy ethnl_coalesce_get_policy[ETHTOOL_A_COALESCE_HEADER + 1];
+extern const struct nla_policy ethnl_coalesce_set_policy[ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL + 1];
+extern const struct nla_policy ethnl_pause_get_policy[ETHTOOL_A_PAUSE_HEADER + 1];
+extern const struct nla_policy ethnl_pause_set_policy[ETHTOOL_A_PAUSE_TX + 1];
+extern const struct nla_policy ethnl_eee_get_policy[ETHTOOL_A_EEE_HEADER + 1];
+extern const struct nla_policy ethnl_eee_set_policy[ETHTOOL_A_EEE_TX_LPI_TIMER + 1];
+extern const struct nla_policy ethnl_tsinfo_get_policy[ETHTOOL_A_TSINFO_HEADER + 1];
+extern const struct nla_policy ethnl_cable_test_act_policy[ETHTOOL_A_CABLE_TEST_HEADER + 1];
+extern const struct nla_policy ethnl_cable_test_tdr_act_policy[ETHTOOL_A_CABLE_TEST_TDR_CFG + 1];
+extern const struct nla_policy ethnl_tunnel_info_get_policy[ETHTOOL_A_TUNNEL_INFO_HEADER + 1];
 
 int ethnl_set_linkinfo(struct sk_buff *skb, struct genl_info *info);
 int ethnl_set_linkmodes(struct sk_buff *skb, struct genl_info *info);
 
 #define PAUSE_REPDATA(__reply_base) \
        container_of(__reply_base, struct pause_reply_data, base)
 
-const struct nla_policy ethnl_pause_get_policy[ETHTOOL_A_PAUSE_MAX + 1] = {
-       [ETHTOOL_A_PAUSE_UNSPEC]                = { .type = NLA_REJECT },
+const struct nla_policy ethnl_pause_get_policy[] = {
        [ETHTOOL_A_PAUSE_HEADER]                = { .type = NLA_NESTED },
-       [ETHTOOL_A_PAUSE_AUTONEG]               = { .type = NLA_REJECT },
-       [ETHTOOL_A_PAUSE_RX]                    = { .type = NLA_REJECT },
-       [ETHTOOL_A_PAUSE_TX]                    = { .type = NLA_REJECT },
-       [ETHTOOL_A_PAUSE_STATS]                 = { .type = NLA_REJECT },
 };
 
 static void ethtool_stats_init(u64 *stats, unsigned int n)
 
 /* PAUSE_SET */
 
-const struct nla_policy ethnl_pause_set_policy[ETHTOOL_A_PAUSE_MAX + 1] = {
-       [ETHTOOL_A_PAUSE_UNSPEC]                = { .type = NLA_REJECT },
+const struct nla_policy ethnl_pause_set_policy[] = {
        [ETHTOOL_A_PAUSE_HEADER]                = { .type = NLA_NESTED },
        [ETHTOOL_A_PAUSE_AUTONEG]               = { .type = NLA_U8 },
        [ETHTOOL_A_PAUSE_RX]                    = { .type = NLA_U8 },
        [ETHTOOL_A_PAUSE_TX]                    = { .type = NLA_U8 },
-       [ETHTOOL_A_PAUSE_STATS]                 = { .type = NLA_REJECT },
 };
 
 int ethnl_set_pause(struct sk_buff *skb, struct genl_info *info)
 
 #define PRIVFLAGS_REPDATA(__reply_base) \
        container_of(__reply_base, struct privflags_reply_data, base)
 
-const struct nla_policy
-ethnl_privflags_get_policy[ETHTOOL_A_PRIVFLAGS_MAX + 1] = {
-       [ETHTOOL_A_PRIVFLAGS_UNSPEC]            = { .type = NLA_REJECT },
+const struct nla_policy ethnl_privflags_get_policy[] = {
        [ETHTOOL_A_PRIVFLAGS_HEADER]            = { .type = NLA_NESTED },
-       [ETHTOOL_A_PRIVFLAGS_FLAGS]             = { .type = NLA_REJECT },
 };
 
 static int ethnl_get_priv_flags_info(struct net_device *dev,
 
 /* PRIVFLAGS_SET */
 
-const struct nla_policy
-ethnl_privflags_set_policy[ETHTOOL_A_PRIVFLAGS_MAX + 1] = {
-       [ETHTOOL_A_PRIVFLAGS_UNSPEC]            = { .type = NLA_REJECT },
+const struct nla_policy ethnl_privflags_set_policy[] = {
        [ETHTOOL_A_PRIVFLAGS_HEADER]            = { .type = NLA_NESTED },
        [ETHTOOL_A_PRIVFLAGS_FLAGS]             = { .type = NLA_NESTED },
 };
 
 #define RINGS_REPDATA(__reply_base) \
        container_of(__reply_base, struct rings_reply_data, base)
 
-const struct nla_policy ethnl_rings_get_policy[ETHTOOL_A_RINGS_MAX + 1] = {
-       [ETHTOOL_A_RINGS_UNSPEC]                = { .type = NLA_REJECT },
+const struct nla_policy ethnl_rings_get_policy[] = {
        [ETHTOOL_A_RINGS_HEADER]                = { .type = NLA_NESTED },
-       [ETHTOOL_A_RINGS_RX_MAX]                = { .type = NLA_REJECT },
-       [ETHTOOL_A_RINGS_RX_MINI_MAX]           = { .type = NLA_REJECT },
-       [ETHTOOL_A_RINGS_RX_JUMBO_MAX]          = { .type = NLA_REJECT },
-       [ETHTOOL_A_RINGS_TX_MAX]                = { .type = NLA_REJECT },
-       [ETHTOOL_A_RINGS_RX]                    = { .type = NLA_REJECT },
-       [ETHTOOL_A_RINGS_RX_MINI]               = { .type = NLA_REJECT },
-       [ETHTOOL_A_RINGS_RX_JUMBO]              = { .type = NLA_REJECT },
-       [ETHTOOL_A_RINGS_TX]                    = { .type = NLA_REJECT },
 };
 
 static int rings_prepare_data(const struct ethnl_req_info *req_base,
 
 /* RINGS_SET */
 
-const struct nla_policy ethnl_rings_set_policy[ETHTOOL_A_RINGS_MAX + 1] = {
-       [ETHTOOL_A_RINGS_UNSPEC]                = { .type = NLA_REJECT },
+const struct nla_policy ethnl_rings_set_policy[] = {
        [ETHTOOL_A_RINGS_HEADER]                = { .type = NLA_NESTED },
-       [ETHTOOL_A_RINGS_RX_MAX]                = { .type = NLA_REJECT },
-       [ETHTOOL_A_RINGS_RX_MINI_MAX]           = { .type = NLA_REJECT },
-       [ETHTOOL_A_RINGS_RX_JUMBO_MAX]          = { .type = NLA_REJECT },
-       [ETHTOOL_A_RINGS_TX_MAX]                = { .type = NLA_REJECT },
        [ETHTOOL_A_RINGS_RX]                    = { .type = NLA_U32 },
        [ETHTOOL_A_RINGS_RX_MINI]               = { .type = NLA_U32 },
        [ETHTOOL_A_RINGS_RX_JUMBO]              = { .type = NLA_U32 },
 
 #define STRSET_REPDATA(__reply_base) \
        container_of(__reply_base, struct strset_reply_data, base)
 
-const struct nla_policy ethnl_strset_get_policy[ETHTOOL_A_STRSET_MAX + 1] = {
-       [ETHTOOL_A_STRSET_UNSPEC]       = { .type = NLA_REJECT },
+const struct nla_policy ethnl_strset_get_policy[] = {
        [ETHTOOL_A_STRSET_HEADER]       = { .type = NLA_NESTED },
        [ETHTOOL_A_STRSET_STRINGSETS]   = { .type = NLA_NESTED },
 };
 
-static const struct nla_policy
-get_stringset_policy[ETHTOOL_A_STRINGSET_MAX + 1] = {
-       [ETHTOOL_A_STRINGSET_UNSPEC]    = { .type = NLA_REJECT },
+static const struct nla_policy get_stringset_policy[] = {
        [ETHTOOL_A_STRINGSET_ID]        = { .type = NLA_U32 },
-       [ETHTOOL_A_STRINGSET_COUNT]     = { .type = NLA_REJECT },
-       [ETHTOOL_A_STRINGSET_STRINGS]   = { .type = NLA_REJECT },
 };
 
 /**
 static int strset_get_id(const struct nlattr *nest, u32 *val,
                         struct netlink_ext_ack *extack)
 {
-       struct nlattr *tb[ETHTOOL_A_STRINGSET_MAX + 1];
+       struct nlattr *tb[ARRAY_SIZE(get_stringset_policy)];
        int ret;
 
-       ret = nla_parse_nested(tb, ETHTOOL_A_STRINGSET_MAX, nest,
+       ret = nla_parse_nested(tb, ARRAY_SIZE(get_stringset_policy) - 1, nest,
                               get_stringset_policy, extack);
        if (ret < 0)
                return ret;
        return 0;
 }
 
-static const struct nla_policy
-strset_stringsets_policy[ETHTOOL_A_STRINGSETS_MAX + 1] = {
-       [ETHTOOL_A_STRINGSETS_UNSPEC]           = { .type = NLA_REJECT },
+static const struct nla_policy strset_stringsets_policy[] = {
        [ETHTOOL_A_STRINGSETS_STRINGSET]        = { .type = NLA_NESTED },
 };
 
 
        if (!nest)
                return 0;
-       ret = nla_validate_nested(nest, ETHTOOL_A_STRINGSETS_MAX,
+       ret = nla_validate_nested(nest,
+                                 ARRAY_SIZE(strset_stringsets_policy) - 1,
                                  strset_stringsets_policy, extack);
        if (ret < 0)
                return ret;
 
 #define TSINFO_REPDATA(__reply_base) \
        container_of(__reply_base, struct tsinfo_reply_data, base)
 
-const struct nla_policy ethnl_tsinfo_get_policy[ETHTOOL_A_TSINFO_MAX + 1] = {
-       [ETHTOOL_A_TSINFO_UNSPEC]               = { .type = NLA_REJECT },
+const struct nla_policy ethnl_tsinfo_get_policy[] = {
        [ETHTOOL_A_TSINFO_HEADER]               = { .type = NLA_NESTED },
-       [ETHTOOL_A_TSINFO_TIMESTAMPING]         = { .type = NLA_REJECT },
-       [ETHTOOL_A_TSINFO_TX_TYPES]             = { .type = NLA_REJECT },
-       [ETHTOOL_A_TSINFO_RX_FILTERS]           = { .type = NLA_REJECT },
-       [ETHTOOL_A_TSINFO_PHC_INDEX]            = { .type = NLA_REJECT },
 };
 
 static int tsinfo_prepare_data(const struct ethnl_req_info *req_base,
 
 #include "common.h"
 #include "netlink.h"
 
-const struct nla_policy
-ethnl_tunnel_info_get_policy[ETHTOOL_A_TUNNEL_INFO_MAX + 1] = {
-       [ETHTOOL_A_TUNNEL_INFO_UNSPEC]          = { .type = NLA_REJECT },
+const struct nla_policy ethnl_tunnel_info_get_policy[] = {
        [ETHTOOL_A_TUNNEL_INFO_HEADER]          = { .type = NLA_NESTED },
 };
 
 
 #define WOL_REPDATA(__reply_base) \
        container_of(__reply_base, struct wol_reply_data, base)
 
-const struct nla_policy ethnl_wol_get_policy[ETHTOOL_A_WOL_MAX + 1] = {
-       [ETHTOOL_A_WOL_UNSPEC]          = { .type = NLA_REJECT },
+const struct nla_policy ethnl_wol_get_policy[] = {
        [ETHTOOL_A_WOL_HEADER]          = { .type = NLA_NESTED },
-       [ETHTOOL_A_WOL_MODES]           = { .type = NLA_REJECT },
-       [ETHTOOL_A_WOL_SOPASS]          = { .type = NLA_REJECT },
 };
 
 static int wol_prepare_data(const struct ethnl_req_info *req_base,
 
 /* WOL_SET */
 
-const struct nla_policy ethnl_wol_set_policy[ETHTOOL_A_WOL_MAX + 1] = {
-       [ETHTOOL_A_WOL_UNSPEC]          = { .type = NLA_REJECT },
+const struct nla_policy ethnl_wol_set_policy[] = {
        [ETHTOOL_A_WOL_HEADER]          = { .type = NLA_NESTED },
        [ETHTOOL_A_WOL_MODES]           = { .type = NLA_NESTED },
        [ETHTOOL_A_WOL_SOPASS]          = { .type = NLA_BINARY,