diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 54 | 
1 files changed, 38 insertions, 16 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 3c0c35ecea10..b5b443883da9 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -2256,6 +2256,30 @@ static void igb_enable_mas(struct igb_adapter *adapter)  	}  } +#ifdef CONFIG_IGB_HWMON +/** + *  igb_set_i2c_bb - Init I2C interface + *  @hw: pointer to hardware structure + **/ +static void igb_set_i2c_bb(struct e1000_hw *hw) +{ +	u32 ctrl_ext; +	s32 i2cctl; + +	ctrl_ext = rd32(E1000_CTRL_EXT); +	ctrl_ext |= E1000_CTRL_I2C_ENA; +	wr32(E1000_CTRL_EXT, ctrl_ext); +	wrfl(); + +	i2cctl = rd32(E1000_I2CPARAMS); +	i2cctl |= E1000_I2CBB_EN +		| E1000_I2C_CLK_OE_N +		| E1000_I2C_DATA_OE_N; +	wr32(E1000_I2CPARAMS, i2cctl); +	wrfl(); +} +#endif +  void igb_reset(struct igb_adapter *adapter)  {  	struct pci_dev *pdev = adapter->pdev; @@ -2400,7 +2424,8 @@ void igb_reset(struct igb_adapter *adapter)  			 * interface.  			 */  			if (adapter->ets) -				mac->ops.init_thermal_sensor_thresh(hw); +				igb_set_i2c_bb(hw); +			mac->ops.init_thermal_sensor_thresh(hw);  		}  	}  #endif @@ -3117,21 +3142,12 @@ static void igb_init_mas(struct igb_adapter *adapter)   **/  static s32 igb_init_i2c(struct igb_adapter *adapter)  { -	struct e1000_hw *hw = &adapter->hw;  	s32 status = 0; -	s32 i2cctl;  	/* I2C interface supported on i350 devices */  	if (adapter->hw.mac.type != e1000_i350)  		return 0; -	i2cctl = rd32(E1000_I2CPARAMS); -	i2cctl |= E1000_I2CBB_EN -		| E1000_I2C_CLK_OUT | E1000_I2C_CLK_OE_N -		| E1000_I2C_DATA_OUT | E1000_I2C_DATA_OE_N; -	wr32(E1000_I2CPARAMS, i2cctl); -	wrfl(); -  	/* Initialize the i2c bus which is controlled by the registers.  	 * This bus will use the i2c_algo_bit structure that implements  	 * the protocol through toggling of the 4 bits in the register. @@ -3521,6 +3537,12 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  			adapter->ets = true;  		else  			adapter->ets = false; +		/* Only enable I2C bit banging if an external thermal +		 * sensor is supported. +		 */ +		if (adapter->ets) +			igb_set_i2c_bb(hw); +		hw->mac.ops.init_thermal_sensor_thresh(hw);  		if (igb_sysfs_init(adapter))  			dev_err(&pdev->dev,  				"failed to allocate sysfs resources\n"); @@ -6794,7 +6816,7 @@ static void igb_perout(struct igb_adapter *adapter, int tsintr_tt)  	struct timespec64 ts;  	u32 tsauxc; -	if (pin < 0 || pin >= IGB_N_PEROUT) +	if (pin < 0 || pin >= IGB_N_SDP)  		return;  	spin_lock(&adapter->tmreg_lock); @@ -6802,7 +6824,7 @@ static void igb_perout(struct igb_adapter *adapter, int tsintr_tt)  	if (hw->mac.type == e1000_82580 ||  	    hw->mac.type == e1000_i354 ||  	    hw->mac.type == e1000_i350) { -		s64 ns = timespec64_to_ns(&adapter->perout[pin].period); +		s64 ns = timespec64_to_ns(&adapter->perout[tsintr_tt].period);  		u32 systiml, systimh, level_mask, level, rem;  		u64 systim, now; @@ -6850,8 +6872,8 @@ static void igb_perout(struct igb_adapter *adapter, int tsintr_tt)  		ts.tv_nsec = (u32)systim;  		ts.tv_sec  = ((u32)(systim >> 32)) & 0xFF;  	} else { -		ts = timespec64_add(adapter->perout[pin].start, -				    adapter->perout[pin].period); +		ts = timespec64_add(adapter->perout[tsintr_tt].start, +				    adapter->perout[tsintr_tt].period);  	}  	/* u32 conversion of tv_sec is safe until y2106 */ @@ -6860,7 +6882,7 @@ static void igb_perout(struct igb_adapter *adapter, int tsintr_tt)  	tsauxc = rd32(E1000_TSAUXC);  	tsauxc |= TSAUXC_EN_TT0;  	wr32(E1000_TSAUXC, tsauxc); -	adapter->perout[pin].start = ts; +	adapter->perout[tsintr_tt].start = ts;  	spin_unlock(&adapter->tmreg_lock);  } @@ -6874,7 +6896,7 @@ static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)  	struct ptp_clock_event event;  	struct timespec64 ts; -	if (pin < 0 || pin >= IGB_N_EXTTS) +	if (pin < 0 || pin >= IGB_N_SDP)  		return;  	if (hw->mac.type == e1000_82580 ||  |