Annotation of qemu/roms/SLOF/other-licence/bcm/bcm57xx.c, revision 1.1.1.1

1.1       root        1: /******************************************************************************
                      2:  * Copyright (c) 2004, 2008 IBM Corporation
                      3:  * All rights reserved.
                      4:  * This program and the accompanying materials
                      5:  * are made available under the terms of the BSD License
                      6:  * which accompanies this distribution, and is available at
                      7:  * http://www.opensource.org/licenses/bsd-license.php
                      8:  *
                      9:  * Contributors:
                     10:  *     IBM Corporation - initial implementation
                     11:  *****************************************************************************/
                     12: 
                     13: /*
                     14:  *
                     15:  ******************************************************************************
                     16:  * reference:
                     17:  * Broadcom 57xx
                     18:  * Host Programmer Interface Specification for the
                     19:  * NetXtreme Family of Highly-Integrated Media Access Controlers
                     20:  */
                     21: #include "types.h"
                     22: #include "bcm57xx.h"
                     23: 
                     24: 
                     25: /*
                     26:  * local defines
                     27:  ******************************************************************************
                     28:  */
                     29: 
                     30: 
                     31: // #define BCM_VLAN_TAG    ( (u32_t) 0x1 )
                     32: 
                     33: // number of tx/rx rings
                     34: // NOTE: 5714 only uses 1 rx/tx ring, but memory
                     35: // for the other rings is cleaned anyways for
                     36: // sanity & future use
                     37: #define BCM_MAX_TX_RING         16
                     38: #define BCM_MAX_RXRET_RING      16
                     39: #define BCM_MAX_RXPROD_RCB       3
                     40: 
                     41: // bd descriptions
                     42: #define BCM_RXPROD_RING_SIZE     512    // don't change
                     43: #define BCM_RXRET_RING_SIZE     512    // don't change
                     44: #define BCM_TX_RING_SIZE         512    // don't change
                     45: #define BCM_BUF_SIZE            1536    // don't change
                     46: #define BCM_MTU_MAX_LEN         1522
                     47: #define BCM_MAX_RX_BUF            64
                     48: #define BCM_MAX_TX_BUF            16
                     49: 
                     50: // number of MAC addresses in NIC
                     51: #define BCM_NUM_MAC_ADDR          4
                     52: #define BCM_NUM_MAC5704_ADDR     12
                     53: // offset of mac address field(s) in bcm register space
                     54: #define MAC5704_ADDR_OFFS      ( (u16_t) 0x0530 )
                     55: 
                     56: // offset of NIC memory start address from base address
                     57: #define BCM_MEMORY_OFFS         ( (u64_t) 0x8000 )
                     58: 
                     59: // offset of statistics block in NIC memory
                     60: #define BCM_STATISTIC_OFFS     ( (u64_t) 0x0300 )
                     61: // size of statistic block in NIC memory
                     62: #define BCM_STATISTIC_SIZE     0x800
                     63: 
                     64: // offsets of NIC rx/tx rings in NIC memory
                     65: #define BCM_NIC_TX_OFFS                ( (u16_t) 0x4000 )
                     66: #define BCM_NIC_RX_OFFS                ( (u16_t) 0x6000 )
                     67: #define BCM_NIC_TX_SIZE                ( (u16_t) ( ( BCM_TX_RING_SIZE * BCM_RCB_SIZE_u16 ) / 4 ) )
                     68: 
                     69: // device mailboxes
                     70: #define BCM_FW_MBX             ( (u16_t) 0x0b50 )
                     71: #define BCM_FW_MBX_CMD         ( (u16_t) 0x0b78 )
                     72: #define BCM_FW_MBX_LEN         ( (u16_t) 0x0b7c )
                     73: #define BCM_FW_MBX_DATA        ( (u16_t) 0x0b80 )
                     74: #define BCM_NICDRV_STATE_MBX   ( (u16_t) 0x0c04 )
                     75: 
                     76: // device mailbox commands
                     77: #define BCM_NICDRV_ALIVE       ( (u32_t) 0x00000001 )
                     78: #define BCM_NICDRV_PAUSE_FW    ( (u32_t) 0x00000002 )
                     79: 
                     80: // device values
                     81: #define BCM_MAGIC_NUMBER               ( (u32_t) 0x4b657654 )
                     82: 
                     83: // device states
                     84: #define NIC_FWDRV_STATE_START          ( (u32_t) 0x00000001 )
                     85: #define NIC_FWDRV_STATE_START_DONE     ( (u32_t) 0x80000001 )
                     86: #define NIC_FWDRV_STATE_UNLOAD         ( (u32_t) 0x00000002 )
                     87: #define NIC_FWDRV_STATE_UNLOAD_DONE    ( (u32_t) 0x80000002 )
                     88: #define NIC_FWDRV_STATE_SUSPEND        ( (u32_t) 0x00000004 )
                     89: 
                     90: // timer prescaler value
                     91: #define BCM_TMR_PRESCALE        ( (u32_t) 0x41 )
                     92: 
                     93: // offset of transmit rcb's in NIC memory
                     94: #define BCM_TX_RCB_OFFS         ( (u16_t) 0x0100 )
                     95: // offset of receive return rcb's in NIC memory
                     96: #define BCM_RXRET_RCB_OFFS      ( (u16_t) 0x0200 )
                     97: 
                     98: // register offsets for ring indices
                     99: #define TX_PROD_IND             ( (u16_t) 0x0304 )
                    100: #define TX_CONS_IND             ( (u16_t) 0x3cc0 )
                    101: #define RXPROD_PROD_IND         ( (u16_t) 0x026c )
                    102: #define RXPROD_CONS_IND         ( (u16_t) 0x3c54 )
                    103: #define RXRET_PROD_IND          ( (u16_t) 0x3c80 )
                    104: #define RXRET_CONS_IND          ( (u16_t) 0x0284 )
                    105: // NIC producer index only needed for initialization
                    106: #define TX_NIC_PROD_IND         ( (u16_t) 0x0384 )
                    107: 
                    108: /*
                    109:  * predefined register values used during initialization
                    110:  * may be adapted by user
                    111:  */
                    112: #define DMA_RW_CTRL_VAL_5714    ( (u32_t) 0x76144000 )
                    113: #define DMA_RW_CTRL_VAL         ( (u32_t) 0x760F0000 )
                    114: #define TX_MAC_LEN_VAL          ( (u32_t) 0x00002620 )
                    115: 
                    116: #define RX_LST_PLC_CFG_VAL      ( (u32_t) 0x00000109 )
                    117: #define RX_LST_PLC_STAT_EN_VAL  ( (u32_t) 0x007e000f )
                    118: #define NVM_ADDR_MSK            ( (u32_t) 0x000fffff )
                    119: 
                    120: // Number of Receive Rules /w or /wo SOL enabled
                    121: #define RX_RULE_CFG_VAL                ( (u32_t) 0x00000008 )
                    122: #define NUM_RX_RULE            ( (u32_t) 16 )
                    123: #define NUM_RX_RULE_ASF                ( (u32_t) ( NUM_RX_RULE - 4 ) )
                    124: 
                    125: // RCB register offsets
                    126: #define BCM_RXPROD_RCB_JUM      ( (u16_t) 0x2440 )
                    127: #define BCM_RXPROD_RCB_STD      ( (u16_t) 0x2450 )
                    128: #define BCM_RXPROD_RCB_MIN      ( (u16_t) 0x2460 )
                    129: 
                    130: // macros needed for new addressing method
                    131: #define BCM_RCB_HOSTADDR_HI_u16( rcb ) ( (u16_t) rcb + 0x00 )
                    132: #define BCM_RCB_HOSTADDR_LOW_u16( rcb ) ( (u16_t) rcb + 0x04 )
                    133: #define BCM_RCB_LENFLAG_u16( rcb )      ( (u16_t) rcb + 0x08 )
                    134: #define BCM_RCB_NICADDR_u16( rcb )      ( (u16_t) rcb + 0x0c )
                    135: #define BCM_RCB_SIZE_u16               ( (u16_t) 0x0010 )
                    136: 
                    137: // RCB flags
                    138: #define RCB_FLAG_RING_DISABLED  BIT32( 1 )
                    139: 
                    140: // BCM device ID masks
                    141: #define BCM_DEV_5714   ( (u64_t) 0x1 )
                    142: #define BCM_DEV_5704   ( (u64_t) 0x2 )
                    143: #define BCM_DEV_5703   ( (u64_t) 0x4 )
                    144: #define BCM_DEV_SERDES ( (u64_t) 0x80000000 )
                    145: #define BCM_DEV_COPPER ( (u64_t) 0x40000000 )
                    146: 
                    147: #define IS_5714        ( ( bcm_device_u64 & BCM_DEV_5714 ) != 0 )
                    148: #define IS_5704        ( ( bcm_device_u64 & BCM_DEV_5704 ) != 0 )
                    149: #define IS_5703        ( ( bcm_device_u64 & BCM_DEV_5703 ) != 0 )
                    150: #define IS_SERDES      ( ( bcm_device_u64 & BCM_DEV_SERDES ) != 0 )
                    151: #define IS_COPPER_PHY  ( ( bcm_device_u64 & BCM_DEV_COPPER ) != 0 )
                    152: 
                    153: #define BUFFERED_FLASH_PAGE_POS                9
                    154: #define BUFFERED_FLASH_BYTE_ADDR_MASK  ((<<BUFFERED_FLASH_PAGE_POS) - 1)
                    155: #define BUFFERED_FLASH_PAGE_SIZE       264
                    156: #define BUFFERED_FLASH_PHY_SIZE                512
                    157: #define MANUFACTURING_INFO_SIZE                140
                    158: #define CRC32_POLYNOMIAL               0xEDB88320
                    159: 
                    160: /*
                    161:  * local types
                    162:  ******************************************************************************
                    163:  */
                    164: typedef struct {
                    165:        u32_t m_dev_u32;
                    166:        u64_t m_devmsk_u64;
                    167: }      bcm_dev_t;
                    168: 
                    169: /*
                    170:  * BCM common data structures
                    171:  * BCM57xx Programmer's Guide: Section 5
                    172:  */
                    173: 
                    174: /*
                    175:  * 64bit host address in a way the NIC is able to understand it
                    176:  */
                    177: typedef struct {
                    178:        u32_t m_hi_u32;
                    179:        u32_t m_lo_u32;
                    180: }      bcm_addr64_t;
                    181: /*
                    182:  * ring control block
                    183:  */
                    184: typedef struct {
                    185:        bcm_addr64_t m_hostaddr_st;
                    186:        u32_t        m_lenflags_u32;    // upper 16b: len, lower 16b: flags
                    187:        u32_t        m_nicaddr_u32;
                    188: }      bcm_rcb_t;
                    189: 
                    190: /*
                    191:  * tx buffer descriptor
                    192:  */
                    193: typedef struct {
                    194:        bcm_addr64_t m_hostaddr_st;
                    195:        u32_t        m_lenflags_u32;    // upper 16b: len, lower 16b: flags
                    196:        u32_t        m_VLANtag_u32;     // lower 16b: vtag
                    197: }       bcm_txbd_t;
                    198: 
                    199: /*
                    200:  * rx buffer descriptor
                    201:  */
                    202: typedef struct {
                    203:        bcm_addr64_t m_hostaddr_st;
                    204:        u32_t        m_idxlen_u32;      // upper 16b: idx, lower 16b: len
                    205:        u32_t        m_typeflags_u32;   // upper 16b: type, lower 16b: flags
                    206:        u32_t        m_chksum_u32;      // upper 16b: ip, lower 16b: tcp/udp
                    207:        u32_t        m_errvlan_u32;     // upper 16b: err, lower 16b: vlan tag
                    208:        u32_t        m_reserved_u32;
                    209:        u32_t        m_opaque_u32;
                    210: }      bcm_rxbd_t;
                    211: 
                    212: /*
                    213:  * bcm status block
                    214:  * NOTE: in fact the status block is not used and configured
                    215:  * so that it is not updated by the NIC. Still it has to be
                    216:  * set up so the NIC is satisfied
                    217:  */
                    218: typedef struct {
                    219:        u32_t   m_st_word_u32;
                    220:        u32_t   m_st_tag_u32;
                    221:        u16_t   m_rxprod_cons_u16;
                    222:        u16_t   m_unused_u16;
                    223:        u32_t   m_unused_u32;
                    224:        u16_t   m_tx_cons_u16;
                    225:        u16_t   m_rxret_prod_u16;
                    226: }      bcm_status_t;
                    227: 
                    228: /*
                    229:  * local constants
                    230:  ******************************************************************************
                    231:  */
                    232: static const bcm_dev_t bcm_dev[] = {
                    233:        { 0x166b, BCM_DEV_5714                  },
                    234:        { 0x1668, BCM_DEV_5714                  },
                    235:        { 0x1669, BCM_DEV_5714                  },
                    236:        { 0x166a, BCM_DEV_5714                  },
                    237:        { 0x1648, BCM_DEV_5704                  },
                    238:        { 0x1649, BCM_DEV_5704 | BCM_DEV_SERDES },
                    239:        { 0x16a8, BCM_DEV_5704 | BCM_DEV_SERDES },
                    240:        { 0x16a7, BCM_DEV_5703 | BCM_DEV_SERDES },
                    241:        { 0x16c7, BCM_DEV_5703 | BCM_DEV_SERDES },
                    242:        { 0     , 0                             }
                    243: };
                    244: 
                    245: /*
                    246:  * local variables
                    247:  ******************************************************************************
                    248:  */
                    249: static u64_t       bcm_device_u64;
                    250: static u32_t       bcm_rxret_ring_sz;
                    251: static u64_t       bcm_baseaddr_u64;
                    252: static u64_t       bcm_memaddr_u64;
                    253: 
                    254: /*
                    255:  * rings & their buffers
                    256:  */
                    257: // the rings made of buffer descriptors
                    258: static bcm_txbd_t  bcm_tx_ring[BCM_TX_RING_SIZE];
                    259: static bcm_rxbd_t  bcm_rxprod_ring[BCM_RXPROD_RING_SIZE];
                    260: static bcm_rxbd_t  bcm_rxret_ring[BCM_RXRET_RING_SIZE*2];
                    261: 
                    262: // the buffers used in the rings
                    263: static u08_t       bcm_tx_buffer_pu08[BCM_MAX_TX_BUF][BCM_BUF_SIZE];
                    264: static u08_t       bcm_rx_buffer_pu08[BCM_MAX_RX_BUF][BCM_BUF_SIZE];
                    265: 
                    266: // tx ring index of first/last bd
                    267: static u32_t       bcm_tx_start_u32;
                    268: static u32_t       bcm_tx_stop_u32;
                    269: static u32_t       bcm_tx_bufavail_u32;
                    270: 
                    271: // PCI device location needed for indirect addressing
                    272: static u64_t       bcm_pcicfg_puid;
                    273: static u08_t       bcm_pcicfg_bus;
                    274: static u08_t       bcm_pcicfg_devfn;
                    275: 
                    276: /*
                    277:  * status block
                    278:  */
                    279: static bcm_status_t bcm_status;
                    280: 
                    281: /*
                    282:  * snk module interface
                    283:  ******************************************************************************
                    284:  */
                    285: static int bcm_init   ( void );
                    286: static int bcm_term   ( void );
                    287: static int bcm_xmit   ( char *f_buffer_pc, int f_len_i );
                    288: static int bcm_receive( char *f_buffer_pc, int f_len_i );
                    289: static int bcm_ioctl  ( int request, void* data );
                    290: 
                    291: snk_module_t snk_module_interface = {
                    292:        .version = 1,
                    293:        .type    = MOD_TYPE_NETWORK,
                    294:        .running = 0,
                    295:        .init    = bcm_init,
                    296:        .term    = bcm_term,
                    297:        .write   = bcm_xmit,
                    298:        .read    = bcm_receive,
                    299:        .ioctl   = bcm_ioctl
                    300: };
                    301: 
                    302: /*
                    303:  * implementation
                    304:  ******************************************************************************
                    305:  */
                    306: 
                    307: 
                    308: /*
                    309:  * global functions
                    310:  ******************************************************************************
                    311:  */
                    312: int
                    313: check_driver( pci_config_t *pci_conf );
                    314: 
                    315: 
                    316: /*
                    317:  * local helper functions
                    318:  ******************************************************************************
                    319:  */
                    320: static char *
                    321: memcpy( char *dest, const char *src, size_t n )
                    322: {
                    323:         char *ret = dest;
                    324:         while( n-- ) {
                    325:                 *dest++ = *src++;
                    326:         }
                    327: 
                    328:         return( ret );
                    329: }
                    330: 
                    331: static char *
                    332: memset_ci( char *dest, int c, size_t n )
                    333: {
                    334:         char *ret = dest;
                    335:         
                    336:         while( n-- ) {
                    337:                 wr08( dest, c );
                    338:                dest++;
                    339:         }
                    340: 
                    341:         return( ret );
                    342: }
                    343: 
                    344: static char *
                    345: memset( char *dest, int c, size_t n )
                    346: {
                    347:         char *ret = dest;
                    348:         while( n-- ) {
                    349:                 *dest++ = (char) c;
                    350:         }
                    351: 
                    352:         return( ret );
                    353: }
                    354: 
                    355: static u32_t
                    356: bcm_nvram_logical_to_physical_address(u32_t address)
                    357: {
                    358:        u32_t page_no   = address / BUFFERED_FLASH_PAGE_SIZE;
                    359:        u32_t page_addr = address % BUFFERED_FLASH_PAGE_SIZE;
                    360: 
                    361:        return (page_no << BUFFERED_FLASH_PAGE_POS) + page_addr;
                    362: }
                    363: 
                    364: 
                    365: /*
                    366:  * local inline functions for endian swapping
                    367:  ******************************************************************************
                    368:  */
                    369: 
                    370: static u16_t
                    371: bswap_16 (u16_t x) {
                    372:        return ((x&0xff00) >> 8)
                    373:             | ((x&0x00ff) << 8);
                    374: }
                    375: 
                    376: u32_t
                    377: static bswap_32 (u32_t x) {
                    378:        return bswap_16((x&0xffff0000) >> 16)
                    379:             | (bswap_16(x&0x0000ffff) << 16);
                    380: }
                    381: 
                    382: /*
                    383:  * read/write functions to access NIC registers & memory
                    384:  * NOTE: all functions are executed with cache inhibitation (dead slow :-) )
                    385:  */
                    386: static u32_t
                    387: bcm_read_mem32( u16_t f_offs_u16 )
                    388: {       // caution: shall only be used after initialization!
                    389:        return rd32( bcm_memaddr_u64 + (u64_t) f_offs_u16 );
                    390: }
                    391: 
                    392: /* not used so far
                    393: static u16_t
                    394: bcm_read_mem16( u16_t f_offs_u16 )
                    395: {       // caution: shall only be used after initialization!
                    396:        return rd16( bcm_memaddr_u64 + (u64_t) f_offs_u16 );
                    397: }*/
                    398: /* not used so far
                    399: static u08_t
                    400: bcm_read_mem08( u16_t f_offs_u16 )
                    401: {       // caution: shall only be used after initialization!
                    402:        return rd08( bcm_memaddr_u64 + (u64_t) f_offs_u16 );
                    403: }*/
                    404: 
                    405: static u32_t
                    406: bcm_read_reg32_indirect( u16_t f_offs_u16 )
                    407: {       // caution: shall only be used after initialization!
                    408:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                    409:                                                4,
                    410:                                                bcm_pcicfg_bus,
                    411:                                                bcm_pcicfg_devfn,
                    412:                                                REG_BASE_ADDR_REG,
                    413:                                                f_offs_u16 );
                    414:        return (u32_t) bswap_32( snk_kernel_interface->pci_config_read( bcm_pcicfg_puid,
                    415:                                                                        4,
                    416:                                                                        bcm_pcicfg_bus,
                    417:                                                                        bcm_pcicfg_devfn,
                    418:                                                                        REG_DATA_REG ) ) ;
                    419: }
                    420: 
                    421: static u32_t
                    422: bcm_read_reg32( u16_t f_offs_u16 )
                    423: {       // caution: shall only be used after initialization!
                    424:        if(f_offs_u16 >= 0x200 && f_offs_u16 <0x400)
                    425:                return bcm_read_reg32_indirect( f_offs_u16 + 0x5600 );
                    426:        return rd32( bcm_baseaddr_u64 + (u64_t) f_offs_u16 );
                    427: }
                    428: 
                    429: static u16_t
                    430: bcm_read_reg16( u16_t f_offs_u16 )
                    431: {       // caution: shall only be used after initialization!
                    432:        return rd16( bcm_baseaddr_u64 + (u64_t) f_offs_u16 );
                    433: }
                    434: /* not used so far
                    435: static u08_t
                    436: bcm_read_reg08( u16_t f_offs_u16 )
                    437: {       // caution: shall only be used after initialization!
                    438:        return rd08( bcm_baseaddr_u64 + (u64_t) f_offs_u16 );
                    439: }*/
                    440: 
                    441: static void
                    442: bcm_write_mem32_indirect( u16_t f_offs_u16, u32_t f_val_u32 )
                    443: {       // caution: shall only be used after initialization!
                    444:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                    445:                                                4,
                    446:                                                bcm_pcicfg_bus,
                    447:                                                bcm_pcicfg_devfn,
                    448:                                                MEM_BASE_ADDR_REG,
                    449:                                                f_offs_u16 );
                    450:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                    451:                                                4,
                    452:                                                bcm_pcicfg_bus,
                    453:                                                bcm_pcicfg_devfn,
                    454:                                                MEM_DATA_REG,
                    455:                                                bswap_32 ( f_val_u32 ) );
                    456: }
                    457: 
                    458: static void
                    459: bcm_write_mem32( u16_t f_offs_u16, u32_t f_val_u32 )
                    460: {       // caution: shall only be used after initialization!
                    461:        if(f_offs_u16 >= BCM_RXRET_RCB_OFFS &&
                    462:            f_offs_u16 < BCM_RXRET_RCB_OFFS + (BCM_MAX_RXRET_RING*BCM_RCB_SIZE_u16))
                    463:                bcm_write_mem32_indirect( f_offs_u16, f_val_u32 );
                    464:        else if(f_offs_u16 >= BCM_TX_RCB_OFFS &&
                    465:            f_offs_u16 < BCM_TX_RCB_OFFS + (BCM_MAX_TX_RING*BCM_RCB_SIZE_u16))
                    466:                bcm_write_mem32_indirect( f_offs_u16, f_val_u32 );
                    467:        else
                    468:                wr32( bcm_memaddr_u64 + (u64_t) f_offs_u16, f_val_u32 );
                    469: }
                    470: /* not used so far
                    471: static void
                    472: bcm_write_mem16( u16_t f_offs_u16, u16_t f_val_u16 )
                    473: {       // caution: shall only be used after initialization!
                    474:        wr16( bcm_memaddr_u64 + (u64_t) f_offs_u16, f_val_u16 );
                    475: }*/
                    476: /* not used so far
                    477: static void
                    478: bcm_write_mem08( u16_t f_offs_u16, u08_t f_val_u08 )
                    479: {       // caution: shall only be used after initialization!
                    480:        wr08( bcm_memaddr_u64 + (u64_t) f_offs_u16, f_val_u08 );
                    481: }*/
                    482: 
                    483: static void
                    484: bcm_write_reg32_indirect( u16_t f_offs_u16, u32_t f_val_u32 )
                    485: {       // caution: shall only be used after initialization!
                    486:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                    487:                                                4,
                    488:                                                bcm_pcicfg_bus,
                    489:                                                bcm_pcicfg_devfn,
                    490:                                                REG_BASE_ADDR_REG,
                    491:                                                f_offs_u16 );
                    492:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                    493:                                                4,
                    494:                                                bcm_pcicfg_bus,
                    495:                                                bcm_pcicfg_devfn,
                    496:                                                REG_DATA_REG,
                    497:                                                bswap_32 ( f_val_u32 ) );
                    498: }
                    499: 
                    500: static void
                    501: bcm_write_reg32( u16_t f_offs_u16, u32_t f_val_u32 )
                    502: {       // caution: shall only be used after initialization!
                    503:        if(f_offs_u16 >= 0x200 && f_offs_u16 <0x400)
                    504:                bcm_write_reg32_indirect( f_offs_u16 + 0x5600, f_val_u32 );
                    505:        else
                    506:                wr32( bcm_baseaddr_u64 + (u64_t) f_offs_u16, f_val_u32 );
                    507: }
                    508: 
                    509: static void
                    510: bcm_write_reg16( u16_t f_offs_u16, u16_t f_val_u16 )
                    511: {       // caution: shall only be used after initialization!
                    512:        wr16( bcm_baseaddr_u64 + (u64_t) f_offs_u16, f_val_u16 );
                    513: }
                    514: /* not used so far
                    515: static void
                    516: bcm_write_reg08( u16_t f_offs_u16, u08_t f_val_u08 )
                    517: {       // caution: shall only be used after initialization!
                    518:         wr08( bcm_baseaddr_u64 + (u64_t) f_offs_u16, f_val_u08 );
                    519: }*/
                    520: 
                    521: static void
                    522: bcm_setb_reg32( u16_t f_offs_u16, u32_t f_mask_u32 )
                    523: {
                    524:        u32_t v;
                    525: 
                    526:        v  = bcm_read_reg32( f_offs_u16 );
                    527:        v |= f_mask_u32;
                    528:        bcm_write_reg32( f_offs_u16, v );
                    529: }
                    530: /* not used so far
                    531: static void
                    532: bcm_setb_reg16( u16_t f_offs_u16, u16_t f_mask_u16 )
                    533: {
                    534:        u16_t v;
                    535:        v  = rd16( bcm_baseaddr_u64 + (u64_t) f_offs_u16 );
                    536:         v |= f_mask_u16;
                    537:        wr16( bcm_baseaddr_u64 + (u64_t) f_offs_u16, v );
                    538: }*/
                    539: /* not used so far
                    540: static void
                    541: bcm_setb_reg08( u16_t f_offs_u16, u08_t f_mask_u08 )
                    542: {
                    543:        u08_t v;
                    544:        v  = rd08( bcm_baseaddr_u64 + (u64_t) f_offs_u16 );
                    545:         v |= f_mask_u08;
                    546:        wr08( bcm_baseaddr_u64 + (u64_t) f_offs_u16, v );
                    547: }*/
                    548: 
                    549: static void
                    550: bcm_clrb_reg32( u16_t f_offs_u16, u32_t f_mask_u32 )
                    551: {
                    552:        u32_t v;
                    553: 
                    554:        v  = bcm_read_reg32( f_offs_u16 );
                    555:        v &= ~f_mask_u32;
                    556:        bcm_write_reg32( f_offs_u16, v );
                    557: }
                    558: 
                    559: static void
                    560: bcm_clrb_reg16( u16_t f_offs_u16, u16_t f_mask_u16 )
                    561: {
                    562:        u16_t v;
                    563: 
                    564:        v  = bcm_read_reg16( f_offs_u16 );
                    565:        v &= ~f_mask_u16;
                    566:        bcm_write_reg16( f_offs_u16, v );
                    567: }
                    568: /* not used so far
                    569: static void
                    570: bcm_clrb_reg08( u16_t f_offs_u16, u08_t f_mask_u08 )
                    571: {
                    572:        u08_t v;
                    573:        v  = rd08( bcm_baseaddr_u64 + (u64_t) f_offs_u16 );
                    574:         v &= ~f_mask_u32;
                    575:        wr08( bcm_baseaddr_u64 + (u64_t) f_offs_u16, v );
                    576: }*/
                    577: 
                    578: static void
                    579: bcm_clr_wait_bit32( u16_t r, u32_t b )
                    580: {
                    581:        u32_t i;
                    582: 
                    583:        bcm_clrb_reg32( r, b );
                    584: 
                    585:        i = 1000;
                    586:        while( --i ) {
                    587: 
                    588:                if( ( bcm_read_reg32( r ) & b ) == 0 ) {
                    589:                        break;
                    590:                }
                    591: 
                    592:                us_delay( 10 );
                    593:        }
                    594: #ifdef BCM_DEBUG
                    595:        if( ( bcm_read_reg32( r ) & b ) != 0 ) {
                    596:                printk( "bcm57xx: bcm_clear_wait_bit32 failed (0x%04X)!\n", r );
                    597:        }
                    598: #endif
                    599: }
                    600: 
                    601: /*
                    602:  * (g)mii bus access
                    603:  */
                    604: #if 0
                    605: // not used so far
                    606: static i32_t
                    607: bcm_mii_write16( u32_t f_reg_u32, u16_t f_value_u16 )
                    608: {
                    609:        static const u32_t WR_VAL = ( ( ((u32_t) 0x1) << 21 ) | BIT32( 29 ) | BIT32( 26 ) );
                    610:        i32_t              l_autopoll_i32 = 0;
                    611:        u32_t              l_wrval_u32;
                    612:        u32_t              i;
                    613: 
                    614:        /*
                    615:         * only 0x00-0x1f are valid registers
                    616:         */
                    617:        if( f_reg_u32 > (u32_t) 0x1f ) {
                    618:                return -1;
                    619:        }
                    620: 
                    621:        /*
                    622:         * disable auto polling if enabled
                    623:         */
                    624:        if( ( bcm_read_reg32( MI_MODE_R ) & BIT32( 4 ) ) != 0 ) {
                    625:                l_autopoll_i32 = (i32_t) !0;
                    626:                bcm_clrb_reg32( MI_MODE_R, BIT32( 4 ) );
                    627:                us_delay( 40 );
                    628:        }
                    629: 
                    630:        /*
                    631:         * construct & write mi com register value
                    632:         */
                    633:        l_wrval_u32 = ( WR_VAL | ( f_reg_u32 << 16 ) | (u32_t) f_value_u16 );
                    634:        bcm_write_reg32( MI_COM_R, l_wrval_u32 );
                    635: 
                    636:        /*
                    637:         * wait for transaction to complete
                    638:         */
                    639:        i = 25;
                    640:        while( ( --i ) &&
                    641:               ( ( bcm_read_reg32( MI_COM_R ) & BIT32( 29 ) ) != 0 ) ) {
                    642:                us_delay( 10 );
                    643:        }
                    644: 
                    645:        /*
                    646:         * re-enable auto polling if necessary
                    647:         */
                    648:        if( l_autopoll_i32 ) {
                    649:                bcm_setb_reg32( MI_MODE_R, BIT32( 4 ) );
                    650:        }
                    651: 
                    652:        // return on error
                    653:        if( i == 0 ) {
                    654:                return -1;
                    655:        }
                    656: 
                    657:        return 0;
                    658: }
                    659: #endif
                    660: 
                    661: static i32_t
                    662: bcm_mii_read16( u32_t f_reg_u32, u16_t *f_value_pu16 )
                    663: {
                    664:        static const u32_t RD_VAL = ( ( ((u32_t) 0x1) << 21 ) | BIT32( 29 ) | BIT32( 27 ) );
                    665:        i32_t l_autopoll_i32 = 0;
                    666:        u32_t l_rdval_u32;
                    667:        u32_t i;
                    668:        u16_t first_not_busy;
                    669: 
                    670:        /*
                    671:         * only 0x00-0x1f are valid registers
                    672:         */
                    673:        if( f_reg_u32 > (u32_t) 0x1f ) {
                    674:                return -1;
                    675:        }
                    676: 
                    677:        /*
                    678:         * disable auto polling if enabled
                    679:         */
                    680:        if( ( bcm_read_reg32( MI_MODE_R ) & BIT32( 4 ) ) != 0 ) {
                    681:                l_autopoll_i32 = ( i32_t ) !0;
                    682:                bcm_clrb_reg32( MI_MODE_R, BIT32( 4 ) );
                    683:                us_delay( 40 );
                    684:        }
                    685: 
                    686:        /*
                    687:         * construct & write mi com register value
                    688:         */
                    689:        l_rdval_u32 = ( RD_VAL | ( f_reg_u32 << 16 ) );
                    690:        bcm_write_reg32( MI_COM_R, l_rdval_u32 );
                    691: 
                    692:        /*
                    693:         * wait for transaction to complete
                    694:         * ERRATA workaround: must read two "not busy" states to indicate transaction complete
                    695:         */
                    696:        i = 25;
                    697:        first_not_busy = 0;
                    698:        l_rdval_u32 = bcm_read_reg32( MI_COM_R );
                    699:        while( ( --i ) &&
                    700:               ( (first_not_busy == 0) || ( ( l_rdval_u32 & BIT32( 29 ) ) != 0 ) ) ) {
                    701:                 /* Is this the first clear BUSY state? */
                    702:                if ( ( l_rdval_u32 & BIT32( 29 ) ) == 0 )
                    703:                        first_not_busy++;
                    704:                us_delay( 10 );
                    705:                l_rdval_u32 = bcm_read_reg32( MI_COM_R );
                    706:        }
                    707: 
                    708:        /*
                    709:         * re-enable autopolling if necessary
                    710:         */
                    711:        if( l_autopoll_i32 ) {
                    712:                bcm_setb_reg32( MI_MODE_R, BIT32( 4 ) );
                    713:        }
                    714: 
                    715:        /*
                    716:         * return on read transaction error
                    717:         * (check read failed bit)
                    718:         */
                    719:        if( ( i == 0 ) ||
                    720:            ( ( l_rdval_u32 & BIT32( 28 ) ) != 0 ) ) {
                    721:                return -1;
                    722:        }
                    723: 
                    724:        /*
                    725:         * return read value
                    726:         */
                    727:        *f_value_pu16 = (u16_t) ( l_rdval_u32 & (u32_t) 0xffff );
                    728: 
                    729:        return 0;
                    730: }
                    731: 
                    732: /*
                    733:  * ht2000 dump (not complete)
                    734:  */
                    735: #if 0
                    736: static void
                    737: bcm_dump( void )
                    738: {
                    739:        u32_t i, j;
                    740: 
                    741:        printk( "*** DUMP ***********************************************************************\n\n" );
                    742: 
                    743:        printk( "* PCI Configuration Registers:\n" );
                    744:        for( i = 0, j = 0; i < 0x40; i += 4 ) {
                    745: 
                    746:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    747: 
                    748:                if( ( ++j & 0x3 ) == 0 ) {
                    749:                        printk( "\n" );
                    750:                }
                    751: 
                    752:        }
                    753: 
                    754:        printk( "\n* Private PCI Configuration Registers:\n" );
                    755:        for( i = 0x68, j = 0; i < 0x88; i += 4 ) {
                    756: 
                    757:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    758: 
                    759:                if( ( ++j & 0x3 ) == 0 ) {
                    760:                        printk( "\n" );
                    761:                }
                    762: 
                    763:        }
                    764: 
                    765:        printk( "\n* VPD Config:\n" );
                    766:        printk( "%04X: %08X  \n", 0x94, bcm_read_reg32( 0x94 ) );
                    767: 
                    768:        printk( "\n* Dual MAC Control Registers:\n" );
                    769:        for( i = 0xb8, j = 0; i < 0xd0; i += 4 ) {
                    770: 
                    771:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    772: 
                    773:                if( ( ++j & 0x3 ) == 0 ) {
                    774:                        printk( "\n" );
                    775:                }
                    776: 
                    777:        }
                    778: 
                    779:        printk( "\n* Ethernet MAC Control Registers:\n" );
                    780:        for( i = 0x400, j = 0; i < 0x590; i += 4 ) {
                    781: 
                    782:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    783: 
                    784:                if( ( ++j & 0x3 ) == 0 ) {
                    785:                        printk( "\n" );
                    786:                }
                    787: 
                    788:        }
                    789: 
                    790:        printk( "\n* Send Data Initiator Control:\n" );
                    791:        for( i = 0xc00, j = 0; i < 0xc10; i += 4 ) {
                    792: 
                    793:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    794: 
                    795:                if( ( ++j & 0x3 ) == 0 ) {
                    796:                        printk( "\n" );
                    797:                }
                    798: 
                    799:        }
                    800: 
                    801:        printk( "\n* Send Data Completion Control:\n" );
                    802:        printk( "%04X: %08X  ", 0x1000, bcm_read_reg32( 0x1000 ) );
                    803:        printk( "%04X: %08X  \n", 0x1008, bcm_read_reg32( 0x1008 ) );
                    804:        
                    805:        printk( "\n* Send BD Ring Selector Control:\n" );
                    806:        printk( "%04X: %08X  ", 0x1400, bcm_read_reg32( 0x1400 ) );
                    807:        printk( "%04X: %08X  ", 0x1404, bcm_read_reg32( 0x1404 ) );
                    808:        printk( "%04X: %08X  \n", 0x1408, bcm_read_reg32( 0x1408 ) );
                    809: 
                    810:        printk( "\n* Send BD Initiator Control:\n" );
                    811:        printk( "%04X: %08X  ", 0x1800, bcm_read_reg32( 0x1800 ) );
                    812:        printk( "%04X: %08X  \n", 0x1804, bcm_read_reg32( 0x1804 ) );
                    813: 
                    814:        printk( "\n* Send BD Completion Control:\n" );
                    815:        printk( "%04X: %08X  ", 0x1c00, bcm_read_reg32( 0x1c00 ) );
                    816: 
                    817:        printk( "\n* Receive List Placement Control:\n" );
                    818:        for( i = 0x2000, j = 0; i < 0x2020; i += 4 ) {
                    819: 
                    820:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    821: 
                    822:                if( ( ++j & 0x3 ) == 0 ) {
                    823:                        printk( "\n" );
                    824:                }
                    825: 
                    826:        }
                    827: 
                    828:        printk( "\n* Receive Data & Receive BD Initiator Control:\n" );
                    829:        printk( "%04X: %08X  ", 0x2400, bcm_read_reg32( 0x2400 ) );
                    830:        printk( "%04X: %08X  \n", 0x2404, bcm_read_reg32( 0x2404 ) );
                    831: 
                    832:        printk( "\n* Jumbo Receive BD Ring RCB:\n" );
                    833:        for( i = 0x2440, j = 0; i < 0x2450; i += 4 ) {
                    834: 
                    835:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    836: 
                    837:                if( ( ++j & 0x3 ) == 0 ) {
                    838:                        printk( "\n" );
                    839:                }
                    840: 
                    841:        }
                    842: 
                    843:        printk( "\n* Standard Receive BD Ring RCB:\n" );
                    844:        for( i = 0x2450, j = 0; i < 0x2460; i += 4 ) {
                    845: 
                    846:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    847: 
                    848:                if( ( ++j & 0x3 ) == 0 ) {
                    849:                        printk( "\n" );
                    850:                }
                    851: 
                    852:        }
                    853: 
                    854:        printk( "\n* Mini Receive BD Ring RCB:\n" );
                    855:        for( i = 0x2460, j = 0; i < 0x2470; i += 4 ) {
                    856: 
                    857:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    858: 
                    859:                if( ( ++j & 0x3 ) == 0 ) {
                    860:                        printk( "\n" );
                    861:                }
                    862: 
                    863:        }
                    864: 
                    865:        printk( "\nRDI Timer Mode Register:\n" );
                    866:        printk( "%04X: %08X  \n", 0x24f0, bcm_read_reg32( 0x24f0 ) );
                    867: 
                    868:        printk( "\n* Receive BD Initiator Control:\n" );
                    869:        for( i = 0x2c00, j = 0; i < 0x2c20; i += 4 ) {
                    870: 
                    871:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    872: 
                    873:                if( ( ++j & 0x3 ) == 0 ) {
                    874:                        printk( "\n" );
                    875:                }
                    876: 
                    877:        }
                    878: 
                    879:        printk( "\n* Receive BD Completion Control:\n" );
                    880:        for( i = 0x3000, j = 0; i < 0x3014; i += 4 ) {
                    881: 
                    882:                printk( "%04X: %08X  ", i, bcm_read_reg32( i ) );
                    883: 
                    884:                if( ( ++j & 0x3 ) == 0 ) {
                    885:                        printk( "\n" );
                    886:                }
                    887: 
                    888:        }
                    889: }
                    890: #endif
                    891: 
                    892: 
                    893: 
                    894: /*
                    895:  * NVRAM access
                    896:  */
                    897: 
                    898: static int
                    899: bcm_nvram_lock( void )
                    900: {
                    901:        int i;
                    902: 
                    903:        /*
                    904:         * Acquire NVRam lock (REQ0) & wait for arbitration won (ARB0_WON)
                    905:         */
                    906: //     bcm_setb_reg32( SW_ARB_R, BIT32( 0 ) );
                    907:        bcm_setb_reg32( SW_ARB_R, BIT32( 1 ) );
                    908: 
                    909:        i = 2000;
                    910:        while( ( --i ) && 
                    911: //            ( bcm_read_reg32( SW_ARB_R ) & BIT32( 8 ) ) == 0 ) {
                    912:               ( bcm_read_reg32( SW_ARB_R ) & BIT32( 9 ) ) == 0 ) {
                    913:                ms_delay( 1 );
                    914:        }
                    915: 
                    916:        // return on error
                    917:        if( i == 0 ) {
                    918: #ifdef BCM_DEBUG
                    919:                printk("bcm57xx: failed to lock nvram");
                    920: #endif
                    921:                return -1;
                    922:        }
                    923: 
                    924:        return 0;
                    925: }
                    926: 
                    927: static void
                    928: bcm_nvram_unlock( void )
                    929: {
                    930:        /*
                    931:         * release NVRam lock (CLR0)
                    932:         */
                    933: //     bcm_setb_reg32( SW_ARB_R, BIT32( 4 ) );
                    934:        bcm_setb_reg32( SW_ARB_R, BIT32( 5 ) );
                    935: }
                    936: 
                    937: static void
                    938: bcm_nvram_init( void )
                    939: {
                    940:        /*
                    941:         * enable access to NVRAM registers
                    942:         */
                    943:        if(IS_5714) {
                    944:                bcm_setb_reg32( NVM_ACC_R, BIT32( 1 ) | BIT32( 0 ) );
                    945:        }
                    946: 
                    947:        /*
                    948:         * disable bit-bang method 19& disable interface bypass
                    949:         */
                    950:        bcm_clrb_reg32( NVM_CFG1_R, BIT32( 31 ) | BIT32( 3 ) | BIT32( 2 ) | BIT32( 14 ) | BIT32( 16 ) );
                    951:        bcm_setb_reg32( NVM_CFG1_R, BIT32 ( 13 ) | BIT32 ( 17 ));
                    952: 
                    953:        /*
                    954:         * enable Auto SEEPROM Access
                    955:         */
                    956:        bcm_setb_reg32( MISC_LOCAL_CTRL_R, BIT32 ( 24 ) );
                    957: 
                    958:        /*
                    959:         * NVRAM write enable
                    960:         */
                    961:        bcm_setb_reg32( MODE_CTRL_R, BIT32 ( 21 ) );
                    962: }
                    963: 
                    964: static i32_t
                    965: bcm_nvram_read( u32_t f_addr_u32, u32_t *f_val_pu32, u32_t lock )
                    966: {
                    967:        u32_t i;
                    968: 
                    969:        /*
                    970:         * parameter check
                    971:         */
                    972:        if( f_addr_u32 > NVM_ADDR_MSK ) {
                    973:                return -1;
                    974:        }
                    975: 
                    976:        /*
                    977:         * Acquire NVRam lock (REQ0) & wait for arbitration won (ARB0_WON)
                    978:         */
                    979:        if( lock && (bcm_nvram_lock() == -1) ) {
                    980:                return -1;
                    981:        }
                    982: 
                    983:        /*
                    984:         * setup address to read
                    985:         */
                    986:        bcm_write_reg32( NVM_ADDR_R,
                    987:                bcm_nvram_logical_to_physical_address(f_addr_u32) );
                    988: //     bcm_write_reg32( NVM_ADDR_R, f_addr_u32 );
                    989: 
                    990:        /*
                    991:         * get the command going
                    992:         */
                    993:        bcm_write_reg32( NVM_COM_R, BIT32( 8 ) | BIT32( 7 ) |
                    994:                                    BIT32( 4 ) | BIT32( 3 ) );
                    995: 
                    996:        /*
                    997:         * wait for command completion
                    998:         */
                    999:        i = 2000;
                   1000:         while( ( --i ) &&
                   1001:                ( ( bcm_read_reg32( NVM_COM_R ) & BIT32( 3 ) ) == 0 ) ) {
                   1002:                ms_delay( 1 );
                   1003:        }
                   1004: 
                   1005:        /*
                   1006:         * read back data if no error
                   1007:         */
                   1008:        if( i != 0 ) {
                   1009:                /*
                   1010:                 * read back data
                   1011:                 */
                   1012:                *f_val_pu32 = bcm_read_reg32( NVM_READ_R );
                   1013:        }
                   1014: 
                   1015:        if(lock)
                   1016:                bcm_nvram_unlock();
                   1017: 
                   1018:        // error
                   1019:        if( i == 0 ) {
                   1020: #ifdef BCM_DEBUG
                   1021:                printk("bcm57xx: reading from NVRAM failed\n");
                   1022: #endif
                   1023:                return -1;
                   1024:        }
                   1025: 
                   1026:        // success
                   1027:        return 0;
                   1028: }
                   1029: 
                   1030: static i32_t
                   1031: bcm_nvram_write( u32_t f_addr_u32, u32_t f_value_u32, u32_t lock )
                   1032: {
                   1033:        u32_t i;
                   1034: 
                   1035:        /*
                   1036:         * parameter check
                   1037:         */
                   1038:        if( f_addr_u32 > NVM_ADDR_MSK ) {
                   1039:                return -1;
                   1040:        }
                   1041: 
                   1042:        /*
                   1043:         * Acquire NVRam lock (REQ0) & wait for arbitration won (ARB0_WON)
                   1044:         */
                   1045:        if( lock && (bcm_nvram_lock() == -1) ) {
                   1046:                        return -1;
                   1047:        }
                   1048: 
                   1049:        /*
                   1050:         * setup address to write
                   1051:         */
                   1052:        bcm_write_reg32( NVM_ADDR_R, bcm_nvram_logical_to_physical_address( f_addr_u32 ) );
                   1053: 
                   1054:        /*
                   1055:         * setup write data
                   1056:         */
                   1057:        bcm_write_reg32( NVM_WRITE_R, f_value_u32 );
                   1058: 
                   1059:        /*
                   1060:         * get the command going
                   1061:         */
                   1062:        bcm_write_reg32( NVM_COM_R, BIT32( 8 ) | BIT32( 7 ) |
                   1063:                                    BIT32( 5 ) | BIT32( 4 ) | BIT32( 3 ) );
                   1064: 
                   1065:        /*
                   1066:         * wait for command completion
                   1067:         */
                   1068:        i = 2000;
                   1069:        while( ( --i ) &&
                   1070:               ( ( bcm_read_reg32( NVM_COM_R ) & BIT32( 3 ) ) == 0 ) ) {
                   1071:                ms_delay( 1 );
                   1072:        }
                   1073: 
                   1074:        /*
                   1075:         * release NVRam lock (CLR0)
                   1076:         */
                   1077:        if(lock)
                   1078:                bcm_nvram_unlock();
                   1079: 
                   1080:        // error
                   1081:        if( i == 0 ) {
                   1082: #ifdef BCM_DEBUG
                   1083:                printk("bcm57xx: writing to NVRAM failed\n");
                   1084: #endif
                   1085:                return -1;
                   1086:        }
                   1087: 
                   1088:        // success
                   1089:        return 0;
                   1090: }
                   1091: 
                   1092: /*
                   1093:  * PHY initialization
                   1094:  */
                   1095: static i32_t
                   1096: bcm_mii_phy_init( void )
                   1097: {
                   1098:        static const u32_t PHY_STAT_R   = (u32_t) 0x01;
                   1099:        static const u32_t AUX_STAT_R   = (u32_t) 0x19;
                   1100:        static const u32_t MODE_GMII    = BIT32( 3 );
                   1101:        static const u32_t MODE_MII     = BIT32( 2 );
                   1102:        static const u32_t NEG_POLARITY = BIT32( 10 );
                   1103:        static const u32_t MII_MSK      = ( MODE_GMII | MODE_MII );
                   1104:        static const u16_t GIGA_ETH     = ( BIT16( 10 ) | BIT16( 9 ) );
                   1105:        i32_t i;
                   1106:        u16_t v;
                   1107: 
                   1108:        /*
                   1109:         * enable MDI communication
                   1110:         */
                   1111:        bcm_write_reg32( MDI_CTRL_R, (u32_t) 0x0 );
                   1112: 
                   1113:        /*
                   1114:         * check link up
                   1115:         */
                   1116:        i = 2500;
                   1117:        do {
                   1118:                ms_delay( 1 );
                   1119:                // register needs to be read twice!
                   1120:                bcm_mii_read16( PHY_STAT_R, &v );
                   1121:                bcm_mii_read16( PHY_STAT_R, &v );
                   1122:        } while( ( --i ) &&
                   1123:                 ( ( v & BIT16( 2 ) ) == 0 ) );
                   1124: 
                   1125:        if( i == 0 ) {
                   1126: #ifdef BCM_DEBUG       
                   1127:                printk( "bcm57xx: link is down\n" );
                   1128: #endif
                   1129:                return -1;
                   1130:        }
                   1131: 
                   1132: #ifdef BCM_DEBUG       
                   1133:        printk( "bcm57xx: link is up\n" );
                   1134: #endif
                   1135:        if( !IS_COPPER_PHY ) {
                   1136:                return 0;
                   1137:        }
                   1138: 
                   1139:        /*
                   1140:         * setup GMII or MII interface
                   1141:         */
                   1142:        i = bcm_read_reg32( ETH_MAC_MODE_R );
                   1143:        /*
                   1144:         * read status register twice, since the first
                   1145:         * read fails once between here and the moon...
                   1146:         */
                   1147:        bcm_mii_read16( AUX_STAT_R, &v );
                   1148:        bcm_mii_read16( AUX_STAT_R, &v );
                   1149: 
                   1150:        if( ( v & GIGA_ETH ) == GIGA_ETH ) {
                   1151: #ifdef BCM_DEBUG       
                   1152:        printk( "bcm57xx: running PHY in GMII mode (1000BaseT)\n" );
                   1153: #endif
                   1154:                // GMII device
                   1155:                if( ( i & MII_MSK ) != MODE_GMII ) {
                   1156:                        i &= ~MODE_MII;
                   1157:                        i |=  MODE_GMII;
                   1158:                }
                   1159: 
                   1160:        } else {
                   1161: #ifdef BCM_DEBUG       
                   1162:        printk( "bcm57xx: running PHY in MII mode (10/100BaseT)\n" );
                   1163: #endif
                   1164:                // MII device
                   1165:                if( ( i & MII_MSK ) != MODE_MII ) {
                   1166:                        i &= ~MODE_GMII;
                   1167:                        i |=  MODE_MII;
                   1168:                }
                   1169: 
                   1170:        }
                   1171: 
                   1172:        if( IS_5704 && !IS_SERDES ) {
                   1173: #ifdef BCM_DEBUG       
                   1174:                printk( "bcm57xx: set the link ready signal for 5704C to negative polarity\n" );
                   1175: #endif
                   1176:                i |= NEG_POLARITY; // set the link ready signal for 5704C to negative polarity
                   1177:        }
                   1178: 
                   1179:        bcm_write_reg32( ETH_MAC_MODE_R, i );
                   1180: 
                   1181:        return 0;
                   1182: }
                   1183: 
                   1184: static i32_t
                   1185: bcm_tbi_phy_init( void )
                   1186: {
                   1187:        i32_t i;
                   1188: #if 0
                   1189:        /*
                   1190:         * set TBI mode full duplex
                   1191:         */
                   1192:        bcm_clrb_reg32( ETH_MAC_MODE_R, BIT32( 1 ) );
                   1193:        bcm_setb_reg32( ETH_MAC_MODE_R, BIT32( 2 ) | BIT32( 3 ) );
                   1194: 
                   1195:        /*
                   1196:         * enable MDI communication
                   1197:         */
                   1198:        bcm_write_reg32( MDI_CTRL_R, (u32_t) 0x0 );
                   1199: 
                   1200:        /* Disable link change interrupt.  */
                   1201:        bcm_write_reg32( ETH_MAC_EVT_EN_R, 0 );
                   1202: 
                   1203:        /*
                   1204:         * set link polarity
                   1205:         */
                   1206:        bcm_clrb_reg32( ETH_MAC_MODE_R, BIT32( 10 ) );
                   1207: 
                   1208:        /*
                   1209:         * wait for sync/config changes
                   1210:         */
                   1211:        for( i = 0; i < 100; i++ ) {
                   1212:                bcm_write_reg32( ETH_MAC_STAT_R,
                   1213:                                 BIT32( 3 ) | BIT32( 4 ) );
                   1214: 
                   1215:                us_delay( 20 );
                   1216: 
                   1217:                if( ( bcm_read_reg32( ETH_MAC_STAT_R ) &
                   1218:                    ( BIT32( 3 ) | BIT32( 4 ) ) ) == 0 ) {
                   1219:                        break;
                   1220:                }
                   1221: 
                   1222:        }
                   1223: #endif
                   1224:        /*
                   1225:         * wait for sync to come up
                   1226:         */
                   1227:        for( i = 0; i < 100; i++ ) {
                   1228: 
                   1229:                if( ( bcm_read_reg32( ETH_MAC_STAT_R ) & BIT32( 0 ) ) != 0 ) {
                   1230:                        break;
                   1231:                }
                   1232: 
                   1233:                us_delay( 20 ); 
                   1234:        }
                   1235: 
                   1236:        if( ( bcm_read_reg32( ETH_MAC_STAT_R ) & BIT32( 0 ) ) == 0) {
                   1237: #ifdef BCM_DEBUG       
                   1238:                printk( "bcm57xx: link is down\n" );
                   1239: #endif
                   1240:                return -1;
                   1241:        }
                   1242: #if 0
                   1243:        /*
                   1244:         * clear all attentions
                   1245:         */
                   1246:        bcm_write_reg32( ETH_MAC_STAT_R, (u32_t) ~0 );
                   1247: #endif
                   1248: 
                   1249: #ifdef BCM_DEBUG       
                   1250:        printk( "bcm57xx: link is up\n" );
                   1251: #endif
                   1252:        return 0;
                   1253: }
                   1254: 
                   1255: static i32_t
                   1256: bcm_phy_init( void )
                   1257: {
                   1258:        static const u16_t SRAM_HW_CFG = (u16_t) 0x0b58;
                   1259:        u32_t l_val_u32;
                   1260:        i32_t l_ret_i32 = 0;
                   1261: 
                   1262:        /*
                   1263:          * get HW configuration from SRAM
                   1264:         */
                   1265:        l_val_u32  = bcm_read_mem32( SRAM_HW_CFG );
                   1266:        l_val_u32 &= ( BIT32( 5 ) | BIT32( 4 ) );
                   1267: 
                   1268:        switch( l_val_u32 ) {
                   1269:                case 0x10: {
                   1270:                        #ifdef BCM_DEBUG
                   1271:                        printk( "bcm57xx: copper PHY detected\n" );
                   1272:                        #endif
                   1273: 
                   1274:                        bcm_device_u64 |= BCM_DEV_COPPER;
                   1275:                        l_ret_i32       = bcm_mii_phy_init();
                   1276:                } break;
                   1277: 
                   1278:                case 0x20: {
                   1279:                        #ifdef BCM_DEBUG
                   1280:                        printk( "bcm57xx: fiber PHY detected\n" );
                   1281:                        #endif
                   1282: 
                   1283:                        if( !IS_SERDES ) {
                   1284:                                #ifdef BCM_DEBUG
                   1285:                                printk( "bcm57xx: running PHY in gmii/mii mode\n" );
                   1286:                                #endif
                   1287:                                l_ret_i32 = bcm_mii_phy_init();
                   1288:                        } else {
                   1289:                                #ifdef BCM_DEBUG
                   1290:                                printk( "bcm57xx: running PHY in tbi mode\n" );
                   1291:                                #endif
                   1292:                                l_ret_i32 = bcm_tbi_phy_init();
                   1293:                        }
                   1294: 
                   1295:                } break;
                   1296: 
                   1297:                default: {
                   1298:                        #ifdef BCM_DEBUG
                   1299:                        printk( "bcm57xx: unknown PHY type detected, terminating\n" );
                   1300:                        #endif
                   1301:                        l_ret_i32 = -1;
                   1302:                }
                   1303: 
                   1304:        }
                   1305: 
                   1306:        return l_ret_i32;
                   1307: }
                   1308: 
                   1309: /*
                   1310:  * ring initialization
                   1311:  */
                   1312: static void
                   1313: bcm_init_rxprod_ring( void )
                   1314: {
                   1315:        u32_t      v;
                   1316:        u32_t      i;
                   1317: 
                   1318:        /*
                   1319:         * clear out the whole rx prod ring for sanity
                   1320:         */
                   1321:        memset( (void *) &bcm_rxprod_ring,
                   1322:                0,
                   1323:                BCM_RXPROD_RING_SIZE * sizeof( bcm_rxbd_t ) );
                   1324:        mb();
                   1325: 
                   1326:        /*
                   1327:         * assign buffers & indices to the ring members
                   1328:         */
                   1329:        for( i = 0; i < BCM_MAX_RX_BUF; i++ ) {
                   1330:                bcm_rxprod_ring[i].m_hostaddr_st.m_hi_u32 =
                   1331:                        (u32_t) ( (u64_t) &bcm_rx_buffer_pu08[i] >> 32 );
                   1332:                bcm_rxprod_ring[i].m_hostaddr_st.m_lo_u32 =
                   1333:                        (u32_t) ( (u64_t) &bcm_rx_buffer_pu08[i] &
                   1334:                                  (u64_t) 0xffffffff );
                   1335:                bcm_rxprod_ring[i].m_idxlen_u32  = ( i << 16 );
                   1336:                bcm_rxprod_ring[i].m_idxlen_u32 += BCM_BUF_SIZE;
                   1337:        }
                   1338: 
                   1339:        /*
                   1340:         * clear rcb registers & disable rings
                   1341:         * NOTE: mini & jumbo rings are not supported,
                   1342:         * still rcb's are cleaned out for sanity
                   1343:         */
                   1344:        bcm_write_reg32( BCM_RCB_LENFLAG_u16(      BCM_RXPROD_RCB_JUM ), RCB_FLAG_RING_DISABLED );
                   1345:        bcm_write_reg32( BCM_RCB_HOSTADDR_HI_u16(  BCM_RXPROD_RCB_JUM ), 0 );
                   1346:        bcm_write_reg32( BCM_RCB_HOSTADDR_LOW_u16( BCM_RXPROD_RCB_JUM ), 0 );
                   1347:        bcm_write_reg32( BCM_RCB_NICADDR_u16(      BCM_RXPROD_RCB_JUM ), 0 );
                   1348: 
                   1349:        bcm_write_reg32( BCM_RCB_LENFLAG_u16(      BCM_RXPROD_RCB_STD ), RCB_FLAG_RING_DISABLED );
                   1350:        bcm_write_reg32( BCM_RCB_HOSTADDR_HI_u16(  BCM_RXPROD_RCB_STD ), 0 );
                   1351:        bcm_write_reg32( BCM_RCB_HOSTADDR_LOW_u16( BCM_RXPROD_RCB_STD ), 0 );
                   1352:        bcm_write_reg32( BCM_RCB_NICADDR_u16(      BCM_RXPROD_RCB_STD ), 0 );
                   1353: 
                   1354:        bcm_write_reg32( BCM_RCB_LENFLAG_u16(      BCM_RXPROD_RCB_MIN ), RCB_FLAG_RING_DISABLED );
                   1355:        bcm_write_reg32( BCM_RCB_HOSTADDR_HI_u16(  BCM_RXPROD_RCB_MIN ), 0 );
                   1356:        bcm_write_reg32( BCM_RCB_HOSTADDR_LOW_u16( BCM_RXPROD_RCB_MIN ), 0 );
                   1357:        bcm_write_reg32( BCM_RCB_NICADDR_u16(      BCM_RXPROD_RCB_MIN ), 0 );
                   1358: 
                   1359:        /*
                   1360:         * clear rx producer index of std producer ring
                   1361:         */
                   1362:        bcm_write_reg32( RXPROD_PROD_IND, 0 );
                   1363: 
                   1364:        /*
                   1365:         * setup rx standard rcb using recommended NIC addr (hard coded)
                   1366:         */
                   1367:        bcm_write_reg32( BCM_RCB_HOSTADDR_HI_u16( BCM_RXPROD_RCB_STD ),
                   1368:                         (u32_t) ( (u64_t) &bcm_rxprod_ring >> 32 ) );
                   1369:        bcm_write_reg32( BCM_RCB_HOSTADDR_LOW_u16( BCM_RXPROD_RCB_STD ),
                   1370:                         (u32_t) ( (u64_t) &bcm_rxprod_ring & (u64_t) 0xffffffff ) );
                   1371:        bcm_write_reg32( BCM_RCB_NICADDR_u16( BCM_RXPROD_RCB_STD ),
                   1372:                         (u32_t) BCM_NIC_RX_OFFS );
                   1373: 
                   1374:        if( IS_5704 || IS_5703 ) {
                   1375:                // 5704: length field = max buffer len
                   1376:                v = (u32_t) BCM_BUF_SIZE << 16;
                   1377:        } else {
                   1378:                // 5714: length field = number of ring entries
                   1379:                v = (u32_t) BCM_RXPROD_RING_SIZE << 16;
                   1380:        }
                   1381: 
                   1382:        v &= (u32_t) ~RCB_FLAG_RING_DISABLED;
                   1383:        bcm_write_reg32( BCM_RCB_LENFLAG_u16( BCM_RXPROD_RCB_STD ), v );
                   1384: }
                   1385: 
                   1386: static void
                   1387: bcm_init_rxret_ring( void )
                   1388: {
                   1389:        u32_t      i;
                   1390:        u16_t      v;
                   1391: 
                   1392:        /*
                   1393:         * clear out the whole rx ret ring for sanity
                   1394:         */
                   1395:        memset( (void *) &bcm_rxret_ring,
                   1396:                0,
                   1397:                2 * BCM_RXRET_RING_SIZE * sizeof( bcm_rxbd_t ) );
                   1398:        mb();
                   1399: 
                   1400:        /*
                   1401:         * setup return ring size dependent on installed device
                   1402:         */
                   1403:        bcm_rxret_ring_sz = BCM_RXRET_RING_SIZE;
                   1404:        if( IS_5704 || IS_5703 ) {
                   1405:                bcm_rxret_ring_sz *= 2;
                   1406:        }
                   1407: 
                   1408:         /*
                   1409:         * clear rcb memory & disable rings
                   1410:         * NOTE: 5714 only supports one return ring,
                   1411:         * still all possible rcb's are cleaned out for sanity
                   1412:         */
                   1413:        v = BCM_RXRET_RCB_OFFS;
                   1414:        for( i = 0; i < BCM_MAX_RXRET_RING; i++ ) {
                   1415:                bcm_write_mem32( BCM_RCB_LENFLAG_u16( v ),      RCB_FLAG_RING_DISABLED );
                   1416:                bcm_write_mem32( BCM_RCB_HOSTADDR_HI_u16( v ),  0 );
                   1417:                bcm_write_mem32( BCM_RCB_HOSTADDR_LOW_u16( v ), 0 );
                   1418:                bcm_write_mem32( BCM_RCB_NICADDR_u16( v ),      0 );
                   1419: 
                   1420:                v += BCM_RCB_SIZE_u16;
                   1421:         }
                   1422: 
                   1423:        /*
                   1424:         * clear rx consumer index of return ring
                   1425:         */
                   1426:        bcm_write_reg32( RXRET_CONS_IND, 0 );
                   1427: 
                   1428:        /*
                   1429:         * setup rx ret rcb
                   1430:         * NOTE: NIC address not aplicable in return rings
                   1431:         */
                   1432:        bcm_write_mem32( BCM_RCB_HOSTADDR_HI_u16( BCM_RXRET_RCB_OFFS ),
                   1433:                         (u32_t) ( (u64_t) &bcm_rxret_ring >> 32 ) );
                   1434:        bcm_write_mem32( BCM_RCB_HOSTADDR_LOW_u16( BCM_RXRET_RCB_OFFS ),
                   1435:                         (u32_t) ( (u64_t) &bcm_rxret_ring  &
                   1436:                                   (u64_t) 0xffffffff ) );
                   1437:        bcm_write_mem32( BCM_RCB_NICADDR_u16( BCM_RXRET_RCB_OFFS ), 0 );
                   1438: 
                   1439:        i   = bcm_rxret_ring_sz;
                   1440:        i <<= 16;
                   1441:        i  &= (u32_t) ~RCB_FLAG_RING_DISABLED;
                   1442:        bcm_write_reg32( BCM_RCB_LENFLAG_u16( BCM_RXRET_RCB_OFFS ), i );
                   1443: }
                   1444: 
                   1445: static void
                   1446: bcm_init_tx_ring( void )
                   1447: {
                   1448:        u32_t      i;
                   1449:        u16_t      v;
                   1450: 
                   1451:        /*
                   1452:         * clear out the whole tx ring for sanity
                   1453:         */
                   1454:        memset( (void *) &bcm_tx_ring,
                   1455:                0,
                   1456:                BCM_TX_RING_SIZE * sizeof( bcm_txbd_t ) );
                   1457:        mb();
                   1458: 
                   1459:         /*
                   1460:         * assign buffers to the ring members & setup invariant flags
                   1461:         */
                   1462:         for( i = 0; i < BCM_MAX_TX_BUF; i++ ) {
                   1463:                bcm_tx_ring[i].m_hostaddr_st.m_hi_u32 =
                   1464:                        (u32_t) ( (u64_t) &bcm_tx_buffer_pu08[i] >> 32 );
                   1465:                bcm_tx_ring[i].m_hostaddr_st.m_lo_u32 =
                   1466:                        (u32_t) ( (u64_t) &bcm_tx_buffer_pu08[i] &
                   1467:                                  (u64_t) 0xffffffff );
                   1468:                // flags: indicate last packet & coal now
                   1469:                // -last packet is always true (only one send packet supported)
                   1470:                // -coal now needed to always get the consumed bd's (since
                   1471:                //  only a few bd's are set up which permanently are recycled)
                   1472:                bcm_tx_ring[i].m_lenflags_u32 = ( BIT32( 2 ) | BIT32( 7 ) );
                   1473:                bcm_tx_ring[i].m_VLANtag_u32  = (u32_t) 0;      // not used
                   1474:         }
                   1475: 
                   1476:         /*
                   1477:         * clear rcb memory & disable rings
                   1478:         * NOTE: 5714 only supports one send ring,
                   1479:         * still all possible rcb's are cleaned out for sanity
                   1480:         */
                   1481:         v = BCM_TX_RCB_OFFS;
                   1482:        for( i = 0; i < BCM_MAX_TX_RING; i++ ) {
                   1483:                bcm_write_mem32( BCM_RCB_LENFLAG_u16( v ),      RCB_FLAG_RING_DISABLED );
                   1484:                bcm_write_mem32( BCM_RCB_HOSTADDR_HI_u16( v ),  0 );
                   1485:                bcm_write_mem32( BCM_RCB_HOSTADDR_LOW_u16( v ), 0 );
                   1486:                bcm_write_mem32( BCM_RCB_NICADDR_u16( v ),      0 );
                   1487: 
                   1488:                v += BCM_RCB_SIZE_u16;
                   1489:        }
                   1490: 
                   1491:        /*
                   1492:         * clear host/nic producer indices
                   1493:         */
                   1494:        bcm_write_reg32( TX_NIC_PROD_IND, 0 );
                   1495:        bcm_write_reg32( TX_PROD_IND, 0 );
                   1496: 
                   1497:        /*
                   1498:         * setup tx rcb using recommended NIC addr (hard coded)
                   1499:         */
                   1500:        bcm_write_mem32( BCM_RCB_HOSTADDR_HI_u16( BCM_TX_RCB_OFFS ),
                   1501:                                  (u32_t) ( (u64_t) &bcm_tx_ring >> 32 ) );
                   1502:        bcm_write_mem32( BCM_RCB_HOSTADDR_LOW_u16( BCM_TX_RCB_OFFS ),
                   1503:                                  (u32_t) ( (u64_t) &bcm_tx_ring &
                   1504:                                            (u64_t) 0xffffffff ) );
                   1505:        bcm_write_mem32( BCM_RCB_NICADDR_u16( BCM_TX_RCB_OFFS ),
                   1506:                                  (u32_t) BCM_NIC_TX_OFFS );
                   1507: 
                   1508:        if( IS_5704 || IS_5703 ) {
                   1509:                // 5704: length field = max buffer len
                   1510:                i = (u32_t) BCM_BUF_SIZE << 16;
                   1511:        } else {
                   1512:                // 5714: length field = number of ring entries
                   1513:                i = (u32_t) BCM_TX_RING_SIZE << 16;
                   1514:        }
                   1515: 
                   1516:        i &= ( u32_t ) ~RCB_FLAG_RING_DISABLED;
                   1517:        bcm_write_mem32( BCM_RCB_LENFLAG_u16( BCM_TX_RCB_OFFS ), i );
                   1518: 
                   1519:        /*
                   1520:         * remember the next bd index to be used
                   1521:         * & number of available buffers
                   1522:         */
                   1523:        bcm_tx_stop_u32     = BCM_MAX_TX_BUF;
                   1524:        bcm_tx_bufavail_u32 = BCM_MAX_TX_BUF;
                   1525: }
                   1526: 
                   1527: static i32_t
                   1528: bcm_mac_init( u08_t *f_mac_pu08 )
                   1529: {
                   1530:        static const u16_t MEM_MAC_LO = (u16_t) 0x0c18;
                   1531:        static const u16_t MEM_MAC_HI = (u16_t) 0x0c14;
                   1532: 
                   1533:        u32_t              NVR_MAC_LO = (u16_t) 0x80;
                   1534:        u32_t              NVR_MAC_HI = (u16_t) 0x7c;
                   1535: 
                   1536:        bcm_addr64_t       l_mac_st;
                   1537:        u32_t              i;
                   1538:        u32_t              v;
                   1539: 
                   1540:        /*
                   1541:         * Use MAC address from device tree if possible
                   1542:         */
                   1543:        for( i = 0, v = 0; i < 6; i++ ) {
                   1544:                v += (u32_t) f_mac_pu08[i];
                   1545:        }
                   1546: 
                   1547:        if( v != 0 ) {
                   1548:                l_mac_st.m_hi_u32  = ( ( (u32_t) f_mac_pu08[0]) <<  8 );
                   1549:                l_mac_st.m_hi_u32 |= ( ( (u32_t) f_mac_pu08[1]) <<  0 );
                   1550:                l_mac_st.m_lo_u32  = ( ( (u32_t) f_mac_pu08[2]) << 24 );
                   1551:                l_mac_st.m_lo_u32 |= ( ( (u32_t) f_mac_pu08[3]) << 16 );
                   1552:                l_mac_st.m_lo_u32 |= ( ( (u32_t) f_mac_pu08[4]) <<  8 );
                   1553:                l_mac_st.m_lo_u32 |= ( ( (u32_t) f_mac_pu08[5]) <<  0 );
                   1554:        } else {
                   1555:                /*
                   1556:                 * try to read MAC address from MAC mailbox
                   1557:                 */
                   1558:                l_mac_st.m_hi_u32 = bcm_read_mem32( MEM_MAC_HI );
                   1559: 
                   1560:                if( ( l_mac_st.m_hi_u32 >> 16 ) == (u32_t) 0x484b ) {
                   1561:                        l_mac_st.m_hi_u32 &= (u32_t) 0xffff;
                   1562:                        l_mac_st.m_lo_u32  = bcm_read_mem32( MEM_MAC_LO );
                   1563:                } else {
                   1564:                        i32_t l_err_i32;
                   1565: 
                   1566:                        /*
                   1567:                         * otherwise retrieve MAC address from NVRam
                   1568:                         */
                   1569:                        if( ( bcm_read_reg32( MAC_FUNC_R ) & BIT32( 2 ) ) != 0 ) {
                   1570:                                // secondary MAC is in use, address in NVRAM changes
                   1571:                                NVR_MAC_LO += 0x50;
                   1572:                                NVR_MAC_HI += 0x50;
                   1573:                        }
                   1574:                
                   1575:                        l_err_i32  = bcm_nvram_read( NVR_MAC_LO, &l_mac_st.m_lo_u32, 1 );
                   1576:                        l_err_i32 += bcm_nvram_read( NVR_MAC_HI, &l_mac_st.m_hi_u32, 1 );
                   1577: 
                   1578:                        // return on read error
                   1579:                        if( l_err_i32 < 0 ) {
                   1580: #ifdef BCM_DEBUG
                   1581:                                printk( "bcm57xx: failed to retrieve MAC address\n" );
                   1582: #endif
                   1583:                                return -1;
                   1584:                        }
                   1585:                }
                   1586:        }
                   1587: 
                   1588:         /*
                   1589:          * write the mac addr into the NIC's register area
                   1590:          */
                   1591:        bcm_write_reg32( MAC_ADDR_OFFS_HI(0), l_mac_st.m_hi_u32 );
                   1592:        bcm_write_reg32( MAC_ADDR_OFFS_LO(0), l_mac_st.m_lo_u32 );
                   1593:        for( i = 1; i < BCM_NUM_MAC_ADDR; i++ ) {
                   1594:                bcm_write_reg32( MAC_ADDR_OFFS_HI(i), 0 );
                   1595:                bcm_write_reg32( MAC_ADDR_OFFS_LO(i), 0 );
                   1596:        }
                   1597:        
                   1598:        /*
                   1599:         * WY 26.01.07
                   1600:         * not needed anymore, s.a.
                   1601:        if( IS_5704 != 0 ) {
                   1602: 
                   1603:                v = MAC5704_ADDR_OFFS;
                   1604:                for( i = 0; i < BCM_NUM_MAC5704_ADDR; i++ ) {
                   1605:                        bcm_write_reg32( v, l_mac_st.m_hi_u32 );
                   1606:                        v += sizeof( u32_t );
                   1607:                        bcm_write_reg32( v, l_mac_st.m_lo_u32 );
                   1608:                        v += sizeof( u32_t );
                   1609:                }
                   1610: 
                   1611:        }
                   1612:        */
                   1613: 
                   1614:         /*
                   1615:          * return MAC address as string
                   1616:          */
                   1617:         f_mac_pu08[0] = (u08_t) ( ( l_mac_st.m_hi_u32 >>  8 ) & (u32_t) 0xff );
                   1618:         f_mac_pu08[1] = (u08_t) ( ( l_mac_st.m_hi_u32       ) & (u32_t) 0xff );
                   1619:         f_mac_pu08[2] = (u08_t) ( ( l_mac_st.m_lo_u32 >> 24 ) & (u32_t) 0xff );
                   1620:         f_mac_pu08[3] = (u08_t) ( ( l_mac_st.m_lo_u32 >> 16 ) & (u32_t) 0xff );
                   1621:         f_mac_pu08[4] = (u08_t) ( ( l_mac_st.m_lo_u32 >>  8 ) & (u32_t) 0xff );
                   1622:         f_mac_pu08[5] = (u08_t) ( ( l_mac_st.m_lo_u32       ) & (u32_t) 0xff );
                   1623: 
                   1624: #ifdef BCM_DEBUG
                   1625:        do {
                   1626:                i32_t i;
                   1627:                printk( "bcm57xx: retrieved MAC address " );
                   1628: 
                   1629:                for( i = 0; i < 6; i++ ) {
                   1630:                        printk( "%02X", f_mac_pu08[i] );
                   1631: 
                   1632:                        if( i != 5 ) {
                   1633:                                printk( ":" );
                   1634:                        }
                   1635: 
                   1636:                }
                   1637: 
                   1638:                printk( "\n" );
                   1639:        } while( 0 );
                   1640: #endif 
                   1641: 
                   1642:        return 0;
                   1643: }
                   1644: 
                   1645: 
                   1646: /*
                   1647:  ******************************************************************************
                   1648:  * ASF Firmware
                   1649:  ******************************************************************************
                   1650:  */
                   1651: 
                   1652: 
                   1653: #ifdef BCM_DEBUG
                   1654: #ifdef BCM_SHOW_ASF_REGS
                   1655: static void
                   1656: bcm_asf_check_register( void )
                   1657: {
                   1658:        u32_t i;
                   1659: 
                   1660:        i = bcm_read_reg32( ASF_CTRL_R );
                   1661:        printk( "bcm57xx: ASF control          : %x\n", i );
                   1662: 
                   1663:        i = bcm_read_reg32( ASF_WATCHDOG_TIMER_R );
                   1664:        printk( "bcm57xx: ASF Watchdog Timer   : %x\n", i );
                   1665: 
                   1666:        i = bcm_read_reg32( ASF_HEARTBEAT_TIMER_R );
                   1667:        printk( "bcm57xx: ASF Heartbeat Timer  : %x\n", i );
                   1668: 
                   1669:        i = bcm_read_reg32( ASF_POLL_TIMER_R );
                   1670:        printk( "bcm57xx: ASF Poll Timer       : %x\n", i );
                   1671: 
                   1672:        i = bcm_read_reg32( POLL_LEGACY_TIMER_R );
                   1673:        printk( "bcm57xx: Poll Legacy Timer    : %x\n", i );
                   1674: 
                   1675:        i = bcm_read_reg32( RETRANSMISSION_TIMER_R );
                   1676:        printk( "bcm57xx: Retransmission Timer : %x\n", i );
                   1677: 
                   1678:        i = bcm_read_reg32( TIME_STAMP_COUNTER_R );
                   1679:        printk( "bcm57xx: Time Stamp Counter   : %x\n", i );
                   1680: 
                   1681:        i = bcm_read_reg32( RX_CPU_MODE_R );
                   1682:        printk( "bcm57xx: RX RISC Mode         : %x\n", i );
                   1683: 
                   1684:        i = bcm_read_reg32( RX_CPU_STATE_R );
                   1685:        printk( "bcm57xx: RX RISC State        : %x\n", i );
                   1686: 
                   1687:        i = bcm_read_reg32( RX_CPU_PC_R );
                   1688:        printk( "bcm57xx: RX RISC Prg. Counter : %x\n", i );
                   1689: }
                   1690: #endif
                   1691: #endif
                   1692: 
                   1693: static int
                   1694: bcm_fw_halt( void )
                   1695: {
                   1696:        int i;
                   1697: 
                   1698:        bcm_write_mem32( BCM_FW_MBX_CMD, BCM_NICDRV_PAUSE_FW );
                   1699:        bcm_setb_reg32( RX_CPU_EVENT_R, BIT32( 14 ) );
                   1700: 
                   1701:        /* Wait for RX cpu to ACK the event.  */
                   1702:        for (i = 0; i < 100; i++) {
                   1703:                if(bcm_read_reg32( RX_CPU_EVENT_R ) & BIT32( 14 ))
                   1704:                        break;
                   1705:                ms_delay(1);
                   1706:        }
                   1707:        if( i>= 100)
                   1708:                return -1;
                   1709:        return 0;
                   1710: }
                   1711: 
                   1712: 
                   1713: #ifdef BCM_SW_AUTONEG
                   1714: static void
                   1715: bcm_sw_autoneg( void ) {
                   1716:        u32_t i, j, k;
                   1717:        u32_t SerDesCfg;
                   1718:        u32_t SgDigControl;
                   1719:        u32_t SgDigStatus;
                   1720:        u32_t ExpectedSgDigControl;
                   1721:        int   AutoNegJustInitiated = 0;
                   1722: 
                   1723:        // step 1: init TX 1000BX Autoneg. Register to zero
                   1724:        bcm_write_reg32(TX_1000BX_AUTONEG_R, 0);
                   1725: 
                   1726:        // step 2&3: set TBI mode
                   1727:        bcm_setb_reg32( ETH_MAC_MODE_R, BIT32( 2 ) | BIT32( 3 ) );
                   1728:        us_delay(10);
                   1729: 
                   1730:        // step 4: enable link attention
                   1731:        bcm_setb_reg32( ETH_MAC_EVT_EN_R, BIT32( 12 ) );
                   1732: 
                   1733:        // step 5: preserve voltage regulator bits
                   1734:        SerDesCfg = bcm_read_reg32(SERDES_CTRL_R) & ( BIT32( 20 ) | BIT32( 21 )
                   1735:                                                    | BIT32( 22 ) | BIT32( 23 ) );
                   1736: 
                   1737:        // step 6: preserve voltage regulator bits
                   1738:        SgDigControl = bcm_read_reg32(HW_AUTONEG_CTRL_R);
                   1739: 
                   1740:        // step 7: if device is NOT set-up for auto negotiation, then go to step 26
                   1741:        // goto bcm_setup_phy_step26;
                   1742: 
                   1743:        // We want to use auto negotiation
                   1744: 
                   1745:        // step 8: we don't want to use flow control
                   1746:        ExpectedSgDigControl = 0x81388400; // no flow control
                   1747: 
                   1748:        // step 9: compare SgDigControl with 0x81388400
                   1749:        if(SgDigControl == ExpectedSgDigControl) {
                   1750:                goto bcm_setup_phy_step17;
                   1751:        }
                   1752: #ifdef BCM_DEBUG
                   1753:        printk("bcm57xx: SgDigControl = %08X\n", SgDigControl);
                   1754: #endif
                   1755:        // step 10
                   1756:        bcm_write_reg32(SERDES_CTRL_R, SerDesCfg | 0xC011880);
                   1757: 
                   1758:        // step 11: restart auto negotiation
                   1759:        bcm_write_reg32(HW_AUTONEG_CTRL_R, ExpectedSgDigControl | BIT32( 30 ) );
                   1760: 
                   1761:        // step 12: read back HW_AUTONEG_CTRL_R
                   1762:        bcm_read_reg32(HW_AUTONEG_CTRL_R);
                   1763: 
                   1764:        // step 13
                   1765:        us_delay( 5 );
                   1766: 
                   1767:        // step 14,15,16: same as step 11, but don't restart auto neg.
                   1768:        bcm_write_reg32(HW_AUTONEG_CTRL_R, ExpectedSgDigControl);
                   1769:        AutoNegJustInitiated = 1;
                   1770:        goto bcm_setup_phy_step30;
                   1771: 
                   1772:        // step 17:
                   1773:        bcm_setup_phy_step17:
                   1774:        if( ( bcm_read_reg32(ETH_MAC_STAT_R) & ( BIT32( 1 ) | BIT32( 0 ) ) ) == 0 ) {
                   1775:                goto bcm_setup_phy_step30;
                   1776:        }
                   1777: 
                   1778:        // step 18: Get HW Autoneg. Status
                   1779:        SgDigStatus = bcm_read_reg32(HW_AUTONEG_STAT_R);
                   1780: 
                   1781:        // step 19:
                   1782:        if( ( SgDigStatus & BIT32(1) )
                   1783:        &&  ( bcm_read_reg32(ETH_MAC_STAT_R) & BIT32(0) ) ) {
                   1784:                // resolve the current flow control?
                   1785:                AutoNegJustInitiated = 0;
                   1786:                goto bcm_setup_phy_step30;
                   1787:        }
                   1788: 
                   1789:        // step 20
                   1790:        if( SgDigStatus & BIT32(1) ) {
                   1791:                goto bcm_setup_phy_step30;
                   1792:        }
                   1793:        if( AutoNegJustInitiated != 0) {
                   1794:                AutoNegJustInitiated = 0;
                   1795:                goto bcm_setup_phy_step29;
                   1796:        }
                   1797: 
                   1798:        // step 21, 22, 23, 24: fallback to 1000Mbps-FullDuplex forced mode
                   1799:        if( ( bcm_read_reg32( MAC_FUNC_R ) & BIT32( 2 ) ) == 0 ) {
                   1800:                // port 0
                   1801:                bcm_write_reg32( SERDES_CTRL_R, 0xC010880 );
                   1802:        }
                   1803:        else {  // port 1
                   1804:                bcm_write_reg32( SERDES_CTRL_R, 0x4010880 );
                   1805:        }
                   1806:        // set to 1000Mbps-FullDuplex
                   1807:        bcm_write_reg32(HW_AUTONEG_CTRL_R, 0x1388400);
                   1808:        // read back
                   1809:        bcm_read_reg32(HW_AUTONEG_CTRL_R);
                   1810:        us_delay( 40 );
                   1811: 
                   1812:        // step 25: a little bit reduces...
                   1813:        goto bcm_setup_phy_step30;
                   1814: 
                   1815:        // step 26: check if auto negotiation bit is NOT set
                   1816: //     bcm_setup_phy_step26:
                   1817:        if( ( SgDigControl & BIT32(31) )== 0 ) {
                   1818:                printk("No autoneg.\n");
                   1819:                goto bcm_setup_phy_step29;
                   1820:        }
                   1821: 
                   1822:        // step 27:
                   1823:        if( ( bcm_read_reg32( MAC_FUNC_R ) & BIT32( 2 ) ) == 0 ) {
                   1824:                // port 0
                   1825:                bcm_write_reg32( SERDES_CTRL_R, 0xC010880 );
                   1826:        }
                   1827:        else {  // port 1
                   1828:                bcm_write_reg32( SERDES_CTRL_R, 0x4010880 );
                   1829:        }
                   1830: 
                   1831:        // step 28: disable auto neg. and force 1000FD mode
                   1832:        bcm_write_reg32(HW_AUTONEG_CTRL_R, 0x1388400);
                   1833: 
                   1834:        // step 29-31: omitted for 5704S
                   1835:        bcm_setup_phy_step29:
                   1836:        bcm_setup_phy_step30:
                   1837: 
                   1838:        // step 32: clear link attentions
                   1839:        i = bcm_read_reg32( ETH_MAC_STAT_R ) | BIT32( 3 ) | BIT32( 4 );
                   1840:        k = 100;
                   1841:        do {
                   1842:                bcm_write_reg32( ETH_MAC_STAT_R, i );
                   1843:                j = bcm_read_reg32( ETH_MAC_STAT_R );
                   1844:                if( ( j & BIT32( 3 ) ) != 0 )
                   1845:                        i = i & ~(BIT32( 3 ));
                   1846:                if( ( j & BIT32( 4 ) ) != 0 )
                   1847:                        i = i & ~(BIT32( 4 ));
                   1848:                --k;
                   1849:        } while( i & k);
                   1850: 
                   1851:        // step 33
                   1852:        if( ( bcm_read_reg32( ETH_MAC_STAT_R ) & BIT32( 0 ) ) == 0 ) {
                   1853:                goto bcm_setup_phy_step35;
                   1854:        }
                   1855: 
                   1856:        // step 34
                   1857:        i = bcm_read_reg32( ETH_MAC_MODE_R );
                   1858:        i|= BIT32( 17 );
                   1859:        bcm_write_reg32( ETH_MAC_MODE_R, i );
                   1860: 
                   1861:        us_delay( 1 );
                   1862: 
                   1863:        i = bcm_read_reg32( ETH_MAC_STAT_R );
                   1864:        i&= ~BIT32( 17 );
                   1865:        bcm_write_reg32( ETH_MAC_STAT_R, i );
                   1866: 
                   1867:        // step 35 & 36: done
                   1868:        bcm_setup_phy_step35:
                   1869: #ifdef BCM_DEBUG
                   1870:        printk("bcm57xx: SetupPhy\n");
                   1871: #endif
                   1872:        return;
                   1873: }
                   1874: #endif
                   1875: 
                   1876: static int
                   1877: bcm_handle_events( void ) {
                   1878: #ifdef BCM_DEBUG
                   1879: #ifdef BCM_SHOW_ASF_REGS
                   1880:        // ASF REGISTER CHECK
                   1881:        // ------------------
                   1882:        // check if watchdog timer expired
                   1883:        if( bcm_read_reg32( ASF_WATCHDOG_TIMER_R ) == 0 ) {
                   1884:                // Show ASF registers
                   1885:                bcm_asf_check_register();
                   1886: 
                   1887:                // rearm watchdog timer
                   1888:                bcm_write_reg32( ASF_WATCHDOG_TIMER_R, 5 );
                   1889:        }
                   1890: #endif
                   1891: #endif
                   1892: 
                   1893: #ifdef BCM_SW_AUTONEG
                   1894:        // AUTO NEGOTIATION
                   1895:        // ----------------
                   1896: 
                   1897:        // Check event for Auto Negotiation
                   1898:        if( ( bcm_read_reg32( ETH_MAC_STAT_R ) &
                   1899:            ( BIT32( 12 ) | BIT32( 3 ) | BIT32( 0 ) ) ) != 0 ) {
                   1900:                // link timer procedure
                   1901:                bcm_sw_autoneg();
                   1902:        }
                   1903: #endif
                   1904: 
                   1905:        // ASF FW HEARTBEAT
                   1906:        // ----------------
                   1907: 
                   1908:        // check if heartsbeat timer expired
                   1909:        if( bcm_read_reg32( ASF_HEARTBEAT_TIMER_R ) <= 2) {
                   1910:                int i;
                   1911: 
                   1912:                // Send heartbeat event
                   1913:                bcm_write_mem32( BCM_FW_MBX_CMD, BCM_NICDRV_ALIVE );
                   1914:                bcm_write_mem32( BCM_FW_MBX_LEN, 4 );
                   1915:                bcm_write_mem32( BCM_FW_MBX_DATA, 5 );
                   1916:                bcm_setb_reg32( RX_CPU_EVENT_R, BIT32( 14 ) );
                   1917: 
                   1918:                // Wait for RX cpu to ACK the event.
                   1919:                for (i = 100; i > 0; i--) {
                   1920:                        if(bcm_read_reg32( RX_CPU_EVENT_R ) & BIT32( 14 ))
                   1921:                                break;
                   1922:                        ms_delay(1);
                   1923:                }
                   1924:                if( i == 0) {
                   1925: #ifdef BCM_DEBUG
                   1926:                        printk( "bcm57xx: RX cpu did not acknowledge heartbeat event\n" );
                   1927: #endif
                   1928:                        return -1;
                   1929:                }
                   1930: 
                   1931:                // rearm heartbeat timer
                   1932:                bcm_write_reg32( ASF_HEARTBEAT_TIMER_R, 5 );
                   1933:        }
                   1934:        return 0;
                   1935: }
                   1936: 
                   1937: /*
                   1938:  * interface
                   1939:  ******************************************************************************
                   1940:  */
                   1941:   
                   1942: /*
                   1943:  * bcm_receive
                   1944:  */
                   1945: static int
                   1946: bcm_receive( char *f_buffer_pc, int f_len_i )
                   1947: {
                   1948:        u32_t l_rxret_prod_u32  = bcm_read_reg32( RXRET_PROD_IND );
                   1949:        u32_t l_rxret_cons_u32  = bcm_read_reg32( RXRET_CONS_IND );
                   1950:        u32_t l_rxprod_prod_u32 = bcm_read_reg32( RXPROD_PROD_IND );
                   1951:        int   l_ret_i;
                   1952: #ifdef BCM_DEBUG
                   1953: #ifdef BCM_SHOW_RCV_DATA
                   1954:        int i, j;
                   1955: #endif
                   1956: #endif
                   1957: 
                   1958:        /*
                   1959:         * NOTE: dummy read to ensure data has already been DMA'd is
                   1960:         *       done by the indice reads
                   1961:         */
                   1962: 
                   1963:        bcm_handle_events();
                   1964: 
                   1965:        /*
                   1966:         * if producer index == consumer index then nothing was received
                   1967:         */
                   1968:        if( l_rxret_prod_u32 == l_rxret_cons_u32 ) {
                   1969:                return 0;
                   1970:        }
                   1971: 
                   1972:        /*
                   1973:         * discard erroneous packets
                   1974:         */
                   1975:        if( ( bcm_rxret_ring[l_rxret_cons_u32].m_typeflags_u32 & BIT32( 10 ) ) != 0 ) {
                   1976: #ifdef BCM_DEBUG
                   1977:                printk( "bcm57xx: erroneous frame received\n" );
                   1978:                printk( "       : frame discarded\n" );
                   1979: #endif
                   1980:                l_ret_i = 0;
                   1981:        } else {
                   1982:                /*
                   1983:                 * get packet length, throw away checksum (last 4 bytes)
                   1984:                 */
                   1985:                l_ret_i = (int) ( bcm_rxret_ring[l_rxret_cons_u32].m_idxlen_u32 &
                   1986:                                  (u32_t) 0xffff ) - (int) 4;
                   1987: 
                   1988:                /*
                   1989:                 * discard oversized packets
                   1990:                 */
                   1991:                if( l_ret_i > f_len_i ) {
                   1992: #ifdef BCM_DEBUG
                   1993:                        printk( "bcm57xx: receive packet length error:\n" );
                   1994:                        printk( "       : incoming 0x%X bytes, available buffer 0x%X bytes\n", l_ret_i, f_len_i );
                   1995:                        printk( "       : frame discarded\n" );
                   1996: #endif         
                   1997:                        l_ret_i = 0;
                   1998:                }
                   1999: 
                   2000:         }
                   2001: 
                   2002:         /*
                   2003:          * copy & update data & indices
                   2004:          */
                   2005:        if( l_ret_i != 0 ) {
                   2006:                u64_t l_cpyaddr_u64;
                   2007: 
                   2008:                l_cpyaddr_u64  = 
                   2009:                ( (u64_t) bcm_rxret_ring[l_rxret_cons_u32].m_hostaddr_st.m_hi_u32 << 32 );
                   2010:                l_cpyaddr_u64 += 
                   2011:                ( (u64_t) bcm_rxret_ring[l_rxret_cons_u32].m_hostaddr_st.m_lo_u32 );
                   2012: 
                   2013: // FIXME:
                   2014:                if(l_cpyaddr_u64 == 0) {
                   2015: #ifdef BCM_DEBUG
                   2016:                        printk("bcm57xx: NULL address\n");
                   2017: #endif
                   2018:                        return 0;
                   2019:                }
                   2020: // 
                   2021:                memcpy( (void *) f_buffer_pc,
                   2022:                        (void *) l_cpyaddr_u64,
                   2023:                        (size_t) l_ret_i );
                   2024: 
                   2025:        }
                   2026: 
                   2027:        /*
                   2028:         * replenish bd to producer ring
                   2029:         */
                   2030:        bcm_rxprod_ring[l_rxprod_prod_u32] =
                   2031:                                        bcm_rxret_ring[l_rxret_cons_u32];
                   2032:         bcm_rxprod_ring[l_rxprod_prod_u32].m_idxlen_u32 = 
                   2033:                                        ( l_rxprod_prod_u32 << 16 );
                   2034:        bcm_rxprod_ring[l_rxprod_prod_u32].m_idxlen_u32 +=
                   2035:                                        (u32_t) BCM_BUF_SIZE;
                   2036: 
                   2037:         /*
                   2038:          * update producer ring's producer index
                   2039:          */
                   2040:         l_rxprod_prod_u32 = ( l_rxprod_prod_u32 + 1 ) & ( BCM_RXPROD_RING_SIZE - 1 );
                   2041: 
                   2042:         /*
                   2043:          * move to the next bd in return ring
                   2044:          */
                   2045:         l_rxret_cons_u32 = ( l_rxret_cons_u32 + 1 ) & (  bcm_rxret_ring_sz - 1 );
                   2046: 
                   2047:        /*
                   2048:         * synchronize before new indices are send to NIC
                   2049:         */
                   2050:        mb();
                   2051: 
                   2052:         /*
                   2053:          * write back new indices
                   2054:          */
                   2055:         bcm_write_reg32( RXRET_CONS_IND,  l_rxret_cons_u32  );
                   2056:         bcm_write_reg32( RXPROD_PROD_IND, l_rxprod_prod_u32 );
                   2057: 
                   2058: #ifdef BCM_DEBUG
                   2059: #ifdef BCM_SHOW_RCV
                   2060:        if( l_ret_i != 0 ) {
                   2061:                printk( "bcm57xx: received bytes: %d\n", l_ret_i );
                   2062:        }
                   2063: #ifdef BCM_SHOW_RCV_DATA
                   2064:        for( i = 0, j = 0; i < l_ret_i; i++ ) {
                   2065:                printk( "%02X ", ( u32_t ) f_buffer_pc[i] );
                   2066: 
                   2067:                if( ( ++j % 0x18 ) == 0 ) {
                   2068:                        printk( "\n" );
                   2069:                }
                   2070:        }
                   2071: 
                   2072:        if( ( i % 0x18 ) != 0 ) {
                   2073:                printk( "\n" );
                   2074:        }
                   2075: #endif
                   2076: #endif
                   2077: #endif
                   2078: 
                   2079:         /*
                   2080:          * return packet length
                   2081:          */
                   2082:         return l_ret_i;
                   2083: }
                   2084: 
                   2085: static int
                   2086: bcm_xmit( char *f_buffer_pc, int f_len_i )
                   2087: {
                   2088:        u32_t l_tx_cons_u32 = bcm_read_reg32( TX_CONS_IND );
                   2089:        u32_t l_tx_prod_u32 = bcm_read_reg32( TX_PROD_IND );
                   2090:        u64_t l_cpyaddr_u64;
                   2091: 
                   2092: #ifdef BCM_DEBUG
                   2093: #ifdef BCM_SHOW_XMIT_DATA
                   2094:        int i, j;
                   2095: #endif
                   2096: #ifdef BCM_SHOW_IDX
                   2097:        printk( "\n" );
                   2098:        printk( "bcm57xx: TX_PROD_IND    : 0x%03X\n", l_tx_prod_u32 );
                   2099:        printk( "bcm57xx: TX_CONS_IND    : 0x%03X\n", l_tx_cons_u32 );
                   2100:        printk( "bcm57xx: RXPROD_PROD_IND: 0x%03X\n", bcm_read_reg32( RXPROD_PROD_IND ) );
                   2101:        printk( "bcm57xx: RXPROD_CONS_IND: 0x%03X\n", bcm_read_reg32( RXPROD_CONS_IND ) );
                   2102:        printk( "bcm57xx: RXRET_PROD_IND : 0x%03X\n", bcm_read_reg32( RXRET_PROD_IND ) );
                   2103:        printk( "bcm57xx: RXRET_CONS_IND : 0x%03X\n", bcm_read_reg32( RXRET_CONS_IND ) );
                   2104:        printk( "bcm57xx: available txb  : 0x%03X\n", bcm_tx_bufavail_u32 );
                   2105: #endif
                   2106: #ifdef BCM_SHOW_STATS
                   2107:        printk( "bcm57xx: bcm_status.m_st_word_u32:    %08X\n",               bcm_status.m_st_word_u32 );
                   2108:        printk( "bcm57xx: bcm_status.m_st_tag_u32 :    %08X\n",               bcm_status.m_st_tag_u32 );
                   2109:        printk( "bcm57xx: bcm_status.m_rxprod_cons_u16:    %04X\n", ( u32_t ) bcm_status.m_rxprod_cons_u16 );
                   2110:        printk( "bcm57xx: bcm_status.m_unused_u16:         %04X\n", ( u32_t ) bcm_status.m_unused_u16 );
                   2111:        printk( "bcm57xx: bcm_status.m_unused_u32:     %08X\n",               bcm_status.m_unused_u32 );
                   2112:        printk( "bcm57xx: bcm_status.m_tx_cons_u16:        %04X\n", ( u32_t ) bcm_status.m_tx_cons_u16 );
                   2113:        printk( "bcm57xx: bcm_status.m_rxret_prod_u16:     %04X\n", ( u32_t ) bcm_status.m_rxret_prod_u16 );
                   2114: #endif
                   2115: #endif
                   2116: 
                   2117:        bcm_handle_events();
                   2118: 
                   2119:        /*
                   2120:         * make all consumed bd's available in the ring again
                   2121:         * this way only a few buffers are needed instead of
                   2122:         * having 512 buffers allocated
                   2123:         */
                   2124:        while( bcm_tx_start_u32 != l_tx_cons_u32 ) {
                   2125:                bcm_tx_ring[bcm_tx_stop_u32] = bcm_tx_ring[bcm_tx_start_u32];
                   2126:                bcm_tx_stop_u32  = ( bcm_tx_stop_u32  + 1 ) & ( BCM_TX_RING_SIZE - 1 );
                   2127:                bcm_tx_start_u32 = ( bcm_tx_start_u32 + 1 ) & ( BCM_TX_RING_SIZE - 1 );
                   2128:                bcm_tx_bufavail_u32++;
                   2129:        }
                   2130: 
                   2131:        /*
                   2132:         * check for tx buffer availability
                   2133:         */
                   2134:        if( bcm_tx_bufavail_u32 == 0 ) {
                   2135: #ifdef BCM_DEBUG
                   2136:                printk( "bcm57xx: no more transmit buffers available\n" );
                   2137: #endif
                   2138:                return 0;
                   2139:        }
                   2140: 
                   2141:        /*
                   2142:         * setup next available bd in tx ring
                   2143:         */
                   2144:        bcm_tx_ring[l_tx_prod_u32].m_lenflags_u32  = ( BIT32( 2 ) | BIT32( 7 ) /*| BIT32( 6 )*/ );
                   2145:        bcm_tx_ring[l_tx_prod_u32].m_lenflags_u32 += ( (u32_t) f_len_i << 16 );
                   2146: //     bcm_tx_ring[l_tx_prod_u32].m_VLANtag_u32   = BCM_VLAN_TAG;
                   2147: 
                   2148:        l_cpyaddr_u64  = ( (u64_t) bcm_tx_ring[l_tx_prod_u32].m_hostaddr_st.m_hi_u32 << 32 );
                   2149:        l_cpyaddr_u64 += ( (u64_t) bcm_tx_ring[l_tx_prod_u32].m_hostaddr_st.m_lo_u32 );
                   2150: 
                   2151: #ifdef BCM_DEBUG
                   2152: #ifdef BCM_SHOW_XMIT_STATS
                   2153:        printk("bcm57xx: xmit: l_cpyaddr_u64: 0x%lx\n", l_cpyaddr_u64 );
                   2154:        printk("               f_buffer_pc  : 0x%lx\n", f_buffer_pc );
                   2155:        printk("               f_len_i      : %d\n", f_len_i );
                   2156: #endif
                   2157: #endif
                   2158:        memcpy( (void *) l_cpyaddr_u64, (void *) f_buffer_pc, (size_t) f_len_i );
                   2159: 
                   2160:        /*
                   2161:         * update tx producer index & available buffers
                   2162:         */
                   2163:        l_tx_prod_u32 = ( l_tx_prod_u32 + 1 ) & ( BCM_TX_RING_SIZE - 1 );
                   2164:        bcm_tx_bufavail_u32--;
                   2165: 
                   2166:        /*
                   2167:         * synchronize before new index is send to NIC
                   2168:         */
                   2169:        mb();
                   2170: 
                   2171:        bcm_write_reg32( TX_PROD_IND, l_tx_prod_u32 );
                   2172: 
                   2173: #ifdef BCM_DEBUG
                   2174: #ifdef BCM_SHOW_XMIT
                   2175:        printk( "bcm57xx: sent bytes: %d\n", f_len_i );
                   2176: #ifdef BCM_SHOW_XMIT_DATA
                   2177:        for( i = 0, j = 0; i < f_len_i; i++ ) {
                   2178:                printk( "%02X ", ( u32_t ) f_buffer_pc[i] );
                   2179: 
                   2180:                if( ( ++j % 0x18 ) == 0 ) {
                   2181:                        printk( "\n" );
                   2182:                }
                   2183: 
                   2184:        }
                   2185:        if( ( i % 0x18 ) != 0 ) {
                   2186:                printk( "\n" );
                   2187:        }
                   2188: #endif
                   2189: #endif
                   2190: 
                   2191: #ifdef BCM_SHOW_STATS
                   2192:        // coalesce status block now
                   2193:        bcm_setb_reg32( HOST_COAL_MODE_R, BIT32( 3 ) | BIT32( 1 ) );
                   2194: #endif
                   2195: 
                   2196: #endif
                   2197:        return f_len_i;
                   2198: }
                   2199: 
                   2200: int
                   2201: check_driver( pci_config_t *pci_conf )
                   2202: {
                   2203:        u64_t i;
                   2204: 
                   2205:        /*
                   2206:         * checks whether the driver is handling this device
                   2207:         * by verifying vendor & device id
                   2208:         * vendor id 0x14e4 == Broadcom
                   2209:         */
                   2210:         if( pci_conf->vendor_id != 0x14e4 ) {
                   2211: #ifdef BCM_DEBUG
                   2212:                printk( "bcm57xx: netdevice not supported, illegal vendor id\n" );
                   2213: #endif
                   2214:                return -1;
                   2215:        }
                   2216: 
                   2217:        for( i = 0; bcm_dev[i].m_dev_u32 != 0; i++ ) {
                   2218:                if( bcm_dev[i].m_dev_u32 == (u32_t) pci_conf->device_id ) {
                   2219:                        // success
                   2220:                        break;
                   2221:                }
                   2222:        }
                   2223: 
                   2224:        if(bcm_dev[i].m_dev_u32 == 0) {
                   2225: #ifdef BCM_DEBUG
                   2226:                printk( "bcm57xx: netdevice not supported, illegal device ID\n" );
                   2227: #endif
                   2228:                return -1;
                   2229:        }
                   2230: 
                   2231:        /*
                   2232:         * initialize static variables
                   2233:         */
                   2234:        bcm_device_u64 = bcm_dev[i].m_devmsk_u64;
                   2235:        bcm_rxret_ring_sz = 0;
                   2236:        bcm_baseaddr_u64  = 0;
                   2237:        bcm_memaddr_u64   = 0;
                   2238: 
                   2239:        bcm_tx_start_u32    = 0;
                   2240:        bcm_tx_stop_u32     = 0;
                   2241:        bcm_tx_bufavail_u32 = 0;
                   2242: 
                   2243:        bcm_pcicfg_puid  = pci_conf->puid;
                   2244:        bcm_pcicfg_bus   = pci_conf->bus;
                   2245:        bcm_pcicfg_devfn = pci_conf->devfn;
                   2246: 
                   2247:        return 0;
                   2248: }
                   2249: 
                   2250: static void
                   2251: bcm_wol_activate(void)
                   2252: {
                   2253: #ifdef BCM_DEBUG
                   2254:        u16_t reg_pwr_cap;
                   2255: #endif
                   2256:        u16_t reg_pwr_crtl;
                   2257:        u32_t wol_mode;
                   2258: 
                   2259:        wol_mode = bcm_read_reg32( WOL_MODE_R );
                   2260:        bcm_write_reg32( WOL_MODE_R, wol_mode | BIT32(0) );
                   2261: 
                   2262: #ifdef BCM_DEBUG
                   2263:        printk( "bcm57xx: WOL activating..." );
                   2264: #endif
                   2265: 
                   2266: //     bcm_write_mem32( BCM_NICDRV_STATE_MBX, NIC_FWDRV_STATE_WOL );
                   2267: //     ms_delay( 100 );
                   2268: 
                   2269: #ifdef BCM_DEBUG
                   2270:        reg_pwr_cap = snk_kernel_interface->pci_config_read( bcm_pcicfg_puid,
                   2271:                                                             2,
                   2272:                                                             bcm_pcicfg_bus,
                   2273:                                                             bcm_pcicfg_devfn,
                   2274:                                                             0x4a );
                   2275:        printk( "bcm57xx: PM Capability Register: %04X\n", reg_pwr_cap );
                   2276: #endif
                   2277:        /* get curretn power control register */
                   2278:        reg_pwr_crtl = snk_kernel_interface->pci_config_read( bcm_pcicfg_puid,
                   2279:                                                              2,
                   2280:                                                              bcm_pcicfg_bus,
                   2281:                                                              bcm_pcicfg_devfn,
                   2282:                                                              0x4c );
                   2283: 
                   2284: #ifdef BCM_DEBUG
                   2285:        printk( "bcm57xx: PM Control/Status Register: %04X\n", reg_pwr_crtl );
                   2286: #endif
                   2287: 
                   2288:        /* switch to power state D0 */
                   2289:        reg_pwr_crtl |= 0x8000;
                   2290:        reg_pwr_crtl &= ~(0x0003);
                   2291:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   2292:                                                2,
                   2293:                                                bcm_pcicfg_bus,
                   2294:                                                bcm_pcicfg_devfn,
                   2295:                                                0x4c,
                   2296:                                                reg_pwr_crtl );
                   2297:        ms_delay(10);
                   2298: 
                   2299: /*
                   2300:        bcm_write_mem32( BCM_NICDRV_WOL_MBX, BCM_WOL_MAGIC_NUMBER |
                   2301:                                             NIC_WOLDRV_STATE_SHUTDOWN |
                   2302:                                             NIC_WOLDRV_WOL |
                   2303:                                             NIC_WOLDRV_SET_MAGIC_PKT );
                   2304: */
                   2305: 
                   2306:        /* switch to power state D3hot */
                   2307: /*
                   2308:        reg_pwr_crtl |= 0x0103;
                   2309:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   2310:                                                2,
                   2311:                                                bcm_pcicfg_bus,
                   2312:                                                bcm_pcicfg_devfn,
                   2313:                                                0x4c,
                   2314:                                                reg_pwr_crtl );
                   2315:        ms_delay(10);
                   2316: */
                   2317: 
                   2318: #ifdef BCM_DEBUG
                   2319:        reg_pwr_crtl = snk_kernel_interface->pci_config_read( bcm_pcicfg_puid,
                   2320:                                                              2,
                   2321:                                                              bcm_pcicfg_bus,
                   2322:                                                              bcm_pcicfg_devfn,
                   2323:                                                              0x4c );
                   2324: 
                   2325:        printk( "bcm57xx: PM Control/Status Register: %04X\n", reg_pwr_crtl );
                   2326: #endif
                   2327: 
                   2328: #ifdef BCM_DEBUG
                   2329:        printk( "bcm57xx: WOL activated" );
                   2330: #endif
                   2331: }
                   2332: 
                   2333: static int
                   2334: bcm_init( void )
                   2335: {
                   2336:        static const u32_t  lc_Maxwait_u32 = (u32_t) 1000;
                   2337:        u32_t               l_baseaddrL_u32;
                   2338:        u32_t               l_baseaddrH_u32;
                   2339:        u32_t               i;
                   2340:        char               *mac_addr = snk_module_interface.mac_addr;
                   2341: 
                   2342:        if(snk_module_interface.running != 0) {
                   2343:                return 0;
                   2344:        }
                   2345: #ifdef BCM_DEBUG
                   2346:        printk( "bcm57xx: detected device " );
                   2347:        if( IS_5703 ) {
                   2348:                printk( "5703S\n" );
                   2349:        } else if( IS_5704 ) {
                   2350:                printk( "5704" );
                   2351: 
                   2352:                if( IS_SERDES ) {
                   2353:                        printk( "S\n" );
                   2354:                } else {
                   2355:                        printk( "C\n" );
                   2356:                }
                   2357: 
                   2358:        } else if( IS_5714 ) {
                   2359:                printk( "5714\n" );
                   2360:        }
                   2361: #endif
                   2362:        /*
                   2363:         * setup register & memory base addresses of NIC
                   2364:         */
                   2365:        l_baseaddrL_u32 = ( (u32_t) ~0xf &
                   2366:              (u32_t) snk_kernel_interface->pci_config_read( bcm_pcicfg_puid,
                   2367:                                                             4,
                   2368:                                                             bcm_pcicfg_bus,
                   2369:                                                             bcm_pcicfg_devfn,
                   2370:                                                             PCI_BAR1_R ) );
                   2371: 
                   2372:        l_baseaddrH_u32 = 
                   2373:              (u32_t) snk_kernel_interface->pci_config_read( bcm_pcicfg_puid,
                   2374:                                                             4,
                   2375:                                                             bcm_pcicfg_bus,
                   2376:                                                             bcm_pcicfg_devfn,
                   2377:                                                             PCI_BAR2_R );
                   2378:        bcm_baseaddr_u64   = (u64_t) l_baseaddrH_u32;
                   2379:        bcm_baseaddr_u64 <<= 32;
                   2380:        bcm_baseaddr_u64  += (u64_t) l_baseaddrL_u32;
                   2381:        snk_kernel_interface->translate_addr(((void *)&(bcm_baseaddr_u64)));
                   2382:        bcm_memaddr_u64    = bcm_baseaddr_u64 + BCM_MEMORY_OFFS;
                   2383: 
                   2384: #ifdef BCM_DEBUG
                   2385:        printk( "bcm57xx: PCI-Puid  = 0x%X\n", bcm_pcicfg_puid );
                   2386:        printk( "bcm57xx: PCI-Bus   = 0x%X\n", bcm_pcicfg_bus );
                   2387:        printk( "bcm57xx: PCI-DevFn = 0x%X\n", bcm_pcicfg_devfn );
                   2388:        printk( "bcm57xx: device's register base high address = 0x%08X\n", l_baseaddrH_u32 );
                   2389:        printk( "bcm57xx: device's register base low address  = 0x%08X\n", l_baseaddrL_u32 );
                   2390:        printk( "bcm57xx: device's register address           = 0x%lx\n", bcm_baseaddr_u64 );
                   2391: #endif
                   2392: 
                   2393:        /*
                   2394:         * 57xx hardware initialization
                   2395:         * BCM57xx Programmer's Guide: Section 8, "Initialization"
                   2396:         * steps 1 through 101
                   2397:         */
                   2398: 
                   2399:        // step 1: enable bus master & memory space in command reg
                   2400:        i = ( BIT32( 10 ) | BIT32( 2 ) | BIT32( 1 ) );
                   2401:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   2402:                                                2,
                   2403:                                                bcm_pcicfg_bus,
                   2404:                                                bcm_pcicfg_devfn,
                   2405:                                                PCI_COM_R,
                   2406:                                                ( int ) i );
                   2407:        // step 2: disable & mask interrupts & enable pci byte/word swapping & enable indirect addressing mode
                   2408:        i = ( BIT32( 8 ) | BIT32( 7 ) | BIT32( 3 ) | BIT32( 2 ) | BIT32( 1 ) | BIT32( 0 ) );
                   2409: 
                   2410:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   2411:                                                4,
                   2412:                                                bcm_pcicfg_bus,
                   2413:                                                bcm_pcicfg_devfn,
                   2414:                                                PCI_MISC_HCTRL_R,
                   2415:                                                ( int ) i );
                   2416: 
                   2417:        /*
                   2418:         * from now on access may be made through the local
                   2419:         * read/write functions
                   2420:         */
                   2421: 
                   2422:        // step 3: Save ahche line size register
                   2423:        // omitted, because register is not used for 5704
                   2424: 
                   2425:        // step 4: acquire the nvram lock
                   2426:        if( bcm_nvram_lock() != 0 ) {
                   2427: #ifdef BCM_DEBUG
                   2428:                printk( "bcm57xx: locking NVRAM failed\n" );
                   2429: #endif
                   2430:                return -1;
                   2431:        }
                   2432: 
                   2433:        // step 5: prepare the chip for writing TG3_MAGIC_NUMBER
                   2434:        bcm_setb_reg32( MEMARB_MODE_R, BIT32( 1 ) );
                   2435:        i = ( BIT32( 8 ) | BIT32( 7 ) | BIT32( 3 ) | BIT32( 2 ) | BIT32( 1 ) | BIT32( 0 ) );
                   2436:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   2437:                                                4,
                   2438:                                                bcm_pcicfg_bus,
                   2439:                                                bcm_pcicfg_devfn,
                   2440:                                                PCI_MISC_HCTRL_R,
                   2441:                                                ( int ) i );
                   2442:        bcm_write_reg32( MODE_CTRL_R, BIT32( 23 ) | BIT32( 20 ) |
                   2443:                                      BIT32( 17 ) | BIT32( 16 ) |
                   2444:                                      BIT32( 14 ) | BIT32( 13 ) |
                   2445:                                      BIT32(  5 ) | BIT32(  4 ) |
                   2446:                                      BIT32(  2 ) | BIT32(  1 ) );
                   2447: 
                   2448:        // step 6: write TG3_MAGIC_NUMBER
                   2449:        bcm_write_mem32( BCM_FW_MBX, BCM_MAGIC_NUMBER );
                   2450: 
                   2451:        // step 7: reset core clocks
                   2452: 
                   2453:        if( IS_5714 ) {
                   2454:                bcm_setb_reg32( MISC_CFG_R, BIT32( 26 ) | BIT32( 0 ) );
                   2455:        } else {
                   2456:                bcm_setb_reg32( MISC_CFG_R, BIT32( 0 ) );
                   2457:        }
                   2458:        // step 8
                   2459:        ms_delay( 20 );
                   2460: 
                   2461:        // step 9: disable & mask interrupts & enable indirect addressing mode &
                   2462:        //              enable pci byte/word swapping initialize the misc host control register
                   2463:        i = ( BIT32( 8 ) | BIT32( 7 ) | BIT32( 3 ) | BIT32( 2 ) | BIT32( 1 ) | BIT32( 0 ) );
                   2464:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   2465:                                                4,
                   2466:                                                bcm_pcicfg_bus,
                   2467:                                                bcm_pcicfg_devfn,
                   2468:                                                PCI_MISC_HCTRL_R,
                   2469:                                                ( int ) i );
                   2470: 
                   2471:        // step 10: set but master et cetera
                   2472:        i = ( BIT32( 10 ) | BIT32( 2 ) | BIT32( 1 ) );
                   2473:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   2474:                                                2,
                   2475:                                                bcm_pcicfg_bus,
                   2476:                                                bcm_pcicfg_devfn,
                   2477:                                                PCI_COM_R,
                   2478:                                                ( int ) i );
                   2479: 
                   2480:        // step 11: disable PCI-X relaxed ordering
                   2481:        bcm_clrb_reg16( PCI_X_COM_R, BIT16( 1 ) );
                   2482: 
                   2483:        // step 12: enable the MAC memory arbiter
                   2484:        bcm_setb_reg32( MEMARB_MODE_R, BIT32( 1 ) );
                   2485: 
                   2486:        // step 13: omitted, only for BCM5700
                   2487:        // step 14: s. step 10
                   2488:        i = ( BIT32( 8 ) | BIT32( 7 ) | BIT32( 3 ) | BIT32( 2 ) | BIT32( 1 ) | BIT32( 0 ) );
                   2489:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   2490:                                                4,
                   2491:                                                bcm_pcicfg_bus,
                   2492:                                                bcm_pcicfg_devfn,
                   2493:                                                PCI_MISC_HCTRL_R,
                   2494:                                                ( int ) i );
                   2495:        // step 15: set byte swapping (incl. step 27/28/29/30)
                   2496:        // included prohibition of tx/rx interrupts
                   2497:        bcm_write_reg32( MODE_CTRL_R, BIT32( 23 ) | BIT32( 20 ) |
                   2498:                                      BIT32( 17 ) | BIT32( 16 ) |
                   2499:                                      BIT32( 14 ) | BIT32( 13 ) |
                   2500:                                      BIT32(  5 ) | BIT32(  4 ) |
                   2501:                                      BIT32(  2 ) | BIT32(  1 ) );
                   2502:        // step 16: omitted
                   2503:        i = 1000;
                   2504:        while( ( --i ) &&
                   2505:               ( bcm_read_mem32( BCM_FW_MBX ) != ~BCM_MAGIC_NUMBER ) ) {
                   2506: #ifdef BCM_DEBUG
                   2507:                printk( "." );
                   2508: #endif
                   2509:                ms_delay( 1 );
                   2510:        }
                   2511: 
                   2512:        // return on error
                   2513:        if( bcm_read_mem32( BCM_FW_MBX ) != ~BCM_MAGIC_NUMBER ) {
                   2514:                printk( "bootcode not loaded: %x\n", bcm_read_mem32( BCM_FW_MBX ) );
                   2515: #ifdef BCM_DEBUG
                   2516:                printk( "failed\n" );
                   2517: #endif
                   2518:                return -1;
                   2519:        }
                   2520: 
                   2521: 
                   2522:        // if ASF Firmware enabled
                   2523:        bcm_write_mem32( BCM_NICDRV_STATE_MBX, NIC_FWDRV_STATE_START );
                   2524:        ms_delay( 10 );
                   2525: 
                   2526:        // step 17: write ethernet mac mode register
                   2527:        /*
                   2528:         * WY 07.02.07
                   2529:         * omitted for correct SOL function
                   2530:         */
                   2531:        /*
                   2532:        if( IS_SERDES ) {
                   2533:                bcm_write_reg32( ETH_MAC_MODE_R, (u32_t) 0xc );
                   2534:        } else {
                   2535:                bcm_write_reg32( ETH_MAC_MODE_R, (u32_t) 0x0 );
                   2536:        }
                   2537:        */
                   2538: 
                   2539:        // step 18/19: omitted
                   2540:        // step 20: enable hw bugfix for 5704
                   2541:        if( IS_5704 || IS_5703 ) {
                   2542:                bcm_setb_reg32( MSG_DATA_R, BIT32( 26 ) |
                   2543:                                            BIT32( 28 ) |
                   2544:                                            BIT32( 29 ) );
                   2545:        }
                   2546: 
                   2547:        // step 21: omitted
                   2548:        // step 22: omitted
                   2549:        // step 23: 5704 clear statistics block
                   2550:        if( IS_5703 || IS_5704 ) {
                   2551:                memset_ci( (void *) ( bcm_memaddr_u64 + BCM_STATISTIC_OFFS ),
                   2552:                           0,
                   2553:                           BCM_STATISTIC_SIZE );
                   2554:        }
                   2555: 
                   2556:        // step 24/25: omitted
                   2557:        // step 26: set DMA Read/Write Control register
                   2558:        // NOTE: recommended values from the spec are used here
                   2559:        if( IS_5714 ) {
                   2560:                bcm_write_reg32( DMA_RW_CTRL_R, DMA_RW_CTRL_VAL_5714 );
                   2561:        } else {
                   2562:                u32_t l_PCIState_u32 = bcm_read_reg32( PCI_STATE_R );
                   2563:                u32_t l_DMAVal_u32   = DMA_RW_CTRL_VAL;
                   2564: 
                   2565:                if( ( l_PCIState_u32 & BIT32( 2 ) ) != 0 ) {    // PCI
                   2566:                        l_DMAVal_u32 |= (u32_t) 0x300000;
                   2567:                } else {                                        // PCI-X
                   2568:                        l_DMAVal_u32 |= (u32_t) 0x900000;
                   2569: 
                   2570:                        if( ( bcm_read_reg32( PCI_CLK_CTRL_R ) & (u32_t) 0x1f )
                   2571:                            >= (u32_t) 6 ) {
                   2572:                                l_DMAVal_u32 |= (u32_t) 0x4000;
                   2573:                        }
                   2574: 
                   2575:                }
                   2576: 
                   2577:                bcm_write_reg32( DMA_RW_CTRL_R, l_DMAVal_u32 );
                   2578:        }
                   2579: 
                   2580:        // step 27/28/29: s. step 14
                   2581: 
                   2582:        // step 30: Configure TCP/UDP pseudo header checksum offloading
                   2583:        // already done in step 14: offloading disabled
                   2584: 
                   2585:        // step 31: setup timer prescaler
                   2586:        i  = bcm_read_reg32( MISC_CFG_R );
                   2587:        i &= (u32_t) ~0xfe;   // clear bits 7-1 first
                   2588:        i |= ( BCM_TMR_PRESCALE << 1 );
                   2589:        bcm_write_reg32( MISC_CFG_R, i );
                   2590: 
                   2591:        // step 32: 5703/4 configure Mbuf pool address/length
                   2592:        // step 33: 5703/4 configure MAC DMA resource pool
                   2593:        // step 34: configure MAC memory pool watermarks
                   2594:        // step 35: 5703/4 configure DMA resource watermarks
                   2595:        //          using recommended settings (hard coded)
                   2596:        if( IS_5703 || IS_5704 ) {
                   2597: 
                   2598:                if( IS_5703 ) {
                   2599:                        bcm_write_reg32( MBUF_POOL_ADDR_R, (u32_t) 0x8000 );
                   2600:                        bcm_write_reg32( MBUF_POOL_LEN_R,  (u32_t) 0x18000 );
                   2601:                } else {
                   2602:                        bcm_write_reg32( MBUF_POOL_ADDR_R, (u32_t) 0x10000 );
                   2603:                        bcm_write_reg32( MBUF_POOL_LEN_R,  (u32_t) 0x10000 );
                   2604:                }
                   2605: 
                   2606:                bcm_write_reg32( DMA_DESC_POOL_ADDR_R,   (u32_t) 0x2000 );
                   2607:                bcm_write_reg32( DMA_DESC_POOL_LEN_R,    (u32_t) 0x2000 );
                   2608: 
                   2609:                bcm_write_reg32( DMA_RMBUF_LOW_WMARK_R,  (u32_t) 0x50 );
                   2610:                bcm_write_reg32( MAC_RXMBUF_LOW_WMARK_R, (u32_t) 0x20 );
                   2611:                bcm_write_reg32( MBUF_HIGH_WMARK_R,      (u32_t) 0x60 );
                   2612: 
                   2613:                bcm_write_reg32( DMA_DESC_LOW_WM_R,      (u32_t)  5 );
                   2614:                bcm_write_reg32( DMA_DESC_HIGH_WM_R,     (u32_t) 10 );
                   2615:        } else {
                   2616:                bcm_write_reg32( DMA_RMBUF_LOW_WMARK_R,  (u32_t) 0x00 );
                   2617:                bcm_write_reg32( MAC_RXMBUF_LOW_WMARK_R, (u32_t) 0x10 );
                   2618:                bcm_write_reg32( MBUF_HIGH_WMARK_R,      (u32_t) 0x60 );
                   2619:        }
                   2620: 
                   2621:        // step 35: omitted
                   2622:        // step 36: Configure flow control behaviour
                   2623:        //          using recommended settings (hard coded)
                   2624:        bcm_write_reg32( LOW_WMARK_MAX_RXFRAM_R, (u32_t) 0x02 );
                   2625: 
                   2626:        // step 37/38: enable buffer manager & wait for successful start
                   2627:        bcm_setb_reg32( BUF_MAN_MODE_R, BIT32( 2 ) | BIT32( 1 ) );
                   2628: 
                   2629:        i = lc_Maxwait_u32;
                   2630:        while( ( --i ) &&
                   2631:               ( ( bcm_read_reg32( BUF_MAN_MODE_R ) & BIT32( 1 ) ) == 0 ) ) {
                   2632:                us_delay( 10 );
                   2633:        }
                   2634: 
                   2635:        // return on error
                   2636:        if( i == 0 ) {
                   2637: #ifdef BCM_DEBUG
                   2638:                printk( "bcm57xx: init step 38: enable buffer manager failed\n" );
                   2639: #endif
                   2640:                return -1;
                   2641:        }
                   2642: 
                   2643:        // step 39: enable internal hardware queues
                   2644:        bcm_write_reg32( FTQ_RES_R, (u32_t) ~0 );
                   2645:        bcm_write_reg32( FTQ_RES_R, (u32_t)  0 );
                   2646: 
                   2647:        // step 40/41/42: initialize rx producer ring
                   2648:        bcm_init_rxprod_ring();
                   2649: 
                   2650:        // step 43: set rx producer ring replenish threshhold
                   2651:        // using recommended setting of maximum allocated BD's/8
                   2652:        bcm_write_reg32( STD_RXPR_REP_THR_R, (u32_t) BCM_MAX_RX_BUF / 8 );
                   2653: 
                   2654:        // step 44/45/46: initialize send rings
                   2655:        bcm_init_tx_ring();
                   2656:        bcm_init_rxret_ring();
                   2657: 
                   2658:        // steps 47-50 done in ring init functions
                   2659:        // step 51: configure MAC unicast address
                   2660:        bcm_nvram_init();
                   2661:        if( bcm_mac_init( (u08_t *) mac_addr ) < 0 ) {
                   2662: #ifdef BCM_DEBUG
                   2663:                printk( "bcm57xx: init step 51: configure MAC unicast address failed\n" );
                   2664: #endif
                   2665:                return -1;
                   2666:        }
                   2667: 
                   2668:        // step 52: configure backoff random seed for transmit
                   2669:        // using recommended algorithm
                   2670:        i  = (u32_t) mac_addr[0] + (u32_t) mac_addr[1] +
                   2671:             (u32_t) mac_addr[2] + (u32_t) mac_addr[3] +
                   2672:             (u32_t) mac_addr[4] + (u32_t) mac_addr[5];
                   2673:        i &= (u32_t) 0x03ff; 
                   2674:        bcm_write_reg32( ETH_TX_RND_BO_R, i );
                   2675: 
                   2676:        // step 53: configure message transfer unit MTU size
                   2677:        bcm_write_reg32( RX_MTU_SIZE_R, (u32_t) BCM_MTU_MAX_LEN );
                   2678: 
                   2679:        // step 54: configure IPG for transmit
                   2680:        // using recommended value (through #define)
                   2681:        bcm_write_reg32( TX_MAC_LEN_R, TX_MAC_LEN_VAL );
                   2682: 
                   2683:        // step 55: configure receive rules
                   2684: 
                   2685:        // set RX rule default class
                   2686:        bcm_write_reg32( RX_RULE_CFG_R, RX_RULE_CFG_VAL );
                   2687: 
                   2688:        // step 56: configure the number of receive lists
                   2689:        bcm_write_reg32( RX_LST_PLACE_CFG_R, RX_LST_PLC_CFG_VAL );
                   2690:        bcm_write_reg32( RX_LST_PLACE_STAT_EN_R, RX_LST_PLC_STAT_EN_VAL );
                   2691: 
                   2692: /*
                   2693:        // rule 1: accept frames for our MAC address
                   2694:        bcm_write_reg32( RX_RULE_CTRL_R ( 0 ),
                   2695:                         BIT32( 31 ) |  // enable rule
                   2696:                         BIT32( 30 ) |  // and with next
                   2697:                         BIT32( 26 ) |  // split value register
                   2698:                         BIT32(  8 ) ); // class 1
                   2699:        bcm_write_reg32( RX_RULE_VAL_R  ( 0 ),
                   2700:                         (u32_t) 0xffff0000 |
                   2701:                         ( bcm_read_reg32( MAC_ADDR_OFFS_HI(0) ) &
                   2702:                           (u32_t) 0xffff ) );
                   2703: 
                   2704:        bcm_write_reg32( RX_RULE_CTRL_R ( 1 ),
                   2705:                         BIT32( 31 ) |  // enable rule
                   2706:                         BIT32(  8 ) |  // class 1
                   2707:                         BIT32(  1 ) ); // offset 2
                   2708:        bcm_write_reg32( RX_RULE_VAL_R  ( 1 ),
                   2709:                         bcm_read_reg32( MAC_ADDR_OFFS_LO(0) ) );
                   2710: 
                   2711:        // rule 2: accept broadcast frames
                   2712:        bcm_write_reg32( RX_RULE_CTRL_R ( 2 ),
                   2713:                         BIT32( 31 ) |  // enable rule
                   2714:                         BIT32( 30 ) |  // and with next
                   2715:                         BIT32( 26 ) |  // split value register
                   2716:                         BIT32(  8 ) ); // class 1
                   2717:        bcm_write_reg32( RX_RULE_VAL_R  ( 2 ),
                   2718:                         (u32_t) ~0 );
                   2719: 
                   2720:        bcm_write_reg32( RX_RULE_CTRL_R ( 3 ),
                   2721:                         BIT32( 31 ) |  // enable rule
                   2722:                         BIT32(  8 ) |  // class 1
                   2723:                         BIT32(  1 ) ); // offset 2
                   2724:        bcm_write_reg32( RX_RULE_VAL_R  ( 3 ),
                   2725:                         (u32_t) ~0 );
                   2726: */
                   2727:        for( i=0; i<NUM_RX_RULE_ASF; ++i) {
                   2728:                bcm_write_reg32( RX_RULE_CTRL_R ( i ),  0 );
                   2729:                bcm_write_reg32( RX_RULE_VAL_R  ( i ),  0 );
                   2730:        }
                   2731: 
                   2732:        // step 57-60: enable rx/tx statistics
                   2733:        // omitted, no need for statistics (so far)
                   2734: 
                   2735:        // step 61/62: disable host coalescing engine/wait 20ms
                   2736:        bcm_write_reg32( HOST_COAL_MODE_R, (u32_t) 0 );
                   2737: 
                   2738:        i = lc_Maxwait_u32 * 2;
                   2739:        while( ( --i ) &&
                   2740:               ( bcm_read_reg32( HOST_COAL_MODE_R ) != 0 ) ) {
                   2741:                us_delay( 10 );
                   2742:        }
                   2743: 
                   2744:        // return on error
                   2745:        if( i == 0 ) {
                   2746: #ifdef BCM_DEBUG
                   2747:                printk( "bcm57xx: init step 62: disable host coal. engine failed\n" );
                   2748: #endif
                   2749:                return -1;
                   2750:        }
                   2751: 
                   2752:        // step 63-66: initialize coalescing engine
                   2753:        // NOTE: status block is unused in this driver,
                   2754:        //       therefore the coal. engine status block
                   2755:        //       automatic update is disabled (by writing
                   2756:        //       0 to every counter
                   2757:        bcm_write_reg32( RX_COAL_TICKS_R, 0 );
                   2758:        bcm_write_reg32( TX_COAL_TICKS_R, 0 );
                   2759:        bcm_write_reg32( RX_COAL_MAX_BD_R, 0 );
                   2760:        bcm_write_reg32( TX_COAL_MAX_BD_R, 0 );
                   2761:        bcm_write_reg32( RX_COAL_TICKS_INT_R, 0 );
                   2762:        bcm_write_reg32( TX_COAL_TICKS_INT_R, 0 );
                   2763:        bcm_write_reg32( RX_COAL_MAX_BD_INT_R, 0 );
                   2764:        bcm_write_reg32( TX_COAL_MAX_BD_INT_R, 0 );
                   2765: 
                   2766:        // step 67: initialize host status block address
                   2767:        // NOTE: status block is not needed in this driver,
                   2768:        //       still it needs to be set up
                   2769:        i = (u32_t) ( (u64_t) &bcm_status >> 32 );
                   2770:        bcm_write_reg32( STB_HOST_ADDR_HI_R, i );
                   2771:        i = (u32_t) ( (u64_t) &bcm_status & (u64_t) 0xffffffff );
                   2772:        bcm_write_reg32( STB_HOST_ADDR_LO_R, i );
                   2773: 
                   2774:        // 5704/3 adaption
                   2775:        if( IS_5703 || IS_5704 ) {
                   2776:                // step 68: 5704, for now omitted
                   2777:                // step 69: 5704 set the statistics coalescing tick counter
                   2778:                bcm_write_reg32( STAT_TICK_CNT_R, 0 );
                   2779:                // step 70: 5704 configure statistics block address in NIC memory
                   2780:                //          using recommended values (hard coded)
                   2781:                bcm_write_reg32( STAT_NIC_ADDR_R, (u32_t) 0x300 );
                   2782:                // step 71: 5704 configure status block address in NIC memory
                   2783:                //          using recommended values (hard coded)
                   2784:                bcm_write_reg32( STB_NIC_ADDR_R, (u32_t) 0xb00 );
                   2785:        }
                   2786: 
                   2787:        // step 72: enable host coalescing engine
                   2788:        bcm_setb_reg32( HOST_COAL_MODE_R, BIT32( 12 ) | BIT32( 11 ) | BIT32( 1 ) );
                   2789: 
                   2790:        // step 73: enable rx bd completion functional block
                   2791:        bcm_write_reg32( RX_BD_COMPL_MODE_R, BIT32( 1 ) | BIT32( 2 ) );
                   2792: 
                   2793:        // step 74: enable rx list placement functional block
                   2794:        bcm_write_reg32( RX_LST_PLACE_MODE_R, BIT32( 1 ) );
                   2795:        // 5704/3 adaption
                   2796:        if( IS_5703 || IS_5704 ) {
                   2797:                // step 75: 5704/3 enable receive list selector func block
                   2798:                bcm_write_reg32( RX_LST_SEL_MODE_R, BIT32( 1 ) | BIT32( 2 ) );
                   2799:        }
                   2800: 
                   2801:        // step 76: enable DMA engines
                   2802:        bcm_setb_reg32( ETH_MAC_MODE_R, BIT32( 23 ) | BIT32( 22 ) | BIT32( 21 ) );
                   2803:        /*
                   2804:         * WY 26.10.07 This is wrong for 5714, better leave it alone
                   2805:        if( IS_5714 ) {
                   2806:                bcm_setb_reg32( ETH_MAC_MODE_R, BIT32( 20 ) );
                   2807:        }
                   2808:        */
                   2809: 
                   2810:        // step 77: omitted, statistics are not used
                   2811:        // step 78: Configure the General Misc Local Control register
                   2812:        // NOTE:    as known so far nothing needs to be done here,
                   2813:        //          default values should work fine
                   2814:        //bcm_setb_reg32( MISC_LOCAL_CTRL_R, 0 );
                   2815: 
                   2816:        // step 79: clear interrupts in INT_MBX0_R low word
                   2817:        bcm_write_reg32( INT_MBX0_R, 0 );
                   2818:        // 5704/3 adaption
                   2819:        // step 80: 5704/3 enable DMA completion functional block
                   2820:        if( IS_5703 || IS_5704 ) {
                   2821:                bcm_write_reg32( DMA_COMPL_MODE_R, BIT32( 1 ) );
                   2822:        }
                   2823: 
                   2824:        // step 81/82: configure write/read DMA mode registers
                   2825:        //             disable MSI
                   2826:        bcm_write_reg32( RD_DMA_MODE_R, BIT32( 10 ) | BIT32( 9 ) | BIT32( 8 ) |
                   2827:                                        BIT32(  7 ) | BIT32( 6 ) | BIT32( 5 ) |
                   2828:                                        BIT32(  4 ) | BIT32( 3 ) | BIT32( 2 ) |
                   2829:                                        BIT32(  1 ) );
                   2830:        bcm_write_reg32( WR_DMA_MODE_R, BIT32( 9 ) | BIT32( 8 ) | BIT32( 7 ) |
                   2831:                                        BIT32( 6 ) | BIT32( 5 ) | BIT32( 4 ) |
                   2832:                                        BIT32( 3 ) | BIT32( 2 ) | BIT32( 1 ) );
                   2833:        bcm_clrb_reg32( MSI_MODE_R,     BIT32( 1 ) );
                   2834:        us_delay( 100 );
                   2835: 
                   2836:        // step 83-91: enable all these functional blocks...
                   2837:        bcm_write_reg32( RX_DAT_COMPL_MODE_R,   BIT32( 1 ) | BIT32( 2 ) );
                   2838: 
                   2839:        if( IS_5703 || IS_5704 ) {
                   2840:                bcm_write_reg32( MBUF_CLSTR_FREE_MODE_R, BIT32( 1 ) );
                   2841:        }
                   2842: 
                   2843:        bcm_write_reg32( TX_DAT_COMPL_MODE_R,   BIT32( 1 ) );
                   2844:        bcm_write_reg32( TX_BD_COMPL_MODE_R,    BIT32( 1 ) | BIT32( 2 ) );
                   2845:        bcm_write_reg32( RX_BD_INIT_MODE_R,     BIT32( 1 ) | BIT32( 2 ) );
                   2846:        bcm_write_reg32( RX_DAT_BD_INIT_MODE_R, BIT32( 1 ) );
                   2847:        bcm_write_reg32( TX_DAT_INIT_MODE_R,    BIT32( 1 ) | BIT32( 3 ) );
                   2848:        bcm_write_reg32( TX_BD_INIT_MODE_R,     BIT32( 1 ) | BIT32( 2 ) );
                   2849:        bcm_write_reg32( TX_BD_RING_SEL_MODE_R, BIT32( 1 ) | BIT32( 2 ) );
                   2850: 
                   2851:        // step 92: omitted
                   2852:        // step 93/94: Enable Tx/Rx MAC
                   2853:        bcm_setb_reg32( TX_MAC_MODE_R, BIT32( 1 ) );
                   2854: //     bcm_setb_reg32( RX_MAC_MODE_R, BIT32( 1 ) | BIT32( 2 ) );       // set BIT32( 8 ) for promiscious mode!
                   2855:        bcm_setb_reg32( RX_MAC_MODE_R, BIT32( 1 ) );    // set BIT32( 8 ) for promiscious mode!
                   2856:                                                        // set BIT32( 10) for VLAN
                   2857: 
                   2858:        // step 95: disable auto polling:
                   2859:        //          bcm_phy_init takes care of this
                   2860:        // step 96: omitted
                   2861:        // step 97: omitted, may change though, but is not important
                   2862:        // step 98: activate link & enable MAC functional block
                   2863:        // NOTE     autopolling is enabled so bit 0 needs not to be set
                   2864:        //bcm_setb_reg32( MI_STATUS_R, BIT32( 0 ) );
                   2865: 
                   2866:        // step 99: setup PHY
                   2867:        // return if link is down
                   2868:        if( bcm_phy_init() < 0 ) {
                   2869: #ifdef BCM_DEBUG
                   2870:                printk( "bcm57xx: init step 99: PHY initialization failed\n" );
                   2871: #endif
                   2872:                return -1;
                   2873:        }
                   2874: 
                   2875:        // step 100: setup multicast filters
                   2876:        bcm_write_reg32( MAC_HASH0_R, (u32_t) 0 );
                   2877:        bcm_write_reg32( MAC_HASH1_R, (u32_t) 0 );
                   2878:        bcm_write_reg32( MAC_HASH2_R, (u32_t) 0 );
                   2879:        bcm_write_reg32( MAC_HASH3_R, (u32_t) 0 );
                   2880: /*
                   2881:        // accept all multicast frames
                   2882:        bcm_write_reg32( MAC_HASH0_R, (u32_t) 0xffffffff );
                   2883:        bcm_write_reg32( MAC_HASH1_R, (u32_t) 0xffffffff );
                   2884:        bcm_write_reg32( MAC_HASH2_R, (u32_t) 0xffffffff );
                   2885:        bcm_write_reg32( MAC_HASH3_R, (u32_t) 0xffffffff );
                   2886: */
                   2887:        // step 101: omitted, no interrupts used
                   2888: 
                   2889:        // make initial receive buffers available for NIC
                   2890:        // this step has to be done here after RX DMA engine has started (step 94)
                   2891:        bcm_write_reg32( RXPROD_PROD_IND, BCM_MAX_RX_BUF );
                   2892: 
                   2893:        // if ASF Firmware enabled
                   2894:        bcm_write_mem32( BCM_NICDRV_STATE_MBX, NIC_FWDRV_STATE_START_DONE );
                   2895:        ms_delay( 10 );
                   2896: 
                   2897:        // enable heartbeat timer
                   2898: 
                   2899:        bcm_write_reg32( ASF_HEARTBEAT_TIMER_R, 0x5 );
                   2900: 
                   2901:        snk_module_interface.running = 1;
                   2902:        // off we go..
                   2903:        return 0;
                   2904: }
                   2905: 
                   2906: static int
                   2907: bcm_reset( void )
                   2908: {
                   2909:        u32_t i;
                   2910: 
                   2911: #ifdef BCM_DEBUG
                   2912:        printk( "bcm57xx: resetting controller.." );
                   2913: #endif
                   2914: 
                   2915:        bcm_write_mem32( BCM_FW_MBX, BCM_MAGIC_NUMBER );
                   2916: 
                   2917:        if( IS_5714 ) {
                   2918:                bcm_setb_reg32( MISC_CFG_R, BIT32( 26 ) | BIT32( 0 ) );
                   2919:        } else {
                   2920:                bcm_setb_reg32( MISC_CFG_R, BIT32( 0 ) );
                   2921:        }
                   2922: 
                   2923:        ms_delay( 20 );
                   2924: 
                   2925:        /*
                   2926:         * after reset local read/write functions cannot be used annymore
                   2927:         * until bus master & stuff is set up again
                   2928:         */
                   2929: 
                   2930:        i = ( BIT32( 10 ) | BIT32( 2 ) | BIT32( 1 ) );
                   2931:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   2932:                                                2,
                   2933:                                                bcm_pcicfg_bus,
                   2934:                                                bcm_pcicfg_devfn,
                   2935:                                                PCI_COM_R,
                   2936:                                                ( int ) i );
                   2937: 
                   2938:        // step 9 & 13: disable & mask interrupts & enable indirect addressing mode &
                   2939:        //              enable pci byte/word swapping initialize the misc host control register
                   2940:        i = ( BIT32( 7 ) | BIT32( 5 ) | BIT32( 4 ) |
                   2941:              BIT32( 3 ) | BIT32( 2 ) | BIT32( 1 ) | BIT32( 0 ) );
                   2942:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   2943:                                                4,
                   2944:                                                bcm_pcicfg_bus,
                   2945:                                                bcm_pcicfg_devfn,
                   2946:                                                PCI_MISC_HCTRL_R,
                   2947:                                                ( int ) i );
                   2948: 
                   2949:        // step 16: poll for bootcode completion by waiting for the one's
                   2950:        //          complement of the magic number previously written
                   2951:        i = 1000;
                   2952:        while( ( --i ) &&
                   2953:               ( bcm_read_mem32( BCM_FW_MBX ) != ~BCM_MAGIC_NUMBER ) ) {
                   2954: #ifdef BCM_DEBUG
                   2955:                printk( "." );
                   2956: #else
                   2957:                ms_delay( 1 );
                   2958: #endif
                   2959:        }
                   2960: 
                   2961:        // return on error
                   2962:        if( bcm_read_mem32( BCM_FW_MBX ) != ~BCM_MAGIC_NUMBER ) {
                   2963: #ifdef BCM_DEBUG
                   2964:                printk( "failed\n" );
                   2965: #endif
                   2966:                return -1;
                   2967:        }
                   2968: 
                   2969: #ifdef BCM_DEBUG
                   2970:        printk( "done\n" );
                   2971: #endif
                   2972:        return 0;
                   2973: }
                   2974: 
                   2975: static int
                   2976: bcm_term( void )
                   2977: {
                   2978:        u32_t i;
                   2979:        u16_t v;
                   2980: 
                   2981:        if(snk_module_interface.running == 0) {
                   2982:                return 0;
                   2983:        }
                   2984: 
                   2985: #ifdef BCM_DEBUG
                   2986:        printk( "bcm57xx: driver shutdown.." );
                   2987: #endif
                   2988: 
                   2989:        /*
                   2990:         * halt ASF firmware
                   2991:         */
                   2992:        bcm_fw_halt();
                   2993: 
                   2994:        /*
                   2995:         * unload ASF firmware
                   2996:         */
                   2997:        bcm_write_mem32( BCM_NICDRV_STATE_MBX, NIC_FWDRV_STATE_UNLOAD );
                   2998: 
                   2999:        /*
                   3000:         * disable RX producer rings
                   3001:         */
                   3002:        bcm_write_reg32( BCM_RCB_LENFLAG_u16(      BCM_RXPROD_RCB_JUM ), RCB_FLAG_RING_DISABLED );
                   3003:        bcm_write_reg32( BCM_RCB_HOSTADDR_HI_u16(  BCM_RXPROD_RCB_JUM ), 0 );
                   3004:        bcm_write_reg32( BCM_RCB_HOSTADDR_LOW_u16( BCM_RXPROD_RCB_JUM ), 0 );
                   3005:        bcm_write_reg32( BCM_RCB_NICADDR_u16(      BCM_RXPROD_RCB_JUM ), 0 );
                   3006: 
                   3007:        bcm_write_reg32( BCM_RCB_LENFLAG_u16(      BCM_RXPROD_RCB_STD ), RCB_FLAG_RING_DISABLED );
                   3008:        bcm_write_reg32( BCM_RCB_HOSTADDR_HI_u16(  BCM_RXPROD_RCB_STD ), 0 );
                   3009:        bcm_write_reg32( BCM_RCB_HOSTADDR_LOW_u16( BCM_RXPROD_RCB_STD ), 0 );
                   3010:        bcm_write_reg32( BCM_RCB_NICADDR_u16(      BCM_RXPROD_RCB_STD ), 0 );
                   3011: 
                   3012:        bcm_write_reg32( BCM_RCB_LENFLAG_u16(      BCM_RXPROD_RCB_MIN ), RCB_FLAG_RING_DISABLED );
                   3013:        bcm_write_reg32( BCM_RCB_HOSTADDR_HI_u16(  BCM_RXPROD_RCB_MIN ), 0 );
                   3014:        bcm_write_reg32( BCM_RCB_HOSTADDR_LOW_u16( BCM_RXPROD_RCB_MIN ), 0 );
                   3015:        bcm_write_reg32( BCM_RCB_NICADDR_u16(      BCM_RXPROD_RCB_MIN ), 0 );
                   3016: 
                   3017:        /*
                   3018:         * disable RX return rings
                   3019:         */
                   3020:        v = BCM_RXRET_RCB_OFFS;
                   3021:        for( i = 0; i < BCM_MAX_RXRET_RING; i++ ) {
                   3022:                bcm_write_mem32( BCM_RCB_LENFLAG_u16( v ),      RCB_FLAG_RING_DISABLED );
                   3023:                bcm_write_mem32( BCM_RCB_HOSTADDR_HI_u16( v ),  0 );
                   3024:                bcm_write_mem32( BCM_RCB_HOSTADDR_LOW_u16( v ), 0 );
                   3025:                bcm_write_mem32( BCM_RCB_NICADDR_u16( v ),      0 );
                   3026: 
                   3027:                v += BCM_RCB_SIZE_u16;
                   3028:         }
                   3029: 
                   3030:        /*
                   3031:         * disable TX rings
                   3032:         */
                   3033:         v = BCM_TX_RCB_OFFS;
                   3034:        for( i = 0; i < BCM_MAX_TX_RING; i++ ) {
                   3035:                bcm_write_mem32( BCM_RCB_LENFLAG_u16( v ),      RCB_FLAG_RING_DISABLED );
                   3036:                bcm_write_mem32( BCM_RCB_HOSTADDR_HI_u16( v ),  0 );
                   3037:                bcm_write_mem32( BCM_RCB_HOSTADDR_LOW_u16( v ), 0 );
                   3038:                bcm_write_mem32( BCM_RCB_NICADDR_u16( v ),      0 );
                   3039: 
                   3040:                v += BCM_RCB_SIZE_u16;
                   3041:        }
                   3042: 
                   3043:        /*
                   3044:         * remove receive rules
                   3045:         */
                   3046:        bcm_write_reg32( RX_RULE_CTRL_R (  0 ), 0 );
                   3047:        bcm_write_reg32( RX_RULE_VAL_R  (  0 ), 0 );
                   3048:        bcm_write_reg32( RX_RULE_CTRL_R (  1 ), 0 );
                   3049:        bcm_write_reg32( RX_RULE_VAL_R  (  1 ), 0 );
                   3050: 
                   3051:        /*
                   3052:         * shutdown sequence
                   3053:         * BCM57xx Programmer's Guide: Section 8, "Shutdown"
                   3054:         * the enable bit of every state machine of the 57xx
                   3055:         * has to be reset.
                   3056:         */
                   3057: 
                   3058:        /*
                   3059:         * receive path shutdown sequence
                   3060:         */
                   3061:        bcm_clr_wait_bit32( RX_MAC_MODE_R,         BIT32( 1 ) );
                   3062:        bcm_clr_wait_bit32( RX_LST_PLACE_MODE_R,   BIT32( 1 ) );
                   3063:        bcm_clr_wait_bit32( RX_BD_INIT_MODE_R,     BIT32( 1 ) );
                   3064:        bcm_clr_wait_bit32( RX_DAT_BD_INIT_MODE_R, BIT32( 1 ) );
                   3065:        bcm_clr_wait_bit32( RX_DAT_COMPL_MODE_R,   BIT32( 1 ) );
                   3066:        bcm_clr_wait_bit32( RX_BD_COMPL_MODE_R,    BIT32( 1 ) );
                   3067: 
                   3068:        if( IS_5704 || IS_5703 ) {
                   3069:                bcm_clr_wait_bit32( RX_LST_SEL_MODE_R, BIT32( 1 ) );
                   3070:        }
                   3071: 
                   3072:        /*
                   3073:         * transmit path & memory shutdown sequence
                   3074:         */
                   3075:        bcm_clr_wait_bit32( TX_BD_RING_SEL_MODE_R, BIT32( 1 ) );
                   3076:        bcm_clr_wait_bit32( TX_BD_INIT_MODE_R,     BIT32( 1 ) );
                   3077:        bcm_clr_wait_bit32( TX_DAT_INIT_MODE_R,    BIT32( 1 ) );
                   3078:        bcm_clr_wait_bit32( RD_DMA_MODE_R,         BIT32( 1 ) );
                   3079:        bcm_clr_wait_bit32( TX_DAT_COMPL_MODE_R,   BIT32( 1 ) );
                   3080: 
                   3081:        if( IS_5704 ) {
                   3082:                bcm_clr_wait_bit32( DMA_COMPL_MODE_R, BIT32( 1 ) );
                   3083:        }
                   3084: 
                   3085:        bcm_clr_wait_bit32( TX_BD_COMPL_MODE_R,    BIT32( 1 ) );
                   3086:        bcm_clr_wait_bit32( ETH_MAC_MODE_R,        BIT32( 21 ) );
                   3087:        bcm_clr_wait_bit32( TX_MAC_MODE_R,         BIT32( 1 ) );
                   3088: 
                   3089:        bcm_clr_wait_bit32( HOST_COAL_MODE_R,      BIT32( 1 ) );
                   3090:        bcm_clr_wait_bit32( WR_DMA_MODE_R,         BIT32( 1 ) );
                   3091: 
                   3092:        if( IS_5704 || IS_5703 ) {
                   3093:                bcm_clr_wait_bit32( MBUF_CLSTR_FREE_MODE_R, BIT32( 1 ) );
                   3094:        }
                   3095: 
                   3096:        bcm_write_reg32( FTQ_RES_R, (u32_t) ~0 );
                   3097:        bcm_write_reg32( FTQ_RES_R, (u32_t)  0 );
                   3098: 
                   3099:        if( IS_5704 || IS_5703 ) {
                   3100:                bcm_clr_wait_bit32( BUF_MAN_MODE_R, BIT32( 1 ) );
                   3101:                bcm_clr_wait_bit32( MEMARB_MODE_R,  BIT32( 1 ) );
                   3102:        }
                   3103: 
                   3104: #ifdef BCM_DEBUG
                   3105:        printk( "done.\n" );
                   3106: #endif
                   3107:        /*
                   3108:         * controller reset
                   3109:         */
                   3110:        if( bcm_reset() != 0 ) {
                   3111:                return -1;
                   3112:        }
                   3113: 
                   3114:        /*
                   3115:         * restart ASF firmware
                   3116:         */
                   3117:        bcm_write_mem32( BCM_NICDRV_STATE_MBX, NIC_FWDRV_STATE_UNLOAD );
                   3118:        ms_delay( 10 );
                   3119:        bcm_write_mem32( BCM_NICDRV_STATE_MBX, NIC_FWDRV_STATE_UNLOAD_DONE );
                   3120:        ms_delay( 100 );
                   3121:        bcm_write_mem32( BCM_NICDRV_STATE_MBX, NIC_FWDRV_STATE_START );
                   3122:        ms_delay( 10 );
                   3123:        bcm_write_mem32( BCM_NICDRV_STATE_MBX, NIC_FWDRV_STATE_START_DONE );
                   3124: 
                   3125:        /*
                   3126:         * activate Wake-on-LAN
                   3127:         */
                   3128:        bcm_wol_activate();
                   3129: 
                   3130:        /*
                   3131:         * PCI shutdown
                   3132:         */
                   3133:        bcm_clrb_reg32( PCI_MISC_HCTRL_R, BIT32( 3 ) | BIT32( 2 ) );
                   3134: 
                   3135:        /*
                   3136:         * from now on local rw functions cannot be used anymore
                   3137:         */
                   3138: 
                   3139: //     bcm_clrb_reg32( PCI_COM_R, BIT32( 10 ) | BIT32( 2 ) | BIT32( 1 ) );
                   3140: 
                   3141:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   3142:                                                2,
                   3143:                                                bcm_pcicfg_bus,
                   3144:                                                bcm_pcicfg_devfn,
                   3145:                                                PCI_COM_R,
                   3146:                                                BIT32(8) | BIT32(6) );
                   3147: 
                   3148:        // no more networking...
                   3149:        snk_module_interface.running = 0;
                   3150:        return 0;
                   3151: }
                   3152: 
                   3153: static int
                   3154: bcm_getmac(u32_t addr, char mac[6])
                   3155: {
                   3156:        u32_t t1, t2;
                   3157:        u64_t t3;
                   3158: 
                   3159:        if (bcm_nvram_read(addr, &t1, 1) != 0)
                   3160:                return -1;
                   3161:        if (bcm_nvram_read(addr+4, &t2, 1) != 0)
                   3162:                return -1;
                   3163:        t3 = ((u64_t)t1 << 32) + t2;
                   3164: 
                   3165:        mac[0] = (t3 >> 40) & 0xFF;
                   3166:        mac[1] = (t3 >> 32) & 0xFF;
                   3167:        mac[2] = (t3 >> 24) & 0xFF;
                   3168:        mac[3] = (t3 >> 16) & 0xFF;
                   3169:        mac[4] = (t3 >>  8) & 0xFF;
                   3170:        mac[5] = (t3 >>  0) & 0xFF;
                   3171: 
                   3172:        return 0;
                   3173: }
                   3174: 
                   3175: static char*
                   3176: print_itoa(char *text, u32_t value)
                   3177: {
                   3178:        if(value >= 10)
                   3179:                text = print_itoa(text, value / 10);
                   3180:        *text = '0' + (value % 10);
                   3181:        ++text;
                   3182:        return text;
                   3183: }
                   3184: 
                   3185: static int
                   3186: bcm_get_version(char *text)
                   3187: {
                   3188:        u32_t t1;
                   3189: 
                   3190:        if (bcm_nvram_read(0x94, &t1, 1) != 0)
                   3191:                return -1;
                   3192: 
                   3193:        text = print_itoa(text, (t1 >> 8) & 0xFF);
                   3194:        text[0] = '.';
                   3195:        text = print_itoa(&text[1], t1 & 0xFF);
                   3196:        text[0] = '\n';
                   3197:        return 0;
                   3198: }
                   3199: 
                   3200: static u32_t
                   3201: util_gen_crc( char *pcDatabuf, u32_t ulDatalen, u32_t ulCrc_in)
                   3202: {
                   3203:        unsigned char data;
                   3204:        u32_t idx, bit, crc = ulCrc_in;
                   3205: 
                   3206:        for(idx = 0; idx < ulDatalen; idx++) {
                   3207:                data = *pcDatabuf++;
                   3208:                for(bit = 0; bit < 8; bit++, data >>= 1) {
                   3209:                        crc = (crc >> 1) ^ (((crc ^ data) & 1) ?
                   3210:                                CRC32_POLYNOMIAL : 0);
                   3211:                }
                   3212:        }
                   3213:        return bswap_32(~crc);
                   3214: }
                   3215: 
                   3216: static int
                   3217: bcm_setmac(char mac_addr1[6], char mac_addr2[6])
                   3218: {
                   3219:        u64_t mac1 = 0, mac2 = 0;
                   3220:        u32_t manu[MANUFACTURING_INFO_SIZE/4];
                   3221:        int addr, i;
                   3222:        u32_t crc, val1, val2, val3, val4;
                   3223: 
                   3224: #ifdef BCM_DEBUG
                   3225:        printk("Flashing MAC 1: %02X:%02X:%02X:%02X:%02X:%02X\n",
                   3226:                ((unsigned int) mac_addr1[0]) & 0xFF,
                   3227:                ((unsigned int) mac_addr1[1]) & 0xFF,
                   3228:                ((unsigned int) mac_addr1[2]) & 0xFF,
                   3229:                ((unsigned int) mac_addr1[3]) & 0xFF,
                   3230:                ((unsigned int) mac_addr1[4]) & 0xFF,
                   3231:                ((unsigned int) mac_addr1[5]) & 0xFF);
                   3232: 
                   3233:        printk("Flashing MAC 2: %02X:%02X:%02X:%02X:%02X:%02X\n",
                   3234:                ((unsigned int) mac_addr2[0]) & 0xFF,
                   3235:                ((unsigned int) mac_addr2[1]) & 0xFF,
                   3236:                ((unsigned int) mac_addr2[2]) & 0xFF,
                   3237:                ((unsigned int) mac_addr2[3]) & 0xFF,
                   3238:                ((unsigned int) mac_addr2[4]) & 0xFF,
                   3239:                ((unsigned int) mac_addr2[5]) & 0xFF);
                   3240: #endif
                   3241: 
                   3242:        mac1 |= ((u64_t) mac_addr1[0]) & 0xFF; mac1 = mac1 << 8;
                   3243:        mac1 |= ((u64_t) mac_addr1[1]) & 0xFF; mac1 = mac1 << 8;
                   3244:        mac1 |= ((u64_t) mac_addr1[2]) & 0xFF; mac1 = mac1 << 8;
                   3245:        mac1 |= ((u64_t) mac_addr1[3]) & 0xFF; mac1 = mac1 << 8;
                   3246:        mac1 |= ((u64_t) mac_addr1[4]) & 0xFF; mac1 = mac1 << 8;
                   3247:        mac1 |= ((u64_t) mac_addr1[5]) & 0xFF;
                   3248: 
                   3249:        mac2 |= ((u64_t) mac_addr2[0]) & 0xFF; mac2 = mac2 << 8;
                   3250:        mac2 |= ((u64_t) mac_addr2[1]) & 0xFF; mac2 = mac2 << 8;
                   3251:        mac2 |= ((u64_t) mac_addr2[2]) & 0xFF; mac2 = mac2 << 8;
                   3252:        mac2 |= ((u64_t) mac_addr2[3]) & 0xFF; mac2 = mac2 << 8;
                   3253:        mac2 |= ((u64_t) mac_addr2[4]) & 0xFF; mac2 = mac2 << 8;
                   3254:        mac2 |= ((u64_t) mac_addr2[5]) & 0xFF;
                   3255: 
                   3256:        /* Extract the manufacturing data, starts at 0x74 */
                   3257:        if(bcm_nvram_lock() == -1) {
                   3258:                return -1;
                   3259:        }
                   3260: 
                   3261:        addr = 0x74;
                   3262:        for (i = 0; i < (MANUFACTURING_INFO_SIZE/4); i++) {
                   3263:                if (bcm_nvram_read(addr, &manu[i], 0) != 0) {
                   3264:                        printk("\nREAD FAILED\n");
                   3265:                        bcm_nvram_unlock();
                   3266:                        return -1;
                   3267:                }
                   3268:                addr+=4;
                   3269:        }
                   3270:        bcm_nvram_unlock();
                   3271: 
                   3272:        /* Store the new MAC address in the manufacturing data */
                   3273:        val1 = mac1 >> 32;
                   3274:        val2 = mac1 & 0xFFFFFFFF;
                   3275:        val3 = mac2 >> 32;
                   3276:        val4 = mac2 & 0xFFFFFFFF;
                   3277:        manu[(0x7C-0x74)/4] = val1;
                   3278:        manu[(0x80-0x74)/4] = val2;
                   3279:        manu[(0xCC-0x74)/4] = val3;
                   3280:        manu[(0xD0-0x74)/4] = val4;
                   3281: 
                   3282:        /* Calculate the new manufacturing datas CRC */
                   3283:        crc = util_gen_crc(((char *)manu),
                   3284:                MANUFACTURING_INFO_SIZE - 4, 0xFFFFFFFF);
                   3285: 
                   3286:        /* Now write the new MAC addresses and CRC */
                   3287:        if ((bcm_nvram_write(0x7C, val1, 1) != 0) ||
                   3288:            (bcm_nvram_write(0x80, val2, 1) != 0) ||
                   3289:            (bcm_nvram_write(0xCC, val3, 1) != 0) ||
                   3290:            (bcm_nvram_write(0xD0, val4, 1) != 0) ||
                   3291:            (bcm_nvram_write(0xFC, crc,  1) != 0) )
                   3292:        {
                   3293:                /* Disastor ! */
                   3294: #ifdef BCM_DEBUG
                   3295:                printk("failed to write MAC address\n");
                   3296: #endif
                   3297:                return -1;
                   3298:        }
                   3299: 
                   3300:        /* Success !!!! */
                   3301:        return 0;
                   3302: }
                   3303: 
                   3304: static int
                   3305: bcm_ioctl( int request, void* data )
                   3306: {
                   3307:        u32_t                l_baseaddrL_u32;
                   3308:        u32_t                l_baseaddrH_u32;
                   3309:        u32_t                i;
                   3310:        int                  ret_val = 0;
                   3311:        char                 mac_addr[6];
                   3312:        ioctl_net_data_t     *ioctl_data = (ioctl_net_data_t*) data;
                   3313: 
                   3314:        if(request != SIOCETHTOOL) {
                   3315:                return -1;
                   3316:        }
                   3317: 
                   3318: #ifdef BCM_DEBUG
                   3319:        printk( "bcm57xx: detected device " );
                   3320:        if( IS_5703 ) {
                   3321:                printk( "5703S" );
                   3322:        } else if( IS_5704 ) {
                   3323:                printk( "5704" );
                   3324:                if( IS_SERDES ) {
                   3325:                        printk( "S\n" );
                   3326:                } else {
                   3327:                        printk( "C\n" );
                   3328:                }
                   3329:        } else if( IS_5714 ) {
                   3330:                printk( "5714\n" );
                   3331:        }
                   3332: #endif
                   3333:        /*
                   3334:         * setup register & memory base addresses of NIC
                   3335:         */
                   3336:        l_baseaddrL_u32 = ( (u32_t) ~0xf &
                   3337:        (u32_t) snk_kernel_interface->pci_config_read( bcm_pcicfg_puid,
                   3338:                                                       4,
                   3339:                                                       bcm_pcicfg_bus,
                   3340:                                                       bcm_pcicfg_devfn,
                   3341:                                                       PCI_BAR1_R ) );
                   3342: 
                   3343:        l_baseaddrH_u32 = 
                   3344:        (u32_t) snk_kernel_interface->pci_config_read( bcm_pcicfg_puid,
                   3345:                                                       4,
                   3346:                                                       bcm_pcicfg_bus,
                   3347:                                                       bcm_pcicfg_devfn,
                   3348:                                                       PCI_BAR2_R );
                   3349: 
                   3350:        bcm_baseaddr_u64   = (u64_t) l_baseaddrH_u32;
                   3351:        bcm_baseaddr_u64 <<= 32;
                   3352:        bcm_baseaddr_u64  += (u64_t) l_baseaddrL_u32;
                   3353:        snk_kernel_interface->translate_addr(((void *)&(bcm_baseaddr_u64)));
                   3354:        bcm_memaddr_u64    = bcm_baseaddr_u64 + BCM_MEMORY_OFFS;
                   3355: 
                   3356:        /*
                   3357:         * 57xx hardware initialization
                   3358:         * BCM57xx Programmer's Guide: Section 8, "Initialization"
                   3359:         * steps 1 through 101
                   3360:         */
                   3361: 
                   3362:        // step 1: enable bus master & memory space in command reg
                   3363:        i = ( BIT32( 10 ) | BIT32( 2 ) | BIT32( 1 ) );
                   3364:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   3365:                                                2,
                   3366:                                                bcm_pcicfg_bus,
                   3367:                                                bcm_pcicfg_devfn,
                   3368:                                                PCI_COM_R,
                   3369:                                                ( int ) i );
                   3370: 
                   3371:        // step 2: disable & mask interrupts & enable pci byte/word swapping & enable indirect addressing mode
                   3372:        i = ( BIT32( 7 ) | BIT32( 3 ) | BIT32( 2 ) | BIT32( 1 ) | BIT32( 0 ) );
                   3373:        snk_kernel_interface->pci_config_write( bcm_pcicfg_puid,
                   3374:                                                4,
                   3375:                                                bcm_pcicfg_bus,
                   3376:                                                bcm_pcicfg_devfn,
                   3377:                                                PCI_MISC_HCTRL_R,
                   3378:                                                ( int ) i );
                   3379: 
                   3380:        bcm_nvram_init();
                   3381: 
                   3382:        switch(ioctl_data->subcmd) {
                   3383:        case ETHTOOL_GMAC:
                   3384:                switch(ioctl_data->data.mac.idx) {
                   3385:                case 0:
                   3386:                        ret_val = bcm_getmac(0x7C, ioctl_data->data.mac.address);
                   3387:                        break;
                   3388:                case 1:
                   3389:                        ret_val = bcm_getmac(0xCC, ioctl_data->data.mac.address);
                   3390:                        break;
                   3391:                default:
                   3392:                        ret_val = -1;
                   3393:                        break;
                   3394:                }
                   3395:                break;
                   3396:        case ETHTOOL_SMAC:
                   3397:                switch(ioctl_data->data.mac.idx) {
                   3398:                case 0:
                   3399:                        ret_val = bcm_getmac(0xCC, mac_addr);
                   3400:                        if(ret_val == 0)
                   3401:                                ret_val = bcm_setmac(ioctl_data->data.mac.address, mac_addr);
                   3402:                        break;
                   3403:                case 1:
                   3404:                        ret_val = bcm_getmac(0x7C, mac_addr);
                   3405:                        if(ret_val == 0)
                   3406:                                ret_val = bcm_setmac(mac_addr, ioctl_data->data.mac.address);
                   3407:                        break;
                   3408:                default:
                   3409:                        ret_val = -1;
                   3410:                        break;
                   3411:                }
                   3412:                break;
                   3413:        case ETHTOOL_VERSION: {
                   3414:                char *text = ioctl_data->data.version.text;
                   3415:                memcpy(text, "  BCM57xx Boot code level: ", 27);
                   3416:                ret_val = bcm_get_version(&text[27]);
                   3417:                break;
                   3418:        }
                   3419:        default:
                   3420:                ret_val = -1;
                   3421:                break;
                   3422:        }
                   3423:        
                   3424:        snk_module_interface.running = 1;
                   3425:        bcm_term();
                   3426:        return ret_val;
                   3427: }
                   3428: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.