diff options
Diffstat (limited to 'drivers/net/phy')
| -rw-r--r-- | drivers/net/phy/Kconfig | 3 | ||||
| -rw-r--r-- | drivers/net/phy/dp83640.c | 4 | ||||
| -rw-r--r-- | drivers/net/phy/mscc/mscc_macsec.c | 40 | ||||
| -rw-r--r-- | drivers/net/phy/phy.c | 2 | ||||
| -rw-r--r-- | drivers/net/phy/phy_device.c | 10 | ||||
| -rw-r--r-- | drivers/net/phy/phylink.c | 45 | ||||
| -rw-r--r-- | drivers/net/phy/smsc.c | 11 | 
7 files changed, 62 insertions, 53 deletions
| diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index f25702386d83..e351d65533aa 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -480,8 +480,7 @@ config MICROCHIP_T1_PHY  config MICROSEMI_PHY  	tristate "Microsemi PHYs"  	depends on MACSEC || MACSEC=n -	select CRYPTO_AES -	select CRYPTO_ECB +	select CRYPTO_LIB_AES if MACSEC  	help  	  Currently supports VSC8514, VSC8530, VSC8531, VSC8540 and VSC8541 PHYs diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c index ecbd5e0d685c..acb0aae60755 100644 --- a/drivers/net/phy/dp83640.c +++ b/drivers/net/phy/dp83640.c @@ -1260,6 +1260,7 @@ static int dp83640_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)  		dp83640->hwts_rx_en = 1;  		dp83640->layer = PTP_CLASS_L4;  		dp83640->version = PTP_CLASS_V1; +		cfg.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;  		break;  	case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:  	case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: @@ -1267,6 +1268,7 @@ static int dp83640_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)  		dp83640->hwts_rx_en = 1;  		dp83640->layer = PTP_CLASS_L4;  		dp83640->version = PTP_CLASS_V2; +		cfg.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;  		break;  	case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:  	case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: @@ -1274,6 +1276,7 @@ static int dp83640_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)  		dp83640->hwts_rx_en = 1;  		dp83640->layer = PTP_CLASS_L2;  		dp83640->version = PTP_CLASS_V2; +		cfg.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;  		break;  	case HWTSTAMP_FILTER_PTP_V2_EVENT:  	case HWTSTAMP_FILTER_PTP_V2_SYNC: @@ -1281,6 +1284,7 @@ static int dp83640_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)  		dp83640->hwts_rx_en = 1;  		dp83640->layer = PTP_CLASS_L4 | PTP_CLASS_L2;  		dp83640->version = PTP_CLASS_V2; +		cfg.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;  		break;  	default:  		return -ERANGE; diff --git a/drivers/net/phy/mscc/mscc_macsec.c b/drivers/net/phy/mscc/mscc_macsec.c index b4d3dc4068e2..d53ca884b5c9 100644 --- a/drivers/net/phy/mscc/mscc_macsec.c +++ b/drivers/net/phy/mscc/mscc_macsec.c @@ -10,7 +10,7 @@  #include <linux/phy.h>  #include <dt-bindings/net/mscc-phy-vsc8531.h> -#include <crypto/skcipher.h> +#include <crypto/aes.h>  #include <net/macsec.h> @@ -500,39 +500,17 @@ static u32 vsc8584_macsec_flow_context_id(struct macsec_flow *flow)  static int vsc8584_macsec_derive_key(const u8 key[MACSEC_KEYID_LEN],  				     u16 key_len, u8 hkey[16])  { -	struct crypto_skcipher *tfm = crypto_alloc_skcipher("ecb(aes)", 0, 0); -	struct skcipher_request *req = NULL; -	struct scatterlist src, dst; -	DECLARE_CRYPTO_WAIT(wait); -	u32 input[4] = {0}; +	const u8 input[AES_BLOCK_SIZE] = {0}; +	struct crypto_aes_ctx ctx;  	int ret; -	if (IS_ERR(tfm)) -		return PTR_ERR(tfm); - -	req = skcipher_request_alloc(tfm, GFP_KERNEL); -	if (!req) { -		ret = -ENOMEM; -		goto out; -	} - -	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG | -				      CRYPTO_TFM_REQ_MAY_SLEEP, crypto_req_done, -				      &wait); -	ret = crypto_skcipher_setkey(tfm, key, key_len); -	if (ret < 0) -		goto out; - -	sg_init_one(&src, input, 16); -	sg_init_one(&dst, hkey, 16); -	skcipher_request_set_crypt(req, &src, &dst, 16, NULL); - -	ret = crypto_wait_req(crypto_skcipher_encrypt(req), &wait); +	ret = aes_expandkey(&ctx, key, key_len); +	if (ret) +		return ret; -out: -	skcipher_request_free(req); -	crypto_free_skcipher(tfm); -	return ret; +	aes_encrypt(&ctx, hkey, input); +	memzero_explicit(&ctx, sizeof(ctx)); +	return 0;  }  static int vsc8584_macsec_transformation(struct phy_device *phydev, diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 1de3938628f4..56cfae950472 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -840,7 +840,7 @@ static void phy_error(struct phy_device *phydev)   * phy_disable_interrupts - Disable the PHY interrupts from the PHY side   * @phydev: target phy_device struct   */ -static int phy_disable_interrupts(struct phy_device *phydev) +int phy_disable_interrupts(struct phy_device *phydev)  {  	int err; diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 04946de74fa0..b4978c5fb2ca 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -794,8 +794,10 @@ static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id,  	/* Grab the bits from PHYIR2, and put them in the lower half */  	phy_reg = mdiobus_read(bus, addr, MII_PHYSID2); -	if (phy_reg < 0) -		return -EIO; +	if (phy_reg < 0) { +		/* returning -ENODEV doesn't stop bus scanning */ +		return (phy_reg == -EIO || phy_reg == -ENODEV) ? -ENODEV : -EIO; +	}  	*phy_id |= phy_reg; @@ -1090,6 +1092,10 @@ int phy_init_hw(struct phy_device *phydev)  	if (ret < 0)  		return ret; +	ret = phy_disable_interrupts(phydev); +	if (ret) +		return ret; +  	if (phydev->drv->config_init)  		ret = phydev->drv->config_init(phydev); diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c index 0ab65fb75258..3b7c70e6c5dd 100644 --- a/drivers/net/phy/phylink.c +++ b/drivers/net/phy/phylink.c @@ -1463,6 +1463,8 @@ int phylink_ethtool_set_pauseparam(struct phylink *pl,  				   struct ethtool_pauseparam *pause)  {  	struct phylink_link_state *config = &pl->link_config; +	bool manual_changed; +	int pause_state;  	ASSERT_RTNL(); @@ -1477,15 +1479,15 @@ int phylink_ethtool_set_pauseparam(struct phylink *pl,  	    !pause->autoneg && pause->rx_pause != pause->tx_pause)  		return -EINVAL; -	mutex_lock(&pl->state_mutex); -	config->pause = 0; +	pause_state = 0;  	if (pause->autoneg) -		config->pause |= MLO_PAUSE_AN; +		pause_state |= MLO_PAUSE_AN;  	if (pause->rx_pause) -		config->pause |= MLO_PAUSE_RX; +		pause_state |= MLO_PAUSE_RX;  	if (pause->tx_pause) -		config->pause |= MLO_PAUSE_TX; +		pause_state |= MLO_PAUSE_TX; +	mutex_lock(&pl->state_mutex);  	/*  	 * See the comments for linkmode_set_pause(), wrt the deficiencies  	 * with the current implementation.  A solution to this issue would @@ -1502,18 +1504,35 @@ int phylink_ethtool_set_pauseparam(struct phylink *pl,  	linkmode_set_pause(config->advertising, pause->tx_pause,  			   pause->rx_pause); -	/* If we have a PHY, phylib will call our link state function if the -	 * mode has changed, which will trigger a resolve and update the MAC -	 * configuration. +	manual_changed = (config->pause ^ pause_state) & MLO_PAUSE_AN || +			 (!(pause_state & MLO_PAUSE_AN) && +			   (config->pause ^ pause_state) & MLO_PAUSE_TXRX_MASK); + +	config->pause = pause_state; + +	if (!pl->phydev && !test_bit(PHYLINK_DISABLE_STOPPED, +				     &pl->phylink_disable_state)) +		phylink_pcs_config(pl, true, &pl->link_config); + +	mutex_unlock(&pl->state_mutex); + +	/* If we have a PHY, a change of the pause frame advertisement will +	 * cause phylib to renegotiate (if AN is enabled) which will in turn +	 * call our phylink_phy_change() and trigger a resolve.  Note that +	 * we can't hold our state mutex while calling phy_set_asym_pause().  	 */ -	if (pl->phydev) { +	if (pl->phydev)  		phy_set_asym_pause(pl->phydev, pause->rx_pause,  				   pause->tx_pause); -	} else if (!test_bit(PHYLINK_DISABLE_STOPPED, -			     &pl->phylink_disable_state)) { -		phylink_pcs_config(pl, true, &pl->link_config); + +	/* If the manual pause settings changed, make sure we trigger a +	 * resolve to update their state; we can not guarantee that the +	 * link will cycle. +	 */ +	if (manual_changed) { +		pl->mac_link_dropped = true; +		phylink_run_resolve(pl);  	} -	mutex_unlock(&pl->state_mutex);  	return 0;  } diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c index 93da7d3d0954..74568ae16125 100644 --- a/drivers/net/phy/smsc.c +++ b/drivers/net/phy/smsc.c @@ -122,10 +122,13 @@ static int lan87xx_read_status(struct phy_device *phydev)  		if (rc < 0)  			return rc; -		/* Wait max 640 ms to detect energy */ -		phy_read_poll_timeout(phydev, MII_LAN83C185_CTRL_STATUS, rc, -				      rc & MII_LAN83C185_ENERGYON, 10000, -				      640000, true); +		/* Wait max 640 ms to detect energy and the timeout is not +		 * an actual error. +		 */ +		read_poll_timeout(phy_read, rc, +				  rc & MII_LAN83C185_ENERGYON || rc < 0, +				  10000, 640000, true, phydev, +				  MII_LAN83C185_CTRL_STATUS);  		if (rc < 0)  			return rc; |