From patchwork Mon Apr 16 15:36:31 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 152901 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id F07DDB700F for ; Tue, 17 Apr 2012 01:37:08 +1000 (EST) Received: from localhost ([::1]:53047 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SJnzG-0001Hq-Nj for incoming@patchwork.ozlabs.org; Mon, 16 Apr 2012 11:37:06 -0400 Received: from eggs.gnu.org ([208.118.235.92]:42977) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SJnyu-0000vV-N0 for qemu-devel@nongnu.org; Mon, 16 Apr 2012 11:36:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SJnyn-0004W9-Jl for qemu-devel@nongnu.org; Mon, 16 Apr 2012 11:36:44 -0400 Received: from david.siemens.de ([192.35.17.14]:29786) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SJnyn-0004Ul-9Q for qemu-devel@nongnu.org; Mon, 16 Apr 2012 11:36:37 -0400 Received: from mail1.siemens.de (localhost [127.0.0.1]) by david.siemens.de (8.13.6/8.13.6) with ESMTP id q3GFaYCA022326; Mon, 16 Apr 2012 17:36:34 +0200 Received: from mchn199C.mchp.siemens.de ([139.25.109.49]) by mail1.siemens.de (8.13.6/8.13.6) with ESMTP id q3GFaXCh029283; Mon, 16 Apr 2012 17:36:34 +0200 From: Jan Kiszka To: Anthony Liguori , qemu-devel@nongnu.org Date: Mon, 16 Apr 2012 17:36:31 +0200 Message-Id: X-Mailer: git-send-email 1.7.3.4 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Received-From: 192.35.17.14 Subject: [Qemu-devel] [PULL][PATCH 3/5] pcnet: Properly handle TX requests during Link Fail X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org As long as we have no link and we aren't in internal loopback mode, no packet must be sent. Instead, LCAR needs to be set in any active TX descriptor and also CERR in CSR0. Signed-off-by: Jan Kiszka --- hw/pcnet.c | 11 +++++++++++ hw/pcnet.h | 1 + 2 files changed, 12 insertions(+), 0 deletions(-) diff --git a/hw/pcnet.c b/hw/pcnet.c index 7413409..d769b08 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -77,6 +77,7 @@ struct qemu_ether_header { #define CSR_DTX(S) !!(((S)->csr[15])&0x0002) #define CSR_LOOP(S) !!(((S)->csr[15])&0x0004) #define CSR_DXMTFCS(S) !!(((S)->csr[15])&0x0008) +#define CSR_INTL(S) !!(((S)->csr[15])&0x0040) #define CSR_DRCVPA(S) !!(((S)->csr[15])&0x2000) #define CSR_DRCVBC(S) !!(((S)->csr[15])&0x4000) #define CSR_PROM(S) !!(((S)->csr[15])&0x8000) @@ -1234,6 +1235,15 @@ static void pcnet_transmit(PCNetState *s) if (BCR_SWSTYLE(s) != 1) add_crc = GET_FIELD(tmd.status, TMDS, ADDFCS); } + if (s->lnkst == 0 && + (!CSR_LOOP(s) || (!CSR_INTL(s) && !BCR_TMAULOOP(s)))) { + SET_FIELD(&tmd.misc, TMDM, LCAR, 1); + SET_FIELD(&tmd.status, TMDS, ERR, 1); + SET_FIELD(&tmd.status, TMDS, OWN, 0); + s->csr[0] |= 0xa000; /* ERR | CERR */ + s->xmit_pos = -1; + goto txdone; + } if (!GET_FIELD(tmd.status, TMDS, ENP)) { int bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT); s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr), @@ -1262,6 +1272,7 @@ static void pcnet_transmit(PCNetState *s) s->xmit_pos = -1; } + txdone: SET_FIELD(&tmd.status, TMDS, OWN, 0); TMDSTORE(&tmd, PHYSADDR(s,CSR_CXDA(s))); if (!CSR_TOKINTD(s) || (CSR_LTINTEN(s) && GET_FIELD(tmd.status, TMDS, LTINT))) diff --git a/hw/pcnet.h b/hw/pcnet.h index edc81c9..803a2cc 100644 --- a/hw/pcnet.h +++ b/hw/pcnet.h @@ -20,6 +20,7 @@ #define BCR_SWS 20 #define BCR_PLAT 22 +#define BCR_TMAULOOP(S) !!((S)->bcr[BCR_MC ] & 0x4000) #define BCR_APROMWE(S) !!((S)->bcr[BCR_MC ] & 0x0100) #define BCR_DWIO(S) !!((S)->bcr[BCR_BSBC] & 0x0080) #define BCR_SSIZE32(S) !!((S)->bcr[BCR_SWS ] & 0x0100)