Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/ic Make the 3Com Etherlink XL driver work on big-end...



details:   https://anonhg.NetBSD.org/src/rev/280a5f56a50e
branches:  trunk
changeset: 472293:280a5f56a50e
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Mon Apr 26 23:28:31 1999 +0000

description:
Make the 3Com Etherlink XL driver work on big-endian systems.  From
Izumi Tsutsui, PR #7279.

diffstat:

 sys/dev/ic/elinkxl.c |  39 +++++++++++++++++++++++++--------------
 1 files changed, 25 insertions(+), 14 deletions(-)

diffs (111 lines):

diff -r 9809cdbaa411 -r 280a5f56a50e sys/dev/ic/elinkxl.c
--- a/sys/dev/ic/elinkxl.c      Mon Apr 26 23:26:11 1999 +0000
+++ b/sys/dev/ic/elinkxl.c      Mon Apr 26 23:28:31 1999 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: elinkxl.c,v 1.8 1999/04/13 23:07:25 jonathan Exp $     */
+/*     $NetBSD: elinkxl.c,v 1.9 1999/04/26 23:28:31 thorpej Exp $      */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -82,6 +82,15 @@
 #include <machine/bus.h>
 #include <machine/intr.h>
 
+#if BYTE_ORDER == BIG_ENDIAN
+#include <machine/bswap.h>
+#define        htopci(x)       bswap32(x)
+#define        pcitoh(x)       bswap32(x)
+#else
+#define        htopci(x)       (x)
+#define        pcitoh(x)       (x)
+#endif
+
 #include <vm/vm.h>
 #include <vm/pmap.h>
 
@@ -333,7 +342,8 @@
        for (i = 0; i < EX_NUPD; i++) {
                sc->sc_rxdescs[i].rx_dmamap = sc->sc_rx_dmamaps[i];
                sc->sc_rxdescs[i].rx_upd = &sc->sc_upd[i];
-               sc->sc_upd[i].upd_frags[0].fr_len = (MCLBYTES - 2) | EX_FR_LAST;
+               sc->sc_upd[i].upd_frags[0].fr_len =
+                   htopci((MCLBYTES - 2) | EX_FR_LAST);
                if (ex_add_rxbuf(sc, &sc->sc_rxdescs[i]) != 0) {
                        printf("%s: can't allocate or map rx buffers\n",
                            sc->sc_dev.dv_xname);
@@ -977,12 +987,12 @@
                fr = &txp->tx_dpd->dpd_frags[0];
                totlen = 0;
                for (segment = 0; segment < dmamap->dm_nsegs; segment++, fr++) {
-                       fr->fr_addr = dmamap->dm_segs[segment].ds_addr;
-                       fr->fr_len = dmamap->dm_segs[segment].ds_len;
-                       totlen += fr->fr_len;
+                       fr->fr_addr = htopci(dmamap->dm_segs[segment].ds_addr);
+                       fr->fr_len = htopci(dmamap->dm_segs[segment].ds_len);
+                       totlen += dmamap->dm_segs[segment].ds_len;
                }
                fr--;
-               fr->fr_len |= EX_FR_LAST;
+               fr->fr_len |= htopci(EX_FR_LAST);
                txp->tx_mbhead = mb_head;
 
                bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
@@ -990,7 +1000,7 @@
 
                dpd = txp->tx_dpd;
                dpd->dpd_nextptr = 0;
-               dpd->dpd_fsh = totlen;
+               dpd->dpd_fsh = htopci(totlen);
 
                bus_dmamap_sync(sc->sc_dmat, sc->sc_dpd_dmamap,
                    ((caddr_t)dpd - (caddr_t)sc->sc_dpd),
@@ -1010,7 +1020,7 @@
                        bus_dmamap_sync(sc->sc_dmat, sc->sc_dpd_dmamap,
                            offset, sizeof (struct ex_dpd),
                            BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
-                       prevdpd->dpd_nextptr = DPD_DMADDR(sc, txp);
+                       prevdpd->dpd_nextptr = htopci(DPD_DMADDR(sc, txp));
                        bus_dmamap_sync(sc->sc_dmat, sc->sc_dpd_dmamap,
                            offset, sizeof (struct ex_dpd),
                            BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 
@@ -1030,7 +1040,7 @@
        }
  out:
        if (sc->tx_head) {
-               sc->tx_tail->tx_dpd->dpd_fsh |= EX_DPD_DNIND;
+               sc->tx_tail->tx_dpd->dpd_fsh |= htopci(EX_DPD_DNIND);
                bus_dmamap_sync(sc->sc_dmat, sc->sc_dpd_dmamap,
                    ((caddr_t)sc->tx_tail->tx_dpd - (caddr_t)sc->sc_dpd),
                    sizeof (struct ex_dpd),
@@ -1133,7 +1143,7 @@
                        rxmap = rxd->rx_dmamap;
                        m = rxd->rx_mbhead;
                        upd = rxd->rx_upd;
-                       pktstat = upd->upd_pktstatus;
+                       pktstat = pcitoh(upd->upd_pktstatus);
 
                        bus_dmamap_sync(sc->sc_dmat, rxmap, 0,
                            rxmap->dm_mapsize,
@@ -1610,8 +1620,9 @@
        m->m_data += 2;
 
        rxd->rx_mbhead = m;
-       rxd->rx_upd->upd_pktstatus = MCLBYTES - 2;
-       rxd->rx_upd->upd_frags[0].fr_addr = rxmap->dm_segs[0].ds_addr + 2;
+       rxd->rx_upd->upd_pktstatus = htopci(MCLBYTES - 2);
+       rxd->rx_upd->upd_frags[0].fr_addr =
+           htopci(rxmap->dm_segs[0].ds_addr + 2);
        rxd->rx_upd->upd_nextptr = 0;
 
        /*
@@ -1619,8 +1630,8 @@
         */
        if (sc->rx_head != NULL) {
                sc->rx_tail->rx_next = rxd;
-               sc->rx_tail->rx_upd->upd_nextptr = sc->sc_upddma +
-                   ((caddr_t)rxd->rx_upd - (caddr_t)sc->sc_upd);
+               sc->rx_tail->rx_upd->upd_nextptr = htopci(sc->sc_upddma +
+                   ((caddr_t)rxd->rx_upd - (caddr_t)sc->sc_upd));
                bus_dmamap_sync(sc->sc_dmat, sc->sc_upd_dmamap,
                    (caddr_t)sc->rx_tail->rx_upd - (caddr_t)sc->sc_upd,
                    sizeof (struct ex_upd),



Home | Main Index | Thread Index | Old Index