Page MenuHomeFreeBSD

D6926.diff
No OneTemporary

D6926.diff

Index: sys/dev/ixgbe/if_ix.c
===================================================================
--- sys/dev/ixgbe/if_ix.c
+++ sys/dev/ixgbe/if_ix.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -46,22 +46,21 @@
#include <netinet/in_rss.h>
#endif
-/*********************************************************************
- * Driver version
- *********************************************************************/
+/************************************************************************
+ * Driver version
+ ************************************************************************/
char ixgbe_driver_version[] = "3.1.13-k";
-/*********************************************************************
- * PCI Device ID Table
+/************************************************************************
+ * PCI Device ID Table
*
- * Used by probe to select devices to load on
- * Last field stores an index into ixgbe_strings
- * Last entry must be all 0s
+ * Used by probe to select devices to load on
+ * Last field stores an index into ixgbe_strings
+ * Last entry must be all 0s
*
- * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
- *********************************************************************/
-
+ * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
+ ************************************************************************/
static ixgbe_vendor_info_t ixgbe_vendor_info_array[] =
{
{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_DUAL_PORT, 0, 0, 0},
@@ -100,55 +99,54 @@
{0, 0, 0, 0, 0}
};
-/*********************************************************************
- * Table of branding strings
- *********************************************************************/
-
+/************************************************************************
+ * Table of branding strings
+ ************************************************************************/
static char *ixgbe_strings[] = {
"Intel(R) PRO/10GbE PCI-Express Network Driver"
};
-/*********************************************************************
- * Function prototypes
- *********************************************************************/
+/************************************************************************
+ * Function prototypes
+ ************************************************************************/
static int ixgbe_probe(device_t);
static int ixgbe_attach(device_t);
static int ixgbe_detach(device_t);
static int ixgbe_shutdown(device_t);
-static int ixgbe_suspend(device_t);
-static int ixgbe_resume(device_t);
+static int ixgbe_suspend(device_t);
+static int ixgbe_resume(device_t);
static int ixgbe_ioctl(struct ifnet *, u_long, caddr_t);
-static void ixgbe_init(void *);
+static void ixgbe_init(void *);
static void ixgbe_init_locked(struct adapter *);
static void ixgbe_stop(void *);
#if __FreeBSD_version >= 1100036
-static uint64_t ixgbe_get_counter(struct ifnet *, ift_counter);
+static uint64_t ixgbe_get_counter(struct ifnet *, ift_counter);
#endif
-static void ixgbe_add_media_types(struct adapter *);
+static void ixgbe_add_media_types(struct adapter *);
static void ixgbe_media_status(struct ifnet *, struct ifmediareq *);
static int ixgbe_media_change(struct ifnet *);
static void ixgbe_identify_hardware(struct adapter *);
static int ixgbe_allocate_pci_resources(struct adapter *);
-static void ixgbe_get_slot_info(struct adapter *);
+static void ixgbe_get_slot_info(struct adapter *);
static int ixgbe_allocate_msix(struct adapter *);
static int ixgbe_allocate_legacy(struct adapter *);
-static int ixgbe_setup_msix(struct adapter *);
-static void ixgbe_free_pci_resources(struct adapter *);
-static void ixgbe_local_timer(void *);
-static int ixgbe_setup_interface(device_t, struct adapter *);
-static void ixgbe_config_gpie(struct adapter *);
-static void ixgbe_config_dmac(struct adapter *);
-static void ixgbe_config_delay_values(struct adapter *);
-static void ixgbe_config_link(struct adapter *);
-static void ixgbe_check_wol_support(struct adapter *);
-static int ixgbe_setup_low_power_mode(struct adapter *);
-static void ixgbe_rearm_queues(struct adapter *, u64);
+static int ixgbe_setup_msix(struct adapter *);
+static void ixgbe_free_pci_resources(struct adapter *);
+static void ixgbe_local_timer(void *);
+static int ixgbe_setup_interface(device_t, struct adapter *);
+static void ixgbe_config_gpie(struct adapter *);
+static void ixgbe_config_dmac(struct adapter *);
+static void ixgbe_config_delay_values(struct adapter *);
+static void ixgbe_config_link(struct adapter *);
+static void ixgbe_check_wol_support(struct adapter *);
+static int ixgbe_setup_low_power_mode(struct adapter *);
+static void ixgbe_rearm_queues(struct adapter *, u64);
static void ixgbe_initialize_transmit_units(struct adapter *);
static void ixgbe_initialize_receive_units(struct adapter *);
-static void ixgbe_enable_rx_drop(struct adapter *);
-static void ixgbe_disable_rx_drop(struct adapter *);
-static void ixgbe_initialize_rss_mapping(struct adapter *);
+static void ixgbe_enable_rx_drop(struct adapter *);
+static void ixgbe_disable_rx_drop(struct adapter *);
+static void ixgbe_initialize_rss_mapping(struct adapter *);
static void ixgbe_enable_intr(struct adapter *);
static void ixgbe_disable_intr(struct adapter *);
@@ -156,57 +154,57 @@
static void ixgbe_set_promisc(struct adapter *);
static void ixgbe_set_multi(struct adapter *);
static void ixgbe_update_link_status(struct adapter *);
-static void ixgbe_set_ivar(struct adapter *, u8, u8, s8);
-static void ixgbe_configure_ivars(struct adapter *);
-static u8 * ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
+static void ixgbe_set_ivar(struct adapter *, u8, u8, s8);
+static void ixgbe_configure_ivars(struct adapter *);
+static u8 *ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
-static void ixgbe_setup_vlan_hw_support(struct adapter *);
-static void ixgbe_register_vlan(void *, struct ifnet *, u16);
-static void ixgbe_unregister_vlan(void *, struct ifnet *, u16);
+static void ixgbe_setup_vlan_hw_support(struct adapter *);
+static void ixgbe_register_vlan(void *, struct ifnet *, u16);
+static void ixgbe_unregister_vlan(void *, struct ifnet *, u16);
-static void ixgbe_add_device_sysctls(struct adapter *);
+static void ixgbe_add_device_sysctls(struct adapter *);
static void ixgbe_add_hw_stats(struct adapter *);
-static int ixgbe_set_flowcntl(struct adapter *, int);
-static int ixgbe_set_advertise(struct adapter *, int);
+static int ixgbe_set_flowcntl(struct adapter *, int);
+static int ixgbe_set_advertise(struct adapter *, int);
/* Sysctl handlers */
-static void ixgbe_set_sysctl_value(struct adapter *, const char *,
- const char *, int *, int);
-static int ixgbe_sysctl_flowcntl(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_advertise(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_thermal_test(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS);
+static void ixgbe_set_sysctl_value(struct adapter *, const char *,
+ const char *, int *, int);
+static int ixgbe_sysctl_flowcntl(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_advertise(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_thermal_test(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS);
#ifdef IXGBE_DEBUG
-static int ixgbe_sysctl_power_state(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_print_rss_config(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_power_state(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_print_rss_config(SYSCTL_HANDLER_ARGS);
#endif
-static int ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_eee_enable(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_eee_negotiated(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_eee_rx_lpi_status(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_eee_tx_lpi_status(SYSCTL_HANDLER_ARGS);
-static int ixgbe_sysctl_eee_tx_lpi_delay(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_eee_enable(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_eee_negotiated(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_eee_rx_lpi_status(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_eee_tx_lpi_status(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_eee_tx_lpi_delay(SYSCTL_HANDLER_ARGS);
/* Support for pluggable optic modules */
-static bool ixgbe_sfp_probe(struct adapter *);
+static bool ixgbe_sfp_probe(struct adapter *);
static void ixgbe_setup_optics(struct adapter *);
-/* Legacy (single vector interrupt handler */
-static void ixgbe_legacy_irq(void *);
+/* Legacy (single vector) interrupt handler */
+static void ixgbe_legacy_irq(void *);
-/* The MSI/X Interrupt handlers */
-static void ixgbe_msix_que(void *);
-static void ixgbe_msix_link(void *);
+/* The MSI/MSI-X Interrupt handlers */
+static void ixgbe_msix_que(void *);
+static void ixgbe_msix_link(void *);
/* Deferred interrupt tasklets */
-static void ixgbe_handle_que(void *, int);
-static void ixgbe_handle_link(void *, int);
-static void ixgbe_handle_msf(void *, int);
-static void ixgbe_handle_mod(void *, int);
-static void ixgbe_handle_phy(void *, int);
+static void ixgbe_handle_que(void *, int);
+static void ixgbe_handle_link(void *, int);
+static void ixgbe_handle_msf(void *, int);
+static void ixgbe_handle_mod(void *, int);
+static void ixgbe_handle_phy(void *, int);
#ifdef IXGBE_FDIR
static void ixgbe_reinit_fdir(void *, int);
@@ -224,10 +222,9 @@
#endif /* PCI_IOV */
-/*********************************************************************
+/************************************************************************
* FreeBSD Device Interface Entry Points
- *********************************************************************/
-
+ ************************************************************************/
static device_method_t ix_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, ixgbe_probe),
@@ -258,18 +255,17 @@
#endif /* DEV_NETMAP */
/*
-** TUNEABLE PARAMETERS:
-*/
+ * TUNEABLE PARAMETERS:
+ */
-static SYSCTL_NODE(_hw, OID_AUTO, ix, CTLFLAG_RD, 0,
- "IXGBE driver parameters");
+static SYSCTL_NODE(_hw, OID_AUTO, ix, CTLFLAG_RD, 0, "IXGBE driver parameters");
/*
-** AIM: Adaptive Interrupt Moderation
-** which means that the interrupt rate
-** is varied over time based on the
-** traffic for that interrupt vector
-*/
+ * AIM: Adaptive Interrupt Moderation
+ * which means that the interrupt rate
+ * is varied over time based on the
+ * traffic for that interrupt vector
+ */
static int ixgbe_enable_aim = TRUE;
SYSCTL_INT(_hw_ix, OID_AUTO, enable_aim, CTLFLAG_RWTUN, &ixgbe_enable_aim, 0,
"Enable adaptive interrupt moderation");
@@ -281,16 +277,13 @@
/* How many packets rxeof tries to clean at a time */
static int ixgbe_rx_process_limit = 256;
SYSCTL_INT(_hw_ix, OID_AUTO, rx_process_limit, CTLFLAG_RDTUN,
- &ixgbe_rx_process_limit, 0,
- "Maximum number of received packets to process at a time,"
- "-1 means unlimited");
+ &ixgbe_rx_process_limit, 0, "Maximum number of received packets to process at a time, -1 means unlimited");
/* How many packets txeof tries to clean at a time */
static int ixgbe_tx_process_limit = 256;
SYSCTL_INT(_hw_ix, OID_AUTO, tx_process_limit, CTLFLAG_RDTUN,
&ixgbe_tx_process_limit, 0,
- "Maximum number of sent packets to process at a time,"
- "-1 means unlimited");
+ "Maximum number of sent packets to process at a time, -1 means unlimited");
/* Flow control setting, default to full */
static int ixgbe_flow_control = ixgbe_fc_full;
@@ -303,16 +296,16 @@
&ixgbe_advertise_speed, 0, "Default advertised speed for all adapters");
/*
-** Smart speed setting, default to on
-** this only works as a compile option
-** right now as its during attach, set
-** this to 'ixgbe_smart_speed_off' to
-** disable.
-*/
+ * Smart speed setting, default to on
+ * this only works as a compile option
+ * right now as its during attach, set
+ * this to 'ixgbe_smart_speed_off' to
+ * disable.
+ */
static int ixgbe_smart_speed = ixgbe_smart_speed_on;
/*
- * MSIX should be the default for best performance,
+ * MSI-X should be the default for best performance,
* but this allows it to be forced off for testing.
*/
static int ixgbe_enable_msix = 1;
@@ -330,10 +323,10 @@
"Number of queues to configure, 0 indicates autoconfigure");
/*
-** Number of TX descriptors per ring,
-** setting higher than RX as this seems
-** the better performing choice.
-*/
+ * Number of TX descriptors per ring,
+ * setting higher than RX as this seems
+ * the better performing choice.
+ */
static int ixgbe_txd = PERFORM_TXD;
SYSCTL_INT(_hw_ix, OID_AUTO, txd, CTLFLAG_RDTUN, &ixgbe_txd, 0,
"Number of transmit descriptors per queue");
@@ -344,10 +337,10 @@
"Number of receive descriptors per queue");
/*
-** Defining this on will allow the use
-** of unsupported SFP+ modules, note that
-** doing so you are on your own :)
-*/
+ * Defining this on will allow the use
+ * of unsupported SFP+ modules, note that
+ * doing so you are on your own :)
+ */
static int allow_unsupported_sfp = FALSE;
TUNABLE_INT("hw.ix.unsupported_sfp", &allow_unsupported_sfp);
@@ -356,12 +349,12 @@
#ifdef IXGBE_FDIR
/*
-** Flow Director actually 'steals'
-** part of the packet buffer as its
-** filter pool, this variable controls
-** how much it uses:
-** 0 = 64K, 1 = 128K, 2 = 256K
-*/
+ * Flow Director actually 'steals'
+ * part of the packet buffer as its
+ * filter pool, this variable controls
+ * how much it uses:
+ * 0 = 64K, 1 = 128K, 2 = 256K
+ */
static int fdir_pballoc = 1;
#endif
@@ -379,25 +372,24 @@
static MALLOC_DEFINE(M_IXGBE, "ix", "ix driver allocations");
-/*********************************************************************
- * Device identification routine
+/************************************************************************
+ * ixgbe_probe - Device identification routine
*
- * ixgbe_probe determines if the driver should be loaded on
- * adapter based on PCI vendor/device id of the adapter.
+ * Determines if the driver should be loaded on
+ * adapter based on its PCI vendor/device ID.
*
- * return BUS_PROBE_DEFAULT on success, positive on failure
- *********************************************************************/
-
+ * return BUS_PROBE_DEFAULT on success, positive on failure
+ ************************************************************************/
static int
ixgbe_probe(device_t dev)
{
ixgbe_vendor_info_t *ent;
- u16 pci_vendor_id = 0;
- u16 pci_device_id = 0;
- u16 pci_subvendor_id = 0;
- u16 pci_subdevice_id = 0;
- char adapter_name[256];
+ u16 pci_vendor_id = 0;
+ u16 pci_device_id = 0;
+ u16 pci_subvendor_id = 0;
+ u16 pci_subdevice_id = 0;
+ char adapter_name[256];
INIT_DEBUGOUT("ixgbe_probe: begin");
@@ -413,10 +405,8 @@
while (ent->vendor_id != 0) {
if ((pci_vendor_id == ent->vendor_id) &&
(pci_device_id == ent->device_id) &&
-
((pci_subvendor_id == ent->subvendor_id) ||
(ent->subvendor_id == 0)) &&
-
((pci_subdevice_id == ent->subdevice_id) ||
(ent->subdevice_id == 0))) {
sprintf(adapter_name, "%s, Version - %s",
@@ -428,27 +418,27 @@
}
ent++;
}
+
return (ENXIO);
-}
+} /* ixgbe_probe */
-/*********************************************************************
- * Device initialization routine
+/************************************************************************
+ * ixgbe_attach - Device initialization routine
*
- * The attach entry point is called when the driver is being loaded.
- * This routine identifies the type of hardware, allocates all resources
- * and initializes the hardware.
+ * Called when the driver is being loaded.
+ * Identifies the type of hardware, allocates all resources
+ * and initializes the hardware.
*
- * return 0 on success, positive on failure
- *********************************************************************/
-
+ * return 0 on success, positive on failure
+ ************************************************************************/
static int
ixgbe_attach(device_t dev)
{
- struct adapter *adapter;
+ struct adapter *adapter;
struct ixgbe_hw *hw;
int error = 0;
u16 csum;
- u32 ctrl_ext;
+ u32 ctrl_ext;
INIT_DEBUGOUT("ixgbe_attach: begin");
@@ -485,7 +475,7 @@
ixgbe_set_sysctl_value(adapter, "tx_processing_limit",
"max number of tx packets to process",
- &adapter->tx_process_limit, ixgbe_tx_process_limit);
+ &adapter->tx_process_limit, ixgbe_tx_process_limit);
/* Do descriptor calc and sanity checks */
if (((ixgbe_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
@@ -496,16 +486,15 @@
adapter->num_tx_desc = ixgbe_txd;
/*
- ** With many RX rings it is easy to exceed the
- ** system mbuf allocation. Tuning nmbclusters
- ** can alleviate this.
- */
+ * With many RX rings it is easy to exceed the
+ * system mbuf allocation. Tuning nmbclusters
+ * can alleviate this.
+ */
if (nmbclusters > 0) {
int s;
s = (ixgbe_rxd * adapter->num_queues) * ixgbe_total_ports;
if (s > nmbclusters) {
- device_printf(dev, "RX Descriptors exceed "
- "system mbuf max, using default instead!\n");
+ device_printf(dev, "RX Descriptors exceed system mbuf max, using default instead!\n");
ixgbe_rxd = DEFAULT_RXD;
}
}
@@ -537,10 +526,10 @@
error = ixgbe_init_shared_code(hw);
if (error == IXGBE_ERR_SFP_NOT_PRESENT) {
/*
- ** No optics in this port, set up
- ** so the timer routine will probe
- ** for later insertion.
- */
+ * No optics in this port, set up
+ * so the timer routine will probe
+ * for later insertion.
+ */
adapter->sfp_probe = TRUE;
error = 0;
} else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) {
@@ -563,11 +552,7 @@
error = ixgbe_init_hw(hw);
switch (error) {
case IXGBE_ERR_EEPROM_VERSION:
- device_printf(dev, "This device is a pre-production adapter/"
- "LOM. Please be aware there may be issues associated "
- "with your hardware.\nIf you are experiencing problems "
- "please contact your Intel or hardware representative "
- "who provided you with this hardware.\n");
+ device_printf(dev, "This device is a pre-production adapter/LOM. Please be aware there may be issues associated with your hardware.\nIf you are experiencing problems please contact your Intel or hardware representative who provided you with this hardware.\n");
break;
case IXGBE_ERR_SFP_NOT_SUPPORTED:
device_printf(dev, "Unsupported SFP+ Module\n");
@@ -611,7 +596,7 @@
adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
ixgbe_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST);
- /* Check PCIE slot type/speed/width */
+ /* Check PCIE slot type/speed/width */
ixgbe_get_slot_info(adapter);
/* Set an initial default flow control & dmac value */
@@ -668,25 +653,24 @@
ixgbe_free_pci_resources(adapter);
free(adapter->mta, M_DEVBUF);
return (error);
-}
+} /* ixgbe_attach */
-/*********************************************************************
- * Device removal routine
+/************************************************************************
+ * ixgbe_detach - Device removal routine
*
- * The detach entry point is called when the driver is being removed.
- * This routine stops the adapter and deallocates all the resources
- * that were allocated for driver operation.
+ * Called when the driver is being removed.
+ * Stops the adapter and deallocates all the resources
+ * that were allocated for driver operation.
*
- * return 0 on success, positive on failure
- *********************************************************************/
-
+ * return 0 on success, positive on failure
+ ************************************************************************/
static int
ixgbe_detach(device_t dev)
{
- struct adapter *adapter = device_get_softc(dev);
+ struct adapter *adapter = device_get_softc(dev);
struct ix_queue *que = adapter->queues;
- struct tx_ring *txr = adapter->tx_rings;
- u32 ctrl_ext;
+ struct tx_ring *txr = adapter->tx_rings;
+ u32 ctrl_ext;
INIT_DEBUGOUT("ixgbe_detach: begin");
@@ -758,20 +742,18 @@
free(adapter->mta, M_DEVBUF);
IXGBE_CORE_LOCK_DESTROY(adapter);
- return (0);
-}
-/*********************************************************************
- *
- * Shutdown entry point
- *
- **********************************************************************/
+ return (0);
+} /* ixgbe_detach */
+/************************************************************************
+ * ixgbe_shutdown - Shutdown entry point
+ ************************************************************************/
static int
ixgbe_shutdown(device_t dev)
{
struct adapter *adapter = device_get_softc(dev);
- int error = 0;
+ int error = 0;
INIT_DEBUGOUT("ixgbe_shutdown: begin");
@@ -780,18 +762,18 @@
IXGBE_CORE_UNLOCK(adapter);
return (error);
-}
+} /* ixgbe_shutdown */
-/**
- * Methods for going from:
- * D0 -> D3: ixgbe_suspend
- * D3 -> D0: ixgbe_resume
- */
+/************************************************************************
+ * ixgbe_suspend
+ *
+ * From D0 to D3
+ ************************************************************************/
static int
ixgbe_suspend(device_t dev)
{
struct adapter *adapter = device_get_softc(dev);
- int error = 0;
+ int error = 0;
INIT_DEBUGOUT("ixgbe_suspend: begin");
@@ -802,15 +784,20 @@
IXGBE_CORE_UNLOCK(adapter);
return (error);
-}
+} /* ixgbe_suspend */
+/************************************************************************
+ * ixgbe_resume
+ *
+ * From D3 to D0
+ ************************************************************************/
static int
ixgbe_resume(device_t dev)
{
- struct adapter *adapter = device_get_softc(dev);
- struct ifnet *ifp = adapter->ifp;
+ struct adapter *adapter = device_get_softc(dev);
+ struct ifnet *ifp = adapter->ifp;
struct ixgbe_hw *hw = &adapter->hw;
- u32 wus;
+ u32 wus;
INIT_DEBUGOUT("ixgbe_resume: begin");
@@ -835,32 +822,29 @@
IXGBE_CORE_UNLOCK(adapter);
return (0);
-}
+} /* ixgbe_resume */
-/*********************************************************************
- * Ioctl entry point
+/************************************************************************
+ * ixgbe_ioctl - Ioctl entry point
*
- * ixgbe_ioctl is called when the user wants to configure the
- * interface.
+ * Called when the user wants to configure the interface.
*
- * return 0 on success, positive on failure
- **********************************************************************/
-
+ * return 0 on success, positive on failure
+ ************************************************************************/
static int
-ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
+ixgbe_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
{
- struct adapter *adapter = ifp->if_softc;
- struct ifreq *ifr = (struct ifreq *) data;
+ struct adapter *adapter = ifp->if_softc;
+ struct ifreq *ifr = (struct ifreq *) data;
#if defined(INET) || defined(INET6)
- struct ifaddr *ifa = (struct ifaddr *)data;
+ struct ifaddr *ifa = (struct ifaddr *)data;
#endif
- int error = 0;
- bool avoid_reset = FALSE;
+ int error = 0;
+ bool avoid_reset = FALSE;
switch (command) {
-
- case SIOCSIFADDR:
+ case SIOCSIFADDR:
#ifdef INET
if (ifa->ifa_addr->sa_family == AF_INET)
avoid_reset = TRUE;
@@ -870,9 +854,9 @@
avoid_reset = TRUE;
#endif
/*
- ** Calling init results in link renegotiation,
- ** so we avoid doing it when possible.
- */
+ * Calling init results in link renegotiation,
+ * so we avoid doing it when possible.
+ */
if (avoid_reset) {
ifp->if_flags |= IFF_UP;
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
@@ -891,8 +875,7 @@
} else {
IXGBE_CORE_LOCK(adapter);
ifp->if_mtu = ifr->ifr_mtu;
- adapter->max_frame_size =
- ifp->if_mtu + IXGBE_MTU_HDR;
+ adapter->max_frame_size = ifp->if_mtu + IXGBE_MTU_HDR;
ixgbe_init_locked(adapter);
#ifdef PCI_IOV
ixgbe_recalculate_max_frame(adapter);
@@ -908,7 +891,7 @@
if ((ifp->if_flags ^ adapter->if_flags) &
(IFF_PROMISC | IFF_ALLMULTI)) {
ixgbe_set_promisc(adapter);
- }
+ }
} else
ixgbe_init_locked(adapter);
} else
@@ -1004,7 +987,7 @@
}
return (error);
-}
+} /* ixgbe_ioctl */
/*
* Set the various hardware offload abilities.
@@ -1046,29 +1029,29 @@
#endif
}
-/*********************************************************************
- * Init entry point
+/************************************************************************
+ * ixgbe_init_locked - Init entry point
*
- * This routine is used in two ways. It is used by the stack as
- * init entry point in network interface structure. It is also used
- * by the driver as a hw/sw initialization routine to get to a
- * consistent state.
+ * Used in two ways: It is used by the stack as an init
+ * entry point in network interface structure. It is also
+ * used by the driver as a hw/sw initialization routine to
+ * get to a consistent state.
*
- * return 0 on success, positive on failure
- **********************************************************************/
+ * return 0 on success, positive on failure
+ ************************************************************************/
#define IXGBE_MHADD_MFS_SHIFT 16
static void
ixgbe_init_locked(struct adapter *adapter)
{
- struct ifnet *ifp = adapter->ifp;
- device_t dev = adapter->dev;
+ struct ifnet *ifp = adapter->ifp;
+ device_t dev = adapter->dev;
struct ixgbe_hw *hw = &adapter->hw;
struct tx_ring *txr;
struct rx_ring *rxr;
- u32 txdctl, mhadd;
- u32 rxdctl, rxctrl;
- int err = 0;
+ u32 txdctl, mhadd;
+ u32 rxdctl, rxctrl;
+ int err = 0;
#ifdef PCI_IOV
enum ixgbe_iov_mode mode;
#endif
@@ -1078,7 +1061,7 @@
hw->adapter_stopped = FALSE;
ixgbe_stop_adapter(hw);
- callout_stop(&adapter->timer);
+ callout_stop(&adapter->timer);
#ifdef PCI_IOV
mode = ixgbe_get_iov_mode(adapter);
@@ -1089,7 +1072,7 @@
adapter->tx_rings[i].me = ixgbe_pf_que_index(mode, i);
}
#endif
- /* reprogram the RAR[0] in case user changed it. */
+ /* reprogram the RAR[0] in case user changed it. */
ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, IXGBE_RAH_AV);
/* Get the latest mac address, User can use a LAA */
@@ -1132,7 +1115,7 @@
/* Configure RX settings */
ixgbe_initialize_receive_units(adapter);
- /* Enable SDP & MSIX interrupts based on adapter */
+ /* Enable SDP & MSI-X interrupts based on adapter */
ixgbe_config_gpie(adapter);
/* Set MTU size */
@@ -1143,7 +1126,7 @@
mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
}
-
+
/* Now enable all the queues */
for (int i = 0; i < adapter->num_queues; i++) {
txr = &adapter->tx_rings[i];
@@ -1167,10 +1150,10 @@
rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
if (hw->mac.type == ixgbe_mac_82598EB) {
/*
- ** PTHRESH = 21
- ** HTHRESH = 4
- ** WTHRESH = 8
- */
+ * PTHRESH = 21
+ * HTHRESH = 4
+ * WTHRESH = 8
+ */
rxdctl &= ~0x3FFFFF;
rxdctl |= 0x080420;
}
@@ -1221,7 +1204,7 @@
callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
- /* Set up MSI/X routing */
+ /* Set up MSI-X routing */
if (ixgbe_enable_msix) {
ixgbe_configure_ivars(adapter);
/* Set up auto-mask */
@@ -1232,8 +1215,8 @@
IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
}
} else { /* Simple settings for Legacy/MSI */
- ixgbe_set_ivar(adapter, 0, 0, 0);
- ixgbe_set_ivar(adapter, 0, 0, 1);
+ ixgbe_set_ivar(adapter, 0, 0, 0);
+ ixgbe_set_ivar(adapter, 0, 0, 1);
IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
}
@@ -1254,10 +1237,10 @@
if (hw->phy.type == ixgbe_phy_none) {
err = hw->phy.ops.identify(hw);
if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
- device_printf(dev,
+ device_printf(dev,
"Unsupported SFP+ module type was detected.\n");
return;
- }
+ }
}
/* Set moderation on the Link interrupt */
@@ -1304,8 +1287,11 @@
ifp->if_drv_flags |= IFF_DRV_RUNNING;
return;
-}
+} /* ixgbe_init_locked */
+/************************************************************************
+ * ixgbe_init
+ ************************************************************************/
static void
ixgbe_init(void *arg)
{
@@ -1314,14 +1300,18 @@
IXGBE_CORE_LOCK(adapter);
ixgbe_init_locked(adapter);
IXGBE_CORE_UNLOCK(adapter);
+
return;
-}
+} /* ixgbe_init */
+/************************************************************************
+ * ixgbe_config_gpie
+ ************************************************************************/
static void
ixgbe_config_gpie(struct adapter *adapter)
{
struct ixgbe_hw *hw = &adapter->hw;
- u32 gpie;
+ u32 gpie;
gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
@@ -1349,24 +1339,27 @@
gpie |= IXGBE_SDP0_GPIEN_X540;
if (adapter->msix > 1) {
- /* Enable Enhanced MSIX mode */
+ /* Enable Enhanced MSI-X mode */
gpie |= IXGBE_GPIE_MSIX_MODE;
gpie |= IXGBE_GPIE_EIAME | IXGBE_GPIE_PBA_SUPPORT |
IXGBE_GPIE_OCD;
}
IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
+
return;
-}
+} /* ixgbe_config_gpie */
-/*
- * Requires adapter->max_frame_size to be set.
- */
+/************************************************************************
+ * ixgbe_config_delay_values
+ *
+ * Requires adapter->max_frame_size to be set.
+ ************************************************************************/
static void
ixgbe_config_delay_values(struct adapter *adapter)
{
struct ixgbe_hw *hw = &adapter->hw;
- u32 rxpb, frame, size, tmp;
+ u32 rxpb, frame, size, tmp;
frame = adapter->max_frame_size;
@@ -1401,11 +1394,11 @@
hw->fc.requested_mode = adapter->fc;
hw->fc.pause_time = IXGBE_FC_PAUSE;
hw->fc.send_xon = TRUE;
-}
+} /* ixgbe_config_delay_values */
/*
**
-** MSIX Interrupt Handlers and Tasklets
+** MSI-X Interrupt Handlers and Tasklets
**
*/
@@ -1449,6 +1442,9 @@
}
}
+/************************************************************************
+ * ixgbe_handle_que
+ ************************************************************************/
static void
ixgbe_handle_que(void *context, int pending)
{
@@ -1476,32 +1472,30 @@
ixgbe_enable_queue(adapter, que->msix);
else
ixgbe_enable_intr(adapter);
+
return;
-}
+} /* ixgbe_handle_que */
-/*********************************************************************
- *
- * Legacy Interrupt Service routine
- *
- **********************************************************************/
-
+/************************************************************************
+ * ixgbe_legacy_irq - Legacy Interrupt Service routine
+ ************************************************************************/
static void
ixgbe_legacy_irq(void *arg)
{
struct ix_queue *que = arg;
- struct adapter *adapter = que->adapter;
- struct ixgbe_hw *hw = &adapter->hw;
+ struct adapter *adapter = que->adapter;
+ struct ixgbe_hw *hw = &adapter->hw;
struct ifnet *ifp = adapter->ifp;
- struct tx_ring *txr = adapter->tx_rings;
- bool more;
- u32 reg_eicr;
+ struct tx_ring *txr = adapter->tx_rings;
+ bool more;
+ u32 eicr;
- reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
+ eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
++que->irqs;
- if (reg_eicr == 0) {
+ if (eicr == 0) {
ixgbe_enable_intr(adapter);
return;
}
@@ -1521,44 +1515,43 @@
/* Check for fan failure */
if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
- (reg_eicr & IXGBE_EICR_GPI_SDP1)) {
+ (eicr & IXGBE_EICR_GPI_SDP1)) {
device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
"REPLACE IMMEDIATELY!!\n");
IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
}
/* Link status change */
- if (reg_eicr & IXGBE_EICR_LSC)
+ if (eicr & IXGBE_EICR_LSC)
taskqueue_enqueue(adapter->tq, &adapter->link_task);
/* External PHY interrupt */
if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
- (reg_eicr & IXGBE_EICR_GPI_SDP0_X540))
+ (eicr & IXGBE_EICR_GPI_SDP0_X540))
taskqueue_enqueue(adapter->tq, &adapter->phy_task);
if (more)
taskqueue_enqueue(que->tq, &que->que_task);
else
ixgbe_enable_intr(adapter);
+
return;
-}
+} /* ixgbe_legacy_irq */
-/*********************************************************************
- *
- * MSIX Queue Interrupt Service routine
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_msix_que - MSI-X Queue Interrupt Service routine
+ ************************************************************************/
void
ixgbe_msix_que(void *arg)
{
- struct ix_queue *que = arg;
+ struct ix_queue *que = arg;
struct adapter *adapter = que->adapter;
struct ifnet *ifp = adapter->ifp;
- struct tx_ring *txr = que->txr;
- struct rx_ring *rxr = que->rxr;
- bool more;
- u32 newitr = 0;
+ struct tx_ring *txr = que->txr;
+ struct rx_ring *rxr = que->rxr;
+ bool more;
+ u32 newitr = 0;
/* Protect against spurious interrupts */
@@ -1586,26 +1579,25 @@
if (adapter->enable_aim == FALSE)
goto no_calc;
/*
- ** Do Adaptive Interrupt Moderation:
- ** - Write out last calculated setting
- ** - Calculate based on average size over
- ** the last interval.
- */
- if (que->eitr_setting)
- IXGBE_WRITE_REG(&adapter->hw,
- IXGBE_EITR(que->msix), que->eitr_setting);
-
- que->eitr_setting = 0;
-
- /* Idle, do nothing */
- if ((txr->bytes == 0) && (rxr->bytes == 0))
- goto no_calc;
-
+ * Do Adaptive Interrupt Moderation:
+ * - Write out last calculated setting
+ * - Calculate based on average size over
+ * the last interval.
+ */
+ if (que->eitr_setting)
+ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(que->msix),
+ que->eitr_setting);
+
+ que->eitr_setting = 0;
+
+ /* Idle, do nothing */
+ if ((txr->bytes == 0) && (rxr->bytes == 0))
+ goto no_calc;
+
if ((txr->bytes) && (txr->packets))
- newitr = txr->bytes/txr->packets;
+ newitr = txr->bytes/txr->packets;
if ((rxr->bytes) && (rxr->packets))
- newitr = max(newitr,
- (rxr->bytes / rxr->packets));
+ newitr = max(newitr, (rxr->bytes / rxr->packets));
newitr += 24; /* account for hardware frame, crc */
/* set an upper boundary */
@@ -1617,35 +1609,39 @@
else
newitr = (newitr / 2);
- if (adapter->hw.mac.type == ixgbe_mac_82598EB)
- newitr |= newitr << 16;
- else
- newitr |= IXGBE_EITR_CNT_WDIS;
-
- /* save for next interrupt */
- que->eitr_setting = newitr;
+ if (adapter->hw.mac.type == ixgbe_mac_82598EB)
+ newitr |= newitr << 16;
+ else
+ newitr |= IXGBE_EITR_CNT_WDIS;
+
+ /* save for next interrupt */
+ que->eitr_setting = newitr;
- /* Reset state */
- txr->bytes = 0;
- txr->packets = 0;
- rxr->bytes = 0;
- rxr->packets = 0;
+ /* Reset state */
+ txr->bytes = 0;
+ txr->packets = 0;
+ rxr->bytes = 0;
+ rxr->packets = 0;
no_calc:
if (more)
taskqueue_enqueue(que->tq, &que->que_task);
else
ixgbe_enable_queue(adapter, que->msix);
+
return;
-}
+} /* ixgbe_msix_que */
+/************************************************************************
+ * ixgbe_msix_link - Link status change ISR (MSI/MSI-X)
+ ************************************************************************/
static void
ixgbe_msix_link(void *arg)
{
- struct adapter *adapter = arg;
+ struct adapter *adapter = arg;
struct ixgbe_hw *hw = &adapter->hw;
- u32 reg_eicr, mod_mask;
+ u32 eicr, eicr_mask;
++adapter->link_irq;
@@ -1653,67 +1649,68 @@
IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_OTHER);
/* First get the cause */
- reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
+ eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
/* Be sure the queue bits are not cleared */
- reg_eicr &= ~IXGBE_EICR_RTX_QUEUE;
+ eicr &= ~IXGBE_EICR_RTX_QUEUE;
/* Clear interrupt with write */
- IXGBE_WRITE_REG(hw, IXGBE_EICR, reg_eicr);
+ IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
/* Link status change */
- if (reg_eicr & IXGBE_EICR_LSC) {
+ if (eicr & IXGBE_EICR_LSC) {
IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
taskqueue_enqueue(adapter->tq, &adapter->link_task);
}
if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
#ifdef IXGBE_FDIR
- if (reg_eicr & IXGBE_EICR_FLOW_DIR) {
+ if (eicr & IXGBE_EICR_FLOW_DIR) {
/* This is probably overkill :) */
if (!atomic_cmpset_int(&adapter->fdir_reinit, 0, 1))
return;
- /* Disable the interrupt */
- IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EICR_FLOW_DIR);
+ /* Disable the interrupt */
+ IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_FLOW_DIR);
taskqueue_enqueue(adapter->tq, &adapter->fdir_task);
} else
#endif
- if (reg_eicr & IXGBE_EICR_ECC) {
- device_printf(adapter->dev, "CRITICAL: ECC ERROR!! "
- "Please Reboot!!\n");
+ if (eicr & IXGBE_EICR_ECC) {
+ device_printf(adapter->dev,
+ "CRITICAL: ECC ERROR!! Please Reboot!!\n");
IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
}
/* Check for over temp condition */
- if (reg_eicr & IXGBE_EICR_TS) {
- device_printf(adapter->dev, "CRITICAL: OVER TEMP!! "
- "PHY IS SHUT DOWN!!\n");
- device_printf(adapter->dev, "System shutdown required!\n");
+ if (eicr & IXGBE_EICR_TS) {
+ device_printf(adapter->dev,
+ "CRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
+ device_printf(adapter->dev,
+ "System shutdown required!\n");
IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
}
#ifdef PCI_IOV
- if (reg_eicr & IXGBE_EICR_MAILBOX)
+ if (eicr & IXGBE_EICR_MAILBOX)
taskqueue_enqueue(adapter->tq, &adapter->mbx_task);
#endif
}
/* Pluggable optics-related interrupt */
if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
- mod_mask = IXGBE_EICR_GPI_SDP0_X540;
+ eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
else
- mod_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
+ eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
if (ixgbe_is_sfp(hw)) {
- if (reg_eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw)) {
+ if (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw)) {
IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
taskqueue_enqueue(adapter->tq, &adapter->msf_task);
- } else if (reg_eicr & mod_mask) {
- IXGBE_WRITE_REG(hw, IXGBE_EICR, mod_mask);
+ } else if (eicr & eicr_mask) {
+ IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
taskqueue_enqueue(adapter->tq, &adapter->mod_task);
}
}
/* Check for fan failure */
if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
- (reg_eicr & IXGBE_EICR_GPI_SDP1)) {
+ (eicr & IXGBE_EICR_GPI_SDP1)) {
IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1);
device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
"REPLACE IMMEDIATELY!!\n");
@@ -1721,30 +1718,29 @@
/* External PHY interrupt */
if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
- (reg_eicr & IXGBE_EICR_GPI_SDP0_X540)) {
+ (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540);
taskqueue_enqueue(adapter->tq, &adapter->phy_task);
}
/* Re-enable other interrupts */
- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
+ IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
+
return;
-}
+} /* ixgbe_msix_link */
-/*********************************************************************
- *
- * Media Ioctl callback
+/************************************************************************
+ * ixgbe_media_status - Media Ioctl callback
*
- * This routine is called whenever the user queries the status of
- * the interface using ifconfig.
- *
- **********************************************************************/
+ * Called whenever the user queries the status of
+ * the interface using ifconfig.
+ ************************************************************************/
static void
-ixgbe_media_status(struct ifnet * ifp, struct ifmediareq * ifmr)
+ixgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
{
- struct adapter *adapter = ifp->if_softc;
+ struct adapter *adapter = ifp->if_softc;
struct ixgbe_hw *hw = &adapter->hw;
- int layer;
+ int layer;
INIT_DEBUGOUT("ixgbe_media_status: begin");
IXGBE_CORE_LOCK(adapter);
@@ -1817,9 +1813,9 @@
break;
}
/*
- ** XXX: These need to use the proper media types once
- ** they're added.
- */
+ * XXX: These need to use the proper media types once
+ * they're added.
+ */
#ifndef IFM_ETH_XTYPE
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
switch (adapter->link_speed) {
@@ -1833,8 +1829,8 @@
ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
break;
}
- else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4
- || layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
+ else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
+ layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
switch (adapter->link_speed) {
case IXGBE_LINK_SPEED_10GB_FULL:
ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
@@ -1859,8 +1855,8 @@
ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
break;
}
- else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4
- || layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
+ else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
+ layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
switch (adapter->link_speed) {
case IXGBE_LINK_SPEED_10GB_FULL:
ifmr->ifm_active |= IFM_10G_KX4 | IFM_FDX;
@@ -1873,11 +1869,11 @@
break;
}
#endif
-
+
/* If nothing is recognized... */
if (IFM_SUBTYPE(ifmr->ifm_active) == 0)
ifmr->ifm_active |= IFM_UNKNOWN;
-
+
#if __FreeBSD_version >= 900025
/* Display current flow control setting used on link */
if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
@@ -1891,22 +1887,20 @@
IXGBE_CORE_UNLOCK(adapter);
return;
-}
+} /* ixgbe_media_status */
-/*********************************************************************
- *
- * Media Ioctl callback
- *
- * This routine is called when the user changes speed/duplex using
- * media/mediopt option with ifconfig.
+/************************************************************************
+ * ixgbe_media_change - Media Ioctl callback
*
- **********************************************************************/
+ * Called when the user changes speed/duplex using
+ * media/mediopt option with ifconfig.
+ ************************************************************************/
static int
-ixgbe_media_change(struct ifnet * ifp)
+ixgbe_media_change(struct ifnet *ifp)
{
- struct adapter *adapter = ifp->if_softc;
- struct ifmedia *ifm = &adapter->media;
- struct ixgbe_hw *hw = &adapter->hw;
+ struct adapter *adapter = ifp->if_softc;
+ struct ifmedia *ifm = &adapter->media;
+ struct ixgbe_hw *hw = &adapter->hw;
ixgbe_link_speed speed = 0;
INIT_DEBUGOUT("ixgbe_media_change: begin");
@@ -1918,10 +1912,10 @@
return (ENODEV);
/*
- ** We don't actually need to check against the supported
- ** media types of the adapter; ifmedia will take care of
- ** that for us.
- */
+ * We don't actually need to check against the supported
+ * media types of the adapter; ifmedia will take care of
+ * that for us.
+ */
#ifndef IFM_ETH_XTYPE
switch (IFM_SUBTYPE(ifm->ifm_media)) {
case IFM_AUTO:
@@ -1981,11 +1975,11 @@
if (IFM_SUBTYPE(ifm->ifm_media) == IFM_AUTO) {
adapter->advertise = 0;
} else {
- if ((speed & IXGBE_LINK_SPEED_10GB_FULL) != 0)
+ if (speed & IXGBE_LINK_SPEED_10GB_FULL)
adapter->advertise |= 1 << 2;
- if ((speed & IXGBE_LINK_SPEED_1GB_FULL) != 0)
+ if (speed & IXGBE_LINK_SPEED_1GB_FULL)
adapter->advertise |= 1 << 1;
- if ((speed & IXGBE_LINK_SPEED_100_FULL) != 0)
+ if (speed & IXGBE_LINK_SPEED_100_FULL)
adapter->advertise |= 1 << 0;
}
@@ -1993,22 +1987,26 @@
invalid:
device_printf(adapter->dev, "Invalid media type!\n");
+
return (EINVAL);
-}
+} /* ixgbe_media_change */
+/************************************************************************
+ * ixgbe_set_promisc
+ ************************************************************************/
static void
ixgbe_set_promisc(struct adapter *adapter)
{
- u_int32_t reg_rctl;
- struct ifnet *ifp = adapter->ifp;
- int mcnt = 0;
+ struct ifnet *ifp = adapter->ifp;
+ int mcnt = 0;
+ u32 rctl;
- reg_rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
- reg_rctl &= (~IXGBE_FCTRL_UPE);
+ rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
+ rctl &= (~IXGBE_FCTRL_UPE);
if (ifp->if_flags & IFF_ALLMULTI)
mcnt = MAX_NUM_MULTICAST_ADDRESSES;
else {
- struct ifmultiaddr *ifma;
+ struct ifmultiaddr *ifma;
#if __FreeBSD_version < 800000
IF_ADDR_LOCK(ifp);
#else
@@ -2028,38 +2026,38 @@
#endif
}
if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
- reg_rctl &= (~IXGBE_FCTRL_MPE);
- IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
+ rctl &= (~IXGBE_FCTRL_MPE);
+ IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
if (ifp->if_flags & IFF_PROMISC) {
- reg_rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
- IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
+ rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
+ IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
} else if (ifp->if_flags & IFF_ALLMULTI) {
- reg_rctl |= IXGBE_FCTRL_MPE;
- reg_rctl &= ~IXGBE_FCTRL_UPE;
- IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
+ rctl |= IXGBE_FCTRL_MPE;
+ rctl &= ~IXGBE_FCTRL_UPE;
+ IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, rctl);
}
+
return;
-}
+} /* ixgbe_set_promisc */
-/*********************************************************************
- * Multicast Update
+/************************************************************************
+ * ixgbe_set_multi - Multicast Update
*
- * This routine is called whenever multicast address list is updated.
- *
- **********************************************************************/
+ * Called whenever multicast address list is updated.
+ ************************************************************************/
#define IXGBE_RAR_ENTRIES 16
static void
ixgbe_set_multi(struct adapter *adapter)
{
- u32 fctrl;
- u8 *update_ptr;
- struct ifmultiaddr *ifma;
- struct ixgbe_mc_addr *mta;
- int mcnt = 0;
- struct ifnet *ifp = adapter->ifp;
+ struct ifmultiaddr *ifma;
+ struct ixgbe_mc_addr *mta;
+ struct ifnet *ifp = adapter->ifp;
+ u8 *update_ptr;
+ int mcnt = 0;
+ u32 fctrl;
IOCTL_DEBUGOUT("ixgbe_set_multi: begin");
@@ -2097,23 +2095,25 @@
fctrl &= ~IXGBE_FCTRL_UPE;
} else
fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
-
+
IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
if (mcnt < MAX_NUM_MULTICAST_ADDRESSES) {
update_ptr = (u8 *)mta;
- ixgbe_update_mc_addr_list(&adapter->hw,
- update_ptr, mcnt, ixgbe_mc_array_itr, TRUE);
+ ixgbe_update_mc_addr_list(&adapter->hw, update_ptr, mcnt,
+ ixgbe_mc_array_itr, TRUE);
}
return;
-}
+} /* ixgbe_set_multi */
-/*
- * This is an iterator function now needed by the multicast
- * shared code. It simply feeds the shared code routine the
- * addresses in the array of ixgbe_set_multi() one by one.
- */
+/************************************************************************
+ * ixgbe_mc_array_itr
+ *
+ * An iterator function needed by the multicast shared code.
+ * It feeds the shared code routine the addresses in the
+ * array of ixgbe_set_multi() one by one.
+ ************************************************************************/
static u8 *
ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
{
@@ -2123,26 +2123,25 @@
*vmdq = mta->vmdq;
*update_ptr = (u8*)(mta + 1);
+
return (mta->addr);
-}
+} /* ixgbe_mc_array_itr */
-/*********************************************************************
- * Timer routine
+/************************************************************************
+ * ixgbe_local_timer - Timer routine
*
- * This routine checks for link status,updates statistics,
- * and runs the watchdog check.
- *
- **********************************************************************/
-
+ * Checks for link status, updates statistics,
+ * and runs the watchdog check.
+ ************************************************************************/
static void
ixgbe_local_timer(void *arg)
{
- struct adapter *adapter = arg;
- device_t dev = adapter->dev;
+ struct adapter *adapter = arg;
+ device_t dev = adapter->dev;
struct ix_queue *que = adapter->queues;
- u64 queues = 0;
- int hung = 0;
+ u64 queues = 0;
+ int hung = 0;
mtx_assert(&adapter->core_mtx, MA_OWNED);
@@ -2155,19 +2154,19 @@
ixgbe_update_stats_counters(adapter);
/*
- ** Check the TX queues status
- ** - mark hung queues so we don't schedule on them
- ** - watchdog only if all queues show hung
- */
+ * Check the TX queues status
+ * - mark hung queues so we don't schedule on them
+ * - watchdog only if all queues show hung
+ */
for (int i = 0; i < adapter->num_queues; i++, que++) {
/* Keep track of queues with work for soft irq */
if (que->txr->busy)
queues |= ((u64)1 << que->me);
/*
- ** Each time txeof runs without cleaning, but there
- ** are uncleaned descriptors it increments busy. If
- ** we get to the MAX we declare it hung.
- */
+ * Each time txeof runs without cleaning, but there
+ * are uncleaned descriptors it increments busy. If
+ * we get to the MAX we declare it hung.
+ */
if (que->busy == IXGBE_QUEUE_HUNG) {
++hung;
/* Mark the queue as inactive */
@@ -2176,15 +2175,14 @@
} else {
/* Check if we've come back from hung */
if ((adapter->active_queues & ((u64)1 << que->me)) == 0)
- adapter->active_queues |= ((u64)1 << que->me);
+ adapter->active_queues |= ((u64)1 << que->me);
}
if (que->busy >= IXGBE_MAX_TX_BUSY) {
- device_printf(dev,"Warning queue %d "
- "appears to be hung!\n", i);
+ device_printf(dev,
+ "Warning queue %d appears to be hung!\n", i);
que->txr->busy = IXGBE_QUEUE_HUNG;
++hung;
}
-
}
/* Only truly watchdog if all queues show hung */
@@ -2203,25 +2201,27 @@
adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
adapter->watchdog_events++;
ixgbe_init_locked(adapter);
-}
+} /* ixgbe_local_timer */
-/*
-** Note: this routine updates the OS on the link state
-** the real check of the hardware only happens with
-** a link interrupt.
-*/
+/************************************************************************
+ * ixgbe_update_link_status - Update OS on link state
+ *
+ * Note: Only updates the OS on the cached link state.
+ * The real check of the hardware only happens with
+ * a link interrupt.
+ ************************************************************************/
static void
ixgbe_update_link_status(struct adapter *adapter)
{
- struct ifnet *ifp = adapter->ifp;
- device_t dev = adapter->dev;
+ struct ifnet *ifp = adapter->ifp;
+ device_t dev = adapter->dev;
- if (adapter->link_up){
+ if (adapter->link_up) {
if (adapter->link_active == FALSE) {
if (bootverbose)
- device_printf(dev,"Link is up %d Gbps %s \n",
- ((adapter->link_speed == 128)? 10:1),
+ device_printf(dev, "Link is up %d Gbps %s \n",
+ ((adapter->link_speed == 128) ? 10 : 1),
"Full Duplex");
adapter->link_active = TRUE;
/* Update any Flow Control changes */
@@ -2236,7 +2236,7 @@
} else { /* Link down */
if (adapter->link_active == TRUE) {
if (bootverbose)
- device_printf(dev,"Link is Down\n");
+ device_printf(dev, "Link is Down\n");
if_link_state_change(ifp, LINK_STATE_DOWN);
adapter->link_active = FALSE;
#ifdef PCI_IOV
@@ -2246,22 +2246,22 @@
}
return;
-}
+} /* ixgbe_update_link_status */
-/*********************************************************************
- *
- * This routine disables all traffic on the adapter by issuing a
- * global reset on the MAC and deallocates TX/RX buffers.
+/************************************************************************
+ * ixgbe_stop - Stop the hardware
*
- **********************************************************************/
-
+ * Disables all traffic on the adapter by issuing a
+ * global reset on the MAC and deallocates TX/RX buffers.
+ ************************************************************************/
static void
ixgbe_stop(void *arg)
{
- struct ifnet *ifp;
- struct adapter *adapter = arg;
+ struct ifnet *ifp;
+ struct adapter *adapter = arg;
struct ixgbe_hw *hw = &adapter->hw;
+
ifp = adapter->ifp;
mtx_assert(&adapter->core_mtx, MA_OWNED);
@@ -2283,20 +2283,20 @@
/* Update the stack */
adapter->link_up = FALSE;
- ixgbe_update_link_status(adapter);
+ ixgbe_update_link_status(adapter);
/* reprogram the RAR[0] in case user changed it. */
ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
return;
-}
+} /* ixgbe_stop */
-/*********************************************************************
+/************************************************************************
*
* Determine hardware revision.
*
- **********************************************************************/
+ ************************************************************************/
static void
ixgbe_identify_hardware(struct adapter *adapter)
{
@@ -2330,11 +2330,11 @@
return;
}
-/*********************************************************************
+/************************************************************************
*
* Determine optic type
*
- **********************************************************************/
+ ************************************************************************/
static void
ixgbe_setup_optics(struct adapter *adapter)
{
@@ -2385,18 +2385,16 @@
return;
}
-/*********************************************************************
- *
- * Setup the Legacy or MSI Interrupt handler
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_allocate_legacy - Setup the Legacy or MSI Interrupt handler
+ ************************************************************************/
static int
ixgbe_allocate_legacy(struct adapter *adapter)
{
- device_t dev = adapter->dev;
- struct ix_queue *que = adapter->queues;
+ device_t dev = adapter->dev;
+ struct ix_queue *que = adapter->queues;
#ifndef IXGBE_LEGACY_TX
- struct tx_ring *txr = adapter->tx_rings;
+ struct tx_ring *txr = adapter->tx_rings;
#endif
int error, rid = 0;
@@ -2408,8 +2406,8 @@
adapter->res = bus_alloc_resource_any(dev,
SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE);
if (adapter->res == NULL) {
- device_printf(dev, "Unable to allocate bus resource: "
- "interrupt\n");
+ device_printf(dev,
+ "Unable to allocate bus resource: interrupt\n");
return (ENXIO);
}
@@ -2422,9 +2420,9 @@
#endif
TASK_INIT(&que->que_task, 0, ixgbe_handle_que, que);
que->tq = taskqueue_create_fast("ixgbe_que", M_NOWAIT,
- taskqueue_thread_enqueue, &que->tq);
+ taskqueue_thread_enqueue, &que->tq);
taskqueue_start_threads(&que->tq, 1, PI_NET, "%s ixq",
- device_get_nameunit(adapter->dev));
+ device_get_nameunit(adapter->dev));
/* Tasklets for Link, SFP and Multispeed Fiber */
TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter);
@@ -2440,38 +2438,37 @@
device_get_nameunit(adapter->dev));
if ((error = bus_setup_intr(dev, adapter->res,
- INTR_TYPE_NET | INTR_MPSAFE, NULL, ixgbe_legacy_irq,
- que, &adapter->tag)) != 0) {
- device_printf(dev, "Failed to register fast interrupt "
- "handler: %d\n", error);
+ INTR_TYPE_NET | INTR_MPSAFE, NULL, ixgbe_legacy_irq, que,
+ &adapter->tag)) != 0) {
+ device_printf(dev,
+ "Failed to register fast interrupt handler: %d\n", error);
taskqueue_free(que->tq);
taskqueue_free(adapter->tq);
que->tq = NULL;
adapter->tq = NULL;
+
return (error);
}
/* For simplicity in the handlers */
adapter->active_queues = IXGBE_EIMS_ENABLE_MASK;
return (0);
-}
+} /* ixgbe_allocate_legacy */
-/*********************************************************************
- *
- * Setup MSIX Interrupt resources and handlers
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_allocate_msix - Setup MSI-X Interrupt resources and handlers
+ ************************************************************************/
static int
ixgbe_allocate_msix(struct adapter *adapter)
{
device_t dev = adapter->dev;
- struct ix_queue *que = adapter->queues;
- struct tx_ring *txr = adapter->tx_rings;
- int error, rid, vector = 0;
- int cpu_id = 0;
+ struct ix_queue *que = adapter->queues;
+ struct tx_ring *txr = adapter->tx_rings;
+ int error, rid, vector = 0;
+ int cpu_id = 0;
#ifdef RSS
- cpuset_t cpu_mask;
+ cpuset_t cpu_mask;
#endif
#ifdef RSS
@@ -2501,14 +2498,14 @@
que->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
RF_SHAREABLE | RF_ACTIVE);
if (que->res == NULL) {
- device_printf(dev,"Unable to allocate"
- " bus resource: que interrupt [%d]\n", vector);
+ device_printf(dev, "Unable to allocate bus resource: que interrupt [%d]\n",
+ vector);
return (ENXIO);
}
/* Set the handler function */
error = bus_setup_intr(dev, que->res,
- INTR_TYPE_NET | INTR_MPSAFE, NULL,
- ixgbe_msix_que, que, &que->tag);
+ INTR_TYPE_NET | INTR_MPSAFE, NULL, ixgbe_msix_que, que,
+ &que->tag);
if (error) {
que->res = NULL;
device_printf(dev, "Failed to register QUE handler");
@@ -2541,13 +2538,11 @@
bus_bind_intr(dev, que->res, cpu_id);
#ifdef IXGBE_DEBUG
#ifdef RSS
- device_printf(dev,
- "Bound RSS bucket %d to CPU %d\n",
- i, cpu_id);
+ device_printf(dev, "Bound RSS bucket %d to CPU %d\n", i,
+ cpu_id);
#else
- device_printf(dev,
- "Bound queue %d to cpu %d\n",
- i, cpu_id);
+ device_printf(dev, "Bound queue %d to cpu %d\n", i,
+ cpu_id);
#endif
#endif /* IXGBE_DEBUG */
@@ -2573,17 +2568,17 @@
/* and Link */
rid = vector + 1;
- adapter->res = bus_alloc_resource_any(dev,
- SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE);
+ adapter->res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
+ &rid, RF_SHAREABLE | RF_ACTIVE);
if (!adapter->res) {
- device_printf(dev,"Unable to allocate"
- " bus resource: Link interrupt [%d]\n", rid);
+ device_printf(dev,
+ "Unable to allocate bus resource: Link interrupt [%d]\n",
+ rid);
return (ENXIO);
}
/* Set the link handler function */
- error = bus_setup_intr(dev, adapter->res,
- INTR_TYPE_NET | INTR_MPSAFE, NULL,
- ixgbe_msix_link, adapter, &adapter->tag);
+ error = bus_setup_intr(dev, adapter->res, INTR_TYPE_NET | INTR_MPSAFE,
+ NULL, ixgbe_msix_link, adapter, &adapter->tag);
if (error) {
adapter->res = NULL;
device_printf(dev, "Failed to register LINK handler");
@@ -2610,37 +2605,33 @@
device_get_nameunit(adapter->dev));
return (0);
-}
+} /* ixgbe_allocate_msix */
-/*
- * Setup Either MSI/X or MSI
- */
static int
ixgbe_setup_msix(struct adapter *adapter)
{
device_t dev = adapter->dev;
- int rid, want, queues, msgs;
+ int rid, want, queues, msgs;
/* Override by tuneable */
if (ixgbe_enable_msix == 0)
goto msi;
- /* First try MSI/X */
- msgs = pci_msix_count(dev);
+ /* First try MSI-X */
+ msgs = pci_msix_count(dev);
if (msgs == 0)
goto msi;
rid = PCIR_BAR(MSIX_82598_BAR);
- adapter->msix_mem = bus_alloc_resource_any(dev,
- SYS_RES_MEMORY, &rid, RF_ACTIVE);
- if (adapter->msix_mem == NULL) {
- rid += 4; /* 82599 maps in higher BAR */
- adapter->msix_mem = bus_alloc_resource_any(dev,
- SYS_RES_MEMORY, &rid, RF_ACTIVE);
- }
- if (adapter->msix_mem == NULL) {
+ adapter->msix_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
+ RF_ACTIVE);
+ if (adapter->msix_mem == NULL) {
+ rid += 4; /* 82599 maps in higher BAR */
+ adapter->msix_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
+ &rid, RF_ACTIVE);
+ }
+ if (adapter->msix_mem == NULL) {
/* May not be enabled */
- device_printf(adapter->dev,
- "Unable to map MSIX table \n");
+ device_printf(adapter->dev, "Unable to map MSI-X table.\n");
goto msi;
}
@@ -2663,33 +2654,32 @@
ixgbe_num_queues = queues;
/*
- ** Want one vector (RX/TX pair) per queue
- ** plus an additional for Link.
- */
+ * Want one vector (RX/TX pair) per queue
+ * plus an additional for Link.
+ */
want = queues + 1;
if (msgs >= want)
msgs = want;
else {
- device_printf(adapter->dev,
- "MSIX Configuration Problem, "
- "%d vectors but %d queues wanted!\n",
+ device_printf(adapter->dev, "MSI-X Configuration Problem, %d vectors but %d queues wanted!\n",
msgs, want);
goto msi;
}
if ((pci_alloc_msix(dev, &msgs) == 0) && (msgs == want)) {
- device_printf(adapter->dev,
- "Using MSIX interrupts with %d vectors\n", msgs);
+ device_printf(adapter->dev,
+ "Using MSI-X interrupts with %d vectors\n", msgs);
adapter->num_queues = queues;
return (msgs);
}
/*
- ** If MSIX alloc failed or provided us with
- ** less than needed, free and fall through to MSI
- */
+ * MSI-X allocation failed or provided us with
+ * less vectors than needed. Free MSI-X resources
+ * and we'll try enabling MSI.
+ */
pci_release_msi(dev);
msi:
- if (adapter->msix_mem != NULL) {
+ if (adapter->msix_mem != NULL) {
bus_release_resource(dev, SYS_RES_MEMORY,
rid, adapter->msix_mem);
adapter->msix_mem = NULL;
@@ -2704,15 +2694,18 @@
}
+/************************************************************************
+ * ixgbe_allocate_pci_resources
+ ************************************************************************/
static int
ixgbe_allocate_pci_resources(struct adapter *adapter)
{
- int rid;
- device_t dev = adapter->dev;
+ device_t dev = adapter->dev;
+ int rid;
rid = PCIR_BAR(0);
- adapter->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
- &rid, RF_ACTIVE);
+ adapter->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
+ RF_ACTIVE);
if (!(adapter->pci_mem)) {
device_printf(dev, "Unable to allocate bus resource: memory\n");
@@ -2720,12 +2713,11 @@
}
/* Save bus_space values for READ/WRITE_REG macros */
- adapter->osdep.mem_bus_space_tag =
- rman_get_bustag(adapter->pci_mem);
+ adapter->osdep.mem_bus_space_tag = rman_get_bustag(adapter->pci_mem);
adapter->osdep.mem_bus_space_handle =
- rman_get_bushandle(adapter->pci_mem);
+ rman_get_bushandle(adapter->pci_mem);
/* Set hw values for shared code */
- adapter->hw.hw_addr = (u8 *) &adapter->osdep.mem_bus_space_handle;
+ adapter->hw.hw_addr = (u8 *)&adapter->osdep.mem_bus_space_handle;
adapter->hw.back = adapter;
/* Default to 1 queue if MSI-X setup fails */
@@ -2738,14 +2730,17 @@
*/
adapter->msix = ixgbe_setup_msix(adapter);
return (0);
-}
+} /* ixgbe_allocate_pci_resources */
+/************************************************************************
+ * ixgbe_free_pci_resources
+ ************************************************************************/
static void
-ixgbe_free_pci_resources(struct adapter * adapter)
+ixgbe_free_pci_resources(struct adapter *adapter)
{
- struct ix_queue *que = adapter->queues;
- device_t dev = adapter->dev;
- int rid, memrid;
+ struct ix_queue *que = adapter->queues;
+ device_t dev = adapter->dev;
+ int rid, memrid;
if (adapter->hw.mac.type == ixgbe_mac_82598EB)
memrid = PCIR_BAR(MSIX_82598_BAR);
@@ -2753,19 +2748,19 @@
memrid = PCIR_BAR(MSIX_82599_BAR);
/*
- ** There is a slight possibility of a failure mode
- ** in attach that will result in entering this function
- ** before interrupt resources have been initialized, and
- ** in that case we do not want to execute the loops below
- ** We can detect this reliably by the state of the adapter
- ** res pointer.
- */
+ * There is a slight possibility of a failure mode
+ * in attach that will result in entering this function
+ * before interrupt resources have been initialized, and
+ * in that case we do not want to execute the loops below
+ * We can detect this reliably by the state of the adapter
+ * res pointer.
+ */
if (adapter->res == NULL)
goto mem;
/*
- ** Release all msix queue resources:
- */
+ * Release all msix queue resources:
+ */
for (int i = 0; i < adapter->num_queues; i++, que++) {
rid = que->msix + 1;
if (que->tag != NULL) {
@@ -2778,7 +2773,7 @@
/* Clean the Legacy or Link interrupt last */
- if (adapter->vector) /* we are doing MSIX */
+ if (adapter->vector) /* we are doing MSI-X */
rid = adapter->vector + 1;
else
(adapter->msix != 0) ? (rid = 1):(rid = 0);
@@ -2795,25 +2790,25 @@
pci_release_msi(dev);
if (adapter->msix_mem != NULL)
- bus_release_resource(dev, SYS_RES_MEMORY,
- memrid, adapter->msix_mem);
+ bus_release_resource(dev, SYS_RES_MEMORY, memrid,
+ adapter->msix_mem);
if (adapter->pci_mem != NULL)
- bus_release_resource(dev, SYS_RES_MEMORY,
- PCIR_BAR(0), adapter->pci_mem);
+ bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BAR(0),
+ adapter->pci_mem);
return;
-}
+} /* ixgbe_free_pci_resources */
-/*********************************************************************
- *
- * Setup networking device structure and register an interface.
+/************************************************************************
+ * ixgbe_setup_interface
*
- **********************************************************************/
+ * Setup networking device structure and register an interface.
+ ************************************************************************/
static int
ixgbe_setup_interface(device_t dev, struct adapter *adapter)
{
- struct ifnet *ifp;
+ struct ifnet *ifp;
INIT_DEBUGOUT("ixgbe_setup_interface: begin");
@@ -2849,8 +2844,7 @@
ether_ifattach(ifp, adapter->hw.mac.addr);
- adapter->max_frame_size =
- ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+ adapter->max_frame_size = ifp->if_mtu + IXGBE_MTU_HDR;
/*
* Tell the upper layer(s) we support long frames.
@@ -2859,30 +2853,30 @@
/* Set capability flags */
ifp->if_capabilities |= IFCAP_RXCSUM
- | IFCAP_TXCSUM
- | IFCAP_RXCSUM_IPV6
- | IFCAP_TXCSUM_IPV6
- | IFCAP_TSO4
- | IFCAP_TSO6
- | IFCAP_LRO
- | IFCAP_VLAN_HWTAGGING
- | IFCAP_VLAN_HWTSO
- | IFCAP_VLAN_HWCSUM
- | IFCAP_JUMBO_MTU
- | IFCAP_VLAN_MTU
- | IFCAP_HWSTATS;
+ | IFCAP_TXCSUM
+ | IFCAP_RXCSUM_IPV6
+ | IFCAP_TXCSUM_IPV6
+ | IFCAP_TSO4
+ | IFCAP_TSO6
+ | IFCAP_LRO
+ | IFCAP_VLAN_HWTAGGING
+ | IFCAP_VLAN_HWTSO
+ | IFCAP_VLAN_HWCSUM
+ | IFCAP_JUMBO_MTU
+ | IFCAP_VLAN_MTU
+ | IFCAP_HWSTATS;
/* Enable the above capabilities by default */
ifp->if_capenable = ifp->if_capabilities;
/*
- ** Don't turn this on by default, if vlans are
- ** created on another pseudo device (eg. lagg)
- ** then vlan events are not passed thru, breaking
- ** operation, but with HW FILTER off it works. If
- ** using vlans directly on the ixgbe driver you can
- ** enable this and get full hardware tag filtering.
- */
+ * Don't turn this on by default, if vlans are
+ * created on another pseudo device (eg. lagg)
+ * then vlan events are not passed thru, breaking
+ * operation, but with HW FILTER off it works. If
+ * using vlans directly on the ixgbe driver you can
+ * enable this and get full hardware tag filtering.
+ */
ifp->if_capabilities |= IFCAP_VLAN_HWFILTER;
/*
@@ -2890,7 +2884,7 @@
* callbacks to update media and link information
*/
ifmedia_init(&adapter->media, IFM_IMASK, ixgbe_media_change,
- ixgbe_media_status);
+ ixgbe_media_status);
adapter->phy_layer = ixgbe_get_supported_physical_layer(&adapter->hw);
ixgbe_add_media_types(adapter);
@@ -2899,14 +2893,17 @@
ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
return (0);
-}
+} /* ixgbe_setup_interface */
+/************************************************************************
+ * ixgbe_add_media_types
+ ************************************************************************/
static void
ixgbe_add_media_types(struct adapter *adapter)
{
struct ixgbe_hw *hw = &adapter->hw;
- device_t dev = adapter->dev;
- int layer;
+ device_t dev = adapter->dev;
+ int layer;
layer = adapter->phy_layer;
@@ -2917,20 +2914,23 @@
ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_T, 0, NULL);
if (layer & IXGBE_PHYSICAL_LAYER_100BASE_TX)
ifmedia_add(&adapter->media, IFM_ETHER | IFM_100_TX, 0, NULL);
-
+
if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
- ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_TWINAX, 0, NULL);
+ ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_TWINAX, 0,
+ NULL);
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR) {
ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_LR, 0, NULL);
if (hw->phy.multispeed_fiber)
- ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_LX, 0, NULL);
+ ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_LX, 0,
+ NULL);
}
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR) {
ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
if (hw->phy.multispeed_fiber)
- ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX, 0, NULL);
+ ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX, 0,
+ NULL);
} else if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX, 0, NULL);
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
@@ -2962,27 +2962,29 @@
#endif
if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_BX)
device_printf(dev, "Media supported: 1000baseBX\n");
-
+
if (hw->device_id == IXGBE_DEV_ID_82598AT) {
- ifmedia_add(&adapter->media,
- IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
- ifmedia_add(&adapter->media,
- IFM_ETHER | IFM_1000_T, 0, NULL);
+ ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
+ 0, NULL);
+ ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_T, 0, NULL);
}
ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
-}
+} /* ixgbe_add_media_types */
+/************************************************************************
+ * ixgbe_config_link
+ ************************************************************************/
static void
ixgbe_config_link(struct adapter *adapter)
{
struct ixgbe_hw *hw = &adapter->hw;
- u32 autoneg, err = 0;
- bool sfp, negotiate;
+ u32 autoneg, err = 0;
+ bool sfp, negotiate;
sfp = ixgbe_is_sfp(hw);
- if (sfp) {
+ if (sfp) {
taskqueue_enqueue(adapter->tq, &adapter->mod_task);
} else {
if (hw->mac.ops.check_link)
@@ -2992,38 +2994,37 @@
goto out;
autoneg = hw->phy.autoneg_advertised;
if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
- err = hw->mac.ops.get_link_capabilities(hw,
- &autoneg, &negotiate);
+ err = hw->mac.ops.get_link_capabilities(hw, &autoneg,
+ &negotiate);
if (err)
goto out;
if (hw->mac.ops.setup_link)
- err = hw->mac.ops.setup_link(hw,
- autoneg, adapter->link_up);
+ err = hw->mac.ops.setup_link(hw, autoneg,
+ adapter->link_up);
}
out:
+
return;
-}
+} /* ixgbe_config_link */
-/*********************************************************************
- *
- * Enable transmit units.
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_initialize_transmit_units - Enable transmit units.
+ ************************************************************************/
static void
ixgbe_initialize_transmit_units(struct adapter *adapter)
{
- struct tx_ring *txr = adapter->tx_rings;
- struct ixgbe_hw *hw = &adapter->hw;
+ struct tx_ring *txr = adapter->tx_rings;
+ struct ixgbe_hw *hw = &adapter->hw;
/* Setup the Base and Length of the Tx Descriptor Ring */
for (int i = 0; i < adapter->num_queues; i++, txr++) {
- u64 tdba = txr->txdma.dma_paddr;
- u32 txctrl = 0;
- int j = txr->me;
+ u64 tdba = txr->txdma.dma_paddr;
+ u32 txctrl = 0;
+ int j = txr->me;
IXGBE_WRITE_REG(hw, IXGBE_TDBAL(j),
- (tdba & 0x00000000ffffffffULL));
+ (tdba & 0x00000000ffffffffULL));
IXGBE_WRITE_REG(hw, IXGBE_TDBAH(j), (tdba >> 32));
IXGBE_WRITE_REG(hw, IXGBE_TDLEN(j),
adapter->num_tx_desc * sizeof(union ixgbe_adv_tx_desc));
@@ -3048,7 +3049,7 @@
default:
txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(j));
break;
- }
+ }
txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
switch (hw->mac.type) {
case ixgbe_mac_82598EB:
@@ -3066,6 +3067,7 @@
#ifdef PCI_IOV
enum ixgbe_iov_mode mode = ixgbe_get_iov_mode(adapter);
#endif
+
dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
dmatxctl |= IXGBE_DMATXCTL_TE;
IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
@@ -3083,16 +3085,20 @@
}
return;
-}
+} /* ixgbe_initialize_transmit_units */
+/************************************************************************
+ * ixgbe_initialize_rss_mapping
+ ************************************************************************/
static void
ixgbe_initialize_rss_mapping(struct adapter *adapter)
{
- struct ixgbe_hw *hw = &adapter->hw;
- u32 reta = 0, mrqc, rss_key[10];
- int queue_id, table_size, index_mult;
+ struct ixgbe_hw *hw = &adapter->hw;
+ u32 reta = 0, mrqc, rss_key[10];
+ int queue_id, table_size, index_mult;
+ int i, j;
#ifdef RSS
- u32 rss_hash_config;
+ u32 rss_hash_config;
#endif
#ifdef PCI_IOV
enum ixgbe_iov_mode mode;
@@ -3100,7 +3106,7 @@
#ifdef RSS
/* Fetch the configured RSS key */
- rss_getkey((uint8_t *) &rss_key);
+ rss_getkey((uint8_t *)&rss_key);
#else
/* set up random bits */
arc4rand(&rss_key, sizeof(rss_key), 0);
@@ -3122,7 +3128,7 @@
}
/* Set up the redirection table */
- for (int i = 0, j = 0; i < table_size; i++, j++) {
+ for (i = 0, j = 0; i < table_size; i++, j++) {
if (j == adapter->num_queues) j = 0;
#ifdef RSS
/*
@@ -3140,18 +3146,19 @@
* The next 8 bits are for hash value (n+1), etc.
*/
reta = reta >> 8;
- reta = reta | ( ((uint32_t) queue_id) << 24);
+ reta = reta | (((uint32_t)queue_id) << 24);
if ((i & 3) == 3) {
if (i < 128)
IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
else
- IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32), reta);
+ IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32),
+ reta);
reta = 0;
}
}
/* Now fill our hash function seeds */
- for (int i = 0; i < 10; i++)
+ for (i = 0; i < 10; i++)
IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), rss_key[i]);
/* Perform hash on these packet types */
@@ -3173,9 +3180,8 @@
if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4_EX)
- device_printf(adapter->dev,
- "%s: RSS_HASHTYPE_RSS_UDP_IPV4_EX defined, "
- "but not supported\n", __func__);
+ device_printf(adapter->dev, "%s: RSS_HASHTYPE_RSS_UDP_IPV4_EX defined, but not supported\n",
+ __func__);
if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
@@ -3200,26 +3206,25 @@
mrqc |= ixgbe_get_mrqc(mode);
#endif
IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
-}
+} /* ixgbe_initialize_rss_mapping */
-/*********************************************************************
- *
- * Setup receive registers and features.
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_initialize_receive_units - Setup receive registers and features.
+ ************************************************************************/
#define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
#define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
-
+
static void
ixgbe_initialize_receive_units(struct adapter *adapter)
{
- struct rx_ring *rxr = adapter->rx_rings;
- struct ixgbe_hw *hw = &adapter->hw;
- struct ifnet *ifp = adapter->ifp;
- u32 bufsz, fctrl, srrctl, rxcsum;
- u32 hlreg;
+ struct rx_ring *rxr = adapter->rx_rings;
+ struct ixgbe_hw *hw = &adapter->hw;
+ struct ifnet *ifp = adapter->ifp;
+ int i, j;
+ u32 bufsz, fctrl, srrctl, rxcsum;
+ u32 hlreg;
/*
* Make sure receives are disabled while
@@ -3242,6 +3247,7 @@
hlreg |= IXGBE_HLREG0_JUMBOEN;
else
hlreg &= ~IXGBE_HLREG0_JUMBOEN;
+
#ifdef DEV_NETMAP
/* crcstrip is conditional in netmap (in RDRXCTL too ?) */
if (ifp->if_capenable & IFCAP_NETMAP && !ix_crcstrip)
@@ -3251,16 +3257,16 @@
#endif /* DEV_NETMAP */
IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
- bufsz = (adapter->rx_mbuf_sz +
- BSIZEPKT_ROUNDUP) >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
+ bufsz = (adapter->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >>
+ IXGBE_SRRCTL_BSIZEPKT_SHIFT;
- for (int i = 0; i < adapter->num_queues; i++, rxr++) {
+ for (i = 0; i < adapter->num_queues; i++, rxr++) {
u64 rdba = rxr->rxdma.dma_paddr;
- int j = rxr->me;
+ j = rxr->me;
/* Setup the Base and Length of the Rx Descriptor Ring */
IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j),
- (rdba & 0x00000000ffffffffULL));
+ (rdba & 0x00000000ffffffffULL));
IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32));
IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j),
adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
@@ -3296,10 +3302,10 @@
}
if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
- u32 psrtype = IXGBE_PSRTYPE_TCPHDR |
- IXGBE_PSRTYPE_UDPHDR |
- IXGBE_PSRTYPE_IPV4HDR |
- IXGBE_PSRTYPE_IPV6HDR;
+ u32 psrtype = IXGBE_PSRTYPE_TCPHDR
+ | IXGBE_PSRTYPE_UDPHDR
+ | IXGBE_PSRTYPE_IPV4HDR
+ | IXGBE_PSRTYPE_IPV6HDR;
IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
}
@@ -3322,26 +3328,27 @@
IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
return;
-}
+} /* ixgbe_initialize_receive_units */
-/*
-** This routine is run via an vlan config EVENT,
-** it enables us to use the HW Filter table since
-** we can get the vlan id. This just creates the
-** entry in the soft version of the VFTA, init will
-** repopulate the real table.
-*/
+/************************************************************************
+ * ixgbe_register_vlan
+ *
+ * Run via vlan config EVENT, it enables us to use the
+ * HW Filter table since we can get the vlan id. This
+ * just creates the entry in the soft version of the
+ * VFTA, init will repopulate the real table.
+ ************************************************************************/
static void
ixgbe_register_vlan(void *arg, struct ifnet *ifp, u16 vtag)
{
- struct adapter *adapter = ifp->if_softc;
- u16 index, bit;
+ struct adapter *adapter = ifp->if_softc;
+ u16 index, bit;
if (ifp->if_softc != arg) /* Not our event */
return;
- if ((vtag == 0) || (vtag > 4095)) /* Invalid */
+ if ((vtag == 0) || (vtag > 4095)) /* Invalid */
return;
IXGBE_CORE_LOCK(adapter);
@@ -3351,23 +3358,23 @@
++adapter->num_vlans;
ixgbe_setup_vlan_hw_support(adapter);
IXGBE_CORE_UNLOCK(adapter);
-}
+} /* ixgbe_register_vlan */
-/*
-** This routine is run via an vlan
-** unconfig EVENT, remove our entry
-** in the soft vfta.
-*/
+/************************************************************************
+ * ixgbe_unregister_vlan
+ *
+ * Run via vlan unconfig EVENT, remove our entry in the soft vfta.
+ ************************************************************************/
static void
ixgbe_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
{
- struct adapter *adapter = ifp->if_softc;
- u16 index, bit;
+ struct adapter *adapter = ifp->if_softc;
+ u16 index, bit;
- if (ifp->if_softc != arg)
+ if (ifp->if_softc != arg)
return;
- if ((vtag == 0) || (vtag > 4095)) /* Invalid */
+ if ((vtag == 0) || (vtag > 4095)) /* Invalid */
return;
IXGBE_CORE_LOCK(adapter);
@@ -3378,28 +3385,32 @@
/* Re-init to load the changes */
ixgbe_setup_vlan_hw_support(adapter);
IXGBE_CORE_UNLOCK(adapter);
-}
+} /* ixgbe_unregister_vlan */
+/************************************************************************
+ * ixgbe_setup_vlan_hw_support
+ ************************************************************************/
static void
ixgbe_setup_vlan_hw_support(struct adapter *adapter)
{
- struct ifnet *ifp = adapter->ifp;
+ struct ifnet *ifp = adapter->ifp;
struct ixgbe_hw *hw = &adapter->hw;
- struct rx_ring *rxr;
- u32 ctrl;
+ struct rx_ring *rxr;
+ int i;
+ u32 ctrl;
/*
- ** We get here thru init_locked, meaning
- ** a soft reset, this has already cleared
- ** the VFTA and other state, so if there
- ** have been no vlan's registered do nothing.
- */
+ * We get here thru init_locked, meaning
+ * a soft reset, this has already cleared
+ * the VFTA and other state, so if there
+ * have been no vlan's registered do nothing.
+ */
if (adapter->num_vlans == 0)
return;
/* Setup the queues for vlans */
- for (int i = 0; i < adapter->num_queues; i++) {
+ for (i = 0; i < adapter->num_queues; i++) {
rxr = &adapter->rx_rings[i];
/* On 82599 the VLAN enable is per/queue in RXDCTL */
if (hw->mac.type != ixgbe_mac_82598EB) {
@@ -3413,10 +3424,10 @@
if ((ifp->if_capenable & IFCAP_VLAN_HWFILTER) == 0)
return;
/*
- ** A soft reset zero's out the VFTA, so
- ** we need to repopulate it now.
- */
- for (int i = 0; i < IXGBE_VFTA_SIZE; i++)
+ * A soft reset zero's out the VFTA, so
+ * we need to repopulate it now.
+ */
+ for (i = 0; i < IXGBE_VFTA_SIZE; i++)
if (adapter->shadow_vfta[i] != 0)
IXGBE_WRITE_REG(hw, IXGBE_VFTA(i),
adapter->shadow_vfta[i]);
@@ -3430,7 +3441,7 @@
if (hw->mac.type == ixgbe_mac_82598EB)
ctrl |= IXGBE_VLNCTRL_VME;
IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
-}
+} /* ixgbe_setup_vlan_hw_support */
static void
ixgbe_enable_intr(struct adapter *adapter)
@@ -3504,10 +3515,10 @@
}
/*
- ** Now enable all queues, this is done separately to
- ** allow for handling the extended (beyond 32) MSIX
- ** vectors that can be used by 82599
- */
+ * Now enable all queues, this is done separately to
+ * allow for handling the extended (beyond 32) MSI-X
+ * vectors that can be used by 82599
+ */
for (int i = 0; i < adapter->num_queues; i++, que++)
ixgbe_enable_queue(adapter, que->msix);
@@ -3558,19 +3569,19 @@
}
/*
- ** For the Quad port adapter we need to parse back
- ** up the PCI tree to find the speed of the expansion
- ** slot into which this adapter is plugged. A bit more work.
- */
+ * For the Quad port adapter we need to parse back
+ * up the PCI tree to find the speed of the expansion
+ * slot into which this adapter is plugged. A bit more work.
+ */
dev = device_get_parent(device_get_parent(dev));
#ifdef IXGBE_DEBUG
- device_printf(dev, "parent pcib = %x,%x,%x\n",
- pci_get_bus(dev), pci_get_slot(dev), pci_get_function(dev));
+ device_printf(dev, "parent pcib = %x,%x,%x\n", pci_get_bus(dev),
+ pci_get_slot(dev), pci_get_function(dev));
#endif
dev = device_get_parent(device_get_parent(dev));
#ifdef IXGBE_DEBUG
- device_printf(dev, "slot pcib = %x,%x,%x\n",
- pci_get_bus(dev), pci_get_slot(dev), pci_get_function(dev));
+ device_printf(dev, "slot pcib = %x,%x,%x\n", pci_get_bus(dev),
+ pci_get_slot(dev), pci_get_function(dev));
#endif
/* Now get the PCI Express Capabilities offset */
pci_find_cap(dev, PCIY_EXPRESS, &offset);
@@ -3612,45 +3623,42 @@
mac->ops.set_lan_id(hw);
display:
- device_printf(dev,"PCI Express Bus: Speed %s %s\n",
- ((hw->bus.speed == ixgbe_bus_speed_8000) ? "8.0GT/s":
- (hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0GT/s":
- (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5GT/s":"Unknown"),
- (hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" :
- (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" :
- (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" :
- ("Unknown"));
+ device_printf(dev, "PCI Express Bus: Speed %s %s\n",
+ ((hw->bus.speed == ixgbe_bus_speed_8000) ? "8.0GT/s" :
+ (hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0GT/s" :
+ (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5GT/s" :
+ "Unknown"),
+ ((hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" :
+ (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" :
+ (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" :
+ "Unknown"));
if ((hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) &&
((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
(hw->bus.speed == ixgbe_bus_speed_2500))) {
- device_printf(dev, "PCI-Express bandwidth available"
- " for this card\n is not sufficient for"
- " optimal performance.\n");
- device_printf(dev, "For optimal performance a x8 "
- "PCIE, or x4 PCIE Gen2 slot is required.\n");
- }
+ device_printf(dev, "PCI-Express bandwidth available for this card\n is not sufficient for optimal performance.\n");
+ device_printf(dev, "For optimal performance a x8 PCIE, or x4 PCIE Gen2 slot is required.\n");
+ }
if ((hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) &&
((hw->bus.width <= ixgbe_bus_width_pcie_x8) &&
(hw->bus.speed < ixgbe_bus_speed_8000))) {
- device_printf(dev, "PCI-Express bandwidth available"
- " for this card\n is not sufficient for"
- " optimal performance.\n");
- device_printf(dev, "For optimal performance a x8 "
- "PCIE Gen3 slot is required.\n");
- }
+ device_printf(dev, "PCI-Express bandwidth available for this card\n is not sufficient for optimal performance.\n");
+ device_printf(dev, "For optimal performance a x8 PCIE Gen3 slot is required.\n");
+ }
return;
-}
+} /* ixgbe_get_slot_info */
-/*
-** Setup the correct IVAR register for a particular MSIX interrupt
-** (yes this is all very magic and confusing :)
-** - entry is the register array entry
-** - vector is the MSIX vector for this queue
-** - type is RX/TX/MISC
-*/
+/************************************************************************
+ * ixgbe_set_ivar
+ *
+ * Setup the correct IVAR register for a particular MSI-X interrupt
+ * (yes this is all very magic and confusing :)
+ * - entry is the register array entry
+ * - vector is the MSI-X vector for this queue
+ * - type is RX/TX/MISC
+ ************************************************************************/
static void
ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
{
@@ -3683,7 +3691,7 @@
ivar &= ~(0xFF << index);
ivar |= (vector << index);
IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
- } else { /* RX/TX IVARS */
+ } else { /* RX/TX IVARS */
index = (16 * (entry & 1)) + (8 * type);
ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
ivar &= ~(0xFF << index);
@@ -3694,104 +3702,108 @@
default:
break;
}
-}
+} /* ixgbe_set_ivar */
+/************************************************************************
+ * ixgbe_configure_ivars
+ ************************************************************************/
static void
ixgbe_configure_ivars(struct adapter *adapter)
{
- struct ix_queue *que = adapter->queues;
- u32 newitr;
+ struct ix_queue *que = adapter->queues;
+ u32 newitr;
if (ixgbe_max_interrupt_rate > 0)
newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
else {
/*
- ** Disable DMA coalescing if interrupt moderation is
- ** disabled.
- */
+ * Disable DMA coalescing if interrupt moderation is
+ * disabled.
+ */
adapter->dmac = 0;
newitr = 0;
}
- for (int i = 0; i < adapter->num_queues; i++, que++) {
+ for (int i = 0; i < adapter->num_queues; i++, que++) {
struct rx_ring *rxr = &adapter->rx_rings[i];
struct tx_ring *txr = &adapter->tx_rings[i];
/* First the RX queue entry */
- ixgbe_set_ivar(adapter, rxr->me, que->msix, 0);
+ ixgbe_set_ivar(adapter, rxr->me, que->msix, 0);
/* ... and the TX */
ixgbe_set_ivar(adapter, txr->me, que->msix, 1);
/* Set an Initial EITR value */
- IXGBE_WRITE_REG(&adapter->hw,
- IXGBE_EITR(que->msix), newitr);
+ IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(que->msix), newitr);
}
/* For the Link interrupt */
- ixgbe_set_ivar(adapter, 1, adapter->vector, -1);
-}
+ ixgbe_set_ivar(adapter, 1, adapter->vector, -1);
+} /* ixgbe_configure_ivars */
-/*
-** ixgbe_sfp_probe - called in the local timer to
-** determine if a port had optics inserted.
-*/
+/************************************************************************
+ * ixgbe_sfp_probe
+ *
+ * Determine if a port had optics inserted.
+ ************************************************************************/
static bool
ixgbe_sfp_probe(struct adapter *adapter)
{
- struct ixgbe_hw *hw = &adapter->hw;
- device_t dev = adapter->dev;
- bool result = FALSE;
+ struct ixgbe_hw *hw = &adapter->hw;
+ device_t dev = adapter->dev;
+ bool result = FALSE;
if ((hw->phy.type == ixgbe_phy_nl) &&
(hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
s32 ret = hw->phy.ops.identify_sfp(hw);
if (ret)
- goto out;
+ goto out;
ret = hw->phy.ops.reset(hw);
+ adapter->sfp_probe = FALSE;
if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
device_printf(dev, "Unsupported SFP+ module detected!");
- device_printf(dev, "Reload driver with supported module.\n");
- adapter->sfp_probe = FALSE;
- goto out;
+ device_printf(dev,
+ "Reload driver with supported module.\n");
+ goto out;
} else
device_printf(dev, "SFP+ module detected!\n");
/* We now have supported optics */
- adapter->sfp_probe = FALSE;
/* Set the optics type so system reports correctly */
ixgbe_setup_optics(adapter);
result = TRUE;
}
out:
+
return (result);
-}
+} /* ixgbe_sfp_probe */
-/*
-** Tasklet handler for MSIX Link interrupts
-** - do outside interrupt since it might sleep
-*/
+/************************************************************************
+ * ixgbe_handle_link - Tasklet for MSI-X Link interrupts
+ *
+ * Done outside of interrupt context since the driver might sleep
+ ************************************************************************/
static void
ixgbe_handle_link(void *context, int pending)
{
struct adapter *adapter = context;
struct ixgbe_hw *hw = &adapter->hw;
- ixgbe_check_link(hw,
- &adapter->link_speed, &adapter->link_up, 0);
+ ixgbe_check_link(hw, &adapter->link_speed, &adapter->link_up, 0);
ixgbe_update_link_status(adapter);
/* Re-enable link interrupts */
IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_LSC);
-}
+} /* ixgbe_handle_link */
-/*
-** Tasklet for handling SFP module interrupts
-*/
+/************************************************************************
+ * ixgbe_handle_mod - Tasklet for SFP module interrupts
+ ************************************************************************/
static void
ixgbe_handle_mod(void *context, int pending)
{
struct adapter *adapter = context;
struct ixgbe_hw *hw = &adapter->hw;
enum ixgbe_phy_type orig_type = hw->phy.type;
- device_t dev = adapter->dev;
- u32 err;
+ device_t dev = adapter->dev;
+ u32 err;
IXGBE_CORE_LOCK(adapter);
@@ -3849,20 +3861,21 @@
}
IXGBE_CORE_UNLOCK(adapter);
+
return;
-}
+} /* ixgbe_handle_mod */
-/*
-** Tasklet for handling MSF (multispeed fiber) interrupts
-*/
+/************************************************************************
+ * ixgbe_handle_msf - Tasklet for MSF (multispeed fiber) interrupts
+ ************************************************************************/
static void
ixgbe_handle_msf(void *context, int pending)
{
struct adapter *adapter = context;
struct ixgbe_hw *hw = &adapter->hw;
- u32 autoneg;
- bool negotiate;
+ u32 autoneg;
+ bool negotiate;
IXGBE_CORE_LOCK(adapter);
/* get_supported_phy_layer will call hw->phy.ops.identify_sfp() */
@@ -3878,30 +3891,29 @@
ifmedia_removeall(&adapter->media);
ixgbe_add_media_types(adapter);
IXGBE_CORE_UNLOCK(adapter);
+
return;
-}
+} /* ixgbe_handle_msf */
-/*
-** Tasklet for handling interrupts from an external PHY
-*/
+/************************************************************************
+ * ixgbe_handle_phy - Tasklet for external PHY interrupts
+ ************************************************************************/
static void
ixgbe_handle_phy(void *context, int pending)
{
struct adapter *adapter = context;
struct ixgbe_hw *hw = &adapter->hw;
- int error;
+ int error;
error = hw->phy.ops.handle_lasi(hw);
if (error == IXGBE_ERR_OVERTEMP)
- device_printf(adapter->dev,
- "CRITICAL: EXTERNAL PHY OVER TEMP!! "
- " PHY will downshift to lower power state!\n");
+ device_printf(adapter->dev, "CRITICAL: EXTERNAL PHY OVER TEMP!! PHY will downshift to lower power state!\n");
else if (error)
device_printf(adapter->dev,
- "Error handling LASI interrupt: %d\n",
- error);
+ "Error handling LASI interrupt: %d\n", error);
+
return;
-}
+} /* ixgbe_handle_phy */
#ifdef IXGBE_FDIR
/*
@@ -3925,19 +3937,16 @@
}
#endif
-/*********************************************************************
- *
- * Configure DMA Coalescing
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_config_dmac - Configure DMA Coalescing
+ ************************************************************************/
static void
ixgbe_config_dmac(struct adapter *adapter)
{
- struct ixgbe_hw *hw = &adapter->hw;
+ struct ixgbe_hw *hw = &adapter->hw;
struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
- if (hw->mac.type < ixgbe_mac_X550 ||
- !hw->mac.ops.dmac_config)
+ if (hw->mac.type < ixgbe_mac_X550 || !hw->mac.ops.dmac_config)
return;
if (dcfg->watchdog_timer ^ adapter->dmac ||
@@ -3946,50 +3955,54 @@
dcfg->fcoe_en = false;
dcfg->link_speed = adapter->link_speed;
dcfg->num_tcs = 1;
-
+
INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
dcfg->watchdog_timer, dcfg->link_speed);
hw->mac.ops.dmac_config(hw);
}
-}
+} /* ixgbe_config_dmac */
-/*
- * Checks whether the adapter's ports are capable of
- * Wake On LAN by reading the adapter's NVM.
+/************************************************************************
+ * ixgbe_check_wol_support
*
- * Sets each port's hw->wol_enabled value depending
- * on the value read here.
- */
+ * Checks whether the adapter's ports are capable of
+ * Wake On LAN by reading the adapter's NVM.
+ *
+ * Sets each port's hw->wol_enabled value depending
+ * on the value read here.
+ ************************************************************************/
static void
ixgbe_check_wol_support(struct adapter *adapter)
{
struct ixgbe_hw *hw = &adapter->hw;
- u16 dev_caps = 0;
+ u16 dev_caps = 0;
/* Find out WoL support for port */
adapter->wol_support = hw->wol_enabled = 0;
ixgbe_get_device_caps(hw, &dev_caps);
if ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0) &&
- hw->bus.func == 0))
+ hw->bus.func == 0))
adapter->wol_support = hw->wol_enabled = 1;
/* Save initial wake up filter configuration */
adapter->wufc = IXGBE_READ_REG(hw, IXGBE_WUFC);
return;
-}
+} /* ixgbe_check_wol_support */
-/*
- * Prepare the adapter/port for LPLU and/or WoL
- */
+/************************************************************************
+ * ixgbe_setup_low_power_mode - LPLU/WoL preparation
+ *
+ * Prepare the adapter/port for LPLU and/or WoL
+ ************************************************************************/
static int
ixgbe_setup_low_power_mode(struct adapter *adapter)
{
struct ixgbe_hw *hw = &adapter->hw;
- device_t dev = adapter->dev;
- s32 error = 0;
+ device_t dev = adapter->dev;
+ s32 error = 0;
mtx_assert(&adapter->core_mtx, MA_OWNED);
@@ -3997,8 +4010,8 @@
ixgbe_set_phy_power(hw, FALSE);
/* Limit power management flow to X550EM baseT */
- if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T
- && hw->phy.ops.enter_lplu) {
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
+ hw->phy.ops.enter_lplu) {
/* Turn off support for APM wakeup. (Using ACPI instead) */
IXGBE_WRITE_REG(hw, IXGBE_GRC,
IXGBE_READ_REG(hw, IXGBE_GRC) & ~(u32)2);
@@ -4024,8 +4037,7 @@
ixgbe_stop(adapter);
error = hw->phy.ops.enter_lplu(hw);
if (error)
- device_printf(dev,
- "Error entering LPLU: %d\n", error);
+ device_printf(dev, "Error entering LPLU: %d\n", error);
hw->phy.reset_disable = false;
} else {
/* Just stop for other adapters */
@@ -4033,19 +4045,17 @@
}
return error;
-}
+} /* ixgbe_setup_low_power_mode */
-/**********************************************************************
- *
- * Update the board statistics counters.
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_update_stats_counters - Update board statistics counters.
+ ************************************************************************/
static void
ixgbe_update_stats_counters(struct adapter *adapter)
{
struct ixgbe_hw *hw = &adapter->hw;
- u32 missed_rx = 0, bprc, lxon, lxoff, total;
- u64 total_missed_rx = 0;
+ u32 missed_rx = 0, bprc, lxon, lxoff, total;
+ u64 total_missed_rx = 0;
adapter->stats.pf.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);
adapter->stats.pf.illerrc += IXGBE_READ_REG(hw, IXGBE_ILLERRC);
@@ -4152,15 +4162,18 @@
IXGBE_SET_IQDROPS(adapter, total_missed_rx);
IXGBE_SET_IERRORS(adapter, adapter->stats.pf.crcerrs
+ adapter->stats.pf.rlec);
-}
+} /* ixgbe_update_stats_counters */
#if __FreeBSD_version >= 1100036
+/************************************************************************
+ * ixgbe_get_counter
+ ************************************************************************/
static uint64_t
ixgbe_get_counter(struct ifnet *ifp, ift_counter cnt)
{
struct adapter *adapter;
struct tx_ring *txr;
- uint64_t rv;
+ uint64_t rv;
adapter = if_getsoftc(ifp);
@@ -4192,87 +4205,106 @@
default:
return (if_get_counter_default(ifp, cnt));
}
-}
+} /* ixgbe_get_counter */
#endif
-/** ixgbe_sysctl_tdh_handler - Handler function
- * Retrieves the TDH value from the hardware
- */
-static int
+/************************************************************************
+ * ixgbe_sysctl_tdh_handler - Transmit Descriptor Head handler function
+ *
+ * Retrieves the TDH value from the hardware
+ ************************************************************************/
+static int
ixgbe_sysctl_tdh_handler(SYSCTL_HANDLER_ARGS)
{
int error;
-
struct tx_ring *txr = ((struct tx_ring *)oidp->oid_arg1);
- if (!txr) return 0;
+
+ if (!txr)
+ return 0;
unsigned val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDH(txr->me));
error = sysctl_handle_int(oidp, &val, 0, req);
if (error || !req->newptr)
return error;
+
return 0;
-}
+} /* ixgbe_sysctl_tdh_handler */
-/** ixgbe_sysctl_tdt_handler - Handler function
- * Retrieves the TDT value from the hardware
- */
-static int
+/************************************************************************
+ * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
+ *
+ * Retrieves the TDT value from the hardware
+ ************************************************************************/
+static int
ixgbe_sysctl_tdt_handler(SYSCTL_HANDLER_ARGS)
{
int error;
-
struct tx_ring *txr = ((struct tx_ring *)oidp->oid_arg1);
- if (!txr) return 0;
+
+ if (!txr)
+ return 0;
unsigned val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDT(txr->me));
error = sysctl_handle_int(oidp, &val, 0, req);
if (error || !req->newptr)
return error;
+
return 0;
-}
+} /* ixgbe_sysctl_tdt_handler */
-/** ixgbe_sysctl_rdh_handler - Handler function
- * Retrieves the RDH value from the hardware
- */
-static int
+/************************************************************************
+ * ixgbe_sysctl_rdh_handler - Receive Descriptor Head handler function
+ *
+ * Retrieves the RDH value from the hardware
+ ************************************************************************/
+static int
ixgbe_sysctl_rdh_handler(SYSCTL_HANDLER_ARGS)
{
int error;
-
struct rx_ring *rxr = ((struct rx_ring *)oidp->oid_arg1);
- if (!rxr) return 0;
+
+ if (!rxr)
+ return 0;
unsigned val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDH(rxr->me));
error = sysctl_handle_int(oidp, &val, 0, req);
if (error || !req->newptr)
return error;
+
return 0;
-}
+} /* ixgbe_sysctl_rdh_handler */
-/** ixgbe_sysctl_rdt_handler - Handler function
- * Retrieves the RDT value from the hardware
- */
-static int
+/************************************************************************
+ * ixgbe_sysctl_rdt_handler - Receive Descriptor Tail handler function
+ *
+ * Retrieves the RDT value from the hardware
+ ************************************************************************/
+static int
ixgbe_sysctl_rdt_handler(SYSCTL_HANDLER_ARGS)
{
int error;
-
struct rx_ring *rxr = ((struct rx_ring *)oidp->oid_arg1);
- if (!rxr) return 0;
+
+ if (!rxr)
+ return 0;
unsigned val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDT(rxr->me));
error = sysctl_handle_int(oidp, &val, 0, req);
if (error || !req->newptr)
return error;
+
return 0;
-}
+} /* ixgbe_sysctl_rdt_handler */
+/************************************************************************
+ * ixgbe_sysctl_interrupt_rate_handler
+ ************************************************************************/
static int
ixgbe_sysctl_interrupt_rate_handler(SYSCTL_HANDLER_ARGS)
{
- int error;
struct ix_queue *que = ((struct ix_queue *)oidp->oid_arg1);
- unsigned int reg, usec, rate;
+ int error;
+ unsigned int reg, usec, rate;
reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_EITR(que->msix));
usec = ((reg & 0x0FF8) >> 3);
@@ -4292,14 +4324,18 @@
reg |= ((4000000/rate) & 0xff8 );
}
IXGBE_WRITE_REG(&que->adapter->hw, IXGBE_EITR(que->msix), reg);
+
return 0;
-}
+} /* ixgbe_sysctl_interrupt_rate_handler */
+/************************************************************************
+ * ixgbe_add_device_sysctls
+ ************************************************************************/
static void
ixgbe_add_device_sysctls(struct adapter *adapter)
{
- device_t dev = adapter->dev;
- struct ixgbe_hw *hw = &adapter->hw;
+ device_t dev = adapter->dev;
+ struct ixgbe_hw *hw = &adapter->hw;
struct sysctl_oid_list *child;
struct sysctl_ctx_list *ctx;
@@ -4307,37 +4343,35 @@
child = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
/* Sysctls for all devices */
- SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fc",
- CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
- ixgbe_sysctl_flowcntl, "I", IXGBE_SYSCTL_DESC_SET_FC);
+ SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fc", CTLTYPE_INT | CTLFLAG_RW,
+ adapter, 0, ixgbe_sysctl_flowcntl, "I", IXGBE_SYSCTL_DESC_SET_FC);
- SYSCTL_ADD_INT(ctx, child, OID_AUTO, "enable_aim",
- CTLFLAG_RW,
- &ixgbe_enable_aim, 1, "Interrupt Moderation");
+ SYSCTL_ADD_INT(ctx, child, OID_AUTO, "enable_aim", CTLFLAG_RW,
+ &ixgbe_enable_aim, 1, "Interrupt Moderation");
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "advertise_speed",
- CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
- ixgbe_sysctl_advertise, "I", IXGBE_SYSCTL_DESC_ADV_SPEED);
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0, ixgbe_sysctl_advertise, "I",
+ IXGBE_SYSCTL_DESC_ADV_SPEED);
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "thermal_test",
- CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
- ixgbe_sysctl_thermal_test, "I", "Thermal Test");
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0, ixgbe_sysctl_thermal_test,
+ "I", "Thermal Test");
#ifdef IXGBE_DEBUG
/* testing sysctls (for all devices) */
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "power_state",
- CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
- ixgbe_sysctl_power_state, "I", "PCI Power State");
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0, ixgbe_sysctl_power_state,
+ "I", "PCI Power State");
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "print_rss_config",
- CTLTYPE_STRING | CTLFLAG_RD, adapter, 0,
- ixgbe_sysctl_print_rss_config, "A", "Prints RSS Configuration");
+ CTLTYPE_STRING | CTLFLAG_RD, adapter, 0,
+ ixgbe_sysctl_print_rss_config, "A", "Prints RSS Configuration");
#endif
/* for X550 series devices */
if (hw->mac.type >= ixgbe_mac_X550)
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "dmac",
- CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
- ixgbe_sysctl_dmac, "I", "DMA Coalesce");
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0, ixgbe_sysctl_dmac,
+ "I", "DMA Coalesce");
/* for X552 backplane devices */
if (hw->device_id == IXGBE_DEV_ID_X550EM_X_KR) {
@@ -4378,14 +4412,12 @@
/* for WoL-capable devices */
if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "wol_enable",
- CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
- ixgbe_sysctl_wol_enable, "I",
- "Enable/Disable Wake on LAN");
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
+ ixgbe_sysctl_wol_enable, "I", "Enable/Disable Wake on LAN");
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "wufc",
- CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
- ixgbe_sysctl_wufc, "I",
- "Enable/Disable Wake Up Filters");
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0, ixgbe_sysctl_wufc,
+ "I", "Enable/Disable Wake Up Filters");
}
/* for X552/X557-AT devices */
@@ -4394,275 +4426,219 @@
struct sysctl_oid_list *phy_list;
phy_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "phy",
- CTLFLAG_RD, NULL,
- "External PHY sysctls");
+ CTLFLAG_RD, NULL, "External PHY sysctls");
phy_list = SYSCTL_CHILDREN(phy_node);
SYSCTL_ADD_PROC(ctx, phy_list, OID_AUTO, "temp",
- CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
- ixgbe_sysctl_phy_temp, "I",
- "Current External PHY Temperature (Celsius)");
+ CTLTYPE_INT | CTLFLAG_RD, adapter, 0, ixgbe_sysctl_phy_temp,
+ "I", "Current External PHY Temperature (Celsius)");
SYSCTL_ADD_PROC(ctx, phy_list, OID_AUTO, "overtemp_occurred",
- CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
- ixgbe_sysctl_phy_overtemp_occurred, "I",
- "External PHY High Temperature Event Occurred");
+ CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
+ ixgbe_sysctl_phy_overtemp_occurred, "I",
+ "External PHY High Temperature Event Occurred");
}
-}
+} /* ixgbe_add_device_sysctls */
-/*
- * Add sysctl variables, one per statistic, to the system.
- */
+/************************************************************************
+ * ixgbe_add_hw_stats
+ *
+ * Add sysctl variables, one per statistic, to the system.
+ ************************************************************************/
static void
ixgbe_add_hw_stats(struct adapter *adapter)
{
- device_t dev = adapter->dev;
-
- struct tx_ring *txr = adapter->tx_rings;
- struct rx_ring *rxr = adapter->rx_rings;
-
+ device_t dev = adapter->dev;
+ struct tx_ring *txr = adapter->tx_rings;
+ struct rx_ring *rxr = adapter->rx_rings;
struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
- struct sysctl_oid *tree = device_get_sysctl_tree(dev);
+ struct sysctl_oid *tree = device_get_sysctl_tree(dev);
struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
- struct ixgbe_hw_stats *stats = &adapter->stats.pf;
-
- struct sysctl_oid *stat_node, *queue_node;
+ struct ixgbe_hw_stats *stats = &adapter->stats.pf;
+ struct sysctl_oid *stat_node, *queue_node;
struct sysctl_oid_list *stat_list, *queue_list;
#define QUEUE_NAME_LEN 32
- char namebuf[QUEUE_NAME_LEN];
+ char namebuf[QUEUE_NAME_LEN];
/* Driver Statistics */
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
- CTLFLAG_RD, &adapter->dropped_pkts,
- "Driver dropped packets");
+ CTLFLAG_RD, &adapter->dropped_pkts, "Driver dropped packets");
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_defrag_failed",
- CTLFLAG_RD, &adapter->mbuf_defrag_failed,
- "m_defrag() failed");
+ CTLFLAG_RD, &adapter->mbuf_defrag_failed, "m_defrag() failed");
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "watchdog_events",
- CTLFLAG_RD, &adapter->watchdog_events,
- "Watchdog timeouts");
+ CTLFLAG_RD, &adapter->watchdog_events, "Watchdog timeouts");
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "link_irq",
- CTLFLAG_RD, &adapter->link_irq,
- "Link MSIX IRQ Handled");
+ CTLFLAG_RD, &adapter->link_irq, "Link MSI-X IRQ Handled");
for (int i = 0; i < adapter->num_queues; i++, txr++) {
snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
- CTLFLAG_RD, NULL, "Queue Name");
+ CTLFLAG_RD, NULL, "Queue Name");
queue_list = SYSCTL_CHILDREN(queue_node);
SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "interrupt_rate",
- CTLTYPE_UINT | CTLFLAG_RW, &adapter->queues[i],
- sizeof(&adapter->queues[i]),
- ixgbe_sysctl_interrupt_rate_handler, "IU",
- "Interrupt Rate");
+ CTLTYPE_UINT | CTLFLAG_RW, &adapter->queues[i],
+ sizeof(&adapter->queues[i]),
+ ixgbe_sysctl_interrupt_rate_handler, "IU",
+ "Interrupt Rate");
SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "irqs",
- CTLFLAG_RD, &(adapter->queues[i].irqs),
- "irqs on this queue");
- SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_head",
- CTLTYPE_UINT | CTLFLAG_RD, txr, sizeof(txr),
- ixgbe_sysctl_tdh_handler, "IU",
- "Transmit Descriptor Head");
- SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_tail",
- CTLTYPE_UINT | CTLFLAG_RD, txr, sizeof(txr),
- ixgbe_sysctl_tdt_handler, "IU",
- "Transmit Descriptor Tail");
+ CTLFLAG_RD, &(adapter->queues[i].irqs),
+ "irqs on this queue");
+ SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_head",
+ CTLTYPE_UINT | CTLFLAG_RD, txr, sizeof(txr),
+ ixgbe_sysctl_tdh_handler, "IU", "Transmit Descriptor Head");
+ SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_tail",
+ CTLTYPE_UINT | CTLFLAG_RD, txr, sizeof(txr),
+ ixgbe_sysctl_tdt_handler, "IU", "Transmit Descriptor Tail");
SYSCTL_ADD_ULONG(ctx, queue_list, OID_AUTO, "tso_tx",
- CTLFLAG_RD, &txr->tso_tx,
- "TSO");
+ CTLFLAG_RD, &txr->tso_tx, "TSO");
SYSCTL_ADD_ULONG(ctx, queue_list, OID_AUTO, "no_tx_dma_setup",
- CTLFLAG_RD, &txr->no_tx_dma_setup,
- "Driver tx dma failure in xmit");
+ CTLFLAG_RD, &txr->no_tx_dma_setup,
+ "Driver tx dma failure in xmit");
SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "no_desc_avail",
- CTLFLAG_RD, &txr->no_desc_avail,
- "Queue No Descriptor Available");
+ CTLFLAG_RD, &txr->no_desc_avail,
+ "Queue No Descriptor Available");
SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_packets",
- CTLFLAG_RD, &txr->total_packets,
- "Queue Packets Transmitted");
+ CTLFLAG_RD, &txr->total_packets,
+ "Queue Packets Transmitted");
SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "br_drops",
- CTLFLAG_RD, &txr->br->br_drops,
- "Packets dropped in buf_ring");
+ CTLFLAG_RD, &txr->br->br_drops,
+ "Packets dropped in buf_ring");
}
for (int i = 0; i < adapter->num_queues; i++, rxr++) {
snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
- queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
- CTLFLAG_RD, NULL, "Queue Name");
+ queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
+ CTLFLAG_RD, NULL, "Queue Name");
queue_list = SYSCTL_CHILDREN(queue_node);
struct lro_ctrl *lro = &rxr->lro;
snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
- queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
- CTLFLAG_RD, NULL, "Queue Name");
+ queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
+ CTLFLAG_RD, NULL, "Queue Name");
queue_list = SYSCTL_CHILDREN(queue_node);
- SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_head",
- CTLTYPE_UINT | CTLFLAG_RD, rxr, sizeof(rxr),
- ixgbe_sysctl_rdh_handler, "IU",
- "Receive Descriptor Head");
- SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_tail",
- CTLTYPE_UINT | CTLFLAG_RD, rxr, sizeof(rxr),
- ixgbe_sysctl_rdt_handler, "IU",
- "Receive Descriptor Tail");
+ SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_head",
+ CTLTYPE_UINT | CTLFLAG_RD, rxr, sizeof(rxr),
+ ixgbe_sysctl_rdh_handler, "IU", "Receive Descriptor Head");
+ SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_tail",
+ CTLTYPE_UINT | CTLFLAG_RD, rxr, sizeof(rxr),
+ ixgbe_sysctl_rdt_handler, "IU", "Receive Descriptor Tail");
SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_packets",
- CTLFLAG_RD, &rxr->rx_packets,
- "Queue Packets Received");
+ CTLFLAG_RD, &rxr->rx_packets, "Queue Packets Received");
SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_bytes",
- CTLFLAG_RD, &rxr->rx_bytes,
- "Queue Bytes Received");
+ CTLFLAG_RD, &rxr->rx_bytes, "Queue Bytes Received");
SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "rx_copies",
- CTLFLAG_RD, &rxr->rx_copies,
- "Copied RX Frames");
+ CTLFLAG_RD, &rxr->rx_copies, "Copied RX Frames");
SYSCTL_ADD_U64(ctx, queue_list, OID_AUTO, "lro_queued",
- CTLFLAG_RD, &lro->lro_queued, 0,
- "LRO Queued");
+ CTLFLAG_RD, &lro->lro_queued, 0, "LRO Queued");
SYSCTL_ADD_U64(ctx, queue_list, OID_AUTO, "lro_flushed",
- CTLFLAG_RD, &lro->lro_flushed, 0,
- "LRO Flushed");
+ CTLFLAG_RD, &lro->lro_flushed, 0, "LRO Flushed");
}
/* MAC stats get the own sub node */
- stat_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "mac_stats",
- CTLFLAG_RD, NULL, "MAC Statistics");
+ stat_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "mac_stats",
+ CTLFLAG_RD, NULL, "MAC Statistics");
stat_list = SYSCTL_CHILDREN(stat_node);
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "crc_errs",
- CTLFLAG_RD, &stats->crcerrs,
- "CRC Errors");
+ CTLFLAG_RD, &stats->crcerrs, "CRC Errors");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "ill_errs",
- CTLFLAG_RD, &stats->illerrc,
- "Illegal Byte Errors");
+ CTLFLAG_RD, &stats->illerrc, "Illegal Byte Errors");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "byte_errs",
- CTLFLAG_RD, &stats->errbc,
- "Byte Errors");
+ CTLFLAG_RD, &stats->errbc, "Byte Errors");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "short_discards",
- CTLFLAG_RD, &stats->mspdc,
- "MAC Short Packets Discarded");
+ CTLFLAG_RD, &stats->mspdc, "MAC Short Packets Discarded");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "local_faults",
- CTLFLAG_RD, &stats->mlfc,
- "MAC Local Faults");
+ CTLFLAG_RD, &stats->mlfc, "MAC Local Faults");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "remote_faults",
- CTLFLAG_RD, &stats->mrfc,
- "MAC Remote Faults");
+ CTLFLAG_RD, &stats->mrfc, "MAC Remote Faults");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rec_len_errs",
- CTLFLAG_RD, &stats->rlec,
- "Receive Length Errors");
+ CTLFLAG_RD, &stats->rlec, "Receive Length Errors");
/* Flow Control stats */
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xon_txd",
- CTLFLAG_RD, &stats->lxontxc,
- "Link XON Transmitted");
+ CTLFLAG_RD, &stats->lxontxc, "Link XON Transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xon_recvd",
- CTLFLAG_RD, &stats->lxonrxc,
- "Link XON Received");
+ CTLFLAG_RD, &stats->lxonrxc, "Link XON Received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xoff_txd",
- CTLFLAG_RD, &stats->lxofftxc,
- "Link XOFF Transmitted");
+ CTLFLAG_RD, &stats->lxofftxc, "Link XOFF Transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "xoff_recvd",
- CTLFLAG_RD, &stats->lxoffrxc,
- "Link XOFF Received");
+ CTLFLAG_RD, &stats->lxoffrxc, "Link XOFF Received");
/* Packet Reception Stats */
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_octets_rcvd",
- CTLFLAG_RD, &stats->tor,
- "Total Octets Received");
+ CTLFLAG_RD, &stats->tor, "Total Octets Received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_rcvd",
- CTLFLAG_RD, &stats->gorc,
- "Good Octets Received");
+ CTLFLAG_RD, &stats->gorc, "Good Octets Received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_pkts_rcvd",
- CTLFLAG_RD, &stats->tpr,
- "Total Packets Received");
+ CTLFLAG_RD, &stats->tpr, "Total Packets Received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_rcvd",
- CTLFLAG_RD, &stats->gprc,
- "Good Packets Received");
+ CTLFLAG_RD, &stats->gprc, "Good Packets Received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_rcvd",
- CTLFLAG_RD, &stats->mprc,
- "Multicast Packets Received");
+ CTLFLAG_RD, &stats->mprc, "Multicast Packets Received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "bcast_pkts_rcvd",
- CTLFLAG_RD, &stats->bprc,
- "Broadcast Packets Received");
+ CTLFLAG_RD, &stats->bprc, "Broadcast Packets Received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_64",
- CTLFLAG_RD, &stats->prc64,
- "64 byte frames received ");
+ CTLFLAG_RD, &stats->prc64, "64 byte frames received ");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_65_127",
- CTLFLAG_RD, &stats->prc127,
- "65-127 byte frames received");
+ CTLFLAG_RD, &stats->prc127, "65-127 byte frames received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_128_255",
- CTLFLAG_RD, &stats->prc255,
- "128-255 byte frames received");
+ CTLFLAG_RD, &stats->prc255, "128-255 byte frames received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_256_511",
- CTLFLAG_RD, &stats->prc511,
- "256-511 byte frames received");
+ CTLFLAG_RD, &stats->prc511, "256-511 byte frames received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_512_1023",
- CTLFLAG_RD, &stats->prc1023,
- "512-1023 byte frames received");
+ CTLFLAG_RD, &stats->prc1023, "512-1023 byte frames received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "rx_frames_1024_1522",
- CTLFLAG_RD, &stats->prc1522,
- "1023-1522 byte frames received");
+ CTLFLAG_RD, &stats->prc1522, "1023-1522 byte frames received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_undersized",
- CTLFLAG_RD, &stats->ruc,
- "Receive Undersized");
+ CTLFLAG_RD, &stats->ruc, "Receive Undersized");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_fragmented",
- CTLFLAG_RD, &stats->rfc,
- "Fragmented Packets Received ");
+ CTLFLAG_RD, &stats->rfc, "Fragmented Packets Received ");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_oversized",
- CTLFLAG_RD, &stats->roc,
- "Oversized Packets Received");
+ CTLFLAG_RD, &stats->roc, "Oversized Packets Received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "recv_jabberd",
- CTLFLAG_RD, &stats->rjc,
- "Received Jabber");
+ CTLFLAG_RD, &stats->rjc, "Received Jabber");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_rcvd",
- CTLFLAG_RD, &stats->mngprc,
- "Management Packets Received");
+ CTLFLAG_RD, &stats->mngprc, "Management Packets Received");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_drpd",
- CTLFLAG_RD, &stats->mngptc,
- "Management Packets Dropped");
+ CTLFLAG_RD, &stats->mngptc, "Management Packets Dropped");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "checksum_errs",
- CTLFLAG_RD, &stats->xec,
- "Checksum Errors");
+ CTLFLAG_RD, &stats->xec, "Checksum Errors");
/* Packet Transmission Stats */
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_octets_txd",
- CTLFLAG_RD, &stats->gotc,
- "Good Octets Transmitted");
+ CTLFLAG_RD, &stats->gotc, "Good Octets Transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "total_pkts_txd",
- CTLFLAG_RD, &stats->tpt,
- "Total Packets Transmitted");
+ CTLFLAG_RD, &stats->tpt, "Total Packets Transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "good_pkts_txd",
- CTLFLAG_RD, &stats->gptc,
- "Good Packets Transmitted");
+ CTLFLAG_RD, &stats->gptc, "Good Packets Transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "bcast_pkts_txd",
- CTLFLAG_RD, &stats->bptc,
- "Broadcast Packets Transmitted");
+ CTLFLAG_RD, &stats->bptc, "Broadcast Packets Transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "mcast_pkts_txd",
- CTLFLAG_RD, &stats->mptc,
- "Multicast Packets Transmitted");
+ CTLFLAG_RD, &stats->mptc, "Multicast Packets Transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "management_pkts_txd",
- CTLFLAG_RD, &stats->mngptc,
- "Management Packets Transmitted");
+ CTLFLAG_RD, &stats->mngptc, "Management Packets Transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_64",
- CTLFLAG_RD, &stats->ptc64,
- "64 byte frames transmitted ");
+ CTLFLAG_RD, &stats->ptc64, "64 byte frames transmitted ");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_65_127",
- CTLFLAG_RD, &stats->ptc127,
- "65-127 byte frames transmitted");
+ CTLFLAG_RD, &stats->ptc127, "65-127 byte frames transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_128_255",
- CTLFLAG_RD, &stats->ptc255,
- "128-255 byte frames transmitted");
+ CTLFLAG_RD, &stats->ptc255, "128-255 byte frames transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_256_511",
- CTLFLAG_RD, &stats->ptc511,
- "256-511 byte frames transmitted");
+ CTLFLAG_RD, &stats->ptc511, "256-511 byte frames transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_512_1023",
- CTLFLAG_RD, &stats->ptc1023,
- "512-1023 byte frames transmitted");
+ CTLFLAG_RD, &stats->ptc1023, "512-1023 byte frames transmitted");
SYSCTL_ADD_UQUAD(ctx, stat_list, OID_AUTO, "tx_frames_1024_1522",
- CTLFLAG_RD, &stats->ptc1522,
- "1024-1522 byte frames transmitted");
-}
+ CTLFLAG_RD, &stats->ptc1522, "1024-1522 byte frames transmitted");
+} /* ixgbe_add_hw_stats */
+/************************************************************************
+ * ixgbe_set_sysctl_value
+ ************************************************************************/
static void
ixgbe_set_sysctl_value(struct adapter *adapter, const char *name,
const char *description, int *limit, int value)
@@ -4671,7 +4647,7 @@
SYSCTL_ADD_INT(device_get_sysctl_ctx(adapter->dev),
SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)),
OID_AUTO, name, CTLFLAG_RW, limit, value, description);
-}
+} /* ixgbe_set_sysctl_value */
/*
** Set flow control using sysctl:
@@ -4771,16 +4747,13 @@
return (ENODEV);
if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
- (hw->phy.multispeed_fiber))) {
- device_printf(dev,
- "Advertised speed can only be set on copper or "
- "multispeed fiber media types.\n");
+ (hw->phy.multispeed_fiber))) {
+ device_printf(dev, "Advertised speed can only be set on copper or multispeed fiber media types.\n");
return (EINVAL);
}
if (advertise < 0x1 || advertise > 0x7) {
- device_printf(dev,
- "Invalid advertised speed; valid modes are 0x1 through 0x7\n");
+ device_printf(dev, "Invalid advertised speed; valid modes are 0x1 through 0x7\n");
return (EINVAL);
}
@@ -4807,16 +4780,17 @@
return (0);
}
-/*
- * The following two sysctls are for X552/X557-AT devices;
- * they deal with the external PHY used in them.
- */
+/************************************************************************
+ * ixgbe_sysctl_phy_temp - Retrieve temperature of PHY
+ *
+ * For X552/X557-AT devices using an external PHY
+ ************************************************************************/
static int
ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS)
{
- struct adapter *adapter = (struct adapter *) arg1;
+ struct adapter *adapter = (struct adapter *) arg1;
struct ixgbe_hw *hw = &adapter->hw;
- u16 reg;
+ u16 reg;
if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
device_printf(adapter->dev,
@@ -4825,8 +4799,7 @@
}
if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
- IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
- &reg)) {
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &reg)) {
device_printf(adapter->dev,
"Error reading from PHY's current temperature register\n");
return (EAGAIN);
@@ -4836,19 +4809,20 @@
reg = reg >> 8;
return (sysctl_handle_int(oidp, NULL, reg, req));
-}
+} /* ixgbe_sysctl_phy_temp */
-/*
- * Reports whether the current PHY temperature is over
- * the overtemp threshold.
- * - This is reported directly from the PHY
- */
+/************************************************************************
+ * ixgbe_sysctl_phy_overtemp_occurred
+ *
+ * Reports (directly from the PHY) whether the current PHY
+ * temperature is over the overtemp threshold.
+ ************************************************************************/
static int
ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS)
{
- struct adapter *adapter = (struct adapter *) arg1;
+ struct adapter *adapter = (struct adapter *) arg1;
struct ixgbe_hw *hw = &adapter->hw;
- u16 reg;
+ u16 reg;
if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
device_printf(adapter->dev,
@@ -4857,8 +4831,7 @@
}
if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
- IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
- &reg)) {
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &reg)) {
device_printf(adapter->dev,
"Error reading from PHY's temperature status register\n");
return (EAGAIN);
@@ -4866,19 +4839,22 @@
/* Get occurrence bit */
reg = !!(reg & 0x4000);
+
return (sysctl_handle_int(oidp, 0, reg, req));
-}
+} /* ixgbe_sysctl_phy_overtemp_occurred */
-/*
-** Thermal Shutdown Trigger (internal MAC)
-** - Set this to 1 to cause an overtemp event to occur
-*/
+/************************************************************************
+ * ixgbe_sysctl_thermal_test
+ *
+ * Thermal Shutdown Trigger (internal MAC)
+ * - Set this to 1 to cause an overtemp event to occur
+ ************************************************************************/
static int
ixgbe_sysctl_thermal_test(SYSCTL_HANDLER_ARGS)
{
- struct adapter *adapter = (struct adapter *) arg1;
+ struct adapter *adapter = (struct adapter *) arg1;
struct ixgbe_hw *hw = &adapter->hw;
- int error, fire = 0;
+ int error, fire = 0;
error = sysctl_handle_int(oidp, &fire, 0, req);
if ((error) || (req->newptr == NULL))
@@ -4891,25 +4867,26 @@
}
return (0);
-}
+} /* ixgbe_sysctl_thermal_test */
-/*
-** Manage DMA Coalescing.
-** Control values:
-** 0/1 - off / on (use default value of 1000)
-**
-** Legal timer values are:
-** 50,100,250,500,1000,2000,5000,10000
-**
-** Turning off interrupt moderation will also turn this off.
-*/
+/************************************************************************
+ * ixgbe_sysctl_dmac - Manage DMA Coalescing
+ *
+ * Control values:
+ * 0/1 - off / on (use default value of 1000)
+ *
+ * Legal timer values are:
+ * 50,100,250,500,1000,2000,5000,10000
+ *
+ * Turning off interrupt moderation will also turn this off.
+ ************************************************************************/
static int
ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS)
{
struct adapter *adapter = (struct adapter *) arg1;
- struct ifnet *ifp = adapter->ifp;
- int error;
- u32 newval;
+ struct ifnet *ifp = adapter->ifp;
+ int error;
+ u32 newval;
newval = adapter->dmac;
error = sysctl_handle_int(oidp, &newval, 0, req);
@@ -4946,22 +4923,24 @@
ixgbe_init(adapter);
return (0);
-}
+} /* ixgbe_sysctl_dmac */
#ifdef IXGBE_DEBUG
-/**
- * Sysctl to test power states
- * Values:
- * 0 - set device to D0
- * 3 - set device to D3
- * (none) - get current device power state
- */
+/************************************************************************
+ * ixgbe_sysctl_power_state
+ *
+ * Sysctl to test power states
+ * Values:
+ * 0 - set device to D0
+ * 3 - set device to D3
+ * (none) - get current device power state
+ ************************************************************************/
static int
ixgbe_sysctl_power_state(SYSCTL_HANDLER_ARGS)
{
struct adapter *adapter = (struct adapter *) arg1;
- device_t dev = adapter->dev;
- int curr_ps, new_ps, error = 0;
+ device_t dev = adapter->dev;
+ int curr_ps, new_ps, error = 0;
curr_ps = new_ps = pci_get_powerstate(dev);
@@ -4982,21 +4961,26 @@
device_printf(dev, "New state: %d\n", pci_get_powerstate(dev));
return (error);
-}
+} /* ixgbe_sysctl_power_state */
#endif
-/*
- * Sysctl to enable/disable the WoL capability, if supported by the adapter.
- * Values:
- * 0 - disabled
- * 1 - enabled
- */
+
+/************************************************************************
+ * ixgbe_sysctl_wol_enable
+ *
+ * Sysctl to enable/disable the WoL capability,
+ * if supported by the adapter.
+ *
+ * Values:
+ * 0 - disabled
+ * 1 - enabled
+ ************************************************************************/
static int
ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS)
{
- struct adapter *adapter = (struct adapter *) arg1;
+ struct adapter *adapter = (struct adapter *) arg1;
struct ixgbe_hw *hw = &adapter->hw;
- int new_wol_enabled;
- int error = 0;
+ int new_wol_enabled;
+ int error = 0;
new_wol_enabled = hw->wol_enabled;
error = sysctl_handle_int(oidp, &new_wol_enabled, 0, req);
@@ -5012,7 +4996,7 @@
hw->wol_enabled = new_wol_enabled;
return (0);
-}
+} /* ixgbe_sysctl_wol_enable */
/*
* Sysctl to enable/disable the Energy Efficient Ethernet capability,
@@ -5112,29 +5096,29 @@
return (sysctl_handle_int(oidp, 0, reg >> 26, req));
}
-/*
- * Sysctl to enable/disable the types of packets that the
- * adapter will wake up on upon receipt.
- * WUFC - Wake Up Filter Control
- * Flags:
- * 0x1 - Link Status Change
- * 0x2 - Magic Packet
- * 0x4 - Direct Exact
- * 0x8 - Directed Multicast
- * 0x10 - Broadcast
- * 0x20 - ARP/IPv4 Request Packet
- * 0x40 - Direct IPv4 Packet
- * 0x80 - Direct IPv6 Packet
+/************************************************************************
+ * ixgbe_sysctl_wufc
*
- * Setting another flag will cause the sysctl to return an
- * error.
- */
+ * Sysctl to enable/disable the types of packets that the
+ * adapter will wake up on upon receipt.
+ * Flags:
+ * 0x1 - Link Status Change
+ * 0x2 - Magic Packet
+ * 0x4 - Direct Exact
+ * 0x8 - Directed Multicast
+ * 0x10 - Broadcast
+ * 0x20 - ARP/IPv4 Request Packet
+ * 0x40 - Direct IPv4 Packet
+ * 0x80 - Direct IPv6 Packet
+ *
+ * Settings not listed above will cause the sysctl to return an error.
+ ************************************************************************/
static int
ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS)
{
struct adapter *adapter = (struct adapter *) arg1;
- int error = 0;
- u32 new_wufc;
+ int error = 0;
+ u32 new_wufc;
new_wufc = adapter->wufc;
@@ -5153,18 +5137,21 @@
}
return (0);
-}
+} /* ixgbe_sysctl_wufc */
#ifdef IXGBE_DEBUG
+/************************************************************************
+ * ixgbe_sysctl_print_rss_config
+ ************************************************************************/
static int
ixgbe_sysctl_print_rss_config(SYSCTL_HANDLER_ARGS)
{
- struct adapter *adapter = (struct adapter *)arg1;
+ struct adapter *adapter = (struct adapter *)arg1;
struct ixgbe_hw *hw = &adapter->hw;
- device_t dev = adapter->dev;
- int error = 0, reta_size;
- struct sbuf *buf;
- u32 reg;
+ device_t dev = adapter->dev;
+ struct sbuf *buf;
+ int error = 0, reta_size;
+ u32 reg;
buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
if (!buf) {
@@ -5203,29 +5190,33 @@
device_printf(dev, "Error finishing sbuf: %d\n", error);
sbuf_delete(buf);
+
return (0);
-}
+} /* ixgbe_sysctl_print_rss_config */
#endif /* IXGBE_DEBUG */
-/*
-** Enable the hardware to drop packets when the buffer is
-** full. This is useful when multiqueue,so that no single
-** queue being full stalls the entire RX engine. We only
-** enable this when Multiqueue AND when Flow Control is
-** disabled.
-*/
+/************************************************************************
+ * ixgbe_enable_rx_drop
+ *
+ * Enable the hardware to drop packets when the buffer is
+ * full. This is useful with multiqueue, so that no single
+ * queue being full stalls the entire RX engine. We only
+ * enable this when Multiqueue is enabled AND Flow Control
+ * is disabled.
+ ************************************************************************/
static void
ixgbe_enable_rx_drop(struct adapter *adapter)
{
- struct ixgbe_hw *hw = &adapter->hw;
+ struct ixgbe_hw *hw = &adapter->hw;
for (int i = 0; i < adapter->num_queues; i++) {
struct rx_ring *rxr = &adapter->rx_rings[i];
- u32 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
- srrctl |= IXGBE_SRRCTL_DROP_EN;
- IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
+ u32 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
+ srrctl |= IXGBE_SRRCTL_DROP_EN;
+ IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
}
#ifdef PCI_IOV
+
/* enable drop for each vf */
for (int i = 0; i < adapter->num_vfs; i++) {
IXGBE_WRITE_REG(hw, IXGBE_QDE,
@@ -5233,28 +5224,35 @@
IXGBE_QDE_ENABLE));
}
#endif
-}
+} /* ixgbe_enable_rx_drop */
+/************************************************************************
+ * ixgbe_disable_rx_drop
+ ************************************************************************/
static void
ixgbe_disable_rx_drop(struct adapter *adapter)
{
- struct ixgbe_hw *hw = &adapter->hw;
+ struct ixgbe_hw *hw = &adapter->hw;
for (int i = 0; i < adapter->num_queues; i++) {
struct rx_ring *rxr = &adapter->rx_rings[i];
- u32 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
- srrctl &= ~IXGBE_SRRCTL_DROP_EN;
- IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
+ u32 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
+ srrctl &= ~IXGBE_SRRCTL_DROP_EN;
+ IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
}
#ifdef PCI_IOV
+
/* disable drop for each vf */
for (int i = 0; i < adapter->num_vfs; i++) {
IXGBE_WRITE_REG(hw, IXGBE_QDE,
(IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT)));
}
#endif
-}
+} /* ixgbe_disable_rx_drop */
+/************************************************************************
+ * ixgbe_rearm_queues
+ ************************************************************************/
static void
ixgbe_rearm_queues(struct adapter *adapter, u64 queues)
{
@@ -5277,7 +5275,7 @@
default:
break;
}
-}
+} /* ixgbe_rearm_queues */
#ifdef PCI_IOV
Index: sys/dev/ixgbe/ix_txrx.c
===================================================================
--- sys/dev/ixgbe/ix_txrx.c
+++ sys/dev/ixgbe/ix_txrx.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -55,67 +55,65 @@
#endif
/*
-** HW RSC control:
-** this feature only works with
-** IPv4, and only on 82599 and later.
-** Also this will cause IP forwarding to
-** fail and that can't be controlled by
-** the stack as LRO can. For all these
-** reasons I've deemed it best to leave
-** this off and not bother with a tuneable
-** interface, this would need to be compiled
-** to enable.
-*/
+ * HW RSC control:
+ * this feature only works with
+ * IPv4, and only on 82599 and later.
+ * Also this will cause IP forwarding to
+ * fail and that can't be controlled by
+ * the stack as LRO can. For all these
+ * reasons I've deemed it best to leave
+ * this off and not bother with a tuneable
+ * interface, this would need to be compiled
+ * to enable.
+ */
static bool ixgbe_rsc_enable = FALSE;
#ifdef IXGBE_FDIR
/*
-** For Flow Director: this is the
-** number of TX packets we sample
-** for the filter pool, this means
-** every 20th packet will be probed.
-**
-** This feature can be disabled by
-** setting this to 0.
-*/
+ * For Flow Director: this is the
+ * number of TX packets we sample
+ * for the filter pool, this means
+ * every 20th packet will be probed.
+ *
+ * This feature can be disabled by
+ * setting this to 0.
+ */
static int atr_sample_rate = 20;
#endif
-/*********************************************************************
+/************************************************************************
* Local Function prototypes
- *********************************************************************/
-static void ixgbe_setup_transmit_ring(struct tx_ring *);
-static void ixgbe_free_transmit_buffers(struct tx_ring *);
-static int ixgbe_setup_receive_ring(struct rx_ring *);
-static void ixgbe_free_receive_buffers(struct rx_ring *);
-
-static void ixgbe_rx_checksum(u32, struct mbuf *, u32);
-static void ixgbe_refresh_mbufs(struct rx_ring *, int);
-static int ixgbe_xmit(struct tx_ring *, struct mbuf **);
-static int ixgbe_tx_ctx_setup(struct tx_ring *,
- struct mbuf *, u32 *, u32 *);
-static int ixgbe_tso_setup(struct tx_ring *,
- struct mbuf *, u32 *, u32 *);
+ ************************************************************************/
+static void ixgbe_setup_transmit_ring(struct tx_ring *);
+static void ixgbe_free_transmit_buffers(struct tx_ring *);
+static int ixgbe_setup_receive_ring(struct rx_ring *);
+static void ixgbe_free_receive_buffers(struct rx_ring *);
+static void ixgbe_rx_checksum(u32, struct mbuf *, u32);
+static void ixgbe_refresh_mbufs(struct rx_ring *, int);
+static int ixgbe_xmit(struct tx_ring *, struct mbuf **);
+static int ixgbe_tx_ctx_setup(struct tx_ring *,
+ struct mbuf *, u32 *, u32 *);
+static int ixgbe_tso_setup(struct tx_ring *,
+ struct mbuf *, u32 *, u32 *);
#ifdef IXGBE_FDIR
static void ixgbe_atr(struct tx_ring *, struct mbuf *);
#endif
static __inline void ixgbe_rx_discard(struct rx_ring *, int);
static __inline void ixgbe_rx_input(struct rx_ring *, struct ifnet *,
- struct mbuf *, u32);
+ struct mbuf *, u32);
#ifdef IXGBE_LEGACY_TX
-/*********************************************************************
- * Transmit entry point
+/************************************************************************
+ * ixgbe_legacy_start_locked - Transmit entry point
*
- * ixgbe_start is called by the stack to initiate a transmit.
- * The driver will remain in this routine as long as there are
- * packets to transmit and transmit resources are available.
- * In case resources are not available stack is notified and
- * the packet is requeued.
- **********************************************************************/
-
+ * Called by the stack to initiate a transmit.
+ * The driver will remain in this routine as long as there are
+ * packets to transmit and transmit resources are available.
+ * In case resources are not available, the stack is notified
+ * and the packet is requeued.
+ ************************************************************************/
void
-ixgbe_start_locked(struct tx_ring *txr, struct ifnet * ifp)
+ixgbe_legacy_start_locked(struct tx_ring *txr, struct ifnet * ifp)
{
struct mbuf *m_head;
struct adapter *adapter = txr->adapter;
@@ -146,20 +144,21 @@
return;
}
-/*
- * Legacy TX start - called by the stack, this
- * always uses the first tx ring, and should
- * not be used with multiqueue tx enabled.
- */
+/************************************************************************
+ * ixgbe_legacy_start
+ *
+ * Called by the stack, this always uses the first tx ring,
+ * and should not be used with multiqueue tx enabled.
+ ************************************************************************/
void
-ixgbe_start(struct ifnet *ifp)
+ixgbe_legacy_start(struct ifnet *ifp)
{
struct adapter *adapter = ifp->if_softc;
- struct tx_ring *txr = adapter->tx_rings;
+ struct tx_ring *txr = adapter->tx_rings;
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
IXGBE_TX_LOCK(txr);
- ixgbe_start_locked(txr, ifp);
+ ixgbe_legacy_start_locked(txr, ifp);
IXGBE_TX_UNLOCK(txr);
}
return;
@@ -167,19 +166,20 @@
#else /* ! IXGBE_LEGACY_TX */
-/*
-** Multiqueue Transmit Entry Point
-** (if_transmit function)
-*/
+/************************************************************************
+ * ixgbe_mq_start - Multiqueue Transmit Entry Point
+ *
+ * (if_transmit function)
+ ************************************************************************/
int
ixgbe_mq_start(struct ifnet *ifp, struct mbuf *m)
{
- struct adapter *adapter = ifp->if_softc;
- struct ix_queue *que;
- struct tx_ring *txr;
- int i, err = 0;
+ struct adapter *adapter = ifp->if_softc;
+ struct ix_queue *que;
+ struct tx_ring *txr;
+ int i, err = 0;
#ifdef RSS
- uint32_t bucket_id;
+ uint32_t bucket_id;
#endif
/*
@@ -196,10 +196,11 @@
i = bucket_id % adapter->num_queues;
#ifdef IXGBE_DEBUG
if (bucket_id > adapter->num_queues)
- if_printf(ifp, "bucket_id (%d) > num_queues "
- "(%d)\n", bucket_id, adapter->num_queues);
+ if_printf(ifp,
+ "bucket_id (%d) > num_queues (%d)\n",
+ bucket_id, adapter->num_queues);
#endif
- } else
+ } else
#endif
i = m->m_pkthdr.flowid % adapter->num_queues;
} else
@@ -224,12 +225,15 @@
return (0);
}
+/************************************************************************
+ * ixgbe_mq_start_locked
+ ************************************************************************/
int
ixgbe_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr)
{
- struct adapter *adapter = txr->adapter;
- struct mbuf *next;
- int enqueued = 0, err = 0;
+ struct adapter *adapter = txr->adapter;
+ struct mbuf *next;
+ int enqueued = 0, err = 0;
if (((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) ||
adapter->link_active == 0)
@@ -283,15 +287,17 @@
return (err);
}
-/*
- * Called from a taskqueue to drain queued transmit packets.
- */
+/************************************************************************
+ * ixgbe_deferred_mq_start
+ *
+ * Called from a taskqueue to drain queued transmit packets.
+ ************************************************************************/
void
ixgbe_deferred_mq_start(void *arg, int pending)
{
struct tx_ring *txr = arg;
struct adapter *adapter = txr->adapter;
- struct ifnet *ifp = adapter->ifp;
+ struct ifnet *ifp = adapter->ifp;
IXGBE_TX_LOCK(txr);
if (!drbr_empty(ifp, txr->br))
@@ -299,15 +305,15 @@
IXGBE_TX_UNLOCK(txr);
}
-/*
- * Flush all ring buffers
- */
+/************************************************************************
+ * ixgbe_qflush - Flush all ring buffers
+ ************************************************************************/
void
ixgbe_qflush(struct ifnet *ifp)
{
- struct adapter *adapter = ifp->if_softc;
- struct tx_ring *txr = adapter->tx_rings;
- struct mbuf *m;
+ struct adapter *adapter = ifp->if_softc;
+ struct tx_ring *txr = adapter->tx_rings;
+ struct mbuf *m;
for (int i = 0; i < adapter->num_queues; i++, txr++) {
IXGBE_TX_LOCK(txr);
@@ -320,43 +326,43 @@
#endif /* IXGBE_LEGACY_TX */
-/*********************************************************************
+/************************************************************************
+ * ixgbe_xmit
*
- * This routine maps the mbufs to tx descriptors, allowing the
- * TX engine to transmit the packets.
- * - return 0 on success, positive on failure
+ * This routine maps the mbufs to tx descriptors, allowing the
+ * TX engine to transmit the packets.
*
- **********************************************************************/
-
+ * Return 0 on success, positive on failure
+ ************************************************************************/
static int
ixgbe_xmit(struct tx_ring *txr, struct mbuf **m_headp)
{
- struct adapter *adapter = txr->adapter;
- u32 olinfo_status = 0, cmd_type_len;
- int i, j, error, nsegs;
- int first;
- bool remap = TRUE;
- struct mbuf *m_head;
- bus_dma_segment_t segs[adapter->num_segs];
- bus_dmamap_t map;
- struct ixgbe_tx_buf *txbuf;
+ struct adapter *adapter = txr->adapter;
+ struct ixgbe_tx_buf *txbuf;
union ixgbe_adv_tx_desc *txd = NULL;
+ struct mbuf *m_head;
+ int i, j, error, nsegs;
+ int first;
+ u32 olinfo_status = 0, cmd_type_len;
+ bool remap = TRUE;
+ bus_dma_segment_t segs[adapter->num_segs];
+ bus_dmamap_t map;
m_head = *m_headp;
/* Basic descriptor defines */
- cmd_type_len = (IXGBE_ADVTXD_DTYP_DATA |
+ cmd_type_len = (IXGBE_ADVTXD_DTYP_DATA |
IXGBE_ADVTXD_DCMD_IFCS | IXGBE_ADVTXD_DCMD_DEXT);
if (m_head->m_flags & M_VLANTAG)
- cmd_type_len |= IXGBE_ADVTXD_DCMD_VLE;
-
- /*
- * Important to capture the first descriptor
- * used because it will contain the index of
- * the one we tell the hardware to report back
- */
- first = txr->next_avail_desc;
+ cmd_type_len |= IXGBE_ADVTXD_DCMD_VLE;
+
+ /*
+ * Important to capture the first descriptor
+ * used because it will contain the index of
+ * the one we tell the hardware to report back
+ */
+ first = txr->next_avail_desc;
txbuf = &txr->tx_buffers[first];
map = txbuf->map;
@@ -364,8 +370,8 @@
* Map the packet for DMA.
*/
retry:
- error = bus_dmamap_load_mbuf_sg(txr->txtag, map,
- *m_headp, segs, &nsegs, BUS_DMA_NOWAIT);
+ error = bus_dmamap_load_mbuf_sg(txr->txtag, map, *m_headp, segs,
+ &nsegs, BUS_DMA_NOWAIT);
if (__predict_false(error)) {
struct mbuf *m;
@@ -451,8 +457,7 @@
i = 0;
}
- txd->read.cmd_type_len |=
- htole32(IXGBE_TXD_CMD_EOP | IXGBE_TXD_CMD_RS);
+ txd->read.cmd_type_len |= htole32(IXGBE_TXD_CMD_EOP | IXGBE_TXD_CMD_RS);
txr->tx_avail -= nsegs;
txr->next_avail_desc = i;
@@ -467,12 +472,12 @@
txbuf->map = map;
bus_dmamap_sync(txr->txtag, map, BUS_DMASYNC_PREWRITE);
- /* Set the EOP descriptor that will be marked done */
- txbuf = &txr->tx_buffers[first];
+ /* Set the EOP descriptor that will be marked done */
+ txbuf = &txr->tx_buffers[first];
txbuf->eop = txd;
- bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
- BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+ bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
/*
* Advance the Transmit Descriptor Tail (Tdt), this tells the
* hardware that this frame is available to transmit.
@@ -485,53 +490,55 @@
txr->busy = 1;
return (0);
-}
+} /* ixgbe_xmit */
-/*********************************************************************
+/************************************************************************
+ * ixgbe_allocate_transmit_buffers
*
- * Allocate memory for tx_buffer structures. The tx_buffer stores all
- * the information needed to transmit a packet on the wire. This is
- * called only once at attach, setup is done every reset.
- *
- **********************************************************************/
+ * Allocate memory for tx_buffer structures. The tx_buffer stores all
+ * the information needed to transmit a packet on the wire. This is
+ * called only once at attach, setup is done every reset.
+ ************************************************************************/
int
ixgbe_allocate_transmit_buffers(struct tx_ring *txr)
{
- struct adapter *adapter = txr->adapter;
- device_t dev = adapter->dev;
+ struct adapter *adapter = txr->adapter;
+ device_t dev = adapter->dev;
struct ixgbe_tx_buf *txbuf;
- int error, i;
+ int error, i;
/*
* Setup DMA descriptor areas.
*/
if ((error = bus_dma_tag_create(
- bus_get_dma_tag(adapter->dev), /* parent */
- 1, 0, /* alignment, bounds */
- BUS_SPACE_MAXADDR, /* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- IXGBE_TSO_SIZE, /* maxsize */
- adapter->num_segs, /* nsegments */
- PAGE_SIZE, /* maxsegsize */
- 0, /* flags */
- NULL, /* lockfunc */
- NULL, /* lockfuncarg */
- &txr->txtag))) {
+ /* parent */ bus_get_dma_tag(adapter->dev),
+ /* alignment */ 1,
+ /* bounds */ 0,
+ /* lowaddr */ BUS_SPACE_MAXADDR,
+ /* highaddr */ BUS_SPACE_MAXADDR,
+ /* filter */ NULL,
+ /* filterarg */ NULL,
+ /* maxsize */ IXGBE_TSO_SIZE,
+ /* nsegments */ adapter->num_segs,
+ /* maxsegsize */ PAGE_SIZE,
+ /* flags */ 0,
+ /* lockfunc */ NULL,
+ /* lockfuncarg */ NULL,
+ &txr->txtag))) {
device_printf(dev,"Unable to allocate TX DMA tag\n");
goto fail;
}
if (!(txr->tx_buffers =
- (struct ixgbe_tx_buf *) malloc(sizeof(struct ixgbe_tx_buf) *
+ (struct ixgbe_tx_buf *)malloc(sizeof(struct ixgbe_tx_buf) *
adapter->num_tx_desc, M_DEVBUF, M_NOWAIT | M_ZERO))) {
device_printf(dev, "Unable to allocate tx_buffer memory\n");
error = ENOMEM;
goto fail;
}
- /* Create the descriptor buffer dma maps */
+ /* Create the descriptor buffer dma maps */
txbuf = txr->tx_buffers;
for (i = 0; i < adapter->num_tx_desc; i++, txbuf++) {
error = bus_dmamap_create(txr->txtag, 0, &txbuf->map);
@@ -545,26 +552,28 @@
fail:
/* We free all, it handles case where we are in the middle */
ixgbe_free_transmit_structures(adapter);
+
return (error);
-}
+} /* ixgbe_allocate_transmit_buffers */
-/*********************************************************************
+/************************************************************************
*
* Initialize a transmit ring.
*
- **********************************************************************/
+ ************************************************************************/
static void
ixgbe_setup_transmit_ring(struct tx_ring *txr)
{
- struct adapter *adapter = txr->adapter;
- struct ixgbe_tx_buf *txbuf;
+ struct adapter *adapter = txr->adapter;
+ struct ixgbe_tx_buf *txbuf;
#ifdef DEV_NETMAP
struct netmap_adapter *na = NA(adapter->ifp);
- struct netmap_slot *slot;
+ struct netmap_slot *slot;
#endif /* DEV_NETMAP */
/* Clear the old ring contents */
IXGBE_TX_LOCK(txr);
+
#ifdef DEV_NETMAP
/*
* (under lock): if in netmap mode, do some consistency
@@ -572,14 +581,15 @@
*/
slot = netmap_reset(na, NR_TX, txr->me, 0);
#endif /* DEV_NETMAP */
+
bzero((void *)txr->tx_base,
- (sizeof(union ixgbe_adv_tx_desc)) * adapter->num_tx_desc);
+ (sizeof(union ixgbe_adv_tx_desc)) * adapter->num_tx_desc);
/* Reset indices */
txr->next_avail_desc = 0;
txr->next_to_clean = 0;
/* Free any existing tx buffers. */
- txbuf = txr->tx_buffers;
+ txbuf = txr->tx_buffers;
for (int i = 0; i < txr->num_desc; i++, txbuf++) {
if (txbuf->m_head != NULL) {
bus_dmamap_sync(txr->txtag, txbuf->map,
@@ -589,6 +599,7 @@
txbuf->m_head = NULL;
}
#ifdef DEV_NETMAP
+
/*
* In netmap mode, set the map for the packet buffer.
* NOTE: Some drivers (not this one) also need to set
@@ -607,7 +618,7 @@
#endif /* DEV_NETMAP */
/* Clear the EOP descriptor pointer */
txbuf->eop = NULL;
- }
+ }
#ifdef IXGBE_FDIR
/* Set the rate at which we sample packets */
@@ -623,11 +634,9 @@
IXGBE_TX_UNLOCK(txr);
}
-/*********************************************************************
- *
- * Initialize all transmit rings.
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_setup_transmit_structures - Initialize all transmit rings.
+ ************************************************************************/
int
ixgbe_setup_transmit_structures(struct adapter *adapter)
{
@@ -639,11 +648,9 @@
return (0);
}
-/*********************************************************************
- *
- * Free all transmit rings.
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_free_transmit_structures - Free all transmit rings.
+ ************************************************************************/
void
ixgbe_free_transmit_structures(struct adapter *adapter)
{
@@ -659,17 +666,17 @@
free(adapter->tx_rings, M_DEVBUF);
}
-/*********************************************************************
- *
- * Free transmit ring related data structures.
+/************************************************************************
+ * ixgbe_free_transmit_buffers
*
- **********************************************************************/
+ * Free transmit ring related data structures.
+ ************************************************************************/
static void
ixgbe_free_transmit_buffers(struct tx_ring *txr)
{
- struct adapter *adapter = txr->adapter;
+ struct adapter *adapter = txr->adapter;
struct ixgbe_tx_buf *tx_buffer;
- int i;
+ int i;
INIT_DEBUGOUT("ixgbe_free_transmit_ring: begin");
@@ -681,20 +688,16 @@
if (tx_buffer->m_head != NULL) {
bus_dmamap_sync(txr->txtag, tx_buffer->map,
BUS_DMASYNC_POSTWRITE);
- bus_dmamap_unload(txr->txtag,
- tx_buffer->map);
+ bus_dmamap_unload(txr->txtag, tx_buffer->map);
m_freem(tx_buffer->m_head);
tx_buffer->m_head = NULL;
if (tx_buffer->map != NULL) {
- bus_dmamap_destroy(txr->txtag,
- tx_buffer->map);
+ bus_dmamap_destroy(txr->txtag, tx_buffer->map);
tx_buffer->map = NULL;
}
} else if (tx_buffer->map != NULL) {
- bus_dmamap_unload(txr->txtag,
- tx_buffer->map);
- bus_dmamap_destroy(txr->txtag,
- tx_buffer->map);
+ bus_dmamap_unload(txr->txtag, tx_buffer->map);
+ bus_dmamap_destroy(txr->txtag, tx_buffer->map);
tx_buffer->map = NULL;
}
}
@@ -710,36 +713,34 @@
bus_dma_tag_destroy(txr->txtag);
txr->txtag = NULL;
}
- return;
}
-/*********************************************************************
+/************************************************************************
+ * ixgbe_tx_ctx_setup
*
- * Advanced Context Descriptor setup for VLAN, CSUM or TSO
- *
- **********************************************************************/
-
+ * Advanced Context Descriptor setup for VLAN, CSUM or TSO
+ ************************************************************************/
static int
ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp,
u32 *cmd_type_len, u32 *olinfo_status)
{
- struct adapter *adapter = txr->adapter;
struct ixgbe_adv_tx_context_desc *TXD;
- struct ether_vlan_header *eh;
+ struct ether_vlan_header *eh;
#ifdef INET
- struct ip *ip;
+ struct ip *ip;
#endif
#ifdef INET6
- struct ip6_hdr *ip6;
+ struct ip6_hdr *ip6;
#endif
- u32 vlan_macip_lens = 0, type_tucmd_mlhl = 0;
- int ehdrlen, ip_hlen = 0;
- u16 etype;
- u8 ipproto = 0;
- int offload = TRUE;
- int ctxd = txr->next_avail_desc;
- u16 vtag = 0;
- caddr_t l3d;
+ int ehdrlen, ip_hlen = 0;
+ int offload = TRUE;
+ int ctxd = txr->next_avail_desc;
+ u32 vlan_macip_lens = 0;
+ u32 type_tucmd_mlhl = 0;
+ u16 vtag = 0;
+ u16 etype;
+ u8 ipproto = 0;
+ caddr_t l3d;
/* First check if TSO is to be used */
@@ -750,20 +751,20 @@
offload = FALSE;
/* Indicate the whole packet as payload when not doing TSO */
- *olinfo_status |= mp->m_pkthdr.len << IXGBE_ADVTXD_PAYLEN_SHIFT;
+ *olinfo_status |= mp->m_pkthdr.len << IXGBE_ADVTXD_PAYLEN_SHIFT;
/* Now ready a context descriptor */
TXD = (struct ixgbe_adv_tx_context_desc *) &txr->tx_base[ctxd];
/*
- ** In advanced descriptors the vlan tag must
- ** be placed into the context descriptor. Hence
- ** we need to make one even if not doing offloads.
- */
+ * In advanced descriptors the vlan tag must
+ * be placed into the context descriptor. Hence
+ * we need to make one even if not doing offloads.
+ */
if (mp->m_flags & M_VLANTAG) {
vtag = htole16(mp->m_pkthdr.ether_vtag);
vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
- } else if (!IXGBE_IS_X550VF(adapter) && (offload == FALSE))
+ } else if (!IXGBE_IS_X550VF(txr->adapter) && (offload == FALSE))
return (0);
/*
@@ -787,8 +788,10 @@
goto no_offloads;
/*
- * If the first mbuf only includes the ethernet header, jump to the next one
- * XXX: This assumes the stack splits mbufs containing headers on header boundaries
+ * If the first mbuf only includes the ethernet header,
+ * jump to the next one
+ * XXX: This assumes the stack splits mbufs containing headers
+ * on header boundaries
* XXX: And assumes the entire IP header is contained in one mbuf
*/
if (mp->m_len == ehdrlen && mp->m_next)
@@ -828,19 +831,22 @@
/* No support for offloads for non-L4 next headers */
switch (ipproto) {
case IPPROTO_TCP:
- if (mp->m_pkthdr.csum_flags & (CSUM_IP_TCP | CSUM_IP6_TCP))
+ if (mp->m_pkthdr.csum_flags &
+ (CSUM_IP_TCP | CSUM_IP6_TCP))
type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP;
else
offload = false;
break;
case IPPROTO_UDP:
- if (mp->m_pkthdr.csum_flags & (CSUM_IP_UDP | CSUM_IP6_UDP))
+ if (mp->m_pkthdr.csum_flags &
+ (CSUM_IP_UDP | CSUM_IP6_UDP))
type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_UDP;
else
offload = false;
break;
case IPPROTO_SCTP:
- if (mp->m_pkthdr.csum_flags & (CSUM_IP_SCTP | CSUM_IP6_SCTP))
+ if (mp->m_pkthdr.csum_flags &
+ (CSUM_IP_SCTP | CSUM_IP6_SCTP))
type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_SCTP;
else
offload = false;
@@ -868,32 +874,33 @@
txr->next_avail_desc = ctxd;
--txr->tx_avail;
- return (0);
+ return (0);
}
-/**********************************************************************
- *
- * Setup work for hardware segmentation offload (TSO) on
- * adapters using advanced tx descriptors
+/************************************************************************
+ * ixgbe_tso_setup
*
- **********************************************************************/
+ * Setup work for hardware segmentation offload (TSO) on
+ * adapters using advanced tx descriptors
+ ************************************************************************/
static int
-ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp,
- u32 *cmd_type_len, u32 *olinfo_status)
+ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *cmd_type_len,
+ u32 *olinfo_status)
{
struct ixgbe_adv_tx_context_desc *TXD;
- u32 vlan_macip_lens = 0, type_tucmd_mlhl = 0;
- u32 mss_l4len_idx = 0, paylen;
- u16 vtag = 0, eh_type;
- int ctxd, ehdrlen, ip_hlen, tcp_hlen;
- struct ether_vlan_header *eh;
+ struct ether_vlan_header *eh;
#ifdef INET6
- struct ip6_hdr *ip6;
+ struct ip6_hdr *ip6;
#endif
#ifdef INET
- struct ip *ip;
+ struct ip *ip;
#endif
- struct tcphdr *th;
+ struct tcphdr *th;
+ int ctxd, ehdrlen, ip_hlen, tcp_hlen;
+ u32 vlan_macip_lens = 0;
+ u32 type_tucmd_mlhl = 0;
+ u32 mss_l4len_idx = 0, paylen;
+ u16 vtag = 0, eh_type;
/*
* Determine where frame payload starts.
@@ -909,19 +916,6 @@
}
switch (ntohs(eh_type)) {
-#ifdef INET6
- case ETHERTYPE_IPV6:
- ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen);
- /* XXX-BZ For now we do not pretend to support ext. hdrs. */
- if (ip6->ip6_nxt != IPPROTO_TCP)
- return (ENXIO);
- ip_hlen = sizeof(struct ip6_hdr);
- ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen);
- th = (struct tcphdr *)((caddr_t)ip6 + ip_hlen);
- th->th_sum = in6_cksum_pseudo(ip6, 0, IPPROTO_TCP, 0);
- type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV6;
- break;
-#endif
#ifdef INET
case ETHERTYPE_IP:
ip = (struct ip *)(mp->m_data + ehdrlen);
@@ -937,6 +931,19 @@
*olinfo_status |= IXGBE_TXD_POPTS_IXSM << 8;
break;
#endif
+#ifdef INET6
+ case ETHERTYPE_IPV6:
+ ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen);
+ /* XXX-BZ For now we do not pretend to support ext. hdrs. */
+ if (ip6->ip6_nxt != IPPROTO_TCP)
+ return (ENXIO);
+ ip_hlen = sizeof(struct ip6_hdr);
+ ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen);
+ th = (struct tcphdr *)((caddr_t)ip6 + ip_hlen);
+ th->th_sum = in6_cksum_pseudo(ip6, 0, IPPROTO_TCP, 0);
+ type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV6;
+ break;
+#endif
default:
panic("%s: CSUM_TSO but no supported IP version (0x%04x)",
__func__, ntohs(eh_type));
@@ -954,7 +961,7 @@
/* VLAN MACLEN IPLEN */
if (mp->m_flags & M_VLANTAG) {
vtag = htole16(mp->m_pkthdr.ether_vtag);
- vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
+ vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
}
vlan_macip_lens |= ehdrlen << IXGBE_ADVTXD_MACLEN_SHIFT;
@@ -982,34 +989,32 @@
*olinfo_status |= IXGBE_TXD_POPTS_TXSM << 8;
*olinfo_status |= paylen << IXGBE_ADVTXD_PAYLEN_SHIFT;
++txr->tso_tx;
+
return (0);
-}
+} /* ixgbe_tso_setup */
-/**********************************************************************
- *
- * Examine each tx_buffer in the used queue. If the hardware is done
- * processing the packet then free associated resources. The
- * tx_buffer is put back on the free queue.
+/************************************************************************
+ * ixgbe_txeof
*
- **********************************************************************/
+ * Examine each tx_buffer in the used queue. If the hardware is done
+ * processing the packet then free associated resources. The
+ * tx_buffer is put back on the free queue.
+ ************************************************************************/
void
ixgbe_txeof(struct tx_ring *txr)
{
- struct adapter *adapter = txr->adapter;
-#ifdef DEV_NETMAP
- struct ifnet *ifp = adapter->ifp;
-#endif
- u32 work, processed = 0;
- u32 limit = adapter->tx_process_limit;
- struct ixgbe_tx_buf *buf;
+ struct adapter *adapter = txr->adapter;
+ struct ixgbe_tx_buf *buf;
union ixgbe_adv_tx_desc *txd;
+ u32 work, processed = 0;
+ u32 limit = adapter->tx_process_limit;
mtx_assert(&txr->tx_mtx, MA_OWNED);
#ifdef DEV_NETMAP
- if (ifp->if_capenable & IFCAP_NETMAP) {
- struct netmap_adapter *na = NA(ifp);
+ if (adapter->ifp->if_capenable & IFCAP_NETMAP) {
+ struct netmap_adapter *na = NA(adapter->ifp);
struct netmap_kring *kring = &na->tx_rings[txr->me];
txd = txr->tx_base;
bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
@@ -1030,8 +1035,8 @@
*/
if (!netmap_mitigate ||
(kring->nr_kflags < kring->nkr_num_slots &&
- txd[kring->nr_kflags].wb.status & IXGBE_TXD_STAT_DD)) {
- netmap_tx_irq(ifp, txr->me);
+ txd[kring->nr_kflags].wb.status & IXGBE_TXD_STAT_DD)) {
+ netmap_tx_irq(adapter->ifp, txr->me);
}
return;
}
@@ -1047,8 +1052,8 @@
buf = &txr->tx_buffers[work];
txd = &txr->tx_base[work];
work -= txr->num_desc; /* The distance to ring end */
- bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
- BUS_DMASYNC_POSTREAD);
+ bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
+ BUS_DMASYNC_POSTREAD);
do {
union ixgbe_adv_tx_desc *eop = buf->eop;
@@ -1059,13 +1064,10 @@
break; /* I/O not complete */
if (buf->m_head) {
- txr->bytes +=
- buf->m_head->m_pkthdr.len;
- bus_dmamap_sync(txr->txtag,
- buf->map,
+ txr->bytes += buf->m_head->m_pkthdr.len;
+ bus_dmamap_sync(txr->txtag, buf->map,
BUS_DMASYNC_POSTWRITE);
- bus_dmamap_unload(txr->txtag,
- buf->map);
+ bus_dmamap_unload(txr->txtag, buf->map);
m_freem(buf->m_head);
buf->m_head = NULL;
}
@@ -1084,13 +1086,10 @@
txd = txr->tx_base;
}
if (buf->m_head) {
- txr->bytes +=
- buf->m_head->m_pkthdr.len;
- bus_dmamap_sync(txr->txtag,
- buf->map,
+ txr->bytes += buf->m_head->m_pkthdr.len;
+ bus_dmamap_sync(txr->txtag, buf->map,
BUS_DMASYNC_POSTWRITE);
- bus_dmamap_unload(txr->txtag,
- buf->map);
+ bus_dmamap_unload(txr->txtag, buf->map);
m_freem(buf->m_head);
buf->m_head = NULL;
}
@@ -1121,19 +1120,19 @@
txr->next_to_clean = work;
/*
- ** Queue Hang detection, we know there's
- ** work outstanding or the first return
- ** would have been taken, so increment busy
- ** if nothing managed to get cleaned, then
- ** in local_timer it will be checked and
- ** marked as HUNG if it exceeds a MAX attempt.
- */
+ * Queue Hang detection, we know there's
+ * work outstanding or the first return
+ * would have been taken, so increment busy
+ * if nothing managed to get cleaned, then
+ * in local_timer it will be checked and
+ * marked as HUNG if it exceeds a MAX attempt.
+ */
if ((processed == 0) && (txr->busy != IXGBE_QUEUE_HUNG))
++txr->busy;
/*
- ** If anything gets cleaned we reset state to 1,
- ** note this will turn off HUNG if its set.
- */
+ * If anything gets cleaned we reset state to 1,
+ * note this will turn off HUNG if its set.
+ */
if (processed)
txr->busy = 1;
@@ -1220,10 +1219,11 @@
}
#endif /* IXGBE_FDIR */
-/*
-** Used to detect a descriptor that has
-** been merged by Hardware RSC.
-*/
+/************************************************************************
+ * ixgbe_rsc_count
+ *
+ * Used to detect a descriptor that has been merged by Hardware RSC.
+ ************************************************************************/
static inline u32
ixgbe_rsc_count(union ixgbe_adv_rx_desc *rx)
{
@@ -1231,23 +1231,23 @@
IXGBE_RXDADV_RSCCNT_MASK) >> IXGBE_RXDADV_RSCCNT_SHIFT;
}
-/*********************************************************************
- *
- * Initialize Hardware RSC (LRO) feature on 82599
- * for an RX ring, this is toggled by the LRO capability
- * even though it is transparent to the stack.
+/************************************************************************
+ * ixgbe_setup_hw_rsc
*
- * NOTE: since this HW feature only works with IPV4 and
- * our testing has shown soft LRO to be as effective
- * I have decided to disable this by default.
+ * Initialize Hardware RSC (LRO) feature on 82599
+ * for an RX ring, this is toggled by the LRO capability
+ * even though it is transparent to the stack.
*
- **********************************************************************/
+ * NOTE: Since this HW feature only works with IPv4 and
+ * testing has shown soft LRO to be as effective,
+ * this feature will be disabled by default.
+ ************************************************************************/
static void
ixgbe_setup_hw_rsc(struct rx_ring *rxr)
{
- struct adapter *adapter = rxr->adapter;
- struct ixgbe_hw *hw = &adapter->hw;
- u32 rscctrl, rdrxctl;
+ struct adapter *adapter = rxr->adapter;
+ struct ixgbe_hw *hw = &adapter->hw;
+ u32 rscctrl, rdrxctl;
/* If turning LRO/RSC off we need to disable it */
if ((adapter->ifp->if_capenable & IFCAP_LRO) == 0) {
@@ -1261,16 +1261,16 @@
#ifdef DEV_NETMAP /* crcstrip is optional in netmap */
if (adapter->ifp->if_capenable & IFCAP_NETMAP && !ix_crcstrip)
#endif /* DEV_NETMAP */
- rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP;
+ rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP;
rdrxctl |= IXGBE_RDRXCTL_RSCACKC;
IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl);
rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(rxr->me));
rscctrl |= IXGBE_RSCCTL_RSCEN;
/*
- ** Limit the total number of descriptors that
- ** can be combined, so it does not exceed 64K
- */
+ * Limit the total number of descriptors that
+ * can be combined, so it does not exceed 64K
+ */
if (rxr->mbuf_sz == MCLBYTES)
rscctrl |= IXGBE_RSCCTL_MAXDESC_16;
else if (rxr->mbuf_sz == MJUMPAGESIZE)
@@ -1284,8 +1284,7 @@
/* Enable TCP header recognition */
IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0),
- (IXGBE_READ_REG(hw, IXGBE_PSRTYPE(0)) |
- IXGBE_PSRTYPE_TCPHDR));
+ (IXGBE_READ_REG(hw, IXGBE_PSRTYPE(0)) | IXGBE_PSRTYPE_TCPHDR));
/* Disable RSC for ACK packets */
IXGBE_WRITE_REG(hw, IXGBE_RSCDBU,
@@ -1294,24 +1293,24 @@
rxr->hw_rsc = TRUE;
}
-/*********************************************************************
+/************************************************************************
+ * ixgbe_refresh_mbufs
*
- * Refresh mbuf buffers for RX descriptor rings
- * - now keeps its own state so discards due to resource
- * exhaustion are unnecessary, if an mbuf cannot be obtained
- * it just returns, keeping its placeholder, thus it can simply
- * be recalled to try again.
- *
- **********************************************************************/
+ * Refresh mbuf buffers for RX descriptor rings
+ * - now keeps its own state so discards due to resource
+ * exhaustion are unnecessary, if an mbuf cannot be obtained
+ * it just returns, keeping its placeholder, thus it can simply
+ * be recalled to try again.
+ ************************************************************************/
static void
ixgbe_refresh_mbufs(struct rx_ring *rxr, int limit)
{
- struct adapter *adapter = rxr->adapter;
- bus_dma_segment_t seg[1];
- struct ixgbe_rx_buf *rxbuf;
- struct mbuf *mp;
- int i, j, nsegs, error;
- bool refreshed = FALSE;
+ struct adapter *adapter = rxr->adapter;
+ struct ixgbe_rx_buf *rxbuf;
+ struct mbuf *mp;
+ bus_dma_segment_t seg[1];
+ int i, j, nsegs, error;
+ bool refreshed = FALSE;
i = j = rxr->next_to_refresh;
/* Control the loop with one beyond */
@@ -1321,8 +1320,8 @@
while (j != limit) {
rxbuf = &rxr->rx_buffers[i];
if (rxbuf->buf == NULL) {
- mp = m_getjcl(M_NOWAIT, MT_DATA,
- M_PKTHDR, rxr->mbuf_sz);
+ mp = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR,
+ rxr->mbuf_sz);
if (mp == NULL)
goto update;
if (adapter->max_frame_size <= (MCLBYTES - ETHER_ALIGN))
@@ -1338,11 +1337,10 @@
if ((rxbuf->flags & IXGBE_RX_COPY) == 0) {
/* Get the memory mapping */
bus_dmamap_unload(rxr->ptag, rxbuf->pmap);
- error = bus_dmamap_load_mbuf_sg(rxr->ptag,
- rxbuf->pmap, mp, seg, &nsegs, BUS_DMA_NOWAIT);
+ error = bus_dmamap_load_mbuf_sg(rxr->ptag, rxbuf->pmap,
+ mp, seg, &nsegs, BUS_DMA_NOWAIT);
if (error != 0) {
- printf("Refresh mbufs: payload dmamap load"
- " failure - %d\n", error);
+ printf("Refresh mbufs: payload dmamap load failure - %d\n", error);
m_free(mp);
rxbuf->buf = NULL;
goto update;
@@ -1364,50 +1362,53 @@
if (++j == rxr->num_desc)
j = 0;
}
+
update:
if (refreshed) /* Update hardware tail index */
- IXGBE_WRITE_REG(&adapter->hw,
- rxr->tail, rxr->next_to_refresh);
+ IXGBE_WRITE_REG(&adapter->hw, rxr->tail, rxr->next_to_refresh);
+
return;
}
-/*********************************************************************
+/************************************************************************
+ * ixgbe_allocate_receive_buffers
*
- * Allocate memory for rx_buffer structures. Since we use one
- * rx_buffer per received packet, the maximum number of rx_buffer's
- * that we'll need is equal to the number of receive descriptors
- * that we've allocated.
- *
- **********************************************************************/
+ * Allocate memory for rx_buffer structures. Since we use one
+ * rx_buffer per received packet, the maximum number of rx_buffer's
+ * that we'll need is equal to the number of receive descriptors
+ * that we've allocated.
+ ************************************************************************/
int
ixgbe_allocate_receive_buffers(struct rx_ring *rxr)
{
- struct adapter *adapter = rxr->adapter;
- device_t dev = adapter->dev;
- struct ixgbe_rx_buf *rxbuf;
- int bsize, error;
+ struct adapter *adapter = rxr->adapter;
+ device_t dev = adapter->dev;
+ struct ixgbe_rx_buf *rxbuf;
+ int bsize, error;
bsize = sizeof(struct ixgbe_rx_buf) * rxr->num_desc;
- if (!(rxr->rx_buffers =
- (struct ixgbe_rx_buf *) malloc(bsize,
- M_DEVBUF, M_NOWAIT | M_ZERO))) {
+ if (!(rxr->rx_buffers = (struct ixgbe_rx_buf *)malloc(bsize, M_DEVBUF,
+ M_NOWAIT | M_ZERO))) {
device_printf(dev, "Unable to allocate rx_buffer memory\n");
error = ENOMEM;
goto fail;
}
- if ((error = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */
- 1, 0, /* alignment, bounds */
- BUS_SPACE_MAXADDR, /* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- MJUM16BYTES, /* maxsize */
- 1, /* nsegments */
- MJUM16BYTES, /* maxsegsize */
- 0, /* flags */
- NULL, /* lockfunc */
- NULL, /* lockfuncarg */
- &rxr->ptag))) {
+ if ((error = bus_dma_tag_create(
+ /* parent */ bus_get_dma_tag(dev),
+ /* alignment */ 1,
+ /* bounds */ 0,
+ /* lowaddr */ BUS_SPACE_MAXADDR,
+ /* highaddr */ BUS_SPACE_MAXADDR,
+ /* filter */ NULL,
+ /* filterarg */ NULL,
+ /* maxsize */ MJUM16BYTES,
+ /* nsegments */ 1,
+ /* maxsegsize */ MJUM16BYTES,
+ /* flags */ 0,
+ /* lockfunc */ NULL,
+ /* lockfuncarg */ NULL,
+ &rxr->ptag))) {
device_printf(dev, "Unable to create RX DMA tag\n");
goto fail;
}
@@ -1426,13 +1427,17 @@
fail:
/* Frees all, but can handle partial completion */
ixgbe_free_receive_structures(adapter);
+
return (error);
-}
+} /* ixgbe_allocate_receive_buffers */
-static void
+/************************************************************************
+ * ixgbe_free_receive_ring
+ ************************************************************************/
+static void
ixgbe_free_receive_ring(struct rx_ring *rxr)
-{
- struct ixgbe_rx_buf *rxbuf;
+{
+ struct ixgbe_rx_buf *rxbuf;
for (int i = 0; i < rxr->num_desc; i++) {
rxbuf = &rxr->rx_buffers[i];
@@ -1448,25 +1453,25 @@
}
}
-/*********************************************************************
- *
- * Initialize a receive ring and its buffers.
+/************************************************************************
+ * ixgbe_setup_receive_ring
*
- **********************************************************************/
+ * Initialize a receive ring and its buffers.
+ ************************************************************************/
static int
ixgbe_setup_receive_ring(struct rx_ring *rxr)
{
- struct adapter *adapter;
- struct ifnet *ifp;
- device_t dev;
- struct ixgbe_rx_buf *rxbuf;
- bus_dma_segment_t seg[1];
- struct lro_ctrl *lro = &rxr->lro;
- int rsize, nsegs, error = 0;
+ struct adapter *adapter;
+ struct ifnet *ifp;
+ device_t dev;
+ struct ixgbe_rx_buf *rxbuf;
+ struct lro_ctrl *lro = &rxr->lro;
#ifdef DEV_NETMAP
struct netmap_adapter *na = NA(rxr->adapter->ifp);
- struct netmap_slot *slot;
+ struct netmap_slot *slot;
#endif /* DEV_NETMAP */
+ bus_dma_segment_t seg[1];
+ int rsize, nsegs, error = 0;
adapter = rxr->adapter;
ifp = adapter->ifp;
@@ -1475,7 +1480,6 @@
/* Clear the ring contents */
IXGBE_RX_LOCK(rxr);
#ifdef DEV_NETMAP
- /* same as in ixgbe_setup_transmit_ring() */
slot = netmap_reset(na, NR_RX, rxr->me, 0);
#endif /* DEV_NETMAP */
rsize = roundup2(adapter->num_rx_desc *
@@ -1489,9 +1493,10 @@
/* Now replenish the mbufs */
for (int j = 0; j != rxr->num_desc; ++j) {
- struct mbuf *mp;
+ struct mbuf *mp;
rxbuf = &rxr->rx_buffers[j];
+
#ifdef DEV_NETMAP
/*
* In netmap mode, fill the map and set the buffer
@@ -1513,23 +1518,22 @@
continue;
}
#endif /* DEV_NETMAP */
- rxbuf->flags = 0;
- rxbuf->buf = m_getjcl(M_NOWAIT, MT_DATA,
- M_PKTHDR, adapter->rx_mbuf_sz);
+
+ rxbuf->flags = 0;
+ rxbuf->buf = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR,
+ adapter->rx_mbuf_sz);
if (rxbuf->buf == NULL) {
error = ENOBUFS;
- goto fail;
+ goto fail;
}
mp = rxbuf->buf;
mp->m_pkthdr.len = mp->m_len = rxr->mbuf_sz;
/* Get the memory mapping */
- error = bus_dmamap_load_mbuf_sg(rxr->ptag,
- rxbuf->pmap, mp, seg,
+ error = bus_dmamap_load_mbuf_sg(rxr->ptag, rxbuf->pmap, mp, seg,
&nsegs, BUS_DMA_NOWAIT);
if (error != 0)
- goto fail;
- bus_dmamap_sync(rxr->ptag,
- rxbuf->pmap, BUS_DMASYNC_PREREAD);
+ goto fail;
+ bus_dmamap_sync(rxr->ptag, rxbuf->pmap, BUS_DMASYNC_PREREAD);
/* Update the descriptor and the cached value */
rxr->rx_base[j].read.pkt_addr = htole64(seg[0].ds_addr);
rxbuf->addr = htole64(seg[0].ds_addr);
@@ -1548,8 +1552,8 @@
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
/*
- ** Now set up the LRO interface:
- */
+ * Now set up the LRO interface
+ */
if (ixgbe_rsc_enable)
ixgbe_setup_hw_rsc(rxr);
else if (ifp->if_capenable & IFCAP_LRO) {
@@ -1564,24 +1568,24 @@
}
IXGBE_RX_UNLOCK(rxr);
+
return (0);
fail:
ixgbe_free_receive_ring(rxr);
IXGBE_RX_UNLOCK(rxr);
+
return (error);
}
-/*********************************************************************
- *
- * Initialize all receive rings.
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_setup_receive_structures - Initialize all receive rings.
+ ************************************************************************/
int
ixgbe_setup_receive_structures(struct adapter *adapter)
{
struct rx_ring *rxr = adapter->rx_rings;
- int j;
+ int j;
for (j = 0; j < adapter->num_queues; j++, rxr++)
if (ixgbe_setup_receive_ring(rxr))
@@ -1603,11 +1607,9 @@
}
-/*********************************************************************
- *
- * Free all receive rings.
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_free_receive_structures - Free all receive rings.
+ ************************************************************************/
void
ixgbe_free_receive_structures(struct adapter *adapter)
{
@@ -1616,7 +1618,7 @@
INIT_DEBUGOUT("ixgbe_free_receive_structures: begin");
for (int i = 0; i < adapter->num_queues; i++, rxr++) {
- struct lro_ctrl *lro = &rxr->lro;
+ struct lro_ctrl *lro = &rxr->lro;
ixgbe_free_receive_buffers(rxr);
/* Free LRO memory */
tcp_lro_free(lro);
@@ -1628,16 +1630,14 @@
}
-/*********************************************************************
- *
- * Free receive ring data structures
- *
- **********************************************************************/
+/************************************************************************
+ * ixgbe_free_receive_buffers - Free receive ring data structures
+ ************************************************************************/
void
ixgbe_free_receive_buffers(struct rx_ring *rxr)
{
- struct adapter *adapter = rxr->adapter;
- struct ixgbe_rx_buf *rxbuf;
+ struct adapter *adapter = rxr->adapter;
+ struct ixgbe_rx_buf *rxbuf;
INIT_DEBUGOUT("ixgbe_free_receive_buffers: begin");
@@ -1672,54 +1672,59 @@
return;
}
+/************************************************************************
+ * ixgbe_rx_input
+ ************************************************************************/
static __inline void
-ixgbe_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, u32 ptype)
+ixgbe_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m,
+ u32 ptype)
{
-
- /*
- * ATM LRO is only for IP/TCP packets and TCP checksum of the packet
- * should be computed by hardware. Also it should not have VLAN tag in
- * ethernet header. In case of IPv6 we do not yet support ext. hdrs.
- */
- if (rxr->lro_enabled &&
- (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 &&
- (ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 &&
- ((ptype & (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP)) ==
- (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP) ||
- (ptype & (IXGBE_RXDADV_PKTTYPE_IPV6 | IXGBE_RXDADV_PKTTYPE_TCP)) ==
- (IXGBE_RXDADV_PKTTYPE_IPV6 | IXGBE_RXDADV_PKTTYPE_TCP)) &&
- (m->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) ==
- (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) {
- /*
- * Send to the stack if:
- ** - LRO not enabled, or
- ** - no LRO resources, or
- ** - lro enqueue fails
- */
- if (rxr->lro.lro_cnt != 0)
- if (tcp_lro_rx(&rxr->lro, m, 0) == 0)
- return;
- }
+ /*
+ * ATM LRO is only for IP/TCP packets and TCP checksum of the packet
+ * should be computed by hardware. Also it should not have VLAN tag in
+ * ethernet header. In case of IPv6 we do not yet support ext. hdrs.
+ */
+ if (rxr->lro_enabled &&
+ (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 &&
+ (ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 &&
+ ((ptype & (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP)) ==
+ (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP) ||
+ (ptype & (IXGBE_RXDADV_PKTTYPE_IPV6 | IXGBE_RXDADV_PKTTYPE_TCP)) ==
+ (IXGBE_RXDADV_PKTTYPE_IPV6 | IXGBE_RXDADV_PKTTYPE_TCP)) &&
+ (m->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) ==
+ (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) {
+ /*
+ * Send to the stack if:
+ * - LRO not enabled, or
+ * - no LRO resources, or
+ * - lro enqueue fails
+ */
+ if (rxr->lro.lro_cnt != 0)
+ if (tcp_lro_rx(&rxr->lro, m, 0) == 0)
+ return;
+ }
IXGBE_RX_UNLOCK(rxr);
- (*ifp->if_input)(ifp, m);
+ (*ifp->if_input)(ifp, m);
IXGBE_RX_LOCK(rxr);
}
+/************************************************************************
+ * ixgbe_rx_discard
+ ************************************************************************/
static __inline void
ixgbe_rx_discard(struct rx_ring *rxr, int i)
{
- struct ixgbe_rx_buf *rbuf;
+ struct ixgbe_rx_buf *rbuf;
rbuf = &rxr->rx_buffers[i];
-
/*
- ** With advanced descriptors the writeback
- ** clobbers the buffer addrs, so its easier
- ** to just free the existing mbufs and take
- ** the normal refresh path to get new buffers
- ** and mapping.
- */
+ * With advanced descriptors the writeback
+ * clobbers the buffer addrs, so its easier
+ * to just free the existing mbufs and take
+ * the normal refresh path to get new buffers
+ * and mapping.
+ */
if (rbuf->fmp != NULL) {/* Partial chain ? */
rbuf->fmp->m_flags |= M_PKTHDR;
@@ -1733,32 +1738,33 @@
bus_dmamap_unload(rxr->ptag, rbuf->pmap);
rbuf->flags = 0;
-
+
return;
}
-/*********************************************************************
+/************************************************************************
+ * ixgbe_rxeof
*
- * This routine executes in interrupt context. It replenishes
- * the mbufs in the descriptor and sends data which has been
- * dma'ed into host memory to upper layer.
+ * This routine executes in interrupt context. It replenishes
+ * the mbufs in the descriptor and sends data which has been
+ * dma'ed into host memory to upper layer.
*
- * Return TRUE for more work, FALSE for all clean.
- *********************************************************************/
+ * Return TRUE for more work, FALSE for all clean.
+ ************************************************************************/
bool
ixgbe_rxeof(struct ix_queue *que)
{
- struct adapter *adapter = que->adapter;
- struct rx_ring *rxr = que->rxr;
- struct ifnet *ifp = adapter->ifp;
- struct lro_ctrl *lro = &rxr->lro;
- int i, nextp, processed = 0;
- u32 staterr = 0;
- u32 count = adapter->rx_process_limit;
- union ixgbe_adv_rx_desc *cur;
- struct ixgbe_rx_buf *rbuf, *nbuf;
- u16 pkt_info;
+ struct adapter *adapter = que->adapter;
+ struct rx_ring *rxr = que->rxr;
+ struct ifnet *ifp = adapter->ifp;
+ struct lro_ctrl *lro = &rxr->lro;
+ union ixgbe_adv_rx_desc *cur;
+ struct ixgbe_rx_buf *rbuf, *nbuf;
+ int i, nextp, processed = 0;
+ u32 staterr = 0;
+ u32 count = adapter->rx_process_limit;
+ u16 pkt_info;
IXGBE_RX_LOCK(rxr);
@@ -1771,12 +1777,12 @@
#endif /* DEV_NETMAP */
for (i = rxr->next_to_check; count != 0;) {
- struct mbuf *sendmp, *mp;
- u32 rsc, ptype;
- u16 len;
- u16 vtag = 0;
- bool eop;
-
+ struct mbuf *sendmp, *mp;
+ u32 rsc, ptype;
+ u16 len;
+ u16 vtag = 0;
+ bool eop;
+
/* Sync the ring. */
bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
@@ -1815,29 +1821,28 @@
}
/*
- ** On 82599 which supports a hardware
- ** LRO (called HW RSC), packets need
- ** not be fragmented across sequential
- ** descriptors, rather the next descriptor
- ** is indicated in bits of the descriptor.
- ** This also means that we might proceses
- ** more than one packet at a time, something
- ** that has never been true before, it
- ** required eliminating global chain pointers
- ** in favor of what we are doing here. -jfv
- */
+ * On 82599 which supports a hardware
+ * LRO (called HW RSC), packets need
+ * not be fragmented across sequential
+ * descriptors, rather the next descriptor
+ * is indicated in bits of the descriptor.
+ * This also means that we might proceses
+ * more than one packet at a time, something
+ * that has never been true before, it
+ * required eliminating global chain pointers
+ * in favor of what we are doing here. -jfv
+ */
if (!eop) {
/*
- ** Figure out the next descriptor
- ** of this frame.
- */
+ * Figure out the next descriptor
+ * of this frame.
+ */
if (rxr->hw_rsc == TRUE) {
rsc = ixgbe_rsc_count(cur);
rxr->rsc_num += (rsc - 1);
}
if (rsc) { /* Get hardware index */
- nextp = ((staterr &
- IXGBE_RXDADV_NEXTP_MASK) >>
+ nextp = ((staterr & IXGBE_RXDADV_NEXTP_MASK) >>
IXGBE_RXDADV_NEXTP_SHIFT);
} else { /* Just sequential */
nextp = i + 1;
@@ -1848,16 +1853,16 @@
prefetch(nbuf);
}
/*
- ** Rather than using the fmp/lmp global pointers
- ** we now keep the head of a packet chain in the
- ** buffer struct and pass this along from one
- ** descriptor to the next, until we get EOP.
- */
+ * Rather than using the fmp/lmp global pointers
+ * we now keep the head of a packet chain in the
+ * buffer struct and pass this along from one
+ * descriptor to the next, until we get EOP.
+ */
mp->m_len = len;
/*
- ** See if there is a stored head
- ** that determines what we are
- */
+ * See if there is a stored head
+ * that determines what we are
+ */
sendmp = rbuf->fmp;
if (sendmp != NULL) { /* secondary frag */
rbuf->buf = rbuf->fmp = NULL;
@@ -1873,10 +1878,9 @@
if (eop && len <= IXGBE_RX_COPY_LEN) {
sendmp = m_gethdr(M_NOWAIT, MT_DATA);
if (sendmp != NULL) {
- sendmp->m_data +=
- IXGBE_RX_COPY_ALIGN;
- ixgbe_bcopy(mp->m_data,
- sendmp->m_data, len);
+ sendmp->m_data += IXGBE_RX_COPY_ALIGN;
+ ixgbe_bcopy(mp->m_data, sendmp->m_data,
+ len);
sendmp->m_len = len;
rxr->rx_copies++;
rbuf->flags |= IXGBE_RX_COPY;
@@ -1905,8 +1909,7 @@
rxr->bytes += sendmp->m_pkthdr.len;
rxr->rx_bytes += sendmp->m_pkthdr.len;
/* Process vlan info */
- if ((rxr->vtag_strip) &&
- (staterr & IXGBE_RXD_STAT_VP))
+ if ((rxr->vtag_strip) && (staterr & IXGBE_RXD_STAT_VP))
vtag = le16toh(cur->wb.upper.vlan);
if (vtag) {
sendmp->m_pkthdr.ether_vtag = vtag;
@@ -1915,59 +1918,59 @@
if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
ixgbe_rx_checksum(staterr, sendmp, ptype);
- /*
- * In case of multiqueue, we have RXCSUM.PCSD bit set
- * and never cleared. This means we have RSS hash
- * available to be used.
- */
- if (adapter->num_queues > 1) {
- sendmp->m_pkthdr.flowid =
- le32toh(cur->wb.lower.hi_dword.rss);
- switch (pkt_info & IXGBE_RXDADV_RSSTYPE_MASK) {
- case IXGBE_RXDADV_RSSTYPE_IPV4:
- M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_RSS_IPV4);
- break;
- case IXGBE_RXDADV_RSSTYPE_IPV4_TCP:
- M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_RSS_TCP_IPV4);
- break;
- case IXGBE_RXDADV_RSSTYPE_IPV6:
- M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_RSS_IPV6);
- break;
- case IXGBE_RXDADV_RSSTYPE_IPV6_TCP:
- M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_RSS_TCP_IPV6);
- break;
- case IXGBE_RXDADV_RSSTYPE_IPV6_EX:
- M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_RSS_IPV6_EX);
- break;
- case IXGBE_RXDADV_RSSTYPE_IPV6_TCP_EX:
- M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_RSS_TCP_IPV6_EX);
- break;
+ /*
+ * In case of multiqueue, we have RXCSUM.PCSD bit set
+ * and never cleared. This means we have RSS hash
+ * available to be used.
+ */
+ if (adapter->num_queues > 1) {
+ sendmp->m_pkthdr.flowid =
+ le32toh(cur->wb.lower.hi_dword.rss);
+ switch (pkt_info & IXGBE_RXDADV_RSSTYPE_MASK) {
+ case IXGBE_RXDADV_RSSTYPE_IPV4:
+ M_HASHTYPE_SET(sendmp,
+ M_HASHTYPE_RSS_IPV4);
+ break;
+ case IXGBE_RXDADV_RSSTYPE_IPV4_TCP:
+ M_HASHTYPE_SET(sendmp,
+ M_HASHTYPE_RSS_TCP_IPV4);
+ break;
+ case IXGBE_RXDADV_RSSTYPE_IPV6:
+ M_HASHTYPE_SET(sendmp,
+ M_HASHTYPE_RSS_IPV6);
+ break;
+ case IXGBE_RXDADV_RSSTYPE_IPV6_TCP:
+ M_HASHTYPE_SET(sendmp,
+ M_HASHTYPE_RSS_TCP_IPV6);
+ break;
+ case IXGBE_RXDADV_RSSTYPE_IPV6_EX:
+ M_HASHTYPE_SET(sendmp,
+ M_HASHTYPE_RSS_IPV6_EX);
+ break;
+ case IXGBE_RXDADV_RSSTYPE_IPV6_TCP_EX:
+ M_HASHTYPE_SET(sendmp,
+ M_HASHTYPE_RSS_TCP_IPV6_EX);
+ break;
#if __FreeBSD_version > 1100000
- case IXGBE_RXDADV_RSSTYPE_IPV4_UDP:
- M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_RSS_UDP_IPV4);
- break;
- case IXGBE_RXDADV_RSSTYPE_IPV6_UDP:
- M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_RSS_UDP_IPV6);
- break;
- case IXGBE_RXDADV_RSSTYPE_IPV6_UDP_EX:
- M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_RSS_UDP_IPV6_EX);
- break;
+ case IXGBE_RXDADV_RSSTYPE_IPV4_UDP:
+ M_HASHTYPE_SET(sendmp,
+ M_HASHTYPE_RSS_UDP_IPV4);
+ break;
+ case IXGBE_RXDADV_RSSTYPE_IPV6_UDP:
+ M_HASHTYPE_SET(sendmp,
+ M_HASHTYPE_RSS_UDP_IPV6);
+ break;
+ case IXGBE_RXDADV_RSSTYPE_IPV6_UDP_EX:
+ M_HASHTYPE_SET(sendmp,
+ M_HASHTYPE_RSS_UDP_IPV6_EX);
+ break;
#endif
- default:
- M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_OPAQUE_HASH);
- }
- } else {
- sendmp->m_pkthdr.flowid = que->msix;
+ default:
+ M_HASHTYPE_SET(sendmp,
+ M_HASHTYPE_OPAQUE_HASH);
+ }
+ } else {
+ sendmp->m_pkthdr.flowid = que->msix;
M_HASHTYPE_SET(sendmp, M_HASHTYPE_OPAQUE);
}
}
@@ -1986,7 +1989,7 @@
i = rxr->next_to_check;
}
- /* Every 8 descriptors we go to refresh mbufs */
+ /* Every 8 descriptors we go to refresh mbufs */
if (processed == 8) {
ixgbe_refresh_mbufs(rxr, i);
processed = 0;
@@ -2007,28 +2010,28 @@
IXGBE_RX_UNLOCK(rxr);
/*
- ** Still have cleaning to do?
- */
+ * Still have cleaning to do?
+ */
if ((staterr & IXGBE_RXD_STAT_DD) != 0)
return (TRUE);
- else
- return (FALSE);
+
+ return (FALSE);
}
-/*********************************************************************
- *
- * Verify that the hardware indicated that the checksum is valid.
- * Inform the stack about the status of checksum so that stack
- * doesn't spend time verifying the checksum.
+/************************************************************************
+ * ixgbe_rx_checksum
*
- *********************************************************************/
+ * Verify that the hardware indicated that the checksum is valid.
+ * Inform the stack about the status of checksum so that stack
+ * doesn't spend time verifying the checksum.
+ ************************************************************************/
static void
ixgbe_rx_checksum(u32 staterr, struct mbuf * mp, u32 ptype)
{
- u16 status = (u16) staterr;
- u8 errors = (u8) (staterr >> 24);
- bool sctp = false;
+ u16 status = (u16) staterr;
+ u8 errors = (u8) (staterr >> 24);
+ bool sctp = false;
if ((ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 &&
(ptype & IXGBE_RXDADV_PKTTYPE_SCTP) != 0)
@@ -2052,9 +2055,9 @@
}
}
-/********************************************************************
+/************************************************************************
* Manage DMA'able memory.
- *******************************************************************/
+ ************************************************************************/
static void
ixgbe_dmamap_cb(void *arg, bus_dma_segment_t * segs, int nseg, int error)
{
@@ -2127,55 +2130,55 @@
}
-/*********************************************************************
+/************************************************************************
+ * ixgbe_allocate_queues
*
- * Allocate memory for the transmit and receive rings, and then
- * the descriptors associated with each, called only once at attach.
- *
- **********************************************************************/
+ * Allocate memory for the transmit and receive rings, and then
+ * the descriptors associated with each, called only once at attach.
+ ************************************************************************/
int
ixgbe_allocate_queues(struct adapter *adapter)
{
- device_t dev = adapter->dev;
- struct ix_queue *que;
- struct tx_ring *txr;
- struct rx_ring *rxr;
- int rsize, tsize, error = IXGBE_SUCCESS;
- int txconf = 0, rxconf = 0;
+ device_t dev = adapter->dev;
+ struct ix_queue *que;
+ struct tx_ring *txr;
+ struct rx_ring *rxr;
+ int rsize, tsize, error = IXGBE_SUCCESS;
+ int txconf = 0, rxconf = 0;
#ifdef PCI_IOV
enum ixgbe_iov_mode iov_mode;
#endif
- /* First allocate the top level queue structs */
- if (!(adapter->queues =
- (struct ix_queue *) malloc(sizeof(struct ix_queue) *
- adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
- device_printf(dev, "Unable to allocate queue memory\n");
- error = ENOMEM;
- goto fail;
- }
-
- /* First allocate the TX ring struct memory */
- if (!(adapter->tx_rings =
- (struct tx_ring *) malloc(sizeof(struct tx_ring) *
- adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
+ /* First, allocate the top level queue structs */
+ adapter->queues = (struct ix_queue *)malloc(sizeof(struct ix_queue) *
+ adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO);
+ if (!adapter->queues) {
+ device_printf(dev, "Unable to allocate queue memory\n");
+ error = ENOMEM;
+ goto fail;
+ }
+
+ /* Second, allocate the TX ring struct memory */
+ adapter->tx_rings = (struct tx_ring *)malloc(sizeof(struct tx_ring) *
+ adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO);
+ if (!adapter->tx_rings) {
device_printf(dev, "Unable to allocate TX ring memory\n");
error = ENOMEM;
goto tx_fail;
}
- /* Next allocate the RX */
- if (!(adapter->rx_rings =
- (struct rx_ring *) malloc(sizeof(struct rx_ring) *
- adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
+ /* Third, allocate the RX ring */
+ adapter->rx_rings = (struct rx_ring *)malloc(sizeof(struct rx_ring) *
+ adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO);
+ if (!adapter->rx_rings) {
device_printf(dev, "Unable to allocate RX ring memory\n");
error = ENOMEM;
goto rx_fail;
}
/* For the ring itself */
- tsize = roundup2(adapter->num_tx_desc *
- sizeof(union ixgbe_adv_tx_desc), DBA_ALIGN);
+ tsize = roundup2(adapter->num_tx_desc * sizeof(union ixgbe_adv_tx_desc),
+ DBA_ALIGN);
#ifdef PCI_IOV
iov_mode = ixgbe_get_iov_mode(adapter);
@@ -2187,7 +2190,7 @@
* Now set up the TX queues, txconf is needed to handle the
* possibility that things fail midcourse and we need to
* undo memory gracefully
- */
+ */
for (int i = 0; i < adapter->num_queues; i++, txconf++) {
/* Set up some basics */
txr = &adapter->tx_rings[i];
@@ -2204,8 +2207,8 @@
device_get_nameunit(dev), txr->me);
mtx_init(&txr->tx_mtx, txr->mtx_name, NULL, MTX_DEF);
- if (ixgbe_dma_malloc(adapter, tsize,
- &txr->txdma, BUS_DMA_NOWAIT)) {
+ if (ixgbe_dma_malloc(adapter, tsize, &txr->txdma,
+ BUS_DMA_NOWAIT)) {
device_printf(dev,
"Unable to allocate TX Descriptor memory\n");
error = ENOMEM;
@@ -2214,8 +2217,8 @@
txr->tx_base = (union ixgbe_adv_tx_desc *)txr->txdma.dma_vaddr;
bzero((void *)txr->tx_base, tsize);
- /* Now allocate transmit buffers for the ring */
- if (ixgbe_allocate_transmit_buffers(txr)) {
+ /* Now allocate transmit buffers for the ring */
+ if (ixgbe_allocate_transmit_buffers(txr)) {
device_printf(dev,
"Critical Failure setting up transmit buffers\n");
error = ENOMEM;
@@ -2236,9 +2239,9 @@
/*
* Next the RX queues...
- */
- rsize = roundup2(adapter->num_rx_desc *
- sizeof(union ixgbe_adv_rx_desc), DBA_ALIGN);
+ */
+ rsize = roundup2(adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc),
+ DBA_ALIGN);
for (int i = 0; i < adapter->num_queues; i++, rxconf++) {
rxr = &adapter->rx_rings[i];
/* Set up some basics */
@@ -2255,8 +2258,8 @@
device_get_nameunit(dev), rxr->me);
mtx_init(&rxr->rx_mtx, rxr->mtx_name, NULL, MTX_DEF);
- if (ixgbe_dma_malloc(adapter, rsize,
- &rxr->rxdma, BUS_DMA_NOWAIT)) {
+ if (ixgbe_dma_malloc(adapter, rsize, &rxr->rxdma,
+ BUS_DMA_NOWAIT)) {
device_printf(dev,
"Unable to allocate RxDescriptor memory\n");
error = ENOMEM;
@@ -2265,7 +2268,7 @@
rxr->rx_base = (union ixgbe_adv_rx_desc *)rxr->rxdma.dma_vaddr;
bzero((void *)rxr->rx_base, rsize);
- /* Allocate receive buffers for the ring*/
+ /* Allocate receive buffers for the ring */
if (ixgbe_allocate_receive_buffers(rxr)) {
device_printf(dev,
"Critical Failure setting up receive buffers\n");
@@ -2275,8 +2278,8 @@
}
/*
- ** Finally set up the queue holding structs
- */
+ * Finally set up the queue holding structs
+ */
for (int i = 0; i < adapter->num_queues; i++) {
que = &adapter->queues[i];
que->adapter = adapter;
@@ -2300,4 +2303,4 @@
free(adapter->queues, M_DEVBUF);
fail:
return (error);
-}
+} /* ixgbe_allocate_queues */
Index: sys/dev/ixgbe/ixgbe.h
===================================================================
--- sys/dev/ixgbe/ixgbe.h
+++ sys/dev/ixgbe/ixgbe.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -117,60 +117,60 @@
* bytes. Performance tests have show the 2K value to be optimal for top
* performance.
*/
-#define DEFAULT_TXD 1024
-#define PERFORM_TXD 2048
-#define MAX_TXD 4096
-#define MIN_TXD 64
+#define DEFAULT_TXD 1024
+#define PERFORM_TXD 2048
+#define MAX_TXD 4096
+#define MIN_TXD 64
/*
* RxDescriptors Valid Range: 64-4096 Default Value: 256 This value is the
* number of receive descriptors allocated for each RX queue. Increasing this
* value allows the driver to buffer more incoming packets. Each descriptor
- * is 16 bytes. A receive buffer is also allocated for each descriptor.
- *
- * Note: with 8 rings and a dual port card, it is possible to bump up
- * against the system mbuf pool limit, you can tune nmbclusters
- * to adjust for this.
+ * is 16 bytes. A receive buffer is also allocated for each descriptor.
+ *
+ * Note: with 8 rings and a dual port card, it is possible to bump up
+ * against the system mbuf pool limit, you can tune nmbclusters
+ * to adjust for this.
*/
-#define DEFAULT_RXD 1024
-#define PERFORM_RXD 2048
-#define MAX_RXD 4096
-#define MIN_RXD 64
+#define DEFAULT_RXD 1024
+#define PERFORM_RXD 2048
+#define MAX_RXD 4096
+#define MIN_RXD 64
/* Alignment for rings */
-#define DBA_ALIGN 128
+#define DBA_ALIGN 128
/*
* This is the max watchdog interval, ie. the time that can
* pass between any two TX clean operations, such only happening
* when the TX hardware is functioning.
*/
-#define IXGBE_WATCHDOG (10 * hz)
+#define IXGBE_WATCHDOG (10 * hz)
/*
* This parameters control when the driver calls the routine to reclaim
* transmit descriptors.
*/
-#define IXGBE_TX_CLEANUP_THRESHOLD (adapter->num_tx_desc / 8)
-#define IXGBE_TX_OP_THRESHOLD (adapter->num_tx_desc / 32)
+#define IXGBE_TX_CLEANUP_THRESHOLD (adapter->num_tx_desc / 8)
+#define IXGBE_TX_OP_THRESHOLD (adapter->num_tx_desc / 32)
/* These defines are used in MTU calculations */
-#define IXGBE_MAX_FRAME_SIZE 9728
-#define IXGBE_MTU_HDR (ETHER_HDR_LEN + ETHER_CRC_LEN)
-#define IXGBE_MTU_HDR_VLAN (ETHER_HDR_LEN + ETHER_CRC_LEN + \
- ETHER_VLAN_ENCAP_LEN)
-#define IXGBE_MAX_MTU (IXGBE_MAX_FRAME_SIZE - IXGBE_MTU_HDR)
-#define IXGBE_MAX_MTU_VLAN (IXGBE_MAX_FRAME_SIZE - IXGBE_MTU_HDR_VLAN)
+#define IXGBE_MAX_FRAME_SIZE 9728
+#define IXGBE_MTU_HDR (ETHER_HDR_LEN + ETHER_CRC_LEN)
+#define IXGBE_MTU_HDR_VLAN (ETHER_HDR_LEN + ETHER_CRC_LEN + \
+ ETHER_VLAN_ENCAP_LEN)
+#define IXGBE_MAX_MTU (IXGBE_MAX_FRAME_SIZE - IXGBE_MTU_HDR)
+#define IXGBE_MAX_MTU_VLAN (IXGBE_MAX_FRAME_SIZE - IXGBE_MTU_HDR_VLAN)
/* Flow control constants */
-#define IXGBE_FC_PAUSE 0xFFFF
-#define IXGBE_FC_HI 0x20000
-#define IXGBE_FC_LO 0x10000
+#define IXGBE_FC_PAUSE 0xFFFF
+#define IXGBE_FC_HI 0x20000
+#define IXGBE_FC_LO 0x10000
/*
* Used for optimizing small rx mbufs. Effort is made to keep the copy
* small and aligned for the CPU L1 cache.
- *
+ *
* MHLEN is typically 168 bytes, giving us 8-byte alignment. Getting
* 32 byte alignment needed for the fast bcopy results in 8 bytes being
* wasted. Getting 64 byte alignment, which _should_ be ideal for
@@ -178,11 +178,11 @@
* in observed efficiency of the optimization, 97.9% -> 81.8%.
*/
#if __FreeBSD_version < 1002000
-#define MPKTHSIZE (sizeof(struct m_hdr) + sizeof(struct pkthdr))
+#define MPKTHSIZE (sizeof(struct m_hdr) + sizeof(struct pkthdr))
#endif
-#define IXGBE_RX_COPY_HDR_PADDED ((((MPKTHSIZE - 1) / 32) + 1) * 32)
-#define IXGBE_RX_COPY_LEN (MSIZE - IXGBE_RX_COPY_HDR_PADDED)
-#define IXGBE_RX_COPY_ALIGN (IXGBE_RX_COPY_HDR_PADDED - MPKTHSIZE)
+#define IXGBE_RX_COPY_HDR_PADDED ((((MPKTHSIZE - 1) / 32) + 1) * 32)
+#define IXGBE_RX_COPY_LEN (MSIZE - IXGBE_RX_COPY_HDR_PADDED)
+#define IXGBE_RX_COPY_ALIGN (IXGBE_RX_COPY_HDR_PADDED - MPKTHSIZE)
/* Keep older OS drivers building... */
#if !defined(SYSCTL_ADD_UQUAD)
@@ -205,29 +205,29 @@
#define HW_DEBUGOUT2(S, A, B) if (DEBUG_HW) printf(S "\n", A, B)
#define MAX_NUM_MULTICAST_ADDRESSES 128
-#define IXGBE_82598_SCATTER 100
-#define IXGBE_82599_SCATTER 32
-#define MSIX_82598_BAR 3
-#define MSIX_82599_BAR 4
-#define IXGBE_TSO_SIZE 262140
-#define IXGBE_RX_HDR 128
-#define IXGBE_VFTA_SIZE 128
-#define IXGBE_BR_SIZE 4096
-#define IXGBE_QUEUE_MIN_FREE 32
-#define IXGBE_MAX_TX_BUSY 10
-#define IXGBE_QUEUE_HUNG 0x80000000
-
-#define IXV_EITR_DEFAULT 128
+#define IXGBE_82598_SCATTER 100
+#define IXGBE_82599_SCATTER 32
+#define MSIX_82598_BAR 3
+#define MSIX_82599_BAR 4
+#define IXGBE_TSO_SIZE 262140
+#define IXGBE_RX_HDR 128
+#define IXGBE_VFTA_SIZE 128
+#define IXGBE_BR_SIZE 4096
+#define IXGBE_QUEUE_MIN_FREE 32
+#define IXGBE_MAX_TX_BUSY 10
+#define IXGBE_QUEUE_HUNG 0x80000000
+
+#define IXV_EITR_DEFAULT 128
/* Supported offload bits in mbuf flag */
#if __FreeBSD_version >= 1000000
-#define CSUM_OFFLOAD (CSUM_IP_TSO|CSUM_IP6_TSO|CSUM_IP| \
- CSUM_IP_UDP|CSUM_IP_TCP|CSUM_IP_SCTP| \
- CSUM_IP6_UDP|CSUM_IP6_TCP|CSUM_IP6_SCTP)
+#define CSUM_OFFLOAD (CSUM_IP_TSO|CSUM_IP6_TSO|CSUM_IP| \
+ CSUM_IP_UDP|CSUM_IP_TCP|CSUM_IP_SCTP| \
+ CSUM_IP6_UDP|CSUM_IP6_TCP|CSUM_IP6_SCTP)
#elif __FreeBSD_version >= 800000
-#define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
+#define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
#else
-#define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP)
+#define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP)
#endif
/* Backward compatibility items for very old versions */
@@ -240,16 +240,16 @@
#endif
/*
- * Interrupt Moderation parameters
+ * Interrupt Moderation parameters
*/
-#define IXGBE_LOW_LATENCY 128
-#define IXGBE_AVE_LATENCY 400
-#define IXGBE_BULK_LATENCY 1200
+#define IXGBE_LOW_LATENCY 128
+#define IXGBE_AVE_LATENCY 400
+#define IXGBE_BULK_LATENCY 1200
/* Using 1FF (the max value), the interval is ~1.05ms */
-#define IXGBE_LINK_ITR_QUANTA 0x1FF
-#define IXGBE_LINK_ITR ((IXGBE_LINK_ITR_QUANTA << 3) & \
- IXGBE_EITR_ITR_INT_MASK)
+#define IXGBE_LINK_ITR_QUANTA 0x1FF
+#define IXGBE_LINK_ITR ((IXGBE_LINK_ITR_QUANTA << 3) & \
+ IXGBE_EITR_ITR_INT_MASK)
/* MAC type macros */
#define IXGBE_IS_X550VF(_adapter) \
@@ -285,112 +285,112 @@
#endif /* PCI_IOV */
-/*
- *****************************************************************************
+/************************************************************************
* vendor_info_array
- *
- * This array contains the list of Subvendor/Subdevice IDs on which the driver
- * should load.
- *
- *****************************************************************************
- */
+ *
+ * This array contains the list of Subvendor/Subdevice IDs on
+ * which the driver should load.
+ ************************************************************************/
typedef struct _ixgbe_vendor_info_t {
- unsigned int vendor_id;
- unsigned int device_id;
- unsigned int subvendor_id;
- unsigned int subdevice_id;
- unsigned int index;
+ unsigned int vendor_id;
+ unsigned int device_id;
+ unsigned int subvendor_id;
+ unsigned int subdevice_id;
+ unsigned int index;
} ixgbe_vendor_info_t;
struct ixgbe_tx_buf {
- union ixgbe_adv_tx_desc *eop;
- struct mbuf *m_head;
- bus_dmamap_t map;
+ union ixgbe_adv_tx_desc *eop;
+ struct mbuf *m_head;
+ bus_dmamap_t map;
};
struct ixgbe_rx_buf {
- struct mbuf *buf;
- struct mbuf *fmp;
- bus_dmamap_t pmap;
- u_int flags;
-#define IXGBE_RX_COPY 0x01
- uint64_t addr;
+ struct mbuf *buf;
+ struct mbuf *fmp;
+ bus_dmamap_t pmap;
+ u_int flags;
+#define IXGBE_RX_COPY 0x01
+ uint64_t addr;
};
/*
- * Bus dma allocation structure used by ixgbe_dma_malloc and ixgbe_dma_free.
+ * Bus dma allocation structure used by ixgbe_dma_malloc and ixgbe_dma_free
*/
struct ixgbe_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;
- bus_size_t dma_size;
- int dma_nseg;
+ 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;
+ bus_size_t dma_size;
+ int dma_nseg;
};
struct ixgbe_mc_addr {
- u8 addr[IXGBE_ETH_LENGTH_OF_ADDRESS];
+ u8 addr[IXGBE_ETH_LENGTH_OF_ADDRESS];
u32 vmdq;
};
/*
-** Driver queue struct: this is the interrupt container
-** for the associated tx and rx ring.
-*/
+ * Driver queue struct: this is the interrupt container
+ * for the associated tx and rx ring.
+ */
struct ix_queue {
- struct adapter *adapter;
- u32 msix; /* This queue's MSIX vector */
- u32 eims; /* This queue's EIMS bit */
- u32 eitr_setting;
- u32 me;
- struct resource *res;
- void *tag;
- int busy;
- struct tx_ring *txr;
- struct rx_ring *rxr;
- struct task que_task;
- struct taskqueue *tq;
- u64 irqs;
+ struct adapter *adapter;
+ u32 msix; /* This queue's MSI-X vector */
+ u32 eims; /* This queue's EIMS bit */
+ u32 eitr_setting;
+ u32 me;
+ struct resource *res;
+ void *tag;
+ int busy;
+ struct tx_ring *txr;
+ struct rx_ring *rxr;
+ struct task que_task;
+ struct taskqueue *tq;
+ u64 irqs;
};
/*
* The transmit ring, one per queue
*/
struct tx_ring {
- struct adapter *adapter;
- struct mtx tx_mtx;
- u32 me;
- u32 tail;
- int busy;
- union ixgbe_adv_tx_desc *tx_base;
- struct ixgbe_tx_buf *tx_buffers;
- struct ixgbe_dma_alloc txdma;
- volatile u16 tx_avail;
- u16 next_avail_desc;
- u16 next_to_clean;
- u16 num_desc;
- u32 txd_cmd;
- bus_dma_tag_t txtag;
- char mtx_name[16];
+ struct adapter *adapter;
+ struct mtx tx_mtx;
+ u32 me;
+ u32 tail;
+ int busy;
+ union ixgbe_adv_tx_desc *tx_base;
+ struct ixgbe_tx_buf *tx_buffers;
+ struct ixgbe_dma_alloc txdma;
+ volatile u16 tx_avail;
+ u16 next_avail_desc;
+ u16 next_to_clean;
+ u16 num_desc;
+ u32 txd_cmd;
+ bus_dma_tag_t txtag;
+ char mtx_name[16];
#ifndef IXGBE_LEGACY_TX
- struct buf_ring *br;
- struct task txq_task;
+ struct buf_ring *br;
+ struct task txq_task;
#endif
#ifdef IXGBE_FDIR
- u16 atr_sample;
- u16 atr_count;
+
+ /* Flow Director */
+ u16 atr_sample;
+ u16 atr_count;
#endif
- u32 bytes; /* used for AIM */
- u32 packets;
+
+ u32 bytes; /* used for AIM */
+ u32 packets;
/* Soft Stats */
- unsigned long tso_tx;
- unsigned long no_tx_map_avail;
- unsigned long no_tx_dma_setup;
- u64 no_desc_avail;
- u64 total_packets;
+ unsigned long tso_tx;
+ unsigned long no_tx_map_avail;
+ unsigned long no_tx_dma_setup;
+ u64 no_desc_avail;
+ u64 total_packets;
};
@@ -398,36 +398,38 @@
* The Receive ring, one per rx queue
*/
struct rx_ring {
- struct adapter *adapter;
- struct mtx rx_mtx;
- u32 me;
- u32 tail;
- union ixgbe_adv_rx_desc *rx_base;
- struct ixgbe_dma_alloc rxdma;
- struct lro_ctrl lro;
- bool lro_enabled;
- bool hw_rsc;
- bool vtag_strip;
- u16 next_to_refresh;
- u16 next_to_check;
- u16 num_desc;
- u16 mbuf_sz;
- char mtx_name[16];
- struct ixgbe_rx_buf *rx_buffers;
- bus_dma_tag_t ptag;
-
- u32 bytes; /* Used for AIM calc */
- u32 packets;
+ struct adapter *adapter;
+ struct mtx rx_mtx;
+ u32 me;
+ u32 tail;
+ union ixgbe_adv_rx_desc *rx_base;
+ struct ixgbe_dma_alloc rxdma;
+ struct lro_ctrl lro;
+ bool lro_enabled;
+ bool hw_rsc;
+ bool vtag_strip;
+ u16 next_to_refresh;
+ u16 next_to_check;
+ u16 num_desc;
+ u16 mbuf_sz;
+ char mtx_name[16];
+ struct ixgbe_rx_buf *rx_buffers;
+ bus_dma_tag_t ptag;
+
+ u32 bytes; /* Used for AIM calc */
+ u32 packets;
/* Soft stats */
- u64 rx_irq;
- u64 rx_copies;
- u64 rx_packets;
- u64 rx_bytes;
- u64 rx_discarded;
- u64 rsc_num;
+ u64 rx_irq;
+ u64 rx_copies;
+ u64 rx_packets;
+ u64 rx_bytes;
+ u64 rx_discarded;
+ u64 rsc_num;
#ifdef IXGBE_FDIR
- u64 flm;
+
+ /* Flow Director */
+ u64 flm;
#endif
};
@@ -440,156 +442,162 @@
#define IXGBE_MAX_VF_MC 30 /* Max number of multicast entries */
struct ixgbe_vf {
- u_int pool;
- u_int rar_index;
- u_int max_frame_size;
- uint32_t flags;
- uint8_t ether_addr[ETHER_ADDR_LEN];
- uint16_t mc_hash[IXGBE_MAX_VF_MC];
- uint16_t num_mc_hashes;
- uint16_t default_vlan;
- uint16_t vlan_tag;
- uint16_t api_ver;
+ u_int pool;
+ u_int rar_index;
+ u_int max_frame_size;
+ uint32_t flags;
+ uint8_t ether_addr[ETHER_ADDR_LEN];
+ uint16_t mc_hash[IXGBE_MAX_VF_MC];
+ uint16_t num_mc_hashes;
+ uint16_t default_vlan;
+ uint16_t vlan_tag;
+ uint16_t api_ver;
};
#endif /* PCI_IOV */
/* Our adapter structure */
struct adapter {
- struct ixgbe_hw hw;
- struct ixgbe_osdep osdep;
+ struct ixgbe_hw hw;
+ struct ixgbe_osdep osdep;
- struct device *dev;
- struct ifnet *ifp;
+ struct device *dev;
+ struct ifnet *ifp;
- struct resource *pci_mem;
- struct resource *msix_mem;
+ struct resource *pci_mem;
+ struct resource *msix_mem;
/*
* Interrupt resources: this set is
* either used for legacy, or for Link
- * when doing MSIX
+ * when doing MSI-X
*/
- void *tag;
- struct resource *res;
+ void *tag;
+ struct resource *res;
- struct ifmedia media;
- struct callout timer;
- int msix;
- int if_flags;
+ struct ifmedia media;
+ struct callout timer;
+ int msix;
+ int if_flags;
- struct mtx core_mtx;
+ struct mtx core_mtx;
- eventhandler_tag vlan_attach;
- eventhandler_tag vlan_detach;
+ eventhandler_tag vlan_attach;
+ eventhandler_tag vlan_detach;
- u16 num_vlans;
- u16 num_queues;
+ u16 num_vlans;
+ u16 num_queues;
/*
- ** Shadow VFTA table, this is needed because
- ** the real vlan filter table gets cleared during
- ** a soft reset and the driver needs to be able
- ** to repopulate it.
- */
- u32 shadow_vfta[IXGBE_VFTA_SIZE];
+ * Shadow VFTA table, this is needed because
+ * the real vlan filter table gets cleared during
+ * a soft reset and the driver needs to be able
+ * to repopulate it.
+ */
+ u32 shadow_vfta[IXGBE_VFTA_SIZE];
/* Info about the interface */
- u32 optics;
- u32 fc; /* local flow ctrl setting */
- int advertise; /* link speeds */
- bool enable_aim; /* adaptive interrupt moderation */
- bool link_active;
- u16 max_frame_size;
- u16 num_segs;
- u32 link_speed;
- bool link_up;
- u32 vector;
- u16 dmac;
- bool eee_enabled;
- u32 phy_layer;
+ u32 optics;
+ u32 fc; /* local flow ctrl setting */
+ int advertise; /* link speeds */
+ bool enable_aim; /* adaptive interrupt moderation */
+ bool link_active;
+ u16 max_frame_size;
+ u16 num_segs;
+ u32 link_speed;
+ bool link_up;
+ u32 vector;
+ u16 dmac;
+ bool eee_enabled;
+ u32 phy_layer;
/* Power management-related */
- bool wol_support;
- u32 wufc;
+ bool wol_support;
+ u32 wufc;
/* Mbuf cluster size */
- u32 rx_mbuf_sz;
+ u32 rx_mbuf_sz;
/* Support for pluggable optics */
- bool sfp_probe;
- struct task link_task; /* Link tasklet */
- struct task mod_task; /* SFP tasklet */
- struct task msf_task; /* Multispeed Fiber */
+ bool sfp_probe;
+ struct task link_task; /* Link tasklet */
+ struct task mod_task; /* SFP tasklet */
+ struct task msf_task; /* Multispeed Fiber */
#ifdef PCI_IOV
- struct task mbx_task; /* VF -> PF mailbox interrupt */
+ struct task mbx_task; /* VF -> PF mailbox interrupt */
#endif /* PCI_IOV */
#ifdef IXGBE_FDIR
- int fdir_reinit;
- struct task fdir_task;
+
+ /* Flow Director */
+ int fdir_reinit;
+ struct task fdir_task;
#endif
- struct task phy_task; /* PHY intr tasklet */
- struct taskqueue *tq;
+
+ struct task phy_task; /* PHY intr tasklet */
+ struct taskqueue *tq;
/*
- ** Queues:
- ** This is the irq holder, it has
- ** and RX/TX pair or rings associated
- ** with it.
- */
- struct ix_queue *queues;
+ * Queues:
+ * This is the irq holder, it has
+ * and RX/TX pair or rings associated
+ * with it.
+ */
+ struct ix_queue *queues;
/*
- * Transmit rings:
- * Allocated at run time, an array of rings.
+ * Transmit rings
+ * Allocated at run time, an array of rings
*/
- struct tx_ring *tx_rings;
- u32 num_tx_desc;
- u32 tx_process_limit;
+ struct tx_ring *tx_rings;
+ u32 num_tx_desc;
+ u32 tx_process_limit;
/*
- * Receive rings:
- * Allocated at run time, an array of rings.
+ * Receive rings
+ * Allocated at run time, an array of rings
*/
- struct rx_ring *rx_rings;
- u64 active_queues;
- u32 num_rx_desc;
- u32 rx_process_limit;
+ struct rx_ring *rx_rings;
+ u64 active_queues;
+ u32 num_rx_desc;
+ u32 rx_process_limit;
/* Multicast array memory */
- struct ixgbe_mc_addr *mta;
- int num_vfs;
- int pool;
+ struct ixgbe_mc_addr *mta;
+
+ /* SR-IOV */
+ int num_vfs;
+ int pool;
#ifdef PCI_IOV
- struct ixgbe_vf *vfs;
+ struct ixgbe_vf *vfs;
#endif
#ifdef DEV_NETMAP
- void (*init_locked)(struct adapter *);
- void (*stop_locked)(void *);
+ /* Netmap */
+ void (*init_locked)(struct adapter *);
+ void (*stop_locked)(void *);
#endif
/* Misc stats maintained by the driver */
- unsigned long dropped_pkts;
- unsigned long mbuf_defrag_failed;
- unsigned long mbuf_header_failed;
- unsigned long mbuf_packet_failed;
- unsigned long watchdog_events;
- unsigned long link_irq;
+ unsigned long dropped_pkts;
+ unsigned long mbuf_defrag_failed;
+ unsigned long mbuf_header_failed;
+ unsigned long mbuf_packet_failed;
+ unsigned long watchdog_events;
+ unsigned long link_irq;
union {
struct ixgbe_hw_stats pf;
struct ixgbevf_hw_stats vf;
} stats;
#if __FreeBSD_version >= 1100036
/* counter(9) stats */
- u64 ipackets;
- u64 ierrors;
- u64 opackets;
- u64 oerrors;
- u64 ibytes;
- u64 obytes;
- u64 imcasts;
- u64 omcasts;
- u64 iqdrops;
- u64 noproto;
+ u64 ipackets;
+ u64 ierrors;
+ u64 opackets;
+ u64 oerrors;
+ u64 ibytes;
+ u64 obytes;
+ u64 imcasts;
+ u64 omcasts;
+ u64 iqdrops;
+ u64 noproto;
#endif
};
@@ -598,7 +606,7 @@
#define ETHERTYPE_IEEE1588 0x88F7
#define PICOSECS_PER_TICK 20833
#define TSYNC_UDP_PORT 319 /* UDP port for the protocol */
-#define IXGBE_ADVTXD_TSTAMP 0x00080000
+#define IXGBE_ADVTXD_TSTAMP 0x00080000
#define IXGBE_CORE_LOCK_INIT(_sc, _name) \
@@ -647,23 +655,23 @@
#endif
/* External PHY register addresses */
-#define IXGBE_PHY_CURRENT_TEMP 0xC820
-#define IXGBE_PHY_OVERTEMP_STATUS 0xC830
+#define IXGBE_PHY_CURRENT_TEMP 0xC820
+#define IXGBE_PHY_OVERTEMP_STATUS 0xC830
/* Sysctl help messages; displayed with sysctl -d */
#define IXGBE_SYSCTL_DESC_ADV_SPEED \
- "\nControl advertised link speed using these flags:\n" \
- "\t0x1 - advertise 100M\n" \
- "\t0x2 - advertise 1G\n" \
- "\t0x4 - advertise 10G\n\n" \
- "\t100M is only supported on certain 10GBaseT adapters.\n"
+ "\nControl advertised link speed using these flags:\n" \
+ "\t0x1 - advertise 100M\n" \
+ "\t0x2 - advertise 1G\n" \
+ "\t0x4 - advertise 10G\n\n" \
+ "\t100M is only supported on certain 10GBaseT adapters.\n"
#define IXGBE_SYSCTL_DESC_SET_FC \
- "\nSet flow control mode using these values:\n" \
- "\t0 - off\n" \
- "\t1 - rx pause\n" \
- "\t2 - tx pause\n" \
- "\t3 - tx and rx pause"
+ "\nSet flow control mode using these values:\n" \
+ "\t0 - off\n" \
+ "\t1 - rx pause\n" \
+ "\t2 - tx pause\n" \
+ "\t3 - tx and rx pause"
static inline bool
ixgbe_is_sfp(struct ixgbe_hw *hw)
@@ -699,11 +707,11 @@
#endif
/*
-** Find the number of unrefreshed RX descriptors
-*/
+ * Find the number of unrefreshed RX descriptors
+ */
static inline u16
ixgbe_rx_unrefreshed(struct rx_ring *rxr)
-{
+{
if (rxr->next_to_check > rxr->next_to_refresh)
return (rxr->next_to_check - rxr->next_to_refresh - 1);
else
@@ -712,9 +720,9 @@
}
/*
-** This checks for a zero mac addr, something that will be likely
-** unless the Admin on the Host has created one.
-*/
+ * This checks for a zero mac addr, something that will be likely
+ * unless the Admin on the Host has created one.
+ */
static inline bool
ixv_check_ether_addr(u8 *addr)
{
@@ -723,34 +731,35 @@
if ((addr[0] == 0 && addr[1]== 0 && addr[2] == 0 &&
addr[3] == 0 && addr[4]== 0 && addr[5] == 0))
status = FALSE;
+
return (status);
}
/* Shared Prototypes */
#ifdef IXGBE_LEGACY_TX
-void ixgbe_start(struct ifnet *);
-void ixgbe_start_locked(struct tx_ring *, struct ifnet *);
+void ixgbe_legacy_start(struct ifnet *);
+void ixgbe_legacy_start_locked(struct tx_ring *, struct ifnet *);
#else /* ! IXGBE_LEGACY_TX */
-int ixgbe_mq_start(struct ifnet *, struct mbuf *);
-int ixgbe_mq_start_locked(struct ifnet *, struct tx_ring *);
-void ixgbe_qflush(struct ifnet *);
-void ixgbe_deferred_mq_start(void *, int);
+int ixgbe_mq_start(struct ifnet *, struct mbuf *);
+int ixgbe_mq_start_locked(struct ifnet *, struct tx_ring *);
+void ixgbe_qflush(struct ifnet *);
+void ixgbe_deferred_mq_start(void *, int);
#endif /* IXGBE_LEGACY_TX */
-int ixgbe_allocate_queues(struct adapter *);
-int ixgbe_allocate_transmit_buffers(struct tx_ring *);
-int ixgbe_setup_transmit_structures(struct adapter *);
-void ixgbe_free_transmit_structures(struct adapter *);
-int ixgbe_allocate_receive_buffers(struct rx_ring *);
-int ixgbe_setup_receive_structures(struct adapter *);
-void ixgbe_free_receive_structures(struct adapter *);
-void ixgbe_txeof(struct tx_ring *);
-bool ixgbe_rxeof(struct ix_queue *);
-
-int ixgbe_dma_malloc(struct adapter *,
- bus_size_t, struct ixgbe_dma_alloc *, int);
-void ixgbe_dma_free(struct adapter *, struct ixgbe_dma_alloc *);
+int ixgbe_allocate_queues(struct adapter *);
+int ixgbe_allocate_transmit_buffers(struct tx_ring *);
+int ixgbe_setup_transmit_structures(struct adapter *);
+void ixgbe_free_transmit_structures(struct adapter *);
+int ixgbe_allocate_receive_buffers(struct rx_ring *);
+int ixgbe_setup_receive_structures(struct adapter *);
+void ixgbe_free_receive_structures(struct adapter *);
+void ixgbe_txeof(struct tx_ring *);
+bool ixgbe_rxeof(struct ix_queue *);
+
+int ixgbe_dma_malloc(struct adapter *,
+ bus_size_t, struct ixgbe_dma_alloc *, int);
+void ixgbe_dma_free(struct adapter *, struct ixgbe_dma_alloc *);
#ifdef PCI_IOV
Index: sys/dev/ixgbe/ixgbe_82598.h
===================================================================
--- sys/dev/ixgbe/ixgbe_82598.h
+++ sys/dev/ixgbe/ixgbe_82598.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_82598.c
===================================================================
--- sys/dev/ixgbe/ixgbe_82598.c
+++ sys/dev/ixgbe/ixgbe_82598.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_82599.h
===================================================================
--- sys/dev/ixgbe/ixgbe_82599.h
+++ sys/dev/ixgbe/ixgbe_82599.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_82599.c
===================================================================
--- sys/dev/ixgbe/ixgbe_82599.c
+++ sys/dev/ixgbe/ixgbe_82599.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_api.h
===================================================================
--- sys/dev/ixgbe/ixgbe_api.h
+++ sys/dev/ixgbe/ixgbe_api.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_api.c
===================================================================
--- sys/dev/ixgbe/ixgbe_api.c
+++ sys/dev/ixgbe/ixgbe_api.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -1072,8 +1072,8 @@
* ixgbe_set_vlvf - Set VLAN Pool Filter
* @hw: pointer to hardware structure
* @vlan: VLAN id to write to VLAN filter
- * @vind: VMDq output index that maps queue to VLAN id in VFVFB
- * @vlan_on: boolean flag to turn on/off VLAN in VFVF
+ * @vind: VMDq output index that maps queue to VLAN id in VLVFB
+ * @vlan_on: boolean flag to turn on/off VLAN in VLVF
* @vfta_changed: pointer to boolean flag which indicates whether VFTA
* should be changed
*
Index: sys/dev/ixgbe/ixgbe_common.h
===================================================================
--- sys/dev/ixgbe/ixgbe_common.h
+++ sys/dev/ixgbe/ixgbe_common.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_common.c
===================================================================
--- sys/dev/ixgbe/ixgbe_common.c
+++ sys/dev/ixgbe/ixgbe_common.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_dcb.h
===================================================================
--- sys/dev/ixgbe/ixgbe_dcb.h
+++ sys/dev/ixgbe/ixgbe_dcb.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_dcb.c
===================================================================
--- sys/dev/ixgbe/ixgbe_dcb.c
+++ sys/dev/ixgbe/ixgbe_dcb.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_dcb_82598.h
===================================================================
--- sys/dev/ixgbe/ixgbe_dcb_82598.h
+++ sys/dev/ixgbe/ixgbe_dcb_82598.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_dcb_82598.c
===================================================================
--- sys/dev/ixgbe/ixgbe_dcb_82598.c
+++ sys/dev/ixgbe/ixgbe_dcb_82598.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_dcb_82599.h
===================================================================
--- sys/dev/ixgbe/ixgbe_dcb_82599.h
+++ sys/dev/ixgbe/ixgbe_dcb_82599.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_dcb_82599.c
===================================================================
--- sys/dev/ixgbe/ixgbe_dcb_82599.c
+++ sys/dev/ixgbe/ixgbe_dcb_82599.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_mbx.h
===================================================================
--- sys/dev/ixgbe/ixgbe_mbx.h
+++ sys/dev/ixgbe/ixgbe_mbx.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_mbx.c
===================================================================
--- sys/dev/ixgbe/ixgbe_mbx.c
+++ sys/dev/ixgbe/ixgbe_mbx.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_osdep.h
===================================================================
--- sys/dev/ixgbe/ixgbe_osdep.h
+++ sys/dev/ixgbe/ixgbe_osdep.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -32,8 +32,8 @@
******************************************************************************/
/*$FreeBSD$*/
-#ifndef _IXGBE_OS_H_
-#define _IXGBE_OS_H_
+#ifndef _IXGBE_OSDEP_H_
+#define _IXGBE_OSDEP_H_
#include <sys/types.h>
#include <sys/param.h>
@@ -235,4 +235,4 @@
#define IXGBE_WRITE_REG_ARRAY(a, reg, offset, val) \
ixgbe_write_reg_array(a, reg, offset, val)
-#endif /* _IXGBE_OS_H_ */
+#endif /* _IXGBE_OSDEP_H_ */
Index: sys/dev/ixgbe/ixgbe_osdep.c
===================================================================
--- sys/dev/ixgbe/ixgbe_osdep.c
+++ sys/dev/ixgbe/ixgbe_osdep.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -44,15 +44,13 @@
inline u16
ixgbe_read_pci_cfg(struct ixgbe_hw *hw, u32 reg)
{
- return pci_read_config(((struct adapter *)hw->back)->dev,
- reg, 2);
+ return pci_read_config(((struct adapter *)hw->back)->dev, reg, 2);
}
inline void
ixgbe_write_pci_cfg(struct ixgbe_hw *hw, u32 reg, u16 value)
{
- pci_write_config(((struct adapter *)hw->back)->dev,
- reg, value, 2);
+ pci_write_config(((struct adapter *)hw->back)->dev, reg, value, 2);
}
inline u32
Index: sys/dev/ixgbe/ixgbe_phy.h
===================================================================
--- sys/dev/ixgbe/ixgbe_phy.h
+++ sys/dev/ixgbe/ixgbe_phy.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_phy.c
===================================================================
--- sys/dev/ixgbe/ixgbe_phy.c
+++ sys/dev/ixgbe/ixgbe_phy.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_type.h
===================================================================
--- sys/dev/ixgbe/ixgbe_type.h
+++ sys/dev/ixgbe/ixgbe_type.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_x540.h
===================================================================
--- sys/dev/ixgbe/ixgbe_x540.h
+++ sys/dev/ixgbe/ixgbe_x540.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_x540.c
===================================================================
--- sys/dev/ixgbe/ixgbe_x540.c
+++ sys/dev/ixgbe/ixgbe_x540.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_x550.h
===================================================================
--- sys/dev/ixgbe/ixgbe_x550.h
+++ sys/dev/ixgbe/ixgbe_x550.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
Index: sys/dev/ixgbe/ixgbe_x550.c
===================================================================
--- sys/dev/ixgbe/ixgbe_x550.c
+++ sys/dev/ixgbe/ixgbe_x550.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2015, Intel Corporation
+ Copyright (c) 2001-2016, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -801,8 +801,8 @@
}
/**
- * ixgbe_write_iosf_sb_reg_x550 - Writes a value to specified register of the IOSF
- * device
+ * ixgbe_write_iosf_sb_reg_x550 - Writes a value to specified register
+ * of the IOSF device
* @hw: pointer to hardware structure
* @reg_addr: 32 bit PHY register to write
* @device_type: 3 bit device type
@@ -848,12 +848,11 @@
}
/**
- * ixgbe_read_iosf_sb_reg_x550 - Writes a value to specified register of the IOSF
- * device
+ * ixgbe_read_iosf_sb_reg_x550 - Reads specified register of the IOSF device
* @hw: pointer to hardware structure
* @reg_addr: 32 bit PHY register to write
* @device_type: 3 bit device type
- * @phy_data: Pointer to read data from the register
+ * @data: Pointer to read data from the register
**/
s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
u32 device_type, u32 *data)
@@ -1349,7 +1348,7 @@
if (status != IXGBE_SUCCESS)
return status;
- /* Enables high temperature failure alarm */
+ /* Enable high temperature failure and global fault alarms */
status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
&reg);

File Metadata

Mime Type
text/plain
Expires
Thu, Jul 16, 1:46 AM (6 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35121414
Default Alt Text
D6926.diff (238 KB)

Event Timeline