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

Configure Feed

Select the types of activity you want to include in your feed.

net: microchip: lan743x: improve throughput with rx timestamp config

Currently all RX frames are timestamped which results in a performance
penalty when timestamping is not needed. The default is now being
changed to not timestamp any Rx frames (HWTSTAMP_FILTER_NONE), but
support has been added to allow changing the desired RX timestamping
mode (HWTSTAMP_FILTER_ALL - which was the previous setting and
HWTSTAMP_FILTER_PTP_V2_EVENT are now supported) using
SIOCSHWTSTAMP. All settings were tested using the hwstamp_ctl application.
It is also noted that ptp4l, when started, preconfigures the device to
timestamp using HWTSTAMP_FILTER_PTP_V2_EVENT, so this driver continues
to work properly "out of the box".

Test setup: x64 PC with LAN7430 ---> x64 PC as partner

iperf3 with - Timestamp all incoming packets:
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-5.05 sec 517 MBytes 859 Mbits/sec 0 sender
[ 5] 0.00-5.00 sec 515 MBytes 864 Mbits/sec receiver

iperf Done.

iperf3 with - Timestamp only PTP packets:
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-5.04 sec 563 MBytes 937 Mbits/sec 0 sender
[ 5] 0.00-5.00 sec 561 MBytes 941 Mbits/sec receiver

Signed-off-by: Vishvambar Panth S <vishvambarpanth.s@microchip.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://lore.kernel.org/r/20231020185801.25649-1-vishvambarpanth.s@microchip.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Vishvambar Panth S and committed by
Paolo Abeni
169e0a5e efb3e0e1

