|
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