📄 forcedeth.c
字号:
union ring_type { struct ring_desc* orig; struct ring_desc_ex* ex;};#define FLAG_MASK_V1 0xffff0000#define FLAG_MASK_V2 0xffffc000#define LEN_MASK_V1 (0xffffffff ^ FLAG_MASK_V1)#define LEN_MASK_V2 (0xffffffff ^ FLAG_MASK_V2)#define NV_TX_LASTPACKET (1<<16)#define NV_TX_RETRYERROR (1<<19)#define NV_TX_FORCED_INTERRUPT (1<<24)#define NV_TX_DEFERRED (1<<26)#define NV_TX_CARRIERLOST (1<<27)#define NV_TX_LATECOLLISION (1<<28)#define NV_TX_UNDERFLOW (1<<29)#define NV_TX_ERROR (1<<30)#define NV_TX_VALID (1<<31)#define NV_TX2_LASTPACKET (1<<29)#define NV_TX2_RETRYERROR (1<<18)#define NV_TX2_FORCED_INTERRUPT (1<<30)#define NV_TX2_DEFERRED (1<<25)#define NV_TX2_CARRIERLOST (1<<26)#define NV_TX2_LATECOLLISION (1<<27)#define NV_TX2_UNDERFLOW (1<<28)/* error and valid are the same for both */#define NV_TX2_ERROR (1<<30)#define NV_TX2_VALID (1<<31)#define NV_TX2_TSO (1<<28)#define NV_TX2_TSO_SHIFT 14#define NV_TX2_TSO_MAX_SHIFT 14#define NV_TX2_TSO_MAX_SIZE (1<<NV_TX2_TSO_MAX_SHIFT)#define NV_TX2_CHECKSUM_L3 (1<<27)#define NV_TX2_CHECKSUM_L4 (1<<26)#define NV_TX3_VLAN_TAG_PRESENT (1<<18)#define NV_RX_DESCRIPTORVALID (1<<16)#define NV_RX_MISSEDFRAME (1<<17)#define NV_RX_SUBSTRACT1 (1<<18)#define NV_RX_ERROR1 (1<<23)#define NV_RX_ERROR2 (1<<24)#define NV_RX_ERROR3 (1<<25)#define NV_RX_ERROR4 (1<<26)#define NV_RX_CRCERR (1<<27)#define NV_RX_OVERFLOW (1<<28)#define NV_RX_FRAMINGERR (1<<29)#define NV_RX_ERROR (1<<30)#define NV_RX_AVAIL (1<<31)#define NV_RX2_CHECKSUMMASK (0x1C000000)#define NV_RX2_CHECKSUMOK1 (0x10000000)#define NV_RX2_CHECKSUMOK2 (0x14000000)#define NV_RX2_CHECKSUMOK3 (0x18000000)#define NV_RX2_DESCRIPTORVALID (1<<29)#define NV_RX2_SUBSTRACT1 (1<<25)#define NV_RX2_ERROR1 (1<<18)#define NV_RX2_ERROR2 (1<<19)#define NV_RX2_ERROR3 (1<<20)#define NV_RX2_ERROR4 (1<<21)#define NV_RX2_CRCERR (1<<22)#define NV_RX2_OVERFLOW (1<<23)#define NV_RX2_FRAMINGERR (1<<24)/* error and avail are the same for both */#define NV_RX2_ERROR (1<<30)#define NV_RX2_AVAIL (1<<31)#define NV_RX3_VLAN_TAG_PRESENT (1<<16)#define NV_RX3_VLAN_TAG_MASK (0x0000FFFF)/* Miscelaneous hardware related defines: */#define NV_PCI_REGSZ_VER1 0x270#define NV_PCI_REGSZ_VER2 0x2d4#define NV_PCI_REGSZ_VER3 0x604/* various timeout delays: all in usec */#define NV_TXRX_RESET_DELAY 4#define NV_TXSTOP_DELAY1 10#define NV_TXSTOP_DELAY1MAX 500000#define NV_TXSTOP_DELAY2 100#define NV_RXSTOP_DELAY1 10#define NV_RXSTOP_DELAY1MAX 500000#define NV_RXSTOP_DELAY2 100#define NV_SETUP5_DELAY 5#define NV_SETUP5_DELAYMAX 50000#define NV_POWERUP_DELAY 5#define NV_POWERUP_DELAYMAX 5000#define NV_MIIBUSY_DELAY 50#define NV_MIIPHY_DELAY 10#define NV_MIIPHY_DELAYMAX 10000#define NV_MAC_RESET_DELAY 64#define NV_WAKEUPPATTERNS 5#define NV_WAKEUPMASKENTRIES 4/* General driver defaults */#define NV_WATCHDOG_TIMEO (5*HZ)#define RX_RING_DEFAULT 128#define TX_RING_DEFAULT 256#define RX_RING_MIN 128#define TX_RING_MIN 64#define RING_MAX_DESC_VER_1 1024#define RING_MAX_DESC_VER_2_3 16384/* rx/tx mac addr + type + vlan + align + slack*/#define NV_RX_HEADERS (64)/* even more slack. */#define NV_RX_ALLOC_PAD (64)/* maximum mtu size */#define NV_PKTLIMIT_1 ETH_DATA_LEN /* hard limit not known */#define NV_PKTLIMIT_2 9100 /* Actual limit according to NVidia: 9202 */#define OOM_REFILL (1+HZ/20)#define POLL_WAIT (1+HZ/100)#define LINK_TIMEOUT (3*HZ)#define STATS_INTERVAL (10*HZ)/* * desc_ver values: * The nic supports three different descriptor types: * - DESC_VER_1: Original * - DESC_VER_2: support for jumbo frames. * - DESC_VER_3: 64-bit format. */#define DESC_VER_1 1#define DESC_VER_2 2#define DESC_VER_3 3/* PHY defines */#define PHY_OUI_MARVELL 0x5043#define PHY_OUI_CICADA 0x03f1#define PHY_OUI_VITESSE 0x01c1#define PHY_OUI_REALTEK 0x0732#define PHYID1_OUI_MASK 0x03ff#define PHYID1_OUI_SHFT 6#define PHYID2_OUI_MASK 0xfc00#define PHYID2_OUI_SHFT 10#define PHYID2_MODEL_MASK 0x03f0#define PHY_MODEL_MARVELL_E3016 0x220#define PHY_MARVELL_E3016_INITMASK 0x0300#define PHY_CICADA_INIT1 0x0f000#define PHY_CICADA_INIT2 0x0e00#define PHY_CICADA_INIT3 0x01000#define PHY_CICADA_INIT4 0x0200#define PHY_CICADA_INIT5 0x0004#define PHY_CICADA_INIT6 0x02000#define PHY_VITESSE_INIT_REG1 0x1f#define PHY_VITESSE_INIT_REG2 0x10#define PHY_VITESSE_INIT_REG3 0x11#define PHY_VITESSE_INIT_REG4 0x12#define PHY_VITESSE_INIT_MSK1 0xc#define PHY_VITESSE_INIT_MSK2 0x0180#define PHY_VITESSE_INIT1 0x52b5#define PHY_VITESSE_INIT2 0xaf8a#define PHY_VITESSE_INIT3 0x8#define PHY_VITESSE_INIT4 0x8f8a#define PHY_VITESSE_INIT5 0xaf86#define PHY_VITESSE_INIT6 0x8f86#define PHY_VITESSE_INIT7 0xaf82#define PHY_VITESSE_INIT8 0x0100#define PHY_VITESSE_INIT9 0x8f82#define PHY_VITESSE_INIT10 0x0#define PHY_REALTEK_INIT_REG1 0x1f#define PHY_REALTEK_INIT_REG2 0x19#define PHY_REALTEK_INIT_REG3 0x13#define PHY_REALTEK_INIT1 0x0000#define PHY_REALTEK_INIT2 0x8e00#define PHY_REALTEK_INIT3 0x0001#define PHY_REALTEK_INIT4 0xad17#define PHY_GIGABIT 0x0100#define PHY_TIMEOUT 0x1#define PHY_ERROR 0x2#define PHY_100 0x1#define PHY_1000 0x2#define PHY_HALF 0x100#define NV_PAUSEFRAME_RX_CAPABLE 0x0001#define NV_PAUSEFRAME_TX_CAPABLE 0x0002#define NV_PAUSEFRAME_RX_ENABLE 0x0004#define NV_PAUSEFRAME_TX_ENABLE 0x0008#define NV_PAUSEFRAME_RX_REQ 0x0010#define NV_PAUSEFRAME_TX_REQ 0x0020#define NV_PAUSEFRAME_AUTONEG 0x0040/* MSI/MSI-X defines */#define NV_MSI_X_MAX_VECTORS 8#define NV_MSI_X_VECTORS_MASK 0x000f#define NV_MSI_CAPABLE 0x0010#define NV_MSI_X_CAPABLE 0x0020#define NV_MSI_ENABLED 0x0040#define NV_MSI_X_ENABLED 0x0080#define NV_MSI_X_VECTOR_ALL 0x0#define NV_MSI_X_VECTOR_RX 0x0#define NV_MSI_X_VECTOR_TX 0x1#define NV_MSI_X_VECTOR_OTHER 0x2/* statistics */struct nv_ethtool_str { char name[ETH_GSTRING_LEN];};static const struct nv_ethtool_str nv_estats_str[] = { { "tx_bytes" }, { "tx_zero_rexmt" }, { "tx_one_rexmt" }, { "tx_many_rexmt" }, { "tx_late_collision" }, { "tx_fifo_errors" }, { "tx_carrier_errors" }, { "tx_excess_deferral" }, { "tx_retry_error" }, { "rx_frame_error" }, { "rx_extra_byte" }, { "rx_late_collision" }, { "rx_runt" }, { "rx_frame_too_long" }, { "rx_over_errors" }, { "rx_crc_errors" }, { "rx_frame_align_error" }, { "rx_length_error" }, { "rx_unicast" }, { "rx_multicast" }, { "rx_broadcast" }, { "rx_packets" }, { "rx_errors_total" }, { "tx_errors_total" }, /* version 2 stats */ { "tx_deferral" }, { "tx_packets" }, { "rx_bytes" }, { "tx_pause" }, { "rx_pause" }, { "rx_drop_frame" }};struct nv_ethtool_stats { u64 tx_bytes; u64 tx_zero_rexmt; u64 tx_one_rexmt; u64 tx_many_rexmt; u64 tx_late_collision; u64 tx_fifo_errors; u64 tx_carrier_errors; u64 tx_excess_deferral; u64 tx_retry_error; u64 rx_frame_error; u64 rx_extra_byte; u64 rx_late_collision; u64 rx_runt; u64 rx_frame_too_long; u64 rx_over_errors; u64 rx_crc_errors; u64 rx_frame_align_error; u64 rx_length_error; u64 rx_unicast; u64 rx_multicast; u64 rx_broadcast; u64 rx_packets; u64 rx_errors_total; u64 tx_errors_total; /* version 2 stats */ u64 tx_deferral; u64 tx_packets; u64 rx_bytes; u64 tx_pause; u64 rx_pause; u64 rx_drop_frame;};#define NV_DEV_STATISTICS_V2_COUNT (sizeof(struct nv_ethtool_stats)/sizeof(u64))#define NV_DEV_STATISTICS_V1_COUNT (NV_DEV_STATISTICS_V2_COUNT - 6)/* diagnostics */#define NV_TEST_COUNT_BASE 3#define NV_TEST_COUNT_EXTENDED 4static const struct nv_ethtool_str nv_etests_str[] = { { "link (online/offline)" }, { "register (offline) " }, { "interrupt (offline) " }, { "loopback (offline) " }};struct register_test { __le32 reg; __le32 mask;};static const struct register_test nv_registers_test[] = { { NvRegUnknownSetupReg6, 0x01 }, { NvRegMisc1, 0x03c }, { NvRegOffloadConfig, 0x03ff }, { NvRegMulticastAddrA, 0xffffffff }, { NvRegTxWatermark, 0x0ff }, { NvRegWakeUpFlags, 0x07777 }, { 0,0 }};struct nv_skb_map { struct sk_buff *skb; dma_addr_t dma; unsigned int dma_len;};/* * SMP locking: * All hardware access under dev->priv->lock, except the performance * critical parts: * - rx is (pseudo-) lockless: it relies on the single-threading provided * by the arch code for interrupts. * - tx setup is lockless: it relies on netif_tx_lock. Actual submission * needs dev->priv->lock :-( * - set_multicast_list: preparation lockless, relies on netif_tx_lock. *//* in dev: base, irq */struct fe_priv { spinlock_t lock; struct net_device *dev; struct napi_struct napi; /* General data: * Locking: spin_lock(&np->lock); */ struct nv_ethtool_stats estats; int in_shutdown; u32 linkspeed; int duplex; int autoneg; int fixed_mode; int phyaddr; int wolenabled; unsigned int phy_oui; unsigned int phy_model; u16 gigabit; int intr_test; int recover_error; /* General data: RO fields */ dma_addr_t ring_addr; struct pci_dev *pci_dev; u32 orig_mac[2]; u32 irqmask; u32 desc_ver; u32 txrxctl_bits; u32 vlanctl_bits; u32 driver_data; u32 register_size; int rx_csum; u32 mac_in_use; void __iomem *base; /* rx specific fields. * Locking: Within irq hander or disable_irq+spin_lock(&np->lock); */ union ring_type get_rx, put_rx, first_rx, last_rx; struct nv_skb_map *get_rx_ctx, *put_rx_ctx; struct nv_skb_map *first_rx_ctx, *last_rx_ctx; struct nv_skb_map *rx_skb; union ring_type rx_ring; unsigned int rx_buf_sz; unsigned int pkt_limit; struct timer_list oom_kick; struct timer_list nic_poll; struct timer_list stats_poll; u32 nic_poll_irq; int rx_ring_size; /* media detection workaround. * Locking: Within irq hander or disable_irq+spin_lock(&np->lock); */ int need_linktimer; unsigned long link_timeout; /* * tx specific fields. */ union ring_type get_tx, put_tx, first_tx, last_tx; struct nv_skb_map *get_tx_ctx, *put_tx_ctx; struct nv_skb_map *first_tx_ctx, *last_tx_ctx; struct nv_skb_map *tx_skb; union ring_type tx_ring; u32 tx_flags; int tx_ring_size; int tx_stop; /* vlan fields */ struct vlan_group *vlangrp; /* msi/msi-x fields */ u32 msi_flags; struct msix_entry msi_x_entry[NV_MSI_X_MAX_VECTORS]; /* flow control */ u32 pause_flags;};/* * Maximum number of loops until we assume that a bit in the irq mask * is stuck. Overridable with module param. */static int max_interrupt_work = 5;/* * Optimization can be either throuput mode or cpu mode * * Throughput Mode: Every tx and rx packet will generate an interrupt. * CPU Mode: Interrupts are controlled by a timer.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -