diff options
-rw-r--r-- | net/sched/sch_red.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index ec0bd36e09a9..a392eaa4a0b4 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c | |||
@@ -157,7 +157,6 @@ static int red_offload(struct Qdisc *sch, bool enable) | |||
157 | .handle = sch->handle, | 157 | .handle = sch->handle, |
158 | .parent = sch->parent, | 158 | .parent = sch->parent, |
159 | }; | 159 | }; |
160 | int err; | ||
161 | 160 | ||
162 | if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc) | 161 | if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc) |
163 | return -EOPNOTSUPP; | 162 | return -EOPNOTSUPP; |
@@ -172,14 +171,7 @@ static int red_offload(struct Qdisc *sch, bool enable) | |||
172 | opt.command = TC_RED_DESTROY; | 171 | opt.command = TC_RED_DESTROY; |
173 | } | 172 | } |
174 | 173 | ||
175 | err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_RED, &opt); | 174 | return dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_RED, &opt); |
176 | |||
177 | if (!err && enable) | ||
178 | sch->flags |= TCQ_F_OFFLOADED; | ||
179 | else | ||
180 | sch->flags &= ~TCQ_F_OFFLOADED; | ||
181 | |||
182 | return err; | ||
183 | } | 175 | } |
184 | 176 | ||
185 | static void red_destroy(struct Qdisc *sch) | 177 | 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) | |||
297 | .stats.qstats = &sch->qstats, | 289 | .stats.qstats = &sch->qstats, |
298 | }, | 290 | }, |
299 | }; | 291 | }; |
292 | int err; | ||
293 | |||
294 | sch->flags &= ~TCQ_F_OFFLOADED; | ||
300 | 295 | ||
301 | if (!(sch->flags & TCQ_F_OFFLOADED)) | 296 | if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc) |
297 | return 0; | ||
298 | |||
299 | err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_RED, | ||
300 | &hw_stats); | ||
301 | if (err == -EOPNOTSUPP) | ||
302 | return 0; | 302 | return 0; |
303 | 303 | ||
304 | return dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_RED, | 304 | if (!err) |
305 | &hw_stats); | 305 | sch->flags |= TCQ_F_OFFLOADED; |
306 | |||
307 | return err; | ||
306 | } | 308 | } |
307 | 309 | ||
308 | static int red_dump(struct Qdisc *sch, struct sk_buff *skb) | 310 | static int red_dump(struct Qdisc *sch, struct sk_buff *skb) |