diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/fec_main.c')
| -rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 59 | 
1 files changed, 12 insertions, 47 deletions
| diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 6152f6dbf1bc..92c55e1a5507 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -286,11 +286,8 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");  #define FEC_MMFR_TA		(2 << 16)  #define FEC_MMFR_DATA(v)	(v & 0xffff)  /* FEC ECR bits definition */ -#define FEC_ECR_RESET   BIT(0) -#define FEC_ECR_ETHEREN BIT(1) -#define FEC_ECR_MAGICEN BIT(2) -#define FEC_ECR_SLEEP   BIT(3) -#define FEC_ECR_EN1588  BIT(4) +#define FEC_ECR_MAGICEN		(1 << 2) +#define FEC_ECR_SLEEP		(1 << 3)  #define FEC_MII_TIMEOUT		30000 /* us */ @@ -986,9 +983,6 @@ fec_restart(struct net_device *ndev)  	u32 temp_mac[2];  	u32 rcntl = OPT_FRAME_SIZE | 0x04;  	u32 ecntl = 0x2; /* ETHEREN */ -	struct ptp_clock_request ptp_rq = { .type = PTP_CLK_REQ_PPS }; - -	fec_ptp_save_state(fep);  	/* Whack a reset.  We should wait for this.  	 * For i.MX6SX SOC, enet use AXI bus, we use disable MAC @@ -1142,7 +1136,7 @@ fec_restart(struct net_device *ndev)  	}  	if (fep->bufdesc_ex) -		ecntl |= FEC_ECR_EN1588; +		ecntl |= (1 << 4);  	if (fep->quirks & FEC_QUIRK_DELAYED_CLKS_SUPPORT &&  	    fep->rgmii_txc_dly) @@ -1163,14 +1157,6 @@ fec_restart(struct net_device *ndev)  	if (fep->bufdesc_ex)  		fec_ptp_start_cyclecounter(ndev); -	/* Restart PPS if needed */ -	if (fep->pps_enable) { -		/* Clear flag so fec_ptp_enable_pps() doesn't return immediately */ -		fep->pps_enable = 0; -		fec_ptp_restore_state(fep); -		fep->ptp_caps.enable(&fep->ptp_caps, &ptp_rq, 1); -	} -  	/* Enable interrupts we wish to service */  	if (fep->link)  		writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK); @@ -1221,8 +1207,6 @@ fec_stop(struct net_device *ndev)  	struct fec_enet_private *fep = netdev_priv(ndev);  	u32 rmii_mode = readl(fep->hwp + FEC_R_CNTRL) & (1 << 8);  	u32 val; -	struct ptp_clock_request ptp_rq = { .type = PTP_CLK_REQ_PPS }; -	u32 ecntl = 0;  	/* We cannot expect a graceful transmit stop without link !!! */  	if (fep->link) { @@ -1232,8 +1216,6 @@ fec_stop(struct net_device *ndev)  			netdev_err(ndev, "Graceful transmit stop did not complete!\n");  	} -	fec_ptp_save_state(fep); -  	/* Whack a reset.  We should wait for this.  	 * For i.MX6SX SOC, enet use AXI bus, we use disable MAC  	 * instead of reset MAC itself. @@ -1253,28 +1235,12 @@ fec_stop(struct net_device *ndev)  	writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED);  	writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK); -	if (fep->bufdesc_ex) -		ecntl |= FEC_ECR_EN1588; -  	/* We have to keep ENET enabled to have MII interrupt stay working */  	if (fep->quirks & FEC_QUIRK_ENET_MAC &&  		!(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) { -		ecntl |= FEC_ECR_ETHEREN; +		writel(2, fep->hwp + FEC_ECNTRL);  		writel(rmii_mode, fep->hwp + FEC_R_CNTRL);  	} - -	writel(ecntl, fep->hwp + FEC_ECNTRL); - -	if (fep->bufdesc_ex) -		fec_ptp_start_cyclecounter(ndev); - -	/* Restart PPS if needed */ -	if (fep->pps_enable) { -		/* Clear flag so fec_ptp_enable_pps() doesn't return immediately */ -		fep->pps_enable = 0; -		fec_ptp_restore_state(fep); -		fep->ptp_caps.enable(&fep->ptp_caps, &ptp_rq, 1); -	}  } @@ -2029,7 +1995,6 @@ static void fec_enet_phy_reset_after_clk_enable(struct net_device *ndev)  static int fec_enet_clk_enable(struct net_device *ndev, bool enable)  {  	struct fec_enet_private *fep = netdev_priv(ndev); -	unsigned long flags;  	int ret;  	if (enable) { @@ -2038,15 +2003,15 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)  			return ret;  		if (fep->clk_ptp) { -			spin_lock_irqsave(&fep->tmreg_lock, flags); +			mutex_lock(&fep->ptp_clk_mutex);  			ret = clk_prepare_enable(fep->clk_ptp);  			if (ret) { -				spin_unlock_irqrestore(&fep->tmreg_lock, flags); +				mutex_unlock(&fep->ptp_clk_mutex);  				goto failed_clk_ptp;  			} else {  				fep->ptp_clk_on = true;  			} -			spin_unlock_irqrestore(&fep->tmreg_lock, flags); +			mutex_unlock(&fep->ptp_clk_mutex);  		}  		ret = clk_prepare_enable(fep->clk_ref); @@ -2061,10 +2026,10 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)  	} else {  		clk_disable_unprepare(fep->clk_enet_out);  		if (fep->clk_ptp) { -			spin_lock_irqsave(&fep->tmreg_lock, flags); +			mutex_lock(&fep->ptp_clk_mutex);  			clk_disable_unprepare(fep->clk_ptp);  			fep->ptp_clk_on = false; -			spin_unlock_irqrestore(&fep->tmreg_lock, flags); +			mutex_unlock(&fep->ptp_clk_mutex);  		}  		clk_disable_unprepare(fep->clk_ref);  		clk_disable_unprepare(fep->clk_2x_txclk); @@ -2077,10 +2042,10 @@ failed_clk_2x_txclk:  		clk_disable_unprepare(fep->clk_ref);  failed_clk_ref:  	if (fep->clk_ptp) { -		spin_lock_irqsave(&fep->tmreg_lock, flags); +		mutex_lock(&fep->ptp_clk_mutex);  		clk_disable_unprepare(fep->clk_ptp);  		fep->ptp_clk_on = false; -		spin_unlock_irqrestore(&fep->tmreg_lock, flags); +		mutex_unlock(&fep->ptp_clk_mutex);  	}  failed_clk_ptp:  	clk_disable_unprepare(fep->clk_enet_out); @@ -3915,7 +3880,7 @@ fec_probe(struct platform_device *pdev)  	}  	fep->ptp_clk_on = false; -	spin_lock_init(&fep->tmreg_lock); +	mutex_init(&fep->ptp_clk_mutex);  	/* clk_ref is optional, depends on board */  	fep->clk_ref = devm_clk_get_optional(&pdev->dev, "enet_clk_ref"); | 
