blob: 49220e02a24b2f25d6d64fc611de127b49b12342 [file] [log] [blame]
/*
* Copyright (c) 2011 Jason King.
* Copyright (c) 2000 Berkeley Software Design, Inc.
* Copyright (c) 1997, 1998, 1999, 2000
* Bill Paul <wpaul@ee.columbia.edu>. 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 */