14978Sgd78059 /* 24978Sgd78059 * Solaris driver for ethernet cards based on the Macronix 98715 34978Sgd78059 * 44978Sgd78059 * Copyright (c) 2007 by Garrett D'Amore <garrett@damore.org>. 54978Sgd78059 * All rights reserved. 64978Sgd78059 * 74978Sgd78059 * Redistribution and use in source and binary forms, with or without 84978Sgd78059 * modification, are permitted provided that the following conditions 94978Sgd78059 * are met: 104978Sgd78059 * 1. Redistributions of source code must retain the above copyright 114978Sgd78059 * notice, this list of conditions and the following disclaimer. 124978Sgd78059 * 2. Redistributions in binary form must reproduce the above copyright 134978Sgd78059 * notice, this list of conditions and the following disclaimer in the 144978Sgd78059 * documentation and/or other materials provided with the distribution. 154978Sgd78059 * 3. Neither the name of the author nor the names of any co-contributors 164978Sgd78059 * may be used to endorse or promote products derived from this software 174978Sgd78059 * without specific prior written permission. 184978Sgd78059 * 194978Sgd78059 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' 204978Sgd78059 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 214978Sgd78059 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 224978Sgd78059 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 234978Sgd78059 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 244978Sgd78059 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 254978Sgd78059 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 264978Sgd78059 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 274978Sgd78059 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 284978Sgd78059 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 294978Sgd78059 * POSSIBILITY OF SUCH DAMAGE. 304978Sgd78059 */ 316684Sgd78059 /* 326684Sgd78059 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 336684Sgd78059 * Use is subject to license terms. 346684Sgd78059 */ 354978Sgd78059 364978Sgd78059 #ifndef _MXFEIMPL_H 374978Sgd78059 #define _MXFEIMPL_H 384978Sgd78059 394978Sgd78059 /* 404978Sgd78059 * This entire file is private to the MXFE driver. 414978Sgd78059 */ 424978Sgd78059 434978Sgd78059 #ifdef _KERNEL 444978Sgd78059 45*8275SEric Cheng #include <sys/mac_provider.h> 46*8275SEric Cheng 474978Sgd78059 /* 484978Sgd78059 * Compile time tunables. 494978Sgd78059 */ 504978Sgd78059 #define MXFE_TXRING 128 /* number of xmt buffers */ 514978Sgd78059 #define MXFE_RXRING 256 /* number of rcv buffers */ 524978Sgd78059 #define MXFE_TXRECLAIM 32 /* when to reclaim tx buffers (txavail) */ 534978Sgd78059 #define MXFE_TXRESCHED 120 /* when to resched (txavail) */ 544978Sgd78059 #define MXFE_LINKTIMER 5000 /* how often we check link state (msec) */ 554978Sgd78059 #define MXFE_HEADROOM 34 /* headroom in packet (should be 2 modulo 4) */ 564978Sgd78059 574978Sgd78059 /* 584978Sgd78059 * Constants, do not change. The bufsize is setup to make sure it comes 594978Sgd78059 * in at a whole number of cache lines, even for 32-long-word aligned 604978Sgd78059 * caches. 614978Sgd78059 */ 624978Sgd78059 #define MXFE_BUFSZ (1664) /* big enough for a vlan frame */ 634978Sgd78059 #define MXFE_SETUP_LEN 192 /* size of a setup frame */ 644978Sgd78059 654978Sgd78059 typedef struct mxfe mxfe_t; 664978Sgd78059 typedef struct mxfe_card mxfe_card_t; 674978Sgd78059 typedef struct mxfe_rxbuf mxfe_rxbuf_t; 684978Sgd78059 typedef struct mxfe_txbuf mxfe_txbuf_t; 694978Sgd78059 typedef struct mxfe_desc mxfe_desc_t; 704978Sgd78059 714978Sgd78059 struct mxfe_card { 724978Sgd78059 uint16_t card_venid; /* PCI vendor id */ 734978Sgd78059 uint16_t card_devid; /* PCI device id */ 744978Sgd78059 uint16_t card_revid; /* PCI revision id */ 754978Sgd78059 uint16_t card_revmask; 764978Sgd78059 char *card_cardname; /* Description of the card */ 774978Sgd78059 unsigned card_model; /* Card specific flags */ 784978Sgd78059 }; 794978Sgd78059 804978Sgd78059 /* 814978Sgd78059 * Device instance structure, one per PCI card. 824978Sgd78059 */ 834978Sgd78059 struct mxfe { 844978Sgd78059 dev_info_t *mxfe_dip; 854978Sgd78059 mac_handle_t mxfe_mh; 864978Sgd78059 mxfe_card_t *mxfe_cardp; 874978Sgd78059 ushort_t mxfe_cachesize; 884978Sgd78059 ushort_t mxfe_sromwidth; 894978Sgd78059 int mxfe_flags; 904978Sgd78059 kmutex_t mxfe_xmtlock; 914978Sgd78059 kmutex_t mxfe_intrlock; 924978Sgd78059 ddi_iblock_cookie_t mxfe_icookie; 934978Sgd78059 944978Sgd78059 /* 954978Sgd78059 * Register access. 964978Sgd78059 */ 974978Sgd78059 uint32_t *mxfe_regs; 984978Sgd78059 ddi_acc_handle_t mxfe_regshandle; 994978Sgd78059 1004978Sgd78059 /* 1014978Sgd78059 * Receive descriptors. 1024978Sgd78059 */ 1034978Sgd78059 int mxfe_rxhead; 1044978Sgd78059 struct mxfe_desc *mxfe_rxdescp; 1054978Sgd78059 ddi_dma_handle_t mxfe_rxdesc_dmah; 1064978Sgd78059 ddi_acc_handle_t mxfe_rxdesc_acch; 1074978Sgd78059 uint32_t mxfe_rxdesc_paddr; 1084978Sgd78059 struct mxfe_rxbuf **mxfe_rxbufs; 1094978Sgd78059 1104978Sgd78059 /* 1114978Sgd78059 * Transmit descriptors. 1124978Sgd78059 */ 1134978Sgd78059 int mxfe_txreclaim; 1144978Sgd78059 int mxfe_txsend; 1154978Sgd78059 int mxfe_txavail; 1164978Sgd78059 struct mxfe_desc *mxfe_txdescp; 1174978Sgd78059 ddi_dma_handle_t mxfe_txdesc_dmah; 1184978Sgd78059 ddi_acc_handle_t mxfe_txdesc_acch; 1194978Sgd78059 uint32_t mxfe_txdesc_paddr; 1204978Sgd78059 struct mxfe_txbuf **mxfe_txbufs; 1214978Sgd78059 hrtime_t mxfe_txstall_time; 1224978Sgd78059 boolean_t mxfe_wantw; 1234978Sgd78059 1244978Sgd78059 /* 1254978Sgd78059 * Address management. 1264978Sgd78059 */ 1274978Sgd78059 uchar_t mxfe_curraddr[ETHERADDRL]; 1284978Sgd78059 boolean_t mxfe_promisc; 1294978Sgd78059 1304978Sgd78059 /* 1314978Sgd78059 * Link state. 1324978Sgd78059 */ 1336684Sgd78059 int mxfe_nwaystate; 1346684Sgd78059 uint64_t mxfe_lastifspeed; 1356684Sgd78059 link_duplex_t mxfe_lastduplex; 1366684Sgd78059 link_state_t mxfe_lastlinkup; 1376684Sgd78059 link_state_t mxfe_linkup; 1386684Sgd78059 link_duplex_t mxfe_duplex; 1396684Sgd78059 uint64_t mxfe_ifspeed; 1404978Sgd78059 boolean_t mxfe_resetting; /* no link warning */ 1414978Sgd78059 1424978Sgd78059 /* 1434978Sgd78059 * Transceiver stuff. 1444978Sgd78059 */ 1454978Sgd78059 int mxfe_phyaddr; 1464978Sgd78059 int mxfe_phyid; 1474978Sgd78059 int mxfe_phyinuse; 1486684Sgd78059 uint8_t mxfe_adv_aneg; 1496684Sgd78059 uint8_t mxfe_adv_100T4; 1506684Sgd78059 uint8_t mxfe_adv_100fdx; 1516684Sgd78059 uint8_t mxfe_adv_100hdx; 1526684Sgd78059 uint8_t mxfe_adv_10fdx; 1536684Sgd78059 uint8_t mxfe_adv_10hdx; 1546684Sgd78059 uint8_t mxfe_cap_aneg; 1556684Sgd78059 uint8_t mxfe_cap_100T4; 1566684Sgd78059 uint8_t mxfe_cap_100fdx; 1576684Sgd78059 uint8_t mxfe_cap_100hdx; 1586684Sgd78059 uint8_t mxfe_cap_10fdx; 1596684Sgd78059 uint8_t mxfe_cap_10hdx; 1604978Sgd78059 int mxfe_forcephy; 1616684Sgd78059 uint16_t mxfe_bmsr; 1626684Sgd78059 uint16_t mxfe_anlpar; 1636684Sgd78059 uint16_t mxfe_aner; 1644978Sgd78059 1654978Sgd78059 /* 1664978Sgd78059 * Kstats. 1674978Sgd78059 */ 1684978Sgd78059 kstat_t *mxfe_intrstat; 1694978Sgd78059 uint64_t mxfe_ipackets; 1704978Sgd78059 uint64_t mxfe_opackets; 1714978Sgd78059 uint64_t mxfe_rbytes; 1724978Sgd78059 uint64_t mxfe_obytes; 1734978Sgd78059 uint64_t mxfe_brdcstrcv; 1744978Sgd78059 uint64_t mxfe_multircv; 1754978Sgd78059 uint64_t mxfe_brdcstxmt; 1764978Sgd78059 uint64_t mxfe_multixmt; 1774978Sgd78059 1784978Sgd78059 unsigned mxfe_norcvbuf; 1794978Sgd78059 unsigned mxfe_noxmtbuf; 1804978Sgd78059 unsigned mxfe_errrcv; 1814978Sgd78059 unsigned mxfe_errxmt; 1824978Sgd78059 unsigned mxfe_missed; 1834978Sgd78059 unsigned mxfe_underflow; 1844978Sgd78059 unsigned mxfe_overflow; 1854978Sgd78059 unsigned mxfe_align_errors; 1864978Sgd78059 unsigned mxfe_fcs_errors; 1874978Sgd78059 unsigned mxfe_carrier_errors; 1884978Sgd78059 unsigned mxfe_collisions; 1894978Sgd78059 unsigned mxfe_ex_collisions; 1904978Sgd78059 unsigned mxfe_tx_late_collisions; 1914978Sgd78059 unsigned mxfe_defer_xmts; 1924978Sgd78059 unsigned mxfe_first_collisions; 1934978Sgd78059 unsigned mxfe_multi_collisions; 1944978Sgd78059 unsigned mxfe_sqe_errors; 1954978Sgd78059 unsigned mxfe_macxmt_errors; 1964978Sgd78059 unsigned mxfe_macrcv_errors; 1974978Sgd78059 unsigned mxfe_toolong_errors; 1984978Sgd78059 unsigned mxfe_runt; 1994978Sgd78059 unsigned mxfe_jabber; 2004978Sgd78059 }; 2014978Sgd78059 2024978Sgd78059 struct mxfe_rxbuf { 2034978Sgd78059 caddr_t rxb_buf; 2044978Sgd78059 ddi_dma_handle_t rxb_dmah; 2054978Sgd78059 ddi_acc_handle_t rxb_acch; 2064978Sgd78059 uint32_t rxb_paddr; 2074978Sgd78059 }; 2084978Sgd78059 2094978Sgd78059 struct mxfe_txbuf { 2104978Sgd78059 /* bcopy version of tx */ 2114978Sgd78059 caddr_t txb_buf; 2124978Sgd78059 uint32_t txb_paddr; 2134978Sgd78059 ddi_dma_handle_t txb_dmah; 2144978Sgd78059 ddi_acc_handle_t txb_acch; 2154978Sgd78059 }; 2164978Sgd78059 2174978Sgd78059 /* 2184978Sgd78059 * Descriptor. We use rings rather than chains. 2194978Sgd78059 */ 2204978Sgd78059 struct mxfe_desc { 2214978Sgd78059 unsigned desc_status; 2224978Sgd78059 unsigned desc_control; 2234978Sgd78059 unsigned desc_buffer1; 2244978Sgd78059 unsigned desc_buffer2; 2254978Sgd78059 }; 2264978Sgd78059 2274978Sgd78059 #define PUTTXDESC(mxfep, member, val) \ 2284978Sgd78059 ddi_put32(mxfep->mxfe_txdesc_acch, &member, val) 2294978Sgd78059 2304978Sgd78059 #define PUTRXDESC(mxfep, member, val) \ 2314978Sgd78059 ddi_put32(mxfep->mxfe_rxdesc_acch, &member, val) 2324978Sgd78059 2334978Sgd78059 #define GETTXDESC(mxfep, member) \ 2344978Sgd78059 ddi_get32(mxfep->mxfe_txdesc_acch, &member) 2354978Sgd78059 2364978Sgd78059 #define GETRXDESC(mxfep, member) \ 2374978Sgd78059 ddi_get32(mxfep->mxfe_rxdesc_acch, &member) 2384978Sgd78059 2394978Sgd78059 /* 2404978Sgd78059 * Receive descriptor fields. 2414978Sgd78059 */ 2424978Sgd78059 #define RXSTAT_OWN 0x80000000U /* ownership */ 2434978Sgd78059 #define RXSTAT_RXLEN 0x3FFF0000U /* frame length, incl. crc */ 2444978Sgd78059 #define RXSTAT_RXERR 0x00008000U /* error summary */ 2454978Sgd78059 #define RXSTAT_DESCERR 0x00004000U /* descriptor error */ 2464978Sgd78059 #define RXSTAT_RXTYPE 0x00003000U /* data type */ 2474978Sgd78059 #define RXSTAT_RUNT 0x00000800U /* runt frame */ 2484978Sgd78059 #define RXSTAT_GROUP 0x00000400U /* multicast/brdcast frame */ 2494978Sgd78059 #define RXSTAT_FIRST 0x00000200U /* first descriptor */ 2504978Sgd78059 #define RXSTAT_LAST 0x00000100U /* last descriptor */ 2514978Sgd78059 #define RXSTAT_TOOLONG 0x00000080U /* frame too long */ 2524978Sgd78059 #define RXSTAT_COLLSEEN 0x00000040U /* late collision seen */ 2534978Sgd78059 #define RXSTAT_FRTYPE 0x00000020U /* frame type */ 2544978Sgd78059 #define RXSTAT_WATCHDOG 0x00000010U /* receive watchdog */ 2554978Sgd78059 #define RXSTAT_DRIBBLE 0x00000004U /* dribbling bit */ 2564978Sgd78059 #define RXSTAT_CRCERR 0x00000002U /* crc error */ 2574978Sgd78059 #define RXSTAT_OFLOW 0x00000001U /* fifo overflow */ 2584978Sgd78059 #define RXSTAT_ERRS (RXSTAT_DESCERR | RXSTAT_RUNT | \ 2594978Sgd78059 RXSTAT_COLLSEEN | RXSTAT_DRIBBLE | \ 2604978Sgd78059 RXSTAT_CRCERR | RXSTAT_OFLOW) 2614978Sgd78059 #define RXLENGTH(x) ((x & RXSTAT_RXLEN) >> 16) 2624978Sgd78059 2634978Sgd78059 #define RXCTL_ENDRING 0x02000000U /* end of ring */ 2644978Sgd78059 #define RXCTL_CHAIN 0x01000000U /* chained descriptors */ 2654978Sgd78059 #define RXCTL_BUFLEN2 0x003FF800U /* buffer 2 length */ 2664978Sgd78059 #define RXCTL_BUFLEN1 0x000007FFU /* buffer 1 length */ 2674978Sgd78059 2684978Sgd78059 /* 2694978Sgd78059 * Transmit descriptor fields. 2704978Sgd78059 */ 2714978Sgd78059 #define TXSTAT_OWN 0x80000000U /* ownership */ 2724978Sgd78059 #define TXSTAT_URCNT 0x00C00000U /* underrun count */ 2734978Sgd78059 #define TXSTAT_TXERR 0x00008000U /* error summary */ 2744978Sgd78059 #define TXSTAT_JABBER 0x00004000U /* jabber timeout */ 2754978Sgd78059 #define TXSTAT_CARRLOST 0x00000800U /* lost carrier */ 2764978Sgd78059 #define TXSTAT_NOCARR 0x00000400U /* no carrier */ 2774978Sgd78059 #define TXSTAT_LATECOL 0x00000200U /* late collision */ 2784978Sgd78059 #define TXSTAT_EXCOLL 0x00000100U /* excessive collisions */ 2794978Sgd78059 #define TXSTAT_SQE 0x00000080U /* heartbeat failure */ 2804978Sgd78059 #define TXSTAT_COLLCNT 0x00000078U /* collision count */ 2814978Sgd78059 #define TXSTAT_UFLOW 0x00000002U /* underflow */ 2824978Sgd78059 #define TXSTAT_DEFER 0x00000001U /* deferred */ 2834978Sgd78059 #define TXCOLLCNT(x) ((x & TXSTAT_COLLCNT) >> 3) 2844978Sgd78059 #define TXUFLOWCNT(x) ((x & TXSTAT_URCNT) >> 22) 2854978Sgd78059 2864978Sgd78059 #define TXCTL_INTCMPLTE 0x80000000U /* interrupt completed */ 2874978Sgd78059 #define TXCTL_LAST 0x40000000U /* last descriptor */ 2884978Sgd78059 #define TXCTL_FIRST 0x20000000U /* first descriptor */ 2894978Sgd78059 #define TXCTL_NOCRC 0x04000000U /* disable crc */ 2904978Sgd78059 #define TXCTL_SETUP 0x08000000U /* setup frame */ 2914978Sgd78059 #define TXCTL_ENDRING 0x02000000U /* end of ring */ 2924978Sgd78059 #define TXCTL_CHAIN 0x01000000U /* chained descriptors */ 2934978Sgd78059 #define TXCTL_NOPAD 0x00800000U /* disable padding */ 2944978Sgd78059 #define TXCTL_HASHPERF 0x00400000U /* hash perfect mode */ 2954978Sgd78059 #define TXCTL_BUFLEN2 0x003FF800U /* buffer length 2 */ 2964978Sgd78059 #define TXCTL_BUFLEN1 0x000007FFU /* buffer length 1 */ 2974978Sgd78059 2984978Sgd78059 /* 2994978Sgd78059 * Interface flags. 3004978Sgd78059 */ 3014978Sgd78059 #define MXFE_RUNNING 0x1 /* chip is initialized */ 3024978Sgd78059 #define MXFE_SUSPENDED 0x2 /* interface is suspended */ 3034978Sgd78059 #define MXFE_SYMBOL 0x8 /* use symbol mode */ 3044978Sgd78059 3054978Sgd78059 /* 3064978Sgd78059 * Link flags... 3074978Sgd78059 */ 3084978Sgd78059 #define MXFE_NOLINK 0x0 /* initial link state, no timer */ 3094978Sgd78059 #define MXFE_NWAYCHECK 0x2 /* checking for NWay support */ 3104978Sgd78059 #define MXFE_NWAYRENEG 0x3 /* renegotiating NWay mode */ 3114978Sgd78059 #define MXFE_GOODLINK 0x4 /* detected link is good */ 3124978Sgd78059 3134978Sgd78059 /* 3144978Sgd78059 * Card models. 3154978Sgd78059 */ 3164978Sgd78059 #define MXFE_MODEL(mxfep) ((mxfep)->mxfe_cardp->card_model) 3174978Sgd78059 #define MXFE_98715 0x1 3184978Sgd78059 #define MXFE_98715A 0x2 3194978Sgd78059 #define MXFE_98715AEC 0x3 3204978Sgd78059 #define MXFE_98715B 0x4 3214978Sgd78059 #define MXFE_98725 0x5 3224978Sgd78059 #define MXFE_98713 0x6 3234978Sgd78059 #define MXFE_98713A 0x7 3244978Sgd78059 #define MXFE_PNICII 0x8 3254978Sgd78059 3264978Sgd78059 /* 3274978Sgd78059 * Register definitions located in mxfe.h exported header file. 3284978Sgd78059 */ 3294978Sgd78059 3304978Sgd78059 /* 3314978Sgd78059 * Macros to simplify hardware access. Note that the reg/4 is used to 3324978Sgd78059 * help with pointer arithmetic. 3334978Sgd78059 */ 3344978Sgd78059 #define GETCSR(mxfep, reg) \ 3354978Sgd78059 ddi_get32(mxfep->mxfe_regshandle, mxfep->mxfe_regs + (reg/4)) 3364978Sgd78059 3374978Sgd78059 #define PUTCSR(mxfep, reg, val) \ 3384978Sgd78059 ddi_put32(mxfep->mxfe_regshandle, mxfep->mxfe_regs + (reg/4), val) 3394978Sgd78059 3404978Sgd78059 #define SETBIT(mxfep, reg, val) \ 3414978Sgd78059 PUTCSR(mxfep, reg, GETCSR(mxfep, reg) | (val)) 3424978Sgd78059 3434978Sgd78059 #define CLRBIT(mxfep, reg, val) \ 3444978Sgd78059 PUTCSR(mxfep, reg, GETCSR(mxfep, reg) & ~(val)) 3454978Sgd78059 3464978Sgd78059 #define SYNCTXDESC(mxfep, index, who) \ 3474978Sgd78059 (void) ddi_dma_sync(mxfep->mxfe_txdesc_dmah, \ 3484978Sgd78059 (index * sizeof (mxfe_desc_t)), sizeof (mxfe_desc_t), who) 3494978Sgd78059 3504978Sgd78059 #define SYNCTXBUF(txb, len, who) \ 3514978Sgd78059 (void) (ddi_dma_sync(txb->txb_dmah, 0, len, who)) 3524978Sgd78059 3534978Sgd78059 #define SYNCRXDESC(mxfep, index, who) \ 3544978Sgd78059 (void) ddi_dma_sync(mxfep->mxfe_rxdesc_dmah, \ 3554978Sgd78059 (index * sizeof (mxfe_desc_t)), sizeof (mxfe_desc_t), who) 3564978Sgd78059 3574978Sgd78059 #define SYNCRXBUF(rxb, len, who) \ 3584978Sgd78059 (void) (ddi_dma_sync(rxb->rxb_dmah, 0, len, who)) 3594978Sgd78059 3604978Sgd78059 /* 3614978Sgd78059 * Debugging flags. 3624978Sgd78059 */ 3634978Sgd78059 #define DWARN 0x0001 3644978Sgd78059 #define DINTR 0x0002 3654978Sgd78059 #define DWSRV 0x0004 3664978Sgd78059 #define DMACID 0x0008 3674978Sgd78059 #define DDLPI 0x0010 3684978Sgd78059 #define DPHY 0x0020 3694978Sgd78059 #define DPCI 0x0040 3704978Sgd78059 #define DCHATTY 0x0080 3714978Sgd78059 #define DDMA 0x0100 3724978Sgd78059 #define DLINK 0x0200 3734978Sgd78059 #define DSROM 0x0400 3744978Sgd78059 #define DRECV 0x0800 3754978Sgd78059 #define DXMIT 0x1000 3764978Sgd78059 3774978Sgd78059 #ifdef DEBUG 3784978Sgd78059 #define DBG(lvl, ...) mxfe_dprintf(mxfep, __func__, lvl, __VA_ARGS__); 3794978Sgd78059 #else 3804978Sgd78059 #define DBG(lvl, ...) 3814978Sgd78059 #endif 3824978Sgd78059 3834978Sgd78059 #endif /* _KERNEL */ 3844978Sgd78059 3854978Sgd78059 #endif /* _MXFEIMPL_H */ 386