Skip to content

Commit 415f135

Browse files
Justin LaiPaolo Abeni
authored andcommitted
rtase: Fix improper release of ring list entries in rtase_sw_reset
Since rtase_init_ring, which is called within rtase_sw_reset, adds ring entries already present in the ring list back into the list, it causes the ring list to form a cycle. This results in list_for_each_entry_safe failing to find an endpoint during traversal, leading to an error. Therefore, it is necessary to remove the previously added ring_list nodes before calling rtase_init_ring. Fixes: 0796004 ("rtase: Implement net_device_ops") Signed-off-by: Justin Lai <[email protected]> Reviewed-by: Simon Horman <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
1 parent 3121a1e commit 415f135

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

drivers/net/ethernet/realtek/rtase/rtase_main.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,7 +1501,10 @@ static void rtase_wait_for_quiescence(const struct net_device *dev)
15011501
static void rtase_sw_reset(struct net_device *dev)
15021502
{
15031503
struct rtase_private *tp = netdev_priv(dev);
1504+
struct rtase_ring *ring, *tmp;
1505+
struct rtase_int_vector *ivec;
15041506
int ret;
1507+
u32 i;
15051508

15061509
netif_stop_queue(dev);
15071510
netif_carrier_off(dev);
@@ -1512,6 +1515,13 @@ static void rtase_sw_reset(struct net_device *dev)
15121515
rtase_tx_clear(tp);
15131516
rtase_rx_clear(tp);
15141517

1518+
for (i = 0; i < tp->int_nums; i++) {
1519+
ivec = &tp->int_vector[i];
1520+
list_for_each_entry_safe(ring, tmp, &ivec->ring_list,
1521+
ring_entry)
1522+
list_del(&ring->ring_entry);
1523+
}
1524+
15151525
ret = rtase_init_ring(dev);
15161526
if (ret) {
15171527
netdev_err(dev, "unable to init ring\n");

0 commit comments

Comments
 (0)