Module Name: src Committed By: thorpej Date: Sun Mar 8 19:02:03 UTC 2020
Modified Files: src/sys/dev/pci: if_txp.c if_txpreg.h Log Message: - Use BUS_ADDR_{LO,HI}32(), and rather than forcing the descriptor DMA addresses into a 64-bit value (and thus using 64-bit shifts when unnecessary), just reference the address from the DMA map directly. - Add some missing byte-swaps. To generate a diff of this commit: cvs rdiff -u -r1.64 -r1.65 src/sys/dev/pci/if_txp.c cvs rdiff -u -r1.6 -r1.7 src/sys/dev/pci/if_txpreg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_txp.c diff -u src/sys/dev/pci/if_txp.c:1.64 src/sys/dev/pci/if_txp.c:1.65 --- src/sys/dev/pci/if_txp.c:1.64 Sat Feb 29 21:31:55 2020 +++ src/sys/dev/pci/if_txp.c Sun Mar 8 19:02:03 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_txp.c,v 1.64 2020/02/29 21:31:55 thorpej Exp $ */ +/* $NetBSD: if_txp.c,v 1.65 2020/03/08 19:02:03 thorpej Exp $ */ /* * Copyright (c) 2001 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_txp.c,v 1.64 2020/02/29 21:31:55 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_txp.c,v 1.65 2020/03/08 19:02:03 thorpej Exp $"); #include "opt_inet.h" @@ -589,8 +589,8 @@ txp_download_fw_section(struct txp_softc WRITE_REG(sc, TXP_H2A_1, le32toh(sect->nbytes)); WRITE_REG(sc, TXP_H2A_2, le32toh(sect->cksum)); WRITE_REG(sc, TXP_H2A_3, le32toh(sect->addr)); - WRITE_REG(sc, TXP_H2A_4, dma.dma_paddr >> 32); - WRITE_REG(sc, TXP_H2A_5, dma.dma_paddr & 0xffffffff); + WRITE_REG(sc, TXP_H2A_4, BUS_ADDR_HI32(dma.dma_paddr)); + WRITE_REG(sc, TXP_H2A_5, BUS_ADDR_LO32(dma.dma_paddr)); WRITE_REG(sc, TXP_H2A_0, TXP_BOOTCMD_SEGMENT_AVAILABLE); if (txp_download_fw_wait(sc)) { @@ -825,10 +825,10 @@ txp_rxbuf_reclaim(struct txp_softc *sc) /* stash away pointer */ memcpy(__UNVOLATILE(&rbd->rb_vaddrlo), &sd, sizeof(sd)); - rbd->rb_paddrlo = ((uint64_t)sd->sd_map->dm_segs[0].ds_addr) - & 0xffffffff; - rbd->rb_paddrhi = ((uint64_t)sd->sd_map->dm_segs[0].ds_addr) - >> 32; + rbd->rb_paddrlo = + htole32(BUS_ADDR_LO32(sd->sd_map->dm_segs[0].ds_addr)); + rbd->rb_paddrhi = + htole32(BUS_ADDR_HI32(sd->sd_map->dm_segs[0].ds_addr)); bus_dmamap_sync(sc->sc_dmat, sd->sd_map, 0, sd->sd_map->dm_mapsize, BUS_DMASYNC_PREREAD); @@ -955,8 +955,8 @@ txp_alloc_rings(struct txp_softc *sc) goto bail_boot; } memset(sc->sc_host_dma.dma_vaddr, 0, sizeof(struct txp_hostvar)); - boot->br_hostvar_lo = htole32(sc->sc_host_dma.dma_paddr & 0xffffffff); - boot->br_hostvar_hi = htole32(sc->sc_host_dma.dma_paddr >> 32); + boot->br_hostvar_lo = htole32(BUS_ADDR_LO32(sc->sc_host_dma.dma_paddr)); + boot->br_hostvar_hi = htole32(BUS_ADDR_HI32(sc->sc_host_dma.dma_paddr)); sc->sc_hostvar = (struct txp_hostvar *)sc->sc_host_dma.dma_vaddr; /* high priority tx ring */ @@ -967,11 +967,14 @@ txp_alloc_rings(struct txp_softc *sc) } memset(sc->sc_txhiring_dma.dma_vaddr, 0, sizeof(struct txp_tx_desc) * TX_ENTRIES); - boot->br_txhipri_lo = htole32(sc->sc_txhiring_dma.dma_paddr & 0xffffffff); - boot->br_txhipri_hi = htole32(sc->sc_txhiring_dma.dma_paddr >> 32); + boot->br_txhipri_lo = + htole32(BUS_ADDR_LO32(sc->sc_txhiring_dma.dma_paddr)); + boot->br_txhipri_hi = + htole32(BUS_ADDR_HI32(sc->sc_txhiring_dma.dma_paddr)); boot->br_txhipri_siz = htole32(TX_ENTRIES * sizeof(struct txp_tx_desc)); sc->sc_txhir.r_reg = TXP_H2A_1; - sc->sc_txhir.r_desc = (struct txp_tx_desc *)sc->sc_txhiring_dma.dma_vaddr; + sc->sc_txhir.r_desc = + (struct txp_tx_desc *)sc->sc_txhiring_dma.dma_vaddr; sc->sc_txhir.r_cons = sc->sc_txhir.r_prod = sc->sc_txhir.r_cnt = 0; sc->sc_txhir.r_off = &sc->sc_hostvar->hv_tx_hi_desc_read_idx; for (i = 0; i < TX_ENTRIES; i++) { @@ -995,11 +998,14 @@ txp_alloc_rings(struct txp_softc *sc) } memset(sc->sc_txloring_dma.dma_vaddr, 0, sizeof(struct txp_tx_desc) * TX_ENTRIES); - boot->br_txlopri_lo = htole32(sc->sc_txloring_dma.dma_paddr & 0xffffffff); - boot->br_txlopri_hi = htole32(sc->sc_txloring_dma.dma_paddr >> 32); + boot->br_txlopri_lo = + htole32(BUS_ADDR_LO32(sc->sc_txloring_dma.dma_paddr)); + boot->br_txlopri_hi = + htole32(BUS_ADDR_HI32(sc->sc_txloring_dma.dma_paddr)); boot->br_txlopri_siz = htole32(TX_ENTRIES * sizeof(struct txp_tx_desc)); sc->sc_txlor.r_reg = TXP_H2A_3; - sc->sc_txlor.r_desc = (struct txp_tx_desc *)sc->sc_txloring_dma.dma_vaddr; + sc->sc_txlor.r_desc = + (struct txp_tx_desc *)sc->sc_txloring_dma.dma_vaddr; sc->sc_txlor.r_cons = sc->sc_txlor.r_prod = sc->sc_txlor.r_cnt = 0; sc->sc_txlor.r_off = &sc->sc_hostvar->hv_tx_lo_desc_read_idx; @@ -1011,8 +1017,10 @@ txp_alloc_rings(struct txp_softc *sc) } memset(sc->sc_rxhiring_dma.dma_vaddr, 0, sizeof(struct txp_rx_desc) * RX_ENTRIES); - boot->br_rxhipri_lo = htole32(sc->sc_rxhiring_dma.dma_paddr & 0xffffffff); - boot->br_rxhipri_hi = htole32(sc->sc_rxhiring_dma.dma_paddr >> 32); + boot->br_rxhipri_lo = + htole32(BUS_ADDR_LO32(sc->sc_rxhiring_dma.dma_paddr)); + boot->br_rxhipri_hi = + htole32(BUS_ADDR_HI32(sc->sc_rxhiring_dma.dma_paddr)); boot->br_rxhipri_siz = htole32(RX_ENTRIES * sizeof(struct txp_rx_desc)); sc->sc_rxhir.r_desc = (struct txp_rx_desc *)sc->sc_rxhiring_dma.dma_vaddr; @@ -1029,8 +1037,10 @@ txp_alloc_rings(struct txp_softc *sc) } memset(sc->sc_rxloring_dma.dma_vaddr, 0, sizeof(struct txp_rx_desc) * RX_ENTRIES); - boot->br_rxlopri_lo = htole32(sc->sc_rxloring_dma.dma_paddr & 0xffffffff); - boot->br_rxlopri_hi = htole32(sc->sc_rxloring_dma.dma_paddr >> 32); + boot->br_rxlopri_lo = + htole32(BUS_ADDR_LO32(sc->sc_rxloring_dma.dma_paddr)); + boot->br_rxlopri_hi = + htole32(BUS_ADDR_HI32(sc->sc_rxloring_dma.dma_paddr)); boot->br_rxlopri_siz = htole32(RX_ENTRIES * sizeof(struct txp_rx_desc)); sc->sc_rxlor.r_desc = (struct txp_rx_desc *)sc->sc_rxloring_dma.dma_vaddr; @@ -1047,8 +1057,8 @@ txp_alloc_rings(struct txp_softc *sc) } memset(sc->sc_cmdring_dma.dma_vaddr, 0, sizeof(struct txp_cmd_desc) * CMD_ENTRIES); - boot->br_cmd_lo = htole32(sc->sc_cmdring_dma.dma_paddr & 0xffffffff); - boot->br_cmd_hi = htole32(sc->sc_cmdring_dma.dma_paddr >> 32); + boot->br_cmd_lo = htole32(BUS_ADDR_LO32(sc->sc_cmdring_dma.dma_paddr)); + boot->br_cmd_hi = htole32(BUS_ADDR_HI32(sc->sc_cmdring_dma.dma_paddr)); boot->br_cmd_siz = htole32(CMD_ENTRIES * sizeof(struct txp_cmd_desc)); sc->sc_cmdring.base = (struct txp_cmd_desc *)sc->sc_cmdring_dma.dma_vaddr; sc->sc_cmdring.size = CMD_ENTRIES * sizeof(struct txp_cmd_desc); @@ -1062,8 +1072,8 @@ txp_alloc_rings(struct txp_softc *sc) } memset(sc->sc_rspring_dma.dma_vaddr, 0, sizeof(struct txp_rsp_desc) * RSP_ENTRIES); - boot->br_resp_lo = htole32(sc->sc_rspring_dma.dma_paddr & 0xffffffff); - boot->br_resp_hi = htole32(sc->sc_rspring_dma.dma_paddr >> 32); + boot->br_resp_lo = htole32(BUS_ADDR_LO32(sc->sc_rspring_dma.dma_paddr)); + boot->br_resp_hi = htole32(BUS_ADDR_HI32(sc->sc_rspring_dma.dma_paddr)); boot->br_resp_siz = htole32(CMD_ENTRIES * sizeof(struct txp_rsp_desc)); sc->sc_rspring.base = (struct txp_rsp_desc *)sc->sc_rspring_dma.dma_vaddr; sc->sc_rspring.size = RSP_ENTRIES * sizeof(struct txp_rsp_desc); @@ -1077,8 +1087,8 @@ txp_alloc_rings(struct txp_softc *sc) } memset(sc->sc_rxbufring_dma.dma_vaddr, 0, sizeof(struct txp_rxbuf_desc) * RXBUF_ENTRIES); - boot->br_rxbuf_lo = htole32(sc->sc_rxbufring_dma.dma_paddr & 0xffffffff); - boot->br_rxbuf_hi = htole32(sc->sc_rxbufring_dma.dma_paddr >> 32); + boot->br_rxbuf_lo = htole32(BUS_ADDR_LO32(sc->sc_rxbufring_dma.dma_paddr)); + boot->br_rxbuf_hi = htole32(BUS_ADDR_HI32(sc->sc_rxbufring_dma.dma_paddr)); boot->br_rxbuf_siz = htole32(RXBUF_ENTRIES * sizeof(struct txp_rxbuf_desc)); sc->sc_rxbufs = (struct txp_rxbuf_desc *)sc->sc_rxbufring_dma.dma_vaddr; for (nb = 0; nb < RXBUF_ENTRIES; nb++) { @@ -1112,9 +1122,9 @@ txp_alloc_rings(struct txp_softc *sc) sc->sc_rxbufs[nb].rb_paddrlo = - ((uint64_t)sd->sd_map->dm_segs[0].ds_addr) & 0xffffffff; + htole32(BUS_ADDR_LO32(sd->sd_map->dm_segs[0].ds_addr)); sc->sc_rxbufs[nb].rb_paddrhi = - ((uint64_t)sd->sd_map->dm_segs[0].ds_addr) >> 32; + htole32(BUS_ADDR_HI32(sd->sd_map->dm_segs[0].ds_addr)); } bus_dmamap_sync(sc->sc_dmat, sc->sc_rxbufring_dma.dma_map, 0, sc->sc_rxbufring_dma.dma_map->dm_mapsize, @@ -1129,8 +1139,8 @@ txp_alloc_rings(struct txp_softc *sc) goto bail_rxbufring; } memset(sc->sc_zero_dma.dma_vaddr, 0, sizeof(uint32_t)); - boot->br_zero_lo = htole32(sc->sc_zero_dma.dma_paddr & 0xffffffff); - boot->br_zero_hi = htole32(sc->sc_zero_dma.dma_paddr >> 32); + boot->br_zero_lo = htole32(BUS_ADDR_LO32(sc->sc_zero_dma.dma_paddr)); + boot->br_zero_hi = htole32(BUS_ADDR_HI32(sc->sc_zero_dma.dma_paddr)); /* See if it's waiting for boot, and try to boot it */ for (i = 0; i < 10000; i++) { @@ -1143,8 +1153,8 @@ txp_alloc_rings(struct txp_softc *sc) printf(": not waiting for boot\n"); goto bail; } - WRITE_REG(sc, TXP_H2A_2, sc->sc_boot_dma.dma_paddr >> 32); - WRITE_REG(sc, TXP_H2A_1, sc->sc_boot_dma.dma_paddr & 0xffffffff); + WRITE_REG(sc, TXP_H2A_2, BUS_ADDR_HI32(sc->sc_boot_dma.dma_paddr)); + WRITE_REG(sc, TXP_H2A_1, BUS_ADDR_LO32(sc->sc_boot_dma.dma_paddr)); WRITE_REG(sc, TXP_H2A_0, TXP_BOOTCMD_REGISTER_BOOT_RECORD); /* See if it booted */ @@ -1485,13 +1495,11 @@ txp_start(struct ifnet *ifp) fxd->frag_flags = FRAG_FLAGS_TYPE_FRAG | FRAG_FLAGS_VALID; fxd->frag_rsvd1 = 0; - fxd->frag_len = sd->sd_map->dm_segs[i].ds_len; + fxd->frag_len = htole16(sd->sd_map->dm_segs[i].ds_len); fxd->frag_addrlo = - ((uint64_t)sd->sd_map->dm_segs[i].ds_addr) & - 0xffffffff; + htole32(BUS_ADDR_LO32(sd->sd_map->dm_segs[i].ds_addr)); fxd->frag_addrhi = - ((uint64_t)sd->sd_map->dm_segs[i].ds_addr) >> - 32; + htole32(BUS_ADDR_HI32(sd->sd_map->dm_segs[i].ds_addr)); fxd->frag_rsvd2 = 0; bus_dmamap_sync(sc->sc_dmat, Index: src/sys/dev/pci/if_txpreg.h diff -u src/sys/dev/pci/if_txpreg.h:1.6 src/sys/dev/pci/if_txpreg.h:1.7 --- src/sys/dev/pci/if_txpreg.h:1.6 Sat Oct 27 17:18:34 2012 +++ src/sys/dev/pci/if_txpreg.h Sun Mar 8 19:02:03 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_txpreg.h,v 1.6 2012/10/27 17:18:34 chs Exp $ */ +/* $NetBSD: if_txpreg.h,v 1.7 2020/03/08 19:02:03 thorpej Exp $ */ /* * Copyright (c) 2001 Aaron Campbell <aa...@monkey.org>. @@ -525,9 +525,9 @@ struct txp_hostvar { #define TXP_OFFSET2IDX(off) ((off) >> 4) struct txp_dma_alloc { - u_int64_t dma_paddr; void * dma_vaddr; bus_dmamap_t dma_map; +#define dma_paddr dma_map->dm_segs[0].ds_addr bus_dma_segment_t dma_seg; int dma_nseg; };