Port-sgimips archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: mec and resets
martin%duskware.de@localhost wrote:
> On Wed, Jul 30, 2008 at 01:01:35AM +0200, Jorge Acereda Macia wrote:
> > If you can't reproduce it, I'm available to do any tests.
>
> FWIW I can reproduce it on both a R5k and a R10k O2.
I can't reproduce it on my R5K O2. (scp ~1GB files works)
Is it on GENERIC32_IP3x or some customized kernel?
On crmfb console, serial console or network ptty?
Could you try the attached (random) patch?
---
Izumi Tsutsui
Index: if_mec.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sgimips/mace/if_mec.c,v
retrieving revision 1.20
diff -u -r1.20 if_mec.c
--- if_mec.c 14 May 2008 13:29:28 -0000 1.20
+++ if_mec.c 31 Jul 2008 15:47:28 -0000
@@ -179,7 +179,7 @@
#define MEC_TXSTAT_UNUSED 0x7fffffffe0000000ULL /* should be zero */
#define MEC_TXSTAT_SENT 0x8000000000000000ULL /* packet sent
*/
- uint64_t txd_ptr[MEC_NTXPTR];
+ volatile uint64_t txd_ptr[MEC_NTXPTR];
#define MEC_TXPTR_UNUSED2 0x0000000000000007 /* should be zero */
#define MEC_TXPTR_DMAADDR 0x00000000fffffff8 /* TX DMA address */
#define MEC_TXPTR_LEN 0x0000ffff00000000ULL /* buffer length */
@@ -674,13 +674,17 @@
MEC_MAC_FULL_DUPLEX | MEC_MAC_SPEED_SELECT);
/* must also set IPG here for duplex stuff ... */
+ /* XXX which value should be used for FDX/HDX? */
if ((sc->sc_mii.mii_media_active & IFM_FDX) != 0) {
control |= MEC_MAC_FULL_DUPLEX;
+ control |= MEC_MAC_IPG_DEFAULT;
} else {
- /* set IPG */
control |= MEC_MAC_IPG_DEFAULT;
}
+ if (IFM_SUBTYPE(sc->sc_mii.mii_media_active) == IFM_100_TX)
+ control |= MEC_MAC_SPEED_SELECT;
+
bus_space_write_8(st, sh, MEC_MAC_CONTROL, control);
}
@@ -1427,8 +1431,6 @@
int i;
u_int col;
- ifp->if_flags &= ~IFF_OACTIVE;
-
DPRINTF(MEC_DEBUG_TXINTR, ("mec_txintr: called\n"));
for (i = sc->sc_txdirty; sc->sc_txpending != 0;
@@ -1478,6 +1480,8 @@
/* cancel the watchdog timer if there are no pending TX packets */
if (sc->sc_txpending == 0)
ifp->if_timer = 0;
+ else if (sc->sc_txpending < MEC_NTXDESC - 4)
+ ifp->if_flags &= ~IFF_OACTIVE;
}
static void
Home |
Main Index |
Thread Index |
Old Index