From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49558) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W0kcl-00065r-Db for qemu-devel@nongnu.org; Tue, 07 Jan 2014 23:20:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W0kcd-0004gM-Mx for qemu-devel@nongnu.org; Tue, 07 Jan 2014 23:20:11 -0500 Received: from mail-qa0-f45.google.com ([209.85.216.45]:54616) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W0kcd-0004f9-J2 for qemu-devel@nongnu.org; Tue, 07 Jan 2014 23:20:03 -0500 Received: by mail-qa0-f45.google.com with SMTP id j5so1276502qaq.32 for ; Tue, 07 Jan 2014 20:20:03 -0800 (PST) From: Roy Franz Date: Tue, 7 Jan 2014 20:19:51 -0800 Message-Id: <1389154792-6651-2-git-send-email-roy.franz@linaro.org> In-Reply-To: <1389154792-6651-1-git-send-email-roy.franz@linaro.org> References: <1389154792-6651-1-git-send-email-roy.franz@linaro.org> Subject: [Qemu-devel] [PATCH V2 1/2] Fix lan9118 TX "CMD A" handling List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, peter.maydell@linaro.org, kwolf@redhat.com, stefanha@redhat.com Cc: Roy Franz , peter.crosthwaite@xilinx.com, patches@linaro.org The 9118 ethernet controller supports transmission of multi-buffer packets with arbitrary byte alignment of the start and end bytes. All writes to the packet fifo are 32 bits, so the controller discards bytes at the beginning and end of each buffer based on the 'Data start offset' and 'Buffer size' of the TX command 'A' format. This patch changes the buffer size and offset internal state variables to be updated on every "TX command A" write. Previously they were only updated for the first segment, which resulted incorrect behavior for packets with more than one segment. Each segment of the packet has its own CMD A command, with its own buffer size and start offset. Also update extraction of fields from the CMD A word to use extract32(). Signed-off-by: Roy Franz --- hw/net/lan9118.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/net/lan9118.c b/hw/net/lan9118.c index 2315f99..bb0c503 100644 --- a/hw/net/lan9118.c +++ b/hw/net/lan9118.c @@ -727,14 +727,14 @@ static void tx_fifo_push(lan9118_state *s, uint32_t val) s->txp->cmd_a = val & 0x831f37ff; s->txp->fifo_used++; s->txp->state = TX_B; + s->txp->buffer_size = extract32(s->txp->cmd_a, 0, 11); + s->txp->offset = extract32(s->txp->cmd_a, 16, 5); break; case TX_B: if (s->txp->cmd_a & 0x2000) { /* First segment */ s->txp->cmd_b = val; s->txp->fifo_used++; - s->txp->buffer_size = s->txp->cmd_a & 0x7ff; - s->txp->offset = (s->txp->cmd_a >> 16) & 0x1f; /* End alignment does not include command words. */ n = (s->txp->buffer_size + s->txp->offset + 3) >> 2; switch ((n >> 24) & 3) { -- 1.7.10.4