diff options
author | David S. Miller <davem@davemloft.net> | 2020-08-18 13:02:51 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-08-18 13:02:51 -0700 |
commit | 5680790b2d85b9c920ad9f626289ccc2c4fbe244 (patch) | |
tree | 18b6a4c5eb0c1d56c13c0705f5e3115bd163d4e6 | |
parent | ab97a28908bff7ffdadd50da17c2b4d9a4dade86 (diff) | |
parent | c650e04898072e4b579cbf8d9dd5b86bcdbe9b00 (diff) | |
download | linux-riscv-5680790b2d85b9c920ad9f626289ccc2c4fbe244.tar.gz linux-riscv-5680790b2d85b9c920ad9f626289ccc2c4fbe244.tar.bz2 linux-riscv-5680790b2d85b9c920ad9f626289ccc2c4fbe244.zip |
Merge branch 'cxgb4-Fix-ethtool-selftest-flits-calculation'
Ganji Aravind says:
====================
cxgb4: Fix ethtool selftest flits calculation
Patch 1 will fix work request size calculation for loopback selftest.
Patch 2 will fix race between loopback selftest and normal Tx handler.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/sge.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c index d2b587d1670a..869431a1eedd 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c @@ -2553,19 +2553,22 @@ int cxgb4_selftest_lb_pkt(struct net_device *netdev) pkt_len = ETH_HLEN + sizeof(CXGB4_SELFTEST_LB_STR); - flits = DIV_ROUND_UP(pkt_len + sizeof(struct cpl_tx_pkt) + - sizeof(*wr), sizeof(__be64)); + flits = DIV_ROUND_UP(pkt_len + sizeof(*cpl) + sizeof(*wr), + sizeof(__be64)); ndesc = flits_to_desc(flits); lb = &pi->ethtool_lb; lb->loopback = 1; q = &adap->sge.ethtxq[pi->first_qset]; + __netif_tx_lock(q->txq, smp_processor_id()); reclaim_completed_tx(adap, &q->q, -1, true); credits = txq_avail(&q->q) - ndesc; - if (unlikely(credits < 0)) + if (unlikely(credits < 0)) { + __netif_tx_unlock(q->txq); return -ENOMEM; + } wr = (void *)&q->q.desc[q->q.pidx]; memset(wr, 0, sizeof(struct tx_desc)); @@ -2598,6 +2601,7 @@ int cxgb4_selftest_lb_pkt(struct net_device *netdev) init_completion(&lb->completion); txq_advance(&q->q, ndesc); cxgb4_ring_tx_db(adap, &q->q, ndesc); + __netif_tx_unlock(q->txq); /* wait for the pkt to return */ ret = wait_for_completion_timeout(&lb->completion, 10 * HZ); |