From patchwork Wed Jan 23 16:15:29 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Grant Likely X-Patchwork-Id: 215060 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 373DE2C0084 for ; Thu, 24 Jan 2013 09:29:05 +1100 (EST) Received: from localhost ([::1]:45940 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ty8oZ-0008A7-C9 for incoming@patchwork.ozlabs.org; Wed, 23 Jan 2013 17:29:03 -0500 Received: from eggs.gnu.org ([208.118.235.92]:52272) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ty8oP-00089u-33 for qemu-devel@nongnu.org; Wed, 23 Jan 2013 17:28:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ty8oM-0001I8-QZ for qemu-devel@nongnu.org; Wed, 23 Jan 2013 17:28:52 -0500 Received: from mail-wi0-f177.google.com ([209.85.212.177]:38715) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ty8oM-0001I1-HW for qemu-devel@nongnu.org; Wed, 23 Jan 2013 17:28:50 -0500 Received: by mail-wi0-f177.google.com with SMTP id hm2so1189101wib.16 for ; Wed, 23 Jan 2013 14:28:49 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references:mime-version:content-type :content-transfer-encoding:x-gm-message-state; bh=MWpx7vFBN3gbVWOB0s6k1fnMOOwdd38SkLN/ktj5LEo=; b=jlw4/2nDlxqO471A/Z73QMmkglFeMKyJ9tK9b/rcEi4xZu4eCeXBhlyU3YilcA239v n1OPs0wujMR1fRSFtvZsg/5OfLK8Kq2k2mjAPFviXLcj4w+Li3bbYScFgOQuW7ysWGrS 8zmfEvRT/q9yASnNntw7f37RHd+jHYDEjFmHBlE/exZ6A6uYC24HsBazMmD2uEpaf5Cz 26W4z13X1SXw8R2RIllh3PnTDe8MGrdh1nvODI/uHaB3KOO88Jm3oaedbagjhFJVowaQ jYtP+hNqrjUq1N/ma2gpE2iKfPvAoQFbIwgZhLEo8O6VbLvIdg9+d0478qmYG4CEL/VQ Xb9w== X-Received: by 10.194.240.129 with SMTP id wa1mr5361091wjc.21.1358979667085; Wed, 23 Jan 2013 14:21:07 -0800 (PST) Received: from localhost (host31-53-18-123.range31-53.btcentralplus.com. [31.53.18.123]) by mx.google.com with ESMTPS id p2sm31814023wic.7.2013.01.23.14.21.04 (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 23 Jan 2013 14:21:05 -0800 (PST) Received: by localhost (Postfix, from userid 1000) id 01B703E152C; Wed, 23 Jan 2013 11:15:35 -0500 (EST) From: Grant Likely To: qemu-devel@nongnu.org Date: Wed, 23 Jan 2013 16:15:29 +0000 Message-Id: <1358957730-17897-6-git-send-email-grant.likely@secretlab.ca> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1358957730-17897-1-git-send-email-grant.likely@secretlab.ca> References: <1358957730-17897-1-git-send-email-grant.likely@secretlab.ca> MIME-Version: 1.0 X-Gm-Message-State: ALoCoQm9GzQwF637r+k+DgchGA+/s/zcnzCdNb0mKUQRZ1tZTft4JhKBS0t175jr09nLXujPvcsI X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 209.85.212.177 Cc: Peter Maydell , Anthony Liguori , Grant Likely , Paul Brook , "Edgar E. Iglesias" , =?UTF-8?q?Andreas=20F=C3=A4rber?= Subject: [Qemu-devel] [PATCH V2 5/6] hw/mdio: Move bitbang clock state tracking into core 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 No need for drivers to open code the check for clock state change. This patch moves it into the common code. Cc: Peter Maydell Cc: Paul Brook Cc: Edgar E. Iglesias Cc: Anthony Liguori Cc: Andreas Färber Signed-off-by: Grant Likely --- hw/etraxfs_eth.c | 7 ++----- hw/mdio.c | 20 ++++++++++++-------- hw/mdio.h | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/hw/etraxfs_eth.c b/hw/etraxfs_eth.c index f26e338..1bcdd12 100644 --- a/hw/etraxfs_eth.c +++ b/hw/etraxfs_eth.c @@ -173,11 +173,8 @@ eth_write(void *opaque, hwaddr addr, if (value & 2) { eth->mdio_bus.mdio = value & 1; } - if (eth->mdio_bus.mdc != (value & 4)) { - mdio_cycle(ð->mdio_bus); - eth_validate_duplex(eth); - } - eth->mdio_bus.mdc = !!(value & 4); + mdio_cycle(ð->mdio_bus, value & 4); + eth_validate_duplex(eth); eth->regs[addr] = value; break; diff --git a/hw/mdio.c b/hw/mdio.c index ca55e21..5272656 100644 --- a/hw/mdio.c +++ b/hw/mdio.c @@ -173,15 +173,19 @@ void mdio_write_req(struct qemu_mdio *bus, uint8_t addr, uint8_t req, } } -void mdio_cycle(struct qemu_mdio *bus) +void mdio_cycle(struct qemu_mdio *bus, bool mdc) { + if (mdc == bus->mdc) { + return; /* Clock state hasn't changed; do nothing */ + } + bus->mdc = mdc; bus->cnt++; D(printf("mdc=%d mdio=%d state=%d cnt=%d drv=%d\n", bus->mdc, bus->mdio, bus->state, bus->cnt, bus->output_enable)); switch (bus->state) { case PREAMBLE: - if (bus->mdc) { + if (!mdc) { if (bus->cnt >= (32 * 2) && !bus->mdio) { bus->cnt = 0; bus->state = SOF; @@ -190,7 +194,7 @@ void mdio_cycle(struct qemu_mdio *bus) } break; case SOF: - if (bus->mdc) { + if (!mdc) { if (bus->mdio != 1) { printf("WARNING: no SOF\n"); } @@ -202,7 +206,7 @@ void mdio_cycle(struct qemu_mdio *bus) } break; case OPC: - if (bus->mdc) { + if (!mdc) { bus->opc <<= 1; bus->opc |= bus->mdio & 1; if (bus->cnt == 2*2) { @@ -213,7 +217,7 @@ void mdio_cycle(struct qemu_mdio *bus) } break; case ADDR: - if (bus->mdc) { + if (!mdc) { bus->addr <<= 1; bus->addr |= bus->mdio & 1; @@ -225,7 +229,7 @@ void mdio_cycle(struct qemu_mdio *bus) } break; case REQ: - if (bus->mdc) { + if (!mdc) { bus->req <<= 1; bus->req |= bus->mdio & 1; if (bus->cnt == 5*2) { @@ -235,7 +239,7 @@ void mdio_cycle(struct qemu_mdio *bus) } break; case TURNAROUND: - if (bus->mdc && bus->cnt == 2*2) { + if (!mdc && bus->cnt == 2*2) { bus->mdio = 0; bus->cnt = 0; @@ -248,7 +252,7 @@ void mdio_cycle(struct qemu_mdio *bus) } break; case DATA: - if (!bus->mdc) { + if (mdc) { if (bus->output_enable) { bus->mdio = !!(bus->data & (1 << 15)); bus->data <<= 1; diff --git a/hw/mdio.h b/hw/mdio.h index 1cbb422..bd1d0a0 100644 --- a/hw/mdio.h +++ b/hw/mdio.h @@ -85,6 +85,6 @@ void mdio_attach(struct qemu_mdio *bus, struct qemu_phy *phy, unsigned int addr); uint16_t mdio_read_req(struct qemu_mdio *bus, uint8_t addr, uint8_t req); void mdio_write_req(struct qemu_mdio *bus, uint8_t addr, uint8_t req, uint16_t data); -void mdio_cycle(struct qemu_mdio *bus); +void mdio_cycle(struct qemu_mdio *bus, bool mdc); #endif