summaryrefslogblamecommitdiffstats
path: root/main/dev/smsc911x.h
blob: 9c3c4cdf047e2c33b6fec8ae4e65da4571956c05 (plain) (tree)
1
2
3
4
5
6
7

                                                                            
             


                                                
                











                                                                            
                              



























































































































































































































































































                                                                               
//==========================================================================
//
// smsc911x.h
//
//
// Author(s):    Jay Monkman <jtm@lopingdog.com>
// Contributors:
// Date:         06-07-2007
// Description:  This file contains definitions for the SMSC 911x and 912x
//               families of ethernet controllers.
//
//--------------------------------------------------------------------------

// ------------------------------------------------------------------------
// cpuio.h must provide SMSC911X_BASE_ADDRESS
// defines
#define SMSC_REG(_x_)         *(vulong *)(SMSC911X_BASE_ADDRESS + _x_)

// ------------------------------------------------------------------------
// Directly visible registers.
#define RX_FIFO_PORT                    SMSC_REG(0x00)
#define TX_FIFO_PORT                    SMSC_REG(0x20)
#define RX_FIFO_PORT_INC                SMSC_REG(0x100)
#define TX_FIFO_PORT_INC                SMSC_REG(0x120)
#define RX_STATUS_FIFO_PORT             SMSC_REG(0x40)
#define RX_STATUS_FIFO_PEEK             SMSC_REG(0x44)
#define RX_STATUS_FF                    (1 << 30)
#define RX_STATUS_PL_MASK               (0x3fff << 16)
#define RX_STATUS_PL_SHIFT              (16)
#define RX_STATUS_ES                    (1 << 15)
#define RX_STATUS_BF                    (1 << 13)
#define RX_STATUS_LE                    (1 << 12)
#define RX_STATUS_RF                    (1 << 11)
#define RX_STATUS_MF                    (1 << 10)
#define RX_STATUS_FTL                   (1 <<  7)
#define RX_STATUS_CS                    (1 <<  6)
#define RX_STATUS_FT                    (1 <<  5)
#define RX_STATUS_RWTO                  (1 <<  4)
#define RX_STATUS_ME                    (1 <<  3)
#define RX_STATUS_DB                    (1 <<  2)
#define RX_STATUS_CE                    (1 <<  1)

#define TX_STATUS_FIFO_PORT             SMSC_REG(0x48)
#define TX_STATUS_FIFO_PEEK             SMSC_REG(0x4c)
#define TX_STATUS_FIFO_ES               (1 << 15)
#define TX_STATUS_FIFO_LOC              (1 << 11)
#define TX_STATUS_FIFO_NC               (1 << 10)
#define TX_STATUS_FIFO_LC               (1 <<  9)
#define TX_STATUS_FIFO_EC               (1 <<  8)
#define TX_STATUS_FIFO_ED               (1 <<  2)
#define TX_STATUS_FIFO_UE               (1 <<  1)
#define TX_STATUS_FIFO_D                (1 <<  0)
#define TX_STATUS_FIFO_TAG_MASK          (0xffff << 16)

#define ID_REV                          SMSC_REG(0x50)
#define ID_REV_ID_MASK                  (0xffff << 16)
#define ID_REV_CHIP_9118                (0x0115 << 16)
#define ID_REV_CHIP_9211                (0x9211 << 16)
#define ID_REV_CHIP_9215                (0x115A << 16)
#define ID_REV_CHIP_9218                (0x118A << 16)
#define ID_REV_REV_MASK                 (0xffff <<  0)

