#define pr_fmt(fmt) …
#define FORCEDETH_VERSION …
#define DRV_NAME …
#include <linux/module.h>
#include <linux/types.h>
#include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/delay.h>
#include <linux/sched.h>
#include <linux/spinlock.h>
#include <linux/ethtool.h>
#include <linux/timer.h>
#include <linux/skbuff.h>
#include <linux/mii.h>
#include <linux/random.h>
#include <linux/if_vlan.h>
#include <linux/dma-mapping.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/prefetch.h>
#include <linux/u64_stats_sync.h>
#include <linux/io.h>
#include <asm/irq.h>
#define TX_WORK_PER_LOOP …
#define RX_WORK_PER_LOOP …
#define DEV_NEED_TIMERIRQ …
#define DEV_NEED_LINKTIMER …
#define DEV_HAS_LARGEDESC …
#define DEV_HAS_HIGH_DMA …
#define DEV_HAS_CHECKSUM …
#define DEV_HAS_VLAN …
#define DEV_HAS_MSI …
#define DEV_HAS_MSI_X …
#define DEV_HAS_POWER_CNTRL …
#define DEV_HAS_STATISTICS_V1 …
#define DEV_HAS_STATISTICS_V2 …
#define DEV_HAS_STATISTICS_V3 …
#define DEV_HAS_STATISTICS_V12 …
#define DEV_HAS_STATISTICS_V123 …
#define DEV_HAS_TEST_EXTENDED …
#define DEV_HAS_MGMT_UNIT …
#define DEV_HAS_CORRECT_MACADDR …
#define DEV_HAS_COLLISION_FIX …
#define DEV_HAS_PAUSEFRAME_TX_V1 …
#define DEV_HAS_PAUSEFRAME_TX_V2 …
#define DEV_HAS_PAUSEFRAME_TX_V3 …
#define DEV_NEED_TX_LIMIT …
#define DEV_NEED_TX_LIMIT2 …
#define DEV_HAS_GEAR_MODE …
#define DEV_NEED_PHY_INIT_FIX …
#define DEV_NEED_LOW_POWER_FIX …
#define DEV_NEED_MSI_FIX …
enum { … };
struct ring_desc { … };
struct ring_desc_ex { … };
ring_type;
#define FLAG_MASK_V1 …
#define FLAG_MASK_V2 …
#define LEN_MASK_V1 …
#define LEN_MASK_V2 …
#define NV_TX_LASTPACKET …
#define NV_TX_RETRYERROR …
#define NV_TX_RETRYCOUNT_MASK …
#define NV_TX_FORCED_INTERRUPT …
#define NV_TX_DEFERRED …
#define NV_TX_CARRIERLOST …
#define NV_TX_LATECOLLISION …
#define NV_TX_UNDERFLOW …
#define NV_TX_ERROR …
#define NV_TX_VALID …
#define NV_TX2_LASTPACKET …
#define NV_TX2_RETRYERROR …
#define NV_TX2_RETRYCOUNT_MASK …
#define NV_TX2_FORCED_INTERRUPT …
#define NV_TX2_DEFERRED …
#define NV_TX2_CARRIERLOST …
#define NV_TX2_LATECOLLISION …
#define NV_TX2_UNDERFLOW …
#define NV_TX2_ERROR …
#define NV_TX2_VALID …
#define NV_TX2_TSO …
#define NV_TX2_TSO_SHIFT …
#define NV_TX2_TSO_MAX_SHIFT …
#define NV_TX2_TSO_MAX_SIZE …
#define NV_TX2_CHECKSUM_L3 …
#define NV_TX2_CHECKSUM_L4 …
#define NV_TX3_VLAN_TAG_PRESENT …
#define NV_RX_DESCRIPTORVALID …
#define NV_RX_MISSEDFRAME …
#define NV_RX_SUBTRACT1 …
#define NV_RX_ERROR1 …
#define NV_RX_ERROR2 …
#define NV_RX_ERROR3 …
#define NV_RX_ERROR4 …
#define NV_RX_CRCERR …
#define NV_RX_OVERFLOW …
#define NV_RX_FRAMINGERR …
#define NV_RX_ERROR …
#define NV_RX_AVAIL …
#define NV_RX_ERROR_MASK …
#define NV_RX2_CHECKSUMMASK …
#define NV_RX2_CHECKSUM_IP …
#define NV_RX2_CHECKSUM_IP_TCP …
#define NV_RX2_CHECKSUM_IP_UDP …
#define NV_RX2_DESCRIPTORVALID …
#define NV_RX2_SUBTRACT1 …
#define NV_RX2_ERROR1 …
#define NV_RX2_ERROR2 …
#define NV_RX2_ERROR3 …
#define NV_RX2_ERROR4 …
#define NV_RX2_CRCERR …
#define NV_RX2_OVERFLOW …
#define NV_RX2_FRAMINGERR …
#define NV_RX2_ERROR …
#define NV_RX2_AVAIL …
#define NV_RX2_ERROR_MASK …
#define NV_RX3_VLAN_TAG_PRESENT …
#define NV_RX3_VLAN_TAG_MASK …
#define NV_PCI_REGSZ_VER1 …
#define NV_PCI_REGSZ_VER2 …
#define NV_PCI_REGSZ_VER3 …
#define NV_PCI_REGSZ_MAX …
#define NV_TXRX_RESET_DELAY …
#define NV_TXSTOP_DELAY1 …
#define NV_TXSTOP_DELAY1MAX …
#define NV_TXSTOP_DELAY2 …
#define NV_RXSTOP_DELAY1 …
#define NV_RXSTOP_DELAY1MAX …
#define NV_RXSTOP_DELAY2 …
#define NV_SETUP5_DELAY …
#define NV_SETUP5_DELAYMAX …
#define NV_POWERUP_DELAY …
#define NV_POWERUP_DELAYMAX …
#define NV_MIIBUSY_DELAY …
#define NV_MIIPHY_DELAY …
#define NV_MIIPHY_DELAYMAX …
#define NV_MAC_RESET_DELAY …
#define NV_WAKEUPPATTERNS …
#define NV_WAKEUPMASKENTRIES …
#define NV_WATCHDOG_TIMEO …
#define RX_RING_DEFAULT …
#define TX_RING_DEFAULT …
#define RX_RING_MIN …
#define TX_RING_MIN …
#define RING_MAX_DESC_VER_1 …
#define RING_MAX_DESC_VER_2_3 …
#define NV_RX_HEADERS …
#define NV_RX_ALLOC_PAD …
#define NV_PKTLIMIT_1 …
#define NV_PKTLIMIT_2 …
#define OOM_REFILL …
#define POLL_WAIT …
#define LINK_TIMEOUT …
#define STATS_INTERVAL …
#define DESC_VER_1 …
#define DESC_VER_2 …
#define DESC_VER_3 …
#define PHY_OUI_MARVELL …
#define PHY_OUI_CICADA …
#define PHY_OUI_VITESSE …
#define PHY_OUI_REALTEK …
#define PHY_OUI_REALTEK2 …
#define PHYID1_OUI_MASK …
#define PHYID1_OUI_SHFT …
#define PHYID2_OUI_MASK …
#define PHYID2_OUI_SHFT …
#define PHYID2_MODEL_MASK …
#define PHY_MODEL_REALTEK_8211 …
#define PHY_REV_MASK …
#define PHY_REV_REALTEK_8211B …
#define PHY_REV_REALTEK_8211C …
#define PHY_MODEL_REALTEK_8201 …
#define PHY_MODEL_MARVELL_E3016 …
#define PHY_MARVELL_E3016_INITMASK …
#define PHY_CICADA_INIT1 …
#define PHY_CICADA_INIT2 …
#define PHY_CICADA_INIT3 …
#define PHY_CICADA_INIT4 …
#define PHY_CICADA_INIT5 …
#define PHY_CICADA_INIT6 …
#define PHY_VITESSE_INIT_REG1 …
#define PHY_VITESSE_INIT_REG2 …
#define PHY_VITESSE_INIT_REG3 …
#define PHY_VITESSE_INIT_REG4 …
#define PHY_VITESSE_INIT_MSK1 …
#define PHY_VITESSE_INIT_MSK2 …
#define PHY_VITESSE_INIT1 …
#define PHY_VITESSE_INIT2 …
#define PHY_VITESSE_INIT3 …
#define PHY_VITESSE_INIT4 …
#define PHY_VITESSE_INIT5 …
#define PHY_VITESSE_INIT6 …
#define PHY_VITESSE_INIT7 …
#define PHY_VITESSE_INIT8 …
#define PHY_VITESSE_INIT9 …
#define PHY_VITESSE_INIT10 …
#define PHY_REALTEK_INIT_REG1 …
#define PHY_REALTEK_INIT_REG2 …
#define PHY_REALTEK_INIT_REG3 …
#define PHY_REALTEK_INIT_REG4 …
#define PHY_REALTEK_INIT_REG5 …
#define PHY_REALTEK_INIT_REG6 …
#define PHY_REALTEK_INIT_REG7 …
#define PHY_REALTEK_INIT1 …
#define PHY_REALTEK_INIT2 …
#define PHY_REALTEK_INIT3 …
#define PHY_REALTEK_INIT4 …
#define PHY_REALTEK_INIT5 …
#define PHY_REALTEK_INIT6 …
#define PHY_REALTEK_INIT7 …
#define PHY_REALTEK_INIT8 …
#define PHY_REALTEK_INIT9 …
#define PHY_REALTEK_INIT10 …
#define PHY_REALTEK_INIT11 …
#define PHY_REALTEK_INIT_MSK1 …
#define PHY_GIGABIT …
#define PHY_TIMEOUT …
#define PHY_ERROR …
#define PHY_100 …
#define PHY_1000 …
#define PHY_HALF …
#define NV_PAUSEFRAME_RX_CAPABLE …
#define NV_PAUSEFRAME_TX_CAPABLE …
#define NV_PAUSEFRAME_RX_ENABLE …
#define NV_PAUSEFRAME_TX_ENABLE …
#define NV_PAUSEFRAME_RX_REQ …
#define NV_PAUSEFRAME_TX_REQ …
#define NV_PAUSEFRAME_AUTONEG …
#define NV_MSI_X_MAX_VECTORS …
#define NV_MSI_X_VECTORS_MASK …
#define NV_MSI_CAPABLE …
#define NV_MSI_X_CAPABLE …
#define NV_MSI_ENABLED …
#define NV_MSI_X_ENABLED …
#define NV_MSI_X_VECTOR_ALL …
#define NV_MSI_X_VECTOR_RX …
#define NV_MSI_X_VECTOR_TX …
#define NV_MSI_X_VECTOR_OTHER …
#define NV_MSI_PRIV_OFFSET …
#define NV_MSI_PRIV_VALUE …
#define NV_RESTART_TX …
#define NV_RESTART_RX …
#define NV_TX_LIMIT_COUNT …
#define NV_DYNAMIC_THRESHOLD …
#define NV_DYNAMIC_MAX_QUIET_COUNT …
struct nv_ethtool_str { … };
static const struct nv_ethtool_str nv_estats_str[] = …;
struct nv_ethtool_stats { … };
#define NV_DEV_STATISTICS_V3_COUNT …
#define NV_DEV_STATISTICS_V2_COUNT …
#define NV_DEV_STATISTICS_V1_COUNT …
#define NV_TEST_COUNT_BASE …
#define NV_TEST_COUNT_EXTENDED …
static const struct nv_ethtool_str nv_etests_str[] = …;
struct register_test { … };
static const struct register_test nv_registers_test[] = …;
struct nv_skb_map { … };
struct nv_txrx_stats { … };
#define nv_txrx_stats_inc(member) …
#define nv_txrx_stats_add(member, count) …
struct fe_priv { … };
static int max_interrupt_work = …;
enum { … };
static int optimization_mode = …;
static int poll_interval = …;
enum { … };
static int msi = …;
enum { … };
static int msix = …;
enum { … };
static int dma_64bit = …;
static bool debug_tx_timeout = …;
enum { … };
static int phy_cross = …;
static int phy_power_down;
static inline struct fe_priv *get_nvpriv(struct net_device *dev)
{ … }
static inline u8 __iomem *get_hwbase(struct net_device *dev)
{ … }
static inline void pci_push(u8 __iomem *base)
{ … }
static inline u32 nv_descr_getlength(struct ring_desc *prd, u32 v)
{ … }
static inline u32 nv_descr_getlength_ex(struct ring_desc_ex *prd, u32 v)
{ … }
static bool nv_optimized(struct fe_priv *np)
{ … }
static int reg_delay(struct net_device *dev, int offset, u32 mask, u32 target,
int delay, int delaymax)
{ … }
#define NV_SETUP_RX_RING …
#define NV_SETUP_TX_RING …
static inline u32 dma_low(dma_addr_t addr)
{ … }
static inline u32 dma_high(dma_addr_t addr)
{ … }
static void setup_hw_rings(struct net_device *dev, int rxtx_flags)
{ … }
static void free_rings(struct net_device *dev)
{ … }
static int using_multi_irqs(struct net_device *dev)
{ … }
static void nv_txrx_gate(struct net_device *dev, bool gate)
{ … }
static void nv_enable_irq(struct net_device *dev)
{ … }
static void nv_disable_irq(struct net_device *dev)
{ … }
static void nv_enable_hw_interrupts(struct net_device *dev, u32 mask)
{ … }
static void nv_disable_hw_interrupts(struct net_device *dev, u32 mask)
{ … }
static void nv_napi_enable(struct net_device *dev)
{ … }
static void nv_napi_disable(struct net_device *dev)
{ … }
#define MII_READ …
static int mii_rw(struct net_device *dev, int addr, int miireg, int value)
{ … }
static int phy_reset(struct net_device *dev, u32 bmcr_setup)
{ … }
static int init_realtek_8211b(struct net_device *dev, struct fe_priv *np)
{ … }
static int init_realtek_8211c(struct net_device *dev, struct fe_priv *np)
{ … }
static int init_realtek_8201(struct net_device *dev, struct fe_priv *np)
{ … }
static int init_realtek_8201_cross(struct net_device *dev, struct fe_priv *np)
{ … }
static int init_cicada(struct net_device *dev, struct fe_priv *np,
u32 phyinterface)
{ … }
static int init_vitesse(struct net_device *dev, struct fe_priv *np)
{ … }
static int phy_init(struct net_device *dev)
{ … }
static void nv_start_rx(struct net_device *dev)
{ … }
static void nv_stop_rx(struct net_device *dev)
{ … }
static void nv_start_tx(struct net_device *dev)
{ … }
static void nv_stop_tx(struct net_device *dev)
{ … }
static void nv_start_rxtx(struct net_device *dev)
{ … }
static void nv_stop_rxtx(struct net_device *dev)
{ … }
static void nv_txrx_reset(struct net_device *dev)
{ … }
static void nv_mac_reset(struct net_device *dev)
{ … }
static void nv_update_stats(struct net_device *dev)
{ … }
static void nv_get_stats(int cpu, struct fe_priv *np,
struct rtnl_link_stats64 *storage)
{ … }
static void
nv_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *storage)
__acquires(&netdev_priv(dev)->hwstats_lock)
__releases(&netdev_priv(dev)->hwstats_lock)
{ … }
static int nv_alloc_rx(struct net_device *dev)
{ … }
static int nv_alloc_rx_optimized(struct net_device *dev)
{ … }
static void nv_do_rx_refill(struct timer_list *t)
{ … }
static void nv_init_rx(struct net_device *dev)
{ … }
static void nv_init_tx(struct net_device *dev)
{ … }
static int nv_init_ring(struct net_device *dev)
{ … }
static void nv_unmap_txskb(struct fe_priv *np, struct nv_skb_map *tx_skb)
{ … }
static int nv_release_txskb(struct fe_priv *np, struct nv_skb_map *tx_skb)
{ … }
static void nv_drain_tx(struct net_device *dev)
{ … }
static void nv_drain_rx(struct net_device *dev)
{ … }
static void nv_drain_rxtx(struct net_device *dev)
{ … }
static inline u32 nv_get_empty_tx_slots(struct fe_priv *np)
{ … }
static void nv_legacybackoff_reseed(struct net_device *dev)
{ … }
#define BACKOFF_SEEDSET_ROWS …
#define BACKOFF_SEEDSET_LFSRS …
static const u32 main_seedset[BACKOFF_SEEDSET_ROWS][BACKOFF_SEEDSET_LFSRS] = …;
static const u32 gear_seedset[BACKOFF_SEEDSET_ROWS][BACKOFF_SEEDSET_LFSRS] = …;
static void nv_gear_backoff_reseed(struct net_device *dev)
{ … }
static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
{ … }
static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb,
struct net_device *dev)
{ … }
static inline void nv_tx_flip_ownership(struct net_device *dev)
{ … }
static int nv_tx_done(struct net_device *dev, int limit)
{ … }
static int nv_tx_done_optimized(struct net_device *dev, int limit)
{ … }
static void nv_tx_timeout(struct net_device *dev, unsigned int txqueue)
{ … }
static int nv_getlen(struct net_device *dev, void *packet, int datalen)
{ … }
static void rx_missing_handler(u32 flags, struct fe_priv *np)
{ … }
static int nv_rx_process(struct net_device *dev, int limit)
{ … }
static int nv_rx_process_optimized(struct net_device *dev, int limit)
{ … }
static void set_bufsize(struct net_device *dev)
{ … }
static int nv_change_mtu(struct net_device *dev, int new_mtu)
{ … }
static void nv_copy_mac_to_hw(struct net_device *dev)
{ … }
static int nv_set_mac_address(struct net_device *dev, void *addr)
{ … }
static void nv_set_multicast(struct net_device *dev)
{ … }
static void nv_update_pause(struct net_device *dev, u32 pause_flags)
{ … }
static void nv_force_linkspeed(struct net_device *dev, int speed, int duplex)
{ … }
static int nv_update_linkspeed(struct net_device *dev)
{ … }
static void nv_linkchange(struct net_device *dev)
{ … }
static void nv_link_irq(struct net_device *dev)
{ … }
static void nv_msi_workaround(struct fe_priv *np)
{ … }
static inline int nv_change_interrupt_mode(struct net_device *dev, int total_work)
{ … }
static irqreturn_t nv_nic_irq(int foo, void *data)
{ … }
static irqreturn_t nv_nic_irq_optimized(int foo, void *data)
{ … }
static irqreturn_t nv_nic_irq_tx(int foo, void *data)
{ … }
static int nv_napi_poll(struct napi_struct *napi, int budget)
{ … }
static irqreturn_t nv_nic_irq_rx(int foo, void *data)
{ … }
static irqreturn_t nv_nic_irq_other(int foo, void *data)
{ … }
static irqreturn_t nv_nic_irq_test(int foo, void *data)
{ … }
static void set_msix_vector_map(struct net_device *dev, u32 vector, u32 irqmask)
{ … }
static int nv_request_irq(struct net_device *dev, int intr_test)
{ … }
static void nv_free_irq(struct net_device *dev)
{ … }
static void nv_do_nic_poll(struct timer_list *t)
{ … }
#ifdef CONFIG_NET_POLL_CONTROLLER
static void nv_poll_controller(struct net_device *dev)
{ … }
#endif
static void nv_do_stats_poll(struct timer_list *t)
__acquires(&netdev_priv(dev)->hwstats_lock)
__releases(&netdev_priv(dev)->hwstats_lock)
{ … }
static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
{ … }
static void nv_get_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo)
{ … }
static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo)
{ … }
static int nv_get_link_ksettings(struct net_device *dev,
struct ethtool_link_ksettings *cmd)
{ … }
static int nv_set_link_ksettings(struct net_device *dev,
const struct ethtool_link_ksettings *cmd)
{ … }
#define FORCEDETH_REGS_VER …
static int nv_get_regs_len(struct net_device *dev)
{ … }
static void nv_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *buf)
{ … }
static int nv_nway_reset(struct net_device *dev)
{ … }
static void nv_get_ringparam(struct net_device *dev,
struct ethtool_ringparam *ring,
struct kernel_ethtool_ringparam *kernel_ring,
struct netlink_ext_ack *extack)
{ … }
static int nv_set_ringparam(struct net_device *dev,
struct ethtool_ringparam *ring,
struct kernel_ethtool_ringparam *kernel_ring,
struct netlink_ext_ack *extack)
{ … }
static void nv_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam* pause)
{ … }
static int nv_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam* pause)
{ … }
static int nv_set_loopback(struct net_device *dev, netdev_features_t features)
{ … }
static netdev_features_t nv_fix_features(struct net_device *dev,
netdev_features_t features)
{ … }
static void nv_vlan_mode(struct net_device *dev, netdev_features_t features)
{ … }
static int nv_set_features(struct net_device *dev, netdev_features_t features)
{ … }
static int nv_get_sset_count(struct net_device *dev, int sset)
{ … }
static void nv_get_ethtool_stats(struct net_device *dev,
struct ethtool_stats *estats, u64 *buffer)
__acquires(&netdev_priv(dev)->hwstats_lock)
__releases(&netdev_priv(dev)->hwstats_lock)
{ … }
static int nv_link_test(struct net_device *dev)
{ … }
static int nv_register_test(struct net_device *dev)
{ … }
static int nv_interrupt_test(struct net_device *dev)
{ … }
static int nv_loopback_test(struct net_device *dev)
{ … }
static void nv_self_test(struct net_device *dev, struct ethtool_test *test, u64 *buffer)
{ … }
static void nv_get_strings(struct net_device *dev, u32 stringset, u8 *buffer)
{ … }
static const struct ethtool_ops ops = …;
static int nv_mgmt_acquire_sema(struct net_device *dev)
{ … }
static void nv_mgmt_release_sema(struct net_device *dev)
{ … }
static int nv_mgmt_get_version(struct net_device *dev)
{ … }
static int nv_open(struct net_device *dev)
{ … }
static int nv_close(struct net_device *dev)
{ … }
static const struct net_device_ops nv_netdev_ops = …;
static const struct net_device_ops nv_netdev_ops_optimized = …;
static int nv_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
{ … }
static void nv_restore_phy(struct net_device *dev)
{ … }
static void nv_restore_mac_addr(struct pci_dev *pci_dev)
{ … }
static void nv_remove(struct pci_dev *pci_dev)
{ … }
#ifdef CONFIG_PM_SLEEP
static int nv_suspend(struct device *device)
{ … }
static int nv_resume(struct device *device)
{ … }
static SIMPLE_DEV_PM_OPS(nv_pm_ops, nv_suspend, nv_resume);
#define NV_PM_OPS …
#else
#define NV_PM_OPS …
#endif
#ifdef CONFIG_PM
static void nv_shutdown(struct pci_dev *pdev)
{ … }
#else
#define nv_shutdown …
#endif
static const struct pci_device_id pci_tbl[] = …;
static struct pci_driver forcedeth_pci_driver = …;
module_param(max_interrupt_work, int, 0);
MODULE_PARM_DESC(…) …;
module_param(optimization_mode, int, 0);
MODULE_PARM_DESC(…) …;
module_param(poll_interval, int, 0);
MODULE_PARM_DESC(…) …;
module_param(msi, int, 0);
MODULE_PARM_DESC(…) …;
module_param(msix, int, 0);
MODULE_PARM_DESC(…) …;
module_param(dma_64bit, int, 0);
MODULE_PARM_DESC(…) …;
module_param(phy_cross, int, 0);
MODULE_PARM_DESC(…) …;
module_param(phy_power_down, int, 0);
MODULE_PARM_DESC(…) …;
module_param(debug_tx_timeout, bool, 0);
MODULE_PARM_DESC(…) …;
module_pci_driver(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
MODULE_DEVICE_TABLE(pci, pci_tbl);