⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 921x_4_linux.c

📁 ethernet device driver for smsc9115
💻 C
📖 第 1 页 / 共 5 页
字号:
#else
#define SMSC_WARNING(msg, args...)
#endif                /* USE_DEBUG >= 1 */

#if USE_DEBUG >= 2
#define SMSC_TRACE(fmt,args...) \
        printk(KERN_EMERG "SMSC_TRACE: %s: " fmt "\n", \
            __FUNCTION__ , ## args)
#else
#define SMSC_TRACE(msg,args...)
#endif                /* USE_DEBUG >= 2 */

struct smsc911x_data {
    void *ioaddr;
    unsigned int idrev;
    unsigned int generation;    /* used to decide which workarounds apply */

    /* This needs to be acquired before calling any of below:
     * smsc911x_mac_read(), smsc911x_mac_write()
     * smsc911x_phy_read(), smsc911x_phy_write()
     */
    spinlock_t phy_lock;

    struct net_device_stats stats;
    struct mii_if_info mii;
    unsigned int using_extphy;
    u32 msg_enable;
#ifdef USE_LED1_WORK_AROUND
    unsigned int gpio_setting;
    unsigned int gpio_orig_setting;
#endif
    struct timer_list link_poll_timer;
    int stop_link_poll;
    int software_irq_signal;

#ifdef USE_PHY_WORK_AROUND
#define MIN_PACKET_SIZE (64)
    char loopback_tx_pkt[MIN_PACKET_SIZE];
    char loopback_rx_pkt[MIN_PACKET_SIZE];
    unsigned int resetcount;
#endif

    /* Members for Multicast filter workaround */
    unsigned int multicast_update_pending;
    unsigned int set_bits_mask;
    unsigned int clear_bits_mask;
    unsigned int hashhi;
    unsigned int hashlo;
};

/* SMSC911x registers and bitfields */
#define RX_DATA_FIFO            0x00

#define TX_DATA_FIFO            0x20
#define TX_CMD_A_ON_COMP_        0x80000000
#define TX_CMD_A_BUF_END_ALGN_        0x03000000
#define TX_CMD_A_4_BYTE_ALGN_        0x00000000
#define TX_CMD_A_16_BYTE_ALGN_        0x01000000
#define TX_CMD_A_32_BYTE_ALGN_        0x02000000
#define TX_CMD_A_DATA_OFFSET_        0x001F0000
#define TX_CMD_A_FIRST_SEG_        0x00002000
#define TX_CMD_A_LAST_SEG_        0x00001000
#define TX_CMD_A_BUF_SIZE_        0x000007FF
#define TX_CMD_B_PKT_TAG_        0xFFFF0000
#define TX_CMD_B_ADD_CRC_DISABLE_    0x00002000
#define TX_CMD_B_DISABLE_PADDING_    0x00001000
#define TX_CMD_B_PKT_BYTE_LENGTH_    0x000007FF

#define RX_STATUS_FIFO            0x40
#define RX_STS_ES_            0x00008000
#define RX_STS_MCAST_            0x00000400

#define RX_STATUS_FIFO_PEEK        0x44

#define TX_STATUS_FIFO            0x48
#define TX_STS_ES_            0x00008000

#define TX_STATUS_FIFO_PEEK        0x4C

#define ID_REV                0x50
#define ID_REV_CHIP_ID_            0xFFFF0000
#define ID_REV_REV_ID_            0x0000FFFF

#define INT_CFG                0x54
#define INT_CFG_INT_DEAS_        0xFF000000
#define INT_CFG_INT_DEAS_CLR_        0x00004000
#define INT_CFG_INT_DEAS_STS_        0x00002000
#define INT_CFG_IRQ_INT_        0x00001000
#define INT_CFG_IRQ_EN_            0x00000100
#define INT_CFG_IRQ_POL_        0x00000010
#define INT_CFG_IRQ_TYPE_        0x00000001

#define INT_STS                0x58
#define INT_STS_SW_INT_            0x80000000
#define INT_STS_TXSTOP_INT_        0x02000000
#define INT_STS_RXSTOP_INT_        0x01000000
#define INT_STS_RXDFH_INT_        0x00800000
#define INT_STS_RXDF_INT_        0x00400000
#define INT_STS_TX_IOC_            0x00200000
#define INT_STS_RXD_INT_        0x00100000
#define INT_STS_GPT_INT_        0x00080000
#define INT_STS_PHY_INT_        0x00040000
#define INT_STS_PME_INT_        0x00020000
#define INT_STS_TXSO_            0x00010000
#define INT_STS_RWT_            0x00008000
#define INT_STS_RXE_            0x00004000
#define INT_STS_TXE_            0x00002000
#define INT_STS_TDFU_            0x00000800
#define INT_STS_TDFO_            0x00000400
#define INT_STS_TDFA_            0x00000200
#define INT_STS_TSFF_            0x00000100
#define INT_STS_TSFL_            0x00000080
#define INT_STS_RXDF_            0x00000040
#define INT_STS_RDFL_            0x00000020
#define INT_STS_RSFF_            0x00000010
#define INT_STS_RSFL_            0x00000008
#define INT_STS_GPIO2_INT_        0x00000004
#define INT_STS_GPIO1_INT_        0x00000002
#define INT_STS_GPIO0_INT_        0x00000001

#define INT_EN                0x5C
#define INT_EN_SW_INT_EN_        0x80000000
#define INT_EN_TXSTOP_INT_EN_        0x02000000
#define INT_EN_RXSTOP_INT_EN_        0x01000000
#define INT_EN_RXDFH_INT_EN_        0x00800000
#define INT_EN_TIOC_INT_EN_        0x00200000
#define INT_EN_RXD_INT_EN_        0x00100000
#define INT_EN_GPT_INT_EN_        0x00080000
#define INT_EN_PHY_INT_EN_        0x00040000
#define INT_EN_PME_INT_EN_        0x00020000
#define INT_EN_TXSO_EN_            0x00010000
#define INT_EN_RWT_EN_            0x00008000
#define INT_EN_RXE_EN_            0x00004000
#define INT_EN_TXE_EN_            0x00002000
#define INT_EN_TDFU_EN_            0x00000800
#define INT_EN_TDFO_EN_            0x00000400
#define INT_EN_TDFA_EN_            0x00000200
#define INT_EN_TSFF_EN_            0x00000100
#define INT_EN_TSFL_EN_            0x00000080
#define INT_EN_RXDF_EN_            0x00000040
#define INT_EN_RDFL_EN_            0x00000020
#define INT_EN_RSFF_EN_            0x00000010
#define INT_EN_RSFL_EN_            0x00000008
#define INT_EN_GPIO2_INT_        0x00000004
#define INT_EN_GPIO1_INT_        0x00000002
#define INT_EN_GPIO0_INT_        0x00000001

#define BYTE_TEST            0x64

#define FIFO_INT            0x68
#define FIFO_INT_TX_AVAIL_LEVEL_    0xFF000000
#define FIFO_INT_TX_STS_LEVEL_        0x00FF0000
#define FIFO_INT_RX_AVAIL_LEVEL_    0x0000FF00
#define FIFO_INT_RX_STS_LEVEL_        0x000000FF

#define RX_CFG                0x6C
#define RX_CFG_RX_END_ALGN_        0xC0000000
#define RX_CFG_RX_END_ALGN4_        0x00000000
#define RX_CFG_RX_END_ALGN16_        0x40000000
#define RX_CFG_RX_END_ALGN32_        0x80000000
#define RX_CFG_RX_DMA_CNT_        0x0FFF0000
#define RX_CFG_RX_DUMP_            0x00008000
#define RX_CFG_RXDOFF_            0x00001F00

#define TX_CFG                0x70
#define TX_CFG_TXS_DUMP_        0x00008000
#define TX_CFG_TXD_DUMP_        0x00004000
#define TX_CFG_TXSAO_            0x00000004
#define TX_CFG_TX_ON_            0x00000002
#define TX_CFG_STOP_TX_            0x00000001

#define HW_CFG                0x74
#define HW_CFG_TTM_            0x00200000
#define HW_CFG_SF_            0x00100000
#define HW_CFG_TX_FIF_SZ_        0x000F0000
#define HW_CFG_TR_            0x00003000
#define HW_CFG_SRST_            0x00000001

/* only available on 115/117 */
#define HW_CFG_PHY_CLK_SEL_        0x00000060
#define HW_CFG_PHY_CLK_SEL_INT_PHY_    0x00000000
#define HW_CFG_PHY_CLK_SEL_EXT_PHY_    0x00000020
#define HW_CFG_PHY_CLK_SEL_CLK_DIS_    0x00000040
#define HW_CFG_SMI_SEL_             0x00000010
#define HW_CFG_EXT_PHY_DET_        0x00000008
#define HW_CFG_EXT_PHY_EN_        0x00000004
#define HW_CFG_SRST_TO_            0x00000002

/* only available  on 116/118 */
#define HW_CFG_32_16_BIT_MODE_        0x00000004

#define RX_DP_CTRL            0x78
#define RX_DP_CTRL_RX_FFWD_        0x80000000

#define RX_FIFO_INF            0x7C
#define RX_FIFO_INF_RXSUSED_        0x00FF0000
#define RX_FIFO_INF_RXDUSED_        0x0000FFFF

#define TX_FIFO_INF            0x80
#define TX_FIFO_INF_TSUSED_        0x00FF0000
#define TX_FIFO_INF_TDFREE_        0x0000FFFF

#define PMT_CTRL            0x84
#define PMT_CTRL_PM_MODE_        0x00003000
#define PMT_CTRL_PM_MODE_D0_        0x00000000
#define PMT_CTRL_PM_MODE_D1_        0x00001000
#define PMT_CTRL_PM_MODE_D2_        0x00002000
#define PMT_CTRL_PM_MODE_D3_        0x00003000
#define PMT_CTRL_PHY_RST_        0x00000400
#define PMT_CTRL_WOL_EN_        0x00000200
#define PMT_CTRL_ED_EN_            0x00000100
#define PMT_CTRL_PME_TYPE_        0x00000040
#define PMT_CTRL_WUPS_            0x00000030
#define PMT_CTRL_WUPS_NOWAKE_        0x00000000
#define PMT_CTRL_WUPS_ED_        0x00000010
#define PMT_CTRL_WUPS_WOL_        0x00000020
#define PMT_CTRL_WUPS_MULTI_        0x00000030
#define PMT_CTRL_PME_IND_        0x00000008
#define PMT_CTRL_PME_POL_        0x00000004
#define PMT_CTRL_PME_EN_        0x00000002
#define PMT_CTRL_READY_            0x00000001

#define GPIO_CFG            0x88
#define GPIO_CFG_LED3_EN_        0x40000000
#define GPIO_CFG_LED2_EN_        0x20000000
#define GPIO_CFG_LED1_EN_        0x10000000
#define GPIO_CFG_GPIO2_INT_POL_        0x04000000
#define GPIO_CFG_GPIO1_INT_POL_        0x02000000
#define GPIO_CFG_GPIO0_INT_POL_        0x01000000
#define GPIO_CFG_EEPR_EN_        0x00700000
#define GPIO_CFG_GPIOBUF2_        0x00040000
#define GPIO_CFG_GPIOBUF1_        0x00020000
#define GPIO_CFG_GPIOBUF0_        0x00010000
#define GPIO_CFG_GPIODIR2_        0x00000400
#define GPIO_CFG_GPIODIR1_        0x00000200
#define GPIO_CFG_GPIODIR0_        0x00000100
#define GPIO_CFG_GPIOD4_        0x00000020
#define GPIO_CFG_GPIOD3_        0x00000010
#define GPIO_CFG_GPIOD2_        0x00000004
#define GPIO_CFG_GPIOD1_        0x00000002
#define GPIO_CFG_GPIOD0_        0x00000001

#define GPT_CFG                0x8C
#define GPT_CFG_TIMER_EN_        0x20000000
#define GPT_CFG_GPT_LOAD_        0x0000FFFF

#define GPT_CNT                0x90
#define GPT_CNT_GPT_CNT_        0x0000FFFF

#define ENDIAN                0x98

#define FREE_RUN            0x9C

#define RX_DROP                0xA0

#define MAC_CSR_CMD            0xA4
#define MAC_CSR_CMD_CSR_BUSY_        0x80000000
#define MAC_CSR_CMD_R_NOT_W_        0x40000000
#define MAC_CSR_CMD_CSR_ADDR_        0x000000FF

#define MAC_CSR_DATA            0xA8

#define AFC_CFG                0xAC
#define AFC_CFG_AFC_HI_            0x00FF0000
#define AFC_CFG_AFC_LO_            0x0000FF00
#define AFC_CFG_BACK_DUR_        0x000000F0
#define AFC_CFG_FCMULT_            0x00000008
#define AFC_CFG_FCBRD_            0x00000004
#define AFC_CFG_FCADD_            0x00000002
#define AFC_CFG_FCANY_            0x00000001

#define E2P_CMD                0xB0
#define E2P_CMD_EPC_BUSY_        0x80000000
#define E2P_CMD_EPC_CMD_        0x70000000
#define E2P_CMD_EPC_CMD_READ_        0x00000000
#define E2P_CMD_EPC_CMD_EWDS_        0x10000000
#define E2P_CMD_EPC_CMD_EWEN_        0x20000000
#define E2P_CMD_EPC_CMD_WRITE_        0x30000000
#define E2P_CMD_EPC_CMD_WRAL_        0x40000000
#define E2P_CMD_EPC_CMD_ERASE_        0x50000000
#define E2P_CMD_EPC_CMD_ERAL_        0x60000000
#define E2P_CMD_EPC_CMD_RELOAD_        0x70000000
#define E2P_CMD_EPC_TIMEOUT_        0x00000200
#define E2P_CMD_MAC_ADDR_LOADED_    0x00000100
#define E2P_CMD_EPC_ADDR_        0x000000FF

#define E2P_DATA            0xB4
#define E2P_DATA_EEPROM_DATA_        0x000000FF
#define LAN_REGISTER_EXTENT        0x00000100

/*
 * MAC Control and Status Register (Indirect Address)
 * Offset (through the MAC_CSR CMD and DATA port)
 */
#define MAC_CR                0x01
#define MAC_CR_RXALL_            0x80000000
#define MAC_CR_HBDIS_            0x10000000
#define MAC_CR_RCVOWN_            0x00800000
#define MAC_CR_LOOPBK_            0x00200000
#define MAC_CR_FDPX_            0x00100000
#define MAC_CR_MCPAS_            0x00080000
#define MAC_CR_PRMS_            0x00040000
#define MAC_CR_INVFILT_            0x00020000
#define MAC_CR_PASSBAD_            0x00010000
#define MAC_CR_HFILT_            0x00008000
#define MAC_CR_HPFILT_            0x00002000
#define MAC_CR_LCOLL_            0x00001000
#define MAC_CR_BCAST_            0x00000800
#define MAC_CR_DISRTY_            0x00000400
#define MAC_CR_PADSTR_            0x00000100
#define MAC_CR_BOLMT_MASK_        0x000000C0
#define MAC_CR_DFCHK_            0x00000020
#define MAC_CR_TXEN_            0x00000008
#define MAC_CR_RXEN_            0x00000004

#define ADDRH                0x02

#define ADDRL                0x03

#define HASHH                0x04

#define HASHL                0x05

#define MII_ACC                0x06
#define MII_ACC_PHY_ADDR_        0x0000F800
#define MII_ACC_MIIRINDA_        0x000007C0
#define MII_ACC_MII_WRITE_        0x00000002
#define MII_ACC_MII_BUSY_        0x00000001

#define MII_DATA            0x07

#define FLOW                0x08
#define FLOW_FCPT_            0xFFFF0000
#define FLOW_FCPASS_            0x00000004
#define FLOW_FCEN_            0x00000002
#define FLOW_FCBSY_            0x00000001

#define VLAN1                0x09

#define VLAN2                0x0A

#define WUFF                0x0B

#define WUCSR                0x0C
#define WUCSR_GUE_            0x00000200
#define WUCSR_WUFR_            0x00000040
#define WUCSR_MPR_            0x00000020
#define WUCSR_WAKE_EN_            0x00000004
#define WUCSR_MPEN_            0x00000002

/*
 * Phy definitions (vendor-specific)
 */
#define LAN9118_PHY_ID            0x00C0001C
#define LAN9215_PHY_ID            0x115A0000 // add by kf701

#define MII_INTSTS            0x1D

#define MII_INTMSK            0x1E
#define PHY_INTMSK_AN_RCV_        (1 << 1)
#define PHY_INTMSK_PDFAULT_        (1 << 2)
#define PHY_INTMSK_AN_ACK_        (1 << 3)
#define PHY_INTMSK_LNKDOWN_        (1 << 4)
#define PHY_INTMSK_RFAULT_        (1 << 5)
#define PHY_INTMSK_AN_COMP_        (1 << 6)
#define PHY_INTMSK_ENERGYON_        (1 << 7)
#define PHY_INTMSK_DEFAULT_        (PHY_INTMSK_ENERGYON_ | \
                     PHY_INTMSK_AN_COMP_ | \
                     PHY_INTMSK_RFAULT_ | \
                     PHY_INTMSK_LNKDOWN_)

#define ADVERTISE_PAUSE_ALL        (ADVERTISE_PAUSE_CAP | \
                     ADVERTISE_PAUSE_ASYM)
/* Add by kf701, NO WARRANTY */
#define ADVERTISE_PAUSE_CAP     0x0400  /* Try for pause               */
#define ADVERTISE_PAUSE_ASYM    0x0800  /* Try for asymetric pause     */
#define LPA_PAUSE_CAP           0x0400  /* Can pause                   */
#define LPA_PAUSE_ASYM          0x0800  /* Can pause asymetrically     */

#ifndef NET_IP_ALIGN
#define NET_IP_ALIGN    2
#endif

#define LAN9215_IO_BASE        0x0800 /* TODO */    
#define LAN9215_IO_SIZE        0xFC

#define NETDEV_TX_OK 0          /* driver took care of packet */
#define NETDEV_TX_BUSY 1        /* driver tx path was busy*/
#define NETDEV_TX_LOCKED -1     /* driver tx lock was already taken */

/* End add, NO WARRANTY */

#define LPA_PAUSE_ALL            (LPA_PAUSE_CAP | \
                     LPA_PAUSE_ASYM)

#endif                /* __SMSC911X_H__ */

 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -