Module Name: src Committed By: christos Date: Sat Mar 5 18:28:13 UTC 2011
Modified Files: src/sys/dev/marvell: if_mvgbe.c Log Message: >From Dave Mills: It would appear that the two PHYs can only be accessed from the registers of controller0 (mvgbec0) hence why both PHYs are being detected on controller0. I have made the assumption that PHY0 => controller0 (mvgbec0), PHY1 => controller1(mvgbec1) and developed a patch accordingly. Also the irq is 15 for controller1 not 14. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/dev/marvell/if_mvgbe.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/marvell/if_mvgbe.c diff -u src/sys/dev/marvell/if_mvgbe.c:1.5 src/sys/dev/marvell/if_mvgbe.c:1.6 --- src/sys/dev/marvell/if_mvgbe.c:1.5 Tue Feb 1 18:40:12 2011 +++ src/sys/dev/marvell/if_mvgbe.c Sat Mar 5 13:28:13 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mvgbe.c,v 1.5 2011/02/01 23:40:12 jakllsch Exp $ */ +/* $NetBSD: if_mvgbe.c,v 1.6 2011/03/05 18:28:13 christos Exp $ */ /* * Copyright (c) 2007, 2008 KIYOHARA Takashi * All rights reserved. @@ -25,7 +25,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.5 2011/02/01 23:40:12 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.6 2011/03/05 18:28:13 christos Exp $"); #include "rnd.h" @@ -184,6 +184,7 @@ struct mvgbec_softc { device_t sc_dev; + int sc_unit; bus_space_tag_t sc_iot; bus_space_handle_t sc_ioh; @@ -277,6 +278,7 @@ CFATTACH_DECL_NEW(mvgbe, sizeof(struct mvgbe_softc), mvgbe_match, mvgbe_attach, NULL, NULL); +device_t mvgbec0 = NULL; struct mvgbe_port { int model; @@ -305,7 +307,7 @@ { MARVELL_KIRKWOOD_88F6192, 0, 1, { 11 }, FLAGS_FIX_TQTB }, { MARVELL_KIRKWOOD_88F6192, 1, 1, { 14 }, FLAGS_FIX_TQTB }, { MARVELL_KIRKWOOD_88F6281, 0, 1, { 11 }, FLAGS_FIX_TQTB }, - { MARVELL_KIRKWOOD_88F6281, 1, 1, { 14 }, FLAGS_FIX_TQTB }, + { MARVELL_KIRKWOOD_88F6281, 1, 1, { 15 }, FLAGS_FIX_TQTB }, { MARVELL_MV78XX0_MV78100, 0, 1, { 40 }, FLAGS_FIX_TQTB }, { MARVELL_MV78XX0_MV78100, 1, 1, { 44 }, FLAGS_FIX_TQTB }, @@ -353,11 +355,17 @@ sc->sc_dev = self; sc->sc_iot = mva->mva_iot; + sc->sc_unit = mva->mva_unit; if (bus_space_subregion(mva->mva_iot, mva->mva_ioh, mva->mva_offset, mva->mva_size, &sc->sc_ioh)) { aprint_error_dev(self, "Cannot map registers\n"); return; } + + if (sc->sc_unit == 0) { + mvgbec0 = self; + } + phyaddr = 0; MVGBE_WRITE(sc, MVGBE_PHYADDR, phyaddr); @@ -432,11 +440,17 @@ mvgbec_miibus_readreg(device_t dev, int phy, int reg) { struct mvgbe_softc *sc = device_private(dev); - struct mvgbec_softc *csc = device_private(device_parent(dev)); + struct mvgbec_softc *csc; struct ifnet *ifp = &sc->sc_ethercom.ec_if; uint32_t smi, val; int i; + if (mvgbec0 == NULL) { + aprint_error_ifnet(ifp, "SMI mvgbec0 not found\n"); + return -1; + } + csc = device_private(mvgbec0); + mutex_enter(&csc->sc_mtx); for (i = 0; i < MVGBE_PHY_TIMEOUT; i++) { @@ -478,11 +492,17 @@ mvgbec_miibus_writereg(device_t dev, int phy, int reg, int val) { struct mvgbe_softc *sc = device_private(dev); - struct mvgbec_softc *csc = device_private(device_parent(dev)); + struct mvgbec_softc *csc; struct ifnet *ifp = &sc->sc_ethercom.ec_if; uint32_t smi; int i; + if (mvgbec0 == NULL) { + aprint_error_ifnet(ifp, "SMI mvgbec0 not found\n"); + return; + } + csc = device_private(mvgbec0); + DPRINTFN(9, ("mvgbec_miibus_writereg phy=%d reg=%#x val=%#x\n", phy, reg, val)); @@ -602,6 +622,7 @@ mvgbe_attach(device_t parent, device_t self, void *aux) { struct mvgbe_softc *sc = device_private(self); + struct mvgbec_softc *csc = device_private(parent); struct marvell_attach_args *mva = aux; struct mvgbe_txmap_entry *entry; struct ifnet *ifp; @@ -749,7 +770,7 @@ ifmedia_init(&sc->sc_mii.mii_media, 0, mvgbe_mediachange, mvgbe_mediastatus); mii_attach(self, &sc->sc_mii, 0xffffffff, - MII_PHY_ANY, MII_OFFSET_ANY, 0); + csc->sc_unit, MII_OFFSET_ANY, 0); if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) { aprint_error_dev(self, "no PHY found!\n"); ifmedia_add(&sc->sc_mii.mii_media,