소스 검색

[realtek] Fix reopening of legacy-mode 8139 NIC

realtek_destroy_ring() currently does nothing if the card is operating
in legacy (pre-RTL8139C+) mode.  In particular, the producer and
consumer counters are incorrectly left holding their current values.
Virtual hardware (e.g. the emulated RTL8139 in qemu and similar VMs)
is tolerant of this behaviour, but real hardware will fail to transmit
if the descriptors are not used in the correct order.

Fix by resetting the producer and consumer counters in
realtek_destroy_ring() even if the card is operating in legacy mode.

Reported-by: Gelip <mrgelip@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 11 년 전
부모
커밋
5d3d62d8d7
1개의 변경된 파일5개의 추가작업 그리고 3개의 파일을 삭제
  1. 5
    3
      src/drivers/net/realtek.c

+ 5
- 3
src/drivers/net/realtek.c 파일 보기

@@ -549,7 +549,11 @@ static int realtek_create_ring ( struct realtek_nic *rtl,
549 549
 static void realtek_destroy_ring ( struct realtek_nic *rtl,
550 550
 				   struct realtek_ring *ring ) {
551 551
 
552
-	/* Do nothing in legacy mode */
552
+	/* Reset producer and consumer counters */
553
+	ring->prod = 0;
554
+	ring->cons = 0;
555
+
556
+	/* Do nothing more if in legacy mode */
553 557
 	if ( rtl->legacy )
554 558
 		return;
555 559
 
@@ -560,8 +564,6 @@ static void realtek_destroy_ring ( struct realtek_nic *rtl,
560 564
 	/* Free descriptor ring */
561 565
 	free_dma ( ring->desc, ring->len );
562 566
 	ring->desc = NULL;
563
-	ring->prod = 0;
564
-	ring->cons = 0;
565 567
 }
566 568
 
567 569
 /**

Loading…
취소
저장