From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LL4re-0005C8-IS for qemu-devel@nongnu.org; Thu, 08 Jan 2009 19:04:38 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LL4rd-0005BU-OU for qemu-devel@nongnu.org; Thu, 08 Jan 2009 19:04:38 -0500 Received: from [199.232.76.173] (port=51881 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LL4rd-0005BR-Ls for qemu-devel@nongnu.org; Thu, 08 Jan 2009 19:04:37 -0500 Received: from savannah.gnu.org ([199.232.41.3]:60306 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LL4rd-0003As-6V for qemu-devel@nongnu.org; Thu, 08 Jan 2009 19:04:37 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LL4rc-0003kV-Ft for qemu-devel@nongnu.org; Fri, 09 Jan 2009 00:04:36 +0000 Received: from edgar_igl by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LL4rc-0003kR-36 for qemu-devel@nongnu.org; Fri, 09 Jan 2009 00:04:36 +0000 MIME-Version: 1.0 Errors-To: edgar_igl Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: "Edgar E. Iglesias" Message-Id: Date: Fri, 09 Jan 2009 00:04:36 +0000 Subject: [Qemu-devel] [6255] ETRAX: Let the ethernet PHY report the current link-state. Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6255 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6255 Author: edgar_igl Date: 2009-01-09 00:04:35 +0000 (Fri, 09 Jan 2009) Log Message: ----------- ETRAX: Let the ethernet PHY report the current link-state. * PHY reports correct link-state. * Allow the board description to assign separate addresses to each PHY. Signed-off-by: Edgar E. Iglesias Modified Paths: -------------- trunk/hw/axis_dev88.c trunk/hw/etraxfs.c trunk/hw/etraxfs.h trunk/hw/etraxfs_eth.c Modified: trunk/hw/axis_dev88.c =================================================================== --- trunk/hw/axis_dev88.c 2009-01-08 23:19:50 UTC (rev 6254) +++ trunk/hw/axis_dev88.c 2009-01-09 00:04:35 UTC (rev 6255) @@ -304,10 +304,11 @@ /* Add the two ethernet blocks. */ nd_table[0].model = nd_table[0].model ? nd_table[0].model : "fseth"; - eth[0] = etraxfs_eth_init(&nd_table[0], env, pic->irq + 25, 0x30034000); + eth[0] = etraxfs_eth_init(&nd_table[0], env, pic->irq + 25, 0x30034000, 1); if (nb_nics > 1) { nd_table[1].model = nd_table[1].model ? nd_table[1].model : "fseth"; - eth[1] = etraxfs_eth_init(&nd_table[1], env, pic->irq + 26, 0x30036000); + eth[1] = etraxfs_eth_init(&nd_table[1], env, + pic->irq + 26, 0x30036000, 2); } /* The DMA Connector block is missing, hardwire things for now. */ Modified: trunk/hw/etraxfs.c =================================================================== --- trunk/hw/etraxfs.c 2009-01-08 23:19:50 UTC (rev 6254) +++ trunk/hw/etraxfs.c 2009-01-09 00:04:35 UTC (rev 6255) @@ -95,10 +95,11 @@ /* Add the two ethernet blocks. */ nd_table[0].model = nd_table[0].model ? nd_table[0].model : "fseth"; - eth[0] = etraxfs_eth_init(&nd_table[0], env, pic->irq + 25, 0x30034000); + eth[0] = etraxfs_eth_init(&nd_table[0], env, pic->irq + 25, 0x30034000, 1); if (nb_nics > 1) { nd_table[1].model = nd_table[1].model ? nd_table[1].model : "fseth"; - eth[1] = etraxfs_eth_init(&nd_table[1], env, pic->irq + 26, 0x30036000); + eth[1] = etraxfs_eth_init(&nd_table[1], env, + pic->irq + 26, 0x30036000, 2); } /* The DMA Connector block is missing, hardwire things for now. */ Modified: trunk/hw/etraxfs.h =================================================================== --- trunk/hw/etraxfs.h 2009-01-08 23:19:50 UTC (rev 6254) +++ trunk/hw/etraxfs.h 2009-01-09 00:04:35 UTC (rev 6255) @@ -37,6 +37,6 @@ void etraxfs_timer_init(CPUState *env, qemu_irq *irqs, qemu_irq *nmi, target_phys_addr_t base); void *etraxfs_eth_init(NICInfo *nd, CPUState *env, - qemu_irq *irq, target_phys_addr_t base); + qemu_irq *irq, target_phys_addr_t base, int phyaddr); void etraxfs_ser_init(CPUState *env, qemu_irq *irq, CharDriverState *chr, target_phys_addr_t base); Modified: trunk/hw/etraxfs_eth.c =================================================================== --- trunk/hw/etraxfs_eth.c 2009-01-08 23:19:50 UTC (rev 6254) +++ trunk/hw/etraxfs_eth.c 2009-01-09 00:04:35 UTC (rev 6255) @@ -45,6 +45,8 @@ { uint32_t regs[32]; + int link; + unsigned int (*read)(struct qemu_phy *phy, unsigned int req); void (*write)(struct qemu_phy *phy, unsigned int req, unsigned int data); @@ -59,13 +61,15 @@ switch (regnum) { case 1: + if (!phy->link) + break; /* MR1. */ /* Speeds and modes. */ r |= (1 << 13) | (1 << 14); r |= (1 << 11) | (1 << 12); r |= (1 << 5); /* Autoneg complete. */ r |= (1 << 3); /* Autoneg able. */ - r |= (1 << 2); /* Link. */ + r |= (1 << 2); /* link. */ break; case 5: /* Link partner ability. @@ -83,6 +87,9 @@ int duplex = 0; int speed_100 = 0; + if (!phy->link) + break; + /* Are we advertising 100 half or 100 duplex ? */ speed_100 = !!(phy->regs[4] & ADVERTISE_100HALF); speed_100 |= !!(phy->regs[4] & ADVERTISE_100FULL); @@ -125,6 +132,7 @@ phy->regs[3] = 0xe400; /* Autonegotiation advertisement reg. */ phy->regs[4] = 0x01E1; + phy->link = 1; phy->read = tdk_read; phy->write = tdk_write; @@ -530,6 +538,13 @@ return len; } +static void eth_set_link(VLANClientState *vc) +{ + struct fs_eth *eth = vc->opaque; + D(printf("%s %d\n", __func__, vc->link_down)); + eth->phy.link = !vc->link_down; +} + static CPUReadMemoryFunc *eth_read[] = { NULL, NULL, ð_readl, @@ -541,7 +556,7 @@ }; void *etraxfs_eth_init(NICInfo *nd, CPUState *env, - qemu_irq *irq, target_phys_addr_t base) + qemu_irq *irq, target_phys_addr_t base, int phyaddr) { struct etraxfs_dma_client *dma = NULL; struct fs_eth *eth = NULL; @@ -565,7 +580,7 @@ eth->dma_in = dma + 1; /* Connect the phy. */ - eth->phyaddr = 1; + eth->phyaddr = phyaddr & 0x1f; tdk_init(ð->phy); mdio_attach(ð->mdio_bus, ð->phy, eth->phyaddr); @@ -574,6 +589,8 @@ eth->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name, eth_receive, eth_can_receive, eth); + eth->vc->opaque = eth; + eth->vc->link_status_changed = eth_set_link; return dma; err: