From patchwork Sat Sep 19 17:10:57 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Weil X-Patchwork-Id: 48780 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n8JHBAdU028701 for ; Sat, 19 Sep 2009 17:11:10 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750832AbZISRLE (ORCPT ); Sat, 19 Sep 2009 13:11:04 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1750828AbZISRLE (ORCPT ); Sat, 19 Sep 2009 13:11:04 -0400 Received: from moutng.kundenserver.de ([212.227.17.8]:63547 "EHLO moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750755AbZISRLD (ORCPT ); Sat, 19 Sep 2009 13:11:03 -0400 Received: from flocke.weilnetz.de (p54ADEC1D.dip.t-dialin.net [84.173.236.29]) by mrelayeu.kundenserver.de (node=mrbap2) with ESMTP (Nemesis) id 0MKt72-1Mp3Sc3GIM-000giL; Sat, 19 Sep 2009 19:11:00 +0200 Received: from localhost ([127.0.0.1] ident=stefan) by flocke.weilnetz.de with esmtp (Exim 4.69) (envelope-from ) id 1Mp3Sb-0003ec-SG; Sat, 19 Sep 2009 19:10:57 +0200 Message-ID: <4AB510A1.9010702@mail.berlios.de> Date: Sat, 19 Sep 2009 19:10:57 +0200 From: Stefan Weil User-Agent: Mozilla-Thunderbird 2.0.0.22 (X11/20090707) MIME-Version: 1.0 To: Michal Filka CC: qemu-devel , "kvm@vger.kernel.org" Subject: Re: eepro100.c References: <4AB4BD2B.4090809@web.de> <4AB4C761.5030909@mail.berlios.de> In-Reply-To: <4AB4C761.5030909@mail.berlios.de> X-Provags-ID: V01U2FsdGVkX1+OzQfCyzDVB3yYPcjsgobuZ4dve5F0eicmml9 +iT+5ol+LRJYqicpuynV7xHCr1O9ubSV6t/GlYDpXyrJBxUXa6 82BdJ/ceHIcn/MXbJee2WP2v/Y+sXNjLtLHH2T4QqCBEikJ4gz RWA== Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Stefan Weil schrieb: > Jan Kiszka schrieb: >> Michal Filka wrote: >>> Hi, >>> >>> I have question on i82557b emulation in kvm. >>> >>> I have run a proprietary operating system (Pharlap OS) in kvm. Part >>> of the job has been porting driver for i8255x. During the job I >>> discovered that kvm's emulation doesn't support a RNR interrupt (it >>> is disabled in the code). >>> >>> Why is it disabled? I'm running heavily loaded application and I have >>> to poll descriptor list instead of waiting for RNR interrupt. >> Best asked on qemu-devel, CC'ing the developer of this device model. >> >> Jan >> > > Hi, > > up to now, nobody complained about the missing RNR interrupts. > Linux obviously works without them, so I had no reason to > implement them. > > The disabled code parts (function eepro100_rnr_interrupt) > can be enabled, but you still need code which calls them > at the right places. > > This should not be very difficult if there is some test case > which proves the working RNR interrupt. > > Regards > Stefan > Hi Michal, could you please try the appended patch and tell me whether it works? Regards Stefan From cb12daa2f7ecbf041655825054a1661668ab7274 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Sat, 19 Sep 2009 19:05:07 +0200 Subject: [PATCH] eepro100: Add RNR interrupt Set RNR (receive unit not ready) interrupt for RU abort command. Signed-off-by: Stefan Weil --- hw/eepro100.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) diff --git a/hw/eepro100.c b/hw/eepro100.c index a8f6b3f..6d49bb8 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -114,7 +114,7 @@ #define RU_NOP 0x0000 #define RX_START 0x0001 #define RX_RESUME 0x0002 -#define RX_ABORT 0x0004 +#define RU_ABORT 0x0004 #define RX_ADDR_LOAD 0x0006 #define RX_RESUMENR 0x0007 #define INT_MASK 0x0100 @@ -363,13 +363,11 @@ static void eepro100_fr_interrupt(EEPRO100State * s) eepro100_interrupt(s, 0x40); } -#if 0 static void eepro100_rnr_interrupt(EEPRO100State * s) { /* RU is not ready. */ eepro100_interrupt(s, 0x10); } -#endif static void eepro100_mdi_interrupt(EEPRO100State * s) { @@ -865,6 +863,13 @@ static void eepro100_ru_command(EEPRO100State * s, uint8_t val) } set_ru_state(s, ru_ready); break; + case RU_ABORT: + /* RU abort. */ + if (get_ru_state(s) == ru_ready) { + eepro100_rnr_interrupt(s); + } + set_ru_state(s, ru_idle); + break; case RX_ADDR_LOAD: /* Load RU base. */ TRACE(OTHER, logout("val=0x%02x (RU base address)\n", val)); @@ -872,7 +877,7 @@ static void eepro100_ru_command(EEPRO100State * s, uint8_t val) break; default: logout("val=0x%02x (undefined RU command)\n", val); - missing("Undefined SU command"); + missing("Undefined RU command"); } } @@ -1531,6 +1536,8 @@ static ssize_t nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size if (get_ru_state(s) != ru_ready) { /* No resources available. */ logout("no resources, state=%u\n", get_ru_state(s)); + /* TODO: RNR interrupt only at first failed frame? */ + eepro100_rnr_interrupt(s); s->statistics.rx_resource_errors++; //~ assert(!"no resources"); return -1; -- 1.5.6.5