if_bge.c (169878) | if_bge.c (169880) |
---|---|
1/*- 2 * Copyright (c) 2001 Wind River Systems 3 * Copyright (c) 1997, 1998, 1999, 2001 4 * Bill Paul <wpaul@windriver.com>. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 18 unchanged lines hidden (view full) --- 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 31 * THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2001 Wind River Systems 3 * Copyright (c) 1997, 1998, 1999, 2001 4 * Bill Paul <wpaul@windriver.com>. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 18 unchanged lines hidden (view full) --- 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 31 * THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#include <sys/cdefs.h> |
35__FBSDID("$FreeBSD: head/sys/dev/bge/if_bge.c 169878 2007-05-22 19:11:39Z jkim $"); | 35__FBSDID("$FreeBSD: head/sys/dev/bge/if_bge.c 169880 2007-05-22 19:22:58Z jkim $"); |
36 37/* 38 * Broadcom BCM570x family gigabit ethernet driver for FreeBSD. 39 * 40 * The Broadcom BCM5700 is based on technology originally developed by 41 * Alteon Networks as part of the Tigon I and Tigon II gigabit ethernet 42 * MAC chips. The BCM5700, sometimes refered to as the Tigon III, has 43 * two on-board MIPS R4000 CPUs and can have as much as 16MB of external --- 1131 unchanged lines hidden (view full) --- 1175 for (i = BGE_STATS_BLOCK; 1176 i < BGE_STATS_BLOCK_END + 1; i += sizeof(uint32_t)) 1177 BGE_MEMWIN_WRITE(sc, i, 0); 1178 1179 for (i = BGE_STATUS_BLOCK; 1180 i < BGE_STATUS_BLOCK_END + 1; i += sizeof(uint32_t)) 1181 BGE_MEMWIN_WRITE(sc, i, 0); 1182 | 36 37/* 38 * Broadcom BCM570x family gigabit ethernet driver for FreeBSD. 39 * 40 * The Broadcom BCM5700 is based on technology originally developed by 41 * Alteon Networks as part of the Tigon I and Tigon II gigabit ethernet 42 * MAC chips. The BCM5700, sometimes refered to as the Tigon III, has 43 * two on-board MIPS R4000 CPUs and can have as much as 16MB of external --- 1131 unchanged lines hidden (view full) --- 1175 for (i = BGE_STATS_BLOCK; 1176 i < BGE_STATS_BLOCK_END + 1; i += sizeof(uint32_t)) 1177 BGE_MEMWIN_WRITE(sc, i, 0); 1178 1179 for (i = BGE_STATUS_BLOCK; 1180 i < BGE_STATUS_BLOCK_END + 1; i += sizeof(uint32_t)) 1181 BGE_MEMWIN_WRITE(sc, i, 0); 1182 |
1183 /* Set up the PCI DMA control register. */ | 1183 /* 1184 * Set up the PCI DMA control register. 1185 */ 1186 dma_rw_ctl = BGE_PCIDMARWCTL_RD_CMD_SHIFT(6) | 1187 BGE_PCIDMARWCTL_WR_CMD_SHIFT(7); |
1184 if (sc->bge_flags & BGE_FLAG_PCIE) { | 1188 if (sc->bge_flags & BGE_FLAG_PCIE) { |
1185 /* PCI Express bus */ 1186 dma_rw_ctl = BGE_PCI_READ_CMD | BGE_PCI_WRITE_CMD | 1187 BGE_PCIDMARWCTL_RD_WAT_SHIFT(0xF) | 1188 BGE_PCIDMARWCTL_WR_WAT_SHIFT(0x2); | 1189 /* Read watermark not used, 128 bytes for write. */ 1190 dma_rw_ctl |= BGE_PCIDMARWCTL_WR_WAT_SHIFT(3); |
1189 } else if (sc->bge_flags & BGE_FLAG_PCIX) { | 1191 } else if (sc->bge_flags & BGE_FLAG_PCIX) { |
1190 /* PCI-X bus */ | |
1191 if (BGE_IS_5714_FAMILY(sc)) { | 1192 if (BGE_IS_5714_FAMILY(sc)) { |
1192 dma_rw_ctl = BGE_PCI_READ_CMD | BGE_PCI_WRITE_CMD; 1193 dma_rw_ctl &= ~BGE_PCIDMARWCTL_ONEDMA_ATONCE; /* XXX */ 1194 /* XXX magic values, Broadcom-supplied Linux driver */ 1195 dma_rw_ctl |= (1 << 20) | (1 << 18); 1196 if (sc->bge_asicrev == BGE_ASICREV_BCM5780) 1197 dma_rw_ctl |= BGE_PCIDMARWCTL_ONEDMA_ATONCE; 1198 else 1199 dma_rw_ctl |= 1 << 15; 1200 1201 } else if (sc->bge_asicrev == BGE_ASICREV_BCM5704) 1202 /* 1203 * The 5704 uses a different encoding of read/write 1204 * watermarks. 1205 */ 1206 dma_rw_ctl = BGE_PCI_READ_CMD | BGE_PCI_WRITE_CMD | 1207 BGE_PCIDMARWCTL_RD_WAT_SHIFT(0x7) | 1208 BGE_PCIDMARWCTL_WR_WAT_SHIFT(0x3); 1209 else 1210 dma_rw_ctl = BGE_PCI_READ_CMD | BGE_PCI_WRITE_CMD | 1211 BGE_PCIDMARWCTL_RD_WAT_SHIFT(0x3) | 1212 BGE_PCIDMARWCTL_WR_WAT_SHIFT(0x3) | | 1193 /* 256 bytes for read and write. */ 1194 dma_rw_ctl |= BGE_PCIDMARWCTL_RD_WAT_SHIFT(2) | 1195 BGE_PCIDMARWCTL_WR_WAT_SHIFT(2); 1196 dma_rw_ctl |= (sc->bge_asicrev == BGE_ASICREV_BCM5780) ? 1197 BGE_PCIDMARWCTL_ONEDMA_ATONCE_GLOBAL : 1198 BGE_PCIDMARWCTL_ONEDMA_ATONCE_LOCAL; 1199 } else if (sc->bge_asicrev == BGE_ASICREV_BCM5704) { 1200 /* 1536 bytes for read, 384 bytes for write. */ 1201 dma_rw_ctl |= BGE_PCIDMARWCTL_RD_WAT_SHIFT(7) | 1202 BGE_PCIDMARWCTL_WR_WAT_SHIFT(3); 1203 } else { 1204 /* 384 bytes for read and write. */ 1205 dma_rw_ctl |= BGE_PCIDMARWCTL_RD_WAT_SHIFT(3) | 1206 BGE_PCIDMARWCTL_WR_WAT_SHIFT(3) | |
1213 0x0F; | 1207 0x0F; |
1214 1215 /* 1216 * 5703 and 5704 need ONEDMA_AT_ONCE as a workaround 1217 * for hardware bugs. 1218 */ | 1208 } |
1219 if (sc->bge_asicrev == BGE_ASICREV_BCM5703 || 1220 sc->bge_asicrev == BGE_ASICREV_BCM5704) { 1221 uint32_t tmp; 1222 | 1209 if (sc->bge_asicrev == BGE_ASICREV_BCM5703 || 1210 sc->bge_asicrev == BGE_ASICREV_BCM5704) { 1211 uint32_t tmp; 1212 |
1213 /* Set ONE_DMA_AT_ONCE for hardware workaround. */ |
|
1223 tmp = CSR_READ_4(sc, BGE_PCI_CLKCTL) & 0x1F; | 1214 tmp = CSR_READ_4(sc, BGE_PCI_CLKCTL) & 0x1F; |
1224 if (tmp == 0x6 || tmp == 0x7) 1225 dma_rw_ctl |= BGE_PCIDMARWCTL_ONEDMA_ATONCE; | 1215 if (tmp == 6 || tmp == 7) 1216 dma_rw_ctl |= 1217 BGE_PCIDMARWCTL_ONEDMA_ATONCE_GLOBAL; 1218 1219 /* Set PCI-X DMA write workaround. */ 1220 dma_rw_ctl |= BGE_PCIDMARWCTL_ASRT_ALL_BE; |
1226 } | 1221 } |
1227 } else 1228 /* Conventional PCI bus */ 1229 dma_rw_ctl = BGE_PCI_READ_CMD | BGE_PCI_WRITE_CMD | 1230 BGE_PCIDMARWCTL_RD_WAT_SHIFT(0x7) | 1231 BGE_PCIDMARWCTL_WR_WAT_SHIFT(0x7) | 1232 0x0F; | 1222 } else { 1223 /* Conventional PCI bus: 256 bytes for read and write. */ 1224 dma_rw_ctl |= BGE_PCIDMARWCTL_RD_WAT_SHIFT(7) | 1225 BGE_PCIDMARWCTL_WR_WAT_SHIFT(7); |
1233 | 1226 |
1227 if (sc->bge_asicrev != BGE_ASICREV_BCM5705 && 1228 sc->bge_asicrev != BGE_ASICREV_BCM5750) 1229 dma_rw_ctl |= 0x0F; 1230 } 1231 if (sc->bge_asicrev == BGE_ASICREV_BCM5700 || 1232 sc->bge_asicrev == BGE_ASICREV_BCM5701) 1233 dma_rw_ctl |= BGE_PCIDMARWCTL_USE_MRM | 1234 BGE_PCIDMARWCTL_ASRT_ALL_BE; |
|
1234 if (sc->bge_asicrev == BGE_ASICREV_BCM5703 || | 1235 if (sc->bge_asicrev == BGE_ASICREV_BCM5703 || |
1235 sc->bge_asicrev == BGE_ASICREV_BCM5704 || 1236 sc->bge_asicrev == BGE_ASICREV_BCM5705) | 1236 sc->bge_asicrev == BGE_ASICREV_BCM5704) |
1237 dma_rw_ctl &= ~BGE_PCIDMARWCTL_MINDMA; 1238 pci_write_config(sc->bge_dev, BGE_PCI_DMA_RW_CTL, dma_rw_ctl, 4); 1239 1240 /* 1241 * Set up general mode register. 1242 */ 1243 CSR_WRITE_4(sc, BGE_MODE_CTL, BGE_DMA_SWAP_OPTIONS | 1244 BGE_MODECTL_MAC_ATTN_INTR | BGE_MODECTL_HOST_SEND_BDS | --- 3258 unchanged lines hidden --- | 1237 dma_rw_ctl &= ~BGE_PCIDMARWCTL_MINDMA; 1238 pci_write_config(sc->bge_dev, BGE_PCI_DMA_RW_CTL, dma_rw_ctl, 4); 1239 1240 /* 1241 * Set up general mode register. 1242 */ 1243 CSR_WRITE_4(sc, BGE_MODE_CTL, BGE_DMA_SWAP_OPTIONS | 1244 BGE_MODECTL_MAC_ATTN_INTR | BGE_MODECTL_HOST_SEND_BDS | --- 3258 unchanged lines hidden --- |