summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJason Wright <jason@cvs.openbsd.org>2001-05-15 14:57:29 +0000
committerJason Wright <jason@cvs.openbsd.org>2001-05-15 14:57:29 +0000
commit1404cf845231fa7789405cf5d1972d26d5801970 (patch)
tree63f754b8fa2bb62a0c6172fa1ec9addbe00f3744 /sys
parent7080ef16cbf41aba83b9479bed9725a1af0fc03b (diff)
- correct some bus_dmamap_sync() usage
- redo dma_alloc(), dma_free() a bit (I had them right to begin with) - add an alignment shim on rx buffers on strict alignment arch's (this is hideous, but hopefully temporary) Upshot: works on alpha now
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/pci/if_txp.c90
-rw-r--r--sys/dev/pci/if_txpreg.h5
2 files changed, 62 insertions, 33 deletions
diff --git a/sys/dev/pci/if_txp.c b/sys/dev/pci/if_txp.c
index b6b03252ac1..7144c592934 100644
--- a/sys/dev/pci/if_txp.c
+++ b/sys/dev/pci/if_txp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_txp.c,v 1.28 2001/05/15 05:18:13 jason Exp $ */
+/* $OpenBSD: if_txp.c,v 1.29 2001/05/15 14:57:28 jason Exp $ */
/*
* Copyright (c) 2001
@@ -506,8 +506,7 @@ txp_download_fw_section(sc, sect, sectnum)
goto bail;
}
- bus_dmamap_sync(sc->sc_dmat, dma.dma_map,
- BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+ bus_dmamap_sync(sc->sc_dmat, dma.dma_map, BUS_DMASYNC_PREREAD);
WRITE_REG(sc, TXP_H2A_1, sect->nbytes);
WRITE_REG(sc, TXP_H2A_2, sect->cksum);
@@ -519,11 +518,9 @@ txp_download_fw_section(sc, sect, sectnum)
if (txp_download_fw_wait(sc)) {
printf(": fw wait failed, section %d\n", sectnum);
err = -1;
- goto bail;
}
- bus_dmamap_sync(sc->sc_dmat, dma.dma_map,
- BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
+ bus_dmamap_sync(sc->sc_dmat, dma.dma_map, BUS_DMASYNC_POSTREAD);
bail:
txp_dma_free(sc, &dma);
@@ -617,6 +614,38 @@ txp_rx_reclaim(sc, r)
eh = mtod(m, struct ether_header *);
ifp->if_ipackets++;
+#ifdef __STRICT_ALIGNMENT
+ {
+ /*
+ * XXX Nice chip, except it won't accept "off by 2"
+ * buffers, so we're force to copy. Supposedly
+ * this will be fixed in a newer firmware rev
+ * and this will be temporary.
+ */
+ struct mbuf *mnew;
+
+ MGETHDR(mnew, M_DONTWAIT, MT_DATA);
+ if (mnew == NULL) {
+ m_freem(m);
+ goto next;
+ }
+ if (m->m_len > (MHLEN - 2)) {
+ MCLGET(mnew, M_DONTWAIT);
+ if (!(mnew->m_flags & M_EXT)) {
+ m_freem(mnew);
+ m_freem(m);
+ goto next;
+ }
+ }
+ mnew->m_pkthdr.rcvif = ifp;
+ mnew->m_pkthdr.len = mnew->m_len = m->m_len;
+ mnew->m_data += 2;
+ bcopy(m->m_data, mnew->m_data, m->m_len);
+ m_freem(m);
+ m = mnew;
+ }
+#endif
+
#if NBPFILTER > 0
/*
* Handle BPF listeners. Let the BPF user see the packet.
@@ -1034,37 +1063,34 @@ txp_dma_malloc(sc, size, dma, mapflags)
{
int r;
- if ((r = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
- BUS_DMA_NOWAIT, &dma->dma_map)) != 0)
- return (r);
-
if ((r = bus_dmamem_alloc(sc->sc_dmat, size, PAGE_SIZE, 0,
- dma->dma_map->dm_segs, dma->dma_map->dm_nsegs,
- &dma->dma_map->dm_nsegs, BUS_DMA_NOWAIT)) != 0) {
- bus_dmamap_destroy(sc->sc_dmat, dma->dma_map);
- return (r);
- }
+ &dma->dma_seg, 1, &dma->dma_nseg, 0)) != 0)
+ goto fail_0;
- if ((r = bus_dmamem_map(sc->sc_dmat, dma->dma_map->dm_segs,
- dma->dma_map->dm_nsegs, size, &dma->dma_vaddr,
- mapflags | BUS_DMA_NOWAIT)) != 0) {
- bus_dmamem_free(sc->sc_dmat, dma->dma_map->dm_segs,
- dma->dma_map->dm_nsegs);
- bus_dmamap_destroy(sc->sc_dmat, dma->dma_map);
- return (r);
- }
+ if ((r = bus_dmamem_map(sc->sc_dmat, &dma->dma_seg, dma->dma_nseg,
+ size, &dma->dma_vaddr, mapflags | BUS_DMA_NOWAIT)) != 0)
+ goto fail_1;
+
+ if ((r = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
+ BUS_DMA_NOWAIT, &dma->dma_map)) != 0)
+ goto fail_2;
if ((r = bus_dmamap_load(sc->sc_dmat, dma->dma_map, dma->dma_vaddr,
- size, NULL, BUS_DMA_NOWAIT)) != 0) {
- bus_dmamem_unmap(sc->sc_dmat, dma->dma_vaddr, size);
- bus_dmamem_free(sc->sc_dmat, dma->dma_map->dm_segs, dma->dma_map->dm_nsegs);
- bus_dmamap_destroy(sc->sc_dmat, dma->dma_map);
- return (r);
- }
+ size, NULL, BUS_DMA_NOWAIT)) != 0)
+ goto fail_3;
dma->dma_paddr = dma->dma_map->dm_segs[0].ds_addr;
-
+ dma->dma_size = size;
return (0);
+
+fail_3:
+ bus_dmamap_destroy(sc->sc_dmat, dma->dma_map);
+fail_2:
+ bus_dmamem_unmap(sc->sc_dmat, dma->dma_vaddr, size);
+fail_1:
+ bus_dmamem_free(sc->sc_dmat, &dma->dma_seg, dma->dma_nseg);
+fail_0:
+ return (r);
}
void
@@ -1072,10 +1098,10 @@ txp_dma_free(sc, dma)
struct txp_softc *sc;
struct txp_dma_alloc *dma;
{
- bus_dmamem_unmap(sc->sc_dmat, dma->dma_vaddr, dma->dma_map->dm_mapsize);
- bus_dmamem_free(sc->sc_dmat, dma->dma_map->dm_segs, dma->dma_map->dm_nsegs);
bus_dmamap_unload(sc->sc_dmat, dma->dma_map);
bus_dmamap_destroy(sc->sc_dmat, dma->dma_map);
+ bus_dmamem_unmap(sc->sc_dmat, dma->dma_vaddr, dma->dma_size);
+ bus_dmamem_free(sc->sc_dmat, &dma->dma_seg, dma->dma_nseg);
}
int
diff --git a/sys/dev/pci/if_txpreg.h b/sys/dev/pci/if_txpreg.h
index 372f26d8754..99c6e61b856 100644
--- a/sys/dev/pci/if_txpreg.h
+++ b/sys/dev/pci/if_txpreg.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_txpreg.h,v 1.23 2001/05/15 05:18:13 jason Exp $ */
+/* $OpenBSD: if_txpreg.h,v 1.24 2001/05/15 14:57:28 jason Exp $ */
/*
* Copyright (c) 2001 Aaron Campbell <aaron@monkey.org>.
@@ -528,6 +528,9 @@ struct txp_dma_alloc {
u_int64_t dma_paddr;
caddr_t dma_vaddr;
bus_dmamap_t dma_map;
+ bus_dma_segment_t dma_seg;
+ int dma_nseg;
+ bus_size_t dma_size;
};
struct txp_cmd_ring {