Skip to content
Snippets Groups Projects
e1000.h 108 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	uint64_t prc1023;
    	uint64_t prc1522;
    	uint64_t gprc;
    	uint64_t bprc;
    	uint64_t mprc;
    	uint64_t gptc;
    	uint64_t gorcl;
    	uint64_t gorch;
    	uint64_t gotcl;
    	uint64_t gotch;
    	uint64_t rnbc;
    	uint64_t ruc;
    	uint64_t rfc;
    	uint64_t roc;
    	uint64_t rjc;
    	uint64_t mgprc;
    	uint64_t mgpdc;
    	uint64_t mgptc;
    	uint64_t torl;
    	uint64_t torh;
    	uint64_t totl;
    	uint64_t toth;
    	uint64_t tpr;
    	uint64_t tpt;
    	uint64_t ptc64;
    	uint64_t ptc127;
    	uint64_t ptc255;
    	uint64_t ptc511;
    	uint64_t ptc1023;
    	uint64_t ptc1522;
    	uint64_t mptc;
    	uint64_t bptc;
    	uint64_t tsctc;
    	uint64_t tsctfc;
    };
    
    
    struct e1000_eeprom_info {
    
    York Sun's avatar
    York Sun committed
    e1000_eeprom_type type;
    	uint16_t word_size;
    	uint16_t opcode_bits;
    	uint16_t address_bits;
    	uint16_t delay_usec;
    	uint16_t page_size;
    	bool use_eerd;
    	bool use_eewr;
    
    };
    
    typedef enum {
        e1000_smart_speed_default = 0,
        e1000_smart_speed_on,
        e1000_smart_speed_off
    } e1000_smart_speed;
    
    typedef enum {
        e1000_dsp_config_disabled = 0,
        e1000_dsp_config_enabled,
        e1000_dsp_config_activated,
        e1000_dsp_config_undefined = 0xFF
    } e1000_dsp_config;
    
    typedef enum {
        e1000_ms_hw_default = 0,
        e1000_ms_force_master,
        e1000_ms_force_slave,
        e1000_ms_auto
    } e1000_ms_type;
    
    typedef enum {
        e1000_ffe_config_enabled = 0,
        e1000_ffe_config_active,
        e1000_ffe_config_blocked
    } e1000_ffe_config;
    
    
    
    /* Structure containing variables used by the shared code (e1000_hw.c) */
    struct e1000_hw {
    
    	struct list_head list_node;
    
    	struct eth_device *nic;
    
    #ifdef CONFIG_E1000_SPI
    	struct spi_slave spi;
    #endif
    
    	pci_dev_t pdev;
    	uint8_t *hw_addr;
    	e1000_mac_type mac_type;
    
    Andre Schwarz's avatar
    Andre Schwarz committed
    	e1000_phy_type phy_type;
    	uint32_t phy_init_script;
    
    	uint32_t txd_cmd;
    
    	e1000_media_type media_type;
    	e1000_fc_type fc;
    
    	e1000_bus_type bus_type;
    
    #if 0
    	e1000_bus_speed bus_speed;
    	e1000_bus_width bus_width;
    	uint32_t io_base;
    #endif
    
    	uint32_t		asf_firmware_present;
    	uint32_t		eeprom_semaphore_present;
    	uint32_t		swfw_sync_present;
    	uint32_t		swfwhw_semaphore_present;
    	struct e1000_eeprom_info eeprom;
    	e1000_ms_type		master_slave;
    	e1000_ms_type		original_master_slave;
    	e1000_ffe_config	ffe_config_state;
    
    	uint32_t phy_id;
    
    	uint32_t phy_revision;
    
    	uint32_t phy_addr;
    	uint32_t original_fc;
    	uint32_t txcw;
    	uint32_t autoneg_failed;
    #if 0
    	uint32_t max_frame_size;
    	uint32_t min_frame_size;
    	uint32_t mc_filter_type;
    	uint32_t num_mc_addrs;
    	uint32_t collision_delta;
    	uint32_t tx_packet_delta;
    	uint32_t ledctl_default;
    	uint32_t ledctl_mode1;
    	uint32_t ledctl_mode2;
    #endif
    	uint16_t autoneg_advertised;
    	uint16_t pci_cmd_word;
    	uint16_t fc_high_water;
    	uint16_t fc_low_water;
    	uint16_t fc_pause_time;
    #if 0
    	uint16_t current_ifs_val;
    	uint16_t ifs_min_val;
    	uint16_t ifs_max_val;
    	uint16_t ifs_step_size;
    	uint16_t ifs_ratio;
    #endif
    	uint16_t device_id;
    	uint16_t vendor_id;
    	uint16_t subsystem_id;
    	uint16_t subsystem_vendor_id;
    	uint8_t revision_id;
    	uint8_t autoneg;
    	uint8_t mdix;
    	uint8_t forced_speed_duplex;
    	uint8_t wait_autoneg_complete;
    	uint8_t dma_fairness;
    #if 0
    	uint8_t perm_mac_addr[NODE_ADDRESS_SIZE];
    #endif
    
    York Sun's avatar
    York Sun committed
    	bool disable_polarity_correction;
    	bool		speed_downgraded;
    	bool get_link_status;
    	bool tbi_compatibility_en;
    	bool tbi_compatibility_on;
    	bool		fc_strict_ieee;
    	bool fc_send_xon;
    	bool report_tx_early;
    	bool phy_reset_disable;
    	bool		initialize_hw_bits_disable;
    
    York Sun's avatar
    York Sun committed
    	bool adaptive_ifs;
    	bool ifs_params_forced;
    	bool in_ifs_mode;
    
    	e1000_smart_speed	smart_speed;
    	e1000_dsp_config	dsp_config_state;
    
    };
    
    #define E1000_EEPROM_SWDPIN0   0x0001	/* SWDPIN 0 EEPROM Value */
    #define E1000_EEPROM_LED_LOGIC 0x0020	/* Led Logic Word */
    
    #define E1000_EEPROM_RW_REG_DATA   16   /* Offset to data in EEPROM
    					   read/write registers */
    #define E1000_EEPROM_RW_REG_DONE   2    /* Offset to READ/WRITE done bit */
    #define E1000_EEPROM_RW_REG_START  1    /* First bit for telling part to start
    					   operation */
    #define E1000_EEPROM_RW_ADDR_SHIFT 2    /* Shift to the address bits */
    #define E1000_EEPROM_POLL_WRITE    1    /* Flag for polling for write
    					   complete */
    #define E1000_EEPROM_POLL_READ     0    /* Flag for polling for read complete */
    #define EEPROM_RESERVED_WORD          0xFFFF
    
    
    /* Register Bit Masks */
    /* Device Control */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_FD	    0x00000001	/* Full duplex.0=half; 1=full */
    #define E1000_CTRL_BEM	    0x00000002	/* Endian Mode.0=little,1=big */
    
    #define E1000_CTRL_PRIOR    0x00000004	/* Priority on PCI. 0=rx,1=fair */
    #define E1000_CTRL_LRST     0x00000008	/* Link reset. 0=normal,1=reset */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_TME	    0x00000010	/* Test mode. 0=normal,1=test */
    #define E1000_CTRL_SLE	    0x00000020	/* Serial Link on 0=dis,1=en */
    
    #define E1000_CTRL_ASDE     0x00000020	/* Auto-speed detect enable */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_SLU	    0x00000040	/* Set link up (Force Link) */
    
    #define E1000_CTRL_ILOS     0x00000080	/* Invert Loss-Of Signal */
    #define E1000_CTRL_SPD_SEL  0x00000300	/* Speed Select Mask */
    #define E1000_CTRL_SPD_10   0x00000000	/* Force 10Mb */
    #define E1000_CTRL_SPD_100  0x00000100	/* Force 100Mb */
    #define E1000_CTRL_SPD_1000 0x00000200	/* Force 1Gb */
    #define E1000_CTRL_BEM32    0x00000400	/* Big Endian 32 mode */
    #define E1000_CTRL_FRCSPD   0x00000800	/* Force Speed */
    #define E1000_CTRL_FRCDPX   0x00001000	/* Force Duplex */
    #define E1000_CTRL_SWDPIN0  0x00040000	/* SWDPIN 0 value */
    #define E1000_CTRL_SWDPIN1  0x00080000	/* SWDPIN 1 value */
    #define E1000_CTRL_SWDPIN2  0x00100000	/* SWDPIN 2 value */
    #define E1000_CTRL_SWDPIN3  0x00200000	/* SWDPIN 3 value */
    #define E1000_CTRL_SWDPIO0  0x00400000	/* SWDPIN 0 Input or output */
    #define E1000_CTRL_SWDPIO1  0x00800000	/* SWDPIN 1 input or output */
    #define E1000_CTRL_SWDPIO2  0x01000000	/* SWDPIN 2 input or output */
    #define E1000_CTRL_SWDPIO3  0x02000000	/* SWDPIN 3 input or output */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_RST	    0x04000000	/* Global reset */
    
    #define E1000_CTRL_RFCE     0x08000000	/* Receive Flow Control enable */
    #define E1000_CTRL_TFCE     0x10000000	/* Transmit flow control enable */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_RTE	    0x20000000	/* Routing tag enable */
    #define E1000_CTRL_VME	    0x40000000	/* IEEE VLAN mode enable */
    
    #define E1000_CTRL_PHY_RST  0x80000000	/* PHY Reset */
    
    /* Device Status */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_STATUS_FD		0x00000001	/* Full duplex.0=half,1=full */
    #define E1000_STATUS_LU		0x00000002	/* Link up.0=no,1=link */
    #define E1000_STATUS_FUNC_MASK	0x0000000C	/* PCI Function Mask */
    #define E1000_STATUS_FUNC_0	0x00000000	/* Function 0 */
    #define E1000_STATUS_FUNC_1	0x00000004	/* Function 1 */
    #define E1000_STATUS_TXOFF	0x00000010	/* transmission paused */
    #define E1000_STATUS_TBIMODE	0x00000020	/* TBI mode */
    
    #define E1000_STATUS_SPEED_MASK 0x000000C0
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_STATUS_SPEED_10	0x00000000	/* Speed 10Mb/s */
    #define E1000_STATUS_SPEED_100	0x00000040	/* Speed 100Mb/s */
    
    #define E1000_STATUS_SPEED_1000 0x00000080	/* Speed 1000Mb/s */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_STATUS_ASDV	0x00000300	/* Auto speed detect value */
    #define E1000_STATUS_MTXCKOK	0x00000400	/* MTX clock running OK */
    #define E1000_STATUS_PCI66	0x00000800	/* In 66Mhz slot */
    #define E1000_STATUS_BUS64	0x00001000	/* In 64 bit slot */
    #define E1000_STATUS_PCIX_MODE	0x00002000	/* PCI-X mode */
    
    #define E1000_STATUS_PCIX_SPEED 0x0000C000	/* PCI-X bus speed */
    
    /* Constants used to intrepret the masked PCI-X bus speed. */
    #define E1000_STATUS_PCIX_SPEED_66  0x00000000	/* PCI-X bus speed  50-66 MHz */
    #define E1000_STATUS_PCIX_SPEED_100 0x00004000	/* PCI-X bus speed  66-100 MHz */
    #define E1000_STATUS_PCIX_SPEED_133 0x00008000	/* PCI-X bus speed 100-133 MHz */
    
    /* EEPROM/Flash Control */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_EECD_SK	     0x00000001	/* EEPROM Clock */
    #define E1000_EECD_CS	     0x00000002	/* EEPROM Chip Select */
    #define E1000_EECD_DI	     0x00000004	/* EEPROM Data In */
    #define E1000_EECD_DO	     0x00000008	/* EEPROM Data Out */
    
    #define E1000_EECD_FWE_MASK  0x00000030
    #define E1000_EECD_FWE_DIS   0x00000010	/* Disable FLASH writes */
    #define E1000_EECD_FWE_EN    0x00000020	/* Enable FLASH writes */
    #define E1000_EECD_FWE_SHIFT 4
    #define E1000_EECD_SIZE      0x00000200	/* EEPROM Size (0=64 word 1=256 word) */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_EECD_REQ	     0x00000040	/* EEPROM Access Request */
    #define E1000_EECD_GNT	     0x00000080	/* EEPROM Access Grant */
    
    #define E1000_EECD_PRES      0x00000100	/* EEPROM Present */
    
    #define E1000_EECD_ADDR_BITS 0x00000400 /* EEPROM Addressing bits based on type
    					 * (0-small, 1-large) */
    
    #define E1000_EECD_TYPE      0x00002000 /* EEPROM Type (1-SPI, 0-Microwire) */
    #ifndef E1000_EEPROM_GRANT_ATTEMPTS
    #define E1000_EEPROM_GRANT_ATTEMPTS 1000 /* EEPROM # attempts to gain grant */
    #endif
    #define E1000_EECD_AUTO_RD          0x00000200  /* EEPROM Auto Read done */
    #define E1000_EECD_SIZE_EX_MASK     0x00007800  /* EEprom Size */
    #define E1000_EECD_SIZE_EX_SHIFT    11
    #define E1000_EECD_NVADDS    0x00018000 /* NVM Address Size */
    #define E1000_EECD_SELSHAD   0x00020000 /* Select Shadow RAM */
    #define E1000_EECD_INITSRAM  0x00040000 /* Initialize Shadow RAM */
    #define E1000_EECD_FLUPD     0x00080000 /* Update FLASH */
    #define E1000_EECD_AUPDEN    0x00100000 /* Enable Autonomous FLASH update */
    #define E1000_EECD_SHADV     0x00200000 /* Shadow RAM Data Valid */
    #define E1000_EECD_SEC1VAL   0x00400000 /* Sector One Valid */
    #define E1000_EECD_SECVAL_SHIFT      22
    #define E1000_STM_OPCODE     0xDB00
    #define E1000_HICR_FW_RESET  0xC0
    
    #define E1000_SHADOW_RAM_WORDS     2048
    #define E1000_ICH_NVM_SIG_WORD     0x13
    #define E1000_ICH_NVM_SIG_MASK     0xC0
    
    
    /* EEPROM Read */
    #define E1000_EERD_START      0x00000001	/* Start Read */
    #define E1000_EERD_DONE       0x00000010	/* Read Done */
    #define E1000_EERD_ADDR_SHIFT 8
    #define E1000_EERD_ADDR_MASK  0x0000FF00	/* Read Address */
    #define E1000_EERD_DATA_SHIFT 16
    #define E1000_EERD_DATA_MASK  0xFFFF0000	/* Read Data */
    
    
    /* EEPROM Commands - Microwire */
    #define EEPROM_READ_OPCODE_MICROWIRE  0x6  /* EEPROM read opcode */
    #define EEPROM_WRITE_OPCODE_MICROWIRE 0x5  /* EEPROM write opcode */
    #define EEPROM_ERASE_OPCODE_MICROWIRE 0x7  /* EEPROM erase opcode */
    #define EEPROM_EWEN_OPCODE_MICROWIRE  0x13 /* EEPROM erase/write enable */
    #define EEPROM_EWDS_OPCODE_MICROWIRE  0x10 /* EEPROM erast/write disable */
    
    /* EEPROM Commands - SPI */
    #define EEPROM_MAX_RETRY_SPI        5000 /* Max wait of 5ms, for RDY signal */
    #define EEPROM_READ_OPCODE_SPI      0x03  /* EEPROM read opcode */
    #define EEPROM_WRITE_OPCODE_SPI     0x02  /* EEPROM write opcode */
    #define EEPROM_A8_OPCODE_SPI        0x08  /* opcode bit-3 = address bit-8 */
    #define EEPROM_WREN_OPCODE_SPI      0x06  /* EEPROM set Write Enable latch */
    #define EEPROM_WRDI_OPCODE_SPI      0x04  /* EEPROM reset Write Enable latch */
    #define EEPROM_RDSR_OPCODE_SPI      0x05  /* EEPROM read Status register */
    #define EEPROM_WRSR_OPCODE_SPI      0x01  /* EEPROM write Status register */
    #define EEPROM_ERASE4K_OPCODE_SPI   0x20  /* EEPROM ERASE 4KB */
    #define EEPROM_ERASE64K_OPCODE_SPI  0xD8  /* EEPROM ERASE 64KB */
    #define EEPROM_ERASE256_OPCODE_SPI  0xDB  /* EEPROM ERASE 256B */
    
    /* EEPROM Size definitions */
    #define EEPROM_WORD_SIZE_SHIFT  6
    #define EEPROM_SIZE_SHIFT       10
    #define EEPROM_SIZE_MASK        0x1C00
    
    /* EEPROM Word Offsets */
    #define EEPROM_COMPAT                 0x0003
    #define EEPROM_ID_LED_SETTINGS        0x0004
    #define EEPROM_VERSION                0x0005
    #define EEPROM_SERDES_AMPLITUDE       0x0006 /* For SERDES output amplitude
    						adjustment. */
    #define EEPROM_PHY_CLASS_WORD         0x0007
    #define EEPROM_INIT_CONTROL1_REG      0x000A
    #define EEPROM_INIT_CONTROL2_REG      0x000F
    #define EEPROM_SWDEF_PINS_CTRL_PORT_1 0x0010
    #define EEPROM_INIT_CONTROL3_PORT_B   0x0014
    #define EEPROM_INIT_3GIO_3            0x001A
    #define EEPROM_SWDEF_PINS_CTRL_PORT_0 0x0020
    #define EEPROM_INIT_CONTROL3_PORT_A   0x0024
    #define EEPROM_CFG                    0x0012
    #define EEPROM_FLASH_VERSION          0x0032
    #define EEPROM_CHECKSUM_REG           0x003F
    
    #define E1000_EEPROM_CFG_DONE         0x00040000   /* MNG config cycle done */
    #define E1000_EEPROM_CFG_DONE_PORT_1  0x00080000   /* ...for second port */
    
    
    /* Extended Device Control */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_EXT_GPI0_EN	 0x00000001	/* Maps SDP4 to GPI0 */
    #define E1000_CTRL_EXT_GPI1_EN	 0x00000002	/* Maps SDP5 to GPI1 */
    
    #define E1000_CTRL_EXT_PHYINT_EN E1000_CTRL_EXT_GPI1_EN
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_EXT_GPI2_EN	 0x00000004	/* Maps SDP6 to GPI2 */
    #define E1000_CTRL_EXT_GPI3_EN	 0x00000008	/* Maps SDP7 to GPI3 */
    
    #define E1000_CTRL_EXT_SDP4_DATA 0x00000010	/* Value of SW Defineable
    						   Pin 4 */
    #define E1000_CTRL_EXT_SDP5_DATA 0x00000020	/* Value of SW Defineable
    						   Pin 5 */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_EXT_PHY_INT	 E1000_CTRL_EXT_SDP5_DATA
    
    #define E1000_CTRL_EXT_SDP6_DATA 0x00000040	/* Value of SW Defineable Pin 6 */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_EXT_SWDPIN6	 0x00000040	/* SWDPIN 6 value */
    
    #define E1000_CTRL_EXT_SDP7_DATA 0x00000080	/* Value of SW Defineable Pin 7 */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_EXT_SWDPIN7	 0x00000080	/* SWDPIN 7 value */
    
    #define E1000_CTRL_EXT_SDP4_DIR  0x00000100	/* Direction of SDP4 0=in 1=out */
    #define E1000_CTRL_EXT_SDP5_DIR  0x00000200	/* Direction of SDP5 0=in 1=out */
    #define E1000_CTRL_EXT_SDP6_DIR  0x00000400	/* Direction of SDP6 0=in 1=out */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_EXT_SWDPIO6	 0x00000400	/* SWDPIN 6 Input or output */
    
    #define E1000_CTRL_EXT_SDP7_DIR  0x00000800	/* Direction of SDP7 0=in 1=out */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_EXT_SWDPIO7	 0x00000800	/* SWDPIN 7 Input or output */
    #define E1000_CTRL_EXT_ASDCHK	 0x00001000	/* Initiate an ASD sequence */
    #define E1000_CTRL_EXT_EE_RST	 0x00002000	/* Reinitialize from EEPROM */
    #define E1000_CTRL_EXT_IPS	 0x00004000	/* Invert Power State */
    
    #define E1000_CTRL_EXT_SPD_BYPS  0x00008000	/* Speed Select Bypass */
    
    #define E1000_CTRL_EXT_RO_DIS    0x00020000 /* Relaxed Ordering disable */
    
    #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000
    #define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000
    #define E1000_CTRL_EXT_LINK_MODE_TBI  0x00C00000
    #define E1000_CTRL_EXT_WR_WMARK_MASK  0x03000000
    #define E1000_CTRL_EXT_WR_WMARK_256   0x00000000
    #define E1000_CTRL_EXT_WR_WMARK_320   0x01000000
    #define E1000_CTRL_EXT_WR_WMARK_384   0x02000000
    #define E1000_CTRL_EXT_WR_WMARK_448   0x03000000
    
    /* MDI Control */
    #define E1000_MDIC_DATA_MASK 0x0000FFFF
    #define E1000_MDIC_REG_MASK  0x001F0000
    #define E1000_MDIC_REG_SHIFT 16
    #define E1000_MDIC_PHY_MASK  0x03E00000
    #define E1000_MDIC_PHY_SHIFT 21
    #define E1000_MDIC_OP_WRITE  0x04000000
    #define E1000_MDIC_OP_READ   0x08000000
    #define E1000_MDIC_READY     0x10000000
    #define E1000_MDIC_INT_EN    0x20000000
    #define E1000_MDIC_ERROR     0x40000000
    
    
    #define E1000_PHY_CTRL_SPD_EN                  0x00000001
    #define E1000_PHY_CTRL_D0A_LPLU                0x00000002
    #define E1000_PHY_CTRL_NOND0A_LPLU             0x00000004
    #define E1000_PHY_CTRL_NOND0A_GBE_DISABLE      0x00000008
    #define E1000_PHY_CTRL_GBE_DISABLE             0x00000040
    #define E1000_PHY_CTRL_B2B_EN                  0x00000080
    
    /* LED Control */
    #define E1000_LEDCTL_LED0_MODE_MASK  0x0000000F
    #define E1000_LEDCTL_LED0_MODE_SHIFT 0
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_LEDCTL_LED0_IVRT	     0x00000040
    
    #define E1000_LEDCTL_LED0_BLINK      0x00000080
    #define E1000_LEDCTL_LED1_MODE_MASK  0x00000F00
    #define E1000_LEDCTL_LED1_MODE_SHIFT 8
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_LEDCTL_LED1_IVRT	     0x00004000
    
    #define E1000_LEDCTL_LED1_BLINK      0x00008000
    #define E1000_LEDCTL_LED2_MODE_MASK  0x000F0000
    #define E1000_LEDCTL_LED2_MODE_SHIFT 16
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_LEDCTL_LED2_IVRT	     0x00400000
    
    #define E1000_LEDCTL_LED2_BLINK      0x00800000
    #define E1000_LEDCTL_LED3_MODE_MASK  0x0F000000
    #define E1000_LEDCTL_LED3_MODE_SHIFT 24
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_LEDCTL_LED3_IVRT	     0x40000000
    
    #define E1000_LEDCTL_LED3_BLINK      0x80000000
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_LEDCTL_MODE_LINK_10_1000	0x0
    
    #define E1000_LEDCTL_MODE_LINK_100_1000 0x1
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_LEDCTL_MODE_LINK_UP	0x2
    #define E1000_LEDCTL_MODE_ACTIVITY	0x3
    
    #define E1000_LEDCTL_MODE_LINK_ACTIVITY 0x4
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_LEDCTL_MODE_LINK_10	0x5
    #define E1000_LEDCTL_MODE_LINK_100	0x6
    #define E1000_LEDCTL_MODE_LINK_1000	0x7
    #define E1000_LEDCTL_MODE_PCIX_MODE	0x8
    #define E1000_LEDCTL_MODE_FULL_DUPLEX	0x9
    #define E1000_LEDCTL_MODE_COLLISION	0xA
    #define E1000_LEDCTL_MODE_BUS_SPEED	0xB
    #define E1000_LEDCTL_MODE_BUS_SIZE	0xC
    #define E1000_LEDCTL_MODE_PAUSED	0xD
    #define E1000_LEDCTL_MODE_LED_ON	0xE
    #define E1000_LEDCTL_MODE_LED_OFF	0xF
    
    
    /* Receive Address */
    #define E1000_RAH_AV  0x80000000	/* Receive descriptor valid */
    
    /* Interrupt Cause Read */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_ICR_TXDW	  0x00000001	/* Transmit desc written back */
    #define E1000_ICR_TXQE	  0x00000002	/* Transmit Queue empty */
    #define E1000_ICR_LSC	  0x00000004	/* Link Status Change */
    
    #define E1000_ICR_RXSEQ   0x00000008	/* rx sequence error */
    #define E1000_ICR_RXDMT0  0x00000010	/* rx desc min. threshold (0) */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_ICR_RXO	  0x00000040	/* rx overrun */
    #define E1000_ICR_RXT0	  0x00000080	/* rx timer intr (ring 0) */
    #define E1000_ICR_MDAC	  0x00000200	/* MDIO access complete */
    
    #define E1000_ICR_RXCFG   0x00000400	/* RX /c/ ordered set */
    #define E1000_ICR_GPI_EN0 0x00000800	/* GP Int 0 */
    #define E1000_ICR_GPI_EN1 0x00001000	/* GP Int 1 */
    #define E1000_ICR_GPI_EN2 0x00002000	/* GP Int 2 */
    #define E1000_ICR_GPI_EN3 0x00004000	/* GP Int 3 */
    #define E1000_ICR_TXD_LOW 0x00008000
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_ICR_SRPD	  0x00010000
    
    
    /* Interrupt Cause Set */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_ICS_TXDW	  E1000_ICR_TXDW	/* Transmit desc written back */
    #define E1000_ICS_TXQE	  E1000_ICR_TXQE	/* Transmit Queue empty */
    #define E1000_ICS_LSC	  E1000_ICR_LSC	/* Link Status Change */
    
    #define E1000_ICS_RXSEQ   E1000_ICR_RXSEQ	/* rx sequence error */
    #define E1000_ICS_RXDMT0  E1000_ICR_RXDMT0	/* rx desc min. threshold */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_ICS_RXO	  E1000_ICR_RXO	/* rx overrun */
    #define E1000_ICS_RXT0	  E1000_ICR_RXT0	/* rx timer intr */
    #define E1000_ICS_MDAC	  E1000_ICR_MDAC	/* MDIO access complete */
    
    #define E1000_ICS_RXCFG   E1000_ICR_RXCFG	/* RX /c/ ordered set */
    #define E1000_ICS_GPI_EN0 E1000_ICR_GPI_EN0	/* GP Int 0 */
    #define E1000_ICS_GPI_EN1 E1000_ICR_GPI_EN1	/* GP Int 1 */
    #define E1000_ICS_GPI_EN2 E1000_ICR_GPI_EN2	/* GP Int 2 */
    #define E1000_ICS_GPI_EN3 E1000_ICR_GPI_EN3	/* GP Int 3 */
    #define E1000_ICS_TXD_LOW E1000_ICR_TXD_LOW
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_ICS_SRPD	  E1000_ICR_SRPD
    
    
    /* Interrupt Mask Set */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_IMS_TXDW	  E1000_ICR_TXDW	/* Transmit desc written back */
    #define E1000_IMS_TXQE	  E1000_ICR_TXQE	/* Transmit Queue empty */
    #define E1000_IMS_LSC	  E1000_ICR_LSC	/* Link Status Change */
    
    #define E1000_IMS_RXSEQ   E1000_ICR_RXSEQ	/* rx sequence error */
    #define E1000_IMS_RXDMT0  E1000_ICR_RXDMT0	/* rx desc min. threshold */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_IMS_RXO	  E1000_ICR_RXO	/* rx overrun */
    #define E1000_IMS_RXT0	  E1000_ICR_RXT0	/* rx timer intr */
    #define E1000_IMS_MDAC	  E1000_ICR_MDAC	/* MDIO access complete */
    
    #define E1000_IMS_RXCFG   E1000_ICR_RXCFG	/* RX /c/ ordered set */
    #define E1000_IMS_GPI_EN0 E1000_ICR_GPI_EN0	/* GP Int 0 */
    #define E1000_IMS_GPI_EN1 E1000_ICR_GPI_EN1	/* GP Int 1 */
    #define E1000_IMS_GPI_EN2 E1000_ICR_GPI_EN2	/* GP Int 2 */
    #define E1000_IMS_GPI_EN3 E1000_ICR_GPI_EN3	/* GP Int 3 */
    #define E1000_IMS_TXD_LOW E1000_ICR_TXD_LOW
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_IMS_SRPD	  E1000_ICR_SRPD
    
    
    /* Interrupt Mask Clear */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_IMC_TXDW	  E1000_ICR_TXDW	/* Transmit desc written back */
    #define E1000_IMC_TXQE	  E1000_ICR_TXQE	/* Transmit Queue empty */
    #define E1000_IMC_LSC	  E1000_ICR_LSC	/* Link Status Change */
    
    #define E1000_IMC_RXSEQ   E1000_ICR_RXSEQ	/* rx sequence error */
    #define E1000_IMC_RXDMT0  E1000_ICR_RXDMT0	/* rx desc min. threshold */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_IMC_RXO	  E1000_ICR_RXO	/* rx overrun */
    #define E1000_IMC_RXT0	  E1000_ICR_RXT0	/* rx timer intr */
    #define E1000_IMC_MDAC	  E1000_ICR_MDAC	/* MDIO access complete */
    
    #define E1000_IMC_RXCFG   E1000_ICR_RXCFG	/* RX /c/ ordered set */
    #define E1000_IMC_GPI_EN0 E1000_ICR_GPI_EN0	/* GP Int 0 */
    #define E1000_IMC_GPI_EN1 E1000_ICR_GPI_EN1	/* GP Int 1 */
    #define E1000_IMC_GPI_EN2 E1000_ICR_GPI_EN2	/* GP Int 2 */
    #define E1000_IMC_GPI_EN3 E1000_ICR_GPI_EN3	/* GP Int 3 */
    #define E1000_IMC_TXD_LOW E1000_ICR_TXD_LOW
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_IMC_SRPD	  E1000_ICR_SRPD
    
    
    /* Receive Control */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_RCTL_RST		0x00000001	/* Software reset */
    #define E1000_RCTL_EN		0x00000002	/* enable */
    #define E1000_RCTL_SBP		0x00000004	/* store bad packet */
    #define E1000_RCTL_UPE		0x00000008	/* unicast promiscuous enable */
    #define E1000_RCTL_MPE		0x00000010	/* multicast promiscuous enab */
    #define E1000_RCTL_LPE		0x00000020	/* long packet enable */
    #define E1000_RCTL_LBM_NO	0x00000000	/* no loopback mode */
    #define E1000_RCTL_LBM_MAC	0x00000040	/* MAC loopback mode */
    #define E1000_RCTL_LBM_SLP	0x00000080	/* serial link loopback mode */
    #define E1000_RCTL_LBM_TCVR	0x000000C0	/* tcvr loopback mode */
    #define E1000_RCTL_RDMTS_HALF	0x00000000	/* rx desc min threshold size */
    #define E1000_RCTL_RDMTS_QUAT	0x00000100	/* rx desc min threshold size */
    #define E1000_RCTL_RDMTS_EIGTH	0x00000200	/* rx desc min threshold size */
    #define E1000_RCTL_MO_SHIFT	12	/* multicast offset shift */
    #define E1000_RCTL_MO_0		0x00000000	/* multicast offset 11:0 */
    #define E1000_RCTL_MO_1		0x00001000	/* multicast offset 12:1 */
    #define E1000_RCTL_MO_2		0x00002000	/* multicast offset 13:2 */
    #define E1000_RCTL_MO_3		0x00003000	/* multicast offset 15:4 */
    #define E1000_RCTL_MDR		0x00004000	/* multicast desc ring 0 */
    #define E1000_RCTL_BAM		0x00008000	/* broadcast enable */
    
    /* these buffer sizes are valid if E1000_RCTL_BSEX is 0 */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_RCTL_SZ_2048	0x00000000	/* rx buffer size 2048 */
    #define E1000_RCTL_SZ_1024	0x00010000	/* rx buffer size 1024 */
    #define E1000_RCTL_SZ_512	0x00020000	/* rx buffer size 512 */
    #define E1000_RCTL_SZ_256	0x00030000	/* rx buffer size 256 */
    
    /* these buffer sizes are valid if E1000_RCTL_BSEX is 1 */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_RCTL_SZ_16384	0x00010000	/* rx buffer size 16384 */
    #define E1000_RCTL_SZ_8192	0x00020000	/* rx buffer size 8192 */
    #define E1000_RCTL_SZ_4096	0x00030000	/* rx buffer size 4096 */
    #define E1000_RCTL_VFE		0x00040000	/* vlan filter enable */
    #define E1000_RCTL_CFIEN	0x00080000	/* canonical form enable */
    #define E1000_RCTL_CFI		0x00100000	/* canonical form indicator */
    #define E1000_RCTL_DPF		0x00400000	/* discard pause frames */
    #define E1000_RCTL_PMCF		0x00800000	/* pass MAC control frames */
    #define E1000_RCTL_BSEX		0x02000000	/* Buffer size extension */
    
    /* SW_W_SYNC definitions */
    #define E1000_SWFW_EEP_SM     0x0001
    #define E1000_SWFW_PHY0_SM    0x0002
    #define E1000_SWFW_PHY1_SM    0x0004
    #define E1000_SWFW_MAC_CSR_SM 0x0008
    
    
    /* Receive Descriptor */
    #define E1000_RDT_DELAY 0x0000ffff	/* Delay timer (1=1024us) */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_RDT_FPDB	0x80000000	/* Flush descriptor block */
    
    #define E1000_RDLEN_LEN 0x0007ff80	/* descriptor length */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_RDH_RDH	0x0000ffff	/* receive descriptor head */
    #define E1000_RDT_RDT	0x0000ffff	/* receive descriptor tail */
    
    
    /* Flow Control */
    #define E1000_FCRTH_RTH  0x0000FFF8	/* Mask Bits[15:3] for RTH */
    #define E1000_FCRTH_XFCE 0x80000000	/* External Flow Control Enable */
    #define E1000_FCRTL_RTL  0x0000FFF8	/* Mask Bits[15:3] for RTL */
    #define E1000_FCRTL_XONE 0x80000000	/* Enable XON frame transmission */
    
    /* Receive Descriptor Control */
    #define E1000_RXDCTL_PTHRESH 0x0000003F	/* RXDCTL Prefetch Threshold */
    #define E1000_RXDCTL_HTHRESH 0x00003F00	/* RXDCTL Host Threshold */
    #define E1000_RXDCTL_WTHRESH 0x003F0000	/* RXDCTL Writeback Threshold */
    #define E1000_RXDCTL_GRAN    0x01000000	/* RXDCTL Granularity */
    
    #define E1000_RXDCTL_FULL_RX_DESC_WB 0x01010000	/* GRAN=1, WTHRESH=1 */
    
    
    /* Transmit Descriptor Control */
    
    #define E1000_TXDCTL_PTHRESH 0x0000003F	/* TXDCTL Prefetch Threshold */
    #define E1000_TXDCTL_HTHRESH 0x00003F00	/* TXDCTL Host Threshold */
    #define E1000_TXDCTL_WTHRESH 0x003F0000	/* TXDCTL Writeback Threshold */
    
    #define E1000_TXDCTL_GRAN    0x01000000	/* TXDCTL Granularity */
    #define E1000_TXDCTL_LWTHRESH 0xFE000000	/* TXDCTL Low Threshold */
    #define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000	/* GRAN=1, WTHRESH=1 */
    
    #define E1000_TXDCTL_COUNT_DESC 0x00400000 /* Enable the counting of desc.
    					      still to be processed. */
    
    
    /* Transmit Configuration Word */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_TXCW_FD	      0x00000020	/* TXCW full duplex */
    #define E1000_TXCW_HD	      0x00000040	/* TXCW half duplex */
    
    #define E1000_TXCW_PAUSE      0x00000080	/* TXCW sym pause request */
    #define E1000_TXCW_ASM_DIR    0x00000100	/* TXCW astm pause direction */
    #define E1000_TXCW_PAUSE_MASK 0x00000180	/* TXCW pause request mask */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_TXCW_RF	      0x00003000	/* TXCW remote fault */
    #define E1000_TXCW_NP	      0x00008000	/* TXCW next page */
    #define E1000_TXCW_CW	      0x0000ffff	/* TxConfigWord mask */
    #define E1000_TXCW_TXC	      0x40000000	/* Transmit Config control */
    #define E1000_TXCW_ANE	      0x80000000	/* Auto-neg enable */
    
    
    /* Receive Configuration Word */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_RXCW_CW	 0x0000ffff	/* RxConfigWord mask */
    #define E1000_RXCW_NC	 0x04000000	/* Receive config no carrier */
    #define E1000_RXCW_IV	 0x08000000	/* Receive config invalid */
    #define E1000_RXCW_CC	 0x10000000	/* Receive config change */
    #define E1000_RXCW_C	 0x20000000	/* Receive config */
    
    #define E1000_RXCW_SYNCH 0x40000000	/* Receive config synch */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_RXCW_ANC	 0x80000000	/* Auto-neg complete */
    
    
    /* Transmit Control */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_TCTL_RST	  0x00000001	/* software reset */
    #define E1000_TCTL_EN	  0x00000002	/* enable tx */
    #define E1000_TCTL_BCE	  0x00000004	/* busy check enable */
    #define E1000_TCTL_PSP	  0x00000008	/* pad short packets */
    #define E1000_TCTL_CT	  0x00000ff0	/* collision threshold */
    
    #define E1000_TCTL_COLD   0x003ff000	/* collision distance */
    #define E1000_TCTL_SWXOFF 0x00400000	/* SW Xoff transmission */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_TCTL_PBE	  0x00800000	/* Packet Burst Enable */
    
    #define E1000_TCTL_RTLC   0x01000000	/* Re-transmit on late collision */
    #define E1000_TCTL_NRTU   0x02000000	/* No Re-transmit on underrun */
    
    #define E1000_TCTL_MULR   0x10000000    /* Multiple request support */
    
    
    /* Receive Checksum Control */
    #define E1000_RXCSUM_PCSS_MASK 0x000000FF	/* Packet Checksum Start */
    #define E1000_RXCSUM_IPOFL     0x00000100	/* IPv4 checksum offload */
    #define E1000_RXCSUM_TUOFL     0x00000200	/* TCP / UDP checksum offload */
    #define E1000_RXCSUM_IPV6OFL   0x00000400	/* IPv6 checksum offload */
    
    /* Definitions for power management and wakeup registers */
    /* Wake Up Control */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_WUC_APME	     0x00000001	/* APM Enable */
    
    #define E1000_WUC_PME_EN     0x00000002	/* PME Enable */
    #define E1000_WUC_PME_STATUS 0x00000004	/* PME Status */
    #define E1000_WUC_APMPME     0x00000008	/* Assert PME on APM Wakeup */
    
    /* Wake Up Filter Control */
    #define E1000_WUFC_LNKC 0x00000001	/* Link Status Change Wakeup Enable */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_WUFC_MAG	0x00000002	/* Magic Packet Wakeup Enable */
    #define E1000_WUFC_EX	0x00000004	/* Directed Exact Wakeup Enable */
    #define E1000_WUFC_MC	0x00000008	/* Directed Multicast Wakeup Enable */
    #define E1000_WUFC_BC	0x00000010	/* Broadcast Wakeup Enable */
    #define E1000_WUFC_ARP	0x00000020	/* ARP Request Packet Wakeup Enable */
    
    #define E1000_WUFC_IPV4 0x00000040	/* Directed IPv4 Packet Wakeup Enable */
    #define E1000_WUFC_IPV6 0x00000080	/* Directed IPv6 Packet Wakeup Enable */
    #define E1000_WUFC_FLX0 0x00010000	/* Flexible Filter 0 Enable */
    #define E1000_WUFC_FLX1 0x00020000	/* Flexible Filter 1 Enable */
    #define E1000_WUFC_FLX2 0x00040000	/* Flexible Filter 2 Enable */
    #define E1000_WUFC_FLX3 0x00080000	/* Flexible Filter 3 Enable */
    #define E1000_WUFC_ALL_FILTERS 0x000F00FF	/* Mask for all wakeup filters */
    #define E1000_WUFC_FLX_OFFSET 16	/* Offset to the Flexible Filters bits */
    #define E1000_WUFC_FLX_FILTERS 0x000F0000	/* Mask for the 4 flexible filters */
    
    /* Wake Up Status */
    #define E1000_WUS_LNKC 0x00000001	/* Link Status Changed */
    #define E1000_WUS_MAG  0x00000002	/* Magic Packet Received */
    #define E1000_WUS_EX   0x00000004	/* Directed Exact Received */
    #define E1000_WUS_MC   0x00000008	/* Directed Multicast Received */
    #define E1000_WUS_BC   0x00000010	/* Broadcast Received */
    #define E1000_WUS_ARP  0x00000020	/* ARP Request Packet Received */
    #define E1000_WUS_IPV4 0x00000040	/* Directed IPv4 Packet Wakeup Received */
    #define E1000_WUS_IPV6 0x00000080	/* Directed IPv6 Packet Wakeup Received */
    #define E1000_WUS_FLX0 0x00010000	/* Flexible Filter 0 Match */
    #define E1000_WUS_FLX1 0x00020000	/* Flexible Filter 1 Match */
    #define E1000_WUS_FLX2 0x00040000	/* Flexible Filter 2 Match */
    #define E1000_WUS_FLX3 0x00080000	/* Flexible Filter 3 Match */
    #define E1000_WUS_FLX_FILTERS 0x000F0000	/* Mask for the 4 flexible filters */
    
    /* Management Control */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_MANC_SMBUS_EN	 0x00000001	/* SMBus Enabled - RO */
    #define E1000_MANC_ASF_EN	 0x00000002	/* ASF Enabled - RO */
    #define E1000_MANC_R_ON_FORCE	 0x00000004	/* Reset on Force TCO - RO */
    #define E1000_MANC_RMCP_EN	 0x00000100	/* Enable RCMP 026Fh Filtering */
    #define E1000_MANC_0298_EN	 0x00000200	/* Enable RCMP 0298h Filtering */
    #define E1000_MANC_IPV4_EN	 0x00000400	/* Enable IPv4 */
    #define E1000_MANC_IPV6_EN	 0x00000800	/* Enable IPv6 */
    #define E1000_MANC_SNAP_EN	 0x00001000	/* Accept LLC/SNAP */
    #define E1000_MANC_ARP_EN	 0x00002000	/* Enable ARP Request Filtering */
    #define E1000_MANC_NEIGHBOR_EN	 0x00004000	/* Enable Neighbor Discovery
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_MANC_TCO_RESET	 0x00010000	/* TCO Reset Occurred */
    #define E1000_MANC_RCV_TCO_EN	 0x00020000	/* Receive TCO Packets Enabled */
    
    #define E1000_MANC_REPORT_STATUS 0x00040000	/* Status Reporting Enabled */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_MANC_SMB_REQ	 0x01000000	/* SMBus Request */
    #define E1000_MANC_SMB_GNT	 0x02000000	/* SMBus Grant */
    #define E1000_MANC_SMB_CLK_IN	 0x04000000	/* SMBus Clock In */
    #define E1000_MANC_SMB_DATA_IN	 0x08000000	/* SMBus Data In */
    
    #define E1000_MANC_SMB_DATA_OUT  0x10000000	/* SMBus Data Out */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_MANC_SMB_CLK_OUT	 0x20000000	/* SMBus Clock Out */
    
    
    #define E1000_MANC_SMB_DATA_OUT_SHIFT  28	/* SMBus Data Out Shift */
    #define E1000_MANC_SMB_CLK_OUT_SHIFT   29	/* SMBus Clock Out Shift */
    
    /* Wake Up Packet Length */
    #define E1000_WUPL_LENGTH_MASK 0x0FFF	/* Only the lower 12 bits are valid */
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_MDALIGN	       4096
    
    
    /* EEPROM Commands */
    #define EEPROM_READ_OPCODE  0x6	/* EERPOM read opcode */
    #define EEPROM_WRITE_OPCODE 0x5	/* EERPOM write opcode */
    #define EEPROM_ERASE_OPCODE 0x7	/* EERPOM erase opcode */
    #define EEPROM_EWEN_OPCODE  0x13	/* EERPOM erase/write enable */
    #define EEPROM_EWDS_OPCODE  0x10	/* EERPOM erast/write disable */
    
    /* Word definitions for ID LED Settings */
    #define ID_LED_RESERVED_0000 0x0000
    #define ID_LED_RESERVED_FFFF 0xFFFF
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define ID_LED_DEFAULT	     ((ID_LED_OFF1_ON2 << 12) | \
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    			      (ID_LED_OFF1_OFF2 << 8) | \
    			      (ID_LED_DEF1_DEF2 << 4) | \
    			      (ID_LED_DEF1_DEF2))
    
    #define ID_LED_DEF1_DEF2     0x1
    #define ID_LED_DEF1_ON2      0x2
    #define ID_LED_DEF1_OFF2     0x3
    #define ID_LED_ON1_DEF2      0x4
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define ID_LED_ON1_ON2	     0x5
    
    #define ID_LED_ON1_OFF2      0x6
    #define ID_LED_OFF1_DEF2     0x7
    #define ID_LED_OFF1_ON2      0x8
    #define ID_LED_OFF1_OFF2     0x9
    
    /* Mask bits for fields in Word 0x03 of the EEPROM */
    #define EEPROM_COMPAT_SERVER 0x0400
    #define EEPROM_COMPAT_CLIENT 0x0200
    
    /* Mask bits for fields in Word 0x0a of the EEPROM */
    #define EEPROM_WORD0A_ILOS   0x0010
    #define EEPROM_WORD0A_SWDPIO 0x01E0
    #define EEPROM_WORD0A_LRST   0x0200
    #define EEPROM_WORD0A_FD     0x0400
    #define EEPROM_WORD0A_66MHZ  0x0800
    
    /* Mask bits for fields in Word 0x0f of the EEPROM */
    #define EEPROM_WORD0F_PAUSE_MASK 0x3000
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define EEPROM_WORD0F_PAUSE	 0x1000
    #define EEPROM_WORD0F_ASM_DIR	 0x2000
    #define EEPROM_WORD0F_ANE	 0x0800
    
    #define EEPROM_WORD0F_SWPDIO_EXT 0x00F0
    
    /* For checksumming, the sum of all words in the EEPROM should equal 0xBABA. */
    #define EEPROM_SUM 0xBABA
    
    /* EEPROM Map defines (WORD OFFSETS)*/
    #define EEPROM_NODE_ADDRESS_BYTE_0 0
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define EEPROM_PBA_BYTE_1	   8
    
    
    /* EEPROM Map Sizes (Byte Counts) */
    #define PBA_SIZE 4
    
    /* Collision related configuration parameters */
    
    #define E1000_COLLISION_THRESHOLD	0xF
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CT_SHIFT			4
    
    #define E1000_COLLISION_DISTANCE        63
    #define E1000_COLLISION_DISTANCE_82542  64
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_FDX_COLLISION_DISTANCE	E1000_COLLISION_DISTANCE
    #define E1000_HDX_COLLISION_DISTANCE	E1000_COLLISION_DISTANCE
    
    #define E1000_GB_HDX_COLLISION_DISTANCE 512
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_COLD_SHIFT		12
    
    
    /* The number of Transmit and Receive Descriptors must be a multiple of 8 */
    #define REQ_TX_DESCRIPTOR_MULTIPLE  8
    #define REQ_RX_DESCRIPTOR_MULTIPLE  8
    
    /* Default values for the transmit IPG register */
    #define DEFAULT_82542_TIPG_IPGT        10
    #define DEFAULT_82543_TIPG_IPGT_FIBER  9
    #define DEFAULT_82543_TIPG_IPGT_COPPER 8
    
    #define E1000_TIPG_IPGT_MASK  0x000003FF
    #define E1000_TIPG_IPGR1_MASK 0x000FFC00
    #define E1000_TIPG_IPGR2_MASK 0x3FF00000
    
    #define DEFAULT_82542_TIPG_IPGR1 2
    #define DEFAULT_82543_TIPG_IPGR1 8
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_TIPG_IPGR1_SHIFT	10
    
    
    #define DEFAULT_82542_TIPG_IPGR2 10
    #define DEFAULT_82543_TIPG_IPGR2 6
    
    #define DEFAULT_80003ES2LAN_TIPG_IPGR2 7
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_TIPG_IPGR2_SHIFT	20
    
    
    #define E1000_TXDMAC_DPP 0x00000001
    
    /* Adaptive IFS defines */
    #define TX_THRESHOLD_START     8
    #define TX_THRESHOLD_INCREMENT 10
    #define TX_THRESHOLD_DECREMENT 1
    #define TX_THRESHOLD_STOP      190
    #define TX_THRESHOLD_DISABLE   0
    #define TX_THRESHOLD_TIMER_MS  10000
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define MIN_NUM_XMITS	       1000
    #define IFS_MAX		       80
    #define IFS_STEP	       10
    #define IFS_MIN		       40
    #define IFS_RATIO	       4
    
    
    /* PBA constants */
    #define E1000_PBA_16K 0x0010	/* 16KB, default TX allocation */
    #define E1000_PBA_24K 0x0018
    
    #define E1000_PBA_38K 0x0026
    
    #define E1000_PBA_40K 0x0028
    #define E1000_PBA_48K 0x0030	/* 48KB, default RX allocation */
    
    /* Flow Control Constants */
    #define FLOW_CONTROL_ADDRESS_LOW  0x00C28001
    #define FLOW_CONTROL_ADDRESS_HIGH 0x00000100
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define FLOW_CONTROL_TYPE	  0x8808
    
    
    /* The historical defaults for the flow control values are given below. */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define FC_DEFAULT_HI_THRESH	    (0x8000)	/* 32KB */
    #define FC_DEFAULT_LO_THRESH	    (0x4000)	/* 16KB */
    #define FC_DEFAULT_TX_TIMER	    (0x100)	/* ~130 us */
    
    
    /* Flow Control High-Watermark: 43464 bytes */
    #define E1000_FC_HIGH_THRESH 0xA9C8
    /* Flow Control Low-Watermark: 43456 bytes */
    #define E1000_FC_LOW_THRESH 0xA9C0
    /* Flow Control Pause Time: 858 usec */
    #define E1000_FC_PAUSE_TIME 0x0680
    
    /* PCIX Config space */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define PCIX_COMMAND_REGISTER	 0xE6
    
    #define PCIX_STATUS_REGISTER_LO  0xE8
    #define PCIX_STATUS_REGISTER_HI  0xEA
    
    #define PCIX_COMMAND_MMRBC_MASK      0x000C
    #define PCIX_COMMAND_MMRBC_SHIFT     0x2
    #define PCIX_STATUS_HI_MMRBC_MASK    0x0060
    #define PCIX_STATUS_HI_MMRBC_SHIFT   0x5
    #define PCIX_STATUS_HI_MMRBC_4K      0x3
    #define PCIX_STATUS_HI_MMRBC_2K      0x2
    
    /* The number of bits that we need to shift right to move the "pause"
     * bits from the EEPROM (bits 13:12) to the "pause" (bits 8:7) field
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
     * in the TXCW register
    
     */
    #define PAUSE_SHIFT 5
    
    /* The number of bits that we need to shift left to move the "SWDPIO"
     * bits from the EEPROM (bits 8:5) to the "SWDPIO" (bits 25:22) field
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
     * in the CTRL register
    
     */
    #define SWDPIO_SHIFT 17
    
    /* The number of bits that we need to shift left to move the "SWDPIO_EXT"
     * bits from the EEPROM word F (bits 7:4) to the bits 11:8 of The
     * Extended CTRL register.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
     * in the CTRL register
    
     */
    #define SWDPIO__EXT_SHIFT 4
    
    /* The number of bits that we need to shift left to move the "ILOS"
     * bit from the EEPROM (bit 4) to the "ILOS" (bit 7) field
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
     * in the CTRL register
    
     */
    #define ILOS_SHIFT  3
    
    #define RECEIVE_BUFFER_ALIGN_SIZE  (256)
    
    /* The number of milliseconds we wait for auto-negotiation to complete */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define LINK_UP_TIMEOUT		    500
    
    
    #define E1000_TX_BUFFER_SIZE ((uint32_t)1514)
    
    /* The carrier extension symbol, as received by the NIC. */
    #define CARRIER_EXTENSION   0x0F
    
    /* TBI_ACCEPT macro definition:
     *
     * This macro requires:
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
     *	adapter = a pointer to struct e1000_hw
     *	status = the 8 bit status field of the RX descriptor with EOP set
     *	error = the 8 bit error field of the RX descriptor with EOP set
     *	length = the sum of all the length fields of the RX descriptors that
     *		 make up the current frame
     *	last_byte = the last byte of the frame DMAed by the hardware
     *	max_frame_length = the maximum frame length we want to accept.
     *	min_frame_length = the minimum frame length we want to accept.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
     * This macro is a conditional that should be used in the interrupt
    
     * handler's Rx processing routine when RxErrors have been detected.
     *
     * Typical use:
     *  ...
     *  if (TBI_ACCEPT) {
    
    York Sun's avatar
    York Sun committed
     *	accept_frame = true;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
     *	e1000_tbi_adjust_stats(adapter, MacAddress);
     *	frame_length--;
    
    York Sun's avatar
    York Sun committed
     *	accept_frame = false;
    
     *  }
     *  ...
     */
    
    #define TBI_ACCEPT(adapter, status, errors, length, last_byte) \
        ((adapter)->tbi_compatibility_on && \
         (((errors) & E1000_RXD_ERR_FRAME_ERR_MASK) == E1000_RXD_ERR_CE) && \
         ((last_byte) == CARRIER_EXTENSION) && \
         (((status) & E1000_RXD_STAT_VP) ? \
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	  (((length) > ((adapter)->min_frame_size - VLAN_TAG_SIZE)) && \
    	   ((length) <= ((adapter)->max_frame_size + 1))) : \
    	  (((length) > (adapter)->min_frame_size) && \
    	   ((length) <= ((adapter)->max_frame_size + VLAN_TAG_SIZE + 1)))))
    
    
    /* Structures, enums, and macros for the PHY */
    
    /* Bit definitions for the Management Data IO (MDIO) and Management Data
     * Clock (MDC) pins in the Device Control Register.
     */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define E1000_CTRL_PHY_RESET_DIR	E1000_CTRL_SWDPIO0
    #define E1000_CTRL_PHY_RESET		E1000_CTRL_SWDPIN0
    #define E1000_CTRL_MDIO_DIR		E1000_CTRL_SWDPIO2
    #define E1000_CTRL_MDIO			E1000_CTRL_SWDPIN2
    #define E1000_CTRL_MDC_DIR		E1000_CTRL_SWDPIO3
    #define E1000_CTRL_MDC			E1000_CTRL_SWDPIN3
    #define E1000_CTRL_PHY_RESET_DIR4	E1000_CTRL_EXT_SDP4_DIR
    #define E1000_CTRL_PHY_RESET4		E1000_CTRL_EXT_SDP4_DATA
    
    
    /* PHY 1000 MII Register/Bit Definitions */
    /* PHY Registers defined by IEEE */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define PHY_CTRL			0x00	/* Control Register */
    #define PHY_STATUS			0x01	/* Status Regiser */
    #define PHY_ID1				0x02	/* Phy Id Reg (word 1) */
    #define PHY_ID2				0x03	/* Phy Id Reg (word 2) */
    #define PHY_AUTONEG_ADV		0x04	/* Autoneg Advertisement */
    #define PHY_LP_ABILITY			0x05	/* Link Partner Ability (Base Page) */
    #define PHY_AUTONEG_EXP		0x06	/* Autoneg Expansion Reg */
    #define PHY_NEXT_PAGE_TX		0x07	/* Next Page TX */
    #define PHY_LP_NEXT_PAGE		0x08	/* Link Partner Next Page */
    #define PHY_1000T_CTRL			0x09	/* 1000Base-T Control Reg */
    #define PHY_1000T_STATUS		0x0A	/* 1000Base-T Status Reg */
    #define PHY_EXT_STATUS			0x0F	/* Extended Status Reg */
    
    
    /* M88E1000 Specific Registers */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define M88E1000_PHY_SPEC_CTRL		0x10	/* PHY Specific Control Register */
    #define M88E1000_PHY_SPEC_STATUS	0x11	/* PHY Specific Status Register */
    #define M88E1000_INT_ENABLE		0x12	/* Interrupt Enable Register */
    #define M88E1000_INT_STATUS		0x13	/* Interrupt Status Register */
    #define M88E1000_EXT_PHY_SPEC_CTRL	0x14	/* Extended PHY Specific Control */
    #define M88E1000_RX_ERR_CNTR		0x15	/* Receive Error Counter */
    
    #define M88E1000_PHY_PAGE_SELECT   0x1D  /* Reg 29 for page number setting */
    #define M88E1000_PHY_GEN_CONTROL   0x1E  /* Its meaning depends on reg 29 */
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define MAX_PHY_REG_ADDRESS		0x1F	/* 5 bit address bus (0-0x1F) */
    
    /* M88EC018 Rev 2 specific DownShift settings */
    #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK  0x0E00
    #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_1X    0x0000
    #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_2X    0x0200
    #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_3X    0x0400
    #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_4X    0x0600
    #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X    0x0800
    #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_6X    0x0A00
    #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_7X    0x0C00
    #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_8X    0x0E00
    
    
    Andre Schwarz's avatar
    Andre Schwarz committed
    /* IGP01E1000 specifics */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define IGP01E1000_IEEE_REGS_PAGE	0x0000
    
    Andre Schwarz's avatar
    Andre Schwarz committed
    #define IGP01E1000_IEEE_RESTART_AUTONEG 0x3300
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define IGP01E1000_IEEE_FORCE_GIGA	0x0140
    
    Andre Schwarz's avatar
    Andre Schwarz committed
    
    /* IGP01E1000 Specific Registers */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #define IGP01E1000_PHY_PORT_CONFIG	0x10 /* PHY Specific Port Config Register */
    #define IGP01E1000_PHY_PORT_STATUS	0x11 /* PHY Specific Status Register */
    #define IGP01E1000_PHY_PORT_CTRL	0x12 /* PHY Specific Control Register */
    #define IGP01E1000_PHY_LINK_HEALTH	0x13 /* PHY Link Health Register */
    #define IGP01E1000_GMII_FIFO		0x14 /* GMII FIFO Register */
    #define IGP01E1000_PHY_CHANNEL_QUALITY	0x15 /* PHY Channel Quality Register */
    #define IGP02E1000_PHY_POWER_MGMT	0x19
    #define IGP01E1000_PHY_PAGE_SELECT	0x1F /* PHY Page Select Core Register */
    
    /* IGP01E1000 AGC Registers - stores the cable length values*/
    #define IGP01E1000_PHY_AGC_A        0x1172
    #define IGP01E1000_PHY_AGC_B        0x1272
    #define IGP01E1000_PHY_AGC_C        0x1472
    #define IGP01E1000_PHY_AGC_D        0x1872
    
    /* IGP01E1000 Specific Port Config Register - R/W */
    #define IGP01E1000_PSCFR_AUTO_MDIX_PAR_DETECT  0x0010
    #define IGP01E1000_PSCFR_PRE_EN                0x0020
    #define IGP01E1000_PSCFR_SMART_SPEED           0x0080
    #define IGP01E1000_PSCFR_DISABLE_TPLOOPBACK    0x0100
    #define IGP01E1000_PSCFR_DISABLE_JABBER        0x0400
    #define IGP01E1000_PSCFR_DISABLE_TRANSMIT      0x2000
    /* IGP02E1000 AGC Registers for cable length values */
    #define IGP02E1000_PHY_AGC_A        0x11B1
    #define IGP02E1000_PHY_AGC_B        0x12B1
    #define IGP02E1000_PHY_AGC_C        0x14B1
    #define IGP02E1000_PHY_AGC_D        0x18B1
    
    #define IGP02E1000_PM_SPD                         0x0001  /* Smart Power Down */
    #define IGP02E1000_PM_D3_LPLU                     0x0004  /* Enable LPLU in
    							     non-D0a modes */
    #define IGP02E1000_PM_D0_LPLU                     0x0002  /* Enable LPLU in
    							     D0a mode */
    
    /* IGP01E1000 DSP Reset Register */
    #define IGP01E1000_PHY_DSP_RESET   0x1F33
    #define IGP01E1000_PHY_DSP_SET     0x1F71
    #define IGP01E1000_PHY_DSP_FFE     0x1F35
    
    #define IGP01E1000_PHY_CHANNEL_NUM    4
    #define IGP02E1000_PHY_CHANNEL_NUM    4
    
    #define IGP01E1000_PHY_AGC_PARAM_A    0x1171
    #define IGP01E1000_PHY_AGC_PARAM_B    0x1271
    #define IGP01E1000_PHY_AGC_PARAM_C    0x1471
    #define IGP01E1000_PHY_AGC_PARAM_D    0x1871
    
    #define IGP01E1000_PHY_EDAC_MU_INDEX        0xC000
    #define IGP01E1000_PHY_EDAC_SIGN_EXT_9_BITS 0x8000
    
    #define IGP01E1000_PHY_ANALOG_TX_STATE      0x2890
    #define IGP01E1000_PHY_ANALOG_CLASS_A       0x2000
    #define IGP01E1000_PHY_FORCE_ANALOG_ENABLE  0x0004
    #define IGP01E1000_PHY_DSP_FFE_CM_CP        0x0069
    
    #define IGP01E1000_PHY_DSP_FFE_DEFAULT      0x002A
    /* IGP01E1000 PCS Initialization register - stores the polarity status when
     * speed = 1000 Mbps. */
    #define IGP01E1000_PHY_PCS_INIT_REG  0x00B4
    #define IGP01E1000_PHY_PCS_CTRL_REG  0x00B5
    
    #define IGP01E1000_ANALOG_REGS_PAGE  0x20C0
    
    /* IGP01E1000 GMII FIFO Register */
    #define IGP01E1000_GMII_FLEX_SPD               0x10 /* Enable flexible speed