All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] net: eth-uclass: Fix eth_halt
@ 2022-03-28  9:57 qianfanguijin
  2022-03-28  9:57 ` [PATCH v2 2/2] net: eth-uclass: Fix data abort when tftp get nonexistent file via usb qianfanguijin
  0 siblings, 1 reply; 4+ messages in thread
From: qianfanguijin @ 2022-03-28  9:57 UTC (permalink / raw)
  To: u-boot
  Cc: Joe Hershberger, Ramon Fried, Matthias Schiffer,
	Heinrich Schuchardt, qianfan Zhao

From: qianfan Zhao <qianfanguijin@163.com>

eth_device_priv maybe unaccessable after @stop handler due to eth device
is removed in @stop. Setting private data before @stop handler.

This also fix data abort bug when run dhcp or tftp command via usbnet.

Signed-off-by: qianfan Zhao <qianfanguijin@163.com>
---
 net/eth-uclass.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/net/eth-uclass.c b/net/eth-uclass.c
index 58c308f332..c6eb1bc8f8 100644
--- a/net/eth-uclass.c
+++ b/net/eth-uclass.c
@@ -338,9 +338,14 @@ void eth_halt(void)
 	if (!priv || !priv->running)
 		return;
 
-	eth_get_ops(current)->stop(current);
-	priv->state = ETH_STATE_PASSIVE;
+	/* Make sure setting private data before @stop handler, it may remove
+	 * ethernet device and will cause @priv unaccessable.
+	 * eg:
+	 * usb_eth_stop -> usb_gadget_release -> device_remove
+	 */
 	priv->running = false;
+
+	eth_get_ops(current)->stop(current);
 }
 
 int eth_is_active(struct udevice *dev)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 2/2] net: eth-uclass: Fix data abort when tftp get nonexistent file via usb
  2022-03-28  9:57 [PATCH v2 1/2] net: eth-uclass: Fix eth_halt qianfanguijin
@ 2022-03-28  9:57 ` qianfanguijin
  2022-04-01 19:23   ` Ramon Fried
  0 siblings, 1 reply; 4+ messages in thread
From: qianfanguijin @ 2022-03-28  9:57 UTC (permalink / raw)
  To: u-boot
  Cc: Joe Hershberger, Ramon Fried, Matthias Schiffer,
	Heinrich Schuchardt, qianfan Zhao

From: qianfan Zhao <qianfanguijin@163.com>

tftp_handler do eth_halt when TFTP_ERROR, but eth_halt will remove eth
device if it is an usb network. usbeth's private data will be unaccessable
when usb_eth_free_pkt, touch it will trigger data abort.

Next is the console messages:

=> tftp xxx
...
Loading: *
TFTP error: 'open failed: No such file or directory' (1)
Not retrying...
data abort
pc : [<9feb6ba2>]          lr : [<9feb6b9f>]

Fix it.

Signed-off-by: qianfan Zhao <qianfanguijin@163.com>
---
 net/eth-uclass.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/net/eth-uclass.c b/net/eth-uclass.c
index c6eb1bc8f8..27baf52c26 100644
--- a/net/eth-uclass.c
+++ b/net/eth-uclass.c
@@ -405,6 +405,13 @@ int eth_rx(void)
 		flags = 0;
 		if (ret > 0)
 			net_process_received_packet(packet, ret);
+
+		/* ethernet maybe halted when packet_handler, check again */
+		if (!eth_is_active(current)) {
+			ret = 0;
+			break;
+		}
+
 		if (ret >= 0 && eth_get_ops(current)->free_pkt)
 			eth_get_ops(current)->free_pkt(current, packet, ret);
 		if (ret <= 0)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 2/2] net: eth-uclass: Fix data abort when tftp get nonexistent file via usb
  2022-03-28  9:57 ` [PATCH v2 2/2] net: eth-uclass: Fix data abort when tftp get nonexistent file via usb qianfanguijin
