Re-arrange the transmit control data somewhat so that we can

use the extended TxCB format (that change will happen later).
This commit is contained in:
thorpej 2001-05-21 23:58:44 +00:00
parent 92d92b1cb2
commit 0064d69faf
3 changed files with 37 additions and 44 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: i82557.c,v 1.49 2001/05/21 23:21:27 thorpej Exp $ */
/* $NetBSD: i82557.c,v 1.50 2001/05/21 23:58:44 thorpej Exp $ */
/*-
* Copyright (c) 1997, 1998, 1999 The NetBSD Foundation, Inc.
@ -697,9 +697,8 @@ fxp_start(struct ifnet *ifp)
{
struct fxp_softc *sc = ifp->if_softc;
struct mbuf *m0, *m;
struct fxp_cb_tx *txd;
struct fxp_txdesc *txd;
struct fxp_txsoft *txs;
struct fxp_tbdlist *tbd;
bus_dmamap_t dmamap;
int error, lasttx, nexttx, opending, seg;
@ -739,7 +738,6 @@ fxp_start(struct ifnet *ifp)
*/
nexttx = FXP_NEXTTX(sc->sc_txlast);
txd = FXP_CDTX(sc, nexttx);
tbd = FXP_CDTBD(sc, nexttx);
txs = FXP_DSTX(sc, nexttx);
dmamap = txs->txs_dmamap;
@ -785,14 +783,12 @@ fxp_start(struct ifnet *ifp)
/* Initialize the fraglist. */
for (seg = 0; seg < dmamap->dm_nsegs; seg++) {
tbd->tbd_d[seg].tb_addr =
txd->txd_tbd[seg].tb_addr =
htole32(dmamap->dm_segs[seg].ds_addr);
tbd->tbd_d[seg].tb_size =
txd->txd_tbd[seg].tb_size =
htole32(dmamap->dm_segs[seg].ds_len);
}
FXP_CDTBDSYNC(sc, nexttx, BUS_DMASYNC_PREWRITE);
/* Sync the DMA map. */
bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
BUS_DMASYNC_PREWRITE);
@ -806,11 +802,11 @@ fxp_start(struct ifnet *ifp)
* Initialize the transmit descriptor.
*/
/* BIG_ENDIAN: no need to swap to store 0 */
txd->cb_status = 0;
txd->cb_command =
txd->txd_txcb.cb_status = 0;
txd->txd_txcb.cb_command =
htole16(FXP_CB_COMMAND_XMIT | FXP_CB_COMMAND_SF);
txd->tx_threshold = tx_threshold;
txd->tbd_number = dmamap->dm_nsegs;
txd->txd_txcb.tx_threshold = tx_threshold;
txd->txd_txcb.tbd_number = dmamap->dm_nsegs;
FXP_CDTXSYNC(sc, nexttx,
BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
@ -846,7 +842,7 @@ fxp_start(struct ifnet *ifp)
* processing once the last packet we've enqueued
* has been transmitted.
*/
FXP_CDTX(sc, sc->sc_txlast)->cb_command |=
FXP_CDTX(sc, sc->sc_txlast)->txd_txcb.cb_command |=
htole16(FXP_CB_COMMAND_I | FXP_CB_COMMAND_S);
FXP_CDTXSYNC(sc, sc->sc_txlast,
BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
@ -857,7 +853,8 @@ fxp_start(struct ifnet *ifp)
*/
FXP_CDTXSYNC(sc, lasttx,
BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
FXP_CDTX(sc, lasttx)->cb_command &= htole16(~FXP_CB_COMMAND_S);
FXP_CDTX(sc, lasttx)->txd_txcb.cb_command &=
htole16(~FXP_CB_COMMAND_S);
FXP_CDTXSYNC(sc, lasttx,
BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
@ -881,7 +878,7 @@ fxp_intr(void *arg)
struct fxp_softc *sc = arg;
struct ethercom *ec = &sc->sc_ethercom;
struct ifnet *ifp = &sc->sc_ethercom.ec_if;
struct fxp_cb_tx *txd;
struct fxp_txdesc *txd;
struct fxp_txsoft *txs;
struct mbuf *m, *m0;
bus_dmamap_t rxmap;
@ -1036,13 +1033,11 @@ fxp_intr(void *arg)
FXP_CDTXSYNC(sc, i,
BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
txstat = le16toh(txd->cb_status);
txstat = le16toh(txd->txd_txcb.cb_status);
if ((txstat & FXP_CB_STATUS_C) == 0)
break;
FXP_CDTBDSYNC(sc, i, BUS_DMASYNC_POSTWRITE);
bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
0, txs->txs_dmamap->dm_mapsize,
BUS_DMASYNC_POSTWRITE);
@ -1287,7 +1282,7 @@ fxp_init(struct ifnet *ifp)
struct fxp_softc *sc = ifp->if_softc;
struct fxp_cb_config *cbp;
struct fxp_cb_ias *cb_ias;
struct fxp_cb_tx *txd;
struct fxp_txdesc *txd;
bus_dmamap_t rxmap;
int i, prm, save_bf, allm, error = 0;
@ -1452,11 +1447,12 @@ fxp_init(struct ifnet *ifp)
*/
for (i = 0; i < FXP_NTXCB; i++) {
txd = FXP_CDTX(sc, i);
memset(txd, 0, sizeof(struct fxp_cb_tx));
txd->cb_command =
memset(txd, 0, sizeof(*txd));
txd->txd_txcb.cb_command =
htole16(FXP_CB_COMMAND_NOP | FXP_CB_COMMAND_S);
txd->tbd_array_addr = htole32(FXP_CDTBDADDR(sc, i));
txd->link_addr = htole32(FXP_CDTXADDR(sc, FXP_NEXTTX(i)));
txd->txd_txcb.tbd_array_addr = htole32(FXP_CDTBDADDR(sc, i));
txd->txd_txcb.link_addr =
htole32(FXP_CDTXADDR(sc, FXP_NEXTTX(i)));
FXP_CDTXSYNC(sc, i, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
}
sc->sc_txpending = 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: i82557reg.h,v 1.3 1999/12/12 17:46:36 thorpej Exp $ */
/* $NetBSD: i82557reg.h,v 1.4 2001/05/21 23:58:44 thorpej Exp $ */
/*-
* Copyright (c) 1998, 1999 The NetBSD Foundation, Inc.
@ -238,6 +238,11 @@ struct fxp_cb_tx {
volatile u_int16_t byte_count;
volatile u_int8_t tx_threshold;
volatile u_int8_t tbd_number;
/*
* If using the extended TxCB feature, there is a
* single TBD right here. We handle this in the
* fxp_control_data in i82557var.h.
*/
};
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: i82557var.h,v 1.19 2001/05/21 22:20:31 thorpej Exp $ */
/* $NetBSD: i82557var.h,v 1.20 2001/05/21 23:58:44 thorpej Exp $ */
/*-
* Copyright (c) 1997, 1998, 1999 The NetBSD Foundation, Inc.
@ -102,17 +102,14 @@
*/
struct fxp_control_data {
/*
* The transmit control blocks. The first if these
* is also used as the config CB.
* The transmit control blocks and transmit buffer descriptors.
* We arrange them like this so that everything is all lined
* up to use the extended TxCB feature.
*/
struct fxp_cb_tx fcd_txcbs[FXP_NTXCB];
/*
* The transmit buffer descriptors.
*/
struct fxp_tbdlist {
struct fxp_tbd tbd_d[FXP_NTXSEG];
} fcd_tbdl[FXP_NTXCB];
struct fxp_txdesc {
struct fxp_cb_tx txd_txcb;
struct fxp_tbd txd_tbd[FXP_NTXSEG];
} fcd_txdescs[FXP_NTXCB];
/*
* The configuration CB.
@ -136,8 +133,8 @@ struct fxp_control_data {
};
#define FXP_CDOFF(x) offsetof(struct fxp_control_data, x)
#define FXP_CDTXOFF(x) FXP_CDOFF(fcd_txcbs[(x)])
#define FXP_CDTBDOFF(x) FXP_CDOFF(fcd_tbdl[(x)])
#define FXP_CDTXOFF(x) FXP_CDOFF(fcd_txdescs[(x)].txd_txcb)
#define FXP_CDTBDOFF(x) FXP_CDOFF(fcd_txdescs[(x)].txd_tbd)
#define FXP_CDCONFIGOFF FXP_CDOFF(fcd_configcb)
#define FXP_CDIASOFF FXP_CDOFF(fcd_iascb)
#define FXP_CDMCSOFF FXP_CDOFF(fcd_mcscb)
@ -227,18 +224,13 @@ struct fxp_softc {
#define FXP_CDTXADDR(sc, x) ((sc)->sc_cddma + FXP_CDTXOFF((x)))
#define FXP_CDTBDADDR(sc, x) ((sc)->sc_cddma + FXP_CDTBDOFF((x)))
#define FXP_CDTX(sc, x) (&(sc)->sc_control_data->fcd_txcbs[(x)])
#define FXP_CDTBD(sc, x) (&(sc)->sc_control_data->fcd_tbdl[(x)])
#define FXP_CDTX(sc, x) (&(sc)->sc_control_data->fcd_txdescs[(x)])
#define FXP_DSTX(sc, x) (&(sc)->sc_txsoft[(x)])
#define FXP_CDTXSYNC(sc, x, ops) \
bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_dmamap, \
FXP_CDTXOFF((x)), sizeof(struct fxp_cb_tx), (ops))
#define FXP_CDTBDSYNC(sc, x, ops) \
bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_dmamap, \
FXP_CDTBDOFF((x)), sizeof(struct fxp_tbdlist), (ops))
FXP_CDTXOFF((x)), sizeof(struct fxp_txdesc), (ops))
#define FXP_CDCONFIGSYNC(sc, ops) \
bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_dmamap, \