diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igc')
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_base.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_hw.h | 7 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_i225.c | 11 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_main.c | 50 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_phy.c | 20 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_phy.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_ptp.c | 15 | 
8 files changed, 29 insertions, 79 deletions
| diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h index 3e386c38d016..1e7e7071f64d 100644 --- a/drivers/net/ethernet/intel/igc/igc.h +++ b/drivers/net/ethernet/intel/igc/igc.h @@ -264,7 +264,6 @@ int igc_reinit_queues(struct igc_adapter *adapter);  void igc_write_rss_indir_tbl(struct igc_adapter *adapter);  bool igc_has_link(struct igc_adapter *adapter);  void igc_reset(struct igc_adapter *adapter); -int igc_set_spd_dplx(struct igc_adapter *adapter, u32 spd, u8 dplx);  void igc_update_stats(struct igc_adapter *adapter);  void igc_disable_rx_ring(struct igc_ring *ring);  void igc_enable_rx_ring(struct igc_ring *ring); diff --git a/drivers/net/ethernet/intel/igc/igc_base.c b/drivers/net/ethernet/intel/igc/igc_base.c index f068b66b8025..a15927e77272 100644 --- a/drivers/net/ethernet/intel/igc/igc_base.c +++ b/drivers/net/ethernet/intel/igc/igc_base.c @@ -182,8 +182,6 @@ static s32 igc_init_phy_params_base(struct igc_hw *hw)  	igc_check_for_copper_link(hw); -	phy->type = igc_phy_i225; -  out:  	return ret_val;  } diff --git a/drivers/net/ethernet/intel/igc/igc_hw.h b/drivers/net/ethernet/intel/igc/igc_hw.h index b1e72ec5f131..360644f33d5f 100644 --- a/drivers/net/ethernet/intel/igc/igc_hw.h +++ b/drivers/net/ethernet/intel/igc/igc_hw.h @@ -53,11 +53,6 @@ enum igc_mac_type {  	igc_num_macs  /* List is 1-based, so subtract 1 for true count. */  }; -enum igc_phy_type { -	igc_phy_unknown = 0, -	igc_phy_i225, -}; -  enum igc_media_type {  	igc_media_type_unknown = 0,  	igc_media_type_copper = 1, @@ -138,8 +133,6 @@ struct igc_nvm_info {  struct igc_phy_info {  	struct igc_phy_operations ops; -	enum igc_phy_type type; -  	u32 addr;  	u32 id;  	u32 reset_delay_us; /* in usec */ diff --git a/drivers/net/ethernet/intel/igc/igc_i225.c b/drivers/net/ethernet/intel/igc/igc_i225.c index 66ea566488d1..59d5c467ea6e 100644 --- a/drivers/net/ethernet/intel/igc/igc_i225.c +++ b/drivers/net/ethernet/intel/igc/igc_i225.c @@ -156,8 +156,15 @@ void igc_release_swfw_sync_i225(struct igc_hw *hw, u16 mask)  {  	u32 swfw_sync; -	while (igc_get_hw_semaphore_i225(hw)) -		; /* Empty */ +	/* Releasing the resource requires first getting the HW semaphore. +	 * If we fail to get the semaphore, there is nothing we can do, +	 * except log an error and quit. We are not allowed to hang here +	 * indefinitely, as it may cause denial of service or system crash. +	 */ +	if (igc_get_hw_semaphore_i225(hw)) { +		hw_dbg("Failed to release SW_FW_SYNC.\n"); +		return; +	}  	swfw_sync = rd32(IGC_SW_FW_SYNC);  	swfw_sync &= ~mask; diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 74b2c590ed5d..ae17af44fe02 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -6187,56 +6187,6 @@ u32 igc_rd32(struct igc_hw *hw, u32 reg)  	return value;  } -int igc_set_spd_dplx(struct igc_adapter *adapter, u32 spd, u8 dplx) -{ -	struct igc_mac_info *mac = &adapter->hw.mac; - -	mac->autoneg = false; - -	/* Make sure dplx is at most 1 bit and lsb of speed is not set -	 * for the switch() below to work -	 */ -	if ((spd & 1) || (dplx & ~1)) -		goto err_inval; - -	switch (spd + dplx) { -	case SPEED_10 + DUPLEX_HALF: -		mac->forced_speed_duplex = ADVERTISE_10_HALF; -		break; -	case SPEED_10 + DUPLEX_FULL: -		mac->forced_speed_duplex = ADVERTISE_10_FULL; -		break; -	case SPEED_100 + DUPLEX_HALF: -		mac->forced_speed_duplex = ADVERTISE_100_HALF; -		break; -	case SPEED_100 + DUPLEX_FULL: -		mac->forced_speed_duplex = ADVERTISE_100_FULL; -		break; -	case SPEED_1000 + DUPLEX_FULL: -		mac->autoneg = true; -		adapter->hw.phy.autoneg_advertised = ADVERTISE_1000_FULL; -		break; -	case SPEED_1000 + DUPLEX_HALF: /* not supported */ -		goto err_inval; -	case SPEED_2500 + DUPLEX_FULL: -		mac->autoneg = true; -		adapter->hw.phy.autoneg_advertised = ADVERTISE_2500_FULL; -		break; -	case SPEED_2500 + DUPLEX_HALF: /* not supported */ -	default: -		goto err_inval; -	} - -	/* clear MDI, MDI(-X) override is only allowed when autoneg enabled */ -	adapter->hw.phy.mdix = AUTO_ALL_MODES; - -	return 0; - -err_inval: -	netdev_err(adapter->netdev, "Unsupported Speed/Duplex configuration\n"); -	return -EINVAL; -} -  /**   * igc_probe - Device Initialization Routine   * @pdev: PCI device information struct diff --git a/drivers/net/ethernet/intel/igc/igc_phy.c b/drivers/net/ethernet/intel/igc/igc_phy.c index 40dbf4b43234..53b77c969c85 100644 --- a/drivers/net/ethernet/intel/igc/igc_phy.c +++ b/drivers/net/ethernet/intel/igc/igc_phy.c @@ -141,24 +141,14 @@ void igc_power_down_phy_copper(struct igc_hw *hw)   * igc_check_downshift - Checks whether a downshift in speed occurred   * @hw: pointer to the HW structure   * - * Success returns 0, Failure returns 1 - *   * A downshift is detected by querying the PHY link health.   */ -s32 igc_check_downshift(struct igc_hw *hw) +void igc_check_downshift(struct igc_hw *hw)  {  	struct igc_phy_info *phy = &hw->phy; -	s32 ret_val; -	switch (phy->type) { -	case igc_phy_i225: -	default: -		/* speed downshift not supported */ -		phy->speed_downgraded = false; -		ret_val = 0; -	} - -	return ret_val; +	/* speed downshift not supported */ +	phy->speed_downgraded = false;  }  /** @@ -581,7 +571,7 @@ static s32 igc_read_phy_reg_mdic(struct igc_hw *hw, u32 offset, u16 *data)  	 * the lower time out  	 */  	for (i = 0; i < IGC_GEN_POLL_TIMEOUT; i++) { -		usleep_range(500, 1000); +		udelay(50);  		mdic = rd32(IGC_MDIC);  		if (mdic & IGC_MDIC_READY)  			break; @@ -638,7 +628,7 @@ static s32 igc_write_phy_reg_mdic(struct igc_hw *hw, u32 offset, u16 data)  	 * the lower time out  	 */  	for (i = 0; i < IGC_GEN_POLL_TIMEOUT; i++) { -		usleep_range(500, 1000); +		udelay(50);  		mdic = rd32(IGC_MDIC);  		if (mdic & IGC_MDIC_READY)  			break; diff --git a/drivers/net/ethernet/intel/igc/igc_phy.h b/drivers/net/ethernet/intel/igc/igc_phy.h index 1b031372d206..832a7e359f18 100644 --- a/drivers/net/ethernet/intel/igc/igc_phy.h +++ b/drivers/net/ethernet/intel/igc/igc_phy.h @@ -11,7 +11,7 @@ s32 igc_phy_hw_reset(struct igc_hw *hw);  s32 igc_get_phy_id(struct igc_hw *hw);  s32 igc_phy_has_link(struct igc_hw *hw, u32 iterations,  		     u32 usec_interval, bool *success); -s32 igc_check_downshift(struct igc_hw *hw); +void igc_check_downshift(struct igc_hw *hw);  s32 igc_setup_copper_link(struct igc_hw *hw);  void igc_power_up_phy_copper(struct igc_hw *hw);  void igc_power_down_phy_copper(struct igc_hw *hw); diff --git a/drivers/net/ethernet/intel/igc/igc_ptp.c b/drivers/net/ethernet/intel/igc/igc_ptp.c index 0d6e3215e98f..653e9f1e35b5 100644 --- a/drivers/net/ethernet/intel/igc/igc_ptp.c +++ b/drivers/net/ethernet/intel/igc/igc_ptp.c @@ -992,6 +992,17 @@ static void igc_ptp_time_restore(struct igc_adapter *adapter)  	igc_ptp_write_i225(adapter, &ts);  } +static void igc_ptm_stop(struct igc_adapter *adapter) +{ +	struct igc_hw *hw = &adapter->hw; +	u32 ctrl; + +	ctrl = rd32(IGC_PTM_CTRL); +	ctrl &= ~IGC_PTM_CTRL_EN; + +	wr32(IGC_PTM_CTRL, ctrl); +} +  /**   * igc_ptp_suspend - Disable PTP work items and prepare for suspend   * @adapter: Board private structure @@ -1009,8 +1020,10 @@ void igc_ptp_suspend(struct igc_adapter *adapter)  	adapter->ptp_tx_skb = NULL;  	clear_bit_unlock(__IGC_PTP_TX_IN_PROGRESS, &adapter->state); -	if (pci_device_is_present(adapter->pdev)) +	if (pci_device_is_present(adapter->pdev)) {  		igc_ptp_time_save(adapter); +		igc_ptm_stop(adapter); +	}  }  /** | 
