commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=be15d3025ae82e4a61f8faaaaaf8ca424ec48ec0
branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk

Add IEEE1588 to Kconfig and fix codeing style.

Signed-off-by: Bob Liu <[email protected]>
---
 .../mach-bf609/include/mach/cdefBF60x_base.h       |   16 ----
 .../mach-bf609/include/mach/defBF60x_base.h        |    1 -
 drivers/net/ethernet/stmicro/stmmac/Kconfig        |    7 ++
 drivers/net/ethernet/stmicro/stmmac/descs.h        |    9 +--
 drivers/net/ethernet/stmicro/stmmac/enh_desc.c     |    2 +-
 drivers/net/ethernet/stmicro/stmmac/stmmac.h       |   22 ++++-
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c  |   95 +++++++++-----------
 7 files changed, 73 insertions(+), 79 deletions(-)

diff --git a/arch/blackfin/mach-bf609/include/mach/cdefBF60x_base.h b/arch/blackfin/mach-bf609/include/mach/cdefBF60x_base.h
index 03982e3..62befb6 100644
--- a/arch/blackfin/mach-bf609/include/mach/cdefBF60x_base.h
+++ b/arch/blackfin/mach-bf609/include/mach/cdefBF60x_base.h
@@ -49,22 +49,6 @@
 
 /* RTC Registers */
 
-/* EMAC0 Registers */
-#define bfin_read_EMAC_PTP_ADDEND()     bfin_read32(EMAC0_TM_ADDEND, val)
-#define bfin_write_EMAC_PTP_ADDEND(val) bfin_write32(EMAC0_TM_ADDEND, val)
-#define bfin_read_EMAC_PTP_CTL()    	bfin_read32(EMAC0_TM_CTL)
-#define bfin_write_EMAC_PTP_CTL(val) 	bfin_write32(EMAC0_TM_CTL, val)
-#define bfin_read_EMAC_PTP_SEC()    	bfin_read32(EMAC0_TM_SEC)
-#define bfin_write_EMAC_PTP_SEC(val) 	bfin_write32(EMAC0_TM_SEC, val)
-#define bfin_read_EMAC_PTP_SUBSEC()    	bfin_read32(EMAC0_TM_SUBSEC)
-#define bfin_write_EMAC_PTP_SUBSEC(val) bfin_write32(EMAC0_TM_SUBSEC, val)
-#define bfin_read_EMAC_PTP_NSEC()    	bfin_read32(EMAC0_TM_NSEC)
-#define bfin_write_EMAC_PTP_NSEC(val) 	bfin_write32(EMAC0_TM_NSEC, val)
-#define bfin_read_EMAC_PTP_SECUPDT()    bfin_read32(EMAC0_TM_SECUPDT)
-#define bfin_write_EMAC_PTP_SECUPDT(val) bfin_write32(EMAC0_TM_SECUPDT, val)
-#define bfin_read_EMAC_PTP_NSECUPDT()    bfin_read32(EMAC0_TM_NSECUPDT)
-#define bfin_write_EMAC_PTP_NSECUPDT(val) bfin_write32(EMAC0_TM_NSECUPDT, val)
-
 /* UART0 Registers */
 
 #define bfin_read_UART0_REVID()		bfin_read32(UART0_REVID)
diff --git a/arch/blackfin/mach-bf609/include/mach/defBF60x_base.h b/arch/blackfin/mach-bf609/include/mach/defBF60x_base.h
index cfb15e2..f11bf1e 100644
--- a/arch/blackfin/mach-bf609/include/mach/defBF60x_base.h
+++ b/arch/blackfin/mach-bf609/include/mach/defBF60x_base.h
@@ -921,7 +921,6 @@
 /* =========================
         EMAC Registers
    ========================= */
-
 /* =========================
         EMAC0
    ========================= */
diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig
index 0364283..c9ff437 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
+++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
@@ -54,6 +54,13 @@ config STMMAC_DA
 	  By default, the DMA arbitration scheme is based on Round-robin
 	  (rx:tx priority is 1:1).
 
+config STMMAC_IEEE1588
+	bool "STMMAC ieee1588 hw timestamp support"
+	default n
+	depends on BLACKFIN
+	help
+	  To support the IEEE 1588 Precision Time Protocol (PTP), select y here.
+
 config STMMAC_TIMER
 	bool "STMMAC Timer optimisation"
 	default n
diff --git a/drivers/net/ethernet/stmicro/stmmac/descs.h b/drivers/net/ethernet/stmicro/stmmac/descs.h
index ffa0073..f2b9f81 100644
--- a/drivers/net/ethernet/stmicro/stmmac/descs.h
+++ b/drivers/net/ethernet/stmicro/stmmac/descs.h
@@ -20,11 +20,6 @@
 
   Author: Giuseppe Cavallaro <[email protected]>
 *******************************************************************************/
-
-#ifdef CONFIG_BLACKFIN
-#define STMMAC_IEEE1588
-#endif
-
 struct dma_desc {
 	/* Receive descriptor */
 	union {
@@ -157,11 +152,11 @@ struct dma_desc {
 			u32 reserved3:3;
 			u32 buffer2_size:13;
 			u32 reserved4:3;
-		} etx;		/* -- enhanced -- */
+		} volatile etx;		/* -- enhanced -- */
 	} des01;
 	unsigned int des2;
 	unsigned int des3;
-#ifdef STMMAC_IEEE1588
+#ifdef CONFIG_STMMAC_IEEE1588
 	unsigned int des4;
 	unsigned int des5;
 	unsigned int des6;
diff --git a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
index cae3af8..dd0878c 100644
--- a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
+++ b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
@@ -292,7 +292,7 @@ static void enh_desc_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
 {
 	p->des01.etx.first_segment = is_fs;
 	enh_set_tx_desc_len(p, len);
-#ifdef STMMAC_IEEE1588
+#ifdef CONFIG_STMMAC_IEEE1588
 	p->des01.etx.time_stamp_enable = 1;
 #endif
 	if (unlikely(len > BUF_SIZE_4KiB)) {
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
index fc23d69..1763333 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
@@ -29,7 +29,7 @@
 #include "stmmac_timer.h"
 #endif
 
-#ifdef STMMAC_IEEE1588
+#ifdef CONFIG_STMMAC_IEEE1588
 #include <linux/net_tstamp.h>
 #include <linux/clocksource.h>
 #include <linux/timecompare.h>
@@ -41,8 +41,24 @@
 #define PTP_TSVER2ENA   (1 << 10)
 #define PTP_TSIPENA     (1 << 11)
 #define PTP_TSIPV4ENA   (1 << 13)
+#define PTP_TSEVENTENA  (1 << 14)
 #define PTP_TSMASTERENA (1 << 15)
-#define PTP_TSEVENTENA  (1 << 15)
+#define PTP_SNAPTYPESEL (1 << 16)
+
+#define EMAC_TM_CTL                0x700         /* EMAC0 EMAC Time Stamp Control Register */
+#define EMAC_TM_SUBSEC             0x704         /* EMAC0 EMAC Time Stamp Sub Second Increment */
+#define EMAC_TM_SEC                0x708         /* EMAC0 EMAC Time Stamp Second Register */
+#define EMAC_TM_NSEC               0x70C         /* EMAC0 EMAC Time Stamp Nano Second Register */
+#define EMAC_TM_SECUPDT            0x710         /* EMAC0 EMAC Time Stamp Seconds Update */
+#define EMAC_TM_NSECUPDT           0x714         /* EMAC0 EMAC Time Stamp Nano Seconds Update */
+#define EMAC_TM_ADDEND             0x718         /* EMAC0 EMAC Time Stamp Addend Register */
+#define EMAC_TM_TGTM               0x71C         /* EMAC0 EMAC Time Stamp Target Time Sec. */
+#define EMAC_TM_NTGTM              0x720         /* EMAC0 EMAC Time Stamp Target Time Nanosec. */
+#define EMAC_TM_HISEC              0x724         /* EMAC0 EMAC Time Stamp High Second Register */
+#define EMAC_TM_STMPSTAT           0x728         /* EMAC0 EMAC Time Stamp Status Register */
+#define EMAC_TM_PPSCTL             0x72C         /* EMAC0 EMAC PPS Control Register */
+
+#define PADS_EMAC_PTP_CLKSEL 	   0xFFC03404
 #endif
 
 struct stmmac_priv {
@@ -97,7 +113,7 @@ struct stmmac_priv {
 	struct stmmac_counters mmc;
 	struct dma_features dma_cap;
 	int hw_cap_support;
-#ifdef STMMAC_IEEE1588
+#ifdef CONFIG_STMMAC_IEEE1588
 	struct cyclecounter cycles;
 	struct timecounter clock;
 	struct timecompare compare;
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index cf36407..d4ca55a 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -145,7 +145,7 @@ static int stmmac_init_fs(struct net_device *dev);
 static void stmmac_exit_fs(void);
 #endif
 
-#ifdef STMMAC_IEEE1588
+#ifdef CONFIG_STMMAC_IEEE1588
 #define MAX_TIMEOUT_CNT	5000
 #define stmmac_hwtstamp_is_none(cfg) ((cfg) == HWTSTAMP_FILTER_NONE)
 
@@ -153,7 +153,7 @@ static int stmmac_hwtstamp_ioctl(struct net_device *netdev,
 		struct ifreq *ifr, int cmd)
 {
 	struct hwtstamp_config config;
-	struct stmmac_priv *lp = netdev_priv(netdev);
+	struct stmmac_priv *priv = netdev_priv(netdev);
 	u32 ptpctl;
 
 	if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
@@ -170,10 +170,8 @@ static int stmmac_hwtstamp_ioctl(struct net_device *netdev,
 			(config.tx_type != HWTSTAMP_TX_ON))
 		return -ERANGE;
 
-	ptpctl = bfin_read_EMAC_PTP_CTL();
-	bfin_write_EMAC_PTP_CTL((1 << 16));
-	SSYNC();
-	ptpctl = bfin_read_EMAC_PTP_CTL();
+	writel(PTP_SNAPTYPESEL, priv->ioaddr + EMAC_TM_CTL);
+	ptpctl = readl(priv->ioaddr + EMAC_TM_CTL);
 
 	switch (config.rx_filter) {
 	case HWTSTAMP_FILTER_NONE:
@@ -213,32 +211,31 @@ static int stmmac_hwtstamp_ioctl(struct net_device *netdev,
 	}
 
 	if (config.tx_type == HWTSTAMP_TX_OFF &&
-		stmmac_hwtstamp_is_none(config.rx_filter)) {
+			stmmac_hwtstamp_is_none(config.rx_filter)) {
 		ptpctl &= ~PTP_EN;
-		bfin_write_EMAC_PTP_CTL(ptpctl);
+		writel(ptpctl, priv->ioaddr + EMAC_TM_CTL);
 
 		SSYNC();
 	} else {
 		ptpctl |= PTP_EN;
-		bfin_write_EMAC_PTP_CTL(ptpctl);
-		bfin_write_EMAC_PTP_SECUPDT(ktime_get_real().tv.sec);
-		bfin_write_EMAC_PTP_NSECUPDT(ktime_get_real().tv.nsec);
+		writel(ptpctl, priv->ioaddr + EMAC_TM_CTL);
 
+		/* write init time value */
+		writel(ktime_get_real().tv.sec, priv->ioaddr + EMAC_TM_SECUPDT);
+		writel(ktime_get_real().tv.nsec, priv->ioaddr + EMAC_TM_NSECUPDT);
 		ptpctl |= PTP_TSINIT;
-		bfin_write_EMAC_PTP_CTL(ptpctl);
-
-		bfin_write_EMAC_PTP_SUBSEC(0x2b);
-
+		writel(ptpctl, priv->ioaddr + EMAC_TM_CTL);
+		writel(0x2b, priv->ioaddr + EMAC_TM_SUBSEC);
 		SSYNC();
 
-		lp->compare.last_update = 0;
-		timecounter_init(&lp->clock,
-				&lp->cycles,
+		priv->compare.last_update = 0;
+		timecounter_init(&priv->clock,
+				&priv->cycles,
 				ktime_to_ns(ktime_get_real()));
-		timecompare_update(&lp->compare, 0);
+		timecompare_update(&priv->compare, 0);
 	}
 
-	lp->stamp_cfg = config;
+	priv->stamp_cfg = config;
 	return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
 		-EFAULT : 0;
 }
@@ -252,7 +249,7 @@ static void stmmac_dump_hwtamp(char *s, ktime_t *hw, ktime_t *ts, struct timecom
 			sys.tv.nsec, cmp->offset, cmp->skew);
 }
 
-static void stmmac_tx_hwtstamp(struct stmmac_priv *lp, struct sk_buff *skb,
+static void stmmac_tx_hwtstamp(struct stmmac_priv *priv, struct sk_buff *skb,
 				struct dma_desc *desc)
 {
 	if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) {
@@ -280,8 +277,8 @@ static void stmmac_tx_hwtstamp(struct stmmac_priv *lp, struct sk_buff *skb,
 			printk(KERN_INFO "des01.first:%d, tsenable:%d, stamp_status:%d\n",
 					desc->des01.etx.first_segment, desc->des01.etx.time_stamp_enable,
 					desc->des01.etx.time_stamp_status);
-			printk(KERN_INFO "hwsec %d, hwnsec %d\n", bfin_read_EMAC_PTP_SEC(),
-					bfin_read_EMAC_PTP_NSEC());
+			printk(KERN_INFO "hwsec %d, hwnsec %d\n", readl(priv->ioaddr + EMAC_TM_SEC),
+					readl(priv->ioaddr + EMAC_TM_SUBSEC));
 			return;
 		}
 		else {
@@ -294,25 +291,25 @@ static void stmmac_tx_hwtstamp(struct stmmac_priv *lp, struct sk_buff *skb,
 			ns = ktime_to_ns(local_time);
 
 			memset(&shhwtstamps, 0, sizeof(shhwtstamps));
-			timecompare_update(&lp->compare, ns);
+			timecompare_update(&priv->compare, ns);
 			shhwtstamps.hwtstamp.tv.sec = local_time.tv.sec;
 			shhwtstamps.hwtstamp.tv.nsec = local_time.tv.nsec;
 			shhwtstamps.syststamp =
-				timecompare_transform(&lp->compare, ns);
+				timecompare_transform(&priv->compare, ns);
 			skb_tstamp_tx(skb, &shhwtstamps);
 
-			stmmac_dump_hwtamp("TX", &shhwtstamps.hwtstamp, &shhwtstamps.syststamp, &lp->compare);
+			stmmac_dump_hwtamp("TX", &shhwtstamps.hwtstamp, &shhwtstamps.syststamp, &priv->compare);
 		}
 	}
 }
 
-static void stmmac_rx_hwtstamp(struct stmmac_priv *lp, struct sk_buff *skb, struct dma_desc *desc)
+static void stmmac_rx_hwtstamp(struct stmmac_priv *priv, struct sk_buff *skb, struct dma_desc *desc)
 {
 	u64 ns;
 	struct skb_shared_hwtstamps *shhwtstamps;
 	ktime_t local_time;
 
-	if (stmmac_hwtstamp_is_none(lp->stamp_cfg.rx_filter))
+	if (stmmac_hwtstamp_is_none(priv->stamp_cfg.rx_filter))
 		return;
 
 	if (!desc->des01.erx.ipc_csum_error)
@@ -324,13 +321,13 @@ static void stmmac_rx_hwtstamp(struct stmmac_priv *lp, struct sk_buff *skb, stru
 	local_time.tv.nsec = desc->des6;
 	ns = ktime_to_ns(local_time);
 
-	timecompare_update(&lp->compare, ns);
+	timecompare_update(&priv->compare, ns);
 	memset(shhwtstamps, 0, sizeof(*shhwtstamps));
 	shhwtstamps->hwtstamp.tv.sec = local_time.tv.sec;
 	shhwtstamps->hwtstamp.tv.nsec = local_time.tv.nsec;
-	shhwtstamps->syststamp = timecompare_transform(&lp->compare, ns);
+	shhwtstamps->syststamp = timecompare_transform(&priv->compare, ns);
 
-	stmmac_dump_hwtamp("RX", &shhwtstamps->hwtstamp, &shhwtstamps->syststamp, &lp->compare);
+	stmmac_dump_hwtamp("RX", &shhwtstamps->hwtstamp, &shhwtstamps->syststamp, &priv->compare);
 }
 
 /*
@@ -340,9 +337,9 @@ static cycle_t stmmac_read_clock(const struct cyclecounter *tc)
 {
 	u64 ns;
 	ktime_t hw_time;
-
-	hw_time.tv.sec = bfin_read_EMAC_PTP_SEC();
-	hw_time.tv.nsec = bfin_read_EMAC_PTP_NSEC();
+	struct stmmac_priv *priv = container_of(tc, struct stmmac_priv, cycles);
+	hw_time.tv.sec = readl(priv->ioaddr + EMAC_TM_SEC);
+	hw_time.tv.nsec = readl(priv->ioaddr + EMAC_TM_NSEC);
 	ns = ktime_to_ns(hw_time);
 	do_div(ns, 20);
 	return ns;
@@ -351,29 +348,25 @@ static cycle_t stmmac_read_clock(const struct cyclecounter *tc)
 
 static void stmmac_hwtstamp_init(struct net_device *netdev)
 {
-	struct stmmac_priv *lp = netdev_priv(netdev);
-	u64 append;
+	struct stmmac_priv *priv = netdev_priv(netdev);
 
 	/* select ptp clk with rmii*/
-	*(unsigned int *)(0xFFC03404) = 0x0;
-	printk("%s===========pads is 0x%x\n", __func__, *(unsigned int *)(0xFFC03404));
-	/* Initialize hardware timer */
-
-	memset(&lp->cycles, 0, sizeof(lp->cycles));
-	lp->cycles.read = stmmac_read_clock;
-	lp->cycles.mask = CLOCKSOURCE_MASK(64);
-	lp->cycles.mult = 20;
-	lp->cycles.shift = 0;
+	writel(0x0, PADS_EMAC_PTP_CLKSEL);
+	memset(&priv->cycles, 0, sizeof(priv->cycles));
+	priv->cycles.read = stmmac_read_clock;
+	priv->cycles.mask = CLOCKSOURCE_MASK(64);
+	priv->cycles.mult = 20;
+	priv->cycles.shift = 0;
 
 	/* Synchronize our NIC clock against system wall clock */
-	memset(&lp->compare, 0, sizeof(lp->compare));
-	lp->compare.source = &lp->clock;
-	lp->compare.target = ktime_get_real;
-	lp->compare.num_samples = 10;
+	memset(&priv->compare, 0, sizeof(priv->compare));
+	priv->compare.source = &priv->clock;
+	priv->compare.target = ktime_get_real;
+	priv->compare.num_samples = 10;
 
 	/* Initialize hwstamp config */
-	lp->stamp_cfg.rx_filter = HWTSTAMP_FILTER_NONE;
-	lp->stamp_cfg.tx_type = HWTSTAMP_TX_OFF;
+	priv->stamp_cfg.rx_filter = HWTSTAMP_FILTER_NONE;
+	priv->stamp_cfg.tx_type = HWTSTAMP_TX_OFF;
 }
 
 #else
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to