Loading
+1 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ if NET_VENDOR_WANGXUN

config LIBWX
	tristate
	depends on PTP_1588_CLOCK_OPTIONAL
	select PAGE_POOL
	help
	Common library for Wangxun(R) Ethernet drivers.
+1 −1
Original line number Diff line number Diff line
@@ -4,4 +4,4 @@

obj-$(CONFIG_LIBWX) += libwx.o

libwx-objs := wx_hw.o wx_lib.o wx_ethtool.o
libwx-objs := wx_hw.o wx_lib.o wx_ethtool.o wx_ptp.o
+53 −0
Original line number Diff line number Diff line
@@ -41,6 +41,9 @@ static const struct wx_stats wx_gstrings_stats[] = {
	WX_STAT("rx_csum_offload_good_count", hw_csum_rx_good),
	WX_STAT("rx_csum_offload_errors", hw_csum_rx_error),
	WX_STAT("alloc_rx_buff_failed", alloc_rx_buff_failed),
	WX_STAT("tx_hwtstamp_timeouts", tx_hwtstamp_timeouts),
	WX_STAT("tx_hwtstamp_skipped", tx_hwtstamp_skipped),
	WX_STAT("rx_hwtstamp_cleared", rx_hwtstamp_cleared),
};

static const struct wx_stats wx_gstrings_fdir_stats[] = {
@@ -452,3 +455,53 @@ void wx_set_msglevel(struct net_device *netdev, u32 data)
	wx->msg_enable = data;
}
EXPORT_SYMBOL(wx_set_msglevel);

int wx_get_ts_info(struct net_device *dev,
		   struct kernel_ethtool_ts_info *info)
{
	struct wx *wx = netdev_priv(dev);

	info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
			   BIT(HWTSTAMP_FILTER_PTP_V1_L4_SYNC) |
			   BIT(HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) |
			   BIT(HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
			   BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT) |
			   BIT(HWTSTAMP_FILTER_PTP_V2_SYNC) |
			   BIT(HWTSTAMP_FILTER_PTP_V2_L2_SYNC) |
			   BIT(HWTSTAMP_FILTER_PTP_V2_L4_SYNC) |
			   BIT(HWTSTAMP_FILTER_PTP_V2_DELAY_REQ) |
			   BIT(HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ) |
			   BIT(HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ) |
			   BIT(HWTSTAMP_FILTER_PTP_V2_EVENT);

	info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
				SOF_TIMESTAMPING_TX_HARDWARE |
				SOF_TIMESTAMPING_RX_HARDWARE |
				SOF_TIMESTAMPING_RAW_HARDWARE;

	if (wx->ptp_clock)
		info->phc_index = ptp_clock_index(wx->ptp_clock);
	else
		info->phc_index = -1;

	info->tx_types = BIT(HWTSTAMP_TX_OFF) |
			 BIT(HWTSTAMP_TX_ON);

	return 0;
}
EXPORT_SYMBOL(wx_get_ts_info);

void wx_get_ptp_stats(struct net_device *dev,
		      struct ethtool_ts_stats *ts_stats)
{
	struct wx *wx = netdev_priv(dev);

	if (wx->ptp_clock) {
		ts_stats->pkts = wx->tx_hwtstamp_pkts;
		ts_stats->lost = wx->tx_hwtstamp_timeouts +
				 wx->tx_hwtstamp_skipped +
				 wx->rx_hwtstamp_cleared;
		ts_stats->err = wx->tx_hwtstamp_errors;
	}
}
EXPORT_SYMBOL(wx_get_ptp_stats);
+4 −0
Original line number Diff line number Diff line
@@ -40,4 +40,8 @@ int wx_set_channels(struct net_device *dev,
		    struct ethtool_channels *ch);
u32 wx_get_msglevel(struct net_device *netdev);
void wx_set_msglevel(struct net_device *netdev, u32 data);
int wx_get_ts_info(struct net_device *dev,
		   struct kernel_ethtool_ts_info *info);
void wx_get_ptp_stats(struct net_device *dev,
		      struct ethtool_ts_stats *ts_stats);
#endif /* _WX_ETHTOOL_H_ */
+19 −0
Original line number Diff line number Diff line
@@ -393,6 +393,25 @@ int wx_host_interface_command(struct wx *wx, u32 *buffer,
}
EXPORT_SYMBOL(wx_host_interface_command);

int wx_set_pps(struct wx *wx, bool enable, u64 nsec, u64 cycles)
{
	struct wx_hic_set_pps pps_cmd;

	pps_cmd.hdr.cmd = FW_PPS_SET_CMD;
	pps_cmd.hdr.buf_len = FW_PPS_SET_LEN;
	pps_cmd.hdr.cmd_or_resp.cmd_resv = FW_CEM_CMD_RESERVED;
	pps_cmd.lan_id = wx->bus.func;
	pps_cmd.enable = (u8)enable;
	pps_cmd.nsec = nsec;
	pps_cmd.cycles = cycles;
	pps_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;

	return wx_host_interface_command(wx, (u32 *)&pps_cmd,
					 sizeof(pps_cmd),
					 WX_HI_COMMAND_TIMEOUT,
					 false);
}

/**
 *  wx_read_ee_hostif_data - Read EEPROM word using a host interface cmd
 *  assuming that the semaphore is already obtained.
Loading