/****************************************************************************** * Copyright (c) 2004, 2008 IBM Corporation * All rights reserved. * This program and the accompanying materials * are made available under the terms of the BSD License * which accompanies this distribution, and is available at * http://www.opensource.org/licenses/bsd-license.php * * Contributors: * IBM Corporation - initial implementation *****************************************************************************/ #include #include // Debug switches //#define BCM_DEBUG // main debug switch, w/o it the other ones don't work //#define BCM_SHOW_RCV //#define BCM_SHOW_RCV_DATA //#define BCM_SHOW_XMIT //#define BCM_SHOW_XMIT_DATA //#define BCM_SHOW_XMIT_STATS //#define BCM_SHOW_IDX //#define BCM_SHOW_STATS //#define BCM_SHOW_ASF_REGS // Switch to enable SW AUTO-NEG // don't try, it's still incomplete //#define BCM_SW_AUTONEG /* * used register offsets */ // PCI command register #define PCI_COM_R ( (uint16_t) 0x0004 ) // PCI Cache Line Size register #define PCI_CACHELS_R ( (uint16_t) 0x000c ) // PCI bar1 register #define PCI_BAR1_R ( (uint16_t) 0x0010 ) // PCI bar2 register #define PCI_BAR2_R ( (uint16_t) 0x0014 ) // PCI bar1 register #define PCI_SUBID_R ( (uint16_t) 0x002e ) // PCI-X Comand register #define PCI_X_COM_R ( (uint16_t) 0x0042 ) // Message Data Register #define MSG_DATA_R ( (uint16_t) 0x0064 ) // PCI misc host contrl register #define PCI_MISC_HCTRL_R ( (uint16_t) 0x0068 ) // DMA Read/Write Control register #define DMA_RW_CTRL_R ( (uint16_t) 0x006c ) // PCI State register #define PCI_STATE_R ( (uint16_t) 0x0070 ) // PCI_Clock Control register #define PCI_CLK_CTRL_R ( (uint16_t) 0x0074 ) // Register Base Address Register #define REG_BASE_ADDR_REG ( (uint16_t) 0x0078 ) // Memory Window Base Address Register #define MEM_BASE_ADDR_REG ( (uint16_t) 0x007c ) // Register Data Register #define REG_DATA_REG ( (uint16_t) 0x0080 ) // Memory Window Data Register #define MEM_DATA_REG ( (uint16_t) 0x0084 ) // MAC Function register #define MAC_FUNC_R ( (uint16_t) 0x00b8 ) // Interrupt Mailbox 0 register #define INT_MBX0_R ( (uint16_t) 0x0204 ) // Ethernet MAC Mode register #define ETH_MAC_MODE_R ( (uint16_t) 0x0400 ) // Ethernet MAC Addresses registers #define MAC_ADDR_OFFS_HI( idx ) ( (uint16_t) ( (idx*2 + 0)*sizeof( uint32_t ) + 0x0410 ) ) #define MAC_ADDR_OFFS_LO( idx ) ( (uint16_t) ( (idx*2 + 1)*sizeof( uint32_t ) + 0x0410 ) ) // Ethernet MAC Status register #define ETH_MAC_STAT_R ( (uint16_t) 0x0404 ) // Ethernet MAC Event Enable register #define ETH_MAC_EVT_EN_R ( (uint16_t) 0x0408 ) // Ethernet Transmit Random Backoff register #define ETH_TX_RND_BO_R ( (uint16_t) 0x0438 ) // Receive MTU Size register #define RX_MTU_SIZE_R ( (uint16_t) 0x043c ) // Transmit 1000BASE-X Auto Negotiation register #define TX_1000BX_AUTONEG_R ( (uint16_t) 0x0444 ) // Receive 1000BASE-X Auto Negotiation register #define RX_1000BX_AUTONEG_R ( (uint16_t) 0x0448 ) // MI Communication register #define MI_COM_R ( (uint16_t) 0x044c ) // MI Status Register #define MI_STATUS_R ( (uint16_t) 0x0450 ) // MI Mode register #define MI_MODE_R ( (uint16_t) 0x0454 ) // Transmit MAC Mode register #define TX_MAC_MODE_R ( (uint16_t) 0x045c ) // Transmit MAC Length register #define TX_MAC_LEN_R ( (uint16_t) 0x0464 ) // Receive MAC Mode register #define RX_MAC_MODE_R ( (uint16_t) 0x0468 ) // MAC Hash 0 register* VPD Config: #define MAC_HASH0_R ( (uint16_t) 0x0470 ) // MAC Hash 1 register #define MAC_HASH1_R ( (uint16_t) 0x0474 ) // MAC Hash 2 register #define MAC_HASH2_R ( (uint16_t) 0x0478 ) // MAC Hash 3 register #define MAC_HASH3_R ( (uint16_t) 0x047c ) // Receive Rules Control register #define RX_RULE_CTRL_R( idx ) ( (uint16_t) ( idx*8 + 0x0480 ) ) // Receive Rules Value register #define RX_RULE_VAL_R( idx ) ( (uint16_t) ( idx*8 + 0x0484 ) ) // Receive Rules Configuration register #define RX_RULE_CFG_R ( (uint16_t) 0x0500 ) // Low Watermark Max Receive Frames register #define LOW_WMARK_MAX_RXFRAM_R ( (uint16_t) 0x0504 ) // SerDes Control Register #define SERDES_CTRL_R ( (uint16_t) 0x0590 ) // Hardware Auto Negotiation Control Register #define HW_AUTONEG_CTRL_R ( (uint16_t) 0x05B0 ) // Hardware Auto Negotiation Status Register #define HW_AUTONEG_STAT_R ( (uint16_t) 0x05B4 ) // Send Data Initiator Mode register #define TX_DAT_INIT_MODE_R ( (uint16_t) 0x0c00 ) // Send Data Completion Mode register #define TX_DAT_COMPL_MODE_R ( (uint16_t) 0x1000 ) // Send BD Ring Selector Mode register #define TX_BD_RING_SEL_MODE_R ( (uint16_t) 0x1400 ) // Send BD Initiator Mode register #define TX_BD_INIT_MODE_R ( (uint16_t) 0x1800 ) // Send BD Completion Mode register #define TX_BD_COMPL_MODE_R ( (uint16_t) 0x1c00 ) // Receive List Placement Mode register #define RX_LST_PLACE_MODE_R ( (uint16_t) 0x2000 ) // Receive List Placement Configuration register #define RX_LST_PLACE_CFG_R ( (uint16_t) 0x2010 ) // Receive List Placement Statistics Enable Mask register #define RX_LST_PLACE_STAT_EN_R ( (uint16_t) 0x2018 ) // Receive Data & Receive BD Initiator Mode register #define RX_DAT_BD_INIT_MODE_R ( (uint16_t) 0x2400 ) // Receive Data Completion Mode register #define RX_DAT_COMPL_MODE_R ( (uint16_t) 0x2800 ) // Receive BD Initiator Mode register #define RX_BD_INIT_MODE_R ( (uint16_t) 0x2c00 ) // Standard Receive Producer Ring Replenish Threshold register #define STD_RXPR_REP_THR_R ( (uint16_t) 0x2c18 ) // Receive BD Completion Mode register #define RX_BD_COMPL_MODE_R ( (uint16_t) 0x3000 ) // Receive List Selector Mode register #define RX_LST_SEL_MODE_R ( (uint16_t) 0x3400 ) // MBUF Cluster Free Mode register #define MBUF_CLSTR_FREE_MODE_R ( (uint16_t) 0x3800 ) // Host Coalescing Mode register #define HOST_COAL_MODE_R ( (uint16_t) 0x3c00 ) // Receive Coalescing Ticks register #define RX_COAL_TICKS_R ( (uint16_t) 0x3c08 ) // Send Coalescing Ticks register #define TX_COAL_TICKS_R ( (uint16_t) 0x3c0c ) // Receive Max Coalesced BD Count register #define RX_COAL_MAX_BD_R ( (uint16_t) 0x3c10 ) // Send Max Coalesced BD Count register #define TX_COAL_MAX_BD_R ( (uint16_t) 0x3c14 ) // Receive Coalescing Ticks During Int register #define RX_COAL_TICKS_INT_R ( (uint16_t) 0x3c18 ) // Send Coalescing Ticks During Int register #define TX_COAL_TICKS_INT_R ( (uint16_t) 0x3c1c ) // Receive Max Coalesced BD Count During Int register #define RX_COAL_MAX_BD_INT_R ( (uint16_t) 0x3c18 ) // Send Max Coalesced BD Count During Int register #define TX_COAL_MAX_BD_INT_R ( (uint16_t) 0x3c1c ) // Statistics Ticks Counter register #define STAT_TICK_CNT_R ( (uint16_t) 0x3c28 ) // Status Block Host Address Low register #define STB_HOST_ADDR_HI_R ( (uint16_t) 0x3c38 ) // Status Block Host Address High register #define STB_HOST_ADDR_LO_R ( (uint16_t) 0x3c3c ) // Statistics Base Address register #define STAT_NIC_ADDR_R ( (uint16_t) 0x3c40 ) // Status Block Base Address register #define STB_NIC_ADDR_R ( (uint16_t) 0x3c44 ) // Memory Arbiter Mode register #define MEMARB_MODE_R ( (uint16_t) 0x4000 ) // Buffer Manager Mode register #define BUF_MAN_MODE_R ( (uint16_t) 0x4400 ) // MBuf Pool Address register #define MBUF_POOL_ADDR_R ( (uint16_t) 0x4408 ) // MBuf Pool Length register #define MBUF_POOL_LEN_R ( (uint16_t) 0x440c ) // Read DMA Mbuf Low Watermark register #define DMA_RMBUF_LOW_WMARK_R ( (uint16_t) 0x4410 ) // MAC Rx Mbuf Low Watermark register #define MAC_RXMBUF_LOW_WMARK_R ( (uint16_t) 0x4414 ) // Mbuf High Watermark register #define MBUF_HIGH_WMARK_R ( (uint16_t) 0x4418 ) // DMA Descriptor Pool Address register #define DMA_DESC_POOL_ADDR_R ( (uint16_t) 0x442c ) // DMA Descriptor Pool Length register #define DMA_DESC_POOL_LEN_R ( (uint16_t) 0x4430 ) // DMA Descriptor Low Watermark register #define DMA_DESC_LOW_WM_R ( (uint16_t) 0x4434 ) // DMA Descriptor HIGH Watermark register #define DMA_DESC_HIGH_WM_R ( (uint16_t) 0x4438 ) // Read DMA Mode register #define RD_DMA_MODE_R ( (uint16_t) 0x4800 ) // Write DMA Mode register #define WR_DMA_MODE_R ( (uint16_t) 0x4c00 ) // FTQ Reset register #define FTQ_RES_R ( (uint16_t) 0x5c00 ) // MSI Mode register #define MSI_MODE_R ( (uint16_t) 0x6000 ) // DMA completion Mode register #define DMA_COMPL_MODE_R ( (uint16_t) 0x6400 ) // Mode Control register #define MODE_CTRL_R ( (uint16_t) 0x6800 ) // Misc Configuration register #define MISC_CFG_R ( (uint16_t) 0x6804 ) // Misc Local Control register #define MISC_LOCAL_CTRL_R ( (uint16_t) 0x6808 ) // RX-Risc Mode Register #define RX_CPU_MODE_R ( (uint16_t) 0x5000 ) // RX-Risc State Register #define RX_CPU_STATE_R ( (uint16_t) 0x5004 ) // RX-Risc Program Counter #define RX_CPU_PC_R ( (uint16_t) 0x501c ) // RX-Risc Event Register #define RX_CPU_EVENT_R ( (uint16_t) 0x6810 ) // MDI Control register #define MDI_CTRL_R ( (uint16_t) 0x6844 ) // WOL Mode register #define WOL_MODE_R ( (uint16_t) 0x6880 ) // WOL Config register #define WOL_CFG_R ( (uint16_t) 0x6884 ) // WOL Status register #define WOL_STATUS_R ( (uint16_t) 0x6888 ) // ASF Control register #define ASF_CTRL_R ( (uint16_t) 0x6c00 ) // ASF Watchdog Timer register #define ASF_WATCHDOG_TIMER_R ( (uint16_t) 0x6c0c ) // ASF Heartbeat Timer register #define ASF_HEARTBEAT_TIMER_R ( (uint16_t) 0x6c10 ) // Poll ASF Timer register #define ASF_POLL_TIMER_R ( (uint16_t) 0x6c14 ) // Poll Legacy Timer register #define POLL_LEGACY_TIMER_R ( (uint16_t) 0x6c18 ) // Retransmission Timer register #define RETRANSMISSION_TIMER_R ( (uint16_t) 0x6c1c ) // Time Stamp Counter register #define TIME_STAMP_COUNTER_R ( (uint16_t) 0x6c20 ) // NVM Command register #define NVM_COM_R ( (uint16_t) 0x7000 ) // NVM Write register #define NVM_WRITE_R ( (uint16_t) 0x7008 ) // NVM Address register #define NVM_ADDR_R ( (uint16_t) 0x700c ) // NVM Read registertg3_phy_copper_begin #define NVM_READ_R ( (uint16_t) 0x7010 ) // NVM Access register #define NVM_ACC_R ( (uint16_t) 0x7024 ) // NVM Config 1 register #define NVM_CFG1_R ( (uint16_t) 0x7014 ) // Software arbitration register #define SW_ARB_R ( (uint16_t) 0x7020 ) /* * useful def's */ #define rd08(a) ci_read_8((uint8_t *)(a)) #define rd16(a) ci_read_16((uint16_t *)(a)) #define rd32(a) ci_read_32((uint32_t *)(a)) #define wr08(a,v) ci_write_8((uint8_t *)(a), (v)) #define wr16(a,v) ci_write_16((uint16_t *)(a), (v)) #define wr32(a,v) ci_write_32((uint32_t *)(a), (v)) #define BIT08( bit ) ( (uint8_t) 0x1 << (bit) ) #define BIT16( bit ) ( (uint16_t) 0x1 << (bit) ) #define BIT32( bit ) ( (uint32_t) 0x1 << (bit) ) /* * type definition */ /* * Constants for different kinds of IOCTL requests */ #define SIOCETHTOOL 0x1000 /* * special structure and constants for IOCTL requests of type ETHTOOL */ #define ETHTOOL_GMAC 0x03 #define ETHTOOL_SMAC 0x04 #define ETHTOOL_VERSION 0x05 typedef struct { int idx; char address[6]; } ioctl_ethtool_mac_t; typedef struct { unsigned int length; char *text; } ioctl_ethtool_version_t; /* * default structure and constants for IOCTL requests */ #define IF_NAME_SIZE 0xFF typedef struct { char if_name[IF_NAME_SIZE]; int subcmd; union { ioctl_ethtool_mac_t mac; ioctl_ethtool_version_t version; } data; } ioctl_net_data_t; extern net_driver_t *bcm57xx_open(void); extern void bcm57xx_close(net_driver_t *driver); extern int bcm57xx_read(char *buf, int len); extern int bcm57xx_write(char *buf, int len);