19610Sgdamore@opensolaris.org /* 29610Sgdamore@opensolaris.org * CDDL HEADER START 39610Sgdamore@opensolaris.org * 49610Sgdamore@opensolaris.org * The contents of this file are subject to the terms of the 59610Sgdamore@opensolaris.org * Common Development and Distribution License (the "License"). 69610Sgdamore@opensolaris.org * You may not use this file except in compliance with the License. 79610Sgdamore@opensolaris.org * 89610Sgdamore@opensolaris.org * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 99610Sgdamore@opensolaris.org * or http://www.opensolaris.org/os/licensing. 109610Sgdamore@opensolaris.org * See the License for the specific language governing permissions 119610Sgdamore@opensolaris.org * and limitations under the License. 129610Sgdamore@opensolaris.org * 139610Sgdamore@opensolaris.org * When distributing Covered Code, include this CDDL HEADER in each 149610Sgdamore@opensolaris.org * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 159610Sgdamore@opensolaris.org * If applicable, add the following below this CDDL HEADER, with the 169610Sgdamore@opensolaris.org * fields enclosed by brackets "[]" replaced with your own identifying 179610Sgdamore@opensolaris.org * information: Portions Copyright [yyyy] [name of copyright owner] 189610Sgdamore@opensolaris.org * 199610Sgdamore@opensolaris.org * CDDL HEADER END 209610Sgdamore@opensolaris.org */ 219610Sgdamore@opensolaris.org /* 229610Sgdamore@opensolaris.org * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 239610Sgdamore@opensolaris.org * Use is subject to license terms. 249610Sgdamore@opensolaris.org */ 259610Sgdamore@opensolaris.org 269610Sgdamore@opensolaris.org #ifndef _SYS_HME_H 279610Sgdamore@opensolaris.org #define _SYS_HME_H 289610Sgdamore@opensolaris.org 299610Sgdamore@opensolaris.org #ifdef __cplusplus 309610Sgdamore@opensolaris.org extern "C" { 319610Sgdamore@opensolaris.org #endif 329610Sgdamore@opensolaris.org 339610Sgdamore@opensolaris.org #ifdef _KERNEL 349610Sgdamore@opensolaris.org 359610Sgdamore@opensolaris.org /* default IPG settings */ 369610Sgdamore@opensolaris.org #define IPG1 8 379610Sgdamore@opensolaris.org #define IPG2 4 389610Sgdamore@opensolaris.org 399610Sgdamore@opensolaris.org /* 409610Sgdamore@opensolaris.org * Declarations and definitions specific to the 419610Sgdamore@opensolaris.org * FEPS 10/100 Mbps Ethernet (hme) device. 429610Sgdamore@opensolaris.org */ 439610Sgdamore@opensolaris.org 449610Sgdamore@opensolaris.org /* 459610Sgdamore@opensolaris.org * Per-Stream instance state information. 469610Sgdamore@opensolaris.org * 479610Sgdamore@opensolaris.org * Each instance is dynamically allocated at open() and free'd 489610Sgdamore@opensolaris.org * at close(). Each per-Stream instance points to at most one 499610Sgdamore@opensolaris.org * per-device structure using the sb_hmep field. All instances 509610Sgdamore@opensolaris.org * are threaded together into one list of active instances 519610Sgdamore@opensolaris.org * ordered on minor device number. 529610Sgdamore@opensolaris.org */ 539610Sgdamore@opensolaris.org 549610Sgdamore@opensolaris.org #define HME_2P0_REVID 0xa0 /* hme - feps. */ 559610Sgdamore@opensolaris.org #define HME_2P1_REVID 0x20 569610Sgdamore@opensolaris.org #define HME_2P1_REVID_OBP 0x21 579610Sgdamore@opensolaris.org #define HME_1C0_REVID 0xc0 /* cheerio 1.0, hme 2.0 equiv. */ 589610Sgdamore@opensolaris.org #define HME_2C0_REVID 0xc1 /* cheerio 2.0, hme 2.2 equiv. */ 599610Sgdamore@opensolaris.org #define HME_REV_VERS_MASK 0x0f /* Mask to retain bits for cheerio ver */ 609610Sgdamore@opensolaris.org 619610Sgdamore@opensolaris.org typedef struct { 629610Sgdamore@opensolaris.org ddi_dma_handle_t dmah; 639610Sgdamore@opensolaris.org ddi_acc_handle_t acch; 649610Sgdamore@opensolaris.org caddr_t kaddr; 659610Sgdamore@opensolaris.org uint32_t paddr; 669610Sgdamore@opensolaris.org } hmebuf_t; 679610Sgdamore@opensolaris.org 689610Sgdamore@opensolaris.org /* 699610Sgdamore@opensolaris.org * HME Device Channel instance state information. 709610Sgdamore@opensolaris.org * 719610Sgdamore@opensolaris.org * Each instance is dynamically allocated on first attach. 729610Sgdamore@opensolaris.org */ 739610Sgdamore@opensolaris.org struct hme { 749610Sgdamore@opensolaris.org mac_handle_t hme_mh; /* GLDv3 handle */ 75*10806Sgdamore@opensolaris.org mii_handle_t hme_mii; 769610Sgdamore@opensolaris.org dev_info_t *dip; /* associated dev_info */ 779610Sgdamore@opensolaris.org int instance; /* instance */ 789610Sgdamore@opensolaris.org ulong_t pagesize; /* btop(9F) */ 799610Sgdamore@opensolaris.org 809610Sgdamore@opensolaris.org int hme_mifpoll_enable; 819610Sgdamore@opensolaris.org int hme_frame_enable; 829610Sgdamore@opensolaris.org int hme_lance_mode_enable; 839610Sgdamore@opensolaris.org int hme_rxcv_enable; 849610Sgdamore@opensolaris.org 85*10806Sgdamore@opensolaris.org uint32_t hme_lance_mode; 86*10806Sgdamore@opensolaris.org uint32_t hme_ipg0; 87*10806Sgdamore@opensolaris.org uint32_t hme_ipg1; 88*10806Sgdamore@opensolaris.org uint32_t hme_ipg2; 89*10806Sgdamore@opensolaris.org 909610Sgdamore@opensolaris.org uint_t hme_burstsizes; /* binary encoded val */ 919610Sgdamore@opensolaris.org uint32_t hme_config; /* Config reg store */ 929610Sgdamore@opensolaris.org 939610Sgdamore@opensolaris.org int hme_phy_failure; /* phy failure type */ 949610Sgdamore@opensolaris.org 959610Sgdamore@opensolaris.org int hme_64bit_xfer; /* 64-bit Sbus xfers */ 969610Sgdamore@opensolaris.org int hme_phyad; 979610Sgdamore@opensolaris.org 989610Sgdamore@opensolaris.org int hme_nlasttries; 999610Sgdamore@opensolaris.org int hme_cheerio_mode; 1009610Sgdamore@opensolaris.org 1019610Sgdamore@opensolaris.org struct ether_addr hme_factaddr; /* factory mac address */ 1029610Sgdamore@opensolaris.org struct ether_addr hme_ouraddr; /* individual address */ 1039610Sgdamore@opensolaris.org uint32_t hme_addrflags; /* address flags */ 1049610Sgdamore@opensolaris.org uint32_t hme_flags; /* misc. flags */ 1059610Sgdamore@opensolaris.org boolean_t hme_wantw; /* xmit: out of resources */ 1069610Sgdamore@opensolaris.org boolean_t hme_started; /* mac layer started */ 1079610Sgdamore@opensolaris.org 1089610Sgdamore@opensolaris.org uint8_t hme_devno; 1099610Sgdamore@opensolaris.org 1109610Sgdamore@opensolaris.org uint16_t hme_ladrf[4]; /* 64 bit multicast filter */ 1119610Sgdamore@opensolaris.org uint32_t hme_ladrf_refcnt[64]; 1129610Sgdamore@opensolaris.org boolean_t hme_promisc; 1139610Sgdamore@opensolaris.org uint32_t hme_multi; /* refcount on mcast addrs */ 1149610Sgdamore@opensolaris.org 1159610Sgdamore@opensolaris.org struct hme_global *hme_globregp; /* HME global regs */ 1169610Sgdamore@opensolaris.org struct hme_etx *hme_etxregp; /* HME ETX regs */ 1179610Sgdamore@opensolaris.org struct hme_erx *hme_erxregp; /* HME ERX regs */ 1189610Sgdamore@opensolaris.org struct hme_bmac *hme_bmacregp; /* BigMAC registers */ 1199610Sgdamore@opensolaris.org struct hme_mif *hme_mifregp; /* HME transceiver */ 1209610Sgdamore@opensolaris.org unsigned char *hme_romp; /* fcode rom pointer */ 1219610Sgdamore@opensolaris.org 1229610Sgdamore@opensolaris.org kmutex_t hme_xmitlock; /* protect xmit-side fields */ 1239610Sgdamore@opensolaris.org kmutex_t hme_intrlock; /* protect intr-side fields */ 1249610Sgdamore@opensolaris.org ddi_iblock_cookie_t hme_cookie; /* interrupt cookie */ 1259610Sgdamore@opensolaris.org 1269610Sgdamore@opensolaris.org struct hme_rmd *hme_rmdp; /* receive descriptor ring start */ 1279610Sgdamore@opensolaris.org struct hme_tmd *hme_tmdp; /* transmit descriptor ring start */ 1289610Sgdamore@opensolaris.org 1299610Sgdamore@opensolaris.org ddi_dma_handle_t hme_rmd_dmah; 1309610Sgdamore@opensolaris.org ddi_acc_handle_t hme_rmd_acch; 1319610Sgdamore@opensolaris.org caddr_t hme_rmd_kaddr; 1329610Sgdamore@opensolaris.org uint32_t hme_rmd_paddr; 1339610Sgdamore@opensolaris.org 1349610Sgdamore@opensolaris.org ddi_dma_handle_t hme_tmd_dmah; 1359610Sgdamore@opensolaris.org ddi_acc_handle_t hme_tmd_acch; 1369610Sgdamore@opensolaris.org caddr_t hme_tmd_kaddr; 1379610Sgdamore@opensolaris.org uint32_t hme_tmd_paddr; 1389610Sgdamore@opensolaris.org 1399610Sgdamore@opensolaris.org uint64_t hme_rxindex; 1409610Sgdamore@opensolaris.org uint64_t hme_txindex; 1419610Sgdamore@opensolaris.org uint64_t hme_txreclaim; 1429610Sgdamore@opensolaris.org 1439610Sgdamore@opensolaris.org hmebuf_t *hme_tbuf; /* hmebuf associated with TMD */ 1449610Sgdamore@opensolaris.org hmebuf_t *hme_rbuf; /* hmebuf associated with RMD */ 1459610Sgdamore@opensolaris.org 1469610Sgdamore@opensolaris.org ddi_device_acc_attr_t hme_dev_attr; 1479610Sgdamore@opensolaris.org ddi_acc_handle_t hme_globregh; /* HME global regs */ 1489610Sgdamore@opensolaris.org ddi_acc_handle_t hme_etxregh; /* HME ETX regs */ 1499610Sgdamore@opensolaris.org ddi_acc_handle_t hme_erxregh; /* HME ERX regs */ 1509610Sgdamore@opensolaris.org ddi_acc_handle_t hme_bmacregh; /* BigMAC registers */ 1519610Sgdamore@opensolaris.org ddi_acc_handle_t hme_mifregh; /* HME transceiver */ 1529610Sgdamore@opensolaris.org ddi_acc_handle_t hme_romh; /* rom handle */ 1539610Sgdamore@opensolaris.org 1549610Sgdamore@opensolaris.org ddi_acc_handle_t pci_config_handle; /* HME PCI config */ 1559610Sgdamore@opensolaris.org 1569610Sgdamore@opensolaris.org /* 1579610Sgdamore@opensolaris.org * DDI dma handle, kernel virtual base, 1589610Sgdamore@opensolaris.org * and io virtual base of IOPB area. 1599610Sgdamore@opensolaris.org */ 1609610Sgdamore@opensolaris.org ddi_dma_handle_t hme_iopbhandle; 1619610Sgdamore@opensolaris.org ulong_t hme_iopbkbase; 1629610Sgdamore@opensolaris.org uint32_t hme_iopbiobase; 1639610Sgdamore@opensolaris.org 1649610Sgdamore@opensolaris.org kstat_t *hme_ksp; /* kstat pointer */ 1659610Sgdamore@opensolaris.org kstat_t *hme_intrstats; /* kstat interrupt counter */ 1669610Sgdamore@opensolaris.org 1679610Sgdamore@opensolaris.org uint64_t hme_ipackets; 1689610Sgdamore@opensolaris.org uint64_t hme_rbytes; 1699610Sgdamore@opensolaris.org uint64_t hme_ierrors; 1709610Sgdamore@opensolaris.org uint64_t hme_opackets; 1719610Sgdamore@opensolaris.org uint64_t hme_obytes; 1729610Sgdamore@opensolaris.org uint64_t hme_oerrors; 1739610Sgdamore@opensolaris.org uint64_t hme_multircv; /* # multicast packets received */ 1749610Sgdamore@opensolaris.org uint64_t hme_multixmt; /* # multicast packets for xmit */ 1759610Sgdamore@opensolaris.org uint64_t hme_brdcstrcv; /* # broadcast packets received */ 1769610Sgdamore@opensolaris.org uint64_t hme_brdcstxmt; /* # broadcast packets for xmit */ 1779610Sgdamore@opensolaris.org uint64_t hme_oflo; 1789610Sgdamore@opensolaris.org uint64_t hme_uflo; 1799610Sgdamore@opensolaris.org uint64_t hme_norcvbuf; /* # rcv packets discarded */ 1809610Sgdamore@opensolaris.org uint64_t hme_noxmtbuf; /* # xmit packets discarded */ 1819610Sgdamore@opensolaris.org uint64_t hme_duplex; 1829610Sgdamore@opensolaris.org uint64_t hme_align_errors; 1839610Sgdamore@opensolaris.org uint64_t hme_coll; 1849610Sgdamore@opensolaris.org uint64_t hme_fcs_errors; 1859610Sgdamore@opensolaris.org uint64_t hme_defer_xmts; 1869610Sgdamore@opensolaris.org uint64_t hme_sqe_errors; 1879610Sgdamore@opensolaris.org uint64_t hme_excol; 1889610Sgdamore@opensolaris.org uint64_t hme_fstcol; 1899610Sgdamore@opensolaris.org uint64_t hme_tlcol; 1909610Sgdamore@opensolaris.org uint64_t hme_toolong_errors; 1919610Sgdamore@opensolaris.org uint64_t hme_runt; 1929610Sgdamore@opensolaris.org uint64_t hme_carrier_errors; 1939610Sgdamore@opensolaris.org uint64_t hme_jab; 1949610Sgdamore@opensolaris.org 1959610Sgdamore@opensolaris.org uint32_t hme_cvc; 1969610Sgdamore@opensolaris.org uint32_t hme_lenerr; 1979610Sgdamore@opensolaris.org uint32_t hme_buff; 1989610Sgdamore@opensolaris.org uint32_t hme_missed; 1999610Sgdamore@opensolaris.org uint32_t hme_nocanput; 2009610Sgdamore@opensolaris.org uint32_t hme_allocbfail; 2019610Sgdamore@opensolaris.org uint32_t hme_babl; 2029610Sgdamore@opensolaris.org uint32_t hme_tmder; 2039610Sgdamore@opensolaris.org uint32_t hme_txlaterr; 2049610Sgdamore@opensolaris.org uint32_t hme_rxlaterr; 2059610Sgdamore@opensolaris.org uint32_t hme_slvparerr; 2069610Sgdamore@opensolaris.org uint32_t hme_txparerr; 2079610Sgdamore@opensolaris.org uint32_t hme_rxparerr; 2089610Sgdamore@opensolaris.org uint32_t hme_slverrack; 2099610Sgdamore@opensolaris.org uint32_t hme_txerrack; 2109610Sgdamore@opensolaris.org uint32_t hme_rxerrack; 2119610Sgdamore@opensolaris.org uint32_t hme_txtagerr; 2129610Sgdamore@opensolaris.org uint32_t hme_rxtagerr; 2139610Sgdamore@opensolaris.org uint32_t hme_eoperr; 2149610Sgdamore@opensolaris.org uint32_t hme_notmds; 2159610Sgdamore@opensolaris.org uint32_t hme_notbufs; 2169610Sgdamore@opensolaris.org uint32_t hme_norbufs; 2179610Sgdamore@opensolaris.org 2189610Sgdamore@opensolaris.org /* 2199610Sgdamore@opensolaris.org * check if transmitter is hung 2209610Sgdamore@opensolaris.org */ 2219610Sgdamore@opensolaris.org uint32_t hme_starts; 2229610Sgdamore@opensolaris.org uint32_t hme_txhung; 2239610Sgdamore@opensolaris.org time_t hme_msg_time; 2249610Sgdamore@opensolaris.org 2259610Sgdamore@opensolaris.org /* 2269610Sgdamore@opensolaris.org * Debuging kstats 2279610Sgdamore@opensolaris.org */ 2289610Sgdamore@opensolaris.org uint32_t inits; 2299610Sgdamore@opensolaris.org uint32_t phyfail; 2309610Sgdamore@opensolaris.org uint32_t asic_rev; 2319610Sgdamore@opensolaris.org }; 2329610Sgdamore@opensolaris.org 2339610Sgdamore@opensolaris.org /* flags */ 2349610Sgdamore@opensolaris.org #define HMERUNNING 0x01 /* chip is initialized */ 2359610Sgdamore@opensolaris.org #define HMESUSPENDED 0x08 /* suspended interface */ 2369610Sgdamore@opensolaris.org #define HMEINITIALIZED 0x10 /* interface initialized */ 2379610Sgdamore@opensolaris.org 2389610Sgdamore@opensolaris.org /* Mac address flags */ 2399610Sgdamore@opensolaris.org 2409610Sgdamore@opensolaris.org #define HME_FACTADDR_PRESENT 0x01 /* factory MAC id present */ 2419610Sgdamore@opensolaris.org #define HME_FACTADDR_USE 0x02 /* use factory MAC id */ 2429610Sgdamore@opensolaris.org 2439610Sgdamore@opensolaris.org struct hmekstat { 2449610Sgdamore@opensolaris.org struct kstat_named hk_cvc; /* code violation errors */ 2459610Sgdamore@opensolaris.org struct kstat_named hk_lenerr; /* rx len errors */ 2469610Sgdamore@opensolaris.org struct kstat_named hk_buff; /* buff errors */ 2479610Sgdamore@opensolaris.org struct kstat_named hk_missed; /* missed/dropped packets */ 2489610Sgdamore@opensolaris.org struct kstat_named hk_nocanput; /* nocanput errors */ 2499610Sgdamore@opensolaris.org struct kstat_named hk_allocbfail; /* allocb failures */ 2509610Sgdamore@opensolaris.org struct kstat_named hk_babl; /* runt errors */ 2519610Sgdamore@opensolaris.org struct kstat_named hk_tmder; /* tmd errors */ 2529610Sgdamore@opensolaris.org struct kstat_named hk_txlaterr; /* tx late errors */ 2539610Sgdamore@opensolaris.org struct kstat_named hk_rxlaterr; /* rx late errors */ 2549610Sgdamore@opensolaris.org struct kstat_named hk_slvparerr; /* slave parity errors */ 2559610Sgdamore@opensolaris.org struct kstat_named hk_txparerr; /* tx parity errors */ 2569610Sgdamore@opensolaris.org struct kstat_named hk_rxparerr; /* rx parity errors */ 2579610Sgdamore@opensolaris.org struct kstat_named hk_slverrack; /* slave error acks */ 2589610Sgdamore@opensolaris.org struct kstat_named hk_txerrack; /* tx error acks */ 2599610Sgdamore@opensolaris.org struct kstat_named hk_rxerrack; /* rx error acks */ 2609610Sgdamore@opensolaris.org struct kstat_named hk_txtagerr; /* tx tag error */ 2619610Sgdamore@opensolaris.org struct kstat_named hk_rxtagerr; /* rx tag error */ 2629610Sgdamore@opensolaris.org struct kstat_named hk_eoperr; /* eop error */ 2639610Sgdamore@opensolaris.org struct kstat_named hk_notmds; /* tmd errors */ 2649610Sgdamore@opensolaris.org struct kstat_named hk_notbufs; /* tx buf errors */ 2659610Sgdamore@opensolaris.org struct kstat_named hk_norbufs; /* rx buf errors */ 2669610Sgdamore@opensolaris.org 2679610Sgdamore@opensolaris.org struct kstat_named hk_inits; /* global inits */ 2689610Sgdamore@opensolaris.org struct kstat_named hk_phyfail; /* phy failures */ 2699610Sgdamore@opensolaris.org 2709610Sgdamore@opensolaris.org struct kstat_named hk_asic_rev; /* asic_rev */ 2719610Sgdamore@opensolaris.org }; 2729610Sgdamore@opensolaris.org 2739610Sgdamore@opensolaris.org #define HMEDRAINTIME (400000) /* # microseconds xmit drain */ 2749610Sgdamore@opensolaris.org 2759610Sgdamore@opensolaris.org #define ROUNDUP(a, n) (((a) + ((n) - 1)) & ~((n) - 1)) 2769610Sgdamore@opensolaris.org #define ROUNDUP2(a, n) (uchar_t *)((((uintptr_t)(a)) + ((n) - 1)) & ~((n) - 1)) 2779610Sgdamore@opensolaris.org 2789610Sgdamore@opensolaris.org /* 2799610Sgdamore@opensolaris.org * Xmit/receive buffer structure. 2809610Sgdamore@opensolaris.org * This structure is organized to meet the following requirements: 2819610Sgdamore@opensolaris.org * - bb_buf starts on an HMEBURSTSIZE boundary. 2829610Sgdamore@opensolaris.org * - hmebuf is an even multiple of HMEBURSTSIZE 2839610Sgdamore@opensolaris.org * - bb_buf[] is large enough to contain max VLAN frame (1522) plus 2849610Sgdamore@opensolaris.org * (3 x HMEBURSTSIZE) rounded up to the next HMEBURSTSIZE 2859610Sgdamore@opensolaris.org * XXX What about another 128 bytes (HMEC requirement). 2869610Sgdamore@opensolaris.org * Fast aligned copy requires both the source and destination 2879610Sgdamore@opensolaris.org * addresses have the same offset from some N-byte boundary. 2889610Sgdamore@opensolaris.org */ 2899610Sgdamore@opensolaris.org #define HMEBURSTSIZE (64) 2909610Sgdamore@opensolaris.org #define HMEBURSTMASK (HMEBURSTSIZE - 1) 2919610Sgdamore@opensolaris.org #define HMEBUFSIZE (1728) 2929610Sgdamore@opensolaris.org 2939610Sgdamore@opensolaris.org /* 2949610Sgdamore@opensolaris.org * Define offset from start of bb_buf[] to point receive descriptor. 2959610Sgdamore@opensolaris.org * Requirements: 2969610Sgdamore@opensolaris.org * - must be 14 bytes back of a 4-byte boundary so the start of 2979610Sgdamore@opensolaris.org * the network packet is 4-byte aligned. 2989610Sgdamore@opensolaris.org * - leave some headroom for others 2999610Sgdamore@opensolaris.org */ 3009610Sgdamore@opensolaris.org #define HMEHEADROOM (34) 3019610Sgdamore@opensolaris.org 3029610Sgdamore@opensolaris.org /* Offset for the first byte in the receive buffer */ 3039610Sgdamore@opensolaris.org #define HME_FSTBYTE_OFFSET 2 3049610Sgdamore@opensolaris.org 3059610Sgdamore@opensolaris.org #endif /* _KERNEL */ 3069610Sgdamore@opensolaris.org 3079610Sgdamore@opensolaris.org #ifdef __cplusplus 3089610Sgdamore@opensolaris.org } 3099610Sgdamore@opensolaris.org #endif 3109610Sgdamore@opensolaris.org 3119610Sgdamore@opensolaris.org #endif /* _SYS_HME_H */ 312