#define INT_STS                         SMSC_REG(0x58)
#define INT_STS_SW_INT                  (1 << 21)
#define INT_STS_TXSTOP_INT              (1 << 25)
#define INT_STS_RXSTOP_INT              (1 << 24)
#define INT_STS_RXDFH_INT               (1 << 23)
#define INT_STS_TIOC_INT                (1 << 21)
#define INT_STS_RXD_INT                 (1 << 20)
#define INT_STS_GPT_INT                 (1 << 19)
#define INT_STS_PHY_INT                 (1 << 18)
#define INT_STS_PMT_INT                 (1 << 17)
#define INT_STS_TXSO_INT                (1 << 16)
#define INT_STS_RWT_INT                 (1 << 15)
#define INT_STS_RXE_INT                 (1 << 14)
#define INT_STS_TXE_INT                 (1 << 13)
#define INT_STS_TDFU_INT                (1 << 11)
#define INT_STS_TDFO_INT                (1 << 10)
#define INT_STS_TDFA_INT                (1 <<  9)
#define INT_STS_TSFF_INT                (1 <<  8)
#define INT_STS_TSFL_INT                (1 <<  7)
#define INT_STS_RDXF_INT                (1 <<  6)
#define INT_STS_RDFL_INT                (1 <<  5)
#define INT_STS_RSFF_INT                (1 <<  4)
#define INT_STS_RSFL_INT                (1 <<  3)
#define INT_STS_GPIO2_INT               (1 <<  2)
#define INT_STS_GPIO1_INT               (1 <<  1)
#define INT_STS_GPIO0_INT               (1 <<  0)

#define BYTE_TEST                       SMSC_REG(0x64)
#define BYTE_TEST_VAL                   (0x87654321)

#define FIFO_INT                        SMSC_REG(0x68)
#define FIFO_INT_TDAL(x)                (((x) & 0xff) << 24)
#define FIFO_INT_TSL(x)                 (((x) & 0xff) << 16)
#define FIFO_INT_RDAL(x)                (((x) & 0xff) <<  8)
#define FIFO_INT_RSL(x)                 (((x) & 0xff) <<  0)

#define RX_CFG                          SMSC_REG(0x6c)
#define RX_CFG_END_ALIGN4               (0 << 30)
#define RX_CFG_END_ALIGN16              (1 << 30)
#define RX_CFG_END_ALIGN32              (2 << 30)
#define RX_CFG_FORCE_DISCARD            (1 << 15)
#define RX_CFG_RXDOFF(x)                (((x) & 0x1f) << 8)

#define TX_CFG                          SMSC_REG(0x70)
#define TX_CFG_TXS_DUMP                 (1 << 15)
#define TX_CFG_TXD_DUMP                 (1 << 14)
#define TX_CFG_TXSAO                    (1 <<  2)
#define TX_CFG_TX_ON                    (1 <<  1)
#define TX_CFG_STOP_TX                  (1 <<  0)

#define HW_CFG                          SMSC_REG(0x74)
#define HW_CFG_TTM                      (1 << 21)
#define HW_CFG_SF                       (1 << 20)
#define HW_CFG_TX_FIF_SZ(x)             (((x) & 0xf) << 16)
#define HW_CFG_TX_FIF_MASK              (0xf << 16)
#define HW_CFG_TR(x)                    (((x) & 0x3) << 12)
#define HW_CFG_PHY_CLK_MASK             (3 << 5)
#define HW_CFG_PHY_CLK_INT              (0 << 5)
#define HW_CFG_PHY_CLK_EXT              (1 << 5)
#define HW_CFG_PHY_CLK_DIS              (2 << 5)
#define HW_CFG_SMI_SEL                  (1 << 3)
#define HW_CFG_EXT_PHY_EN               (1 << 2)
#define HW_CFG_BITMD_32                 (1 << 2)
#define HW_CFG_SRST_TO                  (1 << 1)
#define HW_CFG_SRST                     (1 << 0)

#define RX_DP_CTL                       SMSC_REG(0x78)
#define RX_DP_RX_FFWD                   (1 << 31)

#define RX_FIFO_INF                     SMSC_REG(0x7c)
#define TX_FIFO_RXSUSED_MASK             (0x00ff << 16)
#define TX_FIFO_RXDUSED_MASK             (0xffff <<  0)

#define TX_FIFO_INF                     SMSC_REG(0x80)
#define TX_FIFO_TXSUSED_MASK             (0x00ff << 16)
#define TX_FIFO_TDFREE_MASK              (0xffff <<  0)

