aboutsummaryrefslogtreecommitdiffstats
path: root/src/drivers/net
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2020-11-04 14:24:52 +0000
committerMichael Brown <mcb30@ipxe.org>2020-11-04 14:35:19 +0000
commitf560e7b70b5b1a3ecd2d03d8f319e79327dbd6c3 (patch)
tree6086472faef7124eae80c58c3bd06709ee5729e0 /src/drivers/net
parent9b25f6e5cf517f426de80ede618398ef01e385f9 (diff)
downloadipxe-f560e7b70b5b1a3ecd2d03d8f319e79327dbd6c3.tar.gz
[realtek] Reset NIC when closing interface if using legacy mode
The legacy transmit descriptor index is not reset by anything short of a full device reset. This can cause the legacy transmit ring to stall after closing and reopening the device, since the hardware and software indices will be out of sync. Fix by performing a reset after closing the interface. Do this only if operating in legacy mode, since in C+ mode the reset is not required and would undesirably clear additional state (such as the C+ command register itself). Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/net')
-rw-r--r--src/drivers/net/realtek.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/drivers/net/realtek.c b/src/drivers/net/realtek.c
index 0421b4db7..e74128c4c 100644
--- a/src/drivers/net/realtek.c
+++ b/src/drivers/net/realtek.c
@@ -768,6 +768,10 @@ static void realtek_close ( struct net_device *netdev ) {
/* Destroy transmit descriptor ring */
realtek_destroy_ring ( rtl, &rtl->tx );
+
+ /* Reset legacy transmit descriptor index, if applicable */
+ if ( rtl->legacy )
+ realtek_reset ( rtl );
}
/**