From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49565) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W0kcm-000674-RU for qemu-devel@nongnu.org; Tue, 07 Jan 2014 23:20:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W0kcg-0004nz-CE for qemu-devel@nongnu.org; Tue, 07 Jan 2014 23:20:12 -0500 Received: from mail-qc0-f171.google.com ([209.85.216.171]:49113) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W0kcg-0004nj-8z for qemu-devel@nongnu.org; Tue, 07 Jan 2014 23:20:06 -0500 Received: by mail-qc0-f171.google.com with SMTP id c9so1053523qcz.30 for ; Tue, 07 Jan 2014 20:20:06 -0800 (PST) From: Roy Franz Date: Tue, 7 Jan 2014 20:19:52 -0800 Message-Id: <1389154792-6651-3-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 2/2] Fix lan9118 buffer length 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 uses the provided buffer length to limit the bytes transmitted. Previously all the bytes of the last 32-bit word written to the TX fifo were added to the internal transmit buffer structure resulting in more bytes being transmitted than were submitted to the hardware in the command. This resulted in extra bytes being inserted into the middle of multi-buffer packets when the non-final buffers had non-32bit aligned ending addresses. Signed-off-by: Roy Franz --- hw/net/lan9118.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/net/lan9118.c b/hw/net/lan9118.c index bb0c503..e528290 100644 --- a/hw/net/lan9118.c +++ b/hw/net/lan9118.c @@ -763,7 +763,7 @@ static void tx_fifo_push(lan9118_state *s, uint32_t val) if (s->txp->buffer_size <= 0 && s->txp->pad != 0) { s->txp->pad--; } else { - n = 4; + n = MIN(4, s->txp->buffer_size + s->txp->offset); while (s->txp->offset) { val >>= 8; n--; -- 1.7.10.4