net: ti: am65-cpsw-nuss: Fix crash when changing number of TX queues
authorVignesh Raghavendra <vigneshr@ti.com>
Tue, 22 Jun 2021 14:38:57 +0000 (20:08 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Jul 2021 14:56:26 +0000 (16:56 +0200)
commit997285646a9c8455fe09128717ccd18275dd7118
tree64ba7c65ac6dc8ac47a648a5e2ff484f67c3f4e6
parent6610d5a73b6f9a30a7398f88a9bf09105476f83d
net: ti: am65-cpsw-nuss: Fix crash when changing number of TX queues

[ Upstream commit ce8eb4c728ef40b554b4f3d8963f11ed44502e00 ]

When changing number of TX queues using ethtool:

# ethtool -L eth0 tx 1
[  135.301047] Unable to handle kernel paging request at virtual address 00000000af5d0000
[...]
[  135.525128] Call trace:
[  135.525142]  dma_release_from_dev_coherent+0x2c/0xb0
[  135.525148]  dma_free_attrs+0x54/0xe0
[  135.525156]  k3_cppi_desc_pool_destroy+0x50/0xa0
[  135.525164]  am65_cpsw_nuss_remove_tx_chns+0x88/0xdc
[  135.525171]  am65_cpsw_set_channels+0x3c/0x70
[...]

This is because k3_cppi_desc_pool_destroy() which is called after
k3_udma_glue_release_tx_chn() in am65_cpsw_nuss_remove_tx_chns()
references struct device that is unregistered at the end of
k3_udma_glue_release_tx_chn()

Therefore the right order is to call k3_cppi_desc_pool_destroy() and
destroy desc pool before calling k3_udma_glue_release_tx_chn().
Fix this throughout the driver.

Fixes: 93a76530316a ("net: ethernet: ti: introduce am65x/j721e gigabit eth subsystem driver")
Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/ti/am65-cpsw-nuss.c