1*dd52495fSSaurabh Misra /* 2*dd52495fSSaurabh Misra * CDDL HEADER START 3*dd52495fSSaurabh Misra * 4*dd52495fSSaurabh Misra * The contents of this file are subject to the terms of the 5*dd52495fSSaurabh Misra * Common Development and Distribution License (the "License"). 6*dd52495fSSaurabh Misra * You may not use this file except in compliance with the License. 7*dd52495fSSaurabh Misra * 8*dd52495fSSaurabh Misra * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*dd52495fSSaurabh Misra * or http://www.opensolaris.org/os/licensing. 10*dd52495fSSaurabh Misra * See the License for the specific language governing permissions 11*dd52495fSSaurabh Misra * and limitations under the License. 12*dd52495fSSaurabh Misra * 13*dd52495fSSaurabh Misra * When distributing Covered Code, include this CDDL HEADER in each 14*dd52495fSSaurabh Misra * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*dd52495fSSaurabh Misra * If applicable, add the following below this CDDL HEADER, with the 16*dd52495fSSaurabh Misra * fields enclosed by brackets "[]" replaced with your own identifying 17*dd52495fSSaurabh Misra * information: Portions Copyright [yyyy] [name of copyright owner] 18*dd52495fSSaurabh Misra * 19*dd52495fSSaurabh Misra * CDDL HEADER END 20*dd52495fSSaurabh Misra */ 21*dd52495fSSaurabh Misra 22*dd52495fSSaurabh Misra /* 23*dd52495fSSaurabh Misra * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*dd52495fSSaurabh Misra * Use is subject to license terms. 25*dd52495fSSaurabh Misra */ 26*dd52495fSSaurabh Misra 27*dd52495fSSaurabh Misra #ifndef _BFE_H 28*dd52495fSSaurabh Misra #define _BFE_H 29*dd52495fSSaurabh Misra 30*dd52495fSSaurabh Misra #include "bfe_hw.h" 31*dd52495fSSaurabh Misra 32*dd52495fSSaurabh Misra #ifdef __cplusplus 33*dd52495fSSaurabh Misra extern "C" { 34*dd52495fSSaurabh Misra #endif 35*dd52495fSSaurabh Misra 36*dd52495fSSaurabh Misra #define BFE_SUCCESS DDI_SUCCESS 37*dd52495fSSaurabh Misra #define BFE_FAILURE DDI_FAILURE 38*dd52495fSSaurabh Misra 39*dd52495fSSaurabh Misra #define BFE_MAX_MULTICAST_TABLE 64 40*dd52495fSSaurabh Misra 41*dd52495fSSaurabh Misra #define BFE_LINK_SPEED_10MBS 1 42*dd52495fSSaurabh Misra #define BFE_LINK_SPEED_100MBS 2 43*dd52495fSSaurabh Misra 44*dd52495fSSaurabh Misra #define VTAG_SIZE 4 45*dd52495fSSaurabh Misra 46*dd52495fSSaurabh Misra #define BFE_MTU ETHERMTU 47*dd52495fSSaurabh Misra 48*dd52495fSSaurabh Misra /* 49*dd52495fSSaurabh Misra * Use to increment descriptor slot number. 50*dd52495fSSaurabh Misra */ 51*dd52495fSSaurabh Misra #define BFE_INC_SLOT(i, p2) \ 52*dd52495fSSaurabh Misra (i = ((i + 1) & (p2 - 1))) 53*dd52495fSSaurabh Misra 54*dd52495fSSaurabh Misra #define BFE_DEC_SLOT(i, p2) \ 55*dd52495fSSaurabh Misra (i = ((i + p2 - 1) % p2)) 56*dd52495fSSaurabh Misra 57*dd52495fSSaurabh Misra /* 58*dd52495fSSaurabh Misra * I/O instructions 59*dd52495fSSaurabh Misra */ 60*dd52495fSSaurabh Misra #define OUTB(bfe, p, v) \ 61*dd52495fSSaurabh Misra ddi_put8((bfe)->bfe_mem_regset.hdl, \ 62*dd52495fSSaurabh Misra (void *)((caddr_t)((bfe)->bfe_mem_regset.addr) + (p)), v) 63*dd52495fSSaurabh Misra 64*dd52495fSSaurabh Misra #define OUTW(bfe, p, v) \ 65*dd52495fSSaurabh Misra ddi_put16((bfe)->bfe_mem_regset.hdl, \ 66*dd52495fSSaurabh Misra (void *)((caddr_t)((bfe)->bfe_mem_regset.addr) + (p)), v) 67*dd52495fSSaurabh Misra 68*dd52495fSSaurabh Misra #define OUTL(bfe, p, v) \ 69*dd52495fSSaurabh Misra ddi_put32((bfe)->bfe_mem_regset.hdl, \ 70*dd52495fSSaurabh Misra (void *)((caddr_t)((bfe)->bfe_mem_regset.addr) + (p)), v) 71*dd52495fSSaurabh Misra 72*dd52495fSSaurabh Misra #define INB(bfe, p) \ 73*dd52495fSSaurabh Misra ddi_get8((bfe)->bfe_mem_regset.hdl, \ 74*dd52495fSSaurabh Misra (void *)(((caddr_t)(bfe)->bfe_mem_regset.addr) + (p))) 75*dd52495fSSaurabh Misra #define INW(bfe, p) \ 76*dd52495fSSaurabh Misra ddi_get16((bfe)->bfe_mem_regset.hdl, \ 77*dd52495fSSaurabh Misra (void *)(((caddr_t)(bfe)->bfe_mem_regset.addr) + (p))) 78*dd52495fSSaurabh Misra 79*dd52495fSSaurabh Misra #define INL(bfe, p) \ 80*dd52495fSSaurabh Misra ddi_get32((bfe)->bfe_mem_regset.hdl, \ 81*dd52495fSSaurabh Misra (void *)(((caddr_t)(bfe)->bfe_mem_regset.addr) + (p))) 82*dd52495fSSaurabh Misra 83*dd52495fSSaurabh Misra #define FLUSH(bfe, reg) \ 84*dd52495fSSaurabh Misra (void) INL(bfe, reg) 85*dd52495fSSaurabh Misra 86*dd52495fSSaurabh Misra #define OUTL_OR(bfe, reg, v) \ 87*dd52495fSSaurabh Misra OUTL(bfe, reg, (INL(bfe, reg) | v)) 88*dd52495fSSaurabh Misra 89*dd52495fSSaurabh Misra #define OUTL_AND(bfe, reg, v) \ 90*dd52495fSSaurabh Misra OUTL(bfe, reg, (INL(bfe, reg) & v)) 91*dd52495fSSaurabh Misra 92*dd52495fSSaurabh Misra /* 93*dd52495fSSaurabh Misra * These macros allows use to write to descriptor memory. 94*dd52495fSSaurabh Misra */ 95*dd52495fSSaurabh Misra #define PUT_DESC(r, member, val) \ 96*dd52495fSSaurabh Misra ddi_put32(r->r_desc_acc_handle, (member), (val)) 97*dd52495fSSaurabh Misra 98*dd52495fSSaurabh Misra #define GET_DESC(r, member) \ 99*dd52495fSSaurabh Misra ddi_get32(r->r_desc_acc_handle, (member)) 100*dd52495fSSaurabh Misra 101*dd52495fSSaurabh Misra typedef struct bfe_cards { 102*dd52495fSSaurabh Misra uint16_t vendor_id; 103*dd52495fSSaurabh Misra uint16_t device_id; 104*dd52495fSSaurabh Misra char *cardname; 105*dd52495fSSaurabh Misra } bfe_cards_t; 106*dd52495fSSaurabh Misra 107*dd52495fSSaurabh Misra 108*dd52495fSSaurabh Misra /* 109*dd52495fSSaurabh Misra * Chip's state. 110*dd52495fSSaurabh Misra */ 111*dd52495fSSaurabh Misra typedef enum { 112*dd52495fSSaurabh Misra BFE_CHIP_UNINITIALIZED = 0, 113*dd52495fSSaurabh Misra BFE_CHIP_INITIALIZED, 114*dd52495fSSaurabh Misra BFE_CHIP_ACTIVE, 115*dd52495fSSaurabh Misra BFE_CHIP_STOPPED, 116*dd52495fSSaurabh Misra BFE_CHIP_HALT, 117*dd52495fSSaurabh Misra BFE_CHIP_RESUME, 118*dd52495fSSaurabh Misra BFE_CHIP_SUSPENDED, 119*dd52495fSSaurabh Misra BFE_CHIP_QUIESCED 120*dd52495fSSaurabh Misra } bfe_chip_state_t; 121*dd52495fSSaurabh Misra 122*dd52495fSSaurabh Misra /* 123*dd52495fSSaurabh Misra * PHY state. 124*dd52495fSSaurabh Misra */ 125*dd52495fSSaurabh Misra typedef enum { 126*dd52495fSSaurabh Misra BFE_PHY_STARTED = 1, 127*dd52495fSSaurabh Misra BFE_PHY_STOPPED, 128*dd52495fSSaurabh Misra BFE_PHY_RESET_DONE, 129*dd52495fSSaurabh Misra BFE_PHY_RESET_TIMEOUT, 130*dd52495fSSaurabh Misra BFE_PHY_NOTFOUND 131*dd52495fSSaurabh Misra } bfe_phy_state_t; 132*dd52495fSSaurabh Misra 133*dd52495fSSaurabh Misra /* 134*dd52495fSSaurabh Misra * Chip's mode 135*dd52495fSSaurabh Misra */ 136*dd52495fSSaurabh Misra #define BFE_RX_MODE_ENABLE 0x1 137*dd52495fSSaurabh Misra #define BFE_RX_MODE_PROMISC 0x2 138*dd52495fSSaurabh Misra #define BFE_RX_MODE_BROADCAST 0x4 139*dd52495fSSaurabh Misra #define BFE_RX_MODE_ALLMULTI 0x8 140*dd52495fSSaurabh Misra 141*dd52495fSSaurabh Misra /* 142*dd52495fSSaurabh Misra * Every packet has this header which is put by the card. 143*dd52495fSSaurabh Misra */ 144*dd52495fSSaurabh Misra typedef struct bfe_rx_header { 145*dd52495fSSaurabh Misra uint16_t len; 146*dd52495fSSaurabh Misra uint16_t flags; 147*dd52495fSSaurabh Misra uint16_t pad[12]; 148*dd52495fSSaurabh Misra } bfe_rx_header_t; 149*dd52495fSSaurabh Misra 150*dd52495fSSaurabh Misra typedef struct bfe_stats { 151*dd52495fSSaurabh Misra uint64_t ether_stat_align_errors; 152*dd52495fSSaurabh Misra uint64_t ether_stat_carrier_errors; 153*dd52495fSSaurabh Misra uint64_t ether_stat_ex_collisions; 154*dd52495fSSaurabh Misra uint64_t ether_stat_fcs_errors; 155*dd52495fSSaurabh Misra uint64_t ether_stat_first_collisions; 156*dd52495fSSaurabh Misra uint64_t ether_stat_macrcv_errors; 157*dd52495fSSaurabh Misra uint64_t ether_stat_macxmt_errors; 158*dd52495fSSaurabh Misra uint64_t ether_stat_multi_collisions; 159*dd52495fSSaurabh Misra uint64_t ether_stat_toolong_errors; 160*dd52495fSSaurabh Misra uint64_t ether_stat_tooshort_errors; 161*dd52495fSSaurabh Misra uint64_t ether_stat_tx_late_collisions; 162*dd52495fSSaurabh Misra uint64_t ether_stat_defer_xmts; 163*dd52495fSSaurabh Misra uint64_t brdcstrcv; 164*dd52495fSSaurabh Misra uint64_t brdcstxmt; 165*dd52495fSSaurabh Misra uint64_t multixmt; 166*dd52495fSSaurabh Misra uint64_t collisions; 167*dd52495fSSaurabh Misra uint64_t ierrors; 168*dd52495fSSaurabh Misra uint64_t ipackets; 169*dd52495fSSaurabh Misra uint64_t multircv; 170*dd52495fSSaurabh Misra uint64_t norcvbuf; 171*dd52495fSSaurabh Misra uint64_t noxmtbuf; 172*dd52495fSSaurabh Misra uint64_t obytes; 173*dd52495fSSaurabh Misra uint64_t opackets; 174*dd52495fSSaurabh Misra uint64_t rbytes; 175*dd52495fSSaurabh Misra uint64_t underflows; 176*dd52495fSSaurabh Misra uint64_t overflows; 177*dd52495fSSaurabh Misra uint64_t txchecks; 178*dd52495fSSaurabh Misra uint64_t intr_claimed; 179*dd52495fSSaurabh Misra uint64_t intr_unclaimed; 180*dd52495fSSaurabh Misra uint64_t linkchanges; 181*dd52495fSSaurabh Misra uint64_t txcpybytes; 182*dd52495fSSaurabh Misra uint64_t txmapbytes; 183*dd52495fSSaurabh Misra uint64_t rxcpybytes; 184*dd52495fSSaurabh Misra uint64_t rxmapbytes; 185*dd52495fSSaurabh Misra uint64_t txreclaim0; 186*dd52495fSSaurabh Misra uint64_t txreclaims; 187*dd52495fSSaurabh Misra uint32_t txstalls; 188*dd52495fSSaurabh Misra uint32_t resets; 189*dd52495fSSaurabh Misra } bfe_stats_t; 190*dd52495fSSaurabh Misra 191*dd52495fSSaurabh Misra typedef struct { 192*dd52495fSSaurabh Misra int state; 193*dd52495fSSaurabh Misra int speed; 194*dd52495fSSaurabh Misra int duplex; 195*dd52495fSSaurabh Misra int flowctrl; 196*dd52495fSSaurabh Misra int mau; 197*dd52495fSSaurabh Misra } bfe_link_t; 198*dd52495fSSaurabh Misra 199*dd52495fSSaurabh Misra /* 200*dd52495fSSaurabh Misra * Device registers handle 201*dd52495fSSaurabh Misra */ 202*dd52495fSSaurabh Misra typedef struct { 203*dd52495fSSaurabh Misra ddi_acc_handle_t hdl; 204*dd52495fSSaurabh Misra caddr_t addr; 205*dd52495fSSaurabh Misra } bfe_acc_t; 206*dd52495fSSaurabh Misra 207*dd52495fSSaurabh Misra /* 208*dd52495fSSaurabh Misra * BCM4401 Chip state 209*dd52495fSSaurabh Misra */ 210*dd52495fSSaurabh Misra typedef struct bfe_chip { 211*dd52495fSSaurabh Misra int link; 212*dd52495fSSaurabh Misra int state; 213*dd52495fSSaurabh Misra int speed; 214*dd52495fSSaurabh Misra int duplex; 215*dd52495fSSaurabh Misra uint32_t bmsr; 216*dd52495fSSaurabh Misra uint32_t phyaddr; 217*dd52495fSSaurabh Misra } bfe_chip_t; 218*dd52495fSSaurabh Misra 219*dd52495fSSaurabh Misra 220*dd52495fSSaurabh Misra /* 221*dd52495fSSaurabh Misra * Ring Management framework. 222*dd52495fSSaurabh Misra */ 223*dd52495fSSaurabh Misra 224*dd52495fSSaurabh Misra /* 225*dd52495fSSaurabh Misra * TX and RX descriptor format in the hardware. 226*dd52495fSSaurabh Misra */ 227*dd52495fSSaurabh Misra typedef struct bfe_desc { 228*dd52495fSSaurabh Misra volatile uint32_t desc_ctl; 229*dd52495fSSaurabh Misra volatile uint32_t desc_addr; 230*dd52495fSSaurabh Misra } bfe_desc_t; 231*dd52495fSSaurabh Misra 232*dd52495fSSaurabh Misra /* 233*dd52495fSSaurabh Misra * DMA handle for each descriptor 234*dd52495fSSaurabh Misra */ 235*dd52495fSSaurabh Misra typedef struct bfe_dma { 236*dd52495fSSaurabh Misra ddi_dma_handle_t handle; 237*dd52495fSSaurabh Misra ddi_acc_handle_t acchdl; 238*dd52495fSSaurabh Misra ddi_dma_cookie_t cookie; 239*dd52495fSSaurabh Misra caddr_t addr; 240*dd52495fSSaurabh Misra size_t len; 241*dd52495fSSaurabh Misra } bfe_dma_t; 242*dd52495fSSaurabh Misra 243*dd52495fSSaurabh Misra /* Keep it power of 2 */ 244*dd52495fSSaurabh Misra #define TX_NUM_DESC 128 245*dd52495fSSaurabh Misra #define RX_NUM_DESC 128 246*dd52495fSSaurabh Misra 247*dd52495fSSaurabh Misra 248*dd52495fSSaurabh Misra #define BFE_RING_UNALLOCATED 0 249*dd52495fSSaurabh Misra #define BFE_RING_ALLOCATED 1 250*dd52495fSSaurabh Misra 251*dd52495fSSaurabh Misra struct bfe; 252*dd52495fSSaurabh Misra 253*dd52495fSSaurabh Misra typedef struct bfe_ring { 254*dd52495fSSaurabh Misra /* Lock for the ring */ 255*dd52495fSSaurabh Misra kmutex_t r_lock; 256*dd52495fSSaurabh Misra 257*dd52495fSSaurabh Misra /* Actual lock pointer. It may point to global lock */ 258*dd52495fSSaurabh Misra kmutex_t *r_lockp; 259*dd52495fSSaurabh Misra 260*dd52495fSSaurabh Misra /* DMA handle for all buffers in descriptor table */ 261*dd52495fSSaurabh Misra bfe_dma_t *r_buf_dma; 262*dd52495fSSaurabh Misra 263*dd52495fSSaurabh Misra /* DMA buffer holding descriptor table */ 264*dd52495fSSaurabh Misra bfe_desc_t *r_desc; 265*dd52495fSSaurabh Misra 266*dd52495fSSaurabh Misra /* DMA handle for the descriptor table */ 267*dd52495fSSaurabh Misra ddi_dma_handle_t r_desc_dma_handle; 268*dd52495fSSaurabh Misra ddi_acc_handle_t r_desc_acc_handle; 269*dd52495fSSaurabh Misra ddi_dma_cookie_t r_desc_cookie; 270*dd52495fSSaurabh Misra uint32_t r_ndesc; /* number of descriptors for the ring */ 271*dd52495fSSaurabh Misra size_t r_desc_len; /* Actual descriptor size */ 272*dd52495fSSaurabh Misra 273*dd52495fSSaurabh Misra /* DMA buffer length */ 274*dd52495fSSaurabh Misra size_t r_buf_len; 275*dd52495fSSaurabh Misra 276*dd52495fSSaurabh Misra /* Flags associated to the ring */ 277*dd52495fSSaurabh Misra int r_flags; 278*dd52495fSSaurabh Misra 279*dd52495fSSaurabh Misra /* Pointer back to bfe instance */ 280*dd52495fSSaurabh Misra struct bfe *r_bfe; 281*dd52495fSSaurabh Misra 282*dd52495fSSaurabh Misra /* Current slot number (or descriptor number) in the ring */ 283*dd52495fSSaurabh Misra uint_t r_curr_desc; 284*dd52495fSSaurabh Misra /* Consumed descriptor if got the interrupt (only used for TX) */ 285*dd52495fSSaurabh Misra uint_t r_cons_desc; 286*dd52495fSSaurabh Misra 287*dd52495fSSaurabh Misra uint_t r_avail_desc; 288*dd52495fSSaurabh Misra } bfe_ring_t; 289*dd52495fSSaurabh Misra 290*dd52495fSSaurabh Misra /* 291*dd52495fSSaurabh Misra * Device driver's private data per instance. 292*dd52495fSSaurabh Misra */ 293*dd52495fSSaurabh Misra typedef struct bfe { 294*dd52495fSSaurabh Misra /* devinfo stuff */ 295*dd52495fSSaurabh Misra dev_info_t *bfe_dip; 296*dd52495fSSaurabh Misra int bfe_unit; 297*dd52495fSSaurabh Misra 298*dd52495fSSaurabh Misra /* PCI Configuration handle */ 299*dd52495fSSaurabh Misra ddi_acc_handle_t bfe_conf_handle; 300*dd52495fSSaurabh Misra 301*dd52495fSSaurabh Misra /* Device registers handle and regset */ 302*dd52495fSSaurabh Misra bfe_acc_t bfe_mem_regset; 303*dd52495fSSaurabh Misra 304*dd52495fSSaurabh Misra /* Ethernet addr */ 305*dd52495fSSaurabh Misra ether_addr_t bfe_ether_addr; 306*dd52495fSSaurabh Misra ether_addr_t bfe_dev_addr; 307*dd52495fSSaurabh Misra 308*dd52495fSSaurabh Misra /* MAC layer handle */ 309*dd52495fSSaurabh Misra mac_handle_t bfe_machdl; 310*dd52495fSSaurabh Misra 311*dd52495fSSaurabh Misra /* Interrupt management */ 312*dd52495fSSaurabh Misra ddi_intr_handle_t bfe_intrhdl; 313*dd52495fSSaurabh Misra uint_t bfe_intrpri; 314*dd52495fSSaurabh Misra 315*dd52495fSSaurabh Misra /* Ring Management */ 316*dd52495fSSaurabh Misra bfe_ring_t bfe_tx_ring; 317*dd52495fSSaurabh Misra bfe_ring_t bfe_rx_ring; 318*dd52495fSSaurabh Misra int bfe_tx_resched; 319*dd52495fSSaurabh Misra 320*dd52495fSSaurabh Misra /* Chip details */ 321*dd52495fSSaurabh Misra bfe_chip_t bfe_chip; 322*dd52495fSSaurabh Misra bfe_stats_t bfe_stats; 323*dd52495fSSaurabh Misra bfe_chip_state_t bfe_chip_state; 324*dd52495fSSaurabh Misra uint_t bfe_chip_mode; 325*dd52495fSSaurabh Misra int32_t bfe_phy_addr; 326*dd52495fSSaurabh Misra uchar_t bfe_chip_action; 327*dd52495fSSaurabh Misra bfe_hw_stats_t bfe_hw_stats; 328*dd52495fSSaurabh Misra 329*dd52495fSSaurabh Misra /* rw lock for chip */ 330*dd52495fSSaurabh Misra krwlock_t bfe_rwlock; 331*dd52495fSSaurabh Misra 332*dd52495fSSaurabh Misra /* Multicast table */ 333*dd52495fSSaurabh Misra uint32_t bfe_mcast_cnt; 334*dd52495fSSaurabh Misra 335*dd52495fSSaurabh Misra /* Timeout and PHY state */ 336*dd52495fSSaurabh Misra ddi_periodic_t bfe_periodic_id; 337*dd52495fSSaurabh Misra hrtime_t bfe_tx_stall_time; 338*dd52495fSSaurabh Misra bfe_phy_state_t bfe_phy_state; 339*dd52495fSSaurabh Misra int bfe_phy_id; 340*dd52495fSSaurabh Misra 341*dd52495fSSaurabh Misra /* MII register set */ 342*dd52495fSSaurabh Misra uint16_t bfe_mii_exp; 343*dd52495fSSaurabh Misra uint16_t bfe_mii_bmsr; 344*dd52495fSSaurabh Misra uint16_t bfe_mii_anar; 345*dd52495fSSaurabh Misra uint16_t bfe_mii_anlpar; 346*dd52495fSSaurabh Misra uint16_t bfe_mii_bmcr; 347*dd52495fSSaurabh Misra 348*dd52495fSSaurabh Misra /* Transceiver fields */ 349*dd52495fSSaurabh Misra uint8_t bfe_adv_aneg; 350*dd52495fSSaurabh Misra uint8_t bfe_adv_100T4; 351*dd52495fSSaurabh Misra uint8_t bfe_adv_100fdx; 352*dd52495fSSaurabh Misra uint8_t bfe_adv_100hdx; 353*dd52495fSSaurabh Misra uint8_t bfe_adv_10fdx; 354*dd52495fSSaurabh Misra uint8_t bfe_adv_10hdx; 355*dd52495fSSaurabh Misra uint8_t bfe_cap_aneg; 356*dd52495fSSaurabh Misra uint8_t bfe_cap_100T4; 357*dd52495fSSaurabh Misra uint8_t bfe_cap_100fdx; 358*dd52495fSSaurabh Misra uint8_t bfe_cap_100hdx; 359*dd52495fSSaurabh Misra uint8_t bfe_cap_10fdx; 360*dd52495fSSaurabh Misra uint8_t bfe_cap_10hdx; 361*dd52495fSSaurabh Misra } bfe_t; 362*dd52495fSSaurabh Misra 363*dd52495fSSaurabh Misra static int bfe_identify_hardware(bfe_t *); 364*dd52495fSSaurabh Misra 365*dd52495fSSaurabh Misra #ifdef __cplusplus 366*dd52495fSSaurabh Misra } 367*dd52495fSSaurabh Misra #endif 368*dd52495fSSaurabh Misra #endif /* _BFE_H */ 369