323 lines
12 KiB
C
323 lines
12 KiB
C
/******************************************************************************
|
|
* 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 <cache.h>
|
|
#include <netdriver.h>
|
|
|
|
// 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);
|