Commit 1c11a0a1 authored by David S. Miller's avatar David S. Miller
Browse files
parents da557374 db018963
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -1078,18 +1078,18 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
	netdev->priv_flags |= IFF_SUPP_NOFCS;

	netdev->features |= netdev->hw_features;
	netdev->hw_features |= NETIF_F_RXCSUM;
	netdev->hw_features |= NETIF_F_RXALL;
	netdev->hw_features |= NETIF_F_RXFCS;
	netdev->hw_features |= (NETIF_F_RXCSUM |
				NETIF_F_RXALL |
				NETIF_F_RXFCS);

	if (pci_using_dac) {
		netdev->features |= NETIF_F_HIGHDMA;
		netdev->vlan_features |= NETIF_F_HIGHDMA;
	}

	netdev->vlan_features |= NETIF_F_TSO;
	netdev->vlan_features |= NETIF_F_HW_CSUM;
	netdev->vlan_features |= NETIF_F_SG;
	netdev->vlan_features |= (NETIF_F_TSO |
				  NETIF_F_HW_CSUM |
				  NETIF_F_SG);

	netdev->priv_flags |= IFF_UNICAST_FLT;

+1 −0
Original line number Diff line number Diff line
@@ -117,6 +117,7 @@

/* TX Rate Limit Registers */
#define E1000_RTTDQSEL	0x3604	/* Tx Desc Plane Queue Select - WO */
#define E1000_RTTBCNRM	0x3690	/* Tx BCN Rate-scheduler MMW */
#define E1000_RTTBCNRC	0x36B0	/* Tx BCN Rate-Scheduler Config - WO */

/* Split and Replication RX Control - RW */
+19 −6
Original line number Diff line number Diff line
@@ -65,19 +65,30 @@ struct igb_adapter;
#define MAX_Q_VECTORS                      8

/* Transmit and receive queues */
#define IGB_MAX_RX_QUEUES		((adapter->vfs_allocated_count ? 2 : \
					(hw->mac.type > e1000_82575 ? 8 : 4)))
#define IGB_MAX_RX_QUEUES_I210             4
#define IGB_MAX_RX_QUEUES                  8
#define IGB_MAX_RX_QUEUES_82575            4
#define IGB_MAX_RX_QUEUES_I211             2
#define IGB_MAX_TX_QUEUES                  16
#define IGB_MAX_TX_QUEUES_I210             4
#define IGB_MAX_TX_QUEUES_I211             2
#define IGB_MAX_TX_QUEUES                  8
#define IGB_MAX_VF_MC_ENTRIES              30
#define IGB_MAX_VF_FUNCTIONS               8
#define IGB_MAX_VFTA_ENTRIES               128
#define IGB_82576_VF_DEV_ID                0x10CA
#define IGB_I350_VF_DEV_ID                 0x1520

/* NVM version defines */
#define IGB_MAJOR_MASK			0xF000
#define IGB_MINOR_MASK			0x0FF0
#define IGB_BUILD_MASK			0x000F
#define IGB_COMB_VER_MASK		0x00FF
#define IGB_MAJOR_SHIFT			12
#define IGB_MINOR_SHIFT			4
#define IGB_COMB_VER_SHFT		8
#define IGB_NVM_VER_INVALID		0xFFFF
#define IGB_ETRACK_SHIFT		16
#define NVM_ETRACK_WORD			0x0042
#define NVM_COMB_VER_OFF		0x0083
#define NVM_COMB_VER_PTR		0x003d

