On a multi-port CPSW system, stopping and starting just one port (ndev) will not restart the queues if other ports (ndevs) are open.
Instead, check the usage_count variable to know if CPSW is running and if so restart all the queues. Signed-off-by: Roger Quadros <[email protected]> --- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c index d5f358ec982050751a63039e73887bf6e7f684e7..f8beb1735fb9cb75577e60f5b22111cb3a66acb9 100644 --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c @@ -1919,18 +1919,33 @@ static int am65_cpsw_xdp_prog_setup(struct net_device *ndev, struct bpf_prog *prog) { struct am65_cpsw_port *port = am65_ndev_to_port(ndev); - bool running = netif_running(ndev); + struct am65_cpsw_common *common = port->common; + bool running = !!port->common->usage_count; struct bpf_prog *old_prog; + int ret; - if (running) - am65_cpsw_nuss_ndo_slave_stop(ndev); + if (running) { + /* stop all queues */ + am65_cpsw_destroy_txqs(common); + am65_cpsw_destroy_rxqs(common); + } old_prog = xchg(&port->xdp_prog, prog); if (old_prog) bpf_prog_put(old_prog); - if (running) - return am65_cpsw_nuss_ndo_slave_open(ndev); + if (running) { + /* start all queues */ + ret = am65_cpsw_create_rxqs(common); + if (ret) + return ret; + + ret = am65_cpsw_create_txqs(common); + if (ret) { + am65_cpsw_destroy_rxqs(common); + return ret; + } + } return 0; } -- 2.34.1
