iPXE
|
National Semiconductor "MacPhyter" network card 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 <ipxe/nvs.h>
#include <ipxe/bitbash.h>
#include <ipxe/spi_bit.h>
#include <ipxe/threewire.h>
#include "natsemi.h"
Go to the source code of this file.
Macros | |
#define | DP83815_FLAGS ( NATSEMI_EEPROM_LITTLE_ENDIAN | NATSEMI_EEPROM_INSANE ) |
Flags for DP83815. More... | |
#define | DP83820_FLAGS ( NATSEMI_64BIT | NATSEMI_1000 ) |
Flags for DP83820. More... | |
Functions | |
FILE_LICENCE (GPL2_OR_LATER) | |
static int | natsemi_spi_read_bit (struct bit_basher *basher, unsigned int bit_id) |
Read input bit. More... | |
static void | natsemi_spi_write_bit (struct bit_basher *basher, unsigned int bit_id, unsigned long data) |
Set/clear output bit. More... | |
static void | natsemi_init_eeprom (struct natsemi_nic *natsemi) |
Initialise EEPROM. More... | |
static void | natsemi_hwaddr_sane (struct natsemi_nic *natsemi, const uint16_t *eeprom, uint16_t *hw_addr) |
Get hardware address from sane EEPROM data. More... | |
static void | natsemi_hwaddr_insane (struct natsemi_nic *natsemi, const uint16_t *eeprom, uint16_t *hw_addr) |
Get hardware address from insane EEPROM data. More... | |
static int | natsemi_hwaddr (struct natsemi_nic *natsemi, void *hw_addr) |
Get hardware address from EEPROM. More... | |
static int | natsemi_soft_reset (struct natsemi_nic *natsemi) |
Reset controller chip. More... | |
static int | natsemi_reload_config (struct natsemi_nic *natsemi) |
Reload configuration from EEPROM. More... | |
static int | natsemi_reset (struct natsemi_nic *natsemi) |
Reset hardware. More... | |
static void | natsemi_check_link (struct net_device *netdev) |
Check link state. More... | |
static void | natsemi_pmatch (struct natsemi_nic *natsemi, const void *mac) |
Set perfect match filter address. More... | |
static int | natsemi_create_ring (struct natsemi_nic *natsemi, struct natsemi_ring *ring) |
Create descriptor ring. More... | |
static void | natsemi_destroy_ring (struct natsemi_nic *natsemi, struct natsemi_ring *ring) |
Destroy descriptor ring. More... | |
static void | natsemi_refill_rx (struct net_device *netdev) |
Refill receive descriptor ring. More... | |
static int | natsemi_open (struct net_device *netdev) |
Open network device. More... | |
static void | natsemi_close (struct net_device *netdev) |
Close network device. More... | |
static int | natsemi_transmit (struct net_device *netdev, struct io_buffer *iobuf) |
Transmit packet. More... | |
static void | natsemi_poll_tx (struct net_device *netdev) |
Poll for completed packets. More... | |
static void | natsemi_poll_rx (struct net_device *netdev) |
Poll for received packets. More... | |
static void | natsemi_poll (struct net_device *netdev) |
Poll for completed and received packets. More... | |
static void | natsemi_irq (struct net_device *netdev, int enable) |
Enable or disable interrupts. More... | |
static int | natsemi_probe (struct pci_device *pci) |
Probe PCI device. More... | |
static void | natsemi_remove (struct pci_device *pci) |
Remove PCI device. More... | |
Variables | |
static const uint8_t | natsemi_eeprom_bits [] |
Pin mapping for SPI bit-bashing interface. More... | |
static struct bit_basher_operations | natsemi_basher_ops |
SPI bit-bashing interface. More... | |
static struct net_device_operations | natsemi_operations |
National Semiconductor network device operations. More... | |
static struct pci_device_id | natsemi_nics [] |
National Semiconductor PCI device IDs. More... | |
struct pci_driver natsemi_driver | __pci_driver |
National Semiconductor PCI driver. More... | |
National Semiconductor "MacPhyter" network card driver.
Based on the following datasheets:
http://www.ti.com/lit/ds/symlink/dp83820.pdf http://www.datasheets.org.uk/indexdl/Datasheet-03/DSA0041338.pdf
Definition in file natsemi.c.
#define DP83815_FLAGS ( NATSEMI_EEPROM_LITTLE_ENDIAN | NATSEMI_EEPROM_INSANE ) |
#define DP83820_FLAGS ( NATSEMI_64BIT | NATSEMI_1000 ) |
FILE_LICENCE | ( | GPL2_OR_LATER | ) |
|
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 73 of file natsemi.c.
References spi_bit_basher::basher, container_of, DBG_DISABLE, DBG_ENABLE, DBGLVL_IO, natsemi_eeprom_bits, NATSEMI_MEAR, readl(), reg, natsemi_nic::regs, and natsemi_nic::spibit.
|
static |
Set/clear output bit.
basher | Bit-bashing interface |
bit_id | Bit number |
data | Value to write |
Definition at line 93 of file natsemi.c.
References spi_bit_basher::basher, container_of, data, DBG_DISABLE, DBG_ENABLE, DBGLVL_IO, natsemi_eeprom_bits, NATSEMI_MEAR, readl(), reg, natsemi_nic::regs, natsemi_nic::spibit, and writel().
|
static |
Initialise EEPROM.
natsemi | National Semiconductor device |
Definition at line 119 of file natsemi.c.
References spi_bit_basher::basher, spi_bit_basher::bus, spi_device::bus, natsemi_nic::eeprom, spi_bit_basher::endianness, natsemi_nic::flags, init_spi_bit_basher(), spi_bus::mode, natsemi_basher_ops, NATSEMI_EEPROM_LITTLE_ENDIAN, bit_basher::op, SPI_BIT_BIG_ENDIAN, SPI_BIT_LITTLE_ENDIAN, SPI_MODE_THREEWIRE, and natsemi_nic::spibit.
Referenced by natsemi_probe().
|
static |
Get hardware address from sane EEPROM data.
natsemi | National Semiconductor device |
eeprom | EEPROM data |
hw_addr | Hardware address to fill in |
Definition at line 141 of file natsemi.c.
References DBGC, ETH_ALEN, and NATSEMI_EEPROM_MAC_SANE.
Referenced by natsemi_hwaddr().
|
static |
Get hardware address from insane EEPROM data.
natsemi | National Semiconductor device |
eeprom | EEPROM data |
hw_addr | Hardware address to fill in |
Definition at line 159 of file natsemi.c.
References cpu_to_le16, DBGC, ETH_ALEN, le16_to_cpu, NATSEMI_EEPROM_MAC_INSANE, and offset.
Referenced by natsemi_hwaddr().
|
static |
Get hardware address from EEPROM.
natsemi | National Semiconductor device |
hw_addr | Hardware address to fill in |
rc | Return status code |
Definition at line 184 of file natsemi.c.
References DBGC, DBGC2, DBGC2_HDA, natsemi_nic::eeprom, natsemi_nic::flags, NATSEMI_EEPROM_INSANE, NATSEMI_EEPROM_SIZE, natsemi_hwaddr_insane(), natsemi_hwaddr_sane(), spi_device::nvs, nvs_read(), rc, and strerror().
Referenced by natsemi_probe().
|
static |
Reset controller chip.
natsemi | National Semiconductor device |
rc | Return status code |
Definition at line 221 of file natsemi.c.
References DBGC, ETIMEDOUT, mdelay(), NATSEMI_CR, NATSEMI_CR_RST, NATSEMI_RESET_MAX_WAIT_MS, readl(), natsemi_nic::regs, and writel().
Referenced by natsemi_reset().
|
static |
Reload configuration from EEPROM.
natsemi | National Semiconductor device |
rc | Return status code |
Definition at line 249 of file natsemi.c.
References DBGC, ETIMEDOUT, mdelay(), NATSEMI_EELOAD_MAX_WAIT_MS, NATSEMI_PTSCR, NATSEMI_PTSCR_EELOAD_EN, readl(), natsemi_nic::regs, and writel().
Referenced by natsemi_reset().
|
static |
Reset hardware.
natsemi | National Semiconductor device |
rc | Return status code |
Definition at line 279 of file natsemi.c.
References cfg, natsemi_nic::cfg, DBGC, natsemi_nic::flags, NATSEMI_64BIT, NATSEMI_CFG, NATSEMI_CFG_DATA64_EN, NATSEMI_CFG_EXTSTS_EN, NATSEMI_CFG_M64ADDR, NATSEMI_CFG_PCI64_DET, natsemi_reload_config(), natsemi_soft_reset(), rc, readl(), natsemi_nic::regs, and writel().
Referenced by natsemi_probe(), and natsemi_remove().
|
static |
Check link state.
netdev | Network device |
Definition at line 320 of file natsemi.c.
References cfg, natsemi_nic::cfg, DBGC, natsemi_nic::flags, NATSEMI_1000, NATSEMI_CFG, NATSEMI_CFG_LNKSTS, NATSEMI_CFG_MODE_1000, NATSEMI_CFG_SPDSTS1, netdev, netdev_link_down(), netdev_link_up(), net_device::priv, readl(), natsemi_nic::regs, and writel().
Referenced by natsemi_open(), natsemi_poll(), and natsemi_probe().
|
static |
Set perfect match filter address.
natsemi | National Semiconductor device |
mac | MAC address |
Definition at line 364 of file natsemi.c.
References ETH_ALEN, le16_to_cpu, mac, NATSEMI_RFADDR_PMATCH_BASE, NATSEMI_RFCR, NATSEMI_RFCR_RFADDR, NATSEMI_RFCR_RFADDR_MASK, NATSEMI_RFDR, NATSEMI_RFDR_BMASK, readl(), natsemi_nic::regs, rfcr, and writel().
Referenced by natsemi_open().
|
static |
Create descriptor ring.
natsemi | National Semiconductor device |
ring | Descriptor ring |
rc | Return status code |
Definition at line 392 of file natsemi.c.
References address, natsemi_ring::count, cpu_to_le32, cpu_to_le64, d32, natsemi_descriptor::d32, natsemi_descriptor::d64, DBGC, natsemi_ring::desc, ENOMEM, ENOTSUP, natsemi_nic::flags, free_phys(), len, natsemi_descriptor_32::link, natsemi_descriptor_64::link, link, malloc_phys(), memset(), NATSEMI_64BIT, NULL, offset, offsetof, rc, natsemi_ring::reg, natsemi_nic::regs, typeof(), virt_to_bus(), and writel().
Referenced by natsemi_open().
|
static |
Destroy descriptor ring.
natsemi | National Semiconductor device |
ring | Descriptor ring |
Definition at line 469 of file natsemi.c.
References natsemi_ring::cons, natsemi_ring::count, natsemi_ring::desc, natsemi_nic::flags, free_phys(), len, NATSEMI_64BIT, NULL, natsemi_ring::prod, natsemi_ring::reg, natsemi_nic::regs, and writel().
Referenced by natsemi_close(), and natsemi_open().
|
static |
Refill receive descriptor ring.
netdev | Network device |
Definition at line 490 of file natsemi.c.
References address, alloc_iob(), assert(), natsemi_ring::cons, cpu_to_le32, cpu_to_le64, io_buffer::data, DBGC, DBGC2, natsemi_ring::desc, ENOTSUP, natsemi_nic::flags, NATSEMI_64BIT, NATSEMI_CR, NATSEMI_CR_RXE, NATSEMI_DESC_INTR, NATSEMI_NUM_RX_DESC, NATSEMI_RX_MAX_LEN, netdev, netdev_rx_err(), NULL, net_device::priv, natsemi_ring::prod, natsemi_nic::regs, rx, natsemi_nic::rx, natsemi_nic::rx_iobuf, virt_to_bus(), wmb(), and writel().
Referenced by natsemi_open(), and natsemi_poll().
|
static |
Open network device.
netdev | Network device |
rc | Return status code |
Definition at line 549 of file natsemi.c.
References natsemi_nic::flags, net_device::ll_addr, NATSEMI_64BIT, natsemi_check_link(), natsemi_create_ring(), natsemi_destroy_ring(), NATSEMI_IMR, NATSEMI_IRQ_RXDESC, NATSEMI_IRQ_TXDESC, natsemi_pmatch(), natsemi_refill_rx(), NATSEMI_RFCR, NATSEMI_RFCR_AAB, NATSEMI_RFCR_AAM, NATSEMI_RFCR_AAU, NATSEMI_RFCR_RFEN, NATSEMI_RXCFG_32, NATSEMI_RXCFG_64, NATSEMI_RXCFG_ALP, NATSEMI_RXCFG_ARP, NATSEMI_RXCFG_ATX, NATSEMI_RXCFG_DRTH_DEFAULT, NATSEMI_RXCFG_MXDMA_DEFAULT, NATSEMI_TXCFG_32, NATSEMI_TXCFG_64, NATSEMI_TXCFG_ATP, NATSEMI_TXCFG_CSI, NATSEMI_TXCFG_DRTH_DEFAULT, NATSEMI_TXCFG_ECRETRY, NATSEMI_TXCFG_FLTH_DEFAULT, NATSEMI_TXCFG_HBI, NATSEMI_TXCFG_MXDMA_DEFAULT, netdev, net_device::priv, rc, natsemi_nic::regs, natsemi_nic::rx, natsemi_nic::tx, and writel().
|
static |
Close network device.
netdev | Network device |
Definition at line 607 of file natsemi.c.
References free_iob(), NATSEMI_CR, NATSEMI_CR_RXR, NATSEMI_CR_TXR, natsemi_destroy_ring(), NATSEMI_IMR, NATSEMI_NUM_RX_DESC, netdev, NULL, net_device::priv, natsemi_nic::regs, natsemi_nic::rx, natsemi_nic::rx_iobuf, natsemi_nic::tx, and writel().
|
static |
Transmit packet.
netdev | Network device |
iobuf | I/O buffer |
rc | Return status code |
Definition at line 639 of file natsemi.c.
References address, natsemi_ring::cons, cpu_to_le32, cpu_to_le64, io_buffer::data, DBGC, DBGC2, natsemi_ring::desc, ENOBUFS, ENOTSUP, natsemi_nic::flags, iob_len(), NATSEMI_64BIT, NATSEMI_CR, NATSEMI_CR_TXE, NATSEMI_DESC_INTR, NATSEMI_DESC_OWN, NATSEMI_NUM_TX_DESC, netdev, net_device::priv, natsemi_ring::prod, natsemi_nic::regs, tx, natsemi_nic::tx, virt_to_bus(), wmb(), and writel().
|
static |
Poll for completed packets.
netdev | Network device |
Definition at line 689 of file natsemi.c.
References natsemi_ring::cons, cpu_to_le32, DBGC, DBGC2, natsemi_ring::desc, EIO, le32_to_cpu, NATSEMI_DESC_OK, NATSEMI_DESC_OWN, NATSEMI_NUM_TX_DESC, netdev, netdev_tx_complete_next(), netdev_tx_complete_next_err(), net_device::priv, natsemi_ring::prod, tx, and natsemi_nic::tx.
Referenced by natsemi_poll().
|
static |
Poll for received packets.
netdev | Network device |
Definition at line 725 of file natsemi.c.
References natsemi_ring::cons, cpu_to_le32, DBGC, DBGC2, natsemi_ring::desc, EIO, iob_put, le32_to_cpu, len, NATSEMI_DESC_OK, NATSEMI_DESC_OWN, NATSEMI_DESC_SIZE_MASK, NATSEMI_NUM_RX_DESC, netdev, netdev_rx(), netdev_rx_err(), NULL, net_device::priv, natsemi_ring::prod, rx, natsemi_nic::rx, and natsemi_nic::rx_iobuf.
Referenced by natsemi_poll().
|
static |
Poll for completed and received packets.
netdev | Network device |
Definition at line 770 of file natsemi.c.
References isr, natsemi_check_link(), NATSEMI_IRQ_RXDESC, NATSEMI_IRQ_TXDESC, NATSEMI_ISR, natsemi_poll_rx(), natsemi_poll_tx(), natsemi_refill_rx(), netdev, net_device::priv, readl(), and natsemi_nic::regs.
|
static |
Enable or disable interrupts.
netdev | Network device |
enable | Interrupts should be enabled |
Definition at line 803 of file natsemi.c.
References NATSEMI_IER, NATSEMI_IER_IE, netdev, net_device::priv, natsemi_nic::regs, and writel().
|
static |
Probe PCI device.
pci | PCI device |
rc | Return status code |
Definition at line 832 of file natsemi.c.
References adjust_pci_device(), alloc_etherdev(), pci_device::dev, net_device::dev, pci_device_id::driver_data, ENODEV, ENOMEM, natsemi_nic::flags, net_device::hw_addr, pci_device::id, iounmap(), pci_device::membase, memset(), NATSEMI_BAR_SIZE, natsemi_check_link(), natsemi_hwaddr(), natsemi_init_eeprom(), NATSEMI_NUM_RX_DESC, NATSEMI_NUM_TX_DESC, natsemi_operations, natsemi_reset(), NATSEMI_RXDP, NATSEMI_TXDP, netdev, netdev_init(), netdev_nullify(), netdev_put(), pci_ioremap(), pci_set_drvdata(), net_device::priv, rc, register_netdev(), natsemi_nic::regs, natsemi_nic::rx, natsemi_nic::tx, and unregister_netdev().
|
static |
Remove PCI device.
pci | PCI device |
Definition at line 900 of file natsemi.c.
References iounmap(), natsemi_reset(), netdev, netdev_nullify(), netdev_put(), pci_get_drvdata(), net_device::priv, natsemi_nic::regs, and unregister_netdev().
|
static |
Pin mapping for SPI bit-bashing interface.
Definition at line 58 of file natsemi.c.
Referenced by natsemi_spi_read_bit(), and natsemi_spi_write_bit().
|
static |
SPI bit-bashing interface.
Definition at line 109 of file natsemi.c.
Referenced by natsemi_init_eeprom().
|
static |
National Semiconductor network device operations.
Definition at line 811 of file natsemi.c.
Referenced by natsemi_probe().
|
static |
National Semiconductor PCI device IDs.
struct pci_driver natsemi_driver __pci_driver |
National Semiconductor PCI driver.