#define PMT_CTRL                        SMSC_REG(0x84)
#define PMT_CTRL_PM_MODE_D0             (0 << 12)
#define PMT_CTRL_PM_MODE_D1             (1 << 12)
#define PMT_CTRL_PM_MODE_D2             (2 << 12)
#define PMT_CTRL_PHY_RST                (1 << 10)
#define PMT_CTRL_WOL_EN                 (1 <<  9)
#define PMT_CTRL_ED_EN                  (1 <<  8)
#define PMT_CTRL_PME_TYPE               (1 <<  6)
#define PMT_CTRL_WUPS_NONE              (0 <<  4)
#define PMT_CTRL_WUPS_D2                (1 <<  4)
#define PMT_CTRL_WUPS_D1                (2 <<  4)
#define PMT_CTRL_WUPS_MULT              (3 <<  4)
#define PMT_CTRL_PME_IND                (1 <<  3)
#define PMT_CTRL_PME_POL                (1 <<  2)
#define PMT_CTRL_PME_EN                 (1 <<  1)
#define PMT_CTRL_PME_READY              (1 <<  0)

#define GPIO_CFG                        SMSC_REG(0x88)
#define GPIO_CFG_LED3_EN                (1 << 30)
#define GPIO_CFG_LED2_EN                (1 << 29)
#define GPIO_CFG_LED1_EN                (1 << 28)
#define GPIO_CFG_GPIO_INT_POL(x)        (1 << (((x) & 0x3) + 24))
#define GPIO_CFG_EEPR_EEPROM            (0 << 20)
#define GPIO_CFG_GPIOBUF(x)             (1 << (((x) & 0x3) + 16))
#define GPIO_CFG_GPIODIR(x)             (1 << (((x) & 0x3) + 8))

#define GPT_CFG                         SMSC_REG(0x8c)
#define GPT_CFG_TIMER_EN                (1 << 29)
#define GPT_CFG_GPT_LOAD(x)             (((x) & 0xffff) << 0)

#define GPT_CNT                         SMSC_REG(0x90)
#define GPT_CNT_MASK                     (0xffff << 0)

#define WORD_SWAP                       SMSC_REG(0x98)
#define WORD_SWAP_BIG                   (0xFFFFFFFF)

#define FREE_RUN                        SMSC_REG(0x9c)

#define RX_DROP                         SMSC_REG(0xa0)

#define MAC_CSR_CMD                    SMSC_REG(0xa4)
#define MAC_CSR_CMD_CSR_BUSY           (0x80000000)
#define MAC_CSR_CMD_RNW                (0x40000000)
#define MAC_RD_CMD(x)                  (((x) & 0xff) | (MAC_CSR_CMD_CSR_BUSY |\
                                                        MAC_CSR_CMD_RNW))
#define MAC_WR_CMD(x)                  (((x) & 0xff) | (MAC_CSR_CMD_CSR_BUSY))

#define MAC_CSR_DATA                   SMSC_REG(0xa8)

#define AFC_CFG                        SMSC_REG(0xac)
#define AFC_CFG_AFC_HI(x)              (((x) & 0xff) << 16)
#define AFC_CFG_AFC_LO(x)              (((x) & 0xff) <<  8)
#define AFC_CFG_BACK_DUR(x)            (((x) & 0xf) <<   4)
#define AFC_CFG_FCMULT                 (1 << 3)
#define AFC_CFG_FCBRD                  (1 << 2)
#define AFC_CFG_FCADD                  (1 << 1)
#define AFC_CFG_FCANY                  (1 << 0)

#define E2P_CMD                         SMSC_REG(0xb0)
#define E2P_DATA                        SMSC_REG(0xb4)

