Commit 34fe804e authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'sparx5-ptp'



Horatiu Vultur says:

====================
net: sparx5: Add PTP Hardware Clock support

Add support for PTP Hardware Clock (PHC) for sparx5.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a972711d 608111fc
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -53,12 +53,14 @@ properties:
    items:
      - description: register based extraction
      - description: frame dma based extraction
      - description: ptp interrupt

  interrupt-names:
    minItems: 1
    items:
      - const: xtr
      - const: fdma
      - const: ptp

  resets:
    items:
+3 −2
Original line number Diff line number Diff line
@@ -471,9 +471,10 @@
				<0x6 0x10004000 0x7fc000>,
				<0x6 0x11010000 0xaf0000>;
			reg-names = "cpu", "dev", "gcb";
			interrupt-names = "xtr", "fdma";
			interrupt-names = "xtr", "fdma", "ptp";
			interrupts =	<GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
					<GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
					<GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
					<GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
			resets = <&reset 0>;
			reset-names = "switch";
		};
+2 −1
Original line number Diff line number Diff line
@@ -7,4 +7,5 @@ obj-$(CONFIG_SPARX5_SWITCH) += sparx5-switch.o

sparx5-switch-objs  := sparx5_main.o sparx5_packet.o \
 sparx5_netdev.o sparx5_phylink.o sparx5_port.o sparx5_mactable.o sparx5_vlan.o \
 sparx5_switchdev.o sparx5_calendar.o sparx5_ethtool.o sparx5_fdma.o
 sparx5_switchdev.o sparx5_calendar.o sparx5_ethtool.o sparx5_fdma.o \
 sparx5_ptp.o
+34 −0
Original line number Diff line number Diff line
@@ -1183,6 +1183,39 @@ static void sparx5_config_port_stats(struct sparx5 *sparx5, int portno)
		 sparx5, ANA_AC_PORT_STAT_CFG(portno, SPX5_PORT_POLICER_DROPS));
}

static int sparx5_get_ts_info(struct net_device *dev,
			      struct ethtool_ts_info *info)
{
	struct sparx5_port *port = netdev_priv(dev);
	struct sparx5 *sparx5 = port->sparx5;
	struct sparx5_phc *phc;

	if (!sparx5->ptp)
		return ethtool_op_get_ts_info(dev, info);

	phc = &sparx5->phc[SPARX5_PHC_PORT];

	info->phc_index = phc->clock ? ptp_clock_index(phc->clock) : -1;
	if (info->phc_index == -1) {
		info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE |
					 SOF_TIMESTAMPING_RX_SOFTWARE |
					 SOF_TIMESTAMPING_SOFTWARE;
		return 0;
	}
	info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE |
				 SOF_TIMESTAMPING_RX_SOFTWARE |
				 SOF_TIMESTAMPING_SOFTWARE |
				 SOF_TIMESTAMPING_TX_HARDWARE |
				 SOF_TIMESTAMPING_RX_HARDWARE |
				 SOF_TIMESTAMPING_RAW_HARDWARE;
	info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON) |
			 BIT(HWTSTAMP_TX_ONESTEP_SYNC);
	info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
			   BIT(HWTSTAMP_FILTER_ALL);

	return 0;
}

const struct ethtool_ops sparx5_ethtool_ops = {
	.get_sset_count         = sparx5_get_sset_count,
	.get_strings            = sparx5_get_sset_strings,
@@ -1194,6 +1227,7 @@ const struct ethtool_ops sparx5_ethtool_ops = {
	.get_eth_mac_stats      = sparx5_get_eth_mac_stats,
	.get_eth_ctrl_stats     = sparx5_get_eth_mac_ctrl_stats,
	.get_rmon_stats         = sparx5_get_eth_rmon_stats,
	.get_ts_info            = sparx5_get_ts_info,
};

int sparx_stats_init(struct sparx5 *sparx5)
+2 −0
Original line number Diff line number Diff line
@@ -240,6 +240,8 @@ static bool sparx5_fdma_rx_get_frame(struct sparx5 *sparx5, struct sparx5_rx *rx
	skb_pull(skb, IFH_LEN * sizeof(u32));
	if (likely(!(skb->dev->features & NETIF_F_RXFCS)))
		skb_trim(skb, skb->len - ETH_FCS_LEN);

	sparx5_ptp_rxtstamp(sparx5, skb, fi.timestamp);
	skb->protocol = eth_type_trans(skb, skb->dev);
	/* Everything we see on an interface that is in the HW bridge
	 * has already been forwarded
Loading