From: Guo-Fu Tseng <[email protected]> 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.
Some clean-up against previous patch. For easier understanding, and smaller code/stack size. Signed-off-by: Guo-Fu Tseng <[email protected]> --- src/drivers/net/jme.c | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/drivers/net/jme.c b/src/drivers/net/jme.c index 441eb8a..45cb212 100644 --- a/src/drivers/net/jme.c +++ b/src/drivers/net/jme.c @@ -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 idx) { 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 == idx) + limit = 0; i = (i + 1) & mask; } rxring->next_to_fill = i; @@ -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 @@ -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--) { -- 1.6.4.4 _______________________________________________ gPXE-devel mailing list [email protected] http://etherboot.org/mailman/listinfo/gpxe-devel