struct vf_data_storage {
	unsigned char vf_mac_addresses[ETH_ALEN];
	u16 vf_mc_hashes[IGB_MAX_VF_MC_ENTRIES];
@@ -371,6 +382,7 @@ struct igb_adapter {
	spinlock_t tmreg_lock;
	struct cyclecounter cc;
	struct timecounter tc;
	char fw_version[32];
};

#define IGB_FLAG_HAS_MSI           (1 << 0)
@@ -420,6 +432,7 @@ extern void igb_update_stats(struct igb_adapter *, struct rtnl_link_stats64 *);
extern bool igb_has_link(struct igb_adapter *adapter);
extern void igb_set_ethtool_ops(struct net_device *);
extern void igb_power_up_link(struct igb_adapter *);
extern void igb_set_fw_version(struct igb_adapter *);
#ifdef CONFIG_IGB_PTP
extern void igb_ptp_init(struct igb_adapter *adapter);
extern void igb_ptp_remove(struct igb_adapter *adapter);
+42 −10
Original line number Diff line number Diff line
@@ -710,6 +710,7 @@ static int igb_set_eeprom(struct net_device *netdev,
	if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG)))
		hw->nvm.ops.update(hw);

	igb_set_fw_version(adapter);
	kfree(eeprom_buff);
	return ret_val;
}
@@ -718,20 +719,16 @@ static void igb_get_drvinfo(struct net_device *netdev,
			    struct ethtool_drvinfo *drvinfo)
{
	struct igb_adapter *adapter = netdev_priv(netdev);
	u16 eeprom_data;

	strlcpy(drvinfo->driver,  igb_driver_name, sizeof(drvinfo->driver));
	strlcpy(drvinfo->version, igb_driver_version, sizeof(drvinfo->version));

	/* EEPROM image version # is reported as firmware version # for
	 * 82575 controllers */
	adapter->hw.nvm.ops.read(&adapter->hw, 5, 1, &eeprom_data);
	snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
		"%d.%d-%d",
		(eeprom_data & 0xF000) >> 12,
		(eeprom_data & 0x0FF0) >> 4,
		eeprom_data & 0x000F);

	/*
	 * EEPROM image version # is reported as firmware version # for
	 * 82575 controllers
	 */
	strlcpy(drvinfo->fw_version, adapter->fw_version,
		sizeof(drvinfo->fw_version));
	strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
		sizeof(drvinfo->bus_info));
	drvinfo->n_stats = IGB_STATS_LEN;
@@ -2271,6 +2268,38 @@ static void igb_ethtool_complete(struct net_device *netdev)
	pm_runtime_put(&adapter->pdev->dev);
}

#ifdef CONFIG_IGB_PTP
static int igb_ethtool_get_ts_info(struct net_device *dev,
				   struct ethtool_ts_info *info)
{
	struct igb_adapter *adapter = netdev_priv(dev);

	info->so_timestamping =
		SOF_TIMESTAMPING_TX_HARDWARE |
		SOF_TIMESTAMPING_RX_HARDWARE |
		SOF_TIMESTAMPING_RAW_HARDWARE;

	if (adapter->ptp_clock)
		info->phc_index = ptp_clock_index(adapter->ptp_clock);
	else
		info->phc_index = -1;

	info->tx_types =
		(1 << HWTSTAMP_TX_OFF) |
		(1 << HWTSTAMP_TX_ON);

	info->rx_filters =
		(1 << HWTSTAMP_FILTER_NONE) |
		(1 << HWTSTAMP_FILTER_ALL) |
		(1 << HWTSTAMP_FILTER_SOME) |
		(1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC) |
		(1 << HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) |
		(1 << HWTSTAMP_FILTER_PTP_V2_EVENT);

	return 0;
}

#endif
static const struct ethtool_ops igb_ethtool_ops = {
	.get_settings           = igb_get_settings,
	.set_settings           = igb_set_settings,
@@ -2299,6 +2328,9 @@ static const struct ethtool_ops igb_ethtool_ops = {
	.set_coalesce           = igb_set_coalesce,
	.begin			= igb_ethtool_begin,
	.complete		= igb_ethtool_complete,
#ifdef CONFIG_IGB_PTP
	.get_ts_info		= igb_ethtool_get_ts_info,
#endif
};

void igb_set_ethtool_ops(struct net_device *netdev)
+126 −30
Original line number Diff line number Diff line
@@ -59,9 +59,9 @@
#endif
#include "igb.h"

#define MAJ 3
#define MIN 4
#define BUILD 7
#define MAJ 4
#define MIN 0
#define BUILD 1
#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \
__stringify(BUILD) "-k"
char igb_driver_name[] = "igb";
@@ -1048,11 +1048,6 @@ static int igb_set_interrupt_capability(struct igb_adapter *adapter)
	if (!(adapter->flags & IGB_FLAG_QUEUE_PAIRS))
		numvecs += adapter->num_tx_queues;

	/* i210 and i211 can only have 4 MSIX vectors for rx/tx queues. */
	if ((adapter->hw.mac.type == e1000_i210)
		|| (adapter->hw.mac.type == e1000_i211))
		numvecs = 4;

	/* store the number of vectors reserved for queues */
	adapter->num_q_vectors = numvecs;

@@ -1820,6 +1815,69 @@ static const struct net_device_ops igb_netdev_ops = {
	.ndo_set_features	= igb_set_features,
};

/**
 * igb_set_fw_version - Configure version string for ethtool
 * @adapter: adapter struct
 *
 **/
void igb_set_fw_version(struct igb_adapter *adapter)
{
	struct e1000_hw *hw = &adapter->hw;
	u16 eeprom_verh, eeprom_verl, comb_verh, comb_verl, comb_offset;
	u16 major, build, patch, fw_version;
	u32 etrack_id;

	hw->nvm.ops.read(hw, 5, 1, &fw_version);
	if (adapter->hw.mac.type != e1000_i211) {
		hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verh);
		hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verl);
		etrack_id = (eeprom_verh << IGB_ETRACK_SHIFT) | eeprom_verl;

		/* combo image version needs to be found */
		hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset);
		if ((comb_offset != 0x0) &&
		    (comb_offset != IGB_NVM_VER_INVALID)) {
			hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset
					 + 1), 1, &comb_verh);
			hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset),
					 1, &comb_verl);

			/* Only display Option Rom if it exists and is valid */
			if ((comb_verh && comb_verl) &&
			    ((comb_verh != IGB_NVM_VER_INVALID) &&
			     (comb_verl != IGB_NVM_VER_INVALID))) {
				major = comb_verl >> IGB_COMB_VER_SHFT;
				build = (comb_verl << IGB_COMB_VER_SHFT) |
					(comb_verh >> IGB_COMB_VER_SHFT);
				patch = comb_verh & IGB_COMB_VER_MASK;
				snprintf(adapter->fw_version,
					 sizeof(adapter->fw_version),
					 "%d.%d%d, 0x%08x, %d.%d.%d",
					 (fw_version & IGB_MAJOR_MASK) >>
					 IGB_MAJOR_SHIFT,
					 (fw_version & IGB_MINOR_MASK) >>
					 IGB_MINOR_SHIFT,
					 (fw_version & IGB_BUILD_MASK),
					 etrack_id, major, build, patch);
				goto out;
			}
		}
		snprintf(adapter->fw_version, sizeof(adapter->fw_version),
			 "%d.%d%d, 0x%08x",
			 (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT,
			 (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT,
			 (fw_version & IGB_BUILD_MASK), etrack_id);
	} else {
		snprintf(adapter->fw_version, sizeof(adapter->fw_version),
			 "%d.%d%d",
			 (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT,
			 (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT,
			 (fw_version & IGB_BUILD_MASK));
	}
out:
	return;
}

/**
 * igb_probe - Device Initialization Routine
 * @pdev: PCI device information struct
@@ -2030,6 +2088,9 @@ static int __devinit igb_probe(struct pci_dev *pdev,
		goto err_eeprom;
	}

	/* get firmware version for ethtool -i */
	igb_set_fw_version(adapter);

	setup_timer(&adapter->watchdog_timer, igb_watchdog,
	            (unsigned long) adapter);
	setup_timer(&adapter->phy_info_timer, igb_update_phy_info,
@@ -2338,6 +2399,7 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter)
	struct e1000_hw *hw = &adapter->hw;
	struct net_device *netdev = adapter->netdev;
	struct pci_dev *pdev = adapter->pdev;
	u32 max_rss_queues;

	pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);

@@ -2370,40 +2432,69 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter)
		} else
			adapter->vfs_allocated_count = max_vfs;
		break;
	case e1000_i210:
	case e1000_i211:
		adapter->vfs_allocated_count = 0;
		break;
	default:
		break;
	}
