|
@@ -157,7 +157,6 @@ static int red_offload(struct Qdisc *sch, bool enable)
|
|
|
.handle = sch->handle,
|
|
|
.parent = sch->parent,
|
|
|
};
|
|
|
- int err;
|
|
|
|
|
|
if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc)
|
|
|
return -EOPNOTSUPP;
|
|
@@ -172,14 +171,7 @@ static int red_offload(struct Qdisc *sch, bool enable)
|
|
|
opt.command = TC_RED_DESTROY;
|
|
|
}
|
|
|
|
|
|
- err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_RED, &opt);
|
|
|
-
|
|
|
- if (!err && enable)
|
|
|
- sch->flags |= TCQ_F_OFFLOADED;
|
|
|
- else
|
|
|
- sch->flags &= ~TCQ_F_OFFLOADED;
|
|
|
-
|
|
|
- return err;
|
|
|
+ return dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_RED, &opt);
|
|
|
}
|
|
|
|
|
|
static void red_destroy(struct Qdisc *sch)
|
|
@@ -297,12 +289,22 @@ static int red_dump_offload_stats(struct Qdisc *sch, struct tc_red_qopt *opt)
|
|
|
.stats.qstats = &sch->qstats,
|
|
|
},
|
|
|
};
|
|
|
+ int err;
|
|
|
+
|
|
|
+ sch->flags &= ~TCQ_F_OFFLOADED;
|
|
|
|
|
|
- if (!(sch->flags & TCQ_F_OFFLOADED))
|
|
|
+ if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_RED,
|
|
|
+ &hw_stats);
|
|
|
+ if (err == -EOPNOTSUPP)
|
|
|
return 0;
|
|
|
|
|
|
- return dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_RED,
|
|
|
- &hw_stats);
|
|
|
+ if (!err)
|
|
|
+ sch->flags |= TCQ_F_OFFLOADED;
|
|
|
+
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static int red_dump(struct Qdisc *sch, struct sk_buff *skb)
|