aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/freescale/fec_ptp.c
Commit message (Collapse)AuthorAge
* ENGR00309045 net: fec_ptp: fix timestamp errors when do stress testFugang Duan2014-04-18
| | | | | | | | | | | | | | | | | | | | "FSL_stressPTP" tool is supposed to test the capability characteristics of a ptp stack porting. The stresstest shall measure the overall load of the stack under test by sending delay request and signalling messages.The higher the overall load on the stack is, the higher your packet loss will be. The patch fix the timestamp error in high overall load stress test like: ./FSL_stressPTP -u -b 10.192.242.10 -d 10.192.242.6 -e eth0 -m 00:01:02:04:04:19 -i 100 -t 10 -f -6 -s -6 -c 10 And enet interrupt coalescing feature introduce ptp packet latency, which may cause that the timestamp don't store the related timestamp buffer when stack use ioctl interface to access the message. So add some 4ms delay after getting timestamp fail to let the next looking up success. Suggest to disable interrupt coalescing feature by ethtool when run 1588 cases. Signed-off-by: Fugang Duan <B38611@freescale.com> (cherry picked from commit 11107938cc5a4a7cb4e5fc5e00d248183ed43d93)
* ENGR00309055 net: fec_ptp: optimize 1588 convergent performanceFugang Duan2014-04-18
| | | | | | | | | | | 1588 convergence process (setup time about 15s) is not ideal: Applied a time jump on the reference master which causes both slaves to apply a time jump as well and then synchronize back to the nanoseconds. Optimize the 1588 adjust algorithm to get better convergent action. Signed-off-by: Fugang Duan <B38611@freescale.com> (cherry picked from commit 46a727f7ef469ae7c77c3458efd8a0de2396c360)
* ENGR00301115 net: fec_ptp: fix convergence issue to support IXXAT and ↵Fugang Duan2014-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | LinuxPTP stack IEEE 1588 module has one hw issue in capturing the ATVR register. According to the user manual it is: ENET0->ATCR |= ENET_ATCR_CAPTURE_MASK; while(ENET0->ATCR & ENET_ATCR_CAPTURE_MASK); ts_counter_ns = ENET0->ATVR; Incorrect behavior for ENET_ATCR[Capture and Restart Bits]. These bits will always read a value zero. According to SPEC, when these bits are set to 1'b1, these should hold value 1'b1 until the counter value is capture in the register clock domain. Unfortunately there is a bug with the way the bit "ENET_ATCR_CAPTURE" clears. So need something like: ENET0->ATCR |= ENET_ATCR_CAPTURE_MASK; wait(); ts_counter_ns = ENET0->ATVR; The wait-time to be at least 6 clock cycle of the slower clock between the register clock and the 1588 clock. The 1588 ts_clk is 25Mhz, register clock is 66Mhz, so the wait-time must be greater than 240ns (40ns * 6). The workaround is that adding 1us delay before read ATVR. Signed-off-by: Fugang Duan <B38611@freescale.com>
* ENGR00300074-1 net:fec_ptp: avoid fec register access when clock is disabledFugang Duan2014-04-16
| | | | | | | | | | Avoid fec register access when clock is disabled. After fec probed or "ifconfig ethx down", it disable fec clock to save power. PTP use period timer softirq to read ptp timer count register regardless any ethernet status, which cause system hang. The patch fix the issue. Signed-off-by: Fugang Duan <B38611@freescale.com>
* ENGR00288569: net:fec_ptp: fix the potential issue for storing timestampFugang Duan2014-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The timestamps generated in the i.MX drivers are generated by the nanoseconds part coming from the 1588 clock. But the number of seconds are maintained in a private structure of the interface. Those are updated in a 1588 clock rollover interrupt. The timestamp is generated right before a rollover of a second and the timestamp value is constructed afterwards. Therefore the bigger part of the timestamp is wrong (the second). commit:54181c1d83e04b18e63c7723ac80f974b760e019 Suggested solution (pseudo-code): If( actual-time.nsec < timestamp.nsec ) Timestamp.sec = fpp->prtc -1; Else Timestamp.sec = fpp->prtc; But it is not perfect and there still exist potenitial second sync issue. So, the patch Suggested solution (pseudo-code): If( actual-time.nsec < timestamp.nsec && !FEC_IEVENT[TS_TIMER] ) Timestamp.sec = fpp->prtc -1; Else Timestamp.sec = fpp->prtc; Signed-off-by: Fugang Duan <B38611@freescale.com>
* ENGR00288342 net:fec_ptp: fix the potential issue for storing timestampFugang Duan2014-04-16
| | | | | | | | | | | | | | | | | | | The timestamps generated in the i.MX drivers are generated by the nanoseconds part coming from the 1588 clock. But the number of seconds are maintained in a private structure of the interface. Those are updated in a 1588 clock rollover interrupt. The timestamp is generated right before a rollover of a second and the timestamp value is constructed afterwards. Therefore the bigger part of the timestamp is wrong (the second). Suggested solution (pseudo-code): If( actual-time.nsec < timestamp.nsec ) Timestamp.sec = fpp->prtc -1; Else Timestamp.sec = fpp->prtc; Signed-off-by: Fugang Duan <B38611@freescale.com>
* ENGR00288046: net:fec_ptp: fix WARNING caused by mutex_trylock run in ↵Fugang Duan2014-04-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | interrupt context Kernel warning dump by enable kernel config "CONFIG_DEBUG_MUTEXES": ------------[ cut here ]------------ WARNING: at kernel/mutex.c:577 mutex_trylock+0x180/0x1d0() DEBUG_LOCKS_WARN_ON(in_interrupt()) Modules linked in: CPU: 0 PID: 68 Comm: kworker/0:2 Tainted: G W 3.10.17-16855-ga44de14 #1325 Workqueue: events phy_state_machine [<80014cbc>] (unwind_backtrace+0x0/0x138) from [<8001251c>] (show_stack+0x10/0x14) [<8001251c>] (show_stack+0x10/0x14) from [<80026754>] (warn_slowpath_common+0x4c/0x68) [<80026754>] (warn_slowpath_common+0x4c/0x68) from [<80026804>] (warn_slowpath_fmt+0x30/0x40) [<80026804>] (warn_slowpath_fmt+0x30/0x40) from [<8069f6b0>] (mutex_trylock+0x180/0x1d0) [<8069f6b0>] (mutex_trylock+0x180/0x1d0) from [<804dce7c>] (clk_prepare_lock+0xc/0xd8) [<804dce7c>] (clk_prepare_lock+0xc/0xd8) from [<804ddbcc>] (clk_get_rate+0xc/0x5c) [<804ddbcc>] (clk_get_rate+0xc/0x5c) from [<803b7528>] (fec_ptp_start_cyclecounter+0x1c/0x198) [<803b7528>] (fec_ptp_start_cyclecounter+0x1c/0x198) from [<803b5928>] (fec_restart+0x6e8/0x870) [<803b5928>] (fec_restart+0x6e8/0x870) from [<803b5d50>] (fec_enet_adjust_link+0x7c/0xb4) [<803b5d50>] (fec_enet_adjust_link+0x7c/0xb4) from [<803b07b8>] (phy_state_machine+0xfc/0x394) [<803b07b8>] (phy_state_machine+0xfc/0x394) from [<8003f03c>] (process_one_work+0x198/0x428) [<8003f03c>] (process_one_work+0x198/0x428) from [<8003fd24>] (worker_thread+0x144/0x3a4) [<8003fd24>] (worker_thread+0x144/0x3a4) from [<800458d8>] (kthread+0xa4/0xb0) [<800458d8>] (kthread+0xa4/0xb0) from [<8000ebd8>] (ret_from_fork+0x14/0x3c) ---[ end trace d1930b3e1c195329 ]--- Root cause: Worker thread call netif_tx_lock_bh() to diable the softirq preempt, and then call clk_get_rate() to get ptp clock rate. In fact, netif_tx_lock_bh()->local_bh_disable(), which make in_interrupt() to be ture. clk_get_rate()->clk_prepare_lock()->mutex_trylock(), and mutex_trylock() cannot use at interrupt context, otherwise there have kernel dump. So, remove the clk_get_rate() in there. Signed-off-by: Fugang Duan <B38611@freescale.com>
* ENGR00275371 net: fec: PTP: Add ptp support for IXXAT stackLuwei Zhou2014-04-16
| | | | | | | These patch add ptp support for IXXAT stack. Cherry picked from commit 1c8839574ac87826f53b96f987975a9bb1d72915. Signed-off-by: Luwei Zhou <B45643@freescale.com>
* fec: Only pass pdev in fec_ptp_init()Fabio Estevam2014-04-16
| | | | | | | Passing pdev in fec_ptp_init() is enough, since we can get ndev locally. Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* fec: Convert printks to netdev_<level>Joe Perches2013-04-14
| | | | | | | | | | | Use a more current logging message style. Convert the printks where a struct net_device is available to netdev_<level>. Convert the other printks to pr_<level> and add pr_fmt where appropriate. Signed-off-by: Joe Perches <joe@perches.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* fec: Fix PHC device logFabio Estevam2013-04-13
| | | | | | | | | | | | | | Currently when booting a mx6 device we get the following on boot: registered PHC device on eth%d Fix it by printing the network device name only after it gets registered, so that the following can be read now: fec 2188000.ethernet eth0: registered PHC device 0 Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* net: fec: build fec.c and fec_ptp.c to one moduleFrank Li2013-03-25
| | | | | | | | | | fec_ptp.ko can't run individually rename fec.c to fec_main.c Build fec.o and fec_ptp.o into one fec.ko Remove unnessary EXPORT_SYMBOL in fec_ptp Signed-off-by: Frank Li <Frank.Li@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* fec: Fix the build as moduleFabio Estevam2013-03-20
| | | | | | | | | | | | | | | Since commit ff43da86c69 (NET: FEC: dynamtic check DMA desc buff type) the following build error happens when CONFIG_FEC=m ERROR: "fec_ptp_init" [drivers/net/ethernet/freescale/fec.ko] undefined! ERROR: "fec_ptp_ioctl" [drivers/net/ethernet/freescale/fec.ko] undefined! ERROR: "fec_ptp_start_cyclecounter" [drivers/net/ethernet/freescale/fec.ko] undefined! Fix it by exporting the required fec_ptp symbols. Reported-by: Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* net: fec: fix spin_lock dead lockFrank Li2013-02-07
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | ========================================================= [ INFO: possible irq lock inversion dependency detected ] 3.8.0-rc5+ #82 Not tainted --------------------------------------------------------- swapper/0/0 just changed the state of lock: (&(&fep->hw_lock)->rlock){..-...}, at: [<8034e2f8>] fec_enet_start_xmit+0x48/0x 2cc but this lock took another, SOFTIRQ-unsafe lock in the past: (prepare_lock){+.+.+.} and interrupts could create inverse lock ordering between them. other info that might help us debug this: Possible interrupt unsafe locking scenario: CPU0 CPU1 ---- ---- lock(prepare_lock); local_irq_disable() lock(&(&fep->hw_lock)->rlock); lock(prepare_lock); <Interrupt> lock(&(&fep->hw_lock)->rlock); *** DEADLOCK *** Signed-off-by: Frank Li <Frank.Li@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* net: fec: reduce spin lock time in fec_ptp_adjfreqFrank Li2012-11-07
| | | | | | | | | | | | | move below calculate out of spin lock section diff = fep->cc.mult; diff *= ppb; diff = div_u64(diff, 1000000000ULL); diff is local variable and not neccesary in spin lock Signed-off-by: Frank Li <Frank.Li@freescale.com> Acked-by: Richard Cochran <richardcochran@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* FEC: Add time stamping code and a PTP hardware clockFrank Li2012-11-01
This patch adds a driver for the FEC(MX6) that offers time stamping and a PTP haderware clock. Because FEC\ENET(MX6) hardware frequency adjustment is complex, we have implemented this in software by changing the multiplication factor of the timecounter. Signed-off-by: Frank Li <Frank.Li@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>