/* * Copyright (c) 2010 Steven Stallion. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * 3. Neither the name of the copyright owner nor the names of any * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _EFE_H #define _EFE_H #ifdef __cplusplus extern "C" { #endif #define VENDOR_ID 0x10B8 #define DEVICE_ID 0x0005 #define RESET_DELAY 1 #define RESET_TEST_CYCLES 16 #define STOP_DELAY 10 #define STOP_DELAY_CYCLES 160 #define MII_DELAY 1 #define MII_DELAY_CYCLES 16 #define EEPROM_DELAY 3 #define EEPROM_WORDSZ 16 #define AT93C46_ADDRLEN 6 #define AT93C56_ADDRLEN 8 #define FLAG_RUNNING (1UL << 0) #define FLAG_SUSPENDED (1UL << 1) #define MCHASHL 64 #define MCHASHSZ 16 #define BURSTLEN 0x3F #define RXDESCL 128 #define TXDESCL 128 #define BUFSZ 1536 /* * Control/Status registers. */ #define CSR_COMMAND 0x00 /* Control Register */ #define CSR_INTSTAT 0x04 /* Interrupt Status Register */ #define CSR_INTMASK 0x08 /* Interrupt Mask Register */ #define CSR_GENCTL 0x0C /* General Control Register */ #define CSR_NVCTL 0x10 /* Non-volatile Control Register */ #define CSR_EECTL 0x14 /* EEPROM Control Register */ #define CSR_PBLCNT 0x18 /* Programmable Burst Length Counter */ #define CSR_TEST 0x1C /* Test Register */ #define CSR_CRCCNT 0x20 /* CRC Error Counter */ #define CSR_ALICNT 0x24 /* Frame Alignment Error Counter */ #define CSR_MPCNT 0x28 /* Missed Packet Counter */ #define CSR_RXFIFO 0x2C /* Receive FIFO Contents */ #define CSR_MMCTL 0x30 /* MII Control Register */ #define CSR_MMDATA 0x34 /* MII Interface Register */ #define CSR_MMCFG 0x38 /* MII Configuration Register */ #define CSR_IPG 0x3C /* Interpacket Gap Register */ #define CSR_LAN0 0x40 /* LAN Address Register 0 */ #define CSR_LAN1 0x44 /* LAN Address Register 1 */ #define CSR_LAN2 0x48 /* LAN Address Register 2 */ #define CSR_IDCHK 0x4C /* Board ID/Checksum Register */ #define CSR_MC0 0x50 /* Multicast Address Register 0 */ #define CSR_MC1 0x54 /* Multicast Address Register 1 */ #define CSR_MC2 0x58 /* Multicast Address Register 2 */ #define CSR_MC3 0x5C /* Multicast Address Register 3 */ #define CSR_RXCON 0x60 /* Receive Control Register */ #define CSR_RXSTAT 0x64 /* Receive Status Register */ #define CSR_RXCNT 0x68 /* Receive Byte Count */ #define CSR_RXTEST 0x6C /* Receive Test */ #define CSR_TXCON 0x70 /* Transmit Control Register */ #define CSR_TXSTAT 0x74 /* Transmit Status Register */ #define CSR_TDPAR 0x78 /* Transmit Packet Address */ #define CSR_TXTEST 0x7C /* Transmit Test */ #define CSR_PRFDAR 0x80 /* PCI Receive First Descriptor Address */ #define CSR_PRCDAR 0x84 /* PCI Receive Current Descriptor Address */ #define CSR_PRHDAR 0x88 /* PCI Receive Host Data Address */ #define CSR_PRFLAR 0x8C /* PCI Receive Fragment List Address */ #define CSR_PRDLGTH 0x90 /* PCI Receive DMA Length/Control */ #define CSR_PRFCNT 0x94 /* PCI Receive Fragment Count */ #define CSR_PRLCAR 0x98 /* PCI Receive RAM Current Address */ #define CSR_PRLPAR 0x9C /* PCI Receive RAM Packet Address */ #define CSR_PREFAR 0xA0 /* PCI Receive End of Frame Address */ #define CSR_PRSTAT 0xA4 /* PCI Receive DMA Status Register */ #define CSR_PRBUF 0xA8 /* Receive RAM Buffer */ #define CSR_RDNCAR 0xAC /* Receive MTU Current Address */ #define CSR_PRCPTHR 0xB0 /* PCI Receive Copy Threshold Register */ #define CSR_ROMDATA 0xB4 /* ROMDATA */ #define CSR_PREEMPR 0xBC /* Preemptive Interrupt */ #define CSR_PTFDAR 0xC0 /* PCI Transmit First Descriptor Address */ #define CSR_PTCDAR 0xC4 /* PCI Transmit Current Descriptor Address */ #define CSR_PTHDAR 0xC8 /* PCI Transmit Host Data Address */ #define CSR_PTFLAR 0xCC /* PCI Transmit Fragment List Address */ #define CSR_PTDLGTH 0xD0 /* PCI Transmit DMA Length/Control */ #define CSR_PTFCNT 0xD4 /* PCI Transmit Fragment Count */ #define CSR_PTLCAR 0xD8 /* PCI Transmit RAM Current Address */ #define CSR_ETXTHR 0xDC /* PCI Early Transmit Threshold Register */ #define CSR_PTETXC 0xE0 /* PCI Early Transmit Count */ #define CSR_PTSTAT 0xE4 /* PCI Transmit DMA Status */ #define CSR_PTBUF 0xE8 /* Transmit RAM Buffer */ #define CSR_PTFDAR2 0xEC /* PCI Transmit 2 First Descriptor Address */ #define CSR_FEVTR 0xF0 /* CardBus (UNUSED) */ #define CSR_FEVTRMSKR 0xF4 /* CardBus (UNUSED) */ #define CSR_FPRSTSTR 0xF8 /* CardBus (UNUSED) */ #define CSR_FFRCEVTR 0xFF /* CardBus (UNUSED) */ /* * Register fields. */ #define COMMAND_STOP_RX (1UL << 0) /* Stop Receiver */ #define COMMAND_START_RX (1UL << 1) /* Start Receiver */ #define COMMAND_TXQUEUED (1UL << 2) /* Queue TX Descriptor */ #define COMMAND_RXQUEUED (1UL << 3) /* Queue RX Descriptor */ #define COMMAND_NEXTFRAME (1UL << 4) /* Release RX Frame */ #define COMMAND_STOP_TDMA (1UL << 5) /* Stop TX DMA */ #define COMMAND_STOP_RDMA (1UL << 6) /* Stop RX DMA */ #define COMMAND_TXUGO (1UL << 7) /* Restart Transmission */ #define INTSTAT_RCC (1UL << 0) /* Receive Copy Complete */ #define INTSTAT_HCC (1UL << 1) /* Header Copy Complete */ #define INTSTAT_RQE (1UL << 2) /* Receive Queue Empty */ #define INTSTAT_OVW (1UL << 3) /* Receive Overflow */ #define INTSTAT_RXE (1UL << 4) /* Receive Error */ #define INTSTAT_TXC (1UL << 5) /* Transmit Complete */ #define INTSTAT_TCC (1UL << 6) /* Transmit Chain Complete */ #define INTSTAT_TQE (1UL << 7) /* Transmit Queue Empty */ #define INTSTAT_TXU (1UL << 8) /* Transmit Underrun */ #define INTSTAT_CNT (1UL << 9) /* Counter Overflow */ #define INTSTAT_PREI (1UL << 10) /* Preemptive Interrupt */ #define INTSTAT_RCT (1UL << 11) /* Receive Copy Threshold */ #define INTSTAT_FATAL (1UL << 12) /* Fatal Error */ #define INTSTAT_PME (1UL << 14) /* Power Management Event */ #define INTSTAT_GP2 (1UL << 15) /* GPIO Event */ #define INTSTAT_ACTV (1UL << 16) /* Interrupt Active */ #define INTSTAT_RXIDLE (1UL << 17) /* Receive Idle */ #define INTSTAT_TXIDLE (1UL << 18) /* Transmit Idle */ #define INTSTAT_RCIP (1UL << 19) /* Receive Copy in Progress */ #define INTSTAT_TCIP (1UL << 20) /* Transmit Copy in Progress */ #define INTSTAT_RBE (1UL << 21) /* Receive Buffers Empty */ #define INTSTAT_RCTS (1UL << 22) /* Receive Copy Threshold Status */ #define INTSTAT_RSV (1UL << 23) /* Receive Status Valid */ #define INTSTAT_DPE (1UL << 24) /* PCI Data Parity Error */ #define INTSTAT_APE (1UL << 25) /* PCI Address Parity Error */ #define INTSTAT_PMA (1UL << 26) /* PCI Master Abort */ #define INTSTAT_PTA (1UL << 27) /* PCI Target Abort */ #define INTMASK_RCC (1UL << 0) /* Receive Copy Complete */ #define INTMASK_HCC (1UL << 1) /* Header Copy Complete */ #define INTMASK_RQE (1UL << 2) /* Receive Queue Empty */ #define INTMASK_OVW (1UL << 3) /* Receive Overflow */ #define INTMASK_RXE (1UL << 4) /* Receive Error */ #define INTMASK_TXC (1UL << 5) /* Transmit Complete */ #define INTMASK_TCC (1UL << 6) /* Transmit Chain Complete */ #define INTMASK_TQE (1UL << 7) /* Transmit Queue Empty */ #define INTMASK_TXU (1UL << 8) /* Transmit Underrun */ #define INTMASK_CNT (1UL << 9) /* Counter Overflow */ #define INTMASK_PREI (1UL << 10) /* Preemptive Interrupt */ #define INTMASK_RCT (1UL << 11) /* Receive Copy Threshold */ #define INTMASK_FATAL (1UL << 12) /* Fatal Error */ #define INTMASK_PME (1UL << 14) /* Power Management Event */ #define INTMASK_GP2 (1UL << 15) /* GPIO Event */ #define GENCTL_RESET (1UL << 0) /* Soft Reset */ #define GENCTL_INT (1UL << 1) /* Interrupt Enable */ #define GENCTL_SWINT (1UL << 2) /* Software Interrupt */ #define GENCTL_PWRDWN (1UL << 3) /* Power Down */ #define GENCTL_ONECOPY (1UL << 4) /* One Copy per Receive Frame */ #define GENCTL_BE (1UL << 5) /* Big Endian */ #define GENCTL_RDP (1UL << 6) /* Receive DMA Priority */ #define GENCTL_TDP (1UL << 7) /* Transmit DMA Priority */ #define GENCTL_RFT_32 (0UL << 8) /* Receive FIFO Threshold (1/4) */ #define GENCTL_RFT_64 (1UL << 8) /* Receive FIFO Threshold (1/2) */ #define GENCTL_RFT_96 (2UL << 8) /* Receive FIFO Threshold (3/4) */ #define GENCTL_RFT_128 (3UL << 8) /* Receive FIFO Threshold (FULL) */ #define GENCTL_MRM (1UL << 10) /* Memory Read Multiple */ #define GENCTL_MRL (1UL << 11) /* Memory Read Line */ #define GENCTL_SOFT0 (1UL << 12) /* Software Bit 0 */ #define GENCTL_SOFT1 (1UL << 13) /* Software Bit 1 */ #define GENCTL_RSTPHY (1UL << 14) /* PHY Reset */ #define GENCTL_SCLK (1UL << 16) /* System Clock */ #define GENCTL_RD (1UL << 17) /* Reset Disable */ #define GENCTL_MPE (1UL << 18) /* Magic Packet Enable */ #define GENCTL_PME (1UL << 19) /* PME Interrupt Enable */ #define GENCTL_PS_00 (0UL << 20) /* Power State "00" */ #define GENCTL_PS_01 (1UL << 20) /* Power State "01" */ #define GENCTL_PS_10 (2UL << 20) /* Power State "10" */ #define GENCTL_PS_11 (3UL << 20) /* Power State "11" */ #define GENCTL_OPLE (1UL << 22) /* On Power Loss Enable */ #define NVCTL_EMM (1UL << 0) /* Enable Memory Map */ #define NVCTL_CRS (1UL << 1) /* Clock Run Supported */ #define NVCTL_GPOE1 (1UL << 2) /* General Purpose Output Enable 1 */ #define NVCTL_GPOE2 (1UL << 3) /* General Purpose Output Enable 2 */ #define NVCTL_GPIO1 (1UL << 4) /* General Purpose I/O 1 */ #define NVCTL_GPIO2 (1UL << 5) /* General Purpose I/O 2 */ #define NVCTL_CB_MODE (1UL << 6) /* CardBus (UNUSED) */ #define NVCTL_IPG_DLY 7 /* Inter-packet Gap Timer Delay */ #define EECTL_ENABLE (1UL << 0) /* EEPROM Enable */ #define EECTL_EECS (1UL << 1) /* EEPROM Chip Select */ #define EECTL_EESK (1UL << 2) /* EEPROM Clock */ #define EECTL_EEDI (1UL << 3) /* EEPROM Data Input */ #define EECTL_EEDO (1UL << 4) /* EEPROM Data Output */ #define EECTL_EERDY (1UL << 5) /* EEPROM Ready */ #define EECTL_SIZE (1UL << 6) /* EEPROM Size */ #define TEST_CLOCK (1UL << 3) /* Clock Test */ #define MMCTL_READ (1UL << 0) /* MII Read */ #define MMCTL_WRITE (1UL << 1) /* MII Write */ #define MMCTL_RESPONDER (1UL << 3) /* MII Responder */ #define MMCTL_PHYREG 4 /* PHY Address */ #define MMCTL_PHYADDR 9 /* PHY Register Address */ #define MMCFG_SME (1UL << 0) /* Serial Mode Enable */ #define MMCFG_EN694 (1UL << 1) /* EN694 Pin */ #define MMCFG_694LNK (1UL << 2) /* 694LNK Pin */ #define MMCFG_PHY (1UL << 3) /* PHY Present */ #define MMCFG_SMI (1UL << 4) /* Enable Serial Management */ #define MMCFG_ALTCS (1UL << 5) /* Alternate Clock Source */ #define MMCFG_ALTDATA (1UL << 6) /* Alternate Data */ #define MMCFG_STXC (1UL << 14) /* Select TX Clock */ #define MMCFG_SNTXC (1UL << 15) /* Set No TX Clock */ #define RXCON_SEP (1UL << 0) /* Save Errored Packets */ #define RXCON_RRF (1UL << 1) /* Receive Runt Frames */ #define RXCON_RBF (1UL << 2) /* Receive Broadcast Frames */ #define RXCON_RMF (1UL << 3) /* Receive Multicast Frames */ #define RXCON_RIIA (1UL << 4) /* Receive Inverse Addresses */ #define RXCON_PROMISC (1UL << 5) /* Promiscuous Mode */ #define RXCON_MONITOR (1UL << 6) /* Monitor Mode */ #define RXCON_ERE (1UL << 7) /* Early Receive Enable */ #define RXCON_EB_INT (0UL << 8) /* External Buffer (Inernal) */ #define RXCON_EB_16K (1UL << 8) /* External Buffer (16K) */ #define RXCON_EB_32K (2UL << 8) /* External Buffer (32K) */ #define RXCON_EB_128K (3UL << 8) /* External Buffer (128K) */ #define RXSTAT_PRI (1UL << 0) /* Packet Received Intact */ #define RXSTAT_FAE (1UL << 1) /* Frame Alignment Error */ #define RXSTAT_CRC (1UL << 2) /* CRC Error */ #define RXSTAT_MP (1UL << 3) /* Missed Packet */ #define RXSTAT_MAR (1UL << 4) /* Multicast Address Recognized */ #define RXSTAT_BAR (1UL << 5) /* Broadcast Address Recognized */ #define RXSTAT_RD (1UL << 6) /* Receiver Disabled */ #define RXSTAT_NSV (1UL << 12) /* Network Status Valid */ #define RXSTAT_FLE (1UL << 13) /* Fragment List Error */ #define RXSTAT_HC (1UL << 14) /* Header Copied */ #define RXSTAT_OWNER (1UL << 15) /* Descriptor Ownership Bit */ #define RXCTL_FRAGLIST (1UL << 0) /* Fragment List */ #define RXCTL_LFFORM (1UL << 1) /* Fragment List Format */ #define RXCTL_HEADER (1UL << 2) /* Header Copy */ #define TXCON_ETE (1UL << 0) /* Early Transmit Enable */ #define TXCON_LB_0 (0UL << 1) /* Normal Operation */ #define TXCON_LB_1 (1UL << 1) /* Internal Loopback */ #define TXCON_LB_2 (2UL << 1) /* External Loopback */ #define TXCON_LB_3 (3UL << 1) /* Full Duplex Mode */ #define TXCON_SLOT 3 /* Slot Time */ #define TXSTAT_PTX (1UL << 0) /* Packet Transmitted */ #define TXSTAT_ND (1UL << 1) /* Non-deferred Transmission */ #define TXSTAT_COLL (1UL << 2) /* Transmitted w/Collisions */ #define TXSTAT_CSL (1UL << 3) /* Carrier Sense Lost */ #define TXSTAT_UFLO (1UL << 4) /* TX Underrun */ #define TXSTAT_CDH (1UL << 5) /* Collision Detect Heartbeat */ #define TXSTAT_OWC (1UL << 6) /* Out of Window Collision */ #define TXSTAT_DEFER (1UL << 7) /* IGP Deferring */ #define TXSTAT_CCNT 8 /* Collision Count */ #define TXSTAT_CCNTMASK 0x1F /* Collision Count Mask */ #define TXSTAT_EXCOLL (1UL << 12) /* Excessive Collisions */ #define TXSTAT_OWNER (1UL << 15) /* Descriptor Ownership Bit */ #define TXCTL_FRAGLIST (1UL << 0) /* Fragment List */ #define TXCTL_LFFORM (1UL << 1) /* Fragment List Format */ #define TXCTL_IAF (1UL << 2) /* Interrupt After Frame */ #define TXCTL_NOCRC (1UL << 3) /* Disable CRC Generation */ #define TXCTL_LASTDESCR (1UL << 4) /* Last Transmit Descriptor */ /* * Register access. */ #define GETCSR(efep, reg) \ ddi_get32((efep)->efe_regs_acch, \ (efep)->efe_regs + ((reg) / sizeof (uint32_t))) #define PUTCSR(efep, reg, val) \ ddi_put32((efep)->efe_regs_acch, \ (efep)->efe_regs + ((reg) / sizeof (uint32_t)), (val)) #define CLRBIT(efep, reg, bit) \ PUTCSR(efep, reg, (GETCSR(efep, reg) & ~(bit))) #define SETBIT(efep, reg, bit) \ PUTCSR(efep, reg, (GETCSR(efep, reg) | (bit))) /* * DMA access. */ #define DESCSZ(x) (sizeof (efe_desc_t) * (x)) #define BUFPSZ(x) (sizeof (efe_buf_t *) * (x)) #define DESCADDR(rp, x) ((rp)->r_dmac.dmac_address + DESCSZ(x)) #define DESCLEN(rp) ((rp)->r_len) #define BUFADDR(bp) ((bp)->b_dmac.dmac_address) #define BUFLEN(bp) ((bp)->b_len) #define NEXTDESC(rp, x) (((x) + 1) % (rp)->r_len) #define NEXTDESCADDR(rp, x) DESCADDR(rp, NEXTDESC(rp, x)) #define GETDESC(rp, x) (&(rp)->r_descp[(x)]) #define GETDESC16(rp, addr) \ ddi_get16((rp)->r_acch, (addr)) #define PUTDESC16(rp, addr, val) \ ddi_put16((rp)->r_acch, (addr), (val)) #define GETDESC32(rp, addr) \ ddi_get32((rp)->r_acch, (addr)) #define PUTDESC32(rp, addr, val) \ ddi_put32((rp)->r_acch, (addr), (val)) #define SYNCDESC(rp, x, type) \ (void) ddi_dma_sync((rp)->r_dmah, DESCSZ(x), \ sizeof (efe_desc_t), (type)) #define GETBUF(rp, x) ((rp)->r_bufpp[(x)]) #define SYNCBUF(bp, type) \ (void) ddi_dma_sync((bp)->b_dmah, 0, (bp)->b_len, (type)) /* * Soft state. */ typedef struct { uint16_t d_status; uint16_t d_len; uint32_t d_bufaddr; uint16_t d_buflen; uint16_t d_control; uint32_t d_next; } efe_desc_t; typedef struct { ddi_dma_handle_t b_dmah; ddi_acc_handle_t b_acch; ddi_dma_cookie_t b_dmac; size_t b_len; caddr_t b_kaddr; } efe_buf_t; typedef struct { ddi_dma_handle_t r_dmah; ddi_acc_handle_t r_acch; ddi_dma_cookie_t r_dmac; size_t r_len; efe_desc_t *r_descp; efe_buf_t **r_bufpp; } efe_ring_t; typedef struct { dev_info_t *efe_dip; mii_handle_t efe_miih; mac_handle_t efe_mh; uint32_t *efe_regs; ddi_acc_handle_t efe_regs_acch; ddi_intr_handle_t efe_intrh; kmutex_t efe_intrlock; kmutex_t efe_txlock; int efe_flags; boolean_t efe_promisc; uint8_t efe_macaddr[ETHERADDRL]; uint_t efe_mccount[MCHASHL]; uint16_t efe_mchash[MCHASHL / MCHASHSZ]; efe_ring_t *efe_rx_ring; uint_t efe_rx_desc; efe_ring_t *efe_tx_ring; uint_t efe_tx_desc; uint_t efe_tx_sent; /* * Driver statistics. */ uint64_t efe_multircv; uint64_t efe_brdcstrcv; uint64_t efe_multixmt; uint64_t efe_brdcstxmt; uint64_t efe_norcvbuf; uint64_t efe_ierrors; uint64_t efe_noxmtbuf; uint64_t efe_oerrors; uint64_t efe_collisions; uint64_t efe_rbytes; uint64_t efe_ipackets; uint64_t efe_obytes; uint64_t efe_opackets; uint64_t efe_uflo; uint64_t efe_oflo; uint64_t efe_align_errors; uint64_t efe_fcs_errors; uint64_t efe_first_collisions; uint64_t efe_tx_late_collisions; uint64_t efe_defer_xmts; uint64_t efe_ex_collisions; uint64_t efe_macxmt_errors; uint64_t efe_carrier_errors; uint64_t efe_toolong_errors; uint64_t efe_macrcv_errors; uint64_t efe_runt_errors; uint64_t efe_jabber_errors; } efe_t; #ifdef __cplusplus } #endif #endif /* _EFE_H */