+63 -2
+2 -1
drivers/net/ethernet/microchip/lan743x_ethtool.c
··· 1047 1047 BIT(HWTSTAMP_TX_ON) | 1048 1048 BIT(HWTSTAMP_TX_ONESTEP_SYNC); 1049 1049 ts_info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) | 1050 - BIT(HWTSTAMP_FILTER_ALL); 1050 + BIT(HWTSTAMP_FILTER_ALL) | 1051 + BIT(HWTSTAMP_FILTER_PTP_V2_EVENT); 1051 1052 return 0; 1052 1053 } 1053 1054
+44 -1
drivers/net/ethernet/microchip/lan743x_main.c
··· 1870 1870 return last_head - last_tail - 1; 1871 1871 } 1872 1872 1873 + static void lan743x_rx_cfg_b_tstamp_config(struct lan743x_adapter *adapter, 1874 + int rx_ts_config) 1875 + { 1876 + int channel_number; 1877 + int index; 1878 + u32 data; 1879 + 1880 + for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) { 1881 + channel_number = adapter->rx[index].channel_number; 1882 + data = lan743x_csr_read(adapter, RX_CFG_B(channel_number)); 1883 + data &= RX_CFG_B_TS_MASK_; 1884 + data |= rx_ts_config; 1885 + lan743x_csr_write(adapter, RX_CFG_B(channel_number), 1886 + data); 1887 + } 1888 + } 1889 + 1890 + int lan743x_rx_set_tstamp_mode(struct lan743x_adapter *adapter, 1891 + int rx_filter) 1892 + { 1893 + u32 data; 1894 + 1895 + switch (rx_filter) { 1896 + case HWTSTAMP_FILTER_PTP_V2_EVENT: 1897 + lan743x_rx_cfg_b_tstamp_config(adapter, 1898 + RX_CFG_B_TS_DESCR_EN_); 1899 + data = lan743x_csr_read(adapter, PTP_RX_TS_CFG); 1900 + data |= PTP_RX_TS_CFG_EVENT_MSGS_; 1901 + lan743x_csr_write(adapter, PTP_RX_TS_CFG, data); 1902 + break; 1903 + case HWTSTAMP_FILTER_NONE: 1904 + lan743x_rx_cfg_b_tstamp_config(adapter, 1905 + RX_CFG_B_TS_NONE_); 1906 + break; 1907 + case HWTSTAMP_FILTER_ALL: 1908 + lan743x_rx_cfg_b_tstamp_config(adapter, 1909 + RX_CFG_B_TS_ALL_RX_); 1910 + break; 1911 + default: 1912 + return -ERANGE; 1913 + } 1914 + return 0; 1915 + } 1916 + 1873 1917 void lan743x_tx_set_timestamping_mode(struct lan743x_tx *tx, 1874 1918 bool enable_timestamping, 1875 1919 bool enable_onestep_sync) ··· 2988 2944 data |= RX_CFG_B_RX_PAD_2_; 2989 2945 data &= ~RX_CFG_B_RX_RING_LEN_MASK_; 2990 2946 data |= ((rx->ring_size) & RX_CFG_B_RX_RING_LEN_MASK_); 2991 - data |= RX_CFG_B_TS_ALL_RX_; 2992 2947 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) 2993 2948 data |= RX_CFG_B_RDMABL_512_; 2994 2949
+8
drivers/net/ethernet/microchip/lan743x_main.h
··· 522 522 (((u32)(rx_latency)) & 0x0000FFFF) 523 523 #define PTP_CAP_INFO (0x0A60) 524 524 #define PTP_CAP_INFO_TX_TS_CNT_GET_(reg_val) (((reg_val) & 0x00000070) >> 4) 525 + #define PTP_RX_TS_CFG (0x0A68) 526 + #define PTP_RX_TS_CFG_EVENT_MSGS_ GENMASK(3, 0) 525 527 526 528 #define PTP_TX_MOD (0x0AA4) 527 529 #define PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_ (0x10000000) ··· 659 657 660 658 #define RX_CFG_B(channel) (0xC44 + ((channel) << 6)) 661 659 #define RX_CFG_B_TS_ALL_RX_ BIT(29) 660 + #define RX_CFG_B_TS_DESCR_EN_ BIT(28) 661 + #define RX_CFG_B_TS_NONE_ 0 662 + #define RX_CFG_B_TS_MASK_ (0xCFFFFFFF) 662 663 #define RX_CFG_B_RX_PAD_MASK_ (0x03000000) 663 664 #define RX_CFG_B_RX_PAD_0_ (0x00000000) 664 665 #define RX_CFG_B_RX_PAD_2_ (0x02000000) ··· 995 990 996 991 struct sk_buff *skb_head, *skb_tail; 997 992 }; 993 + 994 + int lan743x_rx_set_tstamp_mode(struct lan743x_adapter *adapter, 995 + int rx_filter); 998 996 999 997 /* SGMII Link Speed Duplex status */ 1000 998 enum lan743x_sgmii_lsd {
+9
drivers/net/ethernet/microchip/lan743x_ptp.c
··· 1493 1493 temp = lan743x_csr_read(adapter, PTP_TX_MOD2); 1494 1494 temp |= PTP_TX_MOD2_TX_PTP_CLR_UDPV4_CHKSUM_; 1495 1495 lan743x_csr_write(adapter, PTP_TX_MOD2, temp); 1496 + 1497 + /* Default Timestamping */ 1498 + lan743x_rx_set_tstamp_mode(adapter, HWTSTAMP_FILTER_NONE); 1499 + 1496 1500 lan743x_ptp_enable(adapter); 1497 1501 lan743x_csr_write(adapter, INT_EN_SET, INT_BIT_1588_); 1498 1502 lan743x_csr_write(adapter, PTP_INT_EN_SET, ··· 1657 1653 { 1658 1654 struct lan743x_ptp *ptp = &adapter->ptp; 1659 1655 1656 + /* Disable Timestamping */ 1657 + lan743x_rx_set_tstamp_mode(adapter, HWTSTAMP_FILTER_NONE); 1658 + 1660 1659 mutex_lock(&ptp->command_lock); 1661 1660 if (!lan743x_ptp_is_enabled(adapter)) { 1662 1661 netif_warn(adapter, drv, adapter->netdev, ··· 1791 1784 ret = -EINVAL; 1792 1785 break; 1793 1786 } 1787 + 1788 + ret = lan743x_rx_set_tstamp_mode(adapter, config.rx_filter); 1794 1789 1795 1790 if (!ret) 1796 1791 return copy_to_user(ifr->ifr_data, &config,