126 DBGC ( cgem,
"CGEM %s timed out waiting for MII\n", cgem->
name );
171 unsigned int reg,
unsigned int data ) {
212 DBGC ( cgem,
"CGEM %s could not find PHY address: %s\n",
219 DBGC ( cgem,
"CGEM %s could not reset PHY: %s\n",
238 DBGC ( cgem,
"CGEM %s could not check link: %s\n",
287 for ( i = 0 ; i < ring->
count ; i++ ) {
300 DBGC ( cgem,
"CGEM %s ring %02x is at [%08lx,%08lx)\n",
302 ( virt_to_phys ( ring->
desc ) + ring->
len ) );
361 DBGC2 ( cgem,
"CGEM %s RX %d is [%08lx,%08lx)\n",
362 cgem->
name, rx_idx, virt_to_phys ( iobuf->
data ),
458 DBGC ( cgem,
"CGEM %s out of transmit descriptors\n",
488 DBGC2 ( cgem,
"CGEM %s TX %d is [%08lx,%08lx)\n",
489 cgem->
name, tx_idx, virt_to_phys ( iobuf->
data ),
490 ( virt_to_phys ( iobuf->
data ) +
iob_len ( iobuf ) ) );
514 DBGC2 ( cgem,
"CGEM %s TX %d complete\n",
515 cgem->
name, tx_idx );
553 DBGC2 ( cgem,
"CGEM %s RX %d complete (length %zd)\n",
618 memset ( cgem, 0,
sizeof ( *cgem ) );
630 if ( ! cgem->
regs ) {
645 DBGC ( cgem,
"CGEM %s could not fetch MAC: %s\n",
657 goto err_register_netdev;
701 "sifive,fu540-c000-gem",
#define CGEM_NUM_RX_DESC
Receive ring length.
static void cgem_poll_tx(struct net_device *netdev)
Poll for completed packets.
struct io_buffer * rx_iobuf[CGEM_NUM_RX_DESC]
Receive I/O buffers.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
#define CGEM_IDR_ALL
Disable all interrupts.
A Cadence GEM MAC address.
struct arbelprm_rc_send_wqe rc
static int cgem_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
#define iob_put(iobuf, len)
static unsigned int unsigned int reg
#define CGEM_RX_LEN
Length of receive buffers.
#define CGEM_DMACR_RXSIZE_MAX
Max RX memory size.
static void cgem_remove(struct dt_device *dt)
Remove devicetree device.
#define le32_to_cpu(value)
int(* open)(struct net_device *netdev)
Open network device.
struct cgem_descriptor * desc
Descriptors.
#define CGEM_RX_FL_LEN(x)
Receive flags.
static int cgem_probe(struct dt_device *dt, unsigned int offset)
Probe devicetree device.
#define CGEM_MII_MAX_WAIT_US
Maximum time to wait for PHY access, in microseconds.
static void cgem_poll_rx(struct net_device *netdev)
Poll for received packets.
static void netdev_tx_complete_next(struct net_device *netdev)
Complete network transmission.
int(* read)(struct mii_interface *mdio, unsigned int phy, unsigned int reg)
Read from MII register.
static struct mii_operations cgem_mii_operations
MII operations.
uint16_t len
Length of descriptors.
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
static int cgem_create_ring(struct cgem_nic *cgem, struct cgem_ring *ring)
Create descriptor ring.
#define CGEM_TX_FL_OWNED
Transmit flags.
static struct net_device_operations cgem_operations
Cadence GEM network device operations.
Cadence Gigabit Ethernet MAC (GEM) network driver.
struct mii_device mii
PHY device.
#define CGEM_NUM_TX_DESC
Transmit ring length.
#define CGEM_TX_FL_LAST
Last buffer in frame.
static void cgem_refill_rx(struct cgem_nic *cgem)
Refill receive descriptor ring.
#define CGEM_PHYMNTNC
PHY maintenance register.
static void cgem_expired(struct retry_timer *timer, int over __unused)
Check link state periodically.
uint8_t mac[ETH_ALEN]
MAC address.
struct net_device * netdev
Network device.
int fdt_mac(struct fdt *fdt, unsigned int offset, struct net_device *netdev)
Get MAC address from property.
unsigned int cons
Consumer index.
const char * name
Device name (for debugging)
struct cgem_ring tx
Transmit ring.
#define CGEM_NWSR_MII_IDLE
MII interface is idle.
static void mdio_init(struct mii_interface *mdio, struct mii_operations *op)
Initialise MII interface.
#define CGEM_NWCTRL_MDEN
MII interface enable.
struct mii_interface mdio
PHY interface.
static int cgem_mii_write(struct mii_interface *mdio, unsigned int phy, unsigned int reg, unsigned int data)
Write to MII register.
static void cgem_close(struct net_device *netdev)
Close network device.
struct device dev
Generic device.
static void cgem_init_ring(struct cgem_ring *ring, unsigned int count, unsigned int qbase)
Initialise descriptor ring.
static __always_inline int iob_map_tx(struct io_buffer *iobuf, struct dma_device *dma)
Map I/O buffer for transmit DMA.
struct dt_driver cgem_driver __dt_driver
Cadence GEM devicetree driver.
#define CGEM_DMACR
DMA configuration register.
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
#define CGEM_LADDRL
Local MAC address (low half) register.
struct ena_llq_option desc
Descriptor counts.
void dma_free(struct dma_mapping *map, void *addr, size_t len)
Unmap and free DMA-coherent buffer.
int(* probe)(struct dt_device *dt, unsigned int offset)
Probe device.
#define CGEM_NWCTRL_NORMAL
Normal value for network control register while up and running.
#define ENOMEM
Not enough space.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static int cgem_mii_read(struct mii_interface *mdio, unsigned int phy, unsigned int reg)
Read from MII register.
#define CGEM_NWCTRL_STATCLR
Clear statistics.
uint8_t qbase
Queue base address register.
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static int cgem_reset(struct cgem_nic *cgem)
Reset hardware.
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
#define container_of(ptr, type, field)
Get containing structure.
#define CGEM_PHYMNTNC_REG(x)
Register address.
void * priv
Driver private data.
#define __unused
Declare a variable or data structure as unused.
#define CGEM_DMACR_BLENGTH_MAX
Max DMA burst length.
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
static struct net_device * netdev
static __always_inline physaddr_t iob_dma(struct io_buffer *iobuf)
Get I/O buffer DMA address.
#define CGEM_PHYMNTNC_FIXED
Fixed value to write.
static void cgem_poll(struct net_device *netdev)
Poll for completed and received packets.
struct dma_device * dma
DMA device.
#define CGEM_NWCTRL_STARTTX
Start transmission.
static int cgem_open(struct net_device *netdev)
Open network device.
#define CGEM_PHYMNTNC_OP_READ
Read from PHY register.
#define CGEM_TXQBASE
TX queue base address register.
#define CGEM_NWCTRL
Network control register.
void unregister_netdev(struct net_device *netdev)
Unregister network device.
#define CGEM_RXQBASE
RX queue base address register.
#define cpu_to_le32(value)
#define CGEM_PHYMNTNC_DATA_MASK
Data mask.
A Cadence GEM descriptor ring.
#define CGEM_PHYMNTNC_CLAUSE22
Clause 22 operation.
char * strerror(int errno)
Retrieve string representation of error number.
struct refcnt refcnt
Reference counter.
static void dt_set_drvdata(struct dt_device *dt, void *priv)
Set devicetree driver-private data.
struct io_buffer * alloc_rx_iob(size_t len, struct dma_device *dma)
Allocate and map I/O buffer for receive DMA.
static int cgem_mii_wait(struct cgem_nic *cgem)
Wait for MII operation to complete.
int register_netdev(struct net_device *netdev)
Register network device.
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
uint32_t addr
Buffer address.
struct retry_timer timer
Link state timer.
#define CGEM_REG_IDX
I/O region index.
#define CGEM_TX_FL_WRAP
End of descriptor ring.
#define ENODEV
No such device.
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
int mii_reset(struct mii_device *mii)
Reset MII device.
void * dma_alloc(struct dma_device *dma, struct dma_mapping *map, size_t len, size_t align)
Allocate and map DMA-coherent buffer.
int mii_check_link(struct mii_device *mii, struct net_device *netdev)
Update link status via MII.
unsigned int prod
Producer index.
static struct xen_remove_from_physmap * remove
#define CGEM_RX_ADDR_OWNED
Receive flags (in buffer address)
#define CGEM_NWSR
Network status register.
Network device operations.
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
struct device * dev
Underlying hardware device.
static void mii_init(struct mii_device *mii, struct mii_interface *mdio, unsigned int address)
Initialise MII device.
#define CGEM_DMACR_TXSIZE_MAX
Max TX memory size.
A Cadence GEM network card.
Network device management.
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
MII interface operations.
int mii_find(struct mii_device *mii)
Find PHY address.
void stop_timer(struct retry_timer *timer)
Stop timer.
const char * name
Driver name.
static const char * cgem_ids[]
Cadence GEM compatible model identifiers.
void free_rx_iob(struct io_buffer *iobuf)
Unmap and free I/O buffer for receive DMA.
#define CGEM_LINK_INTERVAL
Link state check interval.
#define ENOBUFS
No buffer space available.
struct dma_mapping map
Descriptor ring DMA mapping.
#define CGEM_LADDRH
Local MAC address (high half) register.
void * data
Start of data.
static int cgem_init_phy(struct cgem_nic *cgem)
Initialise PHY.
struct cgem_ring rx
Receive ring.
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
void * dt_ioremap(struct dt_device *dt, unsigned int offset, unsigned int index, size_t len)
Map devicetree range.
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
void iounmap(volatile const void *io_addr)
Unmap I/O address.
uint8_t data[48]
Additional event data.
#define CGEM_PHYMNTNC_ADDR(x)
PHY address.
static int cgem_check_link(struct net_device *netdev)
Check link state.
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
uint16_t offset
Offset to command line.
#define CGEM_RX_ADDR_WRAP
End of descriptor ring.
#define CGEM_REG_LEN
I/O region length.
uint8_t count
Number of descriptors.
struct dma_device dma
DMA device.
#define NULL
NULL pointer (VOID *)
#define ETIMEDOUT
Connection timed out.
void iob_pad(struct io_buffer *iobuf, size_t min_len)
Pad I/O buffer.
physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
static void cgem_destroy_ring(struct cgem_nic *cgem, struct cgem_ring *ring)
Destroy descriptor ring.
#define CGEM_DMACR_RXBUF(x)
RX buffer size.
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
#define CGEM_IDR
Interrupt disable register.
static void * dt_get_drvdata(struct dt_device *dt)
Get devicetree driver-private data.
A Cadence GEM descriptor.
void * memset(void *dest, int character, size_t len) __nonnull
struct fdt sysfdt
The system flattened device tree (if present)