mirror of https://github.com/xemu-project/xemu.git
net/cadence_gem: simplify rx buf descriptor walking
There was a replication of the rx descriptor address walking logic. Reorder the flow control to remove. This refactoring also obsoletes the local variables packet_desc_addr and last_desc_addr. Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> Message-id: 2a425b457ff0b57274bf206ad2236690cd7f5909.1386136219.git.peter.crosthwaite@xilinx.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
11785f5352
commit
7cfd65e41c
|
@ -586,7 +586,6 @@ static int gem_mac_address_filter(GemState *s, const uint8_t *packet)
|
||||||
static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
|
static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
|
||||||
{
|
{
|
||||||
unsigned desc[2];
|
unsigned desc[2];
|
||||||
hwaddr packet_desc_addr, last_desc_addr;
|
|
||||||
GemState *s;
|
GemState *s;
|
||||||
unsigned rxbufsize, bytes_to_copy;
|
unsigned rxbufsize, bytes_to_copy;
|
||||||
unsigned rxbuf_offset;
|
unsigned rxbuf_offset;
|
||||||
|
@ -667,17 +666,16 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
|
||||||
|
|
||||||
DB_PRINT("config bufsize: %d packet size: %ld\n", rxbufsize, size);
|
DB_PRINT("config bufsize: %d packet size: %ld\n", rxbufsize, size);
|
||||||
|
|
||||||
packet_desc_addr = s->rx_desc_addr;
|
while (bytes_to_copy) {
|
||||||
while (1) {
|
DB_PRINT("read descriptor 0x%x\n", (unsigned)s->rx_desc_addr);
|
||||||
DB_PRINT("read descriptor 0x%x\n", (unsigned)packet_desc_addr);
|
|
||||||
/* read current descriptor */
|
/* read current descriptor */
|
||||||
cpu_physical_memory_read(packet_desc_addr,
|
cpu_physical_memory_read(s->rx_desc_addr,
|
||||||
(uint8_t *)&desc[0], sizeof(desc));
|
(uint8_t *)&desc[0], sizeof(desc));
|
||||||
|
|
||||||
/* Descriptor owned by software ? */
|
/* Descriptor owned by software ? */
|
||||||
if (rx_desc_get_ownership(desc) == 1) {
|
if (rx_desc_get_ownership(desc) == 1) {
|
||||||
DB_PRINT("descriptor 0x%x owned by sw.\n",
|
DB_PRINT("descriptor 0x%x owned by sw.\n",
|
||||||
(unsigned)packet_desc_addr);
|
(unsigned)s->rx_desc_addr);
|
||||||
s->regs[GEM_RXSTATUS] |= GEM_RXSTATUS_NOBUF;
|
s->regs[GEM_RXSTATUS] |= GEM_RXSTATUS_NOBUF;
|
||||||
s->regs[GEM_ISR] |= GEM_INT_RXUSED & ~(s->regs[GEM_IMR]);
|
s->regs[GEM_ISR] |= GEM_INT_RXUSED & ~(s->regs[GEM_IMR]);
|
||||||
/* Handle interrupt consequences */
|
/* Handle interrupt consequences */
|
||||||
|
@ -705,36 +703,19 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
|
||||||
}
|
}
|
||||||
rx_desc_set_ownership(desc);
|
rx_desc_set_ownership(desc);
|
||||||
/* Descriptor write-back. */
|
/* Descriptor write-back. */
|
||||||
cpu_physical_memory_write(packet_desc_addr,
|
cpu_physical_memory_write(s->rx_desc_addr,
|
||||||
(uint8_t *)&desc[0], sizeof(desc));
|
(uint8_t *)&desc[0], sizeof(desc));
|
||||||
|
|
||||||
if (bytes_to_copy == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Next descriptor */
|
/* Next descriptor */
|
||||||
if (rx_desc_get_wrap(desc)) {
|
if (rx_desc_get_wrap(desc)) {
|
||||||
packet_desc_addr = s->regs[GEM_RXQBASE];
|
DB_PRINT("wrapping RX descriptor list\n");
|
||||||
|
s->rx_desc_addr = s->regs[GEM_RXQBASE];
|
||||||
} else {
|
} else {
|
||||||
packet_desc_addr += 8;
|
DB_PRINT("incrementing RX descriptor list\n");
|
||||||
|
s->rx_desc_addr += 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DB_PRINT("set length: %ld, EOF on descriptor 0x%x\n", size,
|
|
||||||
(unsigned)packet_desc_addr);
|
|
||||||
|
|
||||||
/* Advance RX packet descriptor Q */
|
|
||||||
last_desc_addr = packet_desc_addr;
|
|
||||||
packet_desc_addr = s->rx_desc_addr;
|
|
||||||
s->rx_desc_addr = last_desc_addr;
|
|
||||||
if (rx_desc_get_wrap(desc)) {
|
|
||||||
s->rx_desc_addr = s->regs[GEM_RXQBASE];
|
|
||||||
DB_PRINT("wrapping RX descriptor list\n");
|
|
||||||
} else {
|
|
||||||
DB_PRINT("incrementing RX descriptor list\n");
|
|
||||||
s->rx_desc_addr += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Count it */
|
/* Count it */
|
||||||
gem_receive_updatestats(s, buf, size);
|
gem_receive_updatestats(s, buf, size);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue