Date: Thu, 19 Nov 2009 12:37:20 -0800 From: Pyun YongHyeon <pyunyh@gmail.com> To: Gonzalo Nemmi <gnemmi@gmail.com> Cc: freebsd-current@freebsd.org Subject: Re: Call for bge(4) testers Message-ID: <20091119203720.GT1262@michelle.cdnetworks.com> In-Reply-To: <19e9a5dc0911182027y3a326763s25d4bc200aa2a8ab@mail.gmail.com> References: <20091111223751.GE15449@michelle.cdnetworks.com> <200911171650.06834.gnemmi@gmail.com> <20091117193208.GI1262@michelle.cdnetworks.com> <200911171917.41906.gnemmi@gmail.com> <20091117232347.GJ1262@michelle.cdnetworks.com> <20091118005724.GK1262@michelle.cdnetworks.com> <19e9a5dc0911172040g1107423ck72d30460b030ca27@mail.gmail.com> <20091118233225.GP1262@michelle.cdnetworks.com> <19e9a5dc0911182027y3a326763s25d4bc200aa2a8ab@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--ey/N+yb7u/X9mFhi Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Nov 19, 2009 at 01:27:03AM -0300, Gonzalo Nemmi wrote: > On Wed, Nov 18, 2009 at 8:32 PM, Pyun YongHyeon <pyunyh@gmail.com> wrote: > > > On Wed, Nov 18, 2009 at 01:40:24AM -0300, Gonzalo Nemmi wrote: > > > > [...] > > > > > I just tried ... > > > echo 'hw.bge.allow_asf="1"' >> /boot/loader.conf > > > reboot > > > load if_bge > > > acpiconf -s3 > > > same results :( > > > > > > > Ok, here is new try. > > > > Let's get on to it then ! > > Well now, the situation has improved .. here's what I got: > http://pastebin.com/f2d152f91 > > lines 2 to 8 == kldload if_bge > line 9 == acpiconf -s3 > lines 10 to 18 == resume (notice there are only 2 messages now: lines 12 and > 13!) > lines 19 to 36 == ifconfig bge0 > lines 37 to 42 == me mounting the pendrive to get the messages from > /var/log/messages =P > lines 43 to 46 == kldunload if_bge0 > > I think you narrowed it down quite a lot this time ! > Hmm, not actually. I guess it just removed unnecessary operation for PHY but it still failed to get functional state. :-( > I have to warn you though, that this time, my kernel was compiled using a > ... certainly modified /etc/make.conf file ... just in case you need to know > how it looks like, you'll fin it in here: > http://pastebin.com/f42e356d2 > > If you think that make.conf config may interfere with your pourposes or > tests, just let me know and I'll use a default one. I think that's ok. > The good thing about that make.conf is that it saves me quite a time on > every recompile ;) > > > im at your service .. tell me what to do and I'll do it :) > > > > > > > Thanks a lot for your patience and continuous support to fixing > > bugs. > > > > Thank _YOU_ for keeping the good work up and for trying to solve a really > nasty bug that makes every bge(4) user (think of it > _as_every_dell_notebook_owner_) unable to get his laptop to resume .. or > even use FreeBSD altoghether just because of this. > > Dear Pyung, rest assured that as long as you remain commited to fix this, or > any other bug that I can help you with, you can count on me to do everything > that may be within the reach of my hand. As long as you remain commited, > I'll be there, commited just as well :) > Thanks a lot! This really helps me a lot to fix the bug. Here is 4-th try. I added a couple of debug messages to see what register contents it have after resume. Thanks in advance. --ey/N+yb7u/X9mFhi Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="bge.5906.diff4" Index: sys/dev/bge/if_bgereg.h =================================================================== --- sys/dev/bge/if_bgereg.h (revision 199499) +++ sys/dev/bge/if_bgereg.h (working copy) @@ -1732,7 +1732,8 @@ #define BGE_MODE_CTL 0x6800 #define BGE_MISC_CFG 0x6804 #define BGE_MISC_LOCAL_CTL 0x6808 -#define BGE_CPU_EVENT 0x6810 +#define BGE_RX_CPU_EVENT 0x6810 +#define BGE_TX_CPU_EVENT 0x6820 #define BGE_EE_ADDR 0x6838 #define BGE_EE_DATA 0x683C #define BGE_EE_CTL 0x6840 @@ -1853,6 +1854,9 @@ #define BGE_SSRAMSIZE_8MB 0x00140000 #define BGE_SSRAMSIZE_16M 0x00180000 +/* RX CPU event register */ +#define BGE_RX_CPU_EVENT_SW7 0x00004000 + /* EEPROM address register */ #define BGE_EEADDR_ADDRESS 0x0000FFFC #define BGE_EEADDR_HALFCLK 0x01FF0000 Index: sys/dev/bge/if_bge.c =================================================================== --- sys/dev/bge/if_bge.c (revision 199499) +++ sys/dev/bge/if_bge.c (working copy) @@ -1320,11 +1320,12 @@ if (sc->bge_asf_mode) { bge_writemem_ind(sc, BGE_SOFTWARE_GENCOMM_FW, BGE_FW_PAUSE); - CSR_WRITE_4(sc, BGE_CPU_EVENT, - CSR_READ_4(sc, BGE_CPU_EVENT) | (1 << 14)); + CSR_WRITE_4(sc, BGE_RX_CPU_EVENT, + CSR_READ_4(sc, BGE_RX_CPU_EVENT) | BGE_RX_CPU_EVENT_SW7); for (i = 0; i < 100; i++ ) { - if (!(CSR_READ_4(sc, BGE_CPU_EVENT) & (1 << 14))) + if (!(CSR_READ_4(sc, BGE_RX_CPU_EVENT) & + BGE_RX_CPU_EVENT_SW7)) break; DELAY(10); } @@ -1540,12 +1541,13 @@ /* Wait until queue initialization is complete */ for (i = 0; i < BGE_TIMEOUT; i++) { DELAY(10); - if (CSR_READ_4(sc, BGE_FTQ_RESET) == 0) + if ((val = CSR_READ_4(sc, BGE_FTQ_RESET)) == 0) break; } if (i == BGE_TIMEOUT) { - device_printf(sc->bge_dev, "flow-through queue init failed\n"); + device_printf(sc->bge_dev, + "flow-through queue init failed(0x%08x)\n", val); return (ENXIO); } @@ -2995,6 +2997,15 @@ } } + if (sc->bge_asicrev == BGE_ASICREV_BCM5906) { + val = CSR_READ_4(sc, BGE_VCPU_STATUS); + CSR_WRITE_4(sc, BGE_VCPU_STATUS, + val | BGE_VCPU_STATUS_DRV_RESET); + val = CSR_READ_4(sc, BGE_VCPU_EXT_CTRL); + CSR_WRITE_4(sc, BGE_VCPU_EXT_CTRL, + val & ~BGE_VCPU_EXT_CTRL_HALT_CPU); + } + /* * Set GPHY Power Down Override to leave GPHY * powered up in D0 uninitialized. @@ -3005,15 +3016,6 @@ /* Issue global reset */ write_op(sc, BGE_MISC_CFG, reset); - if (sc->bge_asicrev == BGE_ASICREV_BCM5906) { - val = CSR_READ_4(sc, BGE_VCPU_STATUS); - CSR_WRITE_4(sc, BGE_VCPU_STATUS, - val | BGE_VCPU_STATUS_DRV_RESET); - val = CSR_READ_4(sc, BGE_VCPU_EXT_CTRL); - CSR_WRITE_4(sc, BGE_VCPU_EXT_CTRL, - val & ~BGE_VCPU_EXT_CTRL_HALT_CPU); - } - DELAY(1000); /* XXX: Broadcom Linux driver. */ @@ -3491,8 +3493,9 @@ BGE_FW_DRV_ALIVE); bge_writemem_ind(sc, BGE_SOFTWARE_GENNCOMM_FW_LEN, 4); bge_writemem_ind(sc, BGE_SOFTWARE_GENNCOMM_FW_DATA, 3); - CSR_WRITE_4(sc, BGE_CPU_EVENT, - CSR_READ_4(sc, BGE_CPU_EVENT) | (1 << 14)); + CSR_WRITE_4(sc, BGE_RX_CPU_EVENT, + CSR_READ_4(sc, BGE_RX_CPU_EVENT) | + BGE_RX_CPU_EVENT_SW7); } } } @@ -3919,6 +3922,7 @@ /* Init RX ring. */ if (bge_init_rx_ring_std(sc) != 0) { device_printf(sc->bge_dev, "no memory for std Rx buffers.\n"); + ifp->if_drv_flags |= IFF_DRV_RUNNING; bge_stop(sc); return; } @@ -3946,6 +3950,7 @@ (MCLBYTES - ETHER_ALIGN)) { if (bge_init_rx_ring_jumbo(sc) != 0) { device_printf(sc->bge_dev, "no memory for std Rx buffers.\n"); + ifp->if_drv_flags |= IFF_DRV_RUNNING; bge_stop(sc); return; } @@ -4181,11 +4186,8 @@ bge_setmulti(sc); } else bge_init_locked(sc); - } else { - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { - bge_stop(sc); - } - } + } else + bge_stop(sc); sc->bge_if_flags = ifp->if_flags; BGE_UNLOCK(sc); error = 0; @@ -4301,17 +4303,15 @@ bge_stop(struct bge_softc *sc) { struct ifnet *ifp; - struct ifmedia_entry *ifm; - struct mii_data *mii = NULL; - int mtmp, itmp; + uint32_t val; + int i; BGE_LOCK_ASSERT(sc); ifp = sc->bge_ifp; + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + return; - if ((sc->bge_flags & BGE_FLAG_TBI) == 0) - mii = device_get_softc(sc->bge_miibus); - callout_stop(&sc->bge_stat_ch); /* Disable host interrupts. */ @@ -4328,6 +4328,7 @@ * Disable all of the receiver blocks. */ BGE_CLRBIT(sc, BGE_RX_MODE, BGE_RXMODE_ENABLE); + DELAY(10); BGE_CLRBIT(sc, BGE_RBDI_MODE, BGE_RBDIMODE_ENABLE); BGE_CLRBIT(sc, BGE_RXLP_MODE, BGE_RXLPMODE_ENABLE); if (!(BGE_IS_5705_PLUS(sc))) @@ -4347,6 +4348,18 @@ if (!(BGE_IS_5705_PLUS(sc))) BGE_CLRBIT(sc, BGE_DMAC_MODE, BGE_DMACMODE_ENABLE); BGE_CLRBIT(sc, BGE_SBDC_MODE, BGE_SBDCMODE_ENABLE); + BGE_CLRBIT(sc, BGE_MAC_MODE, BGE_MACMODE_TXDMA_ENB); + DELAY(40); + BGE_CLRBIT(sc, BGE_TX_MODE, BGE_TXMODE_ENABLE); + for (i = 1000; i > 0; i--) { + val = CSR_READ_4(sc, BGE_TX_MODE); + if ((val & BGE_TXMODE_ENABLE) == 0) + break; + DELAY(10); + } + if (i == 0) + device_printf(sc->bge_dev, "Disabling TX mode failed(0x%08x)", + val); /* * Shut down all of the memory managers and related @@ -4385,27 +4398,6 @@ /* Free TX buffers. */ bge_free_tx_ring(sc); - /* - * Isolate/power down the PHY, but leave the media selection - * unchanged so that things will be put back to normal when - * we bring the interface back up. - */ - if ((sc->bge_flags & BGE_FLAG_TBI) == 0) { - itmp = ifp->if_flags; - ifp->if_flags |= IFF_UP; - /* - * If we are called from bge_detach(), mii is already NULL. - */ - if (mii != NULL) { - ifm = mii->mii_media.ifm_cur; - mtmp = ifm->ifm_media; - ifm->ifm_media = IFM_ETHER | IFM_NONE; - mii_mediachg(mii); - ifm->ifm_media = mtmp; - } - ifp->if_flags = itmp; - } - sc->bge_tx_saved_considx = BGE_TXCONS_UNSET; /* Clear MAC's link state (PHY may still have link UP). */ @@ -4452,9 +4444,18 @@ { struct bge_softc *sc; struct ifnet *ifp; + uint16_t pmstat; + int pmc; sc = device_get_softc(dev); BGE_LOCK(sc); + if (pci_find_extcap(dev, PCIY_PMG, &pmc) != 0) { + pmstat = pci_read_config(dev, pmc + PCIR_POWER_STATUS, 2); + device_printf(dev, "pmstat = 0x%04x\n", pmstat); + pmstat &= ~PCIM_PSTAT_PMEENABLE; + pmstat &= ~PCIM_PSTAT_DMASK; + pci_write_config(dev, pmc + PCIR_POWER_STATUS, pmstat, 2); + } ifp = sc->bge_ifp; if (ifp->if_flags & IFF_UP) { bge_init_locked(sc); --ey/N+yb7u/X9mFhi--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20091119203720.GT1262>