// ----------------------------------------------------------
// Registers available via MAC_CSR_CMD/MAC_CSR_DATA registers
#define MAC_CR                (0x1)
#define MAC_CR_RXALL          (1 << 31)
#define MAC_CR_RCVOWN         (1 << 23)
#define MAC_CR_LOOPBK         (1 << 21)
#define MAC_CR_FDPX           (1 << 20)
#define MAC_CR_MCPAS          (1 << 18)
#define MAC_CR_PRMS           (1 << 18)
#define MAC_CR_INVFILT        (1 << 17)
#define MAC_CR_PASSBAD        (1 << 16)
#define MAC_CR_HO             (1 << 15)
#define MAC_CR_HPFILT         (1 << 13)
#define MAC_CR_LCOLL          (1 << 12)
#define MAC_CR_BCAST          (1 << 11)
#define MAC_CR_DISRTY         (1 << 10)
#define MAC_CR_PADSTR         (1 <<  8)
#define MAC_CR_BOLMT10        (0 <<  6)
#define MAC_CR_BOLMT8         (1 <<  6)
#define MAC_CR_BOLMT4         (2 <<  6)
#define MAC_CR_BOLMT1         (3 <<  6)
#define MAC_CR_DFCHK          (1 <<  5)
#define MAC_CR_TXEN           (1 <<  3)
#define MAC_CR_RXEN           (1 <<  2)

#define ADDRH                 (0x2)
#define ADDRL                 (0x3)
#define HASHH                 (0x4)
#define HASHL                 (0x5)

#define MII_ACC               (0x6)
#define MII_ACC_ADDR(x)       (((x) & 0x1f) << 11)
#define MII_ACC_REG(x)        (((x) & 0x1f) << 6)
#define MII_ACC_WR            (1 << 1)
#define MII_ACC_BUSY          (1 << 0)

#define MII_DATA              (0x7)
#define FLOW                  (0x8)
#define VLAN1                 (0x9)
#define VLAN2                 (0xa)
#define WUFF                  (0xb)
#define WUCSR                 (0xc)

// ----------------------------------------------------------
// PHY Registers
#define PHY_BCR               0
#define PHY_BCR_RESET         (1 << 15)
#define PHY_BCR_LOOP          (1 << 14)
#define PHY_BCR_SPEED         (1 << 13)
#define PHY_BCR_ANE           (1 << 12)
#define PHY_BCR_PD            (1 << 11)
#define PHY_BCR_RAN           (1 <<  9)
#define PHY_BCR_FD            (1 <<  8)
#define PHY_BCR_CT            (1 <<  7)

#define PHY_BSR               1
#define PHY_PHY1              2
#define PHY_PHY2              3
#define PHY_ANAR              4
#define PHY_ANAR_NP           (1 << 15)
#define PHY_ANAR_RF           (1 << 13)
#define PHY_ANAR_PAUSE(x)     (((x) & 0x3) << 10)
#define PHY_ANAR_100T4        (1 << 9)
#define PHY_ANAR_100TX_FD     (1 << 8)
#define PHY_ANAR_100TX        (1 << 7)
#define PHY_ANAR_10T_FD       (1 << 6)
#define PHY_ANAR_10T          (1 << 5)
#define PHY_ANAR_SF           (0x01)


#define PHY_ANLPAR            5
#define PHY_ANER              6
#define PHY_MCSR             17
#define PHY_SMR              18
#define PHY_SCSI             27
#define PHY_ISR              29
#define PHY_IMR              30
#define PHY_PSCSR            31


// ----------------------------------------------------------
// TX and RX command definitions
#define TX_CMD_IC            (1 << 31)
#define TX_CMD_BEA(x)        (((x) & 0x3) << 24)
#define TX_CMD_DS(x)         (((x) & 0x1f) << 16)
#define TX_CMD_FS            (1 << 13)
#define TX_CMD_LS            (1 << 12)
#define TX_CMD_BS(x)         (((x) & 0x7ff) << 0)
#define TX_CMD_TAG(x)        (((x) & 0xffff) << 16)
#define TX_CMD_CRCDIS        (1 << 13)
#define TX_CMD_PKTLEN(x)     (((x) & 0x7ff) << 0)



void smsc911x_reset(void);
int smsc911x_rx(uchar *);
int smsc911x_tx(uchar *, ulong);
int smsc911x_init(void);
void smsc911x_enable_promiscuous_reception(void);
void smsc911x_disable_promiscuous_reception(void);
void smsc911x_enable_multicast_reception(void);
void smsc911x_disable_multicast_reception(void);
void smsc911x_enable_broadcast_reception(void);
void smsc911x_disable_broadcast_reception(void);