if_sfreg.h (175520) | if_sfreg.h (175526) |
---|---|
1/*- 2 * Copyright (c) 1997, 1998, 1999 3 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 * | 1/*- 2 * Copyright (c) 1997, 1998, 1999 3 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 * |
32 * $FreeBSD: head/sys/dev/sf/if_sfreg.h 162317 2006-09-15 11:01:23Z ru $ | 32 * $FreeBSD: head/sys/dev/sf/if_sfreg.h 175526 2008-01-21 06:38:23Z yongari $ |
33 */ 34 35/* 36 * Registers for the Adaptec AIC-6915 Starfire. The Starfire has a 512K 37 * register space. These registers can be accessed in the following way: 38 * - PCI config registers are always accessible through PCI config space 39 * - Full 512K space mapped into memory using PCI memory mapped access 40 * - 256-byte I/O space mapped through PCI I/O access --- 150 unchanged lines hidden (view full) --- 191#define SF_CURTIME 0x0078 192#define SF_ISR 0x0080 193#define SF_ISR_SHADOW 0x0084 194#define SF_IMR 0x0088 195#define SF_GPIO 0x008C 196#define SF_TXDQ_CTL 0x0090 197#define SF_TXDQ_ADDR_HIPRIO 0x0094 198#define SF_TXDQ_ADDR_LOPRIO 0x0098 | 33 */ 34 35/* 36 * Registers for the Adaptec AIC-6915 Starfire. The Starfire has a 512K 37 * register space. These registers can be accessed in the following way: 38 * - PCI config registers are always accessible through PCI config space 39 * - Full 512K space mapped into memory using PCI memory mapped access 40 * - 256-byte I/O space mapped through PCI I/O access --- 150 unchanged lines hidden (view full) --- 191#define SF_CURTIME 0x0078 192#define SF_ISR 0x0080 193#define SF_ISR_SHADOW 0x0084 194#define SF_IMR 0x0088 195#define SF_GPIO 0x008C 196#define SF_TXDQ_CTL 0x0090 197#define SF_TXDQ_ADDR_HIPRIO 0x0094 198#define SF_TXDQ_ADDR_LOPRIO 0x0098 |
199#define SF_TXDQ_ADDR_HIADDR 0x009C | 199#define SF_TXDQ_ADDR_HI 0x009C |
200#define SF_TXDQ_PRODIDX 0x00A0 201#define SF_TXDQ_CONSIDX 0x00A4 202#define SF_TXDMA_STS1 0x00A8 203#define SF_TXDMA_STS2 0x00AC 204#define SF_TX_FRAMCTL 0x00B0 | 200#define SF_TXDQ_PRODIDX 0x00A0 201#define SF_TXDQ_CONSIDX 0x00A4 202#define SF_TXDMA_STS1 0x00A8 203#define SF_TXDMA_STS2 0x00AC 204#define SF_TX_FRAMCTL 0x00B0 |
205#define SF_TXCQ_ADDR_HI 0x00B4 | 205#define SF_CQ_ADDR_HI 0x00B4 |
206#define SF_TXCQ_CTL 0x00B8 207#define SF_RXCQ_CTL_1 0x00BC 208#define SF_RXCQ_CTL_2 0x00C0 209#define SF_CQ_CONSIDX 0x00C4 210#define SF_CQ_PRODIDX 0x00C8 211#define SF_CQ_RXQ2 0x00CC 212#define SF_RXDMA_CTL 0x00D0 213#define SF_RXDQ_CTL_1 0x00D4 214#define SF_RXDQ_CTL_2 0x00D8 | 206#define SF_TXCQ_CTL 0x00B8 207#define SF_RXCQ_CTL_1 0x00BC 208#define SF_RXCQ_CTL_2 0x00C0 209#define SF_CQ_CONSIDX 0x00C4 210#define SF_CQ_PRODIDX 0x00C8 211#define SF_CQ_RXQ2 0x00CC 212#define SF_RXDMA_CTL 0x00D0 213#define SF_RXDQ_CTL_1 0x00D4 214#define SF_RXDQ_CTL_2 0x00D8 |
215#define SF_RXDQ_ADDR_HIADDR 0x00DC | 215#define SF_RXDQ_ADDR_HI 0x00DC |
216#define SF_RXDQ_ADDR_Q1 0x00E0 217#define SF_RXDQ_ADDR_Q2 0x00E4 218#define SF_RXDQ_PTR_Q1 0x00E8 219#define SF_RXDQ_PTR_Q2 0x00EC 220#define SF_RXDMA_STS 0x00F0 221#define SF_RXFILT 0x00F4 222#define SF_RX_FRAMETEST_OUT 0x00F8 223 --- 20 unchanged lines hidden (view full) --- 244#define SF_TIMER_ONESHOT 0x01000000 245#define SF_TIMER_GENTIMER_RES 0x02000000 246#define SF_TIMER_TIMEST_RES 0x04000000 247#define SF_TIMER_RXQ2DONE_DLY 0x10000000 248#define SF_TIMER_EARLYRX2_DLY 0x20000000 249#define SF_TIMER_RXQ1DONE_DLY 0x40000000 250#define SF_TIMER_EARLYRX1_DLY 0x80000000 251 | 216#define SF_RXDQ_ADDR_Q1 0x00E0 217#define SF_RXDQ_ADDR_Q2 0x00E4 218#define SF_RXDQ_PTR_Q1 0x00E8 219#define SF_RXDQ_PTR_Q2 0x00EC 220#define SF_RXDMA_STS 0x00F0 221#define SF_RXFILT 0x00F4 222#define SF_RX_FRAMETEST_OUT 0x00F8 223 --- 20 unchanged lines hidden (view full) --- 244#define SF_TIMER_ONESHOT 0x01000000 245#define SF_TIMER_GENTIMER_RES 0x02000000 246#define SF_TIMER_TIMEST_RES 0x04000000 247#define SF_TIMER_RXQ2DONE_DLY 0x10000000 248#define SF_TIMER_EARLYRX2_DLY 0x20000000 249#define SF_TIMER_RXQ1DONE_DLY 0x40000000 250#define SF_TIMER_EARLYRX1_DLY 0x80000000 251 |
252/* Timer resolution is 0.8us * 128. */ 253#define SF_IM_MIN 0 254#define SF_IM_MAX 0x1F /* 3.276ms */ 255#define SF_IM_DEFAULT 1 /* 102.4us */ 256 |
|
252/* Interrupt status register */ 253#define SF_ISR_PCIINT_ASSERTED 0x00000001 254#define SF_ISR_GFP_TX 0x00000002 255#define SF_ISR_GFP_RX 0x00000004 256#define SF_ISR_TX_BADID_HIPRIO 0x00000008 257#define SF_ISR_TX_BADID_LOPRIO 0x00000010 258#define SF_ISR_NO_TX_CSUM 0x00000020 259#define SF_ISR_RXDQ2_NOBUFS 0x00000040 --- 82 unchanged lines hidden (view full) --- 342#define SF_IMR_GENTIMER 0x01000000 343#define SF_IMR_ABNORMALINTR 0x02000000 344#define SF_IMR_RSVD0 0x04000000 345#define SF_IMR_STATSOFLOW 0x08000000 346#define SF_IMR_GPIO 0xF0000000 347 348#define SF_INTRS \ 349 (SF_IMR_RXDQ2_NOBUFS|SF_IMR_RXDQ1_DMADONE|SF_IMR_RXDQ2_DMADONE| \ | 257/* Interrupt status register */ 258#define SF_ISR_PCIINT_ASSERTED 0x00000001 259#define SF_ISR_GFP_TX 0x00000002 260#define SF_ISR_GFP_RX 0x00000004 261#define SF_ISR_TX_BADID_HIPRIO 0x00000008 262#define SF_ISR_TX_BADID_LOPRIO 0x00000010 263#define SF_ISR_NO_TX_CSUM 0x00000020 264#define SF_ISR_RXDQ2_NOBUFS 0x00000040 --- 82 unchanged lines hidden (view full) --- 347#define SF_IMR_GENTIMER 0x01000000 348#define SF_IMR_ABNORMALINTR 0x02000000 349#define SF_IMR_RSVD0 0x04000000 350#define SF_IMR_STATSOFLOW 0x08000000 351#define SF_IMR_GPIO 0xF0000000 352 353#define SF_INTRS \ 354 (SF_IMR_RXDQ2_NOBUFS|SF_IMR_RXDQ1_DMADONE|SF_IMR_RXDQ2_DMADONE| \ |
350 SF_IMR_TX_TXDONE|SF_IMR_RXDQ1_NOBUFS|SF_IMR_RXDQ2_DMADONE| \ | 355 SF_IMR_TX_DMADONE|SF_IMR_RXDQ1_NOBUFS|SF_IMR_RXDQ2_DMADONE| \ |
351 SF_IMR_NORMALINTR|SF_IMR_ABNORMALINTR|SF_IMR_TXCQ_NOBUFS| \ 352 SF_IMR_RXCQ1_NOBUFS|SF_IMR_RXCQ2_NOBUFS|SF_IMR_STATSOFLOW| \ | 356 SF_IMR_NORMALINTR|SF_IMR_ABNORMALINTR|SF_IMR_TXCQ_NOBUFS| \ 357 SF_IMR_RXCQ1_NOBUFS|SF_IMR_RXCQ2_NOBUFS|SF_IMR_STATSOFLOW| \ |
353 SF_IMR_TX_LOFIFO) | 358 SF_IMR_TX_LOFIFO|SF_IMR_DMAERR|SF_IMR_RXGFP_NORESP| \ 359 SF_IMR_NO_TX_CSUM) |
354 355/* TX descriptor queue control registers */ 356#define SF_TXDQCTL_DESCTYPE 0x00000007 357#define SF_TXDQCTL_NODMACMP 0x00000008 358#define SF_TXDQCTL_MINSPACE 0x00000070 359#define SF_TXDQCTL_64BITADDR 0x00000080 360#define SF_TXDQCTL_BURSTLEN 0x00003F00 361#define SF_TXDQCTL_SKIPLEN 0x001F0000 362#define SF_TXDQCTL_HIPRIOTHRESH 0xFF000000 363 | 360 361/* TX descriptor queue control registers */ 362#define SF_TXDQCTL_DESCTYPE 0x00000007 363#define SF_TXDQCTL_NODMACMP 0x00000008 364#define SF_TXDQCTL_MINSPACE 0x00000070 365#define SF_TXDQCTL_64BITADDR 0x00000080 366#define SF_TXDQCTL_BURSTLEN 0x00003F00 367#define SF_TXDQCTL_SKIPLEN 0x001F0000 368#define SF_TXDQCTL_HIPRIOTHRESH 0xFF000000 369 |
370#define SF_TXDMA_HIPRIO_THRESH 2 371#define SF_TXDDMA_BURST (128 / 32) 372 |
|
364#define SF_TXBUFDESC_TYPE0 0x00000000 365#define SF_TXBUFDESC_TYPE1 0x00000001 366#define SF_TXBUFDESC_TYPE2 0x00000002 367#define SF_TXBUFDESC_TYPE3 0x00000003 368#define SF_TXBUFDESC_TYPE4 0x00000004 369 370#define SF_TXMINSPACE_UNLIMIT 0x00000000 371#define SF_TXMINSPACE_32BYTES 0x00000010 --- 57 unchanged lines hidden (view full) --- 429#define SF_CQ_RXQ2_RXTHRMODE 0x00008000 430#define SF_CQ_RXQ2_PRODIDX 0x03FF0000 431 432#define SF_CQ_RXTHRMODE_INT_ON 0x00008000 433#define SF_CQ_RXTHRMODE_INT_OFF 0x00000000 434#define SF_CQ_TXTHRMODE_INT_ON 0x80000000 435#define SF_CQ_TXTHRMODE_INT_OFF 0x00000000 436 | 373#define SF_TXBUFDESC_TYPE0 0x00000000 374#define SF_TXBUFDESC_TYPE1 0x00000001 375#define SF_TXBUFDESC_TYPE2 0x00000002 376#define SF_TXBUFDESC_TYPE3 0x00000003 377#define SF_TXBUFDESC_TYPE4 0x00000004 378 379#define SF_TXMINSPACE_UNLIMIT 0x00000000 380#define SF_TXMINSPACE_32BYTES 0x00000010 --- 57 unchanged lines hidden (view full) --- 438#define SF_CQ_RXQ2_RXTHRMODE 0x00008000 439#define SF_CQ_RXQ2_PRODIDX 0x03FF0000 440 441#define SF_CQ_RXTHRMODE_INT_ON 0x00008000 442#define SF_CQ_RXTHRMODE_INT_OFF 0x00000000 443#define SF_CQ_TXTHRMODE_INT_ON 0x80000000 444#define SF_CQ_TXTHRMODE_INT_OFF 0x00000000 445 |
437#define SF_IDX_LO(x) ((x) & 0x000007FF) 438#define SF_IDX_HI(x) (((x) >> 16) & 0x000007FF) 439 | |
440/* RX DMA control register */ 441#define SF_RXDMA_BURSTSIZE 0x0000007F 442#define SF_RXDMA_FPTESTMODE 0x00000080 443#define SF_RXDMA_HIPRIOTHRESH 0x00000F00 444#define SF_RXDMA_RXEARLYTHRESH 0x0001F000 445#define SF_RXDMA_DMACRC 0x00040000 446#define SF_RXDMA_USEBKUPQUEUE 0x00080000 447#define SF_RXDMA_QUEUEMODE 0x00700000 448#define SF_RXDMA_RXCQ2_ON 0x00800000 449#define SF_RXDMA_CSUMMODE 0x03000000 450#define SF_RXDMA_DMAPAUSEPKTS 0x04000000 451#define SF_RXDMA_DMACTLPKTS 0x08000000 452#define SF_RXDMA_DMACRXERRPKTS 0x10000000 453#define SF_RXDMA_DMABADPKTS 0x20000000 454#define SF_RXDMA_DMARUNTS 0x40000000 455#define SF_RXDMA_REPORTBADPKTS 0x80000000 | 446/* RX DMA control register */ 447#define SF_RXDMA_BURSTSIZE 0x0000007F 448#define SF_RXDMA_FPTESTMODE 0x00000080 449#define SF_RXDMA_HIPRIOTHRESH 0x00000F00 450#define SF_RXDMA_RXEARLYTHRESH 0x0001F000 451#define SF_RXDMA_DMACRC 0x00040000 452#define SF_RXDMA_USEBKUPQUEUE 0x00080000 453#define SF_RXDMA_QUEUEMODE 0x00700000 454#define SF_RXDMA_RXCQ2_ON 0x00800000 455#define SF_RXDMA_CSUMMODE 0x03000000 456#define SF_RXDMA_DMAPAUSEPKTS 0x04000000 457#define SF_RXDMA_DMACTLPKTS 0x08000000 458#define SF_RXDMA_DMACRXERRPKTS 0x10000000 459#define SF_RXDMA_DMABADPKTS 0x20000000 460#define SF_RXDMA_DMARUNTS 0x40000000 461#define SF_RXDMA_REPORTBADPKTS 0x80000000 |
462#define SF_RXDMA_HIGHPRIO_THRESH 6 463#define SF_RXDMA_BURST (64 / 32) |
|
456 457#define SF_RXDQMODE_Q1ONLY 0x00100000 458#define SF_RXDQMODE_Q2_ON_FP 0x00200000 459#define SF_RXDQMODE_Q2_ON_SHORT 0x00300000 460#define SF_RXDQMODE_Q2_ON_PRIO 0x00400000 461#define SF_RXDQMODE_SPLITHDR 0x00500000 462 463#define SF_RXCSUMMODE_IGNORE 0x00000000 --- 98 unchanged lines hidden (view full) --- 562#define SF_MIIADDR_MAX 0x3FFF 563#define SF_MII_BLOCKS 32 564 565#define SF_MII_DATAVALID 0x80000000 566#define SF_MII_BUSY 0x40000000 567#define SF_MII_DATAPORT 0x0000FFFF 568 569#define SF_PHY_REG(phy, reg) \ | 464 465#define SF_RXDQMODE_Q1ONLY 0x00100000 466#define SF_RXDQMODE_Q2_ON_FP 0x00200000 467#define SF_RXDQMODE_Q2_ON_SHORT 0x00300000 468#define SF_RXDQMODE_Q2_ON_PRIO 0x00400000 469#define SF_RXDQMODE_SPLITHDR 0x00500000 470 471#define SF_RXCSUMMODE_IGNORE 0x00000000 --- 98 unchanged lines hidden (view full) --- 570#define SF_MIIADDR_MAX 0x3FFF 571#define SF_MII_BLOCKS 32 572 573#define SF_MII_DATAVALID 0x80000000 574#define SF_MII_BUSY 0x40000000 575#define SF_MII_DATAPORT 0x0000FFFF 576 577#define SF_PHY_REG(phy, reg) \ |
570 (SF_MIIADDR_BASE + (phy * SF_MII_BLOCKS * sizeof(u_int32_t)) + \ 571 (reg * sizeof(u_int32_t))) | 578 (SF_MIIADDR_BASE + ((phy) * SF_MII_BLOCKS * sizeof(uint32_t)) + \ 579 ((reg) * sizeof(uint32_t))) |
572 573/* 574 * Ethernet extra registers 0x4000 to 0x4FFF 575 */ 576#define SF_TESTMODE 0x4000 577#define SF_RX_FRAMEPROC_CTL 0x4004 578#define SF_TX_FRAMEPROC_CTL 0x4008 579 --- 28 unchanged lines hidden (view full) --- 608#define SF_MACCFG1_PASSALLRX 0x00000100 609#define SF_MACCFG1_PREAM_DETCNT 0x00000200 610#define SF_MACCFG1_RX_FLOWENB 0x00000400 611#define SF_MACCFG1_TX_FLOWENB 0x00000800 612#define SF_MACCFG1_TESTMODE 0x00003000 613#define SF_MACCFG1_MIILOOPBK 0x00004000 614#define SF_MACCFG1_SOFTRESET 0x00008000 615 | 580 581/* 582 * Ethernet extra registers 0x4000 to 0x4FFF 583 */ 584#define SF_TESTMODE 0x4000 585#define SF_RX_FRAMEPROC_CTL 0x4004 586#define SF_TX_FRAMEPROC_CTL 0x4008 587 --- 28 unchanged lines hidden (view full) --- 616#define SF_MACCFG1_PASSALLRX 0x00000100 617#define SF_MACCFG1_PREAM_DETCNT 0x00000200 618#define SF_MACCFG1_RX_FLOWENB 0x00000400 619#define SF_MACCFG1_TX_FLOWENB 0x00000800 620#define SF_MACCFG1_TESTMODE 0x00003000 621#define SF_MACCFG1_MIILOOPBK 0x00004000 622#define SF_MACCFG1_SOFTRESET 0x00008000 623 |
624#define SF_MACCFG2_AUTOVLANPAD 0x00000020 625 |
|
616/* 617 * There are the recommended IPG nibble counter settings 618 * specified in the Adaptec manual for full duplex and 619 * half duplex operation. 620 */ 621#define SF_IPGT_FDX 0x15 622#define SF_IPGT_HDX 0x11 623 --- 14 unchanged lines hidden (view full) --- 638#define SF_RXFILT_HASH_VLANOFF 0x0008 639 640/* 641 * Statistics registers 0x7000 to 0x7FFF 642 */ 643#define SF_STATS_BASE 0x7000 644#define SF_STATS_END 0x7FFF 645 | 626/* 627 * There are the recommended IPG nibble counter settings 628 * specified in the Adaptec manual for full duplex and 629 * half duplex operation. 630 */ 631#define SF_IPGT_FDX 0x15 632#define SF_IPGT_HDX 0x11 633 --- 14 unchanged lines hidden (view full) --- 648#define SF_RXFILT_HASH_VLANOFF 0x0008 649 650/* 651 * Statistics registers 0x7000 to 0x7FFF 652 */ 653#define SF_STATS_BASE 0x7000 654#define SF_STATS_END 0x7FFF 655 |
656#define SF_STATS_TX_FRAMES 0x0000 657#define SF_STATS_TX_SINGLE_COL 0x0004 658#define SF_STATS_TX_MULTI_COL 0x0008 659#define SF_STATS_TX_CRC_ERRS 0x000C 660#define SF_STATS_TX_BYTES 0x0010 661#define SF_STATS_TX_DEFERRED 0x0014 662#define SF_STATS_TX_LATE_COL 0x0018 663#define SF_STATS_TX_PAUSE 0x001C 664#define SF_STATS_TX_CTL_FRAME 0x0020 665#define SF_STATS_TX_EXCESS_COL 0x0024 666#define SF_STATS_TX_EXCESS_DEF 0x0028 667#define SF_STATS_TX_MULTI 0x002C 668#define SF_STATS_TX_BCAST 0x0030 669#define SF_STATS_TX_FRAME_LOST 0x0034 670#define SF_STATS_RX_FRAMES 0x0038 671#define SF_STATS_RX_CRC_ERRS 0x003C 672#define SF_STATS_RX_ALIGN_ERRS 0x0040 673#define SF_STATS_RX_BYTES 0x0044 674#define SF_STATS_RX_PAUSE 0x0048 675#define SF_STATS_RX_CTL_FRAME 0x004C 676#define SF_STATS_RX_UNSUP_FRAME 0x0050 677#define SF_STATS_RX_GIANTS 0x0054 678#define SF_STATS_RX_RUNTS 0x0058 679#define SF_STATS_RX_JABBER 0x005C 680#define SF_STATS_RX_FRAGMENTS 0x0060 681#define SF_STATS_RX_64 0x0064 682#define SF_STATS_RX_65_127 0x0068 683#define SF_STATS_RX_128_255 0x006C 684#define SF_STATS_RX_256_511 0x0070 685#define SF_STATS_RX_512_1023 0x0074 686#define SF_STATS_RX_1024_1518 0x0078 687#define SF_STATS_RX_FRAME_LOST 0x007C 688#define SF_STATS_TX_UNDERRUN 0x0080 689 |
|
646/* 647 * TX frame processor instruction space 0x8000 to 0x9FFF 648 */ | 690/* 691 * TX frame processor instruction space 0x8000 to 0x9FFF 692 */ |
693#define SF_TXGFP_MEM_BASE 0x8000 694#define SF_TXGFP_MEM_END 0x8FFF |
|
649 | 695 |
696/* Number of bytes of an GFP instruction. */ 697#define SF_GFP_INST_BYTES 6 |
|
650/* 651 * RX frame processor instruction space 0xA000 to 0xBFFF 652 */ | 698/* 699 * RX frame processor instruction space 0xA000 to 0xBFFF 700 */ |
701#define SF_RXGFP_MEM_BASE 0xA000 702#define SF_RXGFP_MEM_END 0xBFFF |
|
653 654/* 655 * Ethernet FIFO access space 0xC000 to 0xDFFF 656 */ 657 658/* 659 * Reserved 0xE000 to 0xFFFF 660 */ 661 662/* 663 * Descriptor data structures. 664 */ 665 | 703 704/* 705 * Ethernet FIFO access space 0xC000 to 0xDFFF 706 */ 707 708/* 709 * Reserved 0xE000 to 0xFFFF 710 */ 711 712/* 713 * Descriptor data structures. 714 */ 715 |
666 667/* Receive descriptor formats. */ 668#define SF_RX_MINSPACING 8 669#define SF_RX_DLIST_CNT 256 670#define SF_RX_CLIST_CNT 1024 671#define SF_RX_HOSTADDR(x) (((x) >> 2) & 0x3FFFFFFF) 672 | |
673/* | 716/* |
674 * RX buffer descriptor type 0, 32-bit addressing. Note that we 675 * program the RX buffer queue control register(s) to allow a 676 * descriptor spacing of 16 bytes, which leaves room after each 677 * descriptor to store a pointer to the mbuf for each buffer. | 717 * RX buffer descriptor type 0, 32-bit addressing. |
678 */ 679struct sf_rx_bufdesc_type0 { | 718 */ 719struct sf_rx_bufdesc_type0 { |
680 u_int32_t sf_valid:1, 681 sf_end:1, 682 sf_addrlo:30; 683 u_int32_t sf_pad0; 684#ifdef __i386__ 685 u_int32_t sf_pad1; 686#endif 687 struct mbuf *sf_mbuf; | 720 uint32_t sf_addrlo; 721#define SF_RX_DESC_VALID 0x00000001 722#define SF_RX_DESC_END 0x00000002 |
688}; 689 690/* | 723}; 724 725/* |
691 * RX buffer descriptor type 0, 64-bit addressing. | 726 * RX buffer descriptor type 1, 64-bit addressing. |
692 */ 693struct sf_rx_bufdesc_type1 { | 727 */ 728struct sf_rx_bufdesc_type1 { |
694 u_int32_t sf_valid:1, 695 sf_end:1, 696 sf_addrlo:30; 697 u_int32_t sf_addrhi; 698#ifdef __i386__ 699 u_int32_t sf_pad; 700#endif 701 struct mbuf *sf_mbuf; | 729 uint64_t sf_addr; |
702}; 703 704/* 705 * RX completion descriptor, type 0 (short). 706 */ 707struct sf_rx_cmpdesc_type0 { | 730}; 731 732/* 733 * RX completion descriptor, type 0 (short). 734 */ 735struct sf_rx_cmpdesc_type0 { |
708 u_int32_t sf_len:16, 709 sf_endidx:11, 710 sf_status1:3, 711 sf_id:2; | 736 uint32_t sf_rx_status1; 737#define SF_RX_CMPDESC_LEN 0x0000ffff 738#define SF_RX_CMPDESC_EIDX 0x07ff0000 739#define SF_RX_CMPDESC_STAT1 0x38000000 740#define SF_RX_CMPDESC_ID 0x40000000 |
712}; 713 714/* 715 * RX completion descriptor, type 1 (basic). Includes vlan ID 716 * if this is a vlan-addressed packet, plus extended status. 717 */ 718struct sf_rx_cmpdesc_type1 { | 741}; 742 743/* 744 * RX completion descriptor, type 1 (basic). Includes vlan ID 745 * if this is a vlan-addressed packet, plus extended status. 746 */ 747struct sf_rx_cmpdesc_type1 { |
719 u_int32_t sf_len:16, 720 sf_endidx:11, 721 sf_status1:3, 722 sf_id:2; 723 u_int16_t sf_status2; 724 u_int16_t sf_vlanid; | 748 uint32_t sf_rx_status1; 749 uint32_t sf_rx_status2; 750#define SF_RX_CMPDESC_VLAN 0x0000ffff 751#define SF_RX_CMPDESC_STAT2 0xffff0000 |
725}; 726 727/* 728 * RX completion descriptor, type 2 (checksum). Includes partial TCP/IP 729 * checksum instead of vlan tag, plus extended status. 730 */ 731struct sf_rx_cmpdesc_type2 { | 752}; 753 754/* 755 * RX completion descriptor, type 2 (checksum). Includes partial TCP/IP 756 * checksum instead of vlan tag, plus extended status. 757 */ 758struct sf_rx_cmpdesc_type2 { |
732 u_int32_t sf_len:16, 733 sf_endidx:11, 734 sf_status1:3, 735 sf_id:2; 736 u_int16_t sf_status2; 737 u_int16_t sf_cksum; | 759 uint32_t sf_rx_status1; 760 uint32_t sf_rx_status2; 761#define SF_RX_CMPDESC_CSUM2 0x0000ffff |
738}; 739 740/* 741 * RX completion descriptor type 3 (full). Includes timestamp, partial 742 * TCP/IP checksum, vlan tag plus priority, two extended status fields. 743 */ 744struct sf_rx_cmpdesc_type3 { | 762}; 763 764/* 765 * RX completion descriptor type 3 (full). Includes timestamp, partial 766 * TCP/IP checksum, vlan tag plus priority, two extended status fields. 767 */ 768struct sf_rx_cmpdesc_type3 { |
745 u_int32_t sf_len:16, 746 sf_endidx:11, 747 sf_status1:3, 748 sf_id:2; 749 u_int32_t sf_startidx:10, 750 sf_status3:6, 751 sf_status2:16; 752 u_int16_t sf_cksum; 753 u_int16_t sf_vlanid_prio; 754 u_int32_t sf_timestamp; | 769 uint32_t sf_rx_status1; 770 uint32_t sf_rx_status2; 771 uint32_t sf_rx_status3; 772#define SF_RX_CMPDESC_CSUM3 0xffff0000 773#define SF_RX_CMPDESC_VLANPRI 0x0000ffff 774 uint32_t sf_rx_timestamp; |
755}; 756 | 775}; 776 |
757#define SF_RXSTAT1_QUEUE 0x1 758#define SF_RXSTAT1_FIFOFULL 0x2 759#define SF_RXSTAT1_OK 0x4 | 777#define SF_RXSTAT1_QUEUE 0x08000000 778#define SF_RXSTAT1_FIFOFULL 0x10000000 779#define SF_RXSTAT1_OK 0x20000000 |
760 | 780 |
761 /* 0=unknown,5=unsupported */ 762#define SF_RXSTAT2_FRAMETYPE 0x0007 /* 1=IPv4,2=IPv2,3=IPX,4=ICMP */ 763#define SF_RXSTAT2_UDP 0x0008 764#define SF_RXSTAT2_TCP 0x0010 765#define SF_RXSTAT2_FRAG 0x0020 766#define SF_RXSTAT2_PCSUM_OK 0x0040 /* partial checksum ok */ 767#define SF_RXSTAT2_CSUM_BAD 0x0080 /* TCP/IP checksum bad */ 768#define SF_RXSTAT2_CSUM_OK 0x0100 /* TCP/IP checksum ok */ 769#define SF_RXSTAT2_VLAN 0x0200 770#define SF_RXSTAT2_BADRXCODE 0x0400 771#define SF_RXSTAT2_DRIBBLE 0x0800 772#define SF_RXSTAT2_ISL_CRCERR 0x1000 773#define SF_RXSTAT2_CRCERR 0x2000 774#define SF_RXSTAT2_HASH 0x4000 775#define SF_RXSTAT2_PERFECT 0x8000 | 781#define SF_RXSTAT2_FRAMETYPE_MASK 0x00070000 782#define SF_RXSTAT2_FRAMETYPE_UNKN 0x00000000 783#define SF_RXSTAT2_FRAMETYPE_IPV4 0x00010000 784#define SF_RXSTAT2_FRAMETYPE_IPV6 0x00020000 785#define SF_RXSTAT2_FRAMETYPE_IPX 0x00030000 786#define SF_RXSTAT2_FRAMETYPE_ICMP 0x00040000 787#define SF_RXSTAT2_FRAMETYPE_UNSPRT 0x00050000 788#define SF_RXSTAT2_UDP 0x00080000 789#define SF_RXSTAT2_TCP 0x00100000 790#define SF_RXSTAT2_FRAG 0x00200000 791#define SF_RXSTAT2_PCSUM_OK 0x00400000 /* partial checksum ok */ 792#define SF_RXSTAT2_CSUM_BAD 0x00800000 /* TCP/IP checksum bad */ 793#define SF_RXSTAT2_CSUM_OK 0x01000000 /* TCP/IP checksum ok */ 794#define SF_RXSTAT2_VLAN 0x02000000 795#define SF_RXSTAT2_BADRXCODE 0x04000000 796#define SF_RXSTAT2_DRIBBLE 0x08000000 797#define SF_RXSTAT2_ISL_CRCERR 0x10000000 798#define SF_RXSTAT2_CRCERR 0x20000000 799#define SF_RXSTAT2_HASH 0x40000000 800#define SF_RXSTAT2_PERFECT 0x80000000 801#define SF_RXSTAT2_MASK 0xFFFF0000 |
776 | 802 |
777#define SF_RXSTAT3_TRAILER 0x01 778#define SF_RXSTAT3_HEADER 0x02 779#define SF_RXSTAT3_CONTROL 0x04 780#define SF_RXSTAT3_PAUSE 0x08 781#define SF_RXSTAT3_ISL 0x10 | 803#define SF_RXSTAT3_ISL 0x00008000 804#define SF_RXSTAT3_PAUSE 0x00004000 805#define SF_RXSTAT3_CONTROL 0x00002000 806#define SF_RXSTAT3_HEADER 0x00001000 807#define SF_RXSTAT3_TRAILER 0x00000800 808#define SF_RXSTAT3_START_IDX_MASK 0x000007FF |
782 | 809 |
783/* 784 * Transmit descriptor formats. 785 * Each transmit descriptor type allows for a skip field at the 786 * start of each structure. The size of the skip field can vary, 787 * however we always set it for 8 bytes, which is enough to hold 788 * a pointer (32 bits on x86, 64-bits on alpha) that we can use 789 * to hold the address of the head of the mbuf chain for the 790 * frame or fragment associated with the descriptor. This saves 791 * us from having to create a separate pointer array to hold 792 * the mbuf addresses. 793 */ 794#define SF_TX_BUFDESC_ID 0xB 795#define SF_MAXFRAGS 14 796#define SF_TX_MINSPACING 128 797#define SF_TX_DLIST_CNT 128 798#define SF_TX_DLIST_SIZE 16384 799#define SF_TX_SKIPLEN 1 800#define SF_TX_CLIST_CNT 1024 801 | |
802struct sf_frag { | 810struct sf_frag { |
803 u_int32_t sf_addr; 804 u_int16_t sf_fraglen; 805 u_int16_t sf_pktlen; | 811 uint32_t sf_addr; 812 uint16_t sf_fraglen; 813 uint16_t sf_pktlen; |
806}; 807 808struct sf_frag_msdos { | 814}; 815 816struct sf_frag_msdos { |
809 u_int16_t sf_pktlen; 810 u_int16_t sf_fraglen; 811 u_int32_t sf_addr; | 817 uint16_t sf_pktlen; 818 uint16_t sf_fraglen; 819 uint32_t sf_addr; |
812}; 813 814/* 815 * TX frame descriptor type 0, 32-bit addressing. One descriptor can | 820}; 821 822/* 823 * TX frame descriptor type 0, 32-bit addressing. One descriptor can |
816 * be used to map multiple packet fragments. We use this format since 817 * BSD networking fragments packet data across mbuf chains. Note that 818 * the number of fragments can be variable depending on how the descriptor 819 * spacing is specified in the TX descriptor queue control register. | 824 * be used to map multiple packet fragments. Note that the number of 825 * fragments can be variable depending on how the descriptor spacing 826 * is specified in the TX descriptor queue control register. |
820 * We always use a spacing of 128 bytes, and a skipfield length of 8 821 * bytes: this means 16 bytes for the descriptor, including the skipfield, 822 * with 121 bytes left for fragment maps. Each fragment requires 8 bytes, 823 * which allows for 14 fragments per descriptor. The total size of the 824 * transmit buffer queue is limited to 16384 bytes, so with a spacing of 825 * 128 bytes per descriptor, we have room for 128 descriptors in the queue. 826 */ 827struct sf_tx_bufdesc_type0 { | 827 * We always use a spacing of 128 bytes, and a skipfield length of 8 828 * bytes: this means 16 bytes for the descriptor, including the skipfield, 829 * with 121 bytes left for fragment maps. Each fragment requires 8 bytes, 830 * which allows for 14 fragments per descriptor. The total size of the 831 * transmit buffer queue is limited to 16384 bytes, so with a spacing of 832 * 128 bytes per descriptor, we have room for 128 descriptors in the queue. 833 */ 834struct sf_tx_bufdesc_type0 { |
828#ifdef __i386__ 829 u_int32_t sf_pad; 830#endif 831 struct mbuf *sf_mbuf; 832 u_int32_t sf_rsvd0:24, 833 sf_crcen:1, 834 sf_caltcp:1, 835 sf_end:1, 836 sf_intr:1, 837 sf_id:4; 838 u_int8_t sf_fragcnt; 839 u_int8_t sf_rsvd2; 840 u_int16_t sf_rsvd1; 841 struct sf_frag sf_frags[14]; | 835 uint32_t sf_tx_ctrl; 836#define SF_TX_DESC_CRCEN 0x01000000 837#define SF_TX_DESC_CALTCP 0x02000000 838#define SF_TX_DESC_END 0x04000000 839#define SF_TX_DESC_INTR 0x08000000 840#define SF_TX_DESC_ID 0xb0000000 841 uint32_t sf_tx_frag; 842 /* 843 * Depending on descriptor spacing/skip field length it 844 * can have fixed number of struct sf_frag. 845 * struct sf_frag sf_frags[14]; 846 */ |
842}; 843 844/* 845 * TX buffer descriptor type 1, 32-bit addressing. Each descriptor 846 * maps a single fragment. 847 */ 848struct sf_tx_bufdesc_type1 { | 847}; 848 849/* 850 * TX buffer descriptor type 1, 32-bit addressing. Each descriptor 851 * maps a single fragment. 852 */ 853struct sf_tx_bufdesc_type1 { |
849#ifdef __i386__ 850 u_int32_t sf_pad; 851#endif 852 struct mbuf *sf_mbuf; 853 u_int32_t sf_fraglen:16, 854 sf_fragcnt:8, 855 sf_crcen:1, 856 sf_caltcp:1, 857 sf_end:1, 858 sf_intr:1, 859 sf_id:4; 860 u_int32_t sf_addr; | 854 uint32_t sf_tx_ctrl; 855#define SF_TX_DESC_FRAGLEN 0x0000ffff 856#define SF_TX_DESC_FRAGCNT 0x00ff0000 857 uint32_t sf_addrlo; |
861}; 862 863/* 864 * TX buffer descriptor type 2, 64-bit addressing. Each descriptor 865 * maps a single fragment. 866 */ 867struct sf_tx_bufdesc_type2 { | 858}; 859 860/* 861 * TX buffer descriptor type 2, 64-bit addressing. Each descriptor 862 * maps a single fragment. 863 */ 864struct sf_tx_bufdesc_type2 { |
868#ifdef __i386__ 869 u_int32_t sf_pad; 870#endif 871 struct mbuf *sf_mbuf; 872 u_int32_t sf_fraglen:16, 873 sf_fragcnt:8, 874 sf_crcen:1, 875 sf_caltcp:1, 876 sf_end:1, 877 sf_intr:1, 878 sf_id:4; 879 u_int32_t sf_addrlo; 880 u_int32_t sf_addrhi; | 865 uint32_t sf_tx_ctrl; 866 uint32_t sf_tx_reserved; 867 uint64_t sf_addr; |
881}; 882 883/* TX buffer descriptor type 3 is not defined. */ 884 885/* 886 * TX frame descriptor type 4, 32-bit addressing. This is a special 887 * case of the type 0 descriptor, identical except that the fragment 888 * address and length fields are ordered differently. This is done 889 * to optimize copies in MS-DOS and OS/2 drivers. 890 */ 891struct sf_tx_bufdesc_type4 { | 868}; 869 870/* TX buffer descriptor type 3 is not defined. */ 871 872/* 873 * TX frame descriptor type 4, 32-bit addressing. This is a special 874 * case of the type 0 descriptor, identical except that the fragment 875 * address and length fields are ordered differently. This is done 876 * to optimize copies in MS-DOS and OS/2 drivers. 877 */ 878struct sf_tx_bufdesc_type4 { |
892#ifdef __i386__ 893 u_int32_t sf_pad; 894#endif 895 struct mbuf *sf_mbuf; 896 u_int32_t sf_rsvd0:24, 897 sf_crcen:1, 898 sf_caltcp:1, 899 sf_end:1, 900 sf_intr:1, 901 sf_id:4; 902 u_int8_t sf_fragcnt; 903 u_int8_t sf_rsvd2; 904 u_int16_t sf_rsvd1; 905 struct sf_frag_msdos sf_frags[14]; | 879 uint32_t sf_tx_ctrl; 880 uint32_t sf_tx_frag; 881 /* 882 * Depending on descriptor spacing/skip field length it 883 * can have fixed number of struct sf_frag_msdos. 884 * 885 * struct sf_frag_msdos sf_frags[14]; 886 */ |
906}; 907 908/* 909 * Transmit completion queue descriptor formats. 910 */ 911 912/* 913 * Transmit DMA completion descriptor, type 0. 914 */ | 887}; 888 889/* 890 * Transmit completion queue descriptor formats. 891 */ 892 893/* 894 * Transmit DMA completion descriptor, type 0. 895 */ |
915#define SF_TXCMPTYPE_DMA 0x4 | 896#define SF_TXCMPTYPE_DMA 0x80000000 897#define SF_TXCMPTYPE_TX 0xa0000000 |
916struct sf_tx_cmpdesc_type0 { | 898struct sf_tx_cmpdesc_type0 { |
917 u_int32_t sf_index:15, 918 sf_priority:1, 919 sf_timestamp:13, 920 sf_type:3; | 899 uint32_t sf_tx_status1; 900#define SF_TX_CMPDESC_IDX 0x00007fff 901#define SF_TX_CMPDESC_HIPRI 0x00008000 902#define SF_TX_CMPDESC_STAT 0x1fff0000 903#define SF_TX_CMPDESC_TYPE 0xe0000000 |
921}; 922 923/* 924 * Transmit completion descriptor, type 1. 925 */ | 904}; 905 906/* 907 * Transmit completion descriptor, type 1. 908 */ |
926#define SF_TXCMPTYPE_TX 0x5 | |
927struct sf_tx_cmpdesc_type1 { | 909struct sf_tx_cmpdesc_type1 { |
928 u_int32_t sf_index:15, 929 sf_priority:1, 930 sf_txstat:13, 931 sf_type:3; | 910 uint32_t sf_tx_status1; 911 uint32_t sf_tx_status2; |
932}; 933 | 912}; 913 |
934#define SF_TXSTAT_CRCERR 0x0001 935#define SF_TXSTAT_LENCHECKERR 0x0002 936#define SF_TXSTAT_LENRANGEERR 0x0004 937#define SF_TXSTAT_TX_OK 0x0008 938#define SF_TXSTAT_TX_DEFERED 0x0010 939#define SF_TXSTAT_EXCESS_DEFER 0x0020 940#define SF_TXSTAT_EXCESS_COLL 0x0040 941#define SF_TXSTAT_LATE_COLL 0x0080 942#define SF_TXSTAT_TOOBIG 0x0100 943#define SF_TXSTAT_TX_UNDERRUN 0x0200 944#define SF_TXSTAT_CTLFRAME_OK 0x0400 945#define SF_TXSTAT_PAUSEFRAME_OK 0x0800 946#define SF_TXSTAT_PAUSED 0x1000 | 914#define SF_TXSTAT_CRCERR 0x00010000 915#define SF_TXSTAT_LENCHECKERR 0x00020000 916#define SF_TXSTAT_LENRANGEERR 0x00040000 917#define SF_TXSTAT_TX_OK 0x00080000 918#define SF_TXSTAT_TX_DEFERED 0x00100000 919#define SF_TXSTAT_EXCESS_DEFER 0x00200000 920#define SF_TXSTAT_EXCESS_COLL 0x00400000 921#define SF_TXSTAT_LATE_COLL 0x00800000 922#define SF_TXSTAT_TOOBIG 0x01000000 923#define SF_TXSTAT_TX_UNDERRUN 0x02000000 924#define SF_TXSTAT_CTLFRAME_OK 0x04000000 925#define SF_TXSTAT_PAUSEFRAME_OK 0x08000000 926#define SF_TXSTAT_PAUSED 0x10000000 |
947 948/* Statistics counters. */ 949struct sf_stats { | 927 928/* Statistics counters. */ 929struct sf_stats { |
950 u_int32_t sf_tx_frames; 951 u_int32_t sf_tx_single_colls; 952 u_int32_t sf_tx_multi_colls; 953 u_int32_t sf_tx_crcerrs; 954 u_int32_t sf_tx_bytes; 955 u_int32_t sf_tx_defered; 956 u_int32_t sf_tx_late_colls; 957 u_int32_t sf_tx_pause_frames; 958 u_int32_t sf_tx_control_frames; 959 u_int32_t sf_tx_excess_colls; 960 u_int32_t sf_tx_excess_defer; 961 u_int32_t sf_tx_mcast_frames; 962 u_int32_t sf_tx_bcast_frames; 963 u_int32_t sf_tx_frames_lost; 964 u_int32_t sf_rx_rx_frames; 965 u_int32_t sf_rx_crcerrs; 966 u_int32_t sf_rx_alignerrs; 967 u_int32_t sf_rx_bytes; 968 u_int32_t sf_rx_control_frames; 969 u_int32_t sf_rx_unsup_control_frames; 970 u_int32_t sf_rx_giants; 971 u_int32_t sf_rx_runts; 972 u_int32_t sf_rx_jabbererrs; 973 u_int32_t sf_rx_pkts_64; 974 u_int32_t sf_rx_pkts_65_127; 975 u_int32_t sf_rx_pkts_128_255; 976 u_int32_t sf_rx_pkts_256_511; 977 u_int32_t sf_rx_pkts_512_1023; 978 u_int32_t sf_rx_pkts_1024_1518; 979 u_int32_t sf_rx_frames_lost; 980 u_int16_t sf_tx_underruns; 981 u_int16_t sf_pad; | 930 uint64_t sf_tx_frames; 931 uint32_t sf_tx_single_colls; 932 uint32_t sf_tx_multi_colls; 933 uint32_t sf_tx_crcerrs; 934 uint64_t sf_tx_bytes; 935 uint32_t sf_tx_deferred; 936 uint32_t sf_tx_late_colls; 937 uint32_t sf_tx_pause_frames; 938 uint32_t sf_tx_control_frames; 939 uint32_t sf_tx_excess_colls; 940 uint32_t sf_tx_excess_defer; 941 uint32_t sf_tx_mcast_frames; 942 uint32_t sf_tx_bcast_frames; 943 uint32_t sf_tx_frames_lost; 944 uint64_t sf_rx_frames; 945 uint32_t sf_rx_crcerrs; 946 uint32_t sf_rx_alignerrs; 947 uint64_t sf_rx_bytes; 948 uint32_t sf_rx_pause_frames; 949 uint32_t sf_rx_control_frames; 950 uint32_t sf_rx_unsup_control_frames; 951 uint32_t sf_rx_giants; 952 uint32_t sf_rx_runts; 953 uint32_t sf_rx_jabbererrs; 954 uint32_t sf_rx_fragments; 955 uint64_t sf_rx_pkts_64; 956 uint64_t sf_rx_pkts_65_127; 957 uint64_t sf_rx_pkts_128_255; 958 uint64_t sf_rx_pkts_256_511; 959 uint64_t sf_rx_pkts_512_1023; 960 uint64_t sf_rx_pkts_1024_1518; 961 uint32_t sf_rx_frames_lost; 962 uint32_t sf_tx_underruns; 963 uint32_t sf_tx_gfp_stall; 964 uint32_t sf_rx_gfp_stall; |
982}; 983 984/* 985 * register space access macros 986 */ 987#define CSR_WRITE_4(sc, reg, val) \ | 965}; 966 967/* 968 * register space access macros 969 */ 970#define CSR_WRITE_4(sc, reg, val) \ |
988 bus_space_write_4(sc->sf_btag, sc->sf_bhandle, reg, val) | 971 bus_write_4((sc)->sf_res, reg, val) |
989 990#define CSR_READ_4(sc, reg) \ | 972 973#define CSR_READ_4(sc, reg) \ |
991 bus_space_read_4(sc->sf_btag, sc->sf_bhandle, reg) | 974 bus_read_4((sc)->sf_res, reg) |
992 993#define CSR_READ_1(sc, reg) \ | 975 976#define CSR_READ_1(sc, reg) \ |
994 bus_space_read_1(sc->sf_btag, sc->sf_bhandle, reg) | 977 bus_read_1((sc)->sf_res, reg) |
995 996 997struct sf_type { | 978 979 980struct sf_type { |
998 u_int16_t sf_vid; 999 u_int16_t sf_did; | 981 uint16_t sf_vid; 982 uint16_t sf_did; |
1000 char *sf_name; | 983 char *sf_name; |
984 uint16_t sf_sdid; 985 char *sf_sname; |
|
1001}; 1002 | 986}; 987 |
1003#define SF_INC(x, y) (x) = (x + 1) % y | 988/* Use Tx descriptor type 2 : 64bit buffer descriptor */ 989#define sf_tx_rdesc sf_tx_bufdesc_type2 990/* Use Rx descriptor type 1 : 64bit buffer descriptor */ 991#define sf_rx_rdesc sf_rx_bufdesc_type1 992/* Use Tx completion type 0 */ 993#define sf_tx_rcdesc sf_tx_cmpdesc_type0 994/* Use Rx completion type 2 : checksum */ 995#define sf_rx_rcdesc sf_rx_cmpdesc_type2 |
1004 | 996 |
1005#define ETHER_ALIGN 2 | 997#define SF_TX_DLIST_CNT 256 998#define SF_RX_DLIST_CNT 256 999#define SF_TX_CLIST_CNT 1024 1000#define SF_RX_CLIST_CNT 1024 1001#define SF_TX_DLIST_SIZE (sizeof(struct sf_tx_rdesc) * SF_TX_DLIST_CNT) 1002#define SF_TX_CLIST_SIZE (sizeof(struct sf_tx_rcdesc) * SF_TX_CLIST_CNT) 1003#define SF_RX_DLIST_SIZE (sizeof(struct sf_rx_rdesc) * SF_RX_DLIST_CNT) 1004#define SF_RX_CLIST_SIZE (sizeof(struct sf_rx_rcdesc) * SF_RX_CLIST_CNT) 1005#define SF_RING_ALIGN 256 1006#define SF_RX_ALIGN sizeof(uint32_t) 1007#define SF_MAXTXSEGS 16 |
1006 | 1008 |
1007/* 1008 * Note: alignment is important here: each list must be aligned to 1009 * a 256-byte boundary. It turns out that each ring is some multiple 1010 * of 4K in length, so we can stack them all on top of each other 1011 * and just worry about aligning the whole mess. There's one transmit 1012 * buffer ring and two receive buffer rings: one RX ring is for small 1013 * packets and the other is for large packets. Each buffer ring also 1014 * has a companion completion queue. 1015 */ 1016struct sf_list_data { 1017 struct sf_tx_bufdesc_type0 sf_tx_dlist[SF_TX_DLIST_CNT]; 1018 struct sf_tx_cmpdesc_type1 sf_tx_clist[SF_TX_CLIST_CNT]; 1019 struct sf_rx_bufdesc_type0 sf_rx_dlist_big[SF_RX_DLIST_CNT]; 1020#ifdef notdef 1021 /* 1022 * Unfortunately, because the Starfire doesn't allow arbitrary 1023 * byte alignment, we have to copy packets in the RX handler in 1024 * order to align the payload correctly. This means that we 1025 * don't gain anything by having separate large and small descriptor 1026 * lists, so for now we don't bother with the small one. 1027 */ 1028 struct sf_rx_bufdesc_type0 sf_rx_dlist_small[SF_RX_DLIST_CNT]; 1029#endif 1030 struct sf_rx_cmpdesc_type3 sf_rx_clist[SF_RX_CLIST_CNT]; | 1009#define SF_ADDR_LO(x) ((uint64_t)(x) & 0xffffffff) 1010#define SF_ADDR_HI(x) ((uint64_t)(x) >> 32) 1011#define SF_TX_DLIST_ADDR(sc, i) \ 1012 ((sc)->sf_rdata.sf_tx_ring_paddr + sizeof(struct sf_tx_rdesc) * (i)) 1013#define SF_TX_CLIST_ADDR(sc, i) \ 1014 ((sc)->sf_rdata.sf_tx_cring_paddr + sizeof(struct sf_tx_crdesc) * (i)) 1015#define SF_RX_DLIST_ADDR(sc, i) \ 1016 ((sc)->sf_rdata.sf_rx_ring_paddr + sizeof(struct sf_rx_rdesc) * (i)) 1017#define SF_RX_CLIST_ADDR(sc, i) \ 1018 ((sc)->sf_rdata.sf_rx_cring_paddr + sizeof(struct sf_rx_rcdesc) * (i)) 1019 1020#define SF_INC(x, y) (x) = ((x) + 1) % y 1021 1022#define SF_MAX_FRAMELEN 1536 1023#define SF_TX_THRESHOLD_UNIT 16 1024#define SF_MAX_TX_THRESHOLD (SF_MAX_FRAMELEN / SF_TX_THRESHOLD_UNIT) 1025#define SF_MIN_TX_THRESHOLD (128 / SF_TX_THRESHOLD_UNIT) 1026 1027struct sf_txdesc { 1028 struct mbuf *tx_m; 1029 int ndesc; 1030 bus_dmamap_t tx_dmamap; |
1031}; 1032 | 1031}; 1032 |
1033struct sf_rxdesc { 1034 struct mbuf *rx_m; 1035 bus_dmamap_t rx_dmamap; 1036}; 1037 1038struct sf_chain_data { 1039 bus_dma_tag_t sf_parent_tag; 1040 bus_dma_tag_t sf_tx_tag; 1041 struct sf_txdesc sf_txdesc[SF_TX_DLIST_CNT]; 1042 bus_dma_tag_t sf_rx_tag; 1043 struct sf_rxdesc sf_rxdesc[SF_RX_DLIST_CNT]; 1044 bus_dma_tag_t sf_tx_ring_tag; 1045 bus_dma_tag_t sf_rx_ring_tag; 1046 bus_dma_tag_t sf_tx_cring_tag; 1047 bus_dma_tag_t sf_rx_cring_tag; 1048 bus_dmamap_t sf_tx_ring_map; 1049 bus_dmamap_t sf_rx_ring_map; 1050 bus_dmamap_t sf_rx_sparemap; 1051 bus_dmamap_t sf_tx_cring_map; 1052 bus_dmamap_t sf_rx_cring_map; 1053 int sf_tx_prod; 1054 int sf_tx_cnt; 1055 int sf_txc_cons; 1056 int sf_rxc_cons; 1057}; 1058 1059struct sf_ring_data { 1060 struct sf_tx_rdesc *sf_tx_ring; 1061 bus_addr_t sf_tx_ring_paddr; 1062 struct sf_tx_rcdesc *sf_tx_cring; 1063 bus_addr_t sf_tx_cring_paddr; 1064 struct sf_rx_rdesc *sf_rx_ring; 1065 bus_addr_t sf_rx_ring_paddr; 1066 struct sf_rx_rcdesc *sf_rx_cring; 1067 bus_addr_t sf_rx_cring_paddr; 1068}; 1069 1070 |
|
1033struct sf_softc { 1034 struct ifnet *sf_ifp; /* interface info */ 1035 device_t sf_dev; /* device info */ | 1071struct sf_softc { 1072 struct ifnet *sf_ifp; /* interface info */ 1073 device_t sf_dev; /* device info */ |
1036 bus_space_handle_t sf_bhandle; /* bus space handle */ 1037 bus_space_tag_t sf_btag; /* bus space tag */ | |
1038 void *sf_intrhand; /* interrupt handler cookie */ 1039 struct resource *sf_irq; /* irq resource descriptor */ 1040 struct resource *sf_res; /* mem/ioport resource */ | 1074 void *sf_intrhand; /* interrupt handler cookie */ 1075 struct resource *sf_irq; /* irq resource descriptor */ 1076 struct resource *sf_res; /* mem/ioport resource */ |
1077 int sf_restype; 1078 int sf_rid; |
|
1041 struct sf_type *sf_info; /* Starfire adapter info */ 1042 device_t sf_miibus; | 1079 struct sf_type *sf_info; /* Starfire adapter info */ 1080 device_t sf_miibus; |
1043 struct sf_list_data *sf_ldata; 1044 int sf_tx_cnt; 1045 u_int8_t sf_link; | 1081 struct sf_chain_data sf_cdata; 1082 struct sf_ring_data sf_rdata; |
1046 int sf_if_flags; | 1083 int sf_if_flags; |
1047 struct callout sf_stat_callout; | 1084 struct callout sf_co; 1085 int sf_watchdog_timer; 1086 struct task sf_link_task; 1087 int sf_link; 1088 int sf_suspended; 1089 int sf_detach; 1090 uint32_t sf_txthresh; 1091 int sf_int_mod; 1092 struct sf_stats sf_statistics; |
1048 struct mtx sf_mtx; 1049#ifdef DEVICE_POLLING 1050 int rxcycles; 1051#endif /* DEVICE_POLLING */ 1052}; 1053 1054 1055#define SF_LOCK(_sc) mtx_lock(&(_sc)->sf_mtx) 1056#define SF_UNLOCK(_sc) mtx_unlock(&(_sc)->sf_mtx) 1057#define SF_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sf_mtx, MA_OWNED) 1058 1059#define SF_TIMEOUT 1000 | 1093 struct mtx sf_mtx; 1094#ifdef DEVICE_POLLING 1095 int rxcycles; 1096#endif /* DEVICE_POLLING */ 1097}; 1098 1099 1100#define SF_LOCK(_sc) mtx_lock(&(_sc)->sf_mtx) 1101#define SF_UNLOCK(_sc) mtx_unlock(&(_sc)->sf_mtx) 1102#define SF_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sf_mtx, MA_OWNED) 1103 1104#define SF_TIMEOUT 1000 |