summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2020-04-24 16:44:55 -0700
committerDavid S. Miller <davem@davemloft.net>2020-04-24 16:44:55 -0700
commit6861d6d9cf36eac894ad235e75b3cf8bc0590f62 (patch)
tree7f1350e7a0f69d89c3506217c4bd32e4f6f8dfd9
parent92dc39fd4047c8fb7573df5247a81717bc10e247 (diff)
parentb89c1e6bdc73f5775e118eb2ab778e75b262b30c (diff)
downloadlinux-6861d6d9cf36eac894ad235e75b3cf8bc0590f62.tar.bz2
Merge branch 'qdisc-noop'
Jesper Dangaard Brouer says: ==================== Fix qdisc noop issue caused by driver and identify future bugs I've been very puzzled why networking on my NXP development board, using driver dpaa2-eth, stopped working when I updated the kernel version >= 5.3. The observable issue were that interface would drop all TX packets, because it had assigned the qdisc noop. This turned out the be a NIC driver bug, that would only get triggered when using sysctl net/core/default_qdisc=fq_codel. It was non-trivial to find out[1] this was driver related. Thus, this patchset besides fixing the driver bug, also helps end-user identify the issue. [1]: https://github.com/xdp-project/xdp-project/blob/master/areas/arm64/board_nxp_ls1088/nxp-board04-troubleshoot-qdisc.org ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c4
-rw-r--r--net/sched/cls_api.c5
2 files changed, 6 insertions, 3 deletions
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
index 9d4061bba0b8..d271c016229d 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
@@ -2021,7 +2021,7 @@ static int dpaa2_eth_setup_tc(struct net_device *net_dev,
int i;
if (type != TC_SETUP_QDISC_MQPRIO)
- return -EINVAL;
+ return -EOPNOTSUPP;
mqprio->hw = TC_MQPRIO_HW_OFFLOAD_TCS;
num_queues = dpaa2_eth_queue_count(priv);
@@ -2033,7 +2033,7 @@ static int dpaa2_eth_setup_tc(struct net_device *net_dev,
if (num_tc > dpaa2_eth_tc_count(priv)) {
netdev_err(net_dev, "Max %d traffic classes supported\n",
dpaa2_eth_tc_count(priv));
- return -EINVAL;
+ return -EOPNOTSUPP;
}
if (!num_tc) {
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index 55bd1429678f..11b683c45c28 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -735,8 +735,11 @@ static int tcf_block_offload_cmd(struct tcf_block *block,
INIT_LIST_HEAD(&bo.cb_list);
err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_BLOCK, &bo);
- if (err < 0)
+ if (err < 0) {
+ if (err != -EOPNOTSUPP)
+ NL_SET_ERR_MSG(extack, "Driver ndo_setup_tc failed");
return err;
+ }
return tcf_block_setup(block, &bo);
}