aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/broadcom')
-rw-r--r--drivers/net/ethernet/broadcom/Kconfig1
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c61
-rw-r--r--drivers/net/ethernet/broadcom/tg3.h60
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 */
5523static 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 */
5532static 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 */
5543static 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
5552static 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
5519static inline int tg3_irq_sync(struct tg3 *tp) 5561static 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 */
6529static inline void tg3_netif_start(struct tg3 *tp) 6571static 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
10368static int tg3_start(struct tg3 *tp, bool reset_phy, bool test_irq) 10412static 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;