#endif /* CONFIG_PCI_IOV */

	/* Determine the maximum number of RSS queues supported. */
	switch (hw->mac.type) {
	case e1000_i211:
		max_rss_queues = IGB_MAX_RX_QUEUES_I211;
		break;
	case e1000_82575:
	case e1000_i210:
		adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES_I210,
			num_online_cpus());
		max_rss_queues = IGB_MAX_RX_QUEUES_82575;
		break;
	case e1000_i211:
		adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES_I211,
			num_online_cpus());
	case e1000_i350:
		/* I350 cannot do RSS and SR-IOV at the same time */
		if (!!adapter->vfs_allocated_count) {
			max_rss_queues = 1;
			break;
		}
		/* fall through */
	case e1000_82576:
		if (!!adapter->vfs_allocated_count) {
			max_rss_queues = 2;
			break;
		}
		/* fall through */
	case e1000_82580:
	default:
		adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES,
		num_online_cpus());
		max_rss_queues = IGB_MAX_RX_QUEUES;
		break;
	}
	/* i350 cannot do RSS and SR-IOV at the same time */
	if (hw->mac.type == e1000_i350 && adapter->vfs_allocated_count)
		adapter->rss_queues = 1;

	adapter->rss_queues = min_t(u32, max_rss_queues, num_online_cpus());

	/* Determine if we need to pair queues. */
	switch (hw->mac.type) {
	case e1000_82575:
	case e1000_i211:
		/* Device supports enough interrupts without queue pairing. */
		break;
	case e1000_82576:
		/*
		 * If VFs are going to be allocated with RSS queues then we
		 * should pair the queues in order to conserve interrupts due
		 * to limited supply.
		 */
		if ((adapter->rss_queues > 1) &&
		    (adapter->vfs_allocated_count > 6))
			adapter->flags |= IGB_FLAG_QUEUE_PAIRS;
		/* fall through */
	case e1000_82580:
	case e1000_i350:
	case e1000_i210:
	default:
		/*
	 * if rss_queues > 4 or vfs are going to be allocated with rss_queues
	 * then we should combine the queues into a queue pair in order to
	 * conserve interrupts due to limited supply
		 * If rss_queues > half of max_rss_queues, pair the queues in
		 * order to conserve interrupts due to limited supply.
		 */
	if ((adapter->rss_queues > 4) ||
	    ((adapter->rss_queues > 1) && (adapter->vfs_allocated_count > 6)))
		if (adapter->rss_queues > (max_rss_queues / 2))
			adapter->flags |= IGB_FLAG_QUEUE_PAIRS;
		break;
	}

	/* Setup and initialize a copy of the hw vlan table array */
	adapter->shadow_vfta = kzalloc(sizeof(u32) *
@@ -6997,6 +7088,11 @@ static void igb_set_vf_rate_limit(struct e1000_hw *hw, int vf, int tx_rate,
	}

	wr32(E1000_RTTDQSEL, vf); /* vf X uses queue X */
	/*
	 * Set global transmit compensation time to the MMW_SIZE in RTTBCNRM
	 * register. MMW_SIZE=0x014 if 9728-byte jumbo is supported.
	 */
	wr32(E1000_RTTBCNRM, 0x14);
	wr32(E1000_RTTBCNRC, bcnrc_val);
}

Loading