diff options
author | Matt Carlson <mcarlson@broadcom.com> | 2012-12-03 14:36:57 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-12-04 12:58:49 -0500 |
commit | be947307b5b61fabbd76194d02617f9d2653176d (patch) | |
tree | 63f6548d072b3ffd603ce3d7870bf3442ed9572e | |
parent | 357630668a638418d542d0e331c90c01a091a3f1 (diff) |
tg3: PTP - Add header definitions, initialization and hw access functions.
This patch adds code to write the reference clock. If a chip reset is
performed, the hwclock is reinitialized with the adjusted kernel time
Signed-off-by: Nithin Nayak Sujir <nsujir@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/broadcom/Kconfig | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/tg3.c | 61 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/tg3.h | 60 |
3 files changed, 115 insertions, 7 deletions
diff --git a/drivers/net/ethernet/broadcom/Kconfig b/drivers/net/ethernet/broadcom/Kconfig index 4bd416b72e65..f55267363f35 100644 --- a/drivers/net/ethernet/broadcom/Kconfig +++ b/drivers/net/ethernet/broadcom/Kconfig | |||
@@ -102,6 +102,7 @@ config TIGON3 | |||
102 | depends on PCI | 102 | depends on PCI |
103 | select PHYLIB | 103 | select PHYLIB |
104 | select HWMON | 104 | select HWMON |
105 | select PTP_1588_CLOCK | ||
105 | ---help--- | 106 | ---help--- |
106 | This driver supports Broadcom Tigon3 based gigabit Ethernet cards. | 107 | This driver supports Broadcom Tigon3 based gigabit Ethernet cards. |
107 | 108 | ||
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index a4a5e2d329e4..32ffb5416674 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -54,6 +54,9 @@ | |||
54 | #include <asm/byteorder.h> | 54 | #include <asm/byteorder.h> |
55 | #include <linux/uaccess.h> | 55 | #include <linux/uaccess.h> |
56 | 56 | ||
57 | #include <uapi/linux/net_tstamp.h> | ||
58 | #include <linux/ptp_clock_kernel.h> | ||
59 | |||
57 | #ifdef CONFIG_SPARC | 60 | #ifdef CONFIG_SPARC |
58 | #include <asm/idprom.h> | 61 | #include <asm/idprom.h> |
59 | #include <asm/prom.h> | 62 | #include <asm/prom.h> |
@@ -5516,6 +5519,45 @@ static int tg3_setup_phy(struct tg3 *tp, int force_reset) | |||
5516 | return err; | 5519 | return err; |
5517 | } | 5520 | } |
5518 | 5521 | ||
5522 | /* tp->lock must be held */ | ||
5523 | static void tg3_refclk_write(struct tg3 *tp, u64 newval) | ||
5524 | { | ||
5525 | tw32(TG3_EAV_REF_CLCK_CTL, TG3_EAV_REF_CLCK_CTL_STOP); | ||
5526 | tw32(TG3_EAV_REF_CLCK_LSB, newval & 0xffffffff); | ||
5527 | tw32(TG3_EAV_REF_CLCK_MSB, newval >> 32); | ||
5528 | tw32_f(TG3_EAV_REF_CLCK_CTL, TG3_EAV_REF_CLCK_CTL_RESUME); | ||
5529 | } | ||
5530 | |||
5531 | /* tp->lock must be held */ | ||
5532 | static void tg3_ptp_init(struct tg3 *tp) | ||
5533 | { | ||
5534 | if (!tg3_flag(tp, PTP_CAPABLE)) | ||
5535 | return; | ||
5536 | |||
5537 | /* Initialize the hardware clock to the system time. */ | ||
5538 | tg3_refclk_write(tp, ktime_to_ns(ktime_get_real())); | ||
5539 | tp->ptp_adjust = 0; | ||
5540 | } | ||
5541 | |||
5542 | /* tp->lock must be held */ | ||
5543 | static void tg3_ptp_resume(struct tg3 *tp) | ||
5544 | { | ||
5545 | if (!tg3_flag(tp, PTP_CAPABLE)) | ||
5546 | return; | ||
5547 | |||
5548 | tg3_refclk_write(tp, ktime_to_ns(ktime_get_real()) + tp->ptp_adjust); | ||
5549 | tp->ptp_adjust = 0; | ||
5550 | } | ||
5551 | |||
5552 | static void tg3_ptp_fini(struct tg3 *tp) | ||
5553 | { | ||
5554 | if (!tg3_flag(tp, PTP_CAPABLE) || !tp->ptp_clock) | ||
5555 | return; | ||
5556 | |||
5557 | tp->ptp_clock = NULL; | ||
5558 | tp->ptp_adjust = 0; | ||
5559 | } | ||
5560 | |||
5519 | static inline int tg3_irq_sync(struct tg3 *tp) | 5561 | static inline int tg3_irq_sync(struct tg3 *tp) |
5520 | { | 5562 | { |
5521 | return tp->irq_sync; | 5563 | return tp->irq_sync; |
@@ -6528,6 +6570,8 @@ static inline void tg3_netif_stop(struct tg3 *tp) | |||
6528 | /* tp->lock must be held */ | 6570 | /* tp->lock must be held */ |
6529 | static inline void tg3_netif_start(struct tg3 *tp) | 6571 | static inline void tg3_netif_start(struct tg3 *tp) |
6530 | { | 6572 | { |
6573 | tg3_ptp_resume(tp); | ||
6574 | |||
6531 | /* NOTE: unconditional netif_tx_wake_all_queues is only | 6575 | /* NOTE: unconditional netif_tx_wake_all_queues is only |
6532 | * appropriate so long as all callers are assured to | 6576 | * appropriate so long as all callers are assured to |
6533 | * have free tx slots (such as after tg3_init_hw) | 6577 | * have free tx slots (such as after tg3_init_hw) |
@@ -10365,7 +10409,8 @@ static void tg3_ints_fini(struct tg3 *tp) | |||
10365 | tg3_flag_clear(tp, ENABLE_TSS); | 10409 | tg3_flag_clear(tp, ENABLE_TSS); |
10366 | } | 10410 | } |
10367 | 10411 | ||
10368 | static int tg3_start(struct tg3 *tp, bool reset_phy, bool test_irq) | 10412 | static int tg3_start(struct tg3 *tp, bool reset_phy, bool test_irq, |
10413 | bool init) | ||
10369 | { | 10414 | { |
10370 | struct net_device *dev = tp->dev; | 10415 | struct net_device *dev = tp->dev; |
10371 | int i, err; | 10416 | int i, err; |
@@ -10444,6 +10489,12 @@ static int tg3_start(struct tg3 *tp, bool reset_phy, bool test_irq) | |||
10444 | tg3_flag_set(tp, INIT_COMPLETE); | 10489 | tg3_flag_set(tp, INIT_COMPLETE); |
10445 | tg3_enable_ints(tp); | 10490 | tg3_enable_ints(tp); |
10446 | 10491 | ||
10492 | if (init) | ||
10493 | tg3_ptp_init(tp); | ||
10494 | else | ||
10495 | tg3_ptp_resume(tp); | ||
10496 | |||
10497 | |||
10447 | tg3_full_unlock(tp); | 10498 | tg3_full_unlock(tp); |
10448 | 10499 | ||
10449 | netif_tx_start_all_queues(dev); | 10500 | netif_tx_start_all_queues(dev); |
@@ -10541,11 +10592,12 @@ static int tg3_open(struct net_device *dev) | |||
10541 | 10592 | ||
10542 | tg3_full_unlock(tp); | 10593 | tg3_full_unlock(tp); |
10543 | 10594 | ||
10544 | err = tg3_start(tp, true, true); | 10595 | err = tg3_start(tp, true, true, true); |
10545 | if (err) { | 10596 | if (err) { |
10546 | tg3_frob_aux_power(tp, false); | 10597 | tg3_frob_aux_power(tp, false); |
10547 | pci_set_power_state(tp->pdev, PCI_D3hot); | 10598 | pci_set_power_state(tp->pdev, PCI_D3hot); |
10548 | } | 10599 | } |
10600 | |||
10549 | return err; | 10601 | return err; |
10550 | } | 10602 | } |
10551 | 10603 | ||
@@ -10553,6 +10605,8 @@ static int tg3_close(struct net_device *dev) | |||
10553 | { | 10605 | { |
10554 | struct tg3 *tp = netdev_priv(dev); | 10606 | struct tg3 *tp = netdev_priv(dev); |
10555 | 10607 | ||
10608 | tg3_ptp_fini(tp); | ||
10609 | |||
10556 | tg3_stop(tp); | 10610 | tg3_stop(tp); |
10557 | 10611 | ||
10558 | /* Clear stats across close / open calls */ | 10612 | /* Clear stats across close / open calls */ |
@@ -11455,7 +11509,7 @@ static int tg3_set_channels(struct net_device *dev, | |||
11455 | 11509 | ||
11456 | tg3_carrier_off(tp); | 11510 | tg3_carrier_off(tp); |
11457 | 11511 | ||
11458 | tg3_start(tp, true, false); | 11512 | tg3_start(tp, true, false, false); |
11459 | 11513 | ||
11460 | return 0; | 11514 | return 0; |
11461 | } | 11515 | } |
@@ -12508,7 +12562,6 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest, | |||
12508 | } | 12562 | } |
12509 | 12563 | ||
12510 | tg3_full_lock(tp, irq_sync); | 12564 | tg3_full_lock(tp, irq_sync); |
12511 | |||
12512 | tg3_halt(tp, RESET_KIND_SUSPEND, 1); | 12565 | tg3_halt(tp, RESET_KIND_SUSPEND, 1); |
12513 | err = tg3_nvram_lock(tp); | 12566 | err = tg3_nvram_lock(tp); |
12514 | tg3_halt_cpu(tp, RX_CPU_BASE); | 12567 | tg3_halt_cpu(tp, RX_CPU_BASE); |
diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h index 4534804469bf..d330e81f5793 100644 --- a/drivers/net/ethernet/broadcom/tg3.h +++ b/drivers/net/ethernet/broadcom/tg3.h | |||
@@ -772,7 +772,10 @@ | |||
772 | #define SG_DIG_MAC_ACK_STATUS 0x00000004 | 772 | #define SG_DIG_MAC_ACK_STATUS 0x00000004 |
773 | #define SG_DIG_AUTONEG_COMPLETE 0x00000002 | 773 | #define SG_DIG_AUTONEG_COMPLETE 0x00000002 |
774 | #define SG_DIG_AUTONEG_ERROR 0x00000001 | 774 | #define SG_DIG_AUTONEG_ERROR 0x00000001 |
775 | /* 0x5b8 --> 0x600 unused */ | 775 | #define TG3_TX_TSTAMP_LSB 0x000005c0 |
776 | #define TG3_TX_TSTAMP_MSB 0x000005c4 | ||
777 | #define TG3_TSTAMP_MASK 0x7fffffffffffffff | ||
778 | /* 0x5c8 --> 0x600 unused */ | ||
776 | #define MAC_TX_MAC_STATE_BASE 0x00000600 /* 16 bytes */ | 779 | #define MAC_TX_MAC_STATE_BASE 0x00000600 /* 16 bytes */ |
777 | #define MAC_RX_MAC_STATE_BASE 0x00000610 /* 20 bytes */ | 780 | #define MAC_RX_MAC_STATE_BASE 0x00000610 /* 20 bytes */ |
778 | /* 0x624 --> 0x670 unused */ | 781 | /* 0x624 --> 0x670 unused */ |
@@ -789,7 +792,36 @@ | |||
789 | #define MAC_RSS_HASH_KEY_7 0x0000068c | 792 | #define MAC_RSS_HASH_KEY_7 0x0000068c |
790 | #define MAC_RSS_HASH_KEY_8 0x00000690 | 793 | #define MAC_RSS_HASH_KEY_8 0x00000690 |
791 | #define MAC_RSS_HASH_KEY_9 0x00000694 | 794 | #define MAC_RSS_HASH_KEY_9 0x00000694 |
792 | /* 0x698 --> 0x800 unused */ | 795 | /* 0x698 --> 0x6b0 unused */ |
796 | |||
797 | #define TG3_RX_TSTAMP_LSB 0x000006b0 | ||
798 | #define TG3_RX_TSTAMP_MSB 0x000006b4 | ||
799 | /* 0x6b8 --> 0x6c8 unused */ | ||
800 | |||
801 | #define TG3_RX_PTP_CTL 0x000006c8 | ||
802 | #define TG3_RX_PTP_CTL_SYNC_EVNT 0x00000001 | ||
803 | #define TG3_RX_PTP_CTL_DELAY_REQ 0x00000002 | ||
804 | #define TG3_RX_PTP_CTL_PDLAY_REQ 0x00000004 | ||
805 | #define TG3_RX_PTP_CTL_PDLAY_RES 0x00000008 | ||
806 | #define TG3_RX_PTP_CTL_ALL_V1_EVENTS (TG3_RX_PTP_CTL_SYNC_EVNT | \ | ||
807 | TG3_RX_PTP_CTL_DELAY_REQ) | ||
808 | #define TG3_RX_PTP_CTL_ALL_V2_EVENTS (TG3_RX_PTP_CTL_SYNC_EVNT | \ | ||
809 | TG3_RX_PTP_CTL_DELAY_REQ | \ | ||
810 | TG3_RX_PTP_CTL_PDLAY_REQ | \ | ||
811 | TG3_RX_PTP_CTL_PDLAY_RES) | ||
812 | #define TG3_RX_PTP_CTL_FOLLOW_UP 0x00000100 | ||
813 | #define TG3_RX_PTP_CTL_DELAY_RES 0x00000200 | ||
814 | #define TG3_RX_PTP_CTL_PDRES_FLW_UP 0x00000400 | ||
815 | #define TG3_RX_PTP_CTL_ANNOUNCE 0x00000800 | ||
816 | #define TG3_RX_PTP_CTL_SIGNALING 0x00001000 | ||
817 | #define TG3_RX_PTP_CTL_MANAGEMENT 0x00002000 | ||
818 | #define TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN 0x00800000 | ||
819 | #define TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN 0x01000000 | ||
820 | #define TG3_RX_PTP_CTL_RX_PTP_V2_EN (TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | \ | ||
821 | TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN) | ||
822 | #define TG3_RX_PTP_CTL_RX_PTP_V1_EN 0x02000000 | ||
823 | #define TG3_RX_PTP_CTL_HWTS_INTERLOCK 0x04000000 | ||
824 | /* 0x6cc --> 0x800 unused */ | ||
793 | 825 | ||
794 | #define MAC_TX_STATS_OCTETS 0x00000800 | 826 | #define MAC_TX_STATS_OCTETS 0x00000800 |
795 | #define MAC_TX_STATS_RESV1 0x00000804 | 827 | #define MAC_TX_STATS_RESV1 0x00000804 |
@@ -1669,6 +1701,7 @@ | |||
1669 | #define GRC_MODE_HOST_STACKUP 0x00010000 | 1701 | #define GRC_MODE_HOST_STACKUP 0x00010000 |
1670 | #define GRC_MODE_HOST_SENDBDS 0x00020000 | 1702 | #define GRC_MODE_HOST_SENDBDS 0x00020000 |
1671 | #define GRC_MODE_HTX2B_ENABLE 0x00040000 | 1703 | #define GRC_MODE_HTX2B_ENABLE 0x00040000 |
1704 | #define GRC_MODE_TIME_SYNC_ENABLE 0x00080000 | ||
1672 | #define GRC_MODE_NO_TX_PHDR_CSUM 0x00100000 | 1705 | #define GRC_MODE_NO_TX_PHDR_CSUM 0x00100000 |
1673 | #define GRC_MODE_NVRAM_WR_ENABLE 0x00200000 | 1706 | #define GRC_MODE_NVRAM_WR_ENABLE 0x00200000 |
1674 | #define GRC_MODE_PCIE_TL_SEL 0x00000000 | 1707 | #define GRC_MODE_PCIE_TL_SEL 0x00000000 |
@@ -1771,7 +1804,17 @@ | |||
1771 | #define GRC_VCPU_EXT_CTRL_DISABLE_WOL 0x20000000 | 1804 | #define GRC_VCPU_EXT_CTRL_DISABLE_WOL 0x20000000 |
1772 | #define GRC_FASTBOOT_PC 0x00006894 /* 5752, 5755, 5787 */ | 1805 | #define GRC_FASTBOOT_PC 0x00006894 /* 5752, 5755, 5787 */ |
1773 | 1806 | ||
1774 | /* 0x6c00 --> 0x7000 unused */ | 1807 | #define TG3_EAV_REF_CLCK_LSB 0x00006900 |
1808 | #define TG3_EAV_REF_CLCK_MSB 0x00006904 | ||
1809 | #define TG3_EAV_REF_CLCK_CTL 0x00006908 | ||
1810 | #define TG3_EAV_REF_CLCK_CTL_STOP 0x00000002 | ||
1811 | #define TG3_EAV_REF_CLCK_CTL_RESUME 0x00000004 | ||
1812 | #define TG3_EAV_REF_CLK_CORRECT_CTL 0x00006928 | ||
1813 | #define TG3_EAV_REF_CLK_CORRECT_EN (1 << 31) | ||
1814 | #define TG3_EAV_REF_CLK_CORRECT_NEG (1 << 30) | ||
1815 | |||
1816 | #define TG3_EAV_REF_CLK_CORRECT_MASK 0xffffff | ||
1817 | /* 0x690c --> 0x7000 unused */ | ||
1775 | 1818 | ||
1776 | /* NVRAM Control registers */ | 1819 | /* NVRAM Control registers */ |
1777 | #define NVRAM_CMD 0x00007000 | 1820 | #define NVRAM_CMD 0x00007000 |
@@ -2439,6 +2482,7 @@ struct tg3_tx_buffer_desc { | |||
2439 | #define TXD_FLAG_IP_FRAG 0x0008 | 2482 | #define TXD_FLAG_IP_FRAG 0x0008 |
2440 | #define TXD_FLAG_JMB_PKT 0x0008 | 2483 | #define TXD_FLAG_JMB_PKT 0x0008 |
2441 | #define TXD_FLAG_IP_FRAG_END 0x0010 | 2484 | #define TXD_FLAG_IP_FRAG_END 0x0010 |
2485 | #define TXD_FLAG_HWTSTAMP 0x0020 | ||
2442 | #define TXD_FLAG_VLAN 0x0040 | 2486 | #define TXD_FLAG_VLAN 0x0040 |
2443 | #define TXD_FLAG_COAL_NOW 0x0080 | 2487 | #define TXD_FLAG_COAL_NOW 0x0080 |
2444 | #define TXD_FLAG_CPU_PRE_DMA 0x0100 | 2488 | #define TXD_FLAG_CPU_PRE_DMA 0x0100 |
@@ -2480,6 +2524,9 @@ struct tg3_rx_buffer_desc { | |||
2480 | #define RXD_FLAG_IP_CSUM 0x1000 | 2524 | #define RXD_FLAG_IP_CSUM 0x1000 |
2481 | #define RXD_FLAG_TCPUDP_CSUM 0x2000 | 2525 | #define RXD_FLAG_TCPUDP_CSUM 0x2000 |
2482 | #define RXD_FLAG_IS_TCP 0x4000 | 2526 | #define RXD_FLAG_IS_TCP 0x4000 |
2527 | #define RXD_FLAG_PTPSTAT_MASK 0x0210 | ||
2528 | #define RXD_FLAG_PTPSTAT_PTPV1 0x0010 | ||
2529 | #define RXD_FLAG_PTPSTAT_PTPV2 0x0200 | ||
2483 | 2530 | ||
2484 | u32 ip_tcp_csum; | 2531 | u32 ip_tcp_csum; |
2485 | #define RXD_IPCSUM_MASK 0xffff0000 | 2532 | #define RXD_IPCSUM_MASK 0xffff0000 |
@@ -2970,9 +3017,11 @@ enum TG3_FLAGS { | |||
2970 | TG3_FLAG_USE_JUMBO_BDFLAG, | 3017 | TG3_FLAG_USE_JUMBO_BDFLAG, |
2971 | TG3_FLAG_L1PLLPD_EN, | 3018 | TG3_FLAG_L1PLLPD_EN, |
2972 | TG3_FLAG_APE_HAS_NCSI, | 3019 | TG3_FLAG_APE_HAS_NCSI, |
3020 | TG3_FLAG_TX_TSTAMP_EN, | ||
2973 | TG3_FLAG_4K_FIFO_LIMIT, | 3021 | TG3_FLAG_4K_FIFO_LIMIT, |
2974 | TG3_FLAG_5719_RDMA_BUG, | 3022 | TG3_FLAG_5719_RDMA_BUG, |
2975 | TG3_FLAG_RESET_TASK_PENDING, | 3023 | TG3_FLAG_RESET_TASK_PENDING, |
3024 | TG3_FLAG_PTP_CAPABLE, | ||
2976 | TG3_FLAG_5705_PLUS, | 3025 | TG3_FLAG_5705_PLUS, |
2977 | TG3_FLAG_IS_5788, | 3026 | TG3_FLAG_IS_5788, |
2978 | TG3_FLAG_5750_PLUS, | 3027 | TG3_FLAG_5750_PLUS, |
@@ -3041,6 +3090,10 @@ struct tg3 { | |||
3041 | u32 coal_now; | 3090 | u32 coal_now; |
3042 | u32 msg_enable; | 3091 | u32 msg_enable; |
3043 | 3092 | ||
3093 | struct ptp_clock_info ptp_info; | ||
3094 | struct ptp_clock *ptp_clock; | ||
3095 | s64 ptp_adjust; | ||
3096 | |||
3044 | /* begin "tx thread" cacheline section */ | 3097 | /* begin "tx thread" cacheline section */ |
3045 | void (*write32_tx_mbox) (struct tg3 *, u32, | 3098 | void (*write32_tx_mbox) (struct tg3 *, u32, |
3046 | u32); | 3099 | u32); |
@@ -3108,6 +3161,7 @@ struct tg3 { | |||
3108 | u32 dma_rwctrl; | 3161 | u32 dma_rwctrl; |
3109 | u32 coalesce_mode; | 3162 | u32 coalesce_mode; |
3110 | u32 pwrmgmt_thresh; | 3163 | u32 pwrmgmt_thresh; |
3164 | u32 rxptpctl; | ||
3111 | 3165 | ||
3112 | /* PCI block */ | 3166 | /* PCI block */ |
3113 | u32 pci_chip_rev_id; | 3167 | u32 pci_chip_rev_id; |