From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39949) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZEv2h-00086Q-83 for qemu-devel@nongnu.org; Tue, 14 Jul 2015 03:54:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZEv2g-0001gE-82 for qemu-devel@nongnu.org; Tue, 14 Jul 2015 03:54:19 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59717) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZEv2g-0001gA-38 for qemu-devel@nongnu.org; Tue, 14 Jul 2015 03:54:18 -0400 From: Fam Zheng Date: Tue, 14 Jul 2015 15:53:35 +0800 Message-Id: <1436860421-4604-7-git-send-email-famz@redhat.com> In-Reply-To: <1436860421-4604-1-git-send-email-famz@redhat.com> References: <1436860421-4604-1-git-send-email-famz@redhat.com> Subject: [Qemu-devel] [PATCH for-2.4 06/12] etsec: Flush queue when rx buffer is consumed List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , Peter Crosthwaite , Rob Herring , jasowang@redhat.com, Michael Walle , Gerd Hoffmann , stefanha@redhat.com, "Edgar E. Iglesias" The BH will be scheduled when etsec->rx_buffer_len is becoming 0, which is the condition of queuing. Signed-off-by: Fam Zheng --- hw/net/fsl_etsec/etsec.c | 9 +++++++++ hw/net/fsl_etsec/etsec.h | 2 ++ hw/net/fsl_etsec/rings.c | 1 + 3 files changed, 12 insertions(+) diff --git a/hw/net/fsl_etsec/etsec.c b/hw/net/fsl_etsec/etsec.c index f5170ae..fcde9b4 100644 --- a/hw/net/fsl_etsec/etsec.c +++ b/hw/net/fsl_etsec/etsec.c @@ -366,6 +366,13 @@ static NetClientInfo net_etsec_info = { .link_status_changed = etsec_set_link_status, }; +static void etsec_flush_rx_queue(void *opaque) +{ + eTSEC *etsec = opaque; + + qemu_flush_queued_packets(qemu_get_queue(etsec->nic)); +} + static void etsec_realize(DeviceState *dev, Error **errp) { eTSEC *etsec = ETSEC_COMMON(dev); @@ -378,6 +385,8 @@ static void etsec_realize(DeviceState *dev, Error **errp) etsec->bh = qemu_bh_new(etsec_timer_hit, etsec); etsec->ptimer = ptimer_init(etsec->bh); ptimer_set_freq(etsec->ptimer, 100); + + etsec->flush_bh = qemu_bh_new(etsec_flush_rx_queue, etsec); } static void etsec_instance_init(Object *obj) diff --git a/hw/net/fsl_etsec/etsec.h b/hw/net/fsl_etsec/etsec.h index fc41773..05bb7f8 100644 --- a/hw/net/fsl_etsec/etsec.h +++ b/hw/net/fsl_etsec/etsec.h @@ -144,6 +144,8 @@ typedef struct eTSEC { QEMUBH *bh; struct ptimer_state *ptimer; + QEMUBH *flush_bh; + } eTSEC; #define TYPE_ETSEC_COMMON "eTSEC" diff --git a/hw/net/fsl_etsec/rings.c b/hw/net/fsl_etsec/rings.c index a11280b..7aae93e 100644 --- a/hw/net/fsl_etsec/rings.c +++ b/hw/net/fsl_etsec/rings.c @@ -646,6 +646,7 @@ void etsec_walk_rx_ring(eTSEC *etsec, int ring_nbr) } else { etsec->rx_buffer_len = 0; etsec->rx_buffer = NULL; + qemu_bh_schedule(etsec->flush_bh); } RING_DEBUG("eTSEC End of ring_write: remaining_data:%zu\n", remaining_data); -- 2.4.3