u64 max_rate[TC_QOPT_MAX_QUEUE];
 };
 
+static int mqprio_enable_offload(struct Qdisc *sch,
+                                const struct tc_mqprio_qopt *qopt)
+{
+       struct tc_mqprio_qopt_offload mqprio = {.qopt = *qopt};
+       struct mqprio_sched *priv = qdisc_priv(sch);
+       struct net_device *dev = qdisc_dev(sch);
+       int err, i;
+
+       switch (priv->mode) {
+       case TC_MQPRIO_MODE_DCB:
+               if (priv->shaper != TC_MQPRIO_SHAPER_DCB)
+                       return -EINVAL;
+               break;
+       case TC_MQPRIO_MODE_CHANNEL:
+               mqprio.flags = priv->flags;
+               if (priv->flags & TC_MQPRIO_F_MODE)
+                       mqprio.mode = priv->mode;
+               if (priv->flags & TC_MQPRIO_F_SHAPER)
+                       mqprio.shaper = priv->shaper;
+               if (priv->flags & TC_MQPRIO_F_MIN_RATE)
+                       for (i = 0; i < mqprio.qopt.num_tc; i++)
+                               mqprio.min_rate[i] = priv->min_rate[i];
+               if (priv->flags & TC_MQPRIO_F_MAX_RATE)
+                       for (i = 0; i < mqprio.qopt.num_tc; i++)
+                               mqprio.max_rate[i] = priv->max_rate[i];
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_MQPRIO,
+                                           &mqprio);
+       if (err)
+               return err;
+
+       priv->hw_offload = mqprio.qopt.hw;
+
+       return 0;
+}
+
+static void mqprio_disable_offload(struct Qdisc *sch)
+{
+       struct tc_mqprio_qopt_offload mqprio = { { 0 } };
+       struct mqprio_sched *priv = qdisc_priv(sch);
+       struct net_device *dev = qdisc_dev(sch);
+
+       switch (priv->mode) {
+       case TC_MQPRIO_MODE_DCB:
+       case TC_MQPRIO_MODE_CHANNEL:
+               dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_MQPRIO,
+                                             &mqprio);
+               break;
+       }
+}
+
 static void mqprio_destroy(struct Qdisc *sch)
 {
        struct net_device *dev = qdisc_dev(sch);
                kfree(priv->qdiscs);
        }
 
-       if (priv->hw_offload && dev->netdev_ops->ndo_setup_tc) {
-               struct tc_mqprio_qopt_offload mqprio = { { 0 } };
-
-               switch (priv->mode) {
-               case TC_MQPRIO_MODE_DCB:
-               case TC_MQPRIO_MODE_CHANNEL:
-                       dev->netdev_ops->ndo_setup_tc(dev,
-                                                     TC_SETUP_QDISC_MQPRIO,
-                                                     &mqprio);
-                       break;
-               default:
-                       return;
-               }
-       } else {
+       if (priv->hw_offload && dev->netdev_ops->ndo_setup_tc)
+               mqprio_disable_offload(sch);
+       else
                netdev_set_num_tc(dev, 0);
-       }
 }
 
 static int mqprio_parse_opt(struct net_device *dev, struct tc_mqprio_qopt *qopt)
         * supplied and verified mapping
         */
        if (qopt->hw) {
-               struct tc_mqprio_qopt_offload mqprio = {.qopt = *qopt};
-
-               switch (priv->mode) {
-               case TC_MQPRIO_MODE_DCB:
-                       if (priv->shaper != TC_MQPRIO_SHAPER_DCB)
-                               return -EINVAL;
-                       break;
-               case TC_MQPRIO_MODE_CHANNEL:
-                       mqprio.flags = priv->flags;
-                       if (priv->flags & TC_MQPRIO_F_MODE)
-                               mqprio.mode = priv->mode;
-                       if (priv->flags & TC_MQPRIO_F_SHAPER)
-                               mqprio.shaper = priv->shaper;
-                       if (priv->flags & TC_MQPRIO_F_MIN_RATE)
-                               for (i = 0; i < mqprio.qopt.num_tc; i++)
-                                       mqprio.min_rate[i] = priv->min_rate[i];
-                       if (priv->flags & TC_MQPRIO_F_MAX_RATE)
-                               for (i = 0; i < mqprio.qopt.num_tc; i++)
-                                       mqprio.max_rate[i] = priv->max_rate[i];
-                       break;
-               default:
-                       return -EINVAL;
-               }
-               err = dev->netdev_ops->ndo_setup_tc(dev,
-                                                   TC_SETUP_QDISC_MQPRIO,
-                                                   &mqprio);
+               err = mqprio_enable_offload(sch, qopt);
                if (err)
                        return err;
-
-               priv->hw_offload = mqprio.qopt.hw;
        } else {
                netdev_set_num_tc(dev, qopt->num_tc);
                for (i = 0; i < qopt->num_tc; i++)