Commit 89ae72f2 authored by Vadim Fedorenko's avatar Vadim Fedorenko Committed by Jakub Kicinski
Browse files

qede: convert to use ndo_hwtstamp callbacks



The driver implemented SIOCSHWTSTAMP ioctl cmd only, but it stores
configuration in private structure, so it can be reported back to users.
Implement both ndo_hwtstamp_set and ndo_hwtstamp_set callbacks.
ndo_hwtstamp_set implements a check of unsupported 1-step timestamping
and qede_ptp_cfg_filters() becomes void as it cannot fail anymore.

Reviewed-by: default avatarKory Maincent <kory.maincent@bootlin.com>
Signed-off-by: default avatarVadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://patch.msgid.link/20251116094610.3932005-3-vadim.fedorenko@linux.dev


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 889e6af8
Loading
Loading
Loading
Loading
+2 −20
Original line number Diff line number Diff line
@@ -506,25 +506,6 @@ static int qede_set_vf_trust(struct net_device *dev, int vfidx, bool setting)
}
#endif

static int qede_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
	struct qede_dev *edev = netdev_priv(dev);

	if (!netif_running(dev))
		return -EAGAIN;

	switch (cmd) {
	case SIOCSHWTSTAMP:
		return qede_ptp_hw_ts(edev, ifr);
	default:
		DP_VERBOSE(edev, QED_MSG_DEBUG,
			   "default IOCTL cmd 0x%x\n", cmd);
		return -EOPNOTSUPP;
	}

	return 0;
}

static void qede_fp_sb_dump(struct qede_dev *edev, struct qede_fastpath *fp)
{
	char *p_sb = (char *)fp->sb_info->sb_virt;
@@ -717,7 +698,6 @@ static const struct net_device_ops qede_netdev_ops = {
	.ndo_set_mac_address	= qede_set_mac_addr,
	.ndo_validate_addr	= eth_validate_addr,
	.ndo_change_mtu		= qede_change_mtu,
	.ndo_eth_ioctl		= qede_ioctl,
	.ndo_tx_timeout		= qede_tx_timeout,
#ifdef CONFIG_QED_SRIOV
	.ndo_set_vf_mac		= qede_set_vf_mac,
@@ -742,6 +722,8 @@ static const struct net_device_ops qede_netdev_ops = {
#endif
	.ndo_xdp_xmit		= qede_xdp_transmit,
	.ndo_setup_tc		= qede_setup_tc_offload,
	.ndo_hwtstamp_get	= qede_hwtstamp_get,
	.ndo_hwtstamp_set	= qede_hwtstamp_set,
};

static const struct net_device_ops qede_netdev_vf_ops = {
+47 −29
Original line number Diff line number Diff line
@@ -199,18 +199,15 @@ static u64 qede_ptp_read_cc(struct cyclecounter *cc)
	return phc_cycles;
}

static int qede_ptp_cfg_filters(struct qede_dev *edev)
static void qede_ptp_cfg_filters(struct qede_dev *edev)
{
	enum qed_ptp_hwtstamp_tx_type tx_type = QED_PTP_HWTSTAMP_TX_ON;
	enum qed_ptp_filter_type rx_filter = QED_PTP_FILTER_NONE;
	struct qede_ptp *ptp = edev->ptp;

	if (!ptp)
		return -EIO;

	if (!ptp->hw_ts_ioctl_called) {
		DP_INFO(edev, "TS IOCTL not called\n");
		return 0;
		return;
	}

	switch (ptp->tx_type) {
@@ -223,11 +220,6 @@ static int qede_ptp_cfg_filters(struct qede_dev *edev)
		clear_bit(QEDE_FLAGS_TX_TIMESTAMPING_EN, &edev->flags);
		tx_type = QED_PTP_HWTSTAMP_TX_OFF;
		break;

	case HWTSTAMP_TX_ONESTEP_SYNC:
	case HWTSTAMP_TX_ONESTEP_P2P:
		DP_ERR(edev, "One-step timestamping is not supported\n");
		return -ERANGE;
	}

	spin_lock_bh(&ptp->lock);
@@ -286,39 +278,65 @@ static int qede_ptp_cfg_filters(struct qede_dev *edev)
	ptp->ops->cfg_filters(edev->cdev, rx_filter, tx_type);

	spin_unlock_bh(&ptp->lock);

	return 0;
}

int qede_ptp_hw_ts(struct qede_dev *edev, struct ifreq *ifr)
int qede_hwtstamp_set(struct net_device *netdev,
		      struct kernel_hwtstamp_config *config,
		      struct netlink_ext_ack *extack)
{
	struct hwtstamp_config config;
	struct qede_dev *edev = netdev_priv(netdev);
	struct qede_ptp *ptp;
	int rc;

	if (!netif_running(netdev)) {
		NL_SET_ERR_MSG_MOD(extack, "Device is down");
		return -EAGAIN;
	}

	ptp = edev->ptp;
	if (!ptp)
	if (!ptp) {
		NL_SET_ERR_MSG_MOD(extack, "HW timestamping is not supported");
		return -EIO;

	if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
		return -EFAULT;
	}

	DP_VERBOSE(edev, QED_MSG_DEBUG,
		   "HWTSTAMP IOCTL: Requested tx_type = %d, requested rx_filters = %d\n",
		   config.tx_type, config.rx_filter);
		   "HWTSTAMP SET: Requested tx_type = %d, requested rx_filters = %d\n",
		   config->tx_type, config->rx_filter);

	switch (config->tx_type) {
	case HWTSTAMP_TX_ON:
	case HWTSTAMP_TX_OFF:
		break;
	default:
		NL_SET_ERR_MSG_MOD(extack,
				   "One-step timestamping is not supported");
		return -ERANGE;
	}

	ptp->hw_ts_ioctl_called = 1;
	ptp->tx_type = config.tx_type;
	ptp->rx_filter = config.rx_filter;
	ptp->tx_type = config->tx_type;
	ptp->rx_filter = config->rx_filter;

	rc = qede_ptp_cfg_filters(edev);
	if (rc)
		return rc;
	qede_ptp_cfg_filters(edev);

	config->rx_filter = ptp->rx_filter;

	return 0;
}

	config.rx_filter = ptp->rx_filter;
int qede_hwtstamp_get(struct net_device *netdev,
		      struct kernel_hwtstamp_config *config)
{
	struct qede_dev *edev = netdev_priv(netdev);
	struct qede_ptp *ptp;

	return copy_to_user(ifr->ifr_data, &config,
			    sizeof(config)) ? -EFAULT : 0;
	ptp = edev->ptp;
	if (!ptp)
		return -EIO;

	config->tx_type = ptp->tx_type;
	config->rx_filter = ptp->rx_filter;

	return 0;
}

int qede_ptp_get_ts_info(struct qede_dev *edev, struct kernel_ethtool_ts_info *info)
+5 −1
Original line number Diff line number Diff line
@@ -14,7 +14,11 @@

void qede_ptp_rx_ts(struct qede_dev *edev, struct sk_buff *skb);
void qede_ptp_tx_ts(struct qede_dev *edev, struct sk_buff *skb);
int qede_ptp_hw_ts(struct qede_dev *edev, struct ifreq *req);
int qede_hwtstamp_get(struct net_device *netdev,
		      struct kernel_hwtstamp_config *config);
int qede_hwtstamp_set(struct net_device *netdev,
		      struct kernel_hwtstamp_config *config,
		      struct netlink_ext_ack *extack);
void qede_ptp_disable(struct qede_dev *edev);
int qede_ptp_enable(struct qede_dev *edev);
int qede_ptp_get_ts_info(struct qede_dev *edev, struct kernel_ethtool_ts_info *ts);