Navigation Menu

Skip to content

Commit

Permalink
[jme] Fix refill behavior
Browse files Browse the repository at this point in the history
After changing the driver to refill after feed, if any error occurs a
non-contiguous empty buffer will be introduced in the ring due to my
reuse-buffer-when-error implementation.

Reported-by: Marty Connor <mdc@etherboot.org>
Signed-off-by: Guo-Fu Tseng <cooldavid@cooldavid.org>
Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
cooldavid authored and mcb30 committed Jun 13, 2010
1 parent 75333f4 commit 1798e04
Showing 1 changed file with 13 additions and 7 deletions.
20 changes: 13 additions & 7 deletions src/drivers/net/jme.c
Expand Up @@ -590,17 +590,22 @@ jme_disable_rx_engine(struct jme_adapter *jme)
}

static void
jme_refill_rx_ring(struct jme_adapter *jme)
jme_refill_rx_ring(struct jme_adapter *jme, int curhole)
{
struct jme_ring *rxring = &jme->rxring;
int i = rxring->next_to_fill;
struct io_buffer **bufinf = rxring->bufinf;
int mask = jme->rx_ring_mask;
int limit = jme->rx_ring_size;

while (!bufinf[i]) {
if (jme_make_new_rx_buf(bufinf + i))
break;
jme_set_clean_rxdesc(jme, i);
while (limit--) {
if (!bufinf[i]) {
if (jme_make_new_rx_buf(bufinf + i))
break;
jme_set_clean_rxdesc(jme, i);
}
if (i == curhole)
limit = 0;
i = (i + 1) & mask;
}
rxring->next_to_fill = i;
Expand All @@ -622,7 +627,7 @@ jme_alloc_and_feed_iob(struct jme_adapter *jme, int idx)
netdev_rx(netdev, rxbi);

rxring->bufinf[idx] = NULL;
jme_refill_rx_ring(jme);
jme_refill_rx_ring(jme, idx);
}

static void
Expand All @@ -636,7 +641,8 @@ jme_process_receive(struct jme_adapter *jme)

i = rxring->next_to_clean;
rxdesc += i;
while (!(rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) &&
while (rxring->bufinf[i] &&
!(rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) &&
(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL) &&
limit--) {

Expand Down

0 comments on commit 1798e04

Please sign in to comment.