Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/e1000/if_em.h
/****************************************************************************** | /*$FreeBSD$*/ | ||||
#include "opt_em.h" | |||||
#include "opt_ddb.h" | |||||
#include "opt_inet.h" | |||||
#include "opt_inet6.h" | |||||
Copyright (c) 2001-2015, Intel Corporation | #ifdef HAVE_KERNEL_OPTION_HEADERS | ||||
All rights reserved. | #include "opt_device_polling.h" | ||||
#endif | |||||
Redistribution and use in source and binary forms, with or without | #include <sys/param.h> | ||||
modification, are permitted provided that the following conditions are met: | #include <sys/systm.h> | ||||
#ifdef DDB | |||||
#include <sys/types.h> | |||||
#include <ddb/ddb.h> | |||||
#endif | |||||
#if __FreeBSD_version >= 800000 | |||||
#include <sys/buf_ring.h> | |||||
#endif | |||||
#include <sys/bus.h> | |||||
#include <sys/endian.h> | |||||
#include <sys/kernel.h> | |||||
#include <sys/kthread.h> | |||||
#include <sys/malloc.h> | |||||
#include <sys/mbuf.h> | |||||
#include <sys/module.h> | |||||
#include <sys/rman.h> | |||||
#include <sys/smp.h> | |||||
#include <sys/socket.h> | |||||
#include <sys/sockio.h> | |||||
#include <sys/sysctl.h> | |||||
#include <sys/taskqueue.h> | |||||
#include <sys/eventhandler.h> | |||||
#include <machine/bus.h> | |||||
#include <machine/resource.h> | |||||
1. Redistributions of source code must retain the above copyright notice, | #include <net/bpf.h> | ||||
this list of conditions and the following disclaimer. | #include <net/ethernet.h> | ||||
#include <net/if.h> | |||||
#include <net/if_var.h> | |||||
#include <net/if_arp.h> | |||||
#include <net/if_dl.h> | |||||
#include <net/if_media.h> | |||||
#include <net/iflib.h> | |||||
2. Redistributions in binary form must reproduce the above copyright | #include <net/if_types.h> | ||||
notice, this list of conditions and the following disclaimer in the | #include <net/if_vlan_var.h> | ||||
documentation and/or other materials provided with the distribution. | |||||
3. Neither the name of the Intel Corporation nor the names of its | #include <netinet/in_systm.h> | ||||
contributors may be used to endorse or promote products derived from | #include <netinet/in.h> | ||||
this software without specific prior written permission. | #include <netinet/if_ether.h> | ||||
#include <netinet/ip.h> | |||||
#include <netinet/ip6.h> | |||||
#include <netinet/tcp.h> | |||||
#include <netinet/udp.h> | |||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | #include <machine/in_cksum.h> | ||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | #include <dev/led/led.h> | ||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | #include <dev/pci/pcivar.h> | ||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | #include <dev/pci/pcireg.h> | ||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |||||
POSSIBILITY OF SUCH DAMAGE. | |||||
******************************************************************************/ | #include "e1000_api.h" | ||||
/*$FreeBSD$*/ | #include "e1000_82571.h" | ||||
#include "ifdi_if.h" | |||||
#ifndef _EM_H_DEFINED_ | #ifndef _EM_H_DEFINED_ | ||||
#define _EM_H_DEFINED_ | #define _EM_H_DEFINED_ | ||||
/* Tunables */ | /* Tunables */ | ||||
/* | /* | ||||
* EM_TXD: Maximum number of Transmit Descriptors | * EM_TXD: Maximum number of Transmit Descriptors | ||||
* Valid Range: 80-256 for 82542 and 82543-based adapters | * Valid Range: 80-256 for 82542 and 82543-based adapters | ||||
* 80-4096 for others | * 80-4096 for others | ||||
* Default Value: 256 | * Default Value: 256 | ||||
* This value is the number of transmit descriptors allocated by the driver. | * This value is the number of transmit descriptors allocated by the driver. | ||||
* Increasing this value allows the driver to queue more transmits. Each | * Increasing this value allows the driver to queue more transmits. Each | ||||
* descriptor is 16 bytes. | * descriptor is 16 bytes. | ||||
* Since TDLEN should be multiple of 128bytes, the number of transmit | * Since TDLEN should be multiple of 128bytes, the number of transmit | ||||
* desscriptors should meet the following condition. | * desscriptors should meet the following condition. | ||||
* (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 | * (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 | ||||
*/ | */ | ||||
#define EM_MIN_TXD 80 | #define EM_MIN_TXD 128 | ||||
#define EM_MAX_TXD 4096 | #define EM_MAX_TXD 4096 | ||||
#ifdef EM_MULTIQUEUE | |||||
#define EM_DEFAULT_TXD 4096 | |||||
#else | |||||
#define EM_DEFAULT_TXD 1024 | #define EM_DEFAULT_TXD 1024 | ||||
#endif | #define EM_DEFAULT_MULTI_TXD 4096 | ||||
/* | /* | ||||
* EM_RXD - Maximum number of receive Descriptors | * EM_RXD - Maximum number of receive Descriptors | ||||
* Valid Range: 80-256 for 82542 and 82543-based adapters | * Valid Range: 80-256 for 82542 and 82543-based adapters | ||||
* 80-4096 for others | * 80-4096 for others | ||||
* Default Value: 256 | * Default Value: 256 | ||||
* This value is the number of receive descriptors allocated by the driver. | * This value is the number of receive descriptors allocated by the driver. | ||||
* Increasing this value allows the driver to buffer more incoming packets. | * Increasing this value allows the driver to buffer more incoming packets. | ||||
* Each descriptor is 16 bytes. A receive buffer is also allocated for each | * Each descriptor is 16 bytes. A receive buffer is also allocated for each | ||||
* descriptor. The maximum MTU size is 16110. | * descriptor. The maximum MTU size is 16110. | ||||
* Since TDLEN should be multiple of 128bytes, the number of transmit | * Since TDLEN should be multiple of 128bytes, the number of transmit | ||||
* desscriptors should meet the following condition. | * desscriptors should meet the following condition. | ||||
* (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 | * (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 | ||||
*/ | */ | ||||
#define EM_MIN_RXD 80 | #define EM_MIN_RXD 128 | ||||
#define EM_MAX_RXD 4096 | #define EM_MAX_RXD 4096 | ||||
#ifdef EM_MULTIQUEUE | |||||
#define EM_DEFAULT_RXD 4096 | |||||
#else | |||||
#define EM_DEFAULT_RXD 1024 | #define EM_DEFAULT_RXD 1024 | ||||
#endif | #define EM_DEFAULT_MULTI_RXD 4096 | ||||
/* | /* | ||||
* EM_TIDV - Transmit Interrupt Delay Value | * EM_TIDV - Transmit Interrupt Delay Value | ||||
* Valid Range: 0-65535 (0=off) | * Valid Range: 0-65535 (0=off) | ||||
* Default Value: 64 | * Default Value: 64 | ||||
* This value delays the generation of transmit interrupts in units of | * This value delays the generation of transmit interrupts in units of | ||||
* 1.024 microseconds. Transmit interrupt reduction can improve CPU | * 1.024 microseconds. Transmit interrupt reduction can improve CPU | ||||
* efficiency if properly tuned for specific network traffic. If the | * efficiency if properly tuned for specific network traffic. If the | ||||
▲ Show 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
#ifdef EM_MULTIQUEUE | #ifdef EM_MULTIQUEUE | ||||
#define EM_RADV 128 | #define EM_RADV 128 | ||||
#else | #else | ||||
#define EM_RADV 64 | #define EM_RADV 64 | ||||
#endif | #endif | ||||
/* | /* | ||||
* This parameter controls the max duration of transmit watchdog. | |||||
*/ | |||||
#define EM_WATCHDOG (10 * hz) | |||||
/* | |||||
* This parameter controls when the driver calls the routine to reclaim | |||||
* transmit descriptors. | |||||
*/ | |||||
#define EM_TX_CLEANUP_THRESHOLD (adapter->num_tx_desc / 8) | |||||
/* | |||||
* This parameter controls whether or not autonegotation is enabled. | * This parameter controls whether or not autonegotation is enabled. | ||||
* 0 - Disable autonegotiation | * 0 - Disable autonegotiation | ||||
* 1 - Enable autonegotiation | * 1 - Enable autonegotiation | ||||
*/ | */ | ||||
#define DO_AUTO_NEG 1 | #define DO_AUTO_NEG 1 | ||||
/* | /* | ||||
* This parameter control whether or not the driver will wait for | * This parameter control whether or not the driver will wait for | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | |||||
#define EM_TX_IDLE 0x00000000 | #define EM_TX_IDLE 0x00000000 | ||||
#define EM_TX_BUSY 0x00000001 | #define EM_TX_BUSY 0x00000001 | ||||
#define EM_TX_HUNG 0x80000000 | #define EM_TX_HUNG 0x80000000 | ||||
#define EM_TX_MAXTRIES 10 | #define EM_TX_MAXTRIES 10 | ||||
#define PCICFG_DESC_RING_STATUS 0xe4 | #define PCICFG_DESC_RING_STATUS 0xe4 | ||||
#define FLUSH_DESC_REQUIRED 0x100 | #define FLUSH_DESC_REQUIRED 0x100 | ||||
#define IGB_RX_PTHRESH ((hw->mac.type == e1000_i354) ? 12 : \ | |||||
((hw->mac.type <= e1000_82576) ? 16 : 8)) | |||||
#define IGB_RX_HTHRESH 8 | |||||
#define IGB_RX_WTHRESH ((hw->mac.type == e1000_82576 && \ | |||||
(adapter->intr_type == IFLIB_INTR_MSIX)) ? 1 : 4) | |||||
#define IGB_TX_PTHRESH ((hw->mac.type == e1000_i354) ? 20 : 8) | |||||
#define IGB_TX_HTHRESH 1 | |||||
#define IGB_TX_WTHRESH ((hw->mac.type != e1000_82575 && \ | |||||
(adapter->intr_type == IFLIB_INTR_MSIX) ? 1 : 16) | |||||
/* | /* | ||||
* TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN should be | * TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN should be | ||||
* multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary. This will | * multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary. This will | ||||
* also optimize cache line size effect. H/W supports up to cache line size 128. | * also optimize cache line size effect. H/W supports up to cache line size 128. | ||||
*/ | */ | ||||
#define EM_DBA_ALIGN 128 | #define EM_DBA_ALIGN 128 | ||||
/* | /* | ||||
* See Intel 82574 Driver Programming Interface Manual, Section 10.2.6.9 | * See Intel 82574 Driver Programming Interface Manual, Section 10.2.6.9 | ||||
*/ | */ | ||||
#define TARC_COMPENSATION_MODE (1 << 7) /* Compensation Mode */ | #define TARC_COMPENSATION_MODE (1 << 7) /* Compensation Mode */ | ||||
#define TARC_SPEED_MODE_BIT (1 << 21) /* On PCI-E MACs only */ | #define TARC_SPEED_MODE_BIT (1 << 21) /* On PCI-E MACs only */ | ||||
#define TARC_MQ_FIX (1 << 23) | \ | #define TARC_MQ_FIX (1 << 23) | \ | ||||
(1 << 24) | \ | (1 << 24) | \ | ||||
(1 << 25) /* Handle errata in MQ mode */ | (1 << 25) /* Handle errata in MQ mode */ | ||||
#define TARC_ERRATA_BIT (1 << 26) /* Note from errata on 82574 */ | #define TARC_ERRATA_BIT (1 << 26) /* Note from errata on 82574 */ | ||||
/* PCI Config defines */ | /* PCI Config defines */ | ||||
#define EM_BAR_TYPE(v) ((v) & EM_BAR_TYPE_MASK) | #define EM_BAR_TYPE(v) ((v) & EM_BAR_TYPE_MASK) | ||||
#define EM_BAR_TYPE_MASK 0x00000001 | #define EM_BAR_TYPE_MASK 0x00000001 | ||||
#define EM_BAR_TYPE_MMEM 0x00000000 | #define EM_BAR_TYPE_MMEM 0x00000000 | ||||
#define EM_BAR_TYPE_IO 0x00000001 | |||||
#define EM_BAR_TYPE_FLASH 0x0014 | #define EM_BAR_TYPE_FLASH 0x0014 | ||||
#define EM_BAR_MEM_TYPE(v) ((v) & EM_BAR_MEM_TYPE_MASK) | #define EM_BAR_MEM_TYPE(v) ((v) & EM_BAR_MEM_TYPE_MASK) | ||||
#define EM_BAR_MEM_TYPE_MASK 0x00000006 | #define EM_BAR_MEM_TYPE_MASK 0x00000006 | ||||
#define EM_BAR_MEM_TYPE_32BIT 0x00000000 | #define EM_BAR_MEM_TYPE_32BIT 0x00000000 | ||||
#define EM_BAR_MEM_TYPE_64BIT 0x00000004 | #define EM_BAR_MEM_TYPE_64BIT 0x00000004 | ||||
#define EM_MSIX_BAR 3 /* On 82575 */ | #define EM_MSIX_BAR 3 /* On 82575 */ | ||||
/* More backward compatibility */ | /* More backward compatibility */ | ||||
Show All 21 Lines | |||||
#define EM_TSO_SIZE (65535 + sizeof(struct ether_vlan_header)) | #define EM_TSO_SIZE (65535 + sizeof(struct ether_vlan_header)) | ||||
#define EM_TSO_SEG_SIZE 4096 /* Max dma segment size */ | #define EM_TSO_SEG_SIZE 4096 /* Max dma segment size */ | ||||
#define EM_MSIX_MASK 0x01F00000 /* For 82574 use */ | #define EM_MSIX_MASK 0x01F00000 /* For 82574 use */ | ||||
#define EM_MSIX_LINK 0x01000000 /* For 82574 use */ | #define EM_MSIX_LINK 0x01000000 /* For 82574 use */ | ||||
#define ETH_ZLEN 60 | #define ETH_ZLEN 60 | ||||
#define ETH_ADDR_LEN 6 | #define ETH_ADDR_LEN 6 | ||||
#define CSUM_OFFLOAD 7 /* Offload bits in mbuf flag */ | #define CSUM_OFFLOAD 7 /* Offload bits in mbuf flag */ | ||||
#define IGB_PKTTYPE_MASK 0x0000FFF0 | |||||
#define IGB_DMCTLX_DCFLUSH_DIS 0x80000000 /* Disable DMA Coalesce Flush */ | |||||
/* | /* | ||||
* 82574 has a nonstandard address for EIAC | * 82574 has a nonstandard address for EIAC | ||||
* and since its only used in MSIX, and in | * and since its only used in MSIX, and in | ||||
* the em driver only 82574 uses MSIX we can | * the em driver only 82574 uses MSIX we can | ||||
* solve it just using this define. | * solve it just using this define. | ||||
*/ | */ | ||||
#define EM_EIAC 0x000DC | #define EM_EIAC 0x000DC | ||||
/* | /* | ||||
* 82574 only reports 3 MSI-X vectors by default; | * 82574 only reports 3 MSI-X vectors by default; | ||||
* defines assisting with making it report 5 are | * defines assisting with making it report 5 are | ||||
* located here. | * located here. | ||||
*/ | */ | ||||
#define EM_NVM_PCIE_CTRL 0x1B | #define EM_NVM_PCIE_CTRL 0x1B | ||||
#define EM_NVM_MSIX_N_MASK (0x7 << EM_NVM_MSIX_N_SHIFT) | #define EM_NVM_MSIX_N_MASK (0x7 << EM_NVM_MSIX_N_SHIFT) | ||||
#define EM_NVM_MSIX_N_SHIFT 7 | #define EM_NVM_MSIX_N_SHIFT 7 | ||||
/* | |||||
* Bus dma allocation structure used by | |||||
* e1000_dma_malloc and e1000_dma_free. | |||||
*/ | |||||
struct em_dma_alloc { | |||||
bus_addr_t dma_paddr; | |||||
caddr_t dma_vaddr; | |||||
bus_dma_tag_t dma_tag; | |||||
bus_dmamap_t dma_map; | |||||
bus_dma_segment_t dma_seg; | |||||
int dma_nseg; | |||||
}; | |||||
struct adapter; | struct adapter; | ||||
struct em_int_delay_info { | struct em_int_delay_info { | ||||
struct adapter *adapter; /* Back-pointer to the adapter struct */ | struct adapter *adapter; /* Back-pointer to the adapter struct */ | ||||
int offset; /* Register offset to read/write */ | int offset; /* Register offset to read/write */ | ||||
int value; /* Current value in usecs */ | int value; /* Current value in usecs */ | ||||
}; | }; | ||||
/* | /* | ||||
* The transmit ring, one per tx queue | * The transmit ring, one per tx queue | ||||
*/ | */ | ||||
struct tx_ring { | struct tx_ring { | ||||
struct adapter *adapter; | struct adapter *adapter; | ||||
struct mtx tx_mtx; | struct em_tx_queue *que; | ||||
char mtx_name[16]; | |||||
u32 me; | u32 me; | ||||
u32 msix; | |||||
u32 ims; | |||||
int busy; | int busy; | ||||
struct em_dma_alloc txdma; | |||||
struct e1000_tx_desc *tx_base; | struct e1000_tx_desc *tx_base; | ||||
struct task tx_task; | uint64_t tx_paddr; | ||||
struct taskqueue *tq; | |||||
u32 next_avail_desc; | |||||
u32 next_to_clean; | |||||
struct em_txbuffer *tx_buffers; | struct em_txbuffer *tx_buffers; | ||||
volatile u16 tx_avail; | |||||
u32 tx_tso; /* last tx was tso */ | u32 tx_tso; /* last tx was tso */ | ||||
u16 last_hw_offload; | |||||
u8 last_hw_ipcso; | |||||
u8 last_hw_ipcss; | |||||
u8 last_hw_tucso; | |||||
u8 last_hw_tucss; | |||||
#if __FreeBSD_version >= 800000 | |||||
struct buf_ring *br; | |||||
#endif | |||||
/* Interrupt resources */ | /* Interrupt resources */ | ||||
bus_dma_tag_t txtag; | |||||
void *tag; | void *tag; | ||||
struct resource *res; | struct resource *res; | ||||
unsigned long tx_irq; | unsigned long tx_irq; | ||||
unsigned long no_desc_avail; | unsigned long no_desc_avail; | ||||
/* Saved csum offloading context information */ | |||||
int csum_flags; | |||||
int csum_lhlen; | |||||
int csum_iphlen; | |||||
int csum_thlen; | |||||
int csum_mss; | |||||
int csum_pktlen; | |||||
uint32_t csum_txd_upper; | |||||
uint32_t csum_txd_lower; /* last field */ | |||||
}; | }; | ||||
/* | /* | ||||
* The Receive ring, one per rx queue | * The Receive ring, one per rx queue | ||||
*/ | */ | ||||
struct rx_ring { | struct rx_ring { | ||||
struct adapter *adapter; | struct adapter *adapter; | ||||
struct em_rx_queue *que; | |||||
u32 me; | u32 me; | ||||
u32 msix; | |||||
u32 ims; | |||||
struct mtx rx_mtx; | |||||
char mtx_name[16]; | |||||
u32 payload; | u32 payload; | ||||
struct task rx_task; | |||||
struct taskqueue *tq; | |||||
union e1000_rx_desc_extended *rx_base; | union e1000_rx_desc_extended *rx_base; | ||||
struct em_dma_alloc rxdma; | uint64_t rx_paddr; | ||||
u32 next_to_refresh; | |||||
u32 next_to_check; | |||||
struct em_rxbuffer *rx_buffers; | |||||
struct mbuf *fmp; | |||||
struct mbuf *lmp; | |||||
/* Interrupt resources */ | /* Interrupt resources */ | ||||
void *tag; | void *tag; | ||||
struct resource *res; | struct resource *res; | ||||
bus_dma_tag_t rxtag; | |||||
bool discard; | bool discard; | ||||
/* Soft stats */ | /* Soft stats */ | ||||
unsigned long rx_irq; | unsigned long rx_irq; | ||||
unsigned long rx_discarded; | unsigned long rx_discarded; | ||||
unsigned long rx_packets; | unsigned long rx_packets; | ||||
unsigned long rx_bytes; | unsigned long rx_bytes; | ||||
}; | }; | ||||
struct em_tx_queue { | |||||
struct adapter *adapter; | |||||
u32 msix; | |||||
u32 eims; /* This queue's EIMS bit */ | |||||
u32 me; | |||||
struct tx_ring txr; | |||||
}; | |||||
struct em_rx_queue { | |||||
struct adapter *adapter; | |||||
u32 me; | |||||
u32 msix; | |||||
u32 eims; | |||||
struct rx_ring rxr; | |||||
u64 irqs; | |||||
struct if_irq que_irq; | |||||
}; | |||||
/* Our adapter structure */ | /* Our adapter structure */ | ||||
struct adapter { | struct adapter { | ||||
if_t ifp; | struct ifnet *ifp; | ||||
struct e1000_hw hw; | struct e1000_hw hw; | ||||
if_softc_ctx_t shared; | |||||
if_ctx_t ctx; | |||||
#define tx_num_queues shared->isc_ntxqsets | |||||
#define rx_num_queues shared->isc_nrxqsets | |||||
#define intr_type shared->isc_intr | |||||
/* FreeBSD operating-system-specific structures. */ | /* FreeBSD operating-system-specific structures. */ | ||||
struct e1000_osdep osdep; | struct e1000_osdep osdep; | ||||
device_t dev; | struct device *dev; | ||||
struct cdev *led_dev; | struct cdev *led_dev; | ||||
struct em_tx_queue *tx_queues; | |||||
struct em_rx_queue *rx_queues; | |||||
struct if_irq irq; | |||||
struct resource *memory; | struct resource *memory; | ||||
struct resource *flash; | struct resource *flash; | ||||
struct resource *msix_mem; | struct resource *ioport; | ||||
int io_rid; | |||||
struct resource *res; | struct resource *res; | ||||
void *tag; | void *tag; | ||||
u32 linkvec; | u32 linkvec; | ||||
u32 ivars; | u32 ivars; | ||||
struct ifmedia media; | struct ifmedia *media; | ||||
struct callout timer; | |||||
int msix; | int msix; | ||||
int if_flags; | int if_flags; | ||||
int max_frame_size; | |||||
int min_frame_size; | int min_frame_size; | ||||
struct mtx core_mtx; | |||||
int em_insert_vlan_header; | int em_insert_vlan_header; | ||||
u32 ims; | u32 ims; | ||||
bool in_detach; | bool in_detach; | ||||
/* Task for FAST handling */ | /* Task for FAST handling */ | ||||
struct task link_task; | struct grouptask link_task; | ||||
struct task que_task; | |||||
struct taskqueue *tq; /* private task queue */ | |||||
eventhandler_tag vlan_attach; | |||||
eventhandler_tag vlan_detach; | |||||
u16 num_vlans; | u16 num_vlans; | ||||
u8 num_queues; | |||||
/* | |||||
* Transmit rings: | |||||
* Allocated at run time, an array of rings. | |||||
*/ | |||||
struct tx_ring *tx_rings; | |||||
int num_tx_desc; | |||||
u32 txd_cmd; | u32 txd_cmd; | ||||
/* | u32 tx_process_limit; | ||||
* Receive rings: | |||||
* Allocated at run time, an array of rings. | |||||
*/ | |||||
struct rx_ring *rx_rings; | |||||
int num_rx_desc; | |||||
u32 rx_process_limit; | u32 rx_process_limit; | ||||
u32 rx_mbuf_sz; | u32 rx_mbuf_sz; | ||||
/* Management and WOL features */ | /* Management and WOL features */ | ||||
u32 wol; | u32 wol; | ||||
bool has_manage; | bool has_manage; | ||||
bool has_amt; | bool has_amt; | ||||
Show All 9 Lines | #define intr_type shared->isc_intr | ||||
u32 shadow_vfta[EM_VFTA_SIZE]; | u32 shadow_vfta[EM_VFTA_SIZE]; | ||||
/* Info about the interface */ | /* Info about the interface */ | ||||
u16 link_active; | u16 link_active; | ||||
u16 fc; | u16 fc; | ||||
u16 link_speed; | u16 link_speed; | ||||
u16 link_duplex; | u16 link_duplex; | ||||
u32 smartspeed; | u32 smartspeed; | ||||
u32 dmac; | |||||
int link_mask; | |||||
u64 que_mask; | |||||
struct em_int_delay_info tx_int_delay; | struct em_int_delay_info tx_int_delay; | ||||
struct em_int_delay_info tx_abs_int_delay; | struct em_int_delay_info tx_abs_int_delay; | ||||
struct em_int_delay_info rx_int_delay; | struct em_int_delay_info rx_int_delay; | ||||
struct em_int_delay_info rx_abs_int_delay; | struct em_int_delay_info rx_abs_int_delay; | ||||
struct em_int_delay_info tx_itr; | struct em_int_delay_info tx_itr; | ||||
/* Misc stats maintained by the driver */ | /* Misc stats maintained by the driver */ | ||||
unsigned long dropped_pkts; | unsigned long dropped_pkts; | ||||
Show All 18 Lines | typedef struct _em_vendor_info_t { | ||||
unsigned int vendor_id; | unsigned int vendor_id; | ||||
unsigned int device_id; | unsigned int device_id; | ||||
unsigned int subvendor_id; | unsigned int subvendor_id; | ||||
unsigned int subdevice_id; | unsigned int subdevice_id; | ||||
unsigned int index; | unsigned int index; | ||||
} em_vendor_info_t; | } em_vendor_info_t; | ||||
struct em_txbuffer { | struct em_txbuffer { | ||||
int next_eop; /* Index of the desc to watch */ | int eop; | ||||
struct mbuf *m_head; | |||||
bus_dmamap_t map; /* bus_dma map for packet */ | |||||
}; | }; | ||||
struct em_rxbuffer { | |||||
int next_eop; /* Index of the desc to watch */ | |||||
struct mbuf *m_head; | |||||
bus_dmamap_t map; /* bus_dma map for packet */ | |||||
bus_addr_t paddr; | |||||
}; | |||||
/* | |||||
** Find the number of unrefreshed RX descriptors | |||||
*/ | |||||
static inline u16 | |||||
e1000_rx_unrefreshed(struct rx_ring *rxr) | |||||
{ | |||||
struct adapter *adapter = rxr->adapter; | |||||
if (rxr->next_to_check > rxr->next_to_refresh) | |||||
return (rxr->next_to_check - rxr->next_to_refresh - 1); | |||||
else | |||||
return ((adapter->num_rx_desc + rxr->next_to_check) - | |||||
rxr->next_to_refresh - 1); | |||||
} | |||||
#define EM_CORE_LOCK_INIT(_sc, _name) \ | #define EM_CORE_LOCK_INIT(_sc, _name) \ | ||||
mtx_init(&(_sc)->core_mtx, _name, "EM Core Lock", MTX_DEF) | mtx_init(&(_sc)->core_mtx, _name, "EM Core Lock", MTX_DEF) | ||||
#define EM_TX_LOCK_INIT(_sc, _name) \ | #define EM_TX_LOCK_INIT(_sc, _name) \ | ||||
mtx_init(&(_sc)->tx_mtx, _name, "EM TX Lock", MTX_DEF) | mtx_init(&(_sc)->tx_mtx, _name, "EM TX Lock", MTX_DEF) | ||||
#define EM_RX_LOCK_INIT(_sc, _name) \ | #define EM_RX_LOCK_INIT(_sc, _name) \ | ||||
mtx_init(&(_sc)->rx_mtx, _name, "EM RX Lock", MTX_DEF) | mtx_init(&(_sc)->rx_mtx, _name, "EM RX Lock", MTX_DEF) | ||||
#define EM_CORE_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->core_mtx) | #define EM_CORE_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->core_mtx) | ||||
Show All 19 Lines |