@ 2022-04-01 19:23   ` Ramon Fried
  0 siblings, 0 replies; 4+ messages in thread
From: Ramon Fried @ 2022-04-01 19:23 UTC (permalink / raw)
  To: qianfanguijin
  Cc: U-Boot Mailing List, Joe Hershberger, Matthias Schiffer,
	Heinrich Schuchardt

On Mon, Mar 28, 2022 at 12:58 PM <qianfanguijin@163.com> wrote:
>
> From: qianfan Zhao <qianfanguijin@163.com>
>
> tftp_handler do eth_halt when TFTP_ERROR, but eth_halt will remove eth
> device if it is an usb network. usbeth's private data will be unaccessable
> when usb_eth_free_pkt, touch it will trigger data abort.
>
> Next is the console messages:
>
> => tftp xxx
> ...
> Loading: *
> TFTP error: 'open failed: No such file or directory' (1)
> Not retrying...
> data abort
> pc : [<9feb6ba2>]          lr : [<9feb6b9f>]
>
> Fix it.
>
> Signed-off-by: qianfan Zhao <qianfanguijin@163.com>
> ---
>  net/eth-uclass.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/net/eth-uclass.c b/net/eth-uclass.c
> index c6eb1bc8f8..27baf52c26 100644
> --- a/net/eth-uclass.c
> +++ b/net/eth-uclass.c
> @@ -405,6 +405,13 @@ int eth_rx(void)
>                 flags = 0;
>                 if (ret > 0)
>                         net_process_received_packet(packet, ret);
> +
> +               /* ethernet maybe halted when packet_handler, check again */
> +               if (!eth_is_active(current)) {
> +                       ret = 0;
> +                       break;
> +               }
> +
>                 if (ret >= 0 && eth_get_ops(current)->free_pkt)
>                         eth_get_ops(current)->free_pkt(current, packet, ret);
>                 if (ret <= 0)
> --
> 2.17.1
>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2 1/2] net: eth-uclass: Fix eth_halt
@ 2022-04-02  2:58 qianfanguijin
  0 siblings, 0 replies; 4+ messages in thread
From: qianfanguijin @ 2022-04-02  2:58 UTC (permalink / raw)
  To: u-boot
  Cc: Joe Hershberger, Ramon Fried, Matthias Schiffer,
	Heinrich Schuchardt, qianfan Zhao

From: qianfan Zhao <qianfanguijin@163.com>

eth_device_priv maybe unaccessable after @stop handler due to eth device
is removed in @stop, touch it will trigger data abort.

Fix data abort bug when run dhcp or tftp command via usbnet.

Signed-off-by: qianfan Zhao <qianfanguijin@163.com>
---
 net/eth-uclass.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/net/eth-uclass.c b/net/eth-uclass.c
index 0da0e85be0..2b88b6c145 100644
--- a/net/eth-uclass.c
+++ b/net/eth-uclass.c
@@ -339,8 +339,15 @@ void eth_halt(void)
 		return;
 
 	eth_get_ops(current)->stop(current);
-	priv->state = ETH_STATE_PASSIVE;
-	priv->running = false;
+
+	/* ethernet device maybe removed when @stop handler, that will cause
+	 * @priv is freed. get private data again to avoid it
+	 */
+	priv = dev_get_uclass_priv(current);
+	if (priv) {
+		priv->state = ETH_STATE_PASSIVE;
+		priv->running = false;
+	}
 }
 
 int eth_is_active(struct udevice *dev)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-04-02  2:59 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-28  9:57 [PATCH v2 1/2] net: eth-uclass: Fix eth_halt qianfanguijin
2022-03-28  9:57 ` [PATCH v2 2/2] net: eth-uclass: Fix data abort when tftp get nonexistent file via usb qianfanguijin
2022-04-01 19:23   ` Ramon Fried
2022-04-02  2:58 [PATCH v2 1/2] net: eth-uclass: Fix eth_halt qianfanguijin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.