Remove the static sq_trace array and make it per-device as

multiple seeq interfaces may exist. While here, add a few trace
actions, move the related macros into sqvar.h, and enhance the
sq_trace_dump output a bit.
This commit is contained in:
rumble 2004-12-29 02:11:31 +00:00
parent f3ff62b84d
commit e837411407
2 changed files with 76 additions and 57 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_sq.c,v 1.21 2004/10/30 18:08:35 thorpej Exp $ */
/* $NetBSD: if_sq.c,v 1.22 2004/12/29 02:11:31 rumble Exp $ */
/*
* Copyright (c) 2001 Rafal K. Boni
@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: if_sq.c,v 1.21 2004/10/30 18:08:35 thorpej Exp $");
__KERNEL_RCSID(0, "$NetBSD: if_sq.c,v 1.22 2004/12/29 02:11:31 rumble Exp $");
#include "bpfilter.h"
@ -116,43 +116,10 @@ static int sq_txintr(struct sq_softc *);
static void sq_reset(struct sq_softc *);
static int sq_add_rxbuf(struct sq_softc *, int);
static void sq_dump_buffer(u_int32_t addr, u_int32_t len);
static void sq_trace_dump(struct sq_softc *);
static void enaddr_aton(const char*, u_int8_t*);
/* Actions */
#define SQ_RESET 1
#define SQ_ADD_TO_DMA 2
#define SQ_START_DMA 3
#define SQ_DONE_DMA 4
#define SQ_RESTART_DMA 5
#define SQ_TXINTR_ENTER 6
#define SQ_TXINTR_EXIT 7
#define SQ_TXINTR_BUSY 8
struct sq_action_trace {
int action;
int bufno;
int status;
int freebuf;
};
#define SQ_TRACEBUF_SIZE 100
int sq_trace_idx = 0;
struct sq_action_trace sq_trace[SQ_TRACEBUF_SIZE];
void sq_trace_dump(struct sq_softc* sc);
#define SQ_TRACE(act, buf, stat, free) do { \
sq_trace[sq_trace_idx].action = (act); \
sq_trace[sq_trace_idx].bufno = (buf); \
sq_trace[sq_trace_idx].status = (stat); \
sq_trace[sq_trace_idx].freebuf = (free); \
if (++sq_trace_idx == SQ_TRACEBUF_SIZE) { \
memset(&sq_trace, 0, sizeof(sq_trace)); \
sq_trace_idx = 0; \
} \
} while (0)
CFATTACH_DECL(sq, sizeof(struct sq_softc),
sq_match, sq_attach, NULL, NULL);
@ -315,7 +282,7 @@ sq_attach(struct device *parent, struct device *self, void *aux)
if_attach(ifp);
ether_ifattach(ifp, sc->sc_enaddr);
memset(&sq_trace, 0, sizeof(sq_trace));
memset(&sc->sq_trace, 0, sizeof(sc->sq_trace));
/* Done! */
return;
@ -368,7 +335,7 @@ sq_init(struct ifnet *ifp)
sc->sc_nfreetx = SQ_NTXDESC;
sc->sc_nexttx = sc->sc_prevtx = 0;
SQ_TRACE(SQ_RESET, 0, 0, sc->sc_nfreetx);
SQ_TRACE(SQ_RESET, sc, 0, 0);
/* Set into 8003 mode, bank 0 to program ethernet address */
bus_space_write_1(sc->sc_regt, sc->sc_regh, SEEQ_TXCMD, TXCMD_BANK0);
@ -472,6 +439,8 @@ sq_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
{
int s, error = 0;
SQ_TRACE(SQ_IOCTL, (struct sq_softc *)ifp->if_softc, 0, 0);
s = splnet();
error = ether_ioctl(ifp, cmd, data);
@ -611,6 +580,8 @@ sq_start(struct ifnet *ifp)
* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET.
*/
SQ_TRACE(SQ_ENQUEUE, sc, sc->sc_nexttx, 0);
/* Sync the DMA map. */
bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
BUS_DMASYNC_PREWRITE);
@ -729,8 +700,7 @@ sq_start(struct ifnet *ifp)
sc->hpc_regs->enetx_ctl);
if ((status & sc->hpc_regs->enetx_ctl_active) != 0) {
SQ_TRACE(SQ_ADD_TO_DMA, firsttx, status,
sc->sc_nfreetx);
SQ_TRACE(SQ_ADD_TO_DMA, sc, firsttx, status);
/* NB: hpc3_hdd_ctl is also hpc1_hdd_bufptr */
sc->sc_txdesc[SQ_PREVTX(firsttx)].hpc3_hdd_ctl &=
@ -739,7 +709,7 @@ sq_start(struct ifnet *ifp)
SQ_CDTXSYNC(sc, SQ_PREVTX(firsttx), 1,
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
} else {
SQ_TRACE(SQ_START_DMA, firsttx, status, sc->sc_nfreetx);
SQ_TRACE(SQ_START_DMA, sc, firsttx, status);
bus_space_write_4(sc->sc_hpct, sc->sc_hpch,
sc->hpc_regs->enetx_ndbp, SQ_CDTXADDR(sc, firsttx));
@ -801,23 +771,39 @@ sq_watchdog(struct ifnet *ifp)
sq_trace_dump(sc);
memset(&sq_trace, 0, sizeof(sq_trace));
sq_trace_idx = 0;
memset(&sc->sq_trace, 0, sizeof(sc->sq_trace));
sc->sq_trace_idx = 0;
++ifp->if_oerrors;
sq_init(ifp);
}
void sq_trace_dump(struct sq_softc* sc)
static void
sq_trace_dump(struct sq_softc *sc)
{
int i;
char *act;
for(i = 0; i < sq_trace_idx; i++) {
printf("%s: [%d] action %d, buf %d, free %d, status %08x\n",
sc->sc_dev.dv_xname, i, sq_trace[i].action,
sq_trace[i].bufno, sq_trace[i].freebuf,
sq_trace[i].status);
for (i = 0; i < sc->sq_trace_idx; i++) {
switch (sc->sq_trace[i].action) {
case SQ_RESET: act = "SQ_RESET"; break;
case SQ_ADD_TO_DMA: act = "SQ_ADD_TO_DMA"; break;
case SQ_START_DMA: act = "SQ_START_DMA"; break;
case SQ_DONE_DMA: act = "SQ_DONE_DMA"; break;
case SQ_RESTART_DMA: act = "SQ_RESTART_DMA"; break;
case SQ_TXINTR_ENTER: act = "SQ_TXINTR_ENTER"; break;
case SQ_TXINTR_EXIT: act = "SQ_TXINTR_EXIT"; break;
case SQ_TXINTR_BUSY: act = "SQ_TXINTR_BUSY"; break;
case SQ_IOCTL: act = "SQ_IOCTL"; break;
case SQ_ENQUEUE: act = "SQ_ENQUEUE"; break;
default: act = "UNKNOWN";
}
printf("%s: [%03d] action %-16s buf %03d free %03d "
"status %08x line %d\n", sc->sc_dev.dv_xname, i, act,
sc->sq_trace[i].bufno, sc->sq_trace[i].freebuf,
sc->sq_trace[i].status, sc->sq_trace[i].line);
}
}
@ -1008,7 +994,7 @@ sq_txintr(struct sq_softc *sc)
status = bus_space_read_4(sc->sc_hpct, sc->sc_hpch,
sc->hpc_regs->enetx_ctl) >> shift;
SQ_TRACE(SQ_TXINTR_ENTER, sc->sc_prevtx, status, sc->sc_nfreetx);
SQ_TRACE(SQ_TXINTR_ENTER, sc, sc->sc_prevtx, status);
if ((status & ( (sc->hpc_regs->enetx_ctl_active >> shift) | TXSTAT_GOOD)) == 0) {
/* XXX */ printf("txstat: %x\n", status);
@ -1060,8 +1046,7 @@ sq_txintr(struct sq_softc *sc)
if (hpc3_not_ready == 0 || hpc1_ready == 2) {
if ((status & (sc->hpc_regs->enetx_ctl_active >> shift)) == 0) { // XXX
SQ_TRACE(SQ_RESTART_DMA, i, status,
sc->sc_nfreetx);
SQ_TRACE(SQ_RESTART_DMA, sc, i, status);
bus_space_write_4(sc->sc_hpct, sc->sc_hpch,
sc->hpc_regs->enetx_ndbp, SQ_CDTXADDR(sc, i));
@ -1084,8 +1069,7 @@ sq_txintr(struct sq_softc *sc)
*/
ifp->if_timer = 5;
} else {
SQ_TRACE(SQ_TXINTR_BUSY, i, status,
sc->sc_nfreetx);
SQ_TRACE(SQ_TXINTR_BUSY, sc, i, status);
}
break;
}
@ -1101,7 +1085,7 @@ sq_txintr(struct sq_softc *sc)
ifp->if_opackets++;
sc->sc_nfreetx++;
SQ_TRACE(SQ_DONE_DMA, i, status, sc->sc_nfreetx);
SQ_TRACE(SQ_DONE_DMA, sc, i, status);
i = SQ_NEXTTX(i);
}
@ -1116,7 +1100,7 @@ sq_txintr(struct sq_softc *sc)
if (sc->sc_nfreetx == SQ_NTXDESC)
ifp->if_timer = 0;
SQ_TRACE(SQ_TXINTR_EXIT, sc->sc_prevtx, status, sc->sc_nfreetx);
SQ_TRACE(SQ_TXINTR_EXIT, sc, sc->sc_prevtx, status);
sq_start(ifp);
return 1;

View File

@ -1,4 +1,4 @@
/* $NetBSD: sqvar.h,v 1.5 2003/12/30 23:48:07 sekiya Exp $ */
/* $NetBSD: sqvar.h,v 1.6 2004/12/29 02:11:31 rumble Exp $ */
/*
* Copyright (c) 2001 Rafal K. Boni
@ -75,6 +75,38 @@ struct sq_control {
#define SQ_TYPE_8003 0
#define SQ_TYPE_80C03 1
/* Trace Actions */
#define SQ_RESET 1
#define SQ_ADD_TO_DMA 2
#define SQ_START_DMA 3
#define SQ_DONE_DMA 4
#define SQ_RESTART_DMA 5
#define SQ_TXINTR_ENTER 6
#define SQ_TXINTR_EXIT 7
#define SQ_TXINTR_BUSY 8
#define SQ_IOCTL 9
#define SQ_ENQUEUE 10
struct sq_action_trace {
int action;
int line;
int bufno;
int status;
int freebuf;
};
#define SQ_TRACEBUF_SIZE 100
#define SQ_TRACE(act, sc, buf, stat) do { \
(sc)->sq_trace[(sc)->sq_trace_idx].action = (act); \
(sc)->sq_trace[(sc)->sq_trace_idx].line = __LINE__; \
(sc)->sq_trace[(sc)->sq_trace_idx].bufno = (buf); \
(sc)->sq_trace[(sc)->sq_trace_idx].status = (stat); \
(sc)->sq_trace[(sc)->sq_trace_idx].freebuf = (sc)->sc_nfreetx; \
if (++(sc)->sq_trace_idx == SQ_TRACEBUF_SIZE) \
(sc)->sq_trace_idx = 0; \
} while (0)
struct sq_softc {
struct device sc_dev;
@ -128,6 +160,9 @@ struct sq_softc {
rndsource_element_t rnd_source; /* random source */
#endif
struct hpc_values *hpc_regs; /* HPC register definitions */
int sq_trace_idx;
struct sq_action_trace sq_trace[SQ_TRACEBUF_SIZE];
};
#define SQ_CDTXADDR(sc, x) ((sc)->sc_cddma + SQ_CDTXOFF((x)))