mirror of https://github.com/xqemu/xqemu.git
e1000: drop check_rxov, always treat RX ring with RDH == RDT as empty
Real HW always treats RX ring with RDH == RDT as empty. Emulation is supposed to behave the same. Reported-by: Chris Webb <chris.webb@elastichosts.com> Reported-by: Richard Davies <richard.davies@elastichosts.com> Signed-off-by: Dmitry Fleytman <dmitry@daynix.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
286d52ebfc
commit
e5b8b0d4ba
|
@ -92,7 +92,6 @@ typedef struct E1000State_st {
|
||||||
|
|
||||||
uint32_t rxbuf_size;
|
uint32_t rxbuf_size;
|
||||||
uint32_t rxbuf_min_shift;
|
uint32_t rxbuf_min_shift;
|
||||||
int check_rxov;
|
|
||||||
struct e1000_tx {
|
struct e1000_tx {
|
||||||
unsigned char header[256];
|
unsigned char header[256];
|
||||||
unsigned char vlan_header[4];
|
unsigned char vlan_header[4];
|
||||||
|
@ -741,11 +740,11 @@ static bool e1000_has_rxbufs(E1000State *s, size_t total_size)
|
||||||
int bufs;
|
int bufs;
|
||||||
/* Fast-path short packets */
|
/* Fast-path short packets */
|
||||||
if (total_size <= s->rxbuf_size) {
|
if (total_size <= s->rxbuf_size) {
|
||||||
return s->mac_reg[RDH] != s->mac_reg[RDT] || !s->check_rxov;
|
return s->mac_reg[RDH] != s->mac_reg[RDT];
|
||||||
}
|
}
|
||||||
if (s->mac_reg[RDH] < s->mac_reg[RDT]) {
|
if (s->mac_reg[RDH] < s->mac_reg[RDT]) {
|
||||||
bufs = s->mac_reg[RDT] - s->mac_reg[RDH];
|
bufs = s->mac_reg[RDT] - s->mac_reg[RDH];
|
||||||
} else if (s->mac_reg[RDH] > s->mac_reg[RDT] || !s->check_rxov) {
|
} else if (s->mac_reg[RDH] > s->mac_reg[RDT]) {
|
||||||
bufs = s->mac_reg[RDLEN] / sizeof(struct e1000_rx_desc) +
|
bufs = s->mac_reg[RDLEN] / sizeof(struct e1000_rx_desc) +
|
||||||
s->mac_reg[RDT] - s->mac_reg[RDH];
|
s->mac_reg[RDT] - s->mac_reg[RDH];
|
||||||
} else {
|
} else {
|
||||||
|
@ -848,7 +847,6 @@ e1000_receive(NetClientState *nc, const uint8_t *buf, size_t size)
|
||||||
|
|
||||||
if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
|
if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN])
|
||||||
s->mac_reg[RDH] = 0;
|
s->mac_reg[RDH] = 0;
|
||||||
s->check_rxov = 1;
|
|
||||||
/* see comment in start_xmit; same here */
|
/* see comment in start_xmit; same here */
|
||||||
if (s->mac_reg[RDH] == rdh_start) {
|
if (s->mac_reg[RDH] == rdh_start) {
|
||||||
DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
|
DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n",
|
||||||
|
@ -925,7 +923,6 @@ mac_writereg(E1000State *s, int index, uint32_t val)
|
||||||
static void
|
static void
|
||||||
set_rdt(E1000State *s, int index, uint32_t val)
|
set_rdt(E1000State *s, int index, uint32_t val)
|
||||||
{
|
{
|
||||||
s->check_rxov = 0;
|
|
||||||
s->mac_reg[index] = val & 0xffff;
|
s->mac_reg[index] = val & 0xffff;
|
||||||
if (e1000_has_rxbufs(s, 1)) {
|
if (e1000_has_rxbufs(s, 1)) {
|
||||||
qemu_flush_queued_packets(&s->nic->nc);
|
qemu_flush_queued_packets(&s->nic->nc);
|
||||||
|
|
Loading…
Reference in New Issue