Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue

Tony Nguyen says:

====================
Intel Wired LAN Driver Updates 2023-08-24 (igc, e1000e)

This series contains updates to igc and e1000e drivers.

Vinicius adds support for utilizing multiple PTP registers on igc.

Sasha reduces interval time for PTM on igc and adds new device support
on e1000e.

* '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue:
e1000e: Add support for the next LOM generation
igc: Decrease PTM short interval from 10 us to 1 us
igc: Add support for multiple in-flight TX timestamps
====================

Link: https://lore.kernel.org/r/20230824204418.1551093-1-anthony.l.nguyen@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+212 -66
+2
drivers/net/ethernet/intel/e1000e/ethtool.c
··· 917 917 case e1000_pch_mtp: 918 918 case e1000_pch_lnp: 919 919 case e1000_pch_ptp: 920 + case e1000_pch_nvp: 920 921 mask |= BIT(18); 921 922 break; 922 923 default: ··· 1586 1585 case e1000_pch_mtp: 1587 1586 case e1000_pch_lnp: 1588 1587 case e1000_pch_ptp: 1588 + case e1000_pch_nvp: 1589 1589 fext_nvm11 = er32(FEXTNVM11); 1590 1590 fext_nvm11 &= ~E1000_FEXTNVM11_DISABLE_MULR_FIX; 1591 1591 ew32(FEXTNVM11, fext_nvm11);
+3
drivers/net/ethernet/intel/e1000e/hw.h
··· 122 122 #define E1000_DEV_ID_PCH_PTP_I219_V26 0x57B6 123 123 #define E1000_DEV_ID_PCH_PTP_I219_LM27 0x57B7 124 124 #define E1000_DEV_ID_PCH_PTP_I219_V27 0x57B8 125 + #define E1000_DEV_ID_PCH_NVL_I219_LM29 0x57B9 126 + #define E1000_DEV_ID_PCH_NVL_I219_V29 0x57BA 125 127 126 128 #define E1000_REVISION_4 4 127 129 ··· 152 150 e1000_pch_mtp, 153 151 e1000_pch_lnp, 154 152 e1000_pch_ptp, 153 + e1000_pch_nvp, 155 154 }; 156 155 157 156 enum e1000_media_type {
+7
drivers/net/ethernet/intel/e1000e/ich8lan.c
··· 323 323 case e1000_pch_mtp: 324 324 case e1000_pch_lnp: 325 325 case e1000_pch_ptp: 326 + case e1000_pch_nvp: 326 327 if (e1000_phy_is_accessible_pchlan(hw)) 327 328 break; 328 329 ··· 471 470 case e1000_pch_mtp: 472 471 case e1000_pch_lnp: 473 472 case e1000_pch_ptp: 473 + case e1000_pch_nvp: 474 474 /* In case the PHY needs to be in mdio slow mode, 475 475 * set slow mode and try to get the PHY id again. 476 476 */ ··· 719 717 case e1000_pch_mtp: 720 718 case e1000_pch_lnp: 721 719 case e1000_pch_ptp: 720 + case e1000_pch_nvp: 722 721 case e1000_pchlan: 723 722 /* check management mode */ 724 723 mac->ops.check_mng_mode = e1000_check_mng_mode_pchlan; ··· 1688 1685 case e1000_pch_mtp: 1689 1686 case e1000_pch_lnp: 1690 1687 case e1000_pch_ptp: 1688 + case e1000_pch_nvp: 1691 1689 rc = e1000_init_phy_params_pchlan(hw); 1692 1690 break; 1693 1691 default: ··· 2146 2142 case e1000_pch_mtp: 2147 2143 case e1000_pch_lnp: 2148 2144 case e1000_pch_ptp: 2145 + case e1000_pch_nvp: 2149 2146 sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M; 2150 2147 break; 2151 2148 default: ··· 3193 3188 case e1000_pch_mtp: 3194 3189 case e1000_pch_lnp: 3195 3190 case e1000_pch_ptp: 3191 + case e1000_pch_nvp: 3196 3192 bank1_offset = nvm->flash_bank_size; 3197 3193 act_offset = E1000_ICH_NVM_SIG_WORD; 3198 3194 ··· 4135 4129 case e1000_pch_mtp: 4136 4130 case e1000_pch_lnp: 4137 4131 case e1000_pch_ptp: 4132 + case e1000_pch_nvp: 4138 4133 word = NVM_COMPAT; 4139 4134 valid_csum_mask = NVM_COMPAT_VALID_CSUM; 4140 4135 break;
+4
drivers/net/ethernet/intel/e1000e/netdev.c
··· 3545 3545 case e1000_pch_mtp: 3546 3546 case e1000_pch_lnp: 3547 3547 case e1000_pch_ptp: 3548 + case e1000_pch_nvp: 3548 3549 if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) { 3549 3550 /* Stable 24MHz frequency */ 3550 3551 incperiod = INCPERIOD_24MHZ; ··· 4062 4061 case e1000_pch_mtp: 4063 4062 case e1000_pch_lnp: 4064 4063 case e1000_pch_ptp: 4064 + case e1000_pch_nvp: 4065 4065 fc->refresh_time = 0xFFFF; 4066 4066 fc->pause_time = 0xFFFF; 4067 4067 ··· 7915 7913 { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_V26), board_pch_mtp }, 7916 7914 { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_LM27), board_pch_mtp }, 7917 7915 { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_V27), board_pch_mtp }, 7916 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_NVL_I219_LM29), board_pch_mtp }, 7917 + { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_NVL_I219_V29), board_pch_mtp }, 7918 7918 7919 7919 { 0, 0, 0, 0, 0, 0, 0 } /* terminate list */ 7920 7920 };
+1
drivers/net/ethernet/intel/e1000e/ptp.c
··· 288 288 case e1000_pch_mtp: 289 289 case e1000_pch_lnp: 290 290 case e1000_pch_ptp: 291 + case e1000_pch_nvp: 291 292 if ((hw->mac.type < e1000_pch_lpt) || 292 293 (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI)) { 293 294 adapter->ptp_clock_info.max_adj = 24000000 - 1;
+16 -2
drivers/net/ethernet/intel/igc/igc.h
··· 38 38 39 39 #define MAX_FLEX_FILTER 32 40 40 41 + #define IGC_MAX_TX_TSTAMP_REGS 4 42 + 41 43 enum igc_mac_filter_type { 42 44 IGC_MAC_FILTER_TYPE_DST = 0, 43 45 IGC_MAC_FILTER_TYPE_SRC ··· 70 68 u64 sctp_packets; /* SCTP headers processed */ 71 69 u64 nfs_packets; /* NFS headers processe */ 72 70 u64 other_packets; 71 + }; 72 + 73 + struct igc_tx_timestamp_request { 74 + struct sk_buff *skb; /* reference to the packet being timestamped */ 75 + unsigned long start; /* when the tstamp request started (jiffies) */ 76 + u32 mask; /* _TSYNCTXCTL_TXTT_{X} bit for this request */ 77 + u32 regl; /* which TXSTMPL_{X} register should be used */ 78 + u32 regh; /* which TXSTMPH_{X} register should be used */ 79 + u32 flags; /* flags that should be added to the tx_buffer */ 73 80 }; 74 81 75 82 struct igc_ring_container { ··· 256 245 * ptp_tx_lock. 257 246 */ 258 247 spinlock_t ptp_tx_lock; 259 - struct sk_buff *ptp_tx_skb; 248 + struct igc_tx_timestamp_request tx_tstamp[IGC_MAX_TX_TSTAMP_REGS]; 260 249 struct hwtstamp_config tstamp_config; 261 - unsigned long ptp_tx_start; 262 250 unsigned int ptp_flags; 263 251 /* System time value lock */ 264 252 spinlock_t tmreg_lock; ··· 465 455 /* olinfo flags */ 466 456 IGC_TX_FLAGS_IPV4 = 0x10, 467 457 IGC_TX_FLAGS_CSUM = 0x20, 458 + 459 + IGC_TX_FLAGS_TSTAMP_1 = 0x100, 460 + IGC_TX_FLAGS_TSTAMP_2 = 0x200, 461 + IGC_TX_FLAGS_TSTAMP_3 = 0x400, 468 462 }; 469 463 470 464 enum igc_boards {
+3
drivers/net/ethernet/intel/igc/igc_base.h
··· 34 34 35 35 /* Adv Transmit Descriptor Config Masks */ 36 36 #define IGC_ADVTXD_MAC_TSTAMP 0x00080000 /* IEEE1588 Timestamp packet */ 37 + #define IGC_ADVTXD_TSTAMP_REG_1 0x00010000 /* Select register 1 for timestamp */ 38 + #define IGC_ADVTXD_TSTAMP_REG_2 0x00020000 /* Select register 2 for timestamp */ 39 + #define IGC_ADVTXD_TSTAMP_REG_3 0x00030000 /* Select register 3 for timestamp */ 37 40 #define IGC_ADVTXD_DTYP_CTXT 0x00200000 /* Advanced Context Descriptor */ 38 41 #define IGC_ADVTXD_DTYP_DATA 0x00300000 /* Advanced Data Descriptor */ 39 42 #define IGC_ADVTXD_DCMD_EOP 0x01000000 /* End of Packet */
+8 -1
drivers/net/ethernet/intel/igc/igc_defines.h
··· 454 454 455 455 /* Time Sync Transmit Control bit definitions */ 456 456 #define IGC_TSYNCTXCTL_TXTT_0 0x00000001 /* Tx timestamp reg 0 valid */ 457 + #define IGC_TSYNCTXCTL_TXTT_1 0x00000002 /* Tx timestamp reg 1 valid */ 458 + #define IGC_TSYNCTXCTL_TXTT_2 0x00000004 /* Tx timestamp reg 2 valid */ 459 + #define IGC_TSYNCTXCTL_TXTT_3 0x00000008 /* Tx timestamp reg 3 valid */ 457 460 #define IGC_TSYNCTXCTL_ENABLED 0x00000010 /* enable Tx timestamping */ 458 461 #define IGC_TSYNCTXCTL_MAX_ALLOWED_DLY_MASK 0x0000F000 /* max delay */ 459 462 #define IGC_TSYNCTXCTL_SYNC_COMP_ERR 0x20000000 /* sync err */ 460 463 #define IGC_TSYNCTXCTL_SYNC_COMP 0x40000000 /* sync complete */ 461 464 #define IGC_TSYNCTXCTL_START_SYNC 0x80000000 /* initiate sync */ 462 465 #define IGC_TSYNCTXCTL_TXSYNSIG 0x00000020 /* Sample TX tstamp in PHY sop */ 466 + 467 + #define IGC_TSYNCTXCTL_TXTT_ANY ( \ 468 + IGC_TSYNCTXCTL_TXTT_0 | IGC_TSYNCTXCTL_TXTT_1 | \ 469 + IGC_TSYNCTXCTL_TXTT_2 | IGC_TSYNCTXCTL_TXTT_3) 463 470 464 471 /* Timer selection bits */ 465 472 #define IGC_AUX_IO_TIMER_SEL_SYSTIM0 (0u << 30) /* Select SYSTIM0 for auxiliary time stamp */ ··· 556 549 #define IGC_PTM_CTRL_SHRT_CYC(usec) (((usec) & 0x3f) << 2) 557 550 #define IGC_PTM_CTRL_PTM_TO(usec) (((usec) & 0xff) << 8) 558 551 559 - #define IGC_PTM_SHORT_CYC_DEFAULT 10 /* Default Short/interrupted cycle interval */ 552 + #define IGC_PTM_SHORT_CYC_DEFAULT 1 /* Default short cycle interval */ 560 553 #define IGC_PTM_CYC_TIME_DEFAULT 5 /* Default PTM cycle time */ 561 554 #define IGC_PTM_TIMEOUT_DEFAULT 255 /* Default timeout for PTM errors */ 562 555
+35 -6
drivers/net/ethernet/intel/igc/igc_main.c
··· 1271 1271 cmd_type |= IGC_SET_FLAG(tx_flags, IGC_TX_FLAGS_TSO, 1272 1272 (IGC_ADVTXD_DCMD_TSE)); 1273 1273 1274 - /* set timestamp bit if present */ 1274 + /* set timestamp bit if present, will select the register set 1275 + * based on the _TSTAMP(_X) bit. 1276 + */ 1275 1277 cmd_type |= IGC_SET_FLAG(tx_flags, IGC_TX_FLAGS_TSTAMP, 1276 1278 (IGC_ADVTXD_MAC_TSTAMP)); 1279 + 1280 + cmd_type |= IGC_SET_FLAG(tx_flags, IGC_TX_FLAGS_TSTAMP_1, 1281 + (IGC_ADVTXD_TSTAMP_REG_1)); 1282 + 1283 + cmd_type |= IGC_SET_FLAG(tx_flags, IGC_TX_FLAGS_TSTAMP_2, 1284 + (IGC_ADVTXD_TSTAMP_REG_2)); 1285 + 1286 + cmd_type |= IGC_SET_FLAG(tx_flags, IGC_TX_FLAGS_TSTAMP_3, 1287 + (IGC_ADVTXD_TSTAMP_REG_3)); 1277 1288 1278 1289 /* insert frame checksum */ 1279 1290 cmd_type ^= IGC_SET_FLAG(skb->no_fcs, 1, IGC_ADVTXD_DCMD_IFCS); ··· 1544 1533 return 1; 1545 1534 } 1546 1535 1536 + static bool igc_request_tx_tstamp(struct igc_adapter *adapter, struct sk_buff *skb, u32 *flags) 1537 + { 1538 + int i; 1539 + 1540 + for (i = 0; i < IGC_MAX_TX_TSTAMP_REGS; i++) { 1541 + struct igc_tx_timestamp_request *tstamp = &adapter->tx_tstamp[i]; 1542 + 1543 + if (tstamp->skb) 1544 + continue; 1545 + 1546 + tstamp->skb = skb_get(skb); 1547 + tstamp->start = jiffies; 1548 + *flags = tstamp->flags; 1549 + 1550 + return true; 1551 + } 1552 + 1553 + return false; 1554 + } 1555 + 1547 1556 static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb, 1548 1557 struct igc_ring *tx_ring) 1549 1558 { ··· 1645 1614 * timestamping request. 1646 1615 */ 1647 1616 unsigned long flags; 1617 + u32 tstamp_flags; 1648 1618 1649 1619 spin_lock_irqsave(&adapter->ptp_tx_lock, flags); 1650 - if (!adapter->ptp_tx_skb) { 1620 + if (igc_request_tx_tstamp(adapter, skb, &tstamp_flags)) { 1651 1621 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; 1652 - tx_flags |= IGC_TX_FLAGS_TSTAMP; 1653 - 1654 - adapter->ptp_tx_skb = skb_get(skb); 1655 - adapter->ptp_tx_start = jiffies; 1622 + tx_flags |= IGC_TX_FLAGS_TSTAMP | tstamp_flags; 1656 1623 } else { 1657 1624 adapter->tx_hwtstamp_skipped++; 1658 1625 }
+121 -57
drivers/net/ethernet/intel/igc/igc_ptp.c
··· 558 558 static void igc_ptp_clear_tx_tstamp(struct igc_adapter *adapter) 559 559 { 560 560 unsigned long flags; 561 + int i; 561 562 562 563 spin_lock_irqsave(&adapter->ptp_tx_lock, flags); 563 564 564 - dev_kfree_skb_any(adapter->ptp_tx_skb); 565 - adapter->ptp_tx_skb = NULL; 565 + for (i = 0; i < IGC_MAX_TX_TSTAMP_REGS; i++) { 566 + struct igc_tx_timestamp_request *tstamp = &adapter->tx_tstamp[i]; 567 + 568 + dev_kfree_skb_any(tstamp->skb); 569 + tstamp->skb = NULL; 570 + } 566 571 567 572 spin_unlock_irqrestore(&adapter->ptp_tx_lock, flags); 568 573 } ··· 664 659 } 665 660 666 661 /* Requires adapter->ptp_tx_lock held by caller. */ 667 - static void igc_ptp_tx_timeout(struct igc_adapter *adapter) 662 + static void igc_ptp_tx_timeout(struct igc_adapter *adapter, 663 + struct igc_tx_timestamp_request *tstamp) 668 664 { 669 - struct igc_hw *hw = &adapter->hw; 670 - 671 - dev_kfree_skb_any(adapter->ptp_tx_skb); 672 - adapter->ptp_tx_skb = NULL; 665 + dev_kfree_skb_any(tstamp->skb); 666 + tstamp->skb = NULL; 673 667 adapter->tx_hwtstamp_timeouts++; 674 - /* Clear the tx valid bit in TSYNCTXCTL register to enable interrupt. */ 675 - rd32(IGC_TXSTMPH); 668 + 676 669 netdev_warn(adapter->netdev, "Tx timestamp timeout\n"); 677 670 } 678 671 679 672 void igc_ptp_tx_hang(struct igc_adapter *adapter) 680 673 { 674 + struct igc_tx_timestamp_request *tstamp; 675 + struct igc_hw *hw = &adapter->hw; 681 676 unsigned long flags; 677 + bool found = false; 678 + int i; 682 679 683 680 spin_lock_irqsave(&adapter->ptp_tx_lock, flags); 684 681 685 - if (!adapter->ptp_tx_skb) 686 - goto unlock; 682 + for (i = 0; i < IGC_MAX_TX_TSTAMP_REGS; i++) { 683 + tstamp = &adapter->tx_tstamp[i]; 687 684 688 - if (time_is_after_jiffies(adapter->ptp_tx_start + IGC_PTP_TX_TIMEOUT)) 689 - goto unlock; 685 + if (!tstamp->skb) 686 + continue; 690 687 691 - igc_ptp_tx_timeout(adapter); 688 + if (time_is_after_jiffies(tstamp->start + IGC_PTP_TX_TIMEOUT)) 689 + continue; 692 690 693 - unlock: 691 + igc_ptp_tx_timeout(adapter, tstamp); 692 + found = true; 693 + } 694 + 695 + if (found) { 696 + /* Reading the high register of the first set of timestamp registers 697 + * clears all the equivalent bits in the TSYNCTXCTL register. 698 + */ 699 + rd32(IGC_TXSTMPH_0); 700 + } 701 + 694 702 spin_unlock_irqrestore(&adapter->ptp_tx_lock, flags); 703 + } 704 + 705 + static void igc_ptp_tx_reg_to_stamp(struct igc_adapter *adapter, 706 + struct igc_tx_timestamp_request *tstamp, u64 regval) 707 + { 708 + struct skb_shared_hwtstamps shhwtstamps; 709 + struct sk_buff *skb; 710 + int adjust = 0; 711 + 712 + skb = tstamp->skb; 713 + if (!skb) 714 + return; 715 + 716 + if (igc_ptp_systim_to_hwtstamp(adapter, &shhwtstamps, regval)) 717 + return; 718 + 719 + switch (adapter->link_speed) { 720 + case SPEED_10: 721 + adjust = IGC_I225_TX_LATENCY_10; 722 + break; 723 + case SPEED_100: 724 + adjust = IGC_I225_TX_LATENCY_100; 725 + break; 726 + case SPEED_1000: 727 + adjust = IGC_I225_TX_LATENCY_1000; 728 + break; 729 + case SPEED_2500: 730 + adjust = IGC_I225_TX_LATENCY_2500; 731 + break; 732 + } 733 + 734 + shhwtstamps.hwtstamp = 735 + ktime_add_ns(shhwtstamps.hwtstamp, adjust); 736 + 737 + tstamp->skb = NULL; 738 + 739 + skb_tstamp_tx(skb, &shhwtstamps); 740 + dev_kfree_skb_any(skb); 695 741 } 696 742 697 743 /** 698 744 * igc_ptp_tx_hwtstamp - utility function which checks for TX time stamp 699 745 * @adapter: Board private structure 700 746 * 701 - * If we were asked to do hardware stamping and such a time stamp is 702 - * available, then it must have been for this skb here because we only 703 - * allow only one such packet into the queue. 747 + * Check against the ready mask for which of the timestamp register 748 + * sets are ready to be retrieved, then retrieve that and notify the 749 + * rest of the stack. 704 750 * 705 751 * Context: Expects adapter->ptp_tx_lock to be held by caller. 706 752 */ 707 753 static void igc_ptp_tx_hwtstamp(struct igc_adapter *adapter) 708 754 { 709 - struct sk_buff *skb = adapter->ptp_tx_skb; 710 - struct skb_shared_hwtstamps shhwtstamps; 711 755 struct igc_hw *hw = &adapter->hw; 712 - u32 tsynctxctl; 713 - int adjust = 0; 714 756 u64 regval; 757 + u32 mask; 758 + int i; 715 759 716 - if (WARN_ON_ONCE(!skb)) 717 - return; 718 - 719 - tsynctxctl = rd32(IGC_TSYNCTXCTL); 720 - tsynctxctl &= IGC_TSYNCTXCTL_TXTT_0; 721 - if (tsynctxctl) { 760 + mask = rd32(IGC_TSYNCTXCTL) & IGC_TSYNCTXCTL_TXTT_ANY; 761 + if (mask & IGC_TSYNCTXCTL_TXTT_0) { 722 762 regval = rd32(IGC_TXSTMPL); 723 763 regval |= (u64)rd32(IGC_TXSTMPH) << 32; 724 764 } else { ··· 792 742 txstmpl_new = rd32(IGC_TXSTMPL); 793 743 794 744 if (txstmpl_old == txstmpl_new) 795 - return; 745 + goto done; 796 746 797 747 regval = txstmpl_new; 798 748 regval |= (u64)rd32(IGC_TXSTMPH) << 32; 799 749 } 800 - if (igc_ptp_systim_to_hwtstamp(adapter, &shhwtstamps, regval)) 801 - return; 802 750 803 - switch (adapter->link_speed) { 804 - case SPEED_10: 805 - adjust = IGC_I225_TX_LATENCY_10; 806 - break; 807 - case SPEED_100: 808 - adjust = IGC_I225_TX_LATENCY_100; 809 - break; 810 - case SPEED_1000: 811 - adjust = IGC_I225_TX_LATENCY_1000; 812 - break; 813 - case SPEED_2500: 814 - adjust = IGC_I225_TX_LATENCY_2500; 815 - break; 751 + igc_ptp_tx_reg_to_stamp(adapter, &adapter->tx_tstamp[0], regval); 752 + 753 + done: 754 + /* Now that the problematic first register was handled, we can 755 + * use retrieve the timestamps from the other registers 756 + * (starting from '1') with less complications. 757 + */ 758 + for (i = 1; i < IGC_MAX_TX_TSTAMP_REGS; i++) { 759 + struct igc_tx_timestamp_request *tstamp = &adapter->tx_tstamp[i]; 760 + 761 + if (!(tstamp->mask & mask)) 762 + continue; 763 + 764 + regval = rd32(tstamp->regl); 765 + regval |= (u64)rd32(tstamp->regh) << 32; 766 + 767 + igc_ptp_tx_reg_to_stamp(adapter, tstamp, regval); 816 768 } 817 - 818 - shhwtstamps.hwtstamp = 819 - ktime_add_ns(shhwtstamps.hwtstamp, adjust); 820 - 821 - adapter->ptp_tx_skb = NULL; 822 - 823 - /* Notify the stack and free the skb after we've unlocked */ 824 - skb_tstamp_tx(skb, &shhwtstamps); 825 - dev_kfree_skb_any(skb); 826 769 } 827 770 828 771 /** ··· 831 788 832 789 spin_lock_irqsave(&adapter->ptp_tx_lock, flags); 833 790 834 - if (!adapter->ptp_tx_skb) 835 - goto unlock; 836 - 837 791 igc_ptp_tx_hwtstamp(adapter); 838 792 839 - unlock: 840 793 spin_unlock_irqrestore(&adapter->ptp_tx_lock, flags); 841 794 } 842 795 ··· 1045 1006 void igc_ptp_init(struct igc_adapter *adapter) 1046 1007 { 1047 1008 struct net_device *netdev = adapter->netdev; 1009 + struct igc_tx_timestamp_request *tstamp; 1048 1010 struct igc_hw *hw = &adapter->hw; 1049 1011 int i; 1012 + 1013 + tstamp = &adapter->tx_tstamp[0]; 1014 + tstamp->mask = IGC_TSYNCTXCTL_TXTT_0; 1015 + tstamp->regl = IGC_TXSTMPL_0; 1016 + tstamp->regh = IGC_TXSTMPH_0; 1017 + tstamp->flags = 0; 1018 + 1019 + tstamp = &adapter->tx_tstamp[1]; 1020 + tstamp->mask = IGC_TSYNCTXCTL_TXTT_1; 1021 + tstamp->regl = IGC_TXSTMPL_1; 1022 + tstamp->regh = IGC_TXSTMPH_1; 1023 + tstamp->flags = IGC_TX_FLAGS_TSTAMP_1; 1024 + 1025 + tstamp = &adapter->tx_tstamp[2]; 1026 + tstamp->mask = IGC_TSYNCTXCTL_TXTT_2; 1027 + tstamp->regl = IGC_TXSTMPL_2; 1028 + tstamp->regh = IGC_TXSTMPH_2; 1029 + tstamp->flags = IGC_TX_FLAGS_TSTAMP_2; 1030 + 1031 + tstamp = &adapter->tx_tstamp[3]; 1032 + tstamp->mask = IGC_TSYNCTXCTL_TXTT_3; 1033 + tstamp->regl = IGC_TXSTMPL_3; 1034 + tstamp->regh = IGC_TXSTMPH_3; 1035 + tstamp->flags = IGC_TX_FLAGS_TSTAMP_3; 1050 1036 1051 1037 switch (hw->mac.type) { 1052 1038 case igc_i225:
+12
drivers/net/ethernet/intel/igc/igc_regs.h
··· 243 243 #define IGC_SYSTIMR 0x0B6F8 /* System time register Residue */ 244 244 #define IGC_TIMINCA 0x0B608 /* Increment attributes register - RW */ 245 245 246 + /* TX Timestamp Low */ 247 + #define IGC_TXSTMPL_0 0x0B618 248 + #define IGC_TXSTMPL_1 0x0B698 249 + #define IGC_TXSTMPL_2 0x0B6B8 250 + #define IGC_TXSTMPL_3 0x0B6D8 251 + 252 + /* TX Timestamp High */ 253 + #define IGC_TXSTMPH_0 0x0B61C 254 + #define IGC_TXSTMPH_1 0x0B69C 255 + #define IGC_TXSTMPH_2 0x0B6BC 256 + #define IGC_TXSTMPH_3 0x0B6DC 257 + 246 258 #define IGC_TXSTMPL 0x0B618 /* Tx timestamp value Low - RO */ 247 259 #define IGC_TXSTMPH 0x0B61C /* Tx timestamp value High - RO */ 248 260