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
