From patchwork Sat Apr 30 20:40:10 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Weil X-Patchwork-Id: 93513 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 7BA48B6F1B for ; Sun, 1 May 2011 06:42:21 +1000 (EST) Received: from localhost ([::1]:45795 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QGGza-0000GP-7C for incoming@patchwork.ozlabs.org; Sat, 30 Apr 2011 16:42:18 -0400 Received: from eggs.gnu.org ([140.186.70.92]:56606) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QGGxx-0006Ox-BW for qemu-devel@nongnu.org; Sat, 30 Apr 2011 16:40:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QGGxv-0000VQ-Hy for qemu-devel@nongnu.org; Sat, 30 Apr 2011 16:40:37 -0400 Received: from moutng.kundenserver.de ([212.227.126.187]:59990) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QGGxv-0000V5-5A for qemu-devel@nongnu.org; Sat, 30 Apr 2011 16:40:35 -0400 Received: from flocke.fritz.box (p5086FEF5.dip.t-dialin.net [80.134.254.245]) by mrelayeu.kundenserver.de (node=mrbap0) with ESMTP (Nemesis) id 0LwXJH-1Pj1g73uoR-017dZt; Sat, 30 Apr 2011 22:40:33 +0200 Received: from stefan by flocke.fritz.box with local (Exim 4.72) (envelope-from ) id 1QGGxs-0003m0-5N; Sat, 30 Apr 2011 22:40:32 +0200 From: Stefan Weil To: "Michael S. Tsirkin" Date: Sat, 30 Apr 2011 22:40:10 +0200 Message-Id: <1304196013-14432-8-git-send-email-weil@mail.berlios.de> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1304196013-14432-1-git-send-email-weil@mail.berlios.de> References: <1304196013-14432-1-git-send-email-weil@mail.berlios.de> X-Provags-ID: V02:K0:I9R3BKKqX+ze3EuBRe2r9uePqQz6+QHDTNBtmcRpmT2 mC5yto6whEvzfLzZG25SnFs73ttPkUoyqEsagVW2WSQosKBrri /Qg3HDNYni8nlnNN03alr0K9Z4BYMcWZWNSSVAyfDnXDgL+PzB 73yRsUP+XM2KvNeX1rQI27ljlFZZkfp29gx01b7rVRdl/RD107 PZpVEn0dT8L47XGwV2EAfUKPu330+PrN3S2yDLC2VDLGZPI8f7 2AMUXdA/GVO0s X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 212.227.126.187 Cc: QEMU Developers Subject: [Qemu-devel] [PATCH v2 07/10] eepro100: Support byte/word writes to pointer register 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 pointer is a 32 bit register, but may be written using 8 or 16 bit writes. Add support for byte/word writes. Signed-off-by: Stefan Weil --- hw/eepro100.c | 33 ++++++++++++++++----------------- 1 files changed, 16 insertions(+), 17 deletions(-) diff --git a/hw/eepro100.c b/hw/eepro100.c index 37172a5..1949ee0 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -239,7 +239,6 @@ typedef struct { uint16_t mdimem[32]; eeprom_t *eeprom; uint32_t device; /* device variant */ - uint32_t pointer; /* (cu_base + cu_offset) address the next command block in the command block list. */ uint32_t cu_base; /* CU base address */ uint32_t cu_offset; /* CU address offset */ @@ -990,7 +989,7 @@ static void eepro100_cu_command(EEPRO100State * s, uint8_t val) logout("unexpected CU state is %u\n", cu_state); } set_cu_state(s, cu_active); - s->cu_offset = s->pointer; + s->cu_offset = e100_read_reg4(s, SCBPointer); action_command(s); break; case CU_RESUME: @@ -1011,7 +1010,7 @@ static void eepro100_cu_command(EEPRO100State * s, uint8_t val) break; case CU_STATSADDR: /* Load dump counters address. */ - s->statsaddr = s->pointer; + s->statsaddr = e100_read_reg4(s, SCBPointer); TRACE(OTHER, logout("val=0x%02x (status address)\n", val)); break; case CU_SHOWSTATS: @@ -1023,7 +1022,7 @@ static void eepro100_cu_command(EEPRO100State * s, uint8_t val) case CU_CMD_BASE: /* Load CU base. */ TRACE(OTHER, logout("val=0x%02x (CU base address)\n", val)); - s->cu_base = s->pointer; + s->cu_base = e100_read_reg4(s, SCBPointer); break; case CU_DUMPSTATS: /* Dump and reset statistical counters. */ @@ -1056,7 +1055,7 @@ static void eepro100_ru_command(EEPRO100State * s, uint8_t val) #endif } set_ru_state(s, ru_ready); - s->ru_offset = s->pointer; + s->ru_offset = e100_read_reg4(s, SCBPointer); TRACE(OTHER, logout("val=0x%02x (rx start)\n", val)); break; case RX_RESUME: @@ -1080,7 +1079,7 @@ static void eepro100_ru_command(EEPRO100State * s, uint8_t val) case RX_ADDR_LOAD: /* Load RU base. */ TRACE(OTHER, logout("val=0x%02x (RU base address)\n", val)); - s->ru_base = s->pointer; + s->ru_base = e100_read_reg4(s, SCBPointer); break; default: logout("val=0x%02x (undefined RU command)\n", val); @@ -1137,12 +1136,6 @@ static void eepro100_write_eeprom(eeprom_t * eeprom, uint8_t val) eeprom93xx_write(eeprom, eecs, eesk, eedi); } -static void eepro100_write_pointer(EEPRO100State * s, uint32_t val) -{ - s->pointer = le32_to_cpu(val); - TRACE(OTHER, logout("val=0x%08x\n", val)); -} - /***************************************************************************** * * MDI emulation. @@ -1427,9 +1420,6 @@ static uint32_t eepro100_read4(EEPRO100State * s, uint32_t addr) TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val)); break; case SCBPointer: -#if 0 - val = eepro100_read_pointer(s); -#endif TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val)); break; case SCBPort: @@ -1472,6 +1462,12 @@ static void eepro100_write1(EEPRO100State * s, uint32_t addr, uint8_t val) } eepro100_interrupt(s, 0); break; + case SCBPointer: + case SCBPointer + 1: + case SCBPointer + 2: + case SCBPointer + 3: + TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val)); + break; case SCBPort: case SCBPort + 1: case SCBPort + 2: @@ -1515,6 +1511,10 @@ static void eepro100_write2(EEPRO100State * s, uint32_t addr, uint16_t val) eepro100_write_command(s, val); eepro100_write1(s, SCBIntmask, val >> 8); break; + case SCBPointer: + case SCBPointer + 2: + TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val)); + break; case SCBPort: TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val)); break; @@ -1540,7 +1540,7 @@ static void eepro100_write4(EEPRO100State * s, uint32_t addr, uint32_t val) switch (addr) { case SCBPointer: - eepro100_write_pointer(s, val); + TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val)); break; case SCBPort: TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val)); @@ -1896,7 +1896,6 @@ static const VMStateDescription vmstate_eepro100 = { /* The eeprom should be saved and restored by its own routines. */ VMSTATE_UINT32(device, EEPRO100State), /* TODO check device. */ - VMSTATE_UINT32(pointer, EEPRO100State), VMSTATE_UINT32(cu_base, EEPRO100State), VMSTATE_UINT32(cu_offset, EEPRO100State), VMSTATE_UINT32(ru_base, EEPRO100State),