1/* 2 * Copyright (c) 2001-2003 3 * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4 * 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: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * Author: Hartmut Brandt <harti@freebsd.org> 28 *
| 1/* 2 * Copyright (c) 2001-2003 3 * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4 * 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: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * Author: Hartmut Brandt <harti@freebsd.org> 28 *
|
230 231 /* receiving */ 232 struct rbuf *rbufs; /* rbuf array */ 233 struct rbuf_list rbuf_free; /* free rbufs list */ 234 struct rbuf_list rbuf_used; /* used rbufs list */ 235 u_int rbuf_total; /* total number of buffs */ 236 bus_dma_tag_t rbuf_tag; /* tag for rbuf mapping */ 237 238 /* transmission */ 239 bus_dma_tag_t tx_tag; /* transmission tag */ 240 241 uint32_t heartbeat; /* last heartbeat */ 242 u_int stop_cnt; /* how many times checked */ 243 244 struct istats istats; /* internal statistics */ 245 246 /* SUNI state */ 247 struct utopia utopia; 248 249 /* sysctl support */ 250 struct sysctl_ctx_list sysctl_ctx; 251 struct sysctl_oid *sysctl_tree; 252 253#ifdef FATM_DEBUG 254 /* debugging */ 255 u_int debug; 256#endif 257}; 258 259#ifndef FATM_DEBUG 260#define FATM_LOCK(SC) mtx_lock(&(SC)->mtx) 261#define FATM_UNLOCK(SC) mtx_unlock(&(SC)->mtx) 262#else 263#define FATM_LOCK(SC) do { \ 264 DBG(SC, LOCK, ("locking in line %d", __LINE__)); \ 265 mtx_lock(&(SC)->mtx); \ 266 } while (0) 267#define FATM_UNLOCK(SC) do { \ 268 DBG(SC, LOCK, ("unlocking in line %d", __LINE__)); \ 269 mtx_unlock(&(SC)->mtx); \ 270 } while (0) 271#endif 272#define FATM_CHECKLOCK(SC) mtx_assert(&sc->mtx, MA_OWNED) 273 274/* 275 * Macros to access host memory fields that are also access by the card. 276 * These fields need to little-endian always. 277 */ 278#define H_GETSTAT(STATP) (le32toh(*(STATP))) 279#define H_SETSTAT(STATP, S) do { *(STATP) = htole32(S); } while (0) 280#define H_SETDESC(DESC, D) do { (DESC) = htole32(D); } while (0) 281 282#ifdef notyet 283#define H_SYNCSTAT_POSTREAD(SC, P) \ 284 bus_dmamap_sync_size((SC)->stat_mem.dmat, \ 285 (SC)->stat_mem.map, \ 286 (volatile char *)(P) - (volatile char *)(SC)->stat_mem.mem, \ 287 sizeof(volatile uint32_t), BUS_DMASYNC_POSTREAD) 288 289#define H_SYNCSTAT_PREWRITE(SC, P) \ 290 bus_dmamap_sync_size((SC)->stat_mem.dmat, \ 291 (SC)->stat_mem.map, \ 292 (volatile char *)(P) - (volatile char *)(SC)->stat_mem.mem, \ 293 sizeof(volatile uint32_t), BUS_DMASYNC_PREWRITE) 294 295#define H_SYNCQ_PREWRITE(M, P, SZ) \ 296 bus_dmamap_sync_size((M)->dmat, (M)->map, \ 297 (volatile char *)(P) - (volatile char *)(M)->mem, (SZ), \ 298 BUS_DMASYNC_PREWRITE) 299 300#define H_SYNCQ_POSTREAD(M, P, SZ) \ 301 bus_dmamap_sync_size((M)->dmat, (M)->map, \ 302 (volatile char *)(P) - (volatile char *)(M)->mem, (SZ), \ 303 BUS_DMASYNC_POSTREAD) 304#else 305#define H_SYNCSTAT_POSTREAD(SC, P) do { } while (0) 306#define H_SYNCSTAT_PREWRITE(SC, P) do { } while (0) 307#define H_SYNCQ_PREWRITE(M, P, SZ) do { } while (0) 308#define H_SYNCQ_POSTREAD(M, P, SZ) do { } while (0) 309#endif 310 311/* 312 * Macros to manipulate VPVCs 313 */ 314#define MKVPVC(VPI,VCI) (((VPI) << 16) | (VCI)) 315#define GETVPI(VPVC) (((VPVC) >> 16) & 0xff) 316#define GETVCI(VPVC) ((VPVC) & 0xffff) 317 318/* 319 * These macros encapsulate the bus_space functions for better readabiliy. 320 */ 321#define WRITE4(SC, OFF, VAL) bus_space_write_4(SC->memt, SC->memh, OFF, VAL) 322#define WRITE1(SC, OFF, VAL) bus_space_write_1(SC->memt, SC->memh, OFF, VAL) 323 324#define READ4(SC, OFF) bus_space_read_4(SC->memt, SC->memh, OFF) 325#define READ1(SC, OFF) bus_space_read_1(SC->memt, SC->memh, OFF) 326 327#define BARRIER_R(SC) \ 328 bus_space_barrier(SC->memt, SC->memh, 0, FATMO_END, \ 329 BUS_SPACE_BARRIER_READ) 330#define BARRIER_W(SC) \ 331 bus_space_barrier(SC->memt, SC->memh, 0, FATMO_END, \ 332 BUS_SPACE_BARRIER_WRITE) 333#define BARRIER_RW(SC) \ 334 bus_space_barrier(SC->memt, SC->memh, 0, FATMO_END, \ 335 BUS_SPACE_BARRIER_WRITE|BUS_SPACE_BARRIER_READ) 336 337#ifdef FATM_DEBUG 338#define DBG(SC, FL, PRINT) do { \ 339 if ((SC)->debug & DBG_##FL) { \ 340 if_printf(&(SC)->ifatm.ifnet, "%s: ", __func__); \ 341 printf PRINT; \ 342 printf("\n"); \ 343 } \ 344 } while (0) 345#define DBGC(SC, FL, PRINT) do { \ 346 if ((SC)->debug & DBG_##FL) \ 347 printf PRINT; \ 348 } while (0) 349 350enum { 351 DBG_RCV = 0x0001, 352 DBG_XMIT = 0x0002, 353 DBG_VCC = 0x0004, 354 DBG_IOCTL = 0x0008, 355 DBG_ATTACH = 0x0010, 356 DBG_INIT = 0x0020, 357 DBG_DMA = 0x0040, 358 DBG_BEAT = 0x0080, 359 DBG_UART = 0x0100, 360 DBG_LOCK = 0x0200, 361 362 DBG_ALL = 0xffff 363}; 364 365#else 366#define DBG(SC, FL, PRINT) 367#define DBGC(SC, FL, PRINT) 368#endif 369 370/* 371 * Configuration. 372 * 373 * This section contains tunable parameters and dependend defines. 374 */ 375#define FATM_CMD_QLEN 16 /* command queue length */ 376#ifndef TEST_DMA_SYNC 377#define FATM_TX_QLEN 128 /* transmit queue length */ 378#define FATM_RX_QLEN 64 /* receive queue length */ 379#else 380#define FATM_TX_QLEN 8 /* transmit queue length */ 381#define FATM_RX_QLEN 8 /* receive queue length */ 382#endif 383 384#define SMALL_SUPPLY_QLEN 16 385#define SMALL_POOL_SIZE 256 386#define SMALL_SUPPLY_BLKSIZE 8 387 388#define LARGE_SUPPLY_QLEN 16 389#define LARGE_POOL_SIZE 128 390#define LARGE_SUPPLY_BLKSIZE 8
| 233 234 /* receiving */ 235 struct rbuf *rbufs; /* rbuf array */ 236 struct rbuf_list rbuf_free; /* free rbufs list */ 237 struct rbuf_list rbuf_used; /* used rbufs list */ 238 u_int rbuf_total; /* total number of buffs */ 239 bus_dma_tag_t rbuf_tag; /* tag for rbuf mapping */ 240 241 /* transmission */ 242 bus_dma_tag_t tx_tag; /* transmission tag */ 243 244 uint32_t heartbeat; /* last heartbeat */ 245 u_int stop_cnt; /* how many times checked */ 246 247 struct istats istats; /* internal statistics */ 248 249 /* SUNI state */ 250 struct utopia utopia; 251 252 /* sysctl support */ 253 struct sysctl_ctx_list sysctl_ctx; 254 struct sysctl_oid *sysctl_tree; 255 256#ifdef FATM_DEBUG 257 /* debugging */ 258 u_int debug; 259#endif 260}; 261 262#ifndef FATM_DEBUG 263#define FATM_LOCK(SC) mtx_lock(&(SC)->mtx) 264#define FATM_UNLOCK(SC) mtx_unlock(&(SC)->mtx) 265#else 266#define FATM_LOCK(SC) do { \ 267 DBG(SC, LOCK, ("locking in line %d", __LINE__)); \ 268 mtx_lock(&(SC)->mtx); \ 269 } while (0) 270#define FATM_UNLOCK(SC) do { \ 271 DBG(SC, LOCK, ("unlocking in line %d", __LINE__)); \ 272 mtx_unlock(&(SC)->mtx); \ 273 } while (0) 274#endif 275#define FATM_CHECKLOCK(SC) mtx_assert(&sc->mtx, MA_OWNED) 276 277/* 278 * Macros to access host memory fields that are also access by the card. 279 * These fields need to little-endian always. 280 */ 281#define H_GETSTAT(STATP) (le32toh(*(STATP))) 282#define H_SETSTAT(STATP, S) do { *(STATP) = htole32(S); } while (0) 283#define H_SETDESC(DESC, D) do { (DESC) = htole32(D); } while (0) 284 285#ifdef notyet 286#define H_SYNCSTAT_POSTREAD(SC, P) \ 287 bus_dmamap_sync_size((SC)->stat_mem.dmat, \ 288 (SC)->stat_mem.map, \ 289 (volatile char *)(P) - (volatile char *)(SC)->stat_mem.mem, \ 290 sizeof(volatile uint32_t), BUS_DMASYNC_POSTREAD) 291 292#define H_SYNCSTAT_PREWRITE(SC, P) \ 293 bus_dmamap_sync_size((SC)->stat_mem.dmat, \ 294 (SC)->stat_mem.map, \ 295 (volatile char *)(P) - (volatile char *)(SC)->stat_mem.mem, \ 296 sizeof(volatile uint32_t), BUS_DMASYNC_PREWRITE) 297 298#define H_SYNCQ_PREWRITE(M, P, SZ) \ 299 bus_dmamap_sync_size((M)->dmat, (M)->map, \ 300 (volatile char *)(P) - (volatile char *)(M)->mem, (SZ), \ 301 BUS_DMASYNC_PREWRITE) 302 303#define H_SYNCQ_POSTREAD(M, P, SZ) \ 304 bus_dmamap_sync_size((M)->dmat, (M)->map, \ 305 (volatile char *)(P) - (volatile char *)(M)->mem, (SZ), \ 306 BUS_DMASYNC_POSTREAD) 307#else 308#define H_SYNCSTAT_POSTREAD(SC, P) do { } while (0) 309#define H_SYNCSTAT_PREWRITE(SC, P) do { } while (0) 310#define H_SYNCQ_PREWRITE(M, P, SZ) do { } while (0) 311#define H_SYNCQ_POSTREAD(M, P, SZ) do { } while (0) 312#endif 313 314/* 315 * Macros to manipulate VPVCs 316 */ 317#define MKVPVC(VPI,VCI) (((VPI) << 16) | (VCI)) 318#define GETVPI(VPVC) (((VPVC) >> 16) & 0xff) 319#define GETVCI(VPVC) ((VPVC) & 0xffff) 320 321/* 322 * These macros encapsulate the bus_space functions for better readabiliy. 323 */ 324#define WRITE4(SC, OFF, VAL) bus_space_write_4(SC->memt, SC->memh, OFF, VAL) 325#define WRITE1(SC, OFF, VAL) bus_space_write_1(SC->memt, SC->memh, OFF, VAL) 326 327#define READ4(SC, OFF) bus_space_read_4(SC->memt, SC->memh, OFF) 328#define READ1(SC, OFF) bus_space_read_1(SC->memt, SC->memh, OFF) 329 330#define BARRIER_R(SC) \ 331 bus_space_barrier(SC->memt, SC->memh, 0, FATMO_END, \ 332 BUS_SPACE_BARRIER_READ) 333#define BARRIER_W(SC) \ 334 bus_space_barrier(SC->memt, SC->memh, 0, FATMO_END, \ 335 BUS_SPACE_BARRIER_WRITE) 336#define BARRIER_RW(SC) \ 337 bus_space_barrier(SC->memt, SC->memh, 0, FATMO_END, \ 338 BUS_SPACE_BARRIER_WRITE|BUS_SPACE_BARRIER_READ) 339 340#ifdef FATM_DEBUG 341#define DBG(SC, FL, PRINT) do { \ 342 if ((SC)->debug & DBG_##FL) { \ 343 if_printf(&(SC)->ifatm.ifnet, "%s: ", __func__); \ 344 printf PRINT; \ 345 printf("\n"); \ 346 } \ 347 } while (0) 348#define DBGC(SC, FL, PRINT) do { \ 349 if ((SC)->debug & DBG_##FL) \ 350 printf PRINT; \ 351 } while (0) 352 353enum { 354 DBG_RCV = 0x0001, 355 DBG_XMIT = 0x0002, 356 DBG_VCC = 0x0004, 357 DBG_IOCTL = 0x0008, 358 DBG_ATTACH = 0x0010, 359 DBG_INIT = 0x0020, 360 DBG_DMA = 0x0040, 361 DBG_BEAT = 0x0080, 362 DBG_UART = 0x0100, 363 DBG_LOCK = 0x0200, 364 365 DBG_ALL = 0xffff 366}; 367 368#else 369#define DBG(SC, FL, PRINT) 370#define DBGC(SC, FL, PRINT) 371#endif 372 373/* 374 * Configuration. 375 * 376 * This section contains tunable parameters and dependend defines. 377 */ 378#define FATM_CMD_QLEN 16 /* command queue length */ 379#ifndef TEST_DMA_SYNC 380#define FATM_TX_QLEN 128 /* transmit queue length */ 381#define FATM_RX_QLEN 64 /* receive queue length */ 382#else 383#define FATM_TX_QLEN 8 /* transmit queue length */ 384#define FATM_RX_QLEN 8 /* receive queue length */ 385#endif 386 387#define SMALL_SUPPLY_QLEN 16 388#define SMALL_POOL_SIZE 256 389#define SMALL_SUPPLY_BLKSIZE 8 390 391#define LARGE_SUPPLY_QLEN 16 392#define LARGE_POOL_SIZE 128 393#define LARGE_SUPPLY_BLKSIZE 8
|