Skip to content

Commit

Permalink
[realtek] Fix reopening of legacy-mode 8139 NIC
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcb30 committed May 26, 2013
1 parent c4bce43 commit 5d3d62d
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions src/drivers/net/realtek.c
Expand Up @@ -549,7 +549,11 @@ static int realtek_create_ring ( struct realtek_nic *rtl,
static void realtek_destroy_ring ( struct realtek_nic *rtl,
struct realtek_ring *ring ) {

/* Do nothing in legacy mode */
/* Reset producer and consumer counters */
ring->prod = 0;
ring->cons = 0;

/* Do nothing more if in legacy mode */
if ( rtl->legacy )
return;

Expand All @@ -560,8 +564,6 @@ static void realtek_destroy_ring ( struct realtek_nic *rtl,
/* Free descriptor ring */
free_dma ( ring->desc, ring->len );
ring->desc = NULL;
ring->prod = 0;
ring->cons = 0;
}

/**
Expand Down

0 comments on commit 5d3d62d

Please sign in to comment.