|
@@ -53,6 +53,7 @@
|
|
#include "stmmac.h"
|
|
#include "stmmac.h"
|
|
#include <linux/reset.h>
|
|
#include <linux/reset.h>
|
|
#include <linux/of_mdio.h>
|
|
#include <linux/of_mdio.h>
|
|
|
|
+#include "dwmac1000.h"
|
|
|
|
|
|
#define STMMAC_ALIGN(x) L1_CACHE_ALIGN(x)
|
|
#define STMMAC_ALIGN(x) L1_CACHE_ALIGN(x)
|
|
|
|
|
|
@@ -185,7 +186,7 @@ static void stmmac_clk_csr_set(struct stmmac_priv *priv)
|
|
priv->clk_csr = STMMAC_CSR_100_150M;
|
|
priv->clk_csr = STMMAC_CSR_100_150M;
|
|
else if ((clk_rate >= CSR_F_150M) && (clk_rate < CSR_F_250M))
|
|
else if ((clk_rate >= CSR_F_150M) && (clk_rate < CSR_F_250M))
|
|
priv->clk_csr = STMMAC_CSR_150_250M;
|
|
priv->clk_csr = STMMAC_CSR_150_250M;
|
|
- else if ((clk_rate >= CSR_F_250M) && (clk_rate <= CSR_F_300M))
|
|
|
|
|
|
+ else if ((clk_rate >= CSR_F_250M) && (clk_rate < CSR_F_300M))
|
|
priv->clk_csr = STMMAC_CSR_250_300M;
|
|
priv->clk_csr = STMMAC_CSR_250_300M;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -435,6 +436,7 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr)
|
|
u32 ts_master_en = 0;
|
|
u32 ts_master_en = 0;
|
|
u32 ts_event_en = 0;
|
|
u32 ts_event_en = 0;
|
|
u32 value = 0;
|
|
u32 value = 0;
|
|
|
|
+ u32 sec_inc;
|
|
|
|
|
|
if (!(priv->dma_cap.time_stamp || priv->adv_ts)) {
|
|
if (!(priv->dma_cap.time_stamp || priv->adv_ts)) {
|
|
netdev_alert(priv->dev, "No support for HW time stamping\n");
|
|
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)
|
|
tstamp_all | ptp_v2 | ptp_over_ethernet |
|
|
tstamp_all | ptp_v2 | ptp_over_ethernet |
|
|
ptp_over_ipv6_udp | ptp_over_ipv4_udp | ts_event_en |
|
|
ptp_over_ipv6_udp | ptp_over_ipv4_udp | ts_event_en |
|
|
ts_master_en | snap_type_sel);
|
|
ts_master_en | snap_type_sel);
|
|
-
|
|
|
|
priv->hw->ptp->config_hw_tstamping(priv->ioaddr, value);
|
|
priv->hw->ptp->config_hw_tstamping(priv->ioaddr, value);
|
|
|
|
|
|
/* program Sub Second Increment reg */
|
|
/* program Sub Second Increment reg */
|
|
- priv->hw->ptp->config_sub_second_increment(priv->ioaddr);
|
|
|
|
|
|
+ sec_inc = priv->hw->ptp->config_sub_second_increment(
|
|
|
|
+ priv->ioaddr, priv->clk_ptp_rate);
|
|
|
|
+ temp = div_u64(1000000000ULL, sec_inc);
|
|
|
|
|
|
/* calculate default added value:
|
|
/* calculate default added value:
|
|
* formula is :
|
|
* formula is :
|
|
* addend = (2^32)/freq_div_ratio;
|
|
* addend = (2^32)/freq_div_ratio;
|
|
- * where, freq_div_ratio = clk_ptp_ref_i/50MHz
|
|
|
|
- * hence, addend = ((2^32) * 50MHz)/clk_ptp_ref_i;
|
|
|
|
- * NOTE: clk_ptp_ref_i should be >= 50MHz to
|
|
|
|
- * achieve 20ns accuracy.
|
|
|
|
- *
|
|
|
|
- * 2^x * y == (y << x), hence
|
|
|
|
- * 2^32 * 50000000 ==> (50000000 << 32)
|
|
|
|
|
|
+ * where, freq_div_ratio = 1e9ns/sec_inc
|
|
*/
|
|
*/
|
|
- temp = (u64) (50000000ULL << 32);
|
|
|
|
|
|
+ temp = (u64)(temp << 32);
|
|
priv->default_addend = div_u64(temp, priv->clk_ptp_rate);
|
|
priv->default_addend = div_u64(temp, priv->clk_ptp_rate);
|
|
priv->hw->ptp->config_addend(priv->ioaddr,
|
|
priv->hw->ptp->config_addend(priv->ioaddr,
|
|
priv->default_addend);
|
|
priv->default_addend);
|