diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/netdev.c')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 163 | 
1 files changed, 100 insertions, 63 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 9b4ec13d9161..75e60897b7e7 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -242,7 +242,7 @@ static void e1000e_dump(struct e1000_adapter *adapter)  		dev_info(&adapter->pdev->dev, "Net device Info\n");  		pr_info("Device Name     state            trans_start      last_rx\n");  		pr_info("%-15s %016lX %016lX %016lX\n", netdev->name, -			netdev->state, netdev->trans_start, netdev->last_rx); +			netdev->state, dev_trans_start(netdev), netdev->last_rx);  	}  	/* Print Registers */ @@ -317,8 +317,8 @@ static void e1000e_dump(struct e1000_adapter *adapter)  		else  			next_desc = "";  		pr_info("T%c[0x%03X]    %016llX %016llX %016llX %04X  %3X %016llX %p%s\n", -			(!(le64_to_cpu(u0->b) & (1 << 29)) ? 'l' : -			 ((le64_to_cpu(u0->b) & (1 << 20)) ? 'd' : 'c')), +			(!(le64_to_cpu(u0->b) & BIT(29)) ? 'l' : +			 ((le64_to_cpu(u0->b) & BIT(20)) ? 'd' : 'c')),  			i,  			(unsigned long long)le64_to_cpu(u0->a),  			(unsigned long long)le64_to_cpu(u0->b), @@ -2018,7 +2018,7 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)  	adapter->eiac_mask |= E1000_IMS_OTHER;  	/* Cause Tx interrupts on every write back */ -	ivar |= (1 << 31); +	ivar |= BIT(31);  	ew32(IVAR, ivar); @@ -2709,7 +2709,7 @@ static int e1000_vlan_rx_add_vid(struct net_device *netdev,  	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {  		index = (vid >> 5) & 0x7F;  		vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index); -		vfta |= (1 << (vid & 0x1F)); +		vfta |= BIT((vid & 0x1F));  		hw->mac.ops.write_vfta(hw, index, vfta);  	} @@ -2737,7 +2737,7 @@ static int e1000_vlan_rx_kill_vid(struct net_device *netdev,  	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {  		index = (vid >> 5) & 0x7F;  		vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index); -		vfta &= ~(1 << (vid & 0x1F)); +		vfta &= ~BIT((vid & 0x1F));  		hw->mac.ops.write_vfta(hw, index, vfta);  	} @@ -2878,7 +2878,7 @@ static void e1000_init_manageability_pt(struct e1000_adapter *adapter)  			/* Enable this decision filter in MANC2H */  			if (mdef) -				manc2h |= (1 << i); +				manc2h |= BIT(i);  			j |= mdef;  		} @@ -2891,7 +2891,7 @@ static void e1000_init_manageability_pt(struct e1000_adapter *adapter)  			if (er32(MDEF(i)) == 0) {  				ew32(MDEF(i), (E1000_MDEF_PORT_623 |  					       E1000_MDEF_PORT_664)); -				manc2h |= (1 << 1); +				manc2h |= BIT(1);  				j++;  				break;  			} @@ -2971,7 +2971,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)  		/* set the speed mode bit, we'll clear it if we're not at  		 * gigabit link later  		 */ -#define SPEED_MODE_BIT (1 << 21) +#define SPEED_MODE_BIT BIT(21)  		tarc |= SPEED_MODE_BIT;  		ew32(TARC(0), tarc);  	} @@ -3071,12 +3071,12 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)  		e1e_rphy(hw, PHY_REG(770, 26), &phy_data);  		phy_data &= 0xfff8; -		phy_data |= (1 << 2); +		phy_data |= BIT(2);  		e1e_wphy(hw, PHY_REG(770, 26), phy_data);  		e1e_rphy(hw, 22, &phy_data);  		phy_data &= 0x0fff; -		phy_data |= (1 << 14); +		phy_data |= BIT(14);  		e1e_wphy(hw, 0x10, 0x2823);  		e1e_wphy(hw, 0x11, 0x0003);  		e1e_wphy(hw, 22, phy_data); @@ -3368,12 +3368,12 @@ static int e1000e_write_uc_addr_list(struct net_device *netdev)  		 * combining  		 */  		netdev_for_each_uc_addr(ha, netdev) { -			int rval; +			int ret_val;  			if (!rar_entries)  				break; -			rval = hw->mac.ops.rar_set(hw, ha->addr, rar_entries--); -			if (rval < 0) +			ret_val = hw->mac.ops.rar_set(hw, ha->addr, rar_entries--); +			if (ret_val < 0)  				return -ENOMEM;  			count++;  		} @@ -3503,8 +3503,8 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca)  	    !(er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_ENABLED)) {  		u32 fextnvm7 = er32(FEXTNVM7); -		if (!(fextnvm7 & (1 << 0))) { -			ew32(FEXTNVM7, fextnvm7 | (1 << 0)); +		if (!(fextnvm7 & BIT(0))) { +			ew32(FEXTNVM7, fextnvm7 | BIT(0));  			e1e_flush();  		}  	} @@ -3580,7 +3580,6 @@ static int e1000e_config_hwtstamp(struct e1000_adapter *adapter,  	bool is_l4 = false;  	bool is_l2 = false;  	u32 regval; -	s32 ret_val;  	if (!(adapter->flags & FLAG_HAS_HW_TIMESTAMP))  		return -EINVAL; @@ -3719,16 +3718,6 @@ static int e1000e_config_hwtstamp(struct e1000_adapter *adapter,  	er32(RXSTMPH);  	er32(TXSTMPH); -	/* Get and set the System Time Register SYSTIM base frequency */ -	ret_val = e1000e_get_base_timinca(adapter, ®val); -	if (ret_val) -		return ret_val; -	ew32(TIMINCA, regval); - -	/* reset the ns time counter */ -	timecounter_init(&adapter->tc, &adapter->cc, -			 ktime_to_ns(ktime_get_real())); -  	return 0;  } @@ -3839,7 +3828,7 @@ static void e1000_flush_rx_ring(struct e1000_adapter *adapter)  	/* update thresholds: prefetch threshold to 31, host threshold to 1  	 * and make sure the granularity is "descriptors" and not "cache lines"  	 */ -	rxdctl |= (0x1F | (1 << 8) | E1000_RXDCTL_THRESH_UNIT_DESC); +	rxdctl |= (0x1F | BIT(8) | E1000_RXDCTL_THRESH_UNIT_DESC);  	ew32(RXDCTL(0), rxdctl);  	/* momentarily enable the RX ring for the changes to take effect */ @@ -3885,6 +3874,53 @@ static void e1000_flush_desc_rings(struct e1000_adapter *adapter)  }  /** + * e1000e_systim_reset - reset the timesync registers after a hardware reset + * @adapter: board private structure + * + * When the MAC is reset, all hardware bits for timesync will be reset to the + * default values. This function will restore the settings last in place. + * Since the clock SYSTIME registers are reset, we will simply restore the + * cyclecounter to the kernel real clock time. + **/ +static void e1000e_systim_reset(struct e1000_adapter *adapter) +{ +	struct ptp_clock_info *info = &adapter->ptp_clock_info; +	struct e1000_hw *hw = &adapter->hw; +	unsigned long flags; +	u32 timinca; +	s32 ret_val; + +	if (!(adapter->flags & FLAG_HAS_HW_TIMESTAMP)) +		return; + +	if (info->adjfreq) { +		/* restore the previous ptp frequency delta */ +		ret_val = info->adjfreq(info, adapter->ptp_delta); +	} else { +		/* set the default base frequency if no adjustment possible */ +		ret_val = e1000e_get_base_timinca(adapter, &timinca); +		if (!ret_val) +			ew32(TIMINCA, timinca); +	} + +	if (ret_val) { +		dev_warn(&adapter->pdev->dev, +			 "Failed to restore TIMINCA clock rate delta: %d\n", +			 ret_val); +		return; +	} + +	/* reset the systim ns time counter */ +	spin_lock_irqsave(&adapter->systim_lock, flags); +	timecounter_init(&adapter->tc, &adapter->cc, +			 ktime_to_ns(ktime_get_real())); +	spin_unlock_irqrestore(&adapter->systim_lock, flags); + +	/* restore the previous hwtstamp configuration settings */ +	e1000e_config_hwtstamp(adapter, &adapter->hwtstamp_config); +} + +/**   * e1000e_reset - bring the hardware into a known good state   *   * This function boots the hardware and enables some settings that @@ -4063,8 +4099,8 @@ void e1000e_reset(struct e1000_adapter *adapter)  	e1000e_reset_adaptive(hw); -	/* initialize systim and reset the ns time counter */ -	e1000e_config_hwtstamp(adapter, &adapter->hwtstamp_config); +	/* restore systim and hwtstamp settings */ +	e1000e_systim_reset(adapter);  	/* Set EEE advertisement as appropriate */  	if (adapter->flags2 & FLAG2_HAS_EEE) { @@ -4275,7 +4311,7 @@ static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)  	struct e1000_adapter *adapter = container_of(cc, struct e1000_adapter,  						     cc);  	struct e1000_hw *hw = &adapter->hw; -	u32 systimel_1, systimel_2, systimeh; +	u32 systimel, systimeh;  	cycle_t systim, systim_next;  	/* SYSTIMH latching upon SYSTIML read does not work well.  	 * This means that if SYSTIML overflows after we read it but before @@ -4283,24 +4319,25 @@ static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)  	 * will experience a huge non linear increment in the systime value  	 * to fix that we test for overflow and if true, we re-read systime.  	 */ -	systimel_1 = er32(SYSTIML); +	systimel = er32(SYSTIML);  	systimeh = er32(SYSTIMH); -	systimel_2 = er32(SYSTIML); -	/* Check for overflow. If there was no overflow, use the values */ -	if (systimel_1 < systimel_2) { -		systim = (cycle_t)systimel_1; -		systim |= (cycle_t)systimeh << 32; -	} else { -		/* There was an overflow, read again SYSTIMH, and use -		 * systimel_2 -		 */ -		systimeh = er32(SYSTIMH); -		systim = (cycle_t)systimel_2; -		systim |= (cycle_t)systimeh << 32; +	/* Is systimel is so large that overflow is possible? */ +	if (systimel >= (u32)0xffffffff - E1000_TIMINCA_INCVALUE_MASK) { +		u32 systimel_2 = er32(SYSTIML); +		if (systimel > systimel_2) { +			/* There was an overflow, read again SYSTIMH, and use +			 * systimel_2 +			 */ +			systimeh = er32(SYSTIMH); +			systimel = systimel_2; +		}  	} +	systim = (cycle_t)systimel; +	systim |= (cycle_t)systimeh << 32;  	if ((hw->mac.type == e1000_82574) || (hw->mac.type == e1000_82583)) { -		u64 incvalue, time_delta, rem, temp; +		u64 time_delta, rem, temp; +		u32 incvalue;  		int i;  		/* errata for 82574/82583 possible bad bits read from SYSTIMH/L @@ -4495,7 +4532,7 @@ static int e1000_test_msi(struct e1000_adapter *adapter)  }  /** - * e1000_open - Called when a network interface is made active + * e1000e_open - Called when a network interface is made active   * @netdev: network interface device structure   *   * Returns 0 on success, negative value on failure @@ -4506,7 +4543,7 @@ static int e1000_test_msi(struct e1000_adapter *adapter)   * handler is registered with the OS, the watchdog timer is started,   * and the stack is notified that the interface is ready.   **/ -static int e1000_open(struct net_device *netdev) +int e1000e_open(struct net_device *netdev)  {  	struct e1000_adapter *adapter = netdev_priv(netdev);  	struct e1000_hw *hw = &adapter->hw; @@ -4604,7 +4641,7 @@ err_setup_tx:  }  /** - * e1000_close - Disables a network interface + * e1000e_close - Disables a network interface   * @netdev: network interface device structure   *   * Returns 0, this is not allowed to fail @@ -4614,7 +4651,7 @@ err_setup_tx:   * needs to be disabled.  A global MAC reset is issued to stop the   * hardware, and all transmit and receive resources are freed.   **/ -static int e1000_close(struct net_device *netdev) +int e1000e_close(struct net_device *netdev)  {  	struct e1000_adapter *adapter = netdev_priv(netdev);  	struct pci_dev *pdev = adapter->pdev; @@ -6861,7 +6898,7 @@ static void e1000_eeprom_checks(struct e1000_adapter *adapter)  	ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &buf);  	le16_to_cpus(&buf); -	if (!ret_val && (!(buf & (1 << 0)))) { +	if (!ret_val && (!(buf & BIT(0)))) {  		/* Deep Smart Power Down (DSPD) */  		dev_warn(&adapter->pdev->dev,  			 "Warning: detected DSPD enabled in EEPROM\n"); @@ -6920,8 +6957,8 @@ static int e1000_set_features(struct net_device *netdev,  }  static const struct net_device_ops e1000e_netdev_ops = { -	.ndo_open		= e1000_open, -	.ndo_stop		= e1000_close, +	.ndo_open		= e1000e_open, +	.ndo_stop		= e1000e_close,  	.ndo_start_xmit		= e1000_xmit_frame,  	.ndo_get_stats64	= e1000e_get_stats64,  	.ndo_set_rx_mode	= e1000e_set_rx_mode, @@ -6965,7 +7002,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	int bars, i, err, pci_using_dac;  	u16 eeprom_data = 0;  	u16 eeprom_apme_mask = E1000_EEPROM_APME; -	s32 rval = 0; +	s32 ret_val = 0;  	if (ei->flags2 & FLAG2_DISABLE_ASPM_L0S)  		aspm_disable_flag = PCIE_LINK_STATE_L0S; @@ -7200,18 +7237,18 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	} else if (adapter->flags & FLAG_APME_IN_CTRL3) {  		if (adapter->flags & FLAG_APME_CHECK_PORT_B &&  		    (adapter->hw.bus.func == 1)) -			rval = e1000_read_nvm(&adapter->hw, +			ret_val = e1000_read_nvm(&adapter->hw,  					      NVM_INIT_CONTROL3_PORT_B,  					      1, &eeprom_data);  		else -			rval = e1000_read_nvm(&adapter->hw, +			ret_val = e1000_read_nvm(&adapter->hw,  					      NVM_INIT_CONTROL3_PORT_A,  					      1, &eeprom_data);  	}  	/* fetch WoL from EEPROM */ -	if (rval) -		e_dbg("NVM read error getting WoL initial values: %d\n", rval); +	if (ret_val) +		e_dbg("NVM read error getting WoL initial values: %d\n", ret_val);  	else if (eeprom_data & eeprom_apme_mask)  		adapter->eeprom_wol |= E1000_WUFC_MAG; @@ -7231,13 +7268,16 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  		device_wakeup_enable(&pdev->dev);  	/* save off EEPROM version number */ -	rval = e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers); +	ret_val = e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers); -	if (rval) { -		e_dbg("NVM read error getting EEPROM version: %d\n", rval); +	if (ret_val) { +		e_dbg("NVM read error getting EEPROM version: %d\n", ret_val);  		adapter->eeprom_vers = 0;  	} +	/* init PTP hardware clock */ +	e1000e_ptp_init(adapter); +  	/* reset the hardware with the new settings */  	e1000e_reset(adapter); @@ -7256,9 +7296,6 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	/* carrier off reporting is important to ethtool even BEFORE open */  	netif_carrier_off(netdev); -	/* init PTP hardware clock */ -	e1000e_ptp_init(adapter); -  	e1000_print_device_info(adapter);  	if (pci_dev_run_wake(pdev))  | 
