aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias.schiffer@ew.tq-group.com>2024-04-26 10:02:25 +0200
committerTom Rini <trini@konsulko.com>2024-05-15 10:46:47 -0600
commit0898f44b23effb5a0efbbb9783f8669d02d67dca (patch)
treef96c762765412273c659bbf3b82a014241ce0a5e
parentef9d4da6c92b07f0668f059d0cdc51eb34ed947e (diff)
downloadu-boot-0898f44b23effb5a0efbbb9783f8669d02d67dca.zip
u-boot-0898f44b23effb5a0efbbb9783f8669d02d67dca.tar.gz
u-boot-0898f44b23effb5a0efbbb9783f8669d02d67dca.tar.bz2
net: ti: am65-cpsw-nuss: avoid errors due to imbalanced start()/stop()
The eth-uclass state machine doesn't prevent imbalanced start()/stop() calls - to the contrary, it even provides eth_init_state_only() and eth_halt_state_only() functions that change the state without any calls into the driver. This means that the driver must be robust against duplicate start() and stop() calls as well as send/recv calls while the interface is down. We decide not to print error messages but just to return an error in the latter case, as trying to send packets on a disabled interface commonly happens when the netconsole is still active after the Ethernet has been halted during bootm. Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
-rw-r--r--drivers/net/ti/am65-cpsw-nuss.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/ti/am65-cpsw-nuss.c b/drivers/net/ti/am65-cpsw-nuss.c
index 335c8be..e0968f6 100644
--- a/drivers/net/ti/am65-cpsw-nuss.c
+++ b/drivers/net/ti/am65-cpsw-nuss.c
@@ -327,6 +327,9 @@ static int am65_cpsw_start(struct udevice *dev)
struct ti_udma_drv_chan_cfg_data *dma_rx_cfg_data;
int ret, i;
+ if (common->started)
+ return 0;
+
ret = power_domain_on(&common->pwrdmn);
if (ret) {
dev_err(dev, "power_domain_on() failed %d\n", ret);
@@ -487,6 +490,9 @@ static int am65_cpsw_send(struct udevice *dev, void *packet, int length)
struct ti_udma_drv_packet_data packet_data;
int ret;
+ if (!common->started)
+ return -ENETDOWN;
+
packet_data.pkt_type = AM65_CPSW_CPPI_PKT_TYPE;
packet_data.dest_tag = priv->port_id;
ret = dma_send(&common->dma_tx, packet, length, &packet_data);
@@ -503,6 +509,9 @@ static int am65_cpsw_recv(struct udevice *dev, int flags, uchar **packetp)
struct am65_cpsw_priv *priv = dev_get_priv(dev);
struct am65_cpsw_common *common = priv->cpsw_common;
+ if (!common->started)
+ return -ENETDOWN;
+
/* try to receive a new packet */
return dma_receive(&common->dma_rx, (void **)packetp, NULL);
}