1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Solaris driver for ethernet cards based on the ADMtek Centaur
1959748cbddf37d4734c107dadfa449e076045e3gd *
1959748cbddf37d4734c107dadfa449e076045e3gd * Copyright (c) 2007 by Garrett D'Amore <garrett@damore.org>.
1959748cbddf37d4734c107dadfa449e076045e3gd * All rights reserved.
1959748cbddf37d4734c107dadfa449e076045e3gd *
1959748cbddf37d4734c107dadfa449e076045e3gd * Redistribution and use in source and binary forms, with or without
1959748cbddf37d4734c107dadfa449e076045e3gd * modification, are permitted provided that the following conditions
1959748cbddf37d4734c107dadfa449e076045e3gd * are met:
1959748cbddf37d4734c107dadfa449e076045e3gd * 1. Redistributions of source code must retain the above copyright
1959748cbddf37d4734c107dadfa449e076045e3gd * notice, this list of conditions and the following disclaimer.
1959748cbddf37d4734c107dadfa449e076045e3gd * 2. Redistributions in binary form must reproduce the above copyright
1959748cbddf37d4734c107dadfa449e076045e3gd * notice, this list of conditions and the following disclaimer in the
1959748cbddf37d4734c107dadfa449e076045e3gd * documentation and/or other materials provided with the distribution.
1959748cbddf37d4734c107dadfa449e076045e3gd * 3. Neither the name of the author nor the names of any co-contributors
1959748cbddf37d4734c107dadfa449e076045e3gd * may be used to endorse or promote products derived from this software
1959748cbddf37d4734c107dadfa449e076045e3gd * without specific prior written permission.
1959748cbddf37d4734c107dadfa449e076045e3gd *
1959748cbddf37d4734c107dadfa449e076045e3gd * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
1959748cbddf37d4734c107dadfa449e076045e3gd * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1959748cbddf37d4734c107dadfa449e076045e3gd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1959748cbddf37d4734c107dadfa449e076045e3gd * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
1959748cbddf37d4734c107dadfa449e076045e3gd * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1959748cbddf37d4734c107dadfa449e076045e3gd * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1959748cbddf37d4734c107dadfa449e076045e3gd * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1959748cbddf37d4734c107dadfa449e076045e3gd * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1959748cbddf37d4734c107dadfa449e076045e3gd * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1959748cbddf37d4734c107dadfa449e076045e3gd * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1959748cbddf37d4734c107dadfa449e076045e3gd * POSSIBILITY OF SUCH DAMAGE.
1959748cbddf37d4734c107dadfa449e076045e3gd */
96fb08b94cc33de779f46f36c30d77230f1a8c2fgd/*
bdb9230ac765cb7af3fc1f4119caf2c5720dceb3Garrett D'Amore * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
96fb08b94cc33de779f46f36c30d77230f1a8c2fgd * Use is subject to license terms.
96fb08b94cc33de779f46f36c30d77230f1a8c2fgd */
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#ifndef _AFEIMPL_H
1959748cbddf37d4734c107dadfa449e076045e3gd#define _AFEIMPL_H
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#ifdef _KERNEL
1959748cbddf37d4734c107dadfa449e076045e3gd
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_provider.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Compile time tunables.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_RXRING 128 /* number of rcv buffers */
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_TXRING 128 /* number of xmt buffers */
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_TXRECLAIM 8 /* when to reclaim tx buffers (txavail) */
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_TXRESCHED 120 /* when to resched (txavail) */
bdb9230ac765cb7af3fc1f4119caf2c5720dceb3Garrett D'Amore#define AFE_WDOGTIMER 5000 /* how often we check for tx hang (in msec) */
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_HEADROOM 34 /* headroom in packet (should be 2 modulo 4) */
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Constants, do not change.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_BUFSZ (1664) /* big enough for a vlan frame */
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_MCHASH (64)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gdtypedef struct afe afe_t;
1959748cbddf37d4734c107dadfa449e076045e3gdtypedef struct afe_card afe_card_t;
1959748cbddf37d4734c107dadfa449e076045e3gdtypedef struct afe_rxbuf afe_rxbuf_t;
1959748cbddf37d4734c107dadfa449e076045e3gdtypedef struct afe_txbuf afe_txbuf_t;
1959748cbddf37d4734c107dadfa449e076045e3gdtypedef struct afe_desc afe_desc_t;
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Card models.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gdtypedef enum {
1959748cbddf37d4734c107dadfa449e076045e3gd MODEL_CENTAUR = 1,
1959748cbddf37d4734c107dadfa449e076045e3gd MODEL_COMET,
1959748cbddf37d4734c107dadfa449e076045e3gd} afe_model_t;
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gdstruct afe_card {
1959748cbddf37d4734c107dadfa449e076045e3gd uint16_t card_venid; /* PCI vendor id */
1959748cbddf37d4734c107dadfa449e076045e3gd uint16_t card_devid; /* PCI device id */
1959748cbddf37d4734c107dadfa449e076045e3gd char *card_cardname; /* Description of the card */
1959748cbddf37d4734c107dadfa449e076045e3gd afe_model_t card_model; /* Card specific flags */
1959748cbddf37d4734c107dadfa449e076045e3gd};
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Device instance structure, one per PCI card.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gdstruct afe {
1959748cbddf37d4734c107dadfa449e076045e3gd dev_info_t *afe_dip;
1959748cbddf37d4734c107dadfa449e076045e3gd mac_handle_t afe_mh;
bdb9230ac765cb7af3fc1f4119caf2c5720dceb3Garrett D'Amore mii_handle_t afe_mii;
1959748cbddf37d4734c107dadfa449e076045e3gd afe_card_t *afe_cardp;
1959748cbddf37d4734c107dadfa449e076045e3gd uint16_t afe_cachesize;
1959748cbddf37d4734c107dadfa449e076045e3gd uint8_t afe_sromwidth;
1959748cbddf37d4734c107dadfa449e076045e3gd int afe_flags;
1959748cbddf37d4734c107dadfa449e076045e3gd kmutex_t afe_xmtlock;
1959748cbddf37d4734c107dadfa449e076045e3gd kmutex_t afe_intrlock;
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_iblock_cookie_t afe_icookie;
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd /*
1959748cbddf37d4734c107dadfa449e076045e3gd * Register and DMA access.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd uintptr_t afe_regs;
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_acc_handle_t afe_regshandle;
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd /*
1959748cbddf37d4734c107dadfa449e076045e3gd * Receive descriptors.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd int afe_rxhead;
1959748cbddf37d4734c107dadfa449e076045e3gd struct afe_desc *afe_rxdescp;
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_dma_handle_t afe_rxdesc_dmah;
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_acc_handle_t afe_rxdesc_acch;
1959748cbddf37d4734c107dadfa449e076045e3gd uint32_t afe_rxdesc_paddr;
1959748cbddf37d4734c107dadfa449e076045e3gd struct afe_rxbuf **afe_rxbufs;
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd /*
1959748cbddf37d4734c107dadfa449e076045e3gd * Transmit descriptors.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd int afe_txreclaim;
1959748cbddf37d4734c107dadfa449e076045e3gd int afe_txsend;
1959748cbddf37d4734c107dadfa449e076045e3gd int afe_txavail;
1959748cbddf37d4734c107dadfa449e076045e3gd struct afe_desc *afe_txdescp;
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_dma_handle_t afe_txdesc_dmah;
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_acc_handle_t afe_txdesc_acch;
1959748cbddf37d4734c107dadfa449e076045e3gd uint32_t afe_txdesc_paddr;
1959748cbddf37d4734c107dadfa449e076045e3gd struct afe_txbuf **afe_txbufs;
1959748cbddf37d4734c107dadfa449e076045e3gd hrtime_t afe_txstall_time;
1959748cbddf37d4734c107dadfa449e076045e3gd boolean_t afe_wantw;
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd /*
1959748cbddf37d4734c107dadfa449e076045e3gd * Transceiver stuff.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd int afe_phyaddr;
1959748cbddf37d4734c107dadfa449e076045e3gd int afe_phyid;
1959748cbddf37d4734c107dadfa449e076045e3gd int afe_phyinuse;
96fb08b94cc33de779f46f36c30d77230f1a8c2fgd
1959748cbddf37d4734c107dadfa449e076045e3gd int afe_forcefiber;
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd /*
1959748cbddf37d4734c107dadfa449e076045e3gd * Address management.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd uchar_t afe_curraddr[ETHERADDRL];
1959748cbddf37d4734c107dadfa449e076045e3gd boolean_t afe_promisc;
1959748cbddf37d4734c107dadfa449e076045e3gd uint16_t afe_mccount[AFE_MCHASH];
1959748cbddf37d4734c107dadfa449e076045e3gd uint32_t afe_mctab[AFE_MCHASH / 32]; /* Centaur */
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd /*
1959748cbddf37d4734c107dadfa449e076045e3gd * Kstats.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd kstat_t *afe_intrstat;
1959748cbddf37d4734c107dadfa449e076045e3gd uint64_t afe_ipackets;
1959748cbddf37d4734c107dadfa449e076045e3gd uint64_t afe_opackets;
1959748cbddf37d4734c107dadfa449e076045e3gd uint64_t afe_rbytes;
1959748cbddf37d4734c107dadfa449e076045e3gd uint64_t afe_obytes;
1959748cbddf37d4734c107dadfa449e076045e3gd uint64_t afe_brdcstxmt;
1959748cbddf37d4734c107dadfa449e076045e3gd uint64_t afe_multixmt;
1959748cbddf37d4734c107dadfa449e076045e3gd uint64_t afe_brdcstrcv;
1959748cbddf37d4734c107dadfa449e076045e3gd uint64_t afe_multircv;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_norcvbuf;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_errrcv;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_errxmt;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_missed;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_underflow;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_overflow;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_align_errors;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_fcs_errors;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_carrier_errors;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_collisions;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_ex_collisions;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_tx_late_collisions;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_defer_xmts;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_first_collisions;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_multi_collisions;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_sqe_errors;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_macxmt_errors;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_macrcv_errors;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_toolong_errors;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_runt;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned afe_jabber;
1959748cbddf37d4734c107dadfa449e076045e3gd};
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gdstruct afe_rxbuf {
1959748cbddf37d4734c107dadfa449e076045e3gd caddr_t rxb_buf;
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_dma_handle_t rxb_dmah;
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_acc_handle_t rxb_acch;
1959748cbddf37d4734c107dadfa449e076045e3gd uint32_t rxb_paddr;
1959748cbddf37d4734c107dadfa449e076045e3gd};
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gdstruct afe_txbuf {
1959748cbddf37d4734c107dadfa449e076045e3gd caddr_t txb_buf;
1959748cbddf37d4734c107dadfa449e076045e3gd uint32_t txb_paddr;
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_dma_handle_t txb_dmah;
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_acc_handle_t txb_acch;
1959748cbddf37d4734c107dadfa449e076045e3gd};
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Descriptor. We use rings rather than chains.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gdstruct afe_desc {
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned desc_status;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned desc_control;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned desc_buffer1;
1959748cbddf37d4734c107dadfa449e076045e3gd unsigned desc_buffer2;
1959748cbddf37d4734c107dadfa449e076045e3gd};
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define PUTTXDESC(afep, member, val) \
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_put32(afep->afe_txdesc_acch, &member, val)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define PUTRXDESC(afep, member, val) \
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_put32(afep->afe_rxdesc_acch, &member, val)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define GETTXDESC(afep, member) \
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_get32(afep->afe_txdesc_acch, &member)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define GETRXDESC(afep, member) \
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_get32(afep->afe_rxdesc_acch, &member)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Receive descriptor fields.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_OWN 0x80000000U /* ownership */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_RXLEN 0x3FFF0000U /* frame length, incl. crc */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_RXERR 0x00008000U /* error summary */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_DESCERR 0x00004000U /* descriptor error */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_RXTYPE 0x00003000U /* data type */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_RUNT 0x00000800U /* runt frame */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_GROUP 0x00000400U /* multicast/brdcast frame */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_FIRST 0x00000200U /* first descriptor */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_LAST 0x00000100U /* last descriptor */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_TOOLONG 0x00000080U /* frame too long */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_COLLSEEN 0x00000040U /* late collision seen */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_FRTYPE 0x00000020U /* frame type */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_WATCHDOG 0x00000010U /* receive watchdog */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_DRIBBLE 0x00000004U /* dribbling bit */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_CRCERR 0x00000002U /* crc error */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_OFLOW 0x00000001U /* fifo overflow */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXSTAT_ERRS (RXSTAT_DESCERR | RXSTAT_RUNT | \
1959748cbddf37d4734c107dadfa449e076045e3gd RXSTAT_COLLSEEN | RXSTAT_DRIBBLE | \
1959748cbddf37d4734c107dadfa449e076045e3gd RXSTAT_CRCERR | RXSTAT_OFLOW)
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXLENGTH(x) ((x & RXSTAT_RXLEN) >> 16)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXCTL_ENDRING 0x02000000U /* end of ring */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXCTL_CHAIN 0x01000000U /* chained descriptors */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXCTL_BUFLEN2 0x003FF800U /* buffer 2 length */
1959748cbddf37d4734c107dadfa449e076045e3gd#define RXCTL_BUFLEN1 0x000007FFU /* buffer 1 length */
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Transmit descriptor fields.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_OWN 0x80000000U /* ownership */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_URCNT 0x00C00000U /* underrun count */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_TXERR 0x00008000U /* error summary */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_JABBER 0x00004000U /* jabber timeout */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_CARRLOST 0x00000800U /* lost carrier */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_NOCARR 0x00000400U /* no carrier */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_LATECOL 0x00000200U /* late collision */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_EXCOLL 0x00000100U /* excessive collisions */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_SQE 0x00000080U /* heartbeat failure */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_COLLCNT 0x00000078U /* collision count */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_UFLOW 0x00000002U /* underflow */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXSTAT_DEFER 0x00000001U /* deferred */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCOLLCNT(x) ((x & TXSTAT_COLLCNT) >> 3)
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXUFLOWCNT(x) ((x & TXSTAT_URCNT) >> 22)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCTL_INTCMPLTE 0x80000000U /* interrupt completed */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCTL_LAST 0x40000000U /* last descriptor */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCTL_FIRST 0x20000000U /* first descriptor */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCTL_NOCRC 0x04000000U /* disable crc */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCTL_ENDRING 0x02000000U /* end of ring */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCTL_CHAIN 0x01000000U /* chained descriptors */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCTL_NOPAD 0x00800000U /* disable padding */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCTL_HASHPERF 0x00400000U /* hash perfect mode */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCTL_BUFLEN2 0x003FF800U /* buffer length 2 */
1959748cbddf37d4734c107dadfa449e076045e3gd#define TXCTL_BUFLEN1 0x000007FFU /* buffer length 1 */
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Interface flags.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_RUNNING 0x1 /* chip is initialized */
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_SUSPENDED 0x2 /* interface is suspended */
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_HASFIBER 0x4 /* internal phy supports fiber (AFE_PHY_MCR) */
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define AFE_MODEL(afep) ((afep)->afe_cardp->card_model)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Register definitions located in afe.h exported header file.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd/*
1959748cbddf37d4734c107dadfa449e076045e3gd * Macros to simplify hardware access.
1959748cbddf37d4734c107dadfa449e076045e3gd */
1959748cbddf37d4734c107dadfa449e076045e3gd#define GETCSR(afep, reg) \
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_get32(afep->afe_regshandle, (uint32_t *)(afep->afe_regs + reg))
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define GETCSR16(afep, reg) \
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_get16(afep->afe_regshandle, (uint16_t *)(afep->afe_regs + reg))
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define PUTCSR(afep, reg, val) \
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_put32(afep->afe_regshandle, (uint32_t *)(afep->afe_regs + reg), val)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define PUTCSR16(afep, reg, val) \
1959748cbddf37d4734c107dadfa449e076045e3gd ddi_put16(afep->afe_regshandle, (uint16_t *)(afep->afe_regs + reg), val)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define SETBIT(afep, reg, val) PUTCSR(afep, reg, GETCSR(afep, reg) | (val))
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define CLRBIT(afep, reg, val) PUTCSR(afep, reg, GETCSR(afep, reg) & ~(val))
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define SYNCTXDESC(afep, index, who) \
1959748cbddf37d4734c107dadfa449e076045e3gd (void) ddi_dma_sync(afep->afe_txdesc_dmah, \
1959748cbddf37d4734c107dadfa449e076045e3gd (index * sizeof (afe_desc_t)), sizeof (afe_desc_t), who)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define SYNCTXBUF(txb, len, who) \
1959748cbddf37d4734c107dadfa449e076045e3gd (void) ddi_dma_sync(txb->txb_dmah, 0, len, who)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define SYNCRXDESC(afep, index, who) \
1959748cbddf37d4734c107dadfa449e076045e3gd (void) ddi_dma_sync(afep->afe_rxdesc_dmah, \
1959748cbddf37d4734c107dadfa449e076045e3gd (index * sizeof (afe_desc_t)), sizeof (afe_desc_t), who)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#define SYNCRXBUF(rxb, len, who) \
1959748cbddf37d4734c107dadfa449e076045e3gd (void) ddi_dma_sync(rxb->rxb_dmah, 0, len, who)
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#endif /* _KERNEL */
1959748cbddf37d4734c107dadfa449e076045e3gd
1959748cbddf37d4734c107dadfa449e076045e3gd#endif /* _AFEIMPL_H */