#include "act.h"
 #include "en/tc_priv.h"
 
+static bool police_act_validate_control(enum flow_action_id act_id,
+                                       struct netlink_ext_ack *extack)
+{
+       if (act_id != FLOW_ACTION_PIPE &&
+           act_id != FLOW_ACTION_ACCEPT &&
+           act_id != FLOW_ACTION_JUMP &&
+           act_id != FLOW_ACTION_DROP) {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "Offload not supported when conform-exceed action is not pipe, ok, jump or drop");
+               return false;
+       }
+
+       return true;
+}
+
+static int police_act_validate(const struct flow_action_entry *act,
+                              struct netlink_ext_ack *extack)
+{
+       if (!police_act_validate_control(act->police.exceed.act_id, extack) ||
+           !police_act_validate_control(act->police.notexceed.act_id, extack))
+               return -EOPNOTSUPP;
+
+       if (act->police.peakrate_bytes_ps ||
+           act->police.avrate || act->police.overhead) {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "Offload not supported when peakrate/avrate/overhead is configured");
+               return -EOPNOTSUPP;
+       }
+
+       if (act->police.rate_pkt_ps) {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "QoS offload not support packets per second");
+               return -EOPNOTSUPP;
+       }
+
+       return 0;
+}
+
 static bool
 tc_act_can_offload_police(struct mlx5e_tc_act_parse_state *parse_state,
                          const struct flow_action_entry *act,
                          int act_index,
                          struct mlx5_flow_attr *attr)
 {
-       if (act->police.notexceed.act_id != FLOW_ACTION_PIPE &&
-           act->police.notexceed.act_id != FLOW_ACTION_ACCEPT) {
-               NL_SET_ERR_MSG_MOD(parse_state->extack,
-                                  "Offload not supported when conform action is not pipe or ok");
-               return false;
-       }
-       if (mlx5e_policer_validate(parse_state->flow_action, act,
-                                  parse_state->extack))
+       int err;
+
+       err = police_act_validate(act, parse_state->extack);
+       if (err)
                return false;
 
        return !!mlx5e_get_flow_meters(parse_state->flow->priv->mdev);
        struct mlx5e_flow_meter_handle *meter;
        int err = 0;
 
-       err = mlx5e_policer_validate(&fl_act->action, act, fl_act->extack);
+       err = police_act_validate(act, fl_act->extack);
        if (err)
                return err;
 
 
        return err;
 }
 
-int mlx5e_policer_validate(const struct flow_action *action,
-                          const struct flow_action_entry *act,
-                          struct netlink_ext_ack *extack)
+static int
+tc_matchall_police_validate(const struct flow_action *action,
+                           const struct flow_action_entry *act,
+                           struct netlink_ext_ack *extack)
 {
+       if (act->police.notexceed.act_id != FLOW_ACTION_CONTINUE) {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "Offload not supported when conform action is not continue");
+               return -EOPNOTSUPP;
+       }
+
        if (act->police.exceed.act_id != FLOW_ACTION_DROP) {
                NL_SET_ERR_MSG_MOD(extack,
                                   "Offload not supported when exceed action is not drop");
        flow_action_for_each(i, act, flow_action) {
                switch (act->id) {
                case FLOW_ACTION_POLICE:
-                       if (act->police.notexceed.act_id != FLOW_ACTION_CONTINUE) {
-                               NL_SET_ERR_MSG_MOD(extack,
-                                                  "Offload not supported when conform action is not continue");
-                               return -EOPNOTSUPP;
-                       }
-
-                       err = mlx5e_policer_validate(flow_action, act, extack);
+                       err = tc_matchall_police_validate(flow_action, act, extack);
                        if (err)
                                return err;