};
 };
 
-static inline bool tc_should_offload(const struct net_device *dev,
-                                    const struct tcf_proto *tp, u32 flags)
+static inline bool tc_can_offload(const struct net_device *dev,
+                                 const struct tcf_proto *tp)
 {
        const struct Qdisc *sch = tp->q;
        const struct Qdisc_class_ops *cops = sch->ops->cl_ops;
 
        if (!(dev->features & NETIF_F_HW_TC))
                return false;
-       if (flags & TCA_CLS_FLAGS_SKIP_HW)
-               return false;
        if (!dev->netdev_ops->ndo_setup_tc)
                return false;
        if (cops && cops->tcf_cl_offload)
        return true;
 }
 
+static inline bool tc_skip_hw(u32 flags)
+{
+       return (flags & TCA_CLS_FLAGS_SKIP_HW) ? true : false;
+}
+
+static inline bool tc_should_offload(const struct net_device *dev,
+                                    const struct tcf_proto *tp, u32 flags)
+{
+       if (tc_skip_hw(flags))
+               return false;
+       return tc_can_offload(dev, tp);
+}
+
 static inline bool tc_skip_sw(u32 flags)
 {
        return (flags & TCA_CLS_FLAGS_SKIP_SW) ? true : false;