iPXE
|
IC+ network driver. More...
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <byteswap.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include <ipxe/if_ether.h>
#include <ipxe/iobuf.h>
#include <ipxe/malloc.h>
#include <ipxe/pci.h>
#include "icplus.h"
Go to the source code of this file.
Functions | |
FILE_LICENCE (GPL2_OR_LATER_OR_UBDL) | |
static int | icplus_reset (struct icplus_nic *icp) |
Reset hardware. More... | |
static int | icplus_read_eeprom (struct nvs_device *nvs, unsigned int address, void *data, size_t len) |
Read data from EEPROM. More... | |
static int | icplus_write_eeprom (struct nvs_device *nvs, unsigned int address __unused, const void *data __unused, size_t len __unused) |
Write data to EEPROM. More... | |
static void | icplus_init_eeprom (struct icplus_nic *icp) |
Initialise EEPROM. More... | |
static int | icplus_mii_read_bit (struct bit_basher *basher, unsigned int bit_id) |
Read input bit. More... | |
static void | icplus_mii_write_bit (struct bit_basher *basher, unsigned int bit_id, unsigned long data) |
Set/clear output bit. More... | |
static int | icplus_init_phy (struct icplus_nic *icp) |
Configure PHY. More... | |
static void | icplus_check_link (struct net_device *netdev) |
Check link state. More... | |
static void | icplus_set_base (struct icplus_nic *icp, unsigned int offset, void *base) |
Set descriptor ring base address. More... | |
static int | icplus_create_ring (struct icplus_nic *icp, struct icplus_ring *ring) |
Create descriptor ring. More... | |
static void | icplus_destroy_ring (struct icplus_nic *icp __unused, struct icplus_ring *ring) |
Destroy descriptor ring. More... | |
void | icplus_refill_rx (struct icplus_nic *icp) |
Refill receive descriptor ring. More... | |
static int | icplus_open (struct net_device *netdev) |
Open network device. More... | |
static void | icplus_close (struct net_device *netdev) |
Close network device. More... | |
static int | icplus_transmit (struct net_device *netdev, struct io_buffer *iobuf) |
Transmit packet. More... | |
static void | icplus_poll_tx (struct net_device *netdev) |
Poll for completed packets. More... | |
static void | icplus_poll_rx (struct net_device *netdev) |
Poll for received packets. More... | |
static void | icplus_poll (struct net_device *netdev) |
Poll for completed and received packets. More... | |
static void | icplus_irq (struct net_device *netdev, int enable) |
Enable or disable interrupts. More... | |
static int | icplus_probe (struct pci_device *pci) |
Probe PCI device. More... | |
static void | icplus_remove (struct pci_device *pci) |
Remove PCI device. More... | |
Variables | |
static const uint8_t | icplus_mii_bits [] |
Pin mapping for MII bit-bashing interface. More... | |
static struct bit_basher_operations | icplus_basher_ops |
MII bit-bashing interface. More... | |
static struct net_device_operations | icplus_operations |
IC+ network device operations. More... | |
static struct pci_device_id | icplus_nics [] |
IC+ PCI device IDs. More... | |
struct pci_driver icplus_driver | __pci_driver |
IC+ PCI driver. More... | |
IC+ network driver.
Definition in file icplus.c.
FILE_LICENCE | ( | GPL2_OR_LATER_OR_UBDL | ) |
|
static |
Reset hardware.
icp | IC+ device |
rc | Return status code |
Definition at line 58 of file icplus.c.
References DBGC, ETIMEDOUT, ICP_ASICCTRL, ICP_ASICCTRL_AUTOINIT, ICP_ASICCTRL_DMA, ICP_ASICCTRL_FIFO, ICP_ASICCTRL_GLOBALRESET, ICP_ASICCTRL_HOST, ICP_ASICCTRL_NETWORK, ICP_ASICCTRL_RESETBUSY, ICP_RESET_MAX_WAIT_MS, mdelay(), readl(), icplus_nic::regs, and writel().
Referenced by icplus_close(), icplus_open(), icplus_probe(), and icplus_remove().
|
static |
Read data from EEPROM.
nvs | NVS device |
address | Address from which to read |
data | Data buffer |
len | Length of data buffer |
rc | Return status code |
Definition at line 100 of file icplus.c.
References address, assert(), container_of, cpu_to_le16, data, DBGC, ETIMEDOUT, ICP_EEPROM_MAX_WAIT_MS, ICP_EEPROMCTRL, ICP_EEPROMCTRL_ADDRESS, ICP_EEPROMCTRL_BUSY, ICP_EEPROMCTRL_OPCODE_READ, ICP_EEPROMDATA, len, mdelay(), readw(), icplus_nic::regs, and writew.
Referenced by icplus_init_eeprom().
|
static |
Write data to EEPROM.
nvs | NVS device |
address | Address to which to write |
data | Data buffer |
len | Length of data buffer |
rc | Return status code |
Definition at line 146 of file icplus.c.
References container_of, DBGC, and ENOTSUP.
Referenced by icplus_init_eeprom().
|
static |
Initialise EEPROM.
icp | IC+ device |
Definition at line 162 of file icplus.c.
References nvs_device::block_size, icplus_nic::eeprom, ICP_EEPROM_MIN_SIZE_WORDS, ICP_EEPROM_WORD_LEN_LOG2, icplus_read_eeprom(), icplus_write_eeprom(), nvs_device::read, nvs_device::size, nvs_device::word_len_log2, and nvs_device::write.
Referenced by icplus_probe().
|
static |
Read input bit.
basher | Bit-bashing interface |
bit_id | Bit number |
zero | Input is a logic 0 |
non-zero | Input is a logic 1 |
Definition at line 194 of file icplus.c.
References mii_bit_basher::basher, container_of, DBG_DISABLE, DBG_ENABLE, DBGLVL_IO, ICP_PHYCTRL, icplus_mii_bits, icplus_nic::miibit, readb(), reg, and icplus_nic::regs.
|
static |
Set/clear output bit.
basher | Bit-bashing interface |
bit_id | Bit number |
data | Value to write |
Definition at line 214 of file icplus.c.
References mii_bit_basher::basher, container_of, data, DBG_DISABLE, DBG_ENABLE, DBGLVL_IO, ICP_PHYCTRL, icplus_mii_bits, icplus_nic::miibit, readb(), reg, icplus_nic::regs, and writeb().
|
static |
Configure PHY.
icp | IC+ device |
rc | Return status code |
Definition at line 249 of file icplus.c.
References ADVERTISE_1000FULL, DBGC, ICP_ASICCTRL, ICP_ASICCTRL_PHYSPEED1000, icplus_nic::mii, MII_CTRL1000, mii_find(), mii_reset(), mii_write(), rc, readl(), icplus_nic::regs, and strerror().
Referenced by icplus_probe().
|
static |
Check link state.
netdev | Network device |
Definition at line 286 of file icplus.c.
References DBGC, ICP_PHYCTRL, ICP_PHYCTRL_LINKSPEED, netdev, netdev_link_down(), netdev_link_up(), net_device::priv, readb(), and icplus_nic::regs.
Referenced by icplus_open(), icplus_poll(), and icplus_probe().
|
inlinestatic |
Set descriptor ring base address.
icp | IC+ device |
offset | Register offset |
address | Base address |
Definition at line 316 of file icplus.c.
References base, ICP_BASE_HI, ICP_BASE_LO, offset, phys, icplus_nic::regs, virt_to_bus(), and writel().
Referenced by icplus_open().
|
static |
Create descriptor ring.
icp | IC+ device |
ring | Descriptor ring |
rc | Return status code |
Definition at line 338 of file icplus.c.
References icplus_ring::cons, cpu_to_le64, DBGC, desc, ENOMEM, icplus_ring::entry, free_phys(), ICP_ALIGN, ICP_DONE, ICP_NUM_DESC, ICP_TFDLISTPTR, ICP_TX_INDICATE, ICP_TX_SOLE_FRAG, ICP_TX_UNALIGN, len, icplus_ring::listptr, malloc_phys(), memset(), next, NULL, icplus_ring::prod, rc, and virt_to_bus().
Referenced by icplus_open().
|
static |
Destroy descriptor ring.
icp | IC+ device |
ring | Descriptor ring |
Definition at line 384 of file icplus.c.
References icplus_ring::entry, free_phys(), ICP_NUM_DESC, len, and NULL.
Referenced by icplus_close(), and icplus_open().
void icplus_refill_rx | ( | struct icplus_nic * | icp | ) |
Refill receive descriptor ring.
icp | IC+ device |
Definition at line 398 of file icplus.c.
References address, alloc_iob(), assert(), icplus_ring::cons, cpu_to_le16, cpu_to_le64, io_buffer::data, DBGC2, desc, icplus_ring::entry, ICP_DMACTRL, ICP_DMACTRL_RXPOLLNOW, ICP_NUM_DESC, ICP_RX_MAX_LEN, NULL, icplus_ring::prod, icplus_nic::regs, icplus_nic::rx, icplus_nic::rx_iobuf, virt_to_bus(), wmb(), and writew.
Referenced by icplus_open(), and icplus_poll().
|
static |
Open network device.
netdev | Network device |
rc | Return status code |
Definition at line 449 of file icplus.c.
References icplus_ring::entry, ICP_MACCTRL, ICP_MACCTRL_DUPLEX, ICP_MACCTRL_RXENABLE, ICP_MACCTRL_TXENABLE, ICP_RXMODE, ICP_RXMODE_ALLFRAMES, ICP_RXMODE_BROADCAST, ICP_RXMODE_MULTICAST, ICP_RXMODE_UNICAST, icplus_check_link(), icplus_create_ring(), icplus_destroy_ring(), icplus_refill_rx(), icplus_reset(), icplus_set_base(), icplus_ring::listptr, netdev, net_device::priv, rc, icplus_nic::regs, icplus_nic::rx, icplus_nic::tx, writel(), and writew.
|
static |
Close network device.
netdev | Network device |
Definition at line 495 of file icplus.c.
References free_iob(), ICP_NUM_DESC, icplus_destroy_ring(), icplus_reset(), netdev, NULL, net_device::priv, icplus_nic::rx, icplus_nic::rx_iobuf, and icplus_nic::tx.
|
static |
Transmit packet.
netdev | Network device |
iobuf | I/O buffer |
rc | Return status code |
Definition at line 523 of file icplus.c.
References address, icplus_ring::cons, cpu_to_le16, cpu_to_le64, io_buffer::data, DBGC, DBGC2, DBGC2_HDA, desc, ENOBUFS, icplus_ring::entry, ICP_DMACTRL, ICP_DMACTRL_TXPOLLNOW, ICP_NUM_DESC, ICP_TX_SOLE_FRAG, iob_len(), netdev, net_device::priv, icplus_ring::prod, icplus_nic::regs, icplus_nic::tx, virt_to_bus(), virt_to_phys(), wmb(), and writew.
|
static |
Poll for completed packets.
netdev | Network device |
Definition at line 563 of file icplus.c.
References icplus_ring::cons, DBGC2, desc, icplus_ring::entry, ICP_DONE, ICP_NUM_DESC, netdev, netdev_tx_complete_next(), net_device::priv, icplus_ring::prod, and icplus_nic::tx.
Referenced by icplus_poll().
|
static |
Poll for received packets.
netdev | Network device |
Definition at line 591 of file icplus.c.
References icplus_ring::cons, DBGC, DBGC2, desc, EIO, icplus_ring::entry, ICP_DONE, ICP_NUM_DESC, ICP_RX_ERR_ALIGN, ICP_RX_ERR_FCS, ICP_RX_ERR_LEN, ICP_RX_ERR_OVERRUN, ICP_RX_ERR_OVERSIZED, ICP_RX_ERR_RUNT, iob_put, le16_to_cpu, len, netdev, netdev_rx(), netdev_rx_err(), NULL, net_device::priv, icplus_ring::prod, icplus_nic::rx, and icplus_nic::rx_iobuf.
Referenced by icplus_poll().
|
static |
Poll for completed and received packets.
netdev | Network device |
Definition at line 636 of file icplus.c.
References DBGC, ICP_INTSTATUS, ICP_INTSTATUS_LINKEVENT, ICP_INTSTATUS_RXDMACOMPLETE, ICP_INTSTATUS_TXCOMPLETE, ICP_TXSTATUS, ICP_TXSTATUS_ERROR, icplus_check_link(), icplus_poll_rx(), icplus_poll_tx(), icplus_refill_rx(), netdev, net_device::priv, readl(), readw(), icplus_nic::regs, and writew.
|
static |
Enable or disable interrupts.
netdev | Network device |
enable | Interrupts should be enabled |
Definition at line 674 of file icplus.c.
References DBGC, netdev, and net_device::priv.
|
static |
Probe PCI device.
pci | PCI device |
rc | Return status code |
Definition at line 703 of file icplus.c.
References adjust_pci_device(), alloc_etherdev(), mii_bit_basher::basher, DBGC, pci_device::dev, net_device::dev, icplus_nic::eeprom, ENODEV, ENOMEM, ETH_ALEN, net_device::hw_addr, ICP_BAR_SIZE, ICP_EEPROM_MAC, ICP_RFDLISTPTR, ICP_TFDLISTPTR, icplus_basher_ops, icplus_check_link(), icplus_init_eeprom(), icplus_init_phy(), icplus_operations, icplus_reset(), init_mii_bit_basher(), iounmap(), icplus_ring::listptr, mii_bit_basher::mdio, pci_device::membase, memset(), icplus_nic::mii, mii_init(), icplus_nic::miibit, netdev, netdev_init(), netdev_nullify(), netdev_put(), nvs_read(), bit_basher::op, pci_ioremap(), pci_set_drvdata(), net_device::priv, rc, register_netdev(), icplus_nic::regs, icplus_nic::rx, strerror(), icplus_nic::tx, and unregister_netdev().
|
static |
Remove PCI device.
pci | PCI device |
Definition at line 782 of file icplus.c.
References icplus_reset(), iounmap(), netdev, netdev_nullify(), netdev_put(), pci_get_drvdata(), net_device::priv, icplus_nic::regs, and unregister_netdev().
|
static |
Pin mapping for MII bit-bashing interface.
Definition at line 180 of file icplus.c.
Referenced by icplus_mii_read_bit(), and icplus_mii_write_bit().
|
static |
MII bit-bashing interface.
Definition at line 231 of file icplus.c.
Referenced by icplus_probe().
|
static |
IC+ network device operations.
Definition at line 682 of file icplus.c.
Referenced by icplus_probe().
|
static |
struct pci_driver icplus_driver __pci_driver |
IC+ PCI driver.