/** * @file e1000.h * * @brief Device driver implementation declarations for the * Intel Pro/1000 Gigabit Ethernet card(s). * * Parts of this code is based on the DragonflyBSD (FreeBSD) * implementation, and the fxp driver for Minix 3. * * @see http://svn.freebsd.org/viewvc/base/head/sys/dev/e1000/ * @see fxp.c * * @author Niek Linnenbank * @date September 2009 * */ #ifndef __E1000_H #define __E1000_H #include #include #include #include #include #include #include #include "e1000_hw.h" /** * @name Constants. * @{ */ /** Number of receive descriptors per card. */ #define E1000_RXDESC_NR 256 /** Number of transmit descriptors per card. */ #define E1000_TXDESC_NR 256 /** Number of I/O vectors to use. */ #define E1000_IOVEC_NR 16 /** Size of each I/O buffer per descriptor. */ #define E1000_IOBUF_SIZE 2048 /** Debug verbosity. */ #define E1000_VERBOSE 1 /** MAC address override variable. */ #define E1000_ENVVAR "E1000ETH" /** * @} */ /** * @name Status Flags. * @{ */ /** Card has been detected on the PCI bus. */ #define E1000_DETECTED (1 << 0) /** Card is enabled. */ #define E1000_ENABLED (1 << 1) /** Client has requested to receive packets. */ #define E1000_READING (1 << 2) /** Client has requested to write packets. */ #define E1000_WRITING (1 << 3) /** Received some packets on the card. */ #define E1000_RECEIVED (1 << 4) /** Transmitted some packets on the card. */ #define E1000_TRANSMIT (1 << 5) /** * @} */ /** * @name Macros. * @{ */ /** * @brief Print a debug message. * @param level Debug verbosity level. * @param args Arguments to printf(). */ #define E1000_DEBUG(level, args) \ if ((level) <= E1000_VERBOSE) \ { \ printf args; \ } \ /** * Read a byte from flash memory. * @param e e1000_t pointer. * @param reg Register offset. */ #define E1000_READ_FLASH_REG(e,reg) \ *(u32_t *) (((e)->flash) + (reg)) /** * Read a 16-bit word from flash memory. * @param e e1000_t pointer. * @param reg Register offset. */ #define E1000_READ_FLASH_REG16(e,reg) \ *(u16_t *) (((e)->flash) + (reg)) /** * Write a 16-bit word to flash memory. * @param e e1000_t pointer. * @param reg Register offset. * @param value New value. */ #define E1000_WRITE_FLASH_REG(e,reg,value) \ *((u32_t *) (((e)->flash) + (reg))) = (value) /** * Write a 16-bit word to flash memory. * @param e e1000_t pointer. * @param reg Register offset. * @param value New value. */ #define E1000_WRITE_FLASH_REG16(e,reg,value) \ *((u16_t *) (((e)->flash) + (reg))) = (value) /** * @} */ /** * @brief Describes the state of an Intel Pro/1000 card. */ typedef struct e1000 { char name[8]; /**< String containing the device name. */ int status; /**< Describes the card's current state. */ int irq; /**< Interrupt Request Vector. */ int irq_hook; /**< Interrupt Request Vector Hook. */ int revision; /**< Hardware Revision Number. */ u8_t *regs; /**< Memory mapped hardware registers. */ u8_t *flash; /**< Optional flash memory. */ u32_t flash_base_addr; /**< Flash base address. */ ether_addr_t address; /**< Ethernet MAC address. */ u16_t (*eeprom_read)(void *, int reg); /**< Function to read the EEPROM. */ int eeprom_done_bit; /**< Offset of the EERD.DONE bit. */ int eeprom_addr_off; /**< Offset of the EERD.ADDR field. */ e1000_rx_desc_t *rx_desc; /**< Receive Descriptor table. */ phys_bytes rx_desc_p; /**< Physical Receive Descriptor Address. */ int rx_desc_count; /**< Number of Receive Descriptors. */ char *rx_buffer; /**< Receive buffer returned by malloc(). */ int rx_buffer_size; /**< Size of the receive buffer. */ e1000_tx_desc_t *tx_desc; /**< Transmit Descriptor table. */ phys_bytes tx_desc_p; /**< Physical Transmit Descriptor Address. */ int tx_desc_count; /**< Number of Transmit Descriptors. */ char *tx_buffer; /**< Transmit buffer returned by malloc(). */ int tx_buffer_size; /**< Size of the transmit buffer. */ int client; /**< Process ID being served by e1000. */ message rx_message; /**< Read message received from client. */ message tx_message; /**< Write message received from client. */ size_t rx_size; /**< Size of one packet received. */ } e1000_t; #endif /* __E1000_H */