| #ifndef _RDC_H |
| #define _RDC_H |
| |
| /** @file |
| * |
| * RDC R6040 network driver |
| * |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); |
| |
| #include <stdint.h> |
| #include <ipxe/if_ether.h> |
| #include <ipxe/mii.h> |
| |
| /** RDC BAR size */ |
| #define RDC_BAR_SIZE 256 |
| |
| /** An RDC descriptor */ |
| struct rdc_descriptor { |
| /** Flags */ |
| uint16_t flags; |
| /** Length */ |
| uint16_t len; |
| /** Address */ |
| uint32_t addr; |
| /** Next descriptor */ |
| uint32_t next; |
| /** Reserved */ |
| uint32_t reserved; |
| } __attribute__ (( packed )); |
| |
| /** Descriptor is owned by NIC */ |
| #define RDC_FL_OWNED 0x8000 |
| |
| /** Packet OK */ |
| #define RDC_FL_OK 0x4000 |
| |
| /** MAC control register 0 */ |
| #define RDC_MCR0 0x00 |
| #define RDC_MCR0_FD 0x8000 /**< Full duplex */ |
| #define RDC_MCR0_TXEN 0x1000 /**< Transmit enable */ |
| #define RDC_MCR0_PROMISC 0x0020 /**< Promiscuous mode */ |
| #define RDC_MCR0_RXEN 0x0002 /**< Receive enable */ |
| |
| /** MAC control register 1 */ |
| #define RDC_MCR1 0x04 |
| #define RDC_MCR1_RST 0x0001 /**< MAC reset */ |
| |
| /** Maximum time to wait for reset */ |
| #define RDC_RESET_MAX_WAIT_MS 10 |
| |
| /** MAC transmit poll command register */ |
| #define RDC_MTPR 0x14 |
| #define RDC_MTPR_TM2TX 0x0001 /**< Trigger MAC to transmit */ |
| |
| /** MAC receive buffer size register */ |
| #define RDC_MRBSR 0x18 |
| |
| /** MAC MDIO control register */ |
| #define RDC_MMDIO 0x20 |
| #define RDC_MMDIO_MIIWR 0x4000 /**< MDIO write */ |
| #define RDC_MMDIO_MIIRD 0x2000 /**< MDIO read */ |
| #define RDC_MMDIO_PHYAD(x) ( (x) << 8 ) /**< PHY address */ |
| #define RDC_MMDIO_REGAD(x) ( (x) << 0 ) /**< Register address */ |
| |
| /** Maximum time to wait for an MII read or write */ |
| #define RDC_MII_MAX_WAIT_US 2048 |
| |
| /** MAC MDIO read data register */ |
| #define RDC_MMRD 0x24 |
| |
| /** MAC MDIO write data register */ |
| #define RDC_MMWD 0x28 |
| |
| /** MAC transmit descriptor start address */ |
| #define RDC_MTDSA 0x2c |
| |
| /** MAC receive descriptor start address */ |
| #define RDC_MRDSA 0x34 |
| |
| /** MAC descriptor start address low half */ |
| #define RDC_MxDSA_LO 0x0 |
| |
| /** MAC descriptor start address low half */ |
| #define RDC_MxDSA_HI 0x4 |
| |
| /** MAC interrupt status register */ |
| #define RDC_MISR 0x3c |
| #define RDC_MIRQ_LINK 0x0200 /**< Link status changed */ |
| #define RDC_MIRQ_TX 0x0010 /**< Transmit complete */ |
| #define RDC_MIRQ_RX_EARLY 0x0008 /**< Receive early interrupt */ |
| #define RDC_MIRQ_RX_EMPTY 0x0002 /**< Receive descriptor unavailable */ |
| #define RDC_MIRQ_RX 0x0001 /**< Receive complete */ |
| |
| /** MAC interrupt enable register */ |
| #define RDC_MIER 0x40 |
| |
| /** MAC address word 0 */ |
| #define RDC_MID0 0x68 |
| |
| /** MAC address word 1 */ |
| #define RDC_MID1 0x6a |
| |
| /** MAC address word 2 */ |
| #define RDC_MID2 0x6c |
| |
| /** MAC PHY status change configuration register */ |
| #define RDC_MPSCCR 0x88 |
| #define RDC_MPSCCR_EN 0x8000 /**< PHY status change enable */ |
| #define RDC_MPSCCR_PHYAD(x) ( (x) << 8 ) /**< PHY address */ |
| #define RDC_MPSCCR_SLOW 0x0007 /**< Poll slowly */ |
| |
| /** MAC state machine register */ |
| #define RDC_MACSM 0xac |
| #define RDC_MACSM_RST 0x0002 /**< Reset state machine */ |
| |
| /** Time to wait after resetting MAC state machine */ |
| #define RDC_MACSM_RESET_DELAY_MS 10 |
| |
| /** A MAC address */ |
| union rdc_mac { |
| /** Raw bytes */ |
| uint8_t raw[ETH_ALEN]; |
| /** MIDx registers */ |
| uint16_t mid[ ETH_ALEN / 2 ]; |
| }; |
| |
| /** A descriptor ring */ |
| struct rdc_ring { |
| /** Descriptors */ |
| struct rdc_descriptor *desc; |
| /** Descriptor ring DMA mapping */ |
| struct dma_mapping map; |
| /** Producer index */ |
| unsigned int prod; |
| /** Consumer index */ |
| unsigned int cons; |
| |
| /** Number of descriptors */ |
| unsigned int count; |
| /** Start address register 0 */ |
| unsigned int reg; |
| }; |
| |
| /** |
| * Initialise descriptor ring |
| * |
| * @v ring Descriptor ring |
| * @v count Number of descriptors |
| * @v reg Start address register 0 |
| */ |
| static inline __attribute__ (( always_inline )) void |
| rdc_init_ring ( struct rdc_ring *ring, unsigned int count, unsigned int reg ) { |
| |
| ring->count = count; |
| ring->reg = reg; |
| } |
| |
| /** Number of transmit descriptors |
| * |
| * This is a policy decision. |
| */ |
| #define RDC_NUM_TX_DESC 16 |
| |
| /** Number of receive descriptors |
| * |
| * This is a policy decision. |
| */ |
| #define RDC_NUM_RX_DESC 8 |
| |
| /** Receive buffer length */ |
| #define RDC_RX_MAX_LEN ( ETH_FRAME_LEN + 4 /* VLAN */ + 4 /* CRC */ ) |
| |
| /** An RDC network card */ |
| struct rdc_nic { |
| /** Registers */ |
| void *regs; |
| /** DMA device */ |
| struct dma_device *dma; |
| /** MII interface */ |
| struct mii_interface mdio; |
| /** MII device */ |
| struct mii_device mii; |
| |
| /** Transmit descriptor ring */ |
| struct rdc_ring tx; |
| /** Receive descriptor ring */ |
| struct rdc_ring rx; |
| /** Receive I/O buffers */ |
| struct io_buffer *rx_iobuf[RDC_NUM_RX_DESC]; |
| }; |
| |
| #endif /* _RDC_H */ |