diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igc')
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_defines.h | 7 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_ethtool.c | 14 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_hw.h | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_i225.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_main.c | 45 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_ptp.c | 19 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_xdp.c | 1 | 
7 files changed, 58 insertions, 35 deletions
| diff --git a/drivers/net/ethernet/intel/igc/igc_defines.h b/drivers/net/ethernet/intel/igc/igc_defines.h index c7fe61509d5b..5c66b97c0cfa 100644 --- a/drivers/net/ethernet/intel/igc/igc_defines.h +++ b/drivers/net/ethernet/intel/igc/igc_defines.h @@ -85,9 +85,6 @@  #define IGC_WUFC_EXT_FILTER_MASK GENMASK(31, 8) -/* Physical Func Reset Done Indication */ -#define IGC_CTRL_EXT_LINK_MODE_MASK	0x00C00000 -  /* Loop limit on how long we wait for auto-negotiation to complete */  #define COPPER_LINK_UP_LIMIT		10  #define PHY_AUTO_NEG_LIMIT		45 @@ -584,7 +581,6 @@  #define IGC_GEN_POLL_TIMEOUT	1920  /* PHY Control Register */ -#define MII_CR_FULL_DUPLEX	0x0100  /* FDX =1, half duplex =0 */  #define MII_CR_RESTART_AUTO_NEG	0x0200  /* Restart auto negotiation */  #define MII_CR_POWER_DOWN	0x0800  /* Power down */  #define MII_CR_AUTO_NEG_EN	0x1000  /* Auto Neg Enable */ @@ -605,9 +601,6 @@  #define PHY_1000T_CTRL		0x09 /* 1000Base-T Control Reg */  #define PHY_1000T_STATUS	0x0A /* 1000Base-T Status Reg */ -/* Bit definitions for valid PHY IDs. I = Integrated E = External */ -#define I225_I_PHY_ID		0x67C9DC00 -  /* MDI Control */  #define IGC_MDIC_DATA_MASK	0x0000FFFF  #define IGC_MDIC_REG_MASK	0x001F0000 diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/ethernet/intel/igc/igc_ethtool.c index e0a76ac1bbbc..8cc077b712ad 100644 --- a/drivers/net/ethernet/intel/igc/igc_ethtool.c +++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c @@ -567,8 +567,11 @@ static int igc_ethtool_set_eeprom(struct net_device *netdev,  	return ret_val;  } -static void igc_ethtool_get_ringparam(struct net_device *netdev, -				      struct ethtool_ringparam *ring) +static void +igc_ethtool_get_ringparam(struct net_device *netdev, +			  struct ethtool_ringparam *ring, +			  struct kernel_ethtool_ringparam *kernel_ering, +			  struct netlink_ext_ack *extack)  {  	struct igc_adapter *adapter = netdev_priv(netdev); @@ -578,8 +581,11 @@ static void igc_ethtool_get_ringparam(struct net_device *netdev,  	ring->tx_pending = adapter->tx_ring_count;  } -static int igc_ethtool_set_ringparam(struct net_device *netdev, -				     struct ethtool_ringparam *ring) +static int +igc_ethtool_set_ringparam(struct net_device *netdev, +			  struct ethtool_ringparam *ring, +			  struct kernel_ethtool_ringparam *kernel_ering, +			  struct netlink_ext_ack *extack)  {  	struct igc_adapter *adapter = netdev_priv(netdev);  	struct igc_ring *temp_ring; diff --git a/drivers/net/ethernet/intel/igc/igc_hw.h b/drivers/net/ethernet/intel/igc/igc_hw.h index 587db7483f25..b1e72ec5f131 100644 --- a/drivers/net/ethernet/intel/igc/igc_hw.h +++ b/drivers/net/ethernet/intel/igc/igc_hw.h @@ -55,7 +55,6 @@ enum igc_mac_type {  enum igc_phy_type {  	igc_phy_unknown = 0, -	igc_phy_none,  	igc_phy_i225,  }; @@ -68,8 +67,6 @@ enum igc_media_type {  enum igc_nvm_type {  	igc_nvm_unknown = 0,  	igc_nvm_eeprom_spi, -	igc_nvm_flash_hw, -	igc_nvm_invm,  };  struct igc_info { diff --git a/drivers/net/ethernet/intel/igc/igc_i225.c b/drivers/net/ethernet/intel/igc/igc_i225.c index b2ef9fde97b3..66ea566488d1 100644 --- a/drivers/net/ethernet/intel/igc/igc_i225.c +++ b/drivers/net/ethernet/intel/igc/igc_i225.c @@ -473,13 +473,11 @@ s32 igc_init_nvm_params_i225(struct igc_hw *hw)  	/* NVM Function Pointers */  	if (igc_get_flash_presence_i225(hw)) { -		hw->nvm.type = igc_nvm_flash_hw;  		nvm->ops.read = igc_read_nvm_srrd_i225;  		nvm->ops.write = igc_write_nvm_srwr_i225;  		nvm->ops.validate = igc_validate_nvm_checksum_i225;  		nvm->ops.update = igc_update_nvm_checksum_i225;  	} else { -		hw->nvm.type = igc_nvm_invm;  		nvm->ops.read = igc_read_nvm_eerd;  		nvm->ops.write = NULL;  		nvm->ops.validate = NULL; @@ -636,7 +634,7 @@ s32 igc_set_ltr_i225(struct igc_hw *hw, bool link)  		ltrv = rd32(IGC_LTRMAXV);  		if (ltr_max != (ltrv & IGC_LTRMAXV_LTRV_MASK)) {  			ltrv = IGC_LTRMAXV_LSNP_REQ | ltr_max | -			       (scale_min << IGC_LTRMAXV_SCALE_SHIFT); +			       (scale_max << IGC_LTRMAXV_SCALE_SHIFT);  			wr32(IGC_LTRMAXV, ltrv);  		}  	} diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 8e448288ee26..2f17f36e94fd 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -1718,24 +1718,26 @@ static void igc_add_rx_frag(struct igc_ring *rx_ring,  static struct sk_buff *igc_build_skb(struct igc_ring *rx_ring,  				     struct igc_rx_buffer *rx_buffer, -				     union igc_adv_rx_desc *rx_desc, -				     unsigned int size) +				     struct xdp_buff *xdp)  { -	void *va = page_address(rx_buffer->page) + rx_buffer->page_offset; +	unsigned int size = xdp->data_end - xdp->data;  	unsigned int truesize = igc_get_rx_frame_truesize(rx_ring, size); +	unsigned int metasize = xdp->data - xdp->data_meta;  	struct sk_buff *skb;  	/* prefetch first cache line of first page */ -	net_prefetch(va); +	net_prefetch(xdp->data_meta);  	/* build an skb around the page buffer */ -	skb = build_skb(va - IGC_SKB_PAD, truesize); +	skb = napi_build_skb(xdp->data_hard_start, truesize);  	if (unlikely(!skb))  		return NULL;  	/* update pointers within the skb to store the data */ -	skb_reserve(skb, IGC_SKB_PAD); +	skb_reserve(skb, xdp->data - xdp->data_hard_start);  	__skb_put(skb, size); +	if (metasize) +		skb_metadata_set(skb, metasize);  	igc_rx_buffer_flip(rx_buffer, truesize);  	return skb; @@ -1746,6 +1748,7 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring,  					 struct xdp_buff *xdp,  					 ktime_t timestamp)  { +	unsigned int metasize = xdp->data - xdp->data_meta;  	unsigned int size = xdp->data_end - xdp->data;  	unsigned int truesize = igc_get_rx_frame_truesize(rx_ring, size);  	void *va = xdp->data; @@ -1753,10 +1756,11 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring,  	struct sk_buff *skb;  	/* prefetch first cache line of first page */ -	net_prefetch(va); +	net_prefetch(xdp->data_meta);  	/* allocate a skb to store the frags */ -	skb = napi_alloc_skb(&rx_ring->q_vector->napi, IGC_RX_HDR_LEN); +	skb = napi_alloc_skb(&rx_ring->q_vector->napi, +			     IGC_RX_HDR_LEN + metasize);  	if (unlikely(!skb))  		return NULL; @@ -1769,7 +1773,13 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring,  		headlen = eth_get_headlen(skb->dev, va, IGC_RX_HDR_LEN);  	/* align pull length to size of long to optimize memcpy performance */ -	memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long))); +	memcpy(__skb_put(skb, headlen + metasize), xdp->data_meta, +	       ALIGN(headlen + metasize, sizeof(long))); + +	if (metasize) { +		skb_metadata_set(skb, metasize); +		__skb_pull(skb, metasize); +	}  	/* update all of the pointers */  	size -= headlen; @@ -2231,7 +2241,7 @@ static int __igc_xdp_run_prog(struct igc_adapter *adapter,  		return IGC_XDP_REDIRECT;  		break;  	default: -		bpf_warn_invalid_xdp_action(act); +		bpf_warn_invalid_xdp_action(adapter->netdev, prog, act);  		fallthrough;  	case XDP_ABORTED:  out_failure: @@ -2354,7 +2364,8 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)  		if (!skb) {  			xdp_init_buff(&xdp, truesize, &rx_ring->xdp_rxq);  			xdp_prepare_buff(&xdp, pktbuf - igc_rx_offset(rx_ring), -					 igc_rx_offset(rx_ring) + pkt_offset, size, false); +					 igc_rx_offset(rx_ring) + pkt_offset, +					 size, true);  			skb = igc_xdp_run_prog(adapter, &xdp);  		} @@ -2378,7 +2389,7 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)  		} else if (skb)  			igc_add_rx_frag(rx_ring, rx_buffer, skb, size);  		else if (ring_uses_build_skb(rx_ring)) -			skb = igc_build_skb(rx_ring, rx_buffer, rx_desc, size); +			skb = igc_build_skb(rx_ring, rx_buffer, &xdp);  		else  			skb = igc_construct_skb(rx_ring, rx_buffer, &xdp,  						timestamp); @@ -2448,8 +2459,10 @@ static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring,  	skb_reserve(skb, xdp->data_meta - xdp->data_hard_start);  	memcpy(__skb_put(skb, totalsize), xdp->data_meta, totalsize); -	if (metasize) +	if (metasize) {  		skb_metadata_set(skb, metasize); +		__skb_pull(skb, metasize); +	}  	return skb;  } @@ -5467,6 +5480,9 @@ static irqreturn_t igc_intr_msi(int irq, void *data)  			mod_timer(&adapter->watchdog_timer, jiffies + 1);  	} +	if (icr & IGC_ICR_TS) +		igc_tsync_interrupt(adapter); +  	napi_schedule(&q_vector->napi);  	return IRQ_HANDLED; @@ -5510,6 +5526,9 @@ static irqreturn_t igc_intr(int irq, void *data)  			mod_timer(&adapter->watchdog_timer, jiffies + 1);  	} +	if (icr & IGC_ICR_TS) +		igc_tsync_interrupt(adapter); +  	napi_schedule(&q_vector->napi);  	return IRQ_HANDLED; diff --git a/drivers/net/ethernet/intel/igc/igc_ptp.c b/drivers/net/ethernet/intel/igc/igc_ptp.c index 30568e3544cd..0d6e3215e98f 100644 --- a/drivers/net/ethernet/intel/igc/igc_ptp.c +++ b/drivers/net/ethernet/intel/igc/igc_ptp.c @@ -560,10 +560,6 @@ static void igc_ptp_enable_tx_timestamp(struct igc_adapter *adapter)  static int igc_ptp_set_timestamp_mode(struct igc_adapter *adapter,  				      struct hwtstamp_config *config)  { -	/* reserved for future extensions */ -	if (config->flags) -		return -EINVAL; -  	switch (config->tx_type) {  	case HWTSTAMP_TX_OFF:  		igc_ptp_disable_tx_timestamp(adapter); @@ -768,7 +764,20 @@ int igc_ptp_get_ts_config(struct net_device *netdev, struct ifreq *ifr)   */  static bool igc_is_crosststamp_supported(struct igc_adapter *adapter)  { -	return IS_ENABLED(CONFIG_X86_TSC) ? pcie_ptm_enabled(adapter->pdev) : false; +	if (!IS_ENABLED(CONFIG_X86_TSC)) +		return false; + +	/* FIXME: it was noticed that enabling support for PCIe PTM in +	 * some i225-V models could cause lockups when bringing the +	 * interface up/down. There should be no downsides to +	 * disabling crosstimestamping support for i225-V, as it +	 * doesn't have any PTP support. That way we gain some time +	 * while root causing the issue. +	 */ +	if (adapter->pdev->device == IGC_DEV_ID_I225_V) +		return false; + +	return pcie_ptm_enabled(adapter->pdev);  }  static struct system_counterval_t igc_device_tstamp_to_system(u64 tstamp) diff --git a/drivers/net/ethernet/intel/igc/igc_xdp.c b/drivers/net/ethernet/intel/igc/igc_xdp.c index a8cf5374be47..aeeb34e64610 100644 --- a/drivers/net/ethernet/intel/igc/igc_xdp.c +++ b/drivers/net/ethernet/intel/igc/igc_xdp.c @@ -1,6 +1,7 @@  // SPDX-License-Identifier: GPL-2.0  /* Copyright (c) 2020, Intel Corporation. */ +#include <linux/if_vlan.h>  #include <net/xdp_sock_drv.h>  #include "igc.h" |