[gPXE-devel] [PATCH] [jme] Fix refill behavior
cooldavid at cooldavid.org
cooldavid at cooldavid.org
Fri Jun 4 01:09:14 EDT 2010
From: Guo-Fu Tseng <cooldavid at cooldavid.org>
After changed driver behavior to refill after feed, if any error occurs
will introduce non-contiguous empty buffer in the ring. Due to my
reuse-buffer-when-error implementation.
Signed-off-by: Guo-Fu Tseng <cooldavid at cooldavid.org>
---
src/drivers/net/jme.c | 28 +++++++++++++++++++---------
1 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/src/drivers/net/jme.c b/src/drivers/net/jme.c
index 441eb8a..3f9174f 100644
--- a/src/drivers/net/jme.c
+++ b/src/drivers/net/jme.c
@@ -590,20 +590,29 @@ 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 idx)
{
struct jme_ring *rxring = &jme->rxring;
- int i = rxring->next_to_fill;
+ int i = rxring->next_to_fill, lasthole;
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))
+ lasthole = i;
+ while (limit--) {
+ if (!bufinf[i]) {
+ lasthole = i;
+ if (jme_make_new_rx_buf(bufinf + i))
+ break;
+ jme_set_clean_rxdesc(jme, i);
+ }
+ if (i == idx) {
+ lasthole = (i + 1) & mask;
break;
- jme_set_clean_rxdesc(jme, i);
+ }
i = (i + 1) & mask;
}
- rxring->next_to_fill = i;
+ rxring->next_to_fill = lasthole;
}
static void
@@ -622,7 +631,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
@@ -636,7 +645,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--) {
--
1.6.4.4
More information about the gPXE-devel
mailing list