| 
53 | 53 | #include "stmmac.h"  | 
54 | 54 | #include <linux/reset.h>  | 
55 | 55 | #include <linux/of_mdio.h>  | 
 | 56 | +#include "dwmac1000.h"  | 
56 | 57 | 
 
  | 
57 | 58 | #define STMMAC_ALIGN(x)	L1_CACHE_ALIGN(x)  | 
58 | 59 | 
 
  | 
@@ -185,7 +186,7 @@ static void stmmac_clk_csr_set(struct stmmac_priv *priv)  | 
185 | 186 | 			priv->clk_csr = STMMAC_CSR_100_150M;  | 
186 | 187 | 		else if ((clk_rate >= CSR_F_150M) && (clk_rate < CSR_F_250M))  | 
187 | 188 | 			priv->clk_csr = STMMAC_CSR_150_250M;  | 
188 |  | -		else if ((clk_rate >= CSR_F_250M) && (clk_rate <= CSR_F_300M))  | 
 | 189 | +		else if ((clk_rate >= CSR_F_250M) && (clk_rate < CSR_F_300M))  | 
189 | 190 | 			priv->clk_csr = STMMAC_CSR_250_300M;  | 
190 | 191 | 	}  | 
191 | 192 | }  | 
@@ -435,6 +436,7 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr)  | 
435 | 436 | 	u32 ts_master_en = 0;  | 
436 | 437 | 	u32 ts_event_en = 0;  | 
437 | 438 | 	u32 value = 0;  | 
 | 439 | +	u32 sec_inc;  | 
438 | 440 | 
 
  | 
439 | 441 | 	if (!(priv->dma_cap.time_stamp || priv->adv_ts)) {  | 
440 | 442 | 		netdev_alert(priv->dev, "No support for HW time stamping\n");  | 
@@ -598,24 +600,19 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr)  | 
598 | 600 | 			 tstamp_all | ptp_v2 | ptp_over_ethernet |  | 
599 | 601 | 			 ptp_over_ipv6_udp | ptp_over_ipv4_udp | ts_event_en |  | 
600 | 602 | 			 ts_master_en | snap_type_sel);  | 
601 |  | - | 
602 | 603 | 		priv->hw->ptp->config_hw_tstamping(priv->ioaddr, value);  | 
603 | 604 | 
 
  | 
604 | 605 | 		/* program Sub Second Increment reg */  | 
605 |  | -		priv->hw->ptp->config_sub_second_increment(priv->ioaddr);  | 
 | 606 | +		sec_inc = priv->hw->ptp->config_sub_second_increment(  | 
 | 607 | +			priv->ioaddr, priv->clk_ptp_rate);  | 
 | 608 | +		temp = div_u64(1000000000ULL, sec_inc);  | 
606 | 609 | 
 
  | 
607 | 610 | 		/* calculate default added value:  | 
608 | 611 | 		 * formula is :  | 
609 | 612 | 		 * addend = (2^32)/freq_div_ratio;  | 
610 |  | -		 * where, freq_div_ratio = clk_ptp_ref_i/50MHz  | 
611 |  | -		 * hence, addend = ((2^32) * 50MHz)/clk_ptp_ref_i;  | 
612 |  | -		 * NOTE: clk_ptp_ref_i should be >= 50MHz to  | 
613 |  | -		 *       achieve 20ns accuracy.  | 
614 |  | -		 *  | 
615 |  | -		 * 2^x * y == (y << x), hence  | 
616 |  | -		 * 2^32 * 50000000 ==> (50000000 << 32)  | 
 | 613 | +		 * where, freq_div_ratio = 1e9ns/sec_inc  | 
617 | 614 | 		 */  | 
618 |  | -		temp = (u64) (50000000ULL << 32);  | 
 | 615 | +		temp = (u64)(temp << 32);  | 
619 | 616 | 		priv->default_addend = div_u64(temp, priv->clk_ptp_rate);  | 
620 | 617 | 		priv->hw->ptp->config_addend(priv->ioaddr,  | 
621 | 618 | 					     priv->default_addend);  | 
 | 
0 commit comments