Message ID | 1358634492-22627-4-git-send-email-grant.likely@secretlab.ca |
---|---|
State | New |
Headers | show |
On 19 January 2013 22:28, Grant Likely <grant.likely@secretlab.ca> wrote: > The smc91c111 device has bitbanged MDIO access, but the model doesn't > yet implement it. This patch uses the generalized bitbang MDIO support > pulled out of etraxfs Ethernet driver. > @@ -44,6 +45,13 @@ typedef struct { > uint8_t int_level; > uint8_t int_mask; > MemoryRegion mmio; > + > + /* MDIO bus. */ > + struct qemu_mdio mdio_bus; > + unsigned int phyaddr; > + > + /* PHY. */ > + struct qemu_phy phy; > } smc91c111_state; This surely needs VMState additions so the extra state can be passed across migrations. It looks like the MDIO/PHY stuff from the etraxfs code doesn't have any kind of state save/restore support, so you probably need to first implement that in your new mdio/phy source file, and then refer to it here. -- PMM
On Sun, 20 Jan 2013 11:29:32 +0000, Peter Maydell <peter.maydell@linaro.org> wrote: > On 19 January 2013 22:28, Grant Likely <grant.likely@secretlab.ca> wrote: > > The smc91c111 device has bitbanged MDIO access, but the model doesn't > > yet implement it. This patch uses the generalized bitbang MDIO support > > pulled out of etraxfs Ethernet driver. > > > @@ -44,6 +45,13 @@ typedef struct { > > uint8_t int_level; > > uint8_t int_mask; > > MemoryRegion mmio; > > + > > + /* MDIO bus. */ > > + struct qemu_mdio mdio_bus; > > + unsigned int phyaddr; > > + > > + /* PHY. */ > > + struct qemu_phy phy; > > } smc91c111_state; > > This surely needs VMState additions so the extra state can be passed > across migrations. It looks like the MDIO/PHY stuff from the etraxfs code > doesn't have any kind of state save/restore support, so you probably need > to first implement that in your new mdio/phy source file, and then refer > to it here. Ah, I see. I missed that. I will figure out how to do that and add it to the next version. g.
diff --git a/hw/Makefile.objs b/hw/Makefile.objs index 74b07a7..0104fd4 100644 --- a/hw/Makefile.objs +++ b/hw/Makefile.objs @@ -117,7 +117,7 @@ common-obj-$(CONFIG_PCNET_COMMON) += pcnet.o common-obj-$(CONFIG_E1000_PCI) += e1000.o common-obj-$(CONFIG_RTL8139_PCI) += rtl8139.o -common-obj-$(CONFIG_SMC91C111) += smc91c111.o +common-obj-$(CONFIG_SMC91C111) += smc91c111.o bitbang_mdio.o common-obj-$(CONFIG_LAN9118) += lan9118.o common-obj-$(CONFIG_NE2000_ISA) += ne2000-isa.o common-obj-$(CONFIG_OPENCORES_ETH) += opencores_eth.o diff --git a/hw/smc91c111.c b/hw/smc91c111.c index a34698f..715422d 100644 --- a/hw/smc91c111.c +++ b/hw/smc91c111.c @@ -10,6 +10,7 @@ #include "sysbus.h" #include "net/net.h" #include "devices.h" +#include "bitbang_mdio.h" /* For crc32 */ #include <zlib.h> @@ -44,6 +45,13 @@ typedef struct { uint8_t int_level; uint8_t int_mask; MemoryRegion mmio; + + /* MDIO bus. */ + struct qemu_mdio mdio_bus; + unsigned int phyaddr; + + /* PHY. */ + struct qemu_phy phy; } smc91c111_state; static const VMStateDescription vmstate_smc91c111 = { @@ -437,8 +445,19 @@ static void smc91c111_writeb(void *opaque, hwaddr offset, /* Multicast table. */ /* Not implemented. */ return; - case 8: case 9: /* Management Interface. */ - /* Not implemented. */ + case 8: /* Management Interface. */ + /* Update MDIO data line status; but only if output is enabled */ + if (value & 8) { + s->mdio_bus.mdio = !!(value & 1); + } + /* Process the clock */ + if (s->mdio_bus.mdc != (value & 4)) { + mdio_cycle(&s->mdio_bus); + s->mdio_bus.mdc = !!(value & 4); + } + return; + case 9: /* Management Interface. */ + /* Not implemented */ return; case 12: /* Early receive. */ s->ercv = value & 0x1f; @@ -576,8 +595,7 @@ static uint32_t smc91c111_readb(void *opaque, hwaddr offset) /* Not implemented. */ return 0; case 8: /* Management Interface. */ - /* Not implemented. */ - return 0x30; + return 0x30 | (s->mdio_bus.mdio ? 2 : 0); case 9: return 0x33; case 10: /* Revision. */ @@ -754,6 +772,9 @@ static int smc91c111_init1(SysBusDevice *dev) s->nic = qemu_new_nic(&net_smc91c111_info, &s->conf, object_get_typename(OBJECT(dev)), dev->qdev.id, s); qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a); + + tdk_init(&s->phy); + mdio_attach(&s->mdio_bus, &s->phy, 0); /* ??? Save/restore. */ return 0; }
The smc91c111 device has bitbanged MDIO access, but the model doesn't yet implement it. This patch uses the generalized bitbang MDIO support pulled out of etraxfs Ethernet driver. The MDIO state machine is driven by changes in state to the clock control bit in the management register. The PHY model emulated is currently trivial (being whatever was done for the etraxfs driver), but it is enough to get an OS to recognize a PHY as being present. Tested with the versatilepb model with U-Boot and the Linux Kernel as client software. Cc: Peter Maydell <peter.maydell@linaro.org> Cc: Paul Brook <paul@codesourcery.com> Cc: Edgar E. Iglesias <edgar.iglesias@gmail.com> Cc: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Grant Likely <grant.likely@secretlab.ca> --- hw/Makefile.objs | 2 +- hw/smc91c111.c | 29 +++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-)