diff options
Diffstat (limited to 'drivers/net/phy/mscc')
| -rw-r--r-- | drivers/net/phy/mscc/mscc.h | 4 | ||||
| -rw-r--r-- | drivers/net/phy/mscc/mscc_main.c | 4 | ||||
| -rw-r--r-- | drivers/net/phy/mscc/mscc_ptp.c | 52 | 
3 files changed, 34 insertions, 26 deletions
| diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h index 58c6d47fbe04..2bfe314ef881 100644 --- a/drivers/net/phy/mscc/mscc.h +++ b/drivers/net/phy/mscc/mscc.h @@ -481,6 +481,7 @@ static inline void vsc8584_config_macsec_intr(struct phy_device *phydev)  void vsc85xx_link_change_notify(struct phy_device *phydev);  void vsc8584_config_ts_intr(struct phy_device *phydev);  int vsc8584_ptp_init(struct phy_device *phydev); +void vsc8584_ptp_deinit(struct phy_device *phydev);  int vsc8584_ptp_probe_once(struct phy_device *phydev);  int vsc8584_ptp_probe(struct phy_device *phydev);  irqreturn_t vsc8584_handle_ts_interrupt(struct phy_device *phydev); @@ -495,6 +496,9 @@ static inline int vsc8584_ptp_init(struct phy_device *phydev)  {  	return 0;  } +static inline void vsc8584_ptp_deinit(struct phy_device *phydev) +{ +}  static inline int vsc8584_ptp_probe_once(struct phy_device *phydev)  {  	return 0; diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c index f1c9ce351ab4..24c75903f535 100644 --- a/drivers/net/phy/mscc/mscc_main.c +++ b/drivers/net/phy/mscc/mscc_main.c @@ -2337,9 +2337,7 @@ static int vsc85xx_probe(struct phy_device *phydev)  static void vsc85xx_remove(struct phy_device *phydev)  { -	struct vsc8531_private *priv = phydev->priv; - -	skb_queue_purge(&priv->rx_skbs_list); +	vsc8584_ptp_deinit(phydev);  }  /* Microsemi VSC85xx PHYs */ diff --git a/drivers/net/phy/mscc/mscc_ptp.c b/drivers/net/phy/mscc/mscc_ptp.c index de6c7312e8f2..d692df7d975c 100644 --- a/drivers/net/phy/mscc/mscc_ptp.c +++ b/drivers/net/phy/mscc/mscc_ptp.c @@ -456,12 +456,12 @@ static void vsc85xx_dequeue_skb(struct vsc85xx_ptp *ptp)  		*p++ = (reg >> 24) & 0xff;  	} -	len = skb_queue_len(&ptp->tx_queue); +	len = skb_queue_len_lockless(&ptp->tx_queue);  	if (len < 1)  		return;  	while (len--) { -		skb = __skb_dequeue(&ptp->tx_queue); +		skb = skb_dequeue(&ptp->tx_queue);  		if (!skb)  			return; @@ -486,7 +486,7 @@ static void vsc85xx_dequeue_skb(struct vsc85xx_ptp *ptp)  		 * packet in the FIFO right now, reschedule it for later  		 * packets.  		 */ -		__skb_queue_tail(&ptp->tx_queue, skb); +		skb_queue_tail(&ptp->tx_queue, skb);  	}  } @@ -1068,6 +1068,7 @@ static int vsc85xx_hwtstamp(struct mii_timestamper *mii_ts,  	case HWTSTAMP_TX_ON:  		break;  	case HWTSTAMP_TX_OFF: +		skb_queue_purge(&vsc8531->ptp->tx_queue);  		break;  	default:  		return -ERANGE; @@ -1092,9 +1093,6 @@ static int vsc85xx_hwtstamp(struct mii_timestamper *mii_ts,  	mutex_lock(&vsc8531->ts_lock); -	__skb_queue_purge(&vsc8531->ptp->tx_queue); -	__skb_queue_head_init(&vsc8531->ptp->tx_queue); -  	/* Disable predictor while configuring the 1588 block */  	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,  				  MSCC_PHY_PTP_INGR_PREDICTOR); @@ -1180,9 +1178,7 @@ static void vsc85xx_txtstamp(struct mii_timestamper *mii_ts,  	skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; -	mutex_lock(&vsc8531->ts_lock); -	__skb_queue_tail(&vsc8531->ptp->tx_queue, skb); -	mutex_unlock(&vsc8531->ts_lock); +	skb_queue_tail(&vsc8531->ptp->tx_queue, skb);  	return;  out: @@ -1298,7 +1294,6 @@ static void vsc8584_set_input_clk_configured(struct phy_device *phydev)  static int __vsc8584_init_ptp(struct phy_device *phydev)  { -	struct vsc8531_private *vsc8531 = phydev->priv;  	static const u32 ltc_seq_e[] = { 0, 400000, 0, 0, 0 };  	static const u8  ltc_seq_a[] = { 8, 6, 5, 4, 2 };  	u32 val; @@ -1515,17 +1510,7 @@ static int __vsc8584_init_ptp(struct phy_device *phydev)  	vsc85xx_ts_eth_cmp1_sig(phydev); -	vsc8531->mii_ts.rxtstamp = vsc85xx_rxtstamp; -	vsc8531->mii_ts.txtstamp = vsc85xx_txtstamp; -	vsc8531->mii_ts.hwtstamp = vsc85xx_hwtstamp; -	vsc8531->mii_ts.ts_info  = vsc85xx_ts_info; -	phydev->mii_ts = &vsc8531->mii_ts; - -	memcpy(&vsc8531->ptp->caps, &vsc85xx_clk_caps, sizeof(vsc85xx_clk_caps)); - -	vsc8531->ptp->ptp_clock = ptp_clock_register(&vsc8531->ptp->caps, -						     &phydev->mdio.dev); -	return PTR_ERR_OR_ZERO(vsc8531->ptp->ptp_clock); +	return 0;  }  void vsc8584_config_ts_intr(struct phy_device *phydev) @@ -1552,6 +1537,17 @@ int vsc8584_ptp_init(struct phy_device *phydev)  	return 0;  } +void vsc8584_ptp_deinit(struct phy_device *phydev) +{ +	struct vsc8531_private *vsc8531 = phydev->priv; + +	if (vsc8531->ptp->ptp_clock) { +		ptp_clock_unregister(vsc8531->ptp->ptp_clock); +		skb_queue_purge(&vsc8531->rx_skbs_list); +		skb_queue_purge(&vsc8531->ptp->tx_queue); +	} +} +  irqreturn_t vsc8584_handle_ts_interrupt(struct phy_device *phydev)  {  	struct vsc8531_private *priv = phydev->priv; @@ -1572,7 +1568,7 @@ irqreturn_t vsc8584_handle_ts_interrupt(struct phy_device *phydev)  	if (rc & VSC85XX_1588_INT_FIFO_ADD) {  		vsc85xx_get_tx_ts(priv->ptp);  	} else if (rc & VSC85XX_1588_INT_FIFO_OVERFLOW) { -		__skb_queue_purge(&priv->ptp->tx_queue); +		skb_queue_purge(&priv->ptp->tx_queue);  		vsc85xx_ts_reset_fifo(phydev);  	} @@ -1592,6 +1588,7 @@ int vsc8584_ptp_probe(struct phy_device *phydev)  	mutex_init(&vsc8531->phc_lock);  	mutex_init(&vsc8531->ts_lock);  	skb_queue_head_init(&vsc8531->rx_skbs_list); +	skb_queue_head_init(&vsc8531->ptp->tx_queue);  	/* Retrieve the shared load/save GPIO. Request it as non exclusive as  	 * the same GPIO can be requested by all the PHYs of the same package. @@ -1612,7 +1609,16 @@ int vsc8584_ptp_probe(struct phy_device *phydev)  	vsc8531->ptp->phydev = phydev; -	return 0; +	vsc8531->mii_ts.rxtstamp = vsc85xx_rxtstamp; +	vsc8531->mii_ts.txtstamp = vsc85xx_txtstamp; +	vsc8531->mii_ts.hwtstamp = vsc85xx_hwtstamp; +	vsc8531->mii_ts.ts_info  = vsc85xx_ts_info; +	phydev->mii_ts = &vsc8531->mii_ts; + +	memcpy(&vsc8531->ptp->caps, &vsc85xx_clk_caps, sizeof(vsc85xx_clk_caps)); +	vsc8531->ptp->ptp_clock = ptp_clock_register(&vsc8531->ptp->caps, +						     &phydev->mdio.dev); +	return PTR_ERR_OR_ZERO(vsc8531->ptp->ptp_clock);  }  int vsc8584_ptp_probe_once(struct phy_device *phydev) | 
