/* * Copyright (c) 2011 Jason King. * Copyright (c) 2000 Berkeley Software Design, Inc. * Copyright (c) 1997, 1998, 1999, 2000 * Bill Paul . 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. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Bill Paul. * 4. Neither the name of the author nor the names of any co-contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY Bill Paul 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 Bill Paul OR THE VOICES IN HIS HEAD * 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 _PCNIMPL_H #define _PCNIMPL_H #ifdef __cplusplus extern "C" { #endif #ifdef _KERNEL #define PCN_VENDORID 0x1022 #define PCN_DEVICEID_PCNET 0x2000 #define PCN_DEVICEID_HOME 0x2001 typedef struct pcn_type { uint16_t pcn_vid; uint16_t pcn_did; char *pcn_name; /* ddi_set_prop takes char * */ } pcn_type_t; #define PCN_TXRECLAIM 8 #define PCN_HEADROOM 34 #define PCN_TXRESCHED 120 #define PCN_RXSTAT_BAM 0x0008 /* broadcast address match */ #define PCN_RXSTAT_LAFM 0x0010 /* logical address filter match */ #define PCN_RXSTAT_PAM 0x0020 /* physical address match */ #define PCN_RXSTAT_BPE 0x0080 /* bus parity error */ #define PCN_RXSTAT_ENP 0x0100 /* end of packet */ #define PCN_RXSTAT_STP 0x0200 /* start of packet */ #define PCN_RXSTAT_BUFF 0x0400 /* buffer error */ #define PCN_RXSTAT_CRC 0x0800 /* CRC error */ #define PCN_RXSTAT_OFLOW 0x1000 /* rx overrun */ #define PCN_RXSTAT_FRAM 0x2000 /* framing error */ #define PCN_RXSTAT_ERR 0x4000 /* error summary */ #define PCN_RXSTAT_OWN 0x8000 #define PCN_RXSTAT_STR \ "\020" \ "\004BAM" \ "\005LAFM" \ "\006PAM" \ "\010BPE" \ "\011ENP" \ "\012STP" \ "\013BUFF" \ "\014CRC" \ "\015OFLOW" \ "\016FRAM" \ "\017ERR" \ "\020OWN" #define PCN_RXLEN_MBO 0xF000 #define PCN_RXLEN_BUFSZ 0x0FFF typedef struct pcn_rx_desc { uint16_t pcn_rxlen; uint16_t pcn_rsvd0; uint16_t pcn_bufsz; uint16_t pcn_rxstat; uint32_t pcn_rbaddr; uint32_t pcn_uspace; } pcn_rx_desc_t; typedef struct pcn_tx_desc { uint32_t pcn_txstat; uint32_t pcn_txctl; uint32_t pcn_tbaddr; uint32_t pcn_uspace; } pcn_tx_desc_t; #define PCN_TXCTL_OWN 0x80000000 #define PCN_TXCTL_ERR 0x40000000 /* error summary */ #define PCN_TXCTL_ADD_FCS 0x20000000 /* add FCS to pkt */ #define PCN_TXCTL_MORE_LTINT 0x10000000 #define PCN_TXCTL_ONE 0x08000000 #define PCN_TXCTL_DEF 0x04000000 #define PCN_TXCTL_STP 0x02000000 #define PCN_TXCTL_ENP 0x01000000 #define PCN_TXCTL_BPE 0x00800000 #define PCN_TXCTL_MBO 0x0000F000 #define PCN_TXCTL_BUFSZ 0x00000FFF #define PCN_TXCTL_STR \ "\020" \ "\040OWN" \ "\037ERR" \ "\036ADD_FCS" \ "\035MORE_LTINT" \ "\034ONE" \ "\033DEF" \ "\032STP" \ "\031ENP" \ "\030BPE" typedef struct pcn_buf { caddr_t pb_buf; ddi_dma_handle_t pb_dmah; ddi_acc_handle_t pb_acch; uint32_t pb_paddr; } pcn_buf_t; /* Constants, do not change */ #define PCN_BUFSZ (1664) #define PCN_MCHASH (64) /* Number of descriptor entries */ #define PCN_RXRING 64 #define PCN_TXRING 256 typedef struct pcn { dev_info_t *pcn_dip; mac_handle_t pcn_mh; mii_handle_t pcn_mii; uint16_t pcn_cachesize; int pcn_flags; int pcn_instance; kmutex_t pcn_xmtlock; kmutex_t pcn_intrlock; kmutex_t pcn_reglock; ddi_iblock_cookie_t pcn_icookie; uint_t pcn_int_pri; int pcn_type; int8_t pcn_extphyaddr; /* * Register and DMA access */ uintptr_t pcn_regs; ddi_acc_handle_t pcn_regshandle; /* * Receive descriptors. */ int pcn_rxhead; pcn_rx_desc_t *pcn_rxdescp; ddi_dma_handle_t pcn_rxdesc_dmah; ddi_acc_handle_t pcn_rxdesc_acch; uint32_t pcn_rxdesc_paddr; pcn_buf_t **pcn_rxbufs; /* * Transmit descriptors. */ int pcn_txreclaim; int pcn_txsend; int pcn_txavail; pcn_tx_desc_t *pcn_txdescp; ddi_dma_handle_t pcn_txdesc_dmah; ddi_acc_handle_t pcn_txdesc_acch; uint32_t pcn_txdesc_paddr; pcn_buf_t **pcn_txbufs; hrtime_t pcn_txstall_time; boolean_t pcn_wantw; /* * Address management. */ uchar_t pcn_addr[ETHERADDRL]; boolean_t pcn_promisc; uint16_t pcn_mccount[PCN_MCHASH]; uint16_t pcn_mctab[PCN_MCHASH / 16]; /* * stats */ uint64_t pcn_ipackets; uint64_t pcn_opackets; uint64_t pcn_rbytes; uint64_t pcn_obytes; uint64_t pcn_brdcstxmt; uint64_t pcn_multixmt; uint64_t pcn_brdcstrcv; uint64_t pcn_multircv; uint64_t pcn_norcvbuf; uint64_t pcn_errrcv; uint64_t pcn_errxmt; uint64_t pcn_missed; uint64_t pcn_underflow; uint64_t pcn_overflow; uint64_t pcn_align_errors; uint64_t pcn_fcs_errors; uint64_t pcn_carrier_errors; uint64_t pcn_collisions; uint64_t pcn_ex_collisions; uint64_t pcn_tx_late_collisions; uint64_t pcn_defer_xmts; uint64_t pcn_first_collisions; uint64_t pcn_multi_collisions; uint64_t pcn_sqe_errors; uint64_t pcn_macxmt_errors; uint64_t pcn_macrcv_errors; uint64_t pcn_toolong_errors; uint64_t pcn_runt; uint64_t pcn_jabber; } pcn_t; /* Flags */ #define PCN_RUNNING (1L << 0) #define PCN_SUSPENDED (1L << 1) #define PCN_INTR_ENABLED (1L << 2) #define PCN_FLAGSTR \ "\020" \ "\001RUNNING" \ "\002SUSPENDED" \ "\003INTR_ENABLED" #define IS_RUNNING(p) ((p)->pcn_flags & PCN_RUNNING) #define IS_SUSPENDED(p) ((p)->pcn_flags & PCN_SUSPENDED) #define SYNCTXDESC(pcnp, index, who) \ (void) ddi_dma_sync(pcnp->pcn_txdesc_dmah, \ (index * sizeof (pcn_tx_desc_t)), sizeof (pcn_tx_desc_t), who) #define SYNCRXDESC(pcnp, index, who) \ (void) ddi_dma_sync(pcnp->pcn_rxdesc_dmah, \ (index * sizeof (pcn_rx_desc_t)), sizeof (pcn_rx_desc_t), who) #define SYNCBUF(pb, len, who) \ (void) ddi_dma_sync(pb->pb_dmah, 0, len, who) #endif /* _KERNEL */ #ifdef __cplusplus } #endif #endif /* _PCNIMPL_H */