diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe')
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe.h | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c | 110 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | 63 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_common.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 39 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 179 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 21 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 25 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 20 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c | 1 | 
11 files changed, 307 insertions, 159 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index a8e10cff7a8..ca932387a80 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h @@ -740,6 +740,11 @@ extern void ixgbe_dbg_adapter_init(struct ixgbe_adapter *adapter);  extern void ixgbe_dbg_adapter_exit(struct ixgbe_adapter *adapter);  extern void ixgbe_dbg_init(void);  extern void ixgbe_dbg_exit(void); +#else +static inline void ixgbe_dbg_adapter_init(struct ixgbe_adapter *adapter) {} +static inline void ixgbe_dbg_adapter_exit(struct ixgbe_adapter *adapter) {} +static inline void ixgbe_dbg_init(void) {} +static inline void ixgbe_dbg_exit(void) {}  #endif /* CONFIG_DEBUG_FS */  static inline struct netdev_queue *txring_txq(const struct ixgbe_ring *ring)  { diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c index d0113fc97b6..4a5bfb6b3af 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c @@ -1305,6 +1305,7 @@ static struct ixgbe_mac_operations mac_ops_82598 = {  	.release_swfw_sync      = &ixgbe_release_swfw_sync,  	.get_thermal_sensor_data = NULL,  	.init_thermal_sensor_thresh = NULL, +	.mng_fw_enabled		= NULL,  };  static struct ixgbe_eeprom_operations eeprom_ops_82598 = { diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c index 203a00c2433..0b82d38bc97 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c @@ -59,12 +59,34 @@ static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw,                                           bool autoneg_wait_to_complete);  static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw); +static bool ixgbe_mng_enabled(struct ixgbe_hw *hw) +{ +	u32 fwsm, manc, factps; + +	fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM); +	if ((fwsm & IXGBE_FWSM_MODE_MASK) != IXGBE_FWSM_FW_MODE_PT) +		return false; + +	manc = IXGBE_READ_REG(hw, IXGBE_MANC); +	if (!(manc & IXGBE_MANC_RCV_TCO_EN)) +		return false; + +	factps = IXGBE_READ_REG(hw, IXGBE_FACTPS); +	if (factps & IXGBE_FACTPS_MNGCG) +		return false; + +	return true; +} +  static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw)  {  	struct ixgbe_mac_info *mac = &hw->mac; -	/* enable the laser control functions for SFP+ fiber */ -	if (mac->ops.get_media_type(hw) == ixgbe_media_type_fiber) { +	/* enable the laser control functions for SFP+ fiber +	 * and MNG not enabled +	 */ +	if ((mac->ops.get_media_type(hw) == ixgbe_media_type_fiber) && +	    !hw->mng_fw_enabled) {  		mac->ops.disable_tx_laser =  		                       &ixgbe_disable_tx_laser_multispeed_fiber;  		mac->ops.enable_tx_laser = @@ -145,9 +167,9 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)  		}  		/* Restart DSP and set SFI mode */ -		IXGBE_WRITE_REG(hw, IXGBE_AUTOC, (IXGBE_READ_REG(hw, -				IXGBE_AUTOC) | IXGBE_AUTOC_LMS_10G_SERIAL)); - +		IXGBE_WRITE_REG(hw, IXGBE_AUTOC, ((hw->mac.orig_autoc) | +				IXGBE_AUTOC_LMS_10G_SERIAL)); +		hw->mac.cached_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);  		ret_val = ixgbe_reset_pipeline_82599(hw);  		if (got_lock) { @@ -244,6 +266,8 @@ static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,  	/* Determine 1G link capabilities off of SFP+ type */  	if (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||  	    hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 || +	    hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 || +	    hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||  	    hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||  	    hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) {  		*speed = IXGBE_LINK_SPEED_1GB_FULL; @@ -563,7 +587,8 @@ static s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,  			return status;  		/* Flap the tx laser if it has not already been done */ -		hw->mac.ops.flap_tx_laser(hw); +		if (hw->mac.ops.flap_tx_laser) +			hw->mac.ops.flap_tx_laser(hw);  		/*  		 * Wait for the controller to acquire link.  Per IEEE 802.3ap, @@ -615,7 +640,8 @@ static s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,  			return status;  		/* Flap the tx laser if it has not already been done */ -		hw->mac.ops.flap_tx_laser(hw); +		if (hw->mac.ops.flap_tx_laser) +			hw->mac.ops.flap_tx_laser(hw);  		/* Wait for the link partner to also set speed */  		msleep(100); @@ -777,12 +803,9 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,  				      bool autoneg_wait_to_complete)  {  	s32 status = 0; -	u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); +	u32 autoc, pma_pmd_1g, link_mode, start_autoc;  	u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); -	u32 start_autoc = autoc;  	u32 orig_autoc = 0; -	u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK; -	u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK;  	u32 pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK;  	u32 links_reg;  	u32 i; @@ -805,9 +828,14 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,  	/* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/  	if (hw->mac.orig_link_settings_stored) -		orig_autoc = hw->mac.orig_autoc; +		autoc = hw->mac.orig_autoc;  	else -		orig_autoc = autoc; +		autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); + +	orig_autoc = autoc; +	start_autoc = hw->mac.cached_autoc; +	link_mode = autoc & IXGBE_AUTOC_LMS_MASK; +	pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK;  	if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR ||  	    link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN || @@ -861,6 +889,7 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,  		/* Restart link */  		IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); +		hw->mac.cached_autoc = autoc;  		ixgbe_reset_pipeline_82599(hw);  		if (got_lock) @@ -932,7 +961,8 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)  {  	ixgbe_link_speed link_speed;  	s32 status; -	u32 ctrl, i, autoc, autoc2; +	u32 ctrl, i, autoc2; +	u32 curr_lms;  	bool link_up = false;  	/* Call adapter stop to disable tx/rx and clear interrupts */ @@ -964,6 +994,13 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)  	if (hw->phy.reset_disable == false && hw->phy.ops.reset != NULL)  		hw->phy.ops.reset(hw); +	/* remember AUTOC from before we reset */ +	if (hw->mac.cached_autoc) +		curr_lms = hw->mac.cached_autoc & IXGBE_AUTOC_LMS_MASK; +	else +		curr_lms = IXGBE_READ_REG(hw, IXGBE_AUTOC) & +			   IXGBE_AUTOC_LMS_MASK; +  mac_reset_top:  	/*  	 * Issue global reset to the MAC. Needs to be SW reset if link is up. @@ -1012,14 +1049,35 @@ mac_reset_top:  	 * stored off yet.  Otherwise restore the stored original  	 * values since the reset operation sets back to defaults.  	 */ -	autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); +	hw->mac.cached_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);  	autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); + +	/* Enable link if disabled in NVM */ +	if (autoc2 & IXGBE_AUTOC2_LINK_DISABLE_MASK) { +		autoc2 &= ~IXGBE_AUTOC2_LINK_DISABLE_MASK; +		IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2); +		IXGBE_WRITE_FLUSH(hw); +	} +  	if (hw->mac.orig_link_settings_stored == false) { -		hw->mac.orig_autoc = autoc; +		hw->mac.orig_autoc = hw->mac.cached_autoc;  		hw->mac.orig_autoc2 = autoc2;  		hw->mac.orig_link_settings_stored = true;  	} else { -		if (autoc != hw->mac.orig_autoc) { + +		/* If MNG FW is running on a multi-speed device that +		 * doesn't autoneg with out driver support we need to +		 * leave LMS in the state it was before we MAC reset. +		 * Likewise if we support WoL we don't want change the +		 * LMS state either. +		 */ +		if ((hw->phy.multispeed_fiber && hw->mng_fw_enabled) || +		    hw->wol_enabled) +			hw->mac.orig_autoc = +				(hw->mac.orig_autoc & ~IXGBE_AUTOC_LMS_MASK) | +				curr_lms; + +		if (hw->mac.cached_autoc != hw->mac.orig_autoc) {  			/* Need SW/FW semaphore around AUTOC writes if LESM is  			 * on, likewise reset_pipeline requires us to hold  			 * this lock as it also writes to AUTOC. @@ -1035,6 +1093,7 @@ mac_reset_top:  			}  			IXGBE_WRITE_REG(hw, IXGBE_AUTOC, hw->mac.orig_autoc); +			hw->mac.cached_autoc = hw->mac.orig_autoc;  			ixgbe_reset_pipeline_82599(hw);  			if (got_lock) @@ -2135,10 +2194,19 @@ static s32 ixgbe_read_eeprom_82599(struct ixgbe_hw *hw,   **/  s32 ixgbe_reset_pipeline_82599(struct ixgbe_hw *hw)  { -	s32 i, autoc_reg, ret_val; -	s32 anlp1_reg = 0; +	s32 ret_val; +	u32 anlp1_reg = 0; +	u32 i, autoc_reg, autoc2_reg; + +	/* Enable link if disabled in NVM */ +	autoc2_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC2); +	if (autoc2_reg & IXGBE_AUTOC2_LINK_DISABLE_MASK) { +		autoc2_reg &= ~IXGBE_AUTOC2_LINK_DISABLE_MASK; +		IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2_reg); +		IXGBE_WRITE_FLUSH(hw); +	} -	autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); +	autoc_reg = hw->mac.cached_autoc;  	autoc_reg |= IXGBE_AUTOC_AN_RESTART;  	/* Write AUTOC register with toggled LMS[2] bit and Restart_AN */ @@ -2216,7 +2284,7 @@ static struct ixgbe_mac_operations mac_ops_82599 = {  	.release_swfw_sync      = &ixgbe_release_swfw_sync,  	.get_thermal_sensor_data = &ixgbe_get_thermal_sensor_data_generic,  	.init_thermal_sensor_thresh = &ixgbe_init_thermal_sensor_thresh_generic, - +	.mng_fw_enabled		= &ixgbe_mng_enabled,  };  static struct ixgbe_eeprom_operations eeprom_ops_82599 = { diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c index 99e472ebaa7..9bcdeb89af5 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c @@ -592,6 +592,36 @@ s32 ixgbe_get_mac_addr_generic(struct ixgbe_hw *hw, u8 *mac_addr)  	return 0;  } +enum ixgbe_bus_width ixgbe_convert_bus_width(u16 link_status) +{ +	switch (link_status & IXGBE_PCI_LINK_WIDTH) { +	case IXGBE_PCI_LINK_WIDTH_1: +		return ixgbe_bus_width_pcie_x1; +	case IXGBE_PCI_LINK_WIDTH_2: +		return ixgbe_bus_width_pcie_x2; +	case IXGBE_PCI_LINK_WIDTH_4: +		return ixgbe_bus_width_pcie_x4; +	case IXGBE_PCI_LINK_WIDTH_8: +		return ixgbe_bus_width_pcie_x8; +	default: +		return ixgbe_bus_width_unknown; +	} +} + +enum ixgbe_bus_speed ixgbe_convert_bus_speed(u16 link_status) +{ +	switch (link_status & IXGBE_PCI_LINK_SPEED) { +	case IXGBE_PCI_LINK_SPEED_2500: +		return ixgbe_bus_speed_2500; +	case IXGBE_PCI_LINK_SPEED_5000: +		return ixgbe_bus_speed_5000; +	case IXGBE_PCI_LINK_SPEED_8000: +		return ixgbe_bus_speed_8000; +	default: +		return ixgbe_bus_speed_unknown; +	} +} +  /**   *  ixgbe_get_bus_info_generic - Generic set PCI bus info   *  @hw: pointer to hardware structure @@ -610,35 +640,8 @@ s32 ixgbe_get_bus_info_generic(struct ixgbe_hw *hw)  	pci_read_config_word(adapter->pdev, IXGBE_PCI_LINK_STATUS,  	                     &link_status); -	switch (link_status & IXGBE_PCI_LINK_WIDTH) { -	case IXGBE_PCI_LINK_WIDTH_1: -		hw->bus.width = ixgbe_bus_width_pcie_x1; -		break; -	case IXGBE_PCI_LINK_WIDTH_2: -		hw->bus.width = ixgbe_bus_width_pcie_x2; -		break; -	case IXGBE_PCI_LINK_WIDTH_4: -		hw->bus.width = ixgbe_bus_width_pcie_x4; -		break; -	case IXGBE_PCI_LINK_WIDTH_8: -		hw->bus.width = ixgbe_bus_width_pcie_x8; -		break; -	default: -		hw->bus.width = ixgbe_bus_width_unknown; -		break; -	} - -	switch (link_status & IXGBE_PCI_LINK_SPEED) { -	case IXGBE_PCI_LINK_SPEED_2500: -		hw->bus.speed = ixgbe_bus_speed_2500; -		break; -	case IXGBE_PCI_LINK_SPEED_5000: -		hw->bus.speed = ixgbe_bus_speed_5000; -		break; -	default: -		hw->bus.speed = ixgbe_bus_speed_unknown; -		break; -	} +	hw->bus.width = ixgbe_convert_bus_width(link_status); +	hw->bus.speed = ixgbe_convert_bus_speed(link_status);  	mac->ops.set_lan_id(hw); @@ -1125,7 +1128,7 @@ s32 ixgbe_read_eerd_buffer_generic(struct ixgbe_hw *hw, u16 offset,  	}  	for (i = 0; i < words; i++) { -		eerd = ((offset + i) << IXGBE_EEPROM_RW_ADDR_SHIFT) + +		eerd = ((offset + i) << IXGBE_EEPROM_RW_ADDR_SHIFT) |  		       IXGBE_EEPROM_RW_REG_START;  		IXGBE_WRITE_REG(hw, IXGBE_EERD, eerd); diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h index bc3948ead6e..22eee38868f 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h @@ -40,6 +40,8 @@ s32 ixgbe_clear_hw_cntrs_generic(struct ixgbe_hw *hw);  s32 ixgbe_read_pba_string_generic(struct ixgbe_hw *hw, u8 *pba_num,                                    u32 pba_num_size);  s32 ixgbe_get_mac_addr_generic(struct ixgbe_hw *hw, u8 *mac_addr); +enum ixgbe_bus_width ixgbe_convert_bus_width(u16 link_status); +enum ixgbe_bus_speed ixgbe_convert_bus_speed(u16 link_status);  s32 ixgbe_get_bus_info_generic(struct ixgbe_hw *hw);  void ixgbe_set_lan_id_multi_port_pcie(struct ixgbe_hw *hw);  s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw); diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c index c3f1afd8690..d3754722adb 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c @@ -231,6 +231,10 @@ static int ixgbe_get_settings(struct net_device *netdev,  		case ixgbe_sfp_type_lr:  		case ixgbe_sfp_type_srlr_core0:  		case ixgbe_sfp_type_srlr_core1: +		case ixgbe_sfp_type_1g_sx_core0: +		case ixgbe_sfp_type_1g_sx_core1: +		case ixgbe_sfp_type_1g_lx_core0: +		case ixgbe_sfp_type_1g_lx_core1:  			ecmd->supported |= SUPPORTED_FIBRE;  			ecmd->advertising |= ADVERTISED_FIBRE;  			ecmd->port = PORT_FIBRE; @@ -246,12 +250,6 @@ static int ixgbe_get_settings(struct net_device *netdev,  			ecmd->advertising |= ADVERTISED_TP;  			ecmd->port = PORT_TP;  			break; -		case ixgbe_sfp_type_1g_sx_core0: -		case ixgbe_sfp_type_1g_sx_core1: -			ecmd->supported |= SUPPORTED_FIBRE; -			ecmd->advertising |= ADVERTISED_FIBRE; -			ecmd->port = PORT_FIBRE; -			break;  		case ixgbe_sfp_type_unknown:  		default:  			ecmd->supported |= SUPPORTED_FIBRE; @@ -442,7 +440,8 @@ static void ixgbe_get_regs(struct net_device *netdev,  	memset(p, 0, IXGBE_REGS_LEN * sizeof(u32)); -	regs->version = (1 << 24) | hw->revision_id << 16 | hw->device_id; +	regs->version = hw->mac.type << 24 | hw->revision_id << 16 | +			hw->device_id;  	/* General Registers */  	regs_buff[0] = IXGBE_READ_REG(hw, IXGBE_CTRL); @@ -1611,16 +1610,9 @@ static int ixgbe_setup_loopback_test(struct ixgbe_adapter *adapter)  	struct ixgbe_hw *hw = &adapter->hw;  	u32 reg_data; -	/* X540 needs to set the MACC.FLU bit to force link up */ -	if (adapter->hw.mac.type == ixgbe_mac_X540) { -		reg_data = IXGBE_READ_REG(hw, IXGBE_MACC); -		reg_data |= IXGBE_MACC_FLU; -		IXGBE_WRITE_REG(hw, IXGBE_MACC, reg_data); -	} -	/* right now we only support MAC loopback in the driver */ -	reg_data = IXGBE_READ_REG(hw, IXGBE_HLREG0);  	/* Setup MAC loopback */ +	reg_data = IXGBE_READ_REG(hw, IXGBE_HLREG0);  	reg_data |= IXGBE_HLREG0_LPBK;  	IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_data); @@ -1628,10 +1620,19 @@ static int ixgbe_setup_loopback_test(struct ixgbe_adapter *adapter)  	reg_data |= IXGBE_FCTRL_BAM | IXGBE_FCTRL_SBP | IXGBE_FCTRL_MPE;  	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg_data); -	reg_data = IXGBE_READ_REG(hw, IXGBE_AUTOC); -	reg_data &= ~IXGBE_AUTOC_LMS_MASK; -	reg_data |= IXGBE_AUTOC_LMS_10G_LINK_NO_AN | IXGBE_AUTOC_FLU; -	IXGBE_WRITE_REG(hw, IXGBE_AUTOC, reg_data); +	/* X540 needs to set the MACC.FLU bit to force link up */ +	if (adapter->hw.mac.type == ixgbe_mac_X540) { +		reg_data = IXGBE_READ_REG(hw, IXGBE_MACC); +		reg_data |= IXGBE_MACC_FLU; +		IXGBE_WRITE_REG(hw, IXGBE_MACC, reg_data); +	} else { +		if (hw->mac.orig_autoc) { +			reg_data = hw->mac.orig_autoc | IXGBE_AUTOC_FLU; +			IXGBE_WRITE_REG(hw, IXGBE_AUTOC, reg_data); +		} else { +			return 10; +		} +	}  	IXGBE_WRITE_FLUSH(hw);  	usleep_range(10000, 20000); diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 79f4a26ea6c..d30fbdd81fc 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -63,7 +63,7 @@ char ixgbe_default_device_descr[] =  static char ixgbe_default_device_descr[] =  			      "Intel(R) 10 Gigabit Network Connection";  #endif -#define DRV_VERSION "3.11.33-k" +#define DRV_VERSION "3.13.10-k"  const char ixgbe_driver_version[] = DRV_VERSION;  static const char ixgbe_copyright[] =  				"Copyright (c) 1999-2013 Intel Corporation."; @@ -149,6 +149,52 @@ MODULE_DESCRIPTION("Intel(R) 10 Gigabit PCI Express Network Driver");  MODULE_LICENSE("GPL");  MODULE_VERSION(DRV_VERSION); +static int ixgbe_read_pci_cfg_word_parent(struct ixgbe_adapter *adapter, +					  u32 reg, u16 *value) +{ +	int pos = 0; +	struct pci_dev *parent_dev; +	struct pci_bus *parent_bus; + +	parent_bus = adapter->pdev->bus->parent; +	if (!parent_bus) +		return -1; + +	parent_dev = parent_bus->self; +	if (!parent_dev) +		return -1; + +	pos = pci_find_capability(parent_dev, PCI_CAP_ID_EXP); +	if (!pos) +		return -1; + +	pci_read_config_word(parent_dev, pos + reg, value); +	return 0; +} + +static s32 ixgbe_get_parent_bus_info(struct ixgbe_adapter *adapter) +{ +	struct ixgbe_hw *hw = &adapter->hw; +	u16 link_status = 0; +	int err; + +	hw->bus.type = ixgbe_bus_type_pci_express; + +	/* Get the negotiated link width and speed from PCI config space of the +	 * parent, as this device is behind a switch +	 */ +	err = ixgbe_read_pci_cfg_word_parent(adapter, 18, &link_status); + +	/* assume caller will handle error case */ +	if (err) +		return err; + +	hw->bus.width = ixgbe_convert_bus_width(link_status); +	hw->bus.speed = ixgbe_convert_bus_speed(link_status); + +	return 0; +} +  static void ixgbe_service_event_schedule(struct ixgbe_adapter *adapter)  {  	if (!test_bit(__IXGBE_DOWN, &adapter->state) && @@ -1337,7 +1383,7 @@ static unsigned int ixgbe_get_headlen(unsigned char *data,  			return hdr.network - data;  		/* record next protocol if header is present */ -		if (!hdr.ipv4->frag_off) +		if (!(hdr.ipv4->frag_off & htons(IP_OFFSET)))  			nexthdr = hdr.ipv4->protocol;  	} else if (protocol == __constant_htons(ETH_P_IPV6)) {  		if ((hdr.network - data) > (max_len - sizeof(struct ipv6hdr))) @@ -1442,10 +1488,10 @@ static void ixgbe_process_skb_fields(struct ixgbe_ring *rx_ring,  	ixgbe_ptp_rx_hwtstamp(rx_ring, rx_desc, skb); -	if ((dev->features & NETIF_F_HW_VLAN_RX) && +	if ((dev->features & NETIF_F_HW_VLAN_CTAG_RX) &&  	    ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_VP)) {  		u16 vid = le16_to_cpu(rx_desc->wb.upper.vlan); -		__vlan_hwaccel_put_tag(skb, vid); +		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vid);  	}  	skb_record_rx_queue(skb, rx_ring->queue_index); @@ -2049,6 +2095,9 @@ static void ixgbe_update_itr(struct ixgbe_q_vector *q_vector,  	 */  	/* what was last interrupt timeslice? */  	timepassed_us = q_vector->itr >> 2; +	if (timepassed_us == 0) +		return; +  	bytes_perint = bytes / timepassed_us; /* bytes/usec */  	switch (itr_setting) { @@ -2405,6 +2454,16 @@ static irqreturn_t ixgbe_msix_other(int irq, void *data)  	 * with the write to EICR.  	 */  	eicr = IXGBE_READ_REG(hw, IXGBE_EICS); + +	/* The lower 16bits of the EICR register are for the queue interrupts +	 * which should be masked here in order to not accidently clear them if +	 * the bits are high when ixgbe_msix_other is called. There is a race +	 * condition otherwise which results in possible performance loss +	 * especially if the ixgbe_msix_other interrupt is triggering +	 * consistently (as it would when PPS is turned on for the X540 device) +	 */ +	eicr &= 0xFFFF0000; +  	IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);  	if (eicr & IXGBE_EICR_LSC) @@ -3421,7 +3480,8 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)  	hw->mac.ops.enable_rx_dma(hw, rxctrl);  } -static int ixgbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid) +static int ixgbe_vlan_rx_add_vid(struct net_device *netdev, +				 __be16 proto, u16 vid)  {  	struct ixgbe_adapter *adapter = netdev_priv(netdev);  	struct ixgbe_hw *hw = &adapter->hw; @@ -3433,7 +3493,8 @@ static int ixgbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)  	return 0;  } -static int ixgbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) +static int ixgbe_vlan_rx_kill_vid(struct net_device *netdev, +				  __be16 proto, u16 vid)  {  	struct ixgbe_adapter *adapter = netdev_priv(netdev);  	struct ixgbe_hw *hw = &adapter->hw; @@ -3538,10 +3599,10 @@ static void ixgbe_restore_vlan(struct ixgbe_adapter *adapter)  {  	u16 vid; -	ixgbe_vlan_rx_add_vid(adapter->netdev, 0); +	ixgbe_vlan_rx_add_vid(adapter->netdev, htons(ETH_P_8021Q), 0);  	for_each_set_bit(vid, adapter->active_vlans, VLAN_N_VID) -		ixgbe_vlan_rx_add_vid(adapter->netdev, vid); +		ixgbe_vlan_rx_add_vid(adapter->netdev, htons(ETH_P_8021Q), vid);  }  /** @@ -3676,7 +3737,7 @@ void ixgbe_set_rx_mode(struct net_device *netdev)  	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl); -	if (netdev->features & NETIF_F_HW_VLAN_RX) +	if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX)  		ixgbe_vlan_strip_enable(adapter);  	else  		ixgbe_vlan_strip_disable(adapter); @@ -5077,14 +5138,14 @@ static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake)  	netif_device_detach(netdev); +	rtnl_lock();  	if (netif_running(netdev)) { -		rtnl_lock();  		ixgbe_down(adapter);  		ixgbe_free_irq(adapter);  		ixgbe_free_all_tx_resources(adapter);  		ixgbe_free_all_rx_resources(adapter); -		rtnl_unlock();  	} +	rtnl_unlock();  	ixgbe_clear_interrupt_scheme(adapter); @@ -6425,9 +6486,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,  	struct ixgbe_tx_buffer *first;  	int tso;  	u32 tx_flags = 0; -#if PAGE_SIZE > IXGBE_MAX_DATA_PER_TXD  	unsigned short f; -#endif  	u16 count = TXD_USE_COUNT(skb_headlen(skb));  	__be16 protocol = skb->protocol;  	u8 hdr_len = 0; @@ -6439,12 +6498,9 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,  	 *       + 1 desc for context descriptor,  	 * otherwise try next time  	 */ -#if PAGE_SIZE > IXGBE_MAX_DATA_PER_TXD  	for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)  		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size); -#else -	count += skb_shinfo(skb)->nr_frags; -#endif +  	if (ixgbe_maybe_stop_tx(tx_ring, count + 3)) {  		tx_ring->tx_stats.tx_busy++;  		return NETDEV_TX_BUSY; @@ -6983,7 +7039,7 @@ static int ixgbe_set_features(struct net_device *netdev,  		break;  	} -	if (features & NETIF_F_HW_VLAN_RX) +	if (features & NETIF_F_HW_VLAN_CTAG_RX)  		ixgbe_vlan_strip_enable(adapter);  	else  		ixgbe_vlan_strip_disable(adapter); @@ -7007,7 +7063,7 @@ static int ixgbe_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],  	int err;  	if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) -		return -EOPNOTSUPP; +		return ndo_dflt_fdb_add(ndm, tb, dev, addr, flags);  	/* Hardware does not support aging addresses so if a  	 * ndm_state is given only allow permanent addresses @@ -7038,44 +7094,6 @@ static int ixgbe_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],  	return err;  } -static int ixgbe_ndo_fdb_del(struct ndmsg *ndm, struct nlattr *tb[], -			     struct net_device *dev, -			     const unsigned char *addr) -{ -	struct ixgbe_adapter *adapter = netdev_priv(dev); -	int err = -EOPNOTSUPP; - -	if (ndm->ndm_state & NUD_PERMANENT) { -		pr_info("%s: FDB only supports static addresses\n", -			ixgbe_driver_name); -		return -EINVAL; -	} - -	if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) { -		if (is_unicast_ether_addr(addr)) -			err = dev_uc_del(dev, addr); -		else if (is_multicast_ether_addr(addr)) -			err = dev_mc_del(dev, addr); -		else -			err = -EINVAL; -	} - -	return err; -} - -static int ixgbe_ndo_fdb_dump(struct sk_buff *skb, -			      struct netlink_callback *cb, -			      struct net_device *dev, -			      int idx) -{ -	struct ixgbe_adapter *adapter = netdev_priv(dev); - -	if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) -		idx = ndo_dflt_fdb_dump(skb, cb, dev, idx); - -	return idx; -} -  static int ixgbe_ndo_bridge_setlink(struct net_device *dev,  				    struct nlmsghdr *nlh)  { @@ -7171,8 +7189,6 @@ static const struct net_device_ops ixgbe_netdev_ops = {  	.ndo_set_features = ixgbe_set_features,  	.ndo_fix_features = ixgbe_fix_features,  	.ndo_fdb_add		= ixgbe_ndo_fdb_add, -	.ndo_fdb_del		= ixgbe_ndo_fdb_del, -	.ndo_fdb_dump		= ixgbe_ndo_fdb_dump,  	.ndo_bridge_setlink	= ixgbe_ndo_bridge_setlink,  	.ndo_bridge_getlink	= ixgbe_ndo_bridge_getlink,  }; @@ -7202,9 +7218,19 @@ int ixgbe_wol_supported(struct ixgbe_adapter *adapter, u16 device_id,  			/* only support first port */  			if (hw->bus.func != 0)  				break; +		case IXGBE_SUBDEV_ID_82599_SP_560FLR:  		case IXGBE_SUBDEV_ID_82599_SFP:  		case IXGBE_SUBDEV_ID_82599_RNDC:  		case IXGBE_SUBDEV_ID_82599_ECNA_DP: +		case IXGBE_SUBDEV_ID_82599_LOM_SFP: +			is_wol_supported = 1; +			break; +		} +		break; +	case IXGBE_DEV_ID_82599EN_SFP: +		/* Only this subdevice supports WOL */ +		switch (subdevice_id) { +		case IXGBE_SUBDEV_ID_82599EN_SFP_OCP1:  			is_wol_supported = 1;  			break;  		} @@ -7369,6 +7395,10 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	if (err)  		goto err_sw_init; +	/* Cache if MNG FW is up so we don't have to read the REG later */ +	if (hw->mac.ops.mng_fw_enabled) +		hw->mng_fw_enabled = hw->mac.ops.mng_fw_enabled(hw); +  	/* Make it possible the adapter to be woken up via WOL */  	switch (adapter->hw.mac.type) {  	case ixgbe_mac_82599EB: @@ -7425,9 +7455,9 @@ skip_sriov:  	netdev->features = NETIF_F_SG |  			   NETIF_F_IP_CSUM |  			   NETIF_F_IPV6_CSUM | -			   NETIF_F_HW_VLAN_TX | -			   NETIF_F_HW_VLAN_RX | -			   NETIF_F_HW_VLAN_FILTER | +			   NETIF_F_HW_VLAN_CTAG_TX | +			   NETIF_F_HW_VLAN_CTAG_RX | +			   NETIF_F_HW_VLAN_CTAG_FILTER |  			   NETIF_F_TSO |  			   NETIF_F_TSO6 |  			   NETIF_F_RXHASH | @@ -7521,7 +7551,9 @@ skip_sriov:  	/* WOL not supported for all devices */  	adapter->wol = 0;  	hw->eeprom.ops.read(hw, 0x2c, &adapter->eeprom_cap); -	if (ixgbe_wol_supported(adapter, pdev->device, pdev->subsystem_device)) +	hw->wol_enabled = ixgbe_wol_supported(adapter, pdev->device, +						pdev->subsystem_device); +	if (hw->wol_enabled)  		adapter->wol = IXGBE_WUFC_MAG;  	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); @@ -7532,10 +7564,13 @@ skip_sriov:  	/* pick up the PCI bus settings for reporting later */  	hw->mac.ops.get_bus_info(hw); +	if (hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) +		ixgbe_get_parent_bus_info(adapter);  	/* print bus type/speed/width info */  	e_dev_info("(PCI Express:%s:%s) %pM\n", -		   (hw->bus.speed == ixgbe_bus_speed_5000 ? "5.0GT/s" : +		   (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" : @@ -7615,9 +7650,13 @@ skip_sriov:  		e_err(probe, "failed to allocate sysfs resources\n");  #endif /* CONFIG_IXGBE_HWMON */ -#ifdef CONFIG_DEBUG_FS  	ixgbe_dbg_adapter_init(adapter); -#endif /* CONFIG_DEBUG_FS */ + +	/* Need link setup for MNG FW, else wait for IXGBE_UP */ +	if (hw->mng_fw_enabled && hw->mac.ops.setup_link) +		hw->mac.ops.setup_link(hw, +			IXGBE_LINK_SPEED_10GB_FULL | IXGBE_LINK_SPEED_1GB_FULL, +			true);  	return 0; @@ -7653,9 +7692,7 @@ static void ixgbe_remove(struct pci_dev *pdev)  	struct ixgbe_adapter *adapter = pci_get_drvdata(pdev);  	struct net_device *netdev = adapter->netdev; -#ifdef CONFIG_DEBUG_FS  	ixgbe_dbg_adapter_exit(adapter); -#endif /*CONFIG_DEBUG_FS */  	set_bit(__IXGBE_DOWN, &adapter->state);  	cancel_work_sync(&adapter->service_task); @@ -7918,15 +7955,11 @@ static int __init ixgbe_init_module(void)  	pr_info("%s - version %s\n", ixgbe_driver_string, ixgbe_driver_version);  	pr_info("%s\n", ixgbe_copyright); -#ifdef CONFIG_DEBUG_FS  	ixgbe_dbg_init(); -#endif /* CONFIG_DEBUG_FS */  	ret = pci_register_driver(&ixgbe_driver);  	if (ret) { -#ifdef CONFIG_DEBUG_FS  		ixgbe_dbg_exit(); -#endif /* CONFIG_DEBUG_FS */  		return ret;  	} @@ -7952,9 +7985,7 @@ static void __exit ixgbe_exit_module(void)  #endif  	pci_unregister_driver(&ixgbe_driver); -#ifdef CONFIG_DEBUG_FS  	ixgbe_dbg_exit(); -#endif /* CONFIG_DEBUG_FS */  	rcu_barrier(); /* Wait for completion of call_rcu()'s */  } diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c index 060d2ad2ac9..e5691ccbce9 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c @@ -956,6 +956,13 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)  				else  					hw->phy.sfp_type =  						ixgbe_sfp_type_1g_sx_core1; +			} else if (comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) { +				if (hw->bus.lan_id == 0) +					hw->phy.sfp_type = +						ixgbe_sfp_type_1g_lx_core0; +				else +					hw->phy.sfp_type = +						ixgbe_sfp_type_1g_lx_core1;  			} else {  				hw->phy.sfp_type = ixgbe_sfp_type_unknown;  			} @@ -1043,6 +1050,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)  		if (comp_codes_10g == 0 &&  		    !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||  		      hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 || +		      hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 || +		      hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||  		      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||  		      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {  			hw->phy.type = ixgbe_phy_sfp_unsupported; @@ -1058,10 +1067,12 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)  		hw->mac.ops.get_device_caps(hw, &enforce_sfp);  		if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) && -		    !((hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0) || -		      (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1) || -		      (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0) || -		      (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1))) { +		    !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 || +		      hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 || +		      hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 || +		      hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 || +		      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 || +		      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {  			/* Make sure we're a supported PHY type */  			if (hw->phy.type == ixgbe_phy_sfp_intel) {  				status = 0; @@ -1125,10 +1136,12 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,  	 * SR modules  	 */  	if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 || +	    sfp_type == ixgbe_sfp_type_1g_lx_core0 ||  	    sfp_type == ixgbe_sfp_type_1g_cu_core0 ||  	    sfp_type == ixgbe_sfp_type_1g_sx_core0)  		sfp_type = ixgbe_sfp_type_srlr_core0;  	else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 || +		 sfp_type == ixgbe_sfp_type_1g_lx_core1 ||  		 sfp_type == ixgbe_sfp_type_1g_cu_core1 ||  		 sfp_type == ixgbe_sfp_type_1g_sx_core1)  		sfp_type = ixgbe_sfp_type_srlr_core1; diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index 97e33669c0b..1e7d587c4e5 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c @@ -35,7 +35,7 @@  #include <linux/ip.h>  #include <linux/tcp.h>  #include <linux/ipv6.h> -#ifdef NETIF_F_HW_VLAN_TX +#ifdef NETIF_F_HW_VLAN_CTAG_TX  #include <linux/if_vlan.h>  #endif @@ -661,13 +661,7 @@ int ixgbe_vf_configuration(struct pci_dev *pdev, unsigned int event_mask)  	bool enable = ((event_mask & 0x10000000U) != 0);  	if (enable) { -		eth_random_addr(vf_mac_addr); -		e_info(probe, "IOV: VF %d is enabled MAC %pM\n", -		       vfn, vf_mac_addr); -		/* -		 * Store away the VF "permananet" MAC address, it will ask -		 * for it later. -		 */ +		eth_zero_addr(vf_mac_addr);  		memcpy(adapter->vfinfo[vfn].vf_mac_addresses, vf_mac_addr, 6);  	} @@ -688,7 +682,8 @@ static int ixgbe_vf_reset_msg(struct ixgbe_adapter *adapter, u32 vf)  	ixgbe_vf_reset_event(adapter, vf);  	/* set vf mac address */ -	ixgbe_set_vf_mac(adapter, vf, vf_mac); +	if (!is_zero_ether_addr(vf_mac)) +		ixgbe_set_vf_mac(adapter, vf, vf_mac);  	vf_shift = vf % 32;  	reg_offset = vf / 32; @@ -729,8 +724,16 @@ static int ixgbe_vf_reset_msg(struct ixgbe_adapter *adapter, u32 vf)  	IXGBE_WRITE_REG(hw, IXGBE_VMECM(reg_offset), reg);  	/* reply to reset with ack and vf mac address */ -	msgbuf[0] = IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_ACK; -	memcpy(addr, vf_mac, ETH_ALEN); +	msgbuf[0] = IXGBE_VF_RESET; +	if (!is_zero_ether_addr(vf_mac)) { +		msgbuf[0] |= IXGBE_VT_MSGTYPE_ACK; +		memcpy(addr, vf_mac, ETH_ALEN); +	} else { +		msgbuf[0] |= IXGBE_VT_MSGTYPE_NACK; +		dev_warn(&adapter->pdev->dev, +			 "VF %d has no MAC address assigned, you may have to assign one manually\n", +			 vf); +	}  	/*  	 * Piggyback the multicast filter type so VF can compute the diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h index 6652e96c352..70c6aa3d3f9 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h @@ -56,10 +56,13 @@  #define IXGBE_SUBDEV_ID_82599_SFP        0x11A9  #define IXGBE_SUBDEV_ID_82599_RNDC       0x1F72  #define IXGBE_SUBDEV_ID_82599_560FLR     0x17D0 +#define IXGBE_SUBDEV_ID_82599_SP_560FLR  0x211B  #define IXGBE_SUBDEV_ID_82599_ECNA_DP    0x0470 +#define IXGBE_SUBDEV_ID_82599_LOM_SFP    0x8976  #define IXGBE_DEV_ID_82599_SFP_EM        0x1507  #define IXGBE_DEV_ID_82599_SFP_SF2       0x154D  #define IXGBE_DEV_ID_82599EN_SFP         0x1557 +#define IXGBE_SUBDEV_ID_82599EN_SFP_OCP1 0x0001  #define IXGBE_DEV_ID_82599_XAUI_LOM      0x10FC  #define IXGBE_DEV_ID_82599_COMBO_BACKPLANE 0x10F8  #define IXGBE_SUBDEV_ID_82599_KX4_KR_MEZZ  0x000C @@ -729,6 +732,13 @@ struct ixgbe_thermal_sensor_data {  #define IXGBE_MDEF_EXT(_i) (0x05160 + ((_i) * 4)) /* 8 of these (0-7) */  #define IXGBE_LSWFW     0x15014 +/* Management Bit Fields and Masks */ +#define IXGBE_MANC_RCV_TCO_EN	0x00020000 /* Rcv TCO packet enable */ + +/* Firmware Semaphore Register */ +#define IXGBE_FWSM_MODE_MASK	0xE +#define IXGBE_FWSM_FW_MODE_PT	0x4 +  /* ARC Subsystem registers */  #define IXGBE_HICR      0x15F00  #define IXGBE_FWSTS     0x15F0C @@ -1019,6 +1029,7 @@ struct ixgbe_thermal_sensor_data {  #define IXGBE_CTRL_RST_MASK     (IXGBE_CTRL_LNK_RST | IXGBE_CTRL_RST)  /* FACTPS */ +#define IXGBE_FACTPS_MNGCG      0x20000000 /* Manageblility Clock Gated */  #define IXGBE_FACTPS_LFS        0x40000000 /* LAN Function Select */  /* MHADD Bit Masks */ @@ -1582,6 +1593,7 @@ enum {  #define IXGBE_AUTOC2_10G_KR  (0x0 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT)  #define IXGBE_AUTOC2_10G_XFI (0x1 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT)  #define IXGBE_AUTOC2_10G_SFI (0x2 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT) +#define IXGBE_AUTOC2_LINK_DISABLE_MASK        0x70000000  #define IXGBE_MACC_FLU       0x00000001  #define IXGBE_MACC_FSV_10G   0x00030000 @@ -1827,6 +1839,7 @@ enum {  #define IXGBE_PCI_LINK_SPEED      0xF  #define IXGBE_PCI_LINK_SPEED_2500 0x1  #define IXGBE_PCI_LINK_SPEED_5000 0x2 +#define IXGBE_PCI_LINK_SPEED_8000 0x3  #define IXGBE_PCI_HEADER_TYPE_REGISTER  0x0E  #define IXGBE_PCI_HEADER_TYPE_MULTIFUNC 0x80  #define IXGBE_PCI_DEVICE_CONTROL2_16ms  0x0005 @@ -2600,6 +2613,8 @@ enum ixgbe_sfp_type {  	ixgbe_sfp_type_1g_cu_core1 = 10,  	ixgbe_sfp_type_1g_sx_core0 = 11,  	ixgbe_sfp_type_1g_sx_core1 = 12, +	ixgbe_sfp_type_1g_lx_core0 = 13, +	ixgbe_sfp_type_1g_lx_core1 = 14,  	ixgbe_sfp_type_not_present = 0xFFFE,  	ixgbe_sfp_type_unknown = 0xFFFF  }; @@ -2650,6 +2665,7 @@ enum ixgbe_bus_speed {  	ixgbe_bus_speed_133     = 133,  	ixgbe_bus_speed_2500    = 2500,  	ixgbe_bus_speed_5000    = 5000, +	ixgbe_bus_speed_8000    = 8000,  	ixgbe_bus_speed_reserved  }; @@ -2859,6 +2875,7 @@ struct ixgbe_mac_operations {  	s32 (*set_fw_drv_ver)(struct ixgbe_hw *, u8, u8, u8, u8);  	s32 (*get_thermal_sensor_data)(struct ixgbe_hw *);  	s32 (*init_thermal_sensor_thresh)(struct ixgbe_hw *hw); +	bool (*mng_fw_enabled)(struct ixgbe_hw *hw);  };  struct ixgbe_phy_operations { @@ -2912,6 +2929,7 @@ struct ixgbe_mac_info {  	u32                             max_tx_queues;  	u32                             max_rx_queues;  	u32                             orig_autoc; +	u32                             cached_autoc;  	u32                             orig_autoc2;  	bool                            orig_link_settings_stored;  	bool                            autotry_restart; @@ -2986,6 +3004,8 @@ struct ixgbe_hw {  	bool				adapter_stopped;  	bool				force_full_reset;  	bool				allow_unsupported_sfp; +	bool				mng_fw_enabled; +	bool				wol_enabled;  };  struct ixgbe_info { diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c index 66c5e946284..389324f5929 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c @@ -854,6 +854,7 @@ static struct ixgbe_mac_operations mac_ops_X540 = {  	.enable_rx_buff		= &ixgbe_enable_rx_buff_generic,  	.get_thermal_sensor_data = NULL,  	.init_thermal_sensor_thresh = NULL, +	.mng_fw_enabled		= NULL,  };  static struct ixgbe_eeprom_operations eeprom_ops_X540 = {  |