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: Kory Maincent <kory.maincent@bootlin.com>
Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://patch.msgid.link/20251116094610.3932005-3-vadim.fedorenko@linux.dev
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Vadim Fedorenko
2025-11-16 09:46:10 +00:00
committed by Jakub Kicinski
parent 889e6af877
commit 89ae72f21b
3 changed files with 56 additions and 52 deletions
+2 -20
View File
@@ -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 = {
+49 -31
View File
@@ -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);
}
int qede_hwtstamp_set(struct net_device *netdev,
struct kernel_hwtstamp_config *config,
struct netlink_ext_ack *extack)
{
struct qede_dev *edev = netdev_priv(netdev);
struct qede_ptp *ptp;
if (!netif_running(netdev)) {
NL_SET_ERR_MSG_MOD(extack, "Device is down");
return -EAGAIN;
}
ptp = edev->ptp;
if (!ptp) {
NL_SET_ERR_MSG_MOD(extack, "HW timestamping is not supported");
return -EIO;
}
DP_VERBOSE(edev, QED_MSG_DEBUG,
"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;
qede_ptp_cfg_filters(edev);
config->rx_filter = ptp->rx_filter;
return 0;
}
int qede_ptp_hw_ts(struct qede_dev *edev, struct ifreq *ifr)
int qede_hwtstamp_get(struct net_device *netdev,
struct kernel_hwtstamp_config *config)
{
struct hwtstamp_config config;
struct qede_dev *edev = netdev_priv(netdev);
struct qede_ptp *ptp;
int rc;
ptp = edev->ptp;
if (!ptp)
return -EIO;
if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
return -EFAULT;
config->tx_type = ptp->tx_type;
config->rx_filter = ptp->rx_filter;
DP_VERBOSE(edev, QED_MSG_DEBUG,
"HWTSTAMP IOCTL: Requested tx_type = %d, requested rx_filters = %d\n",
config.tx_type, config.rx_filter);
ptp->hw_ts_ioctl_called = 1;
ptp->tx_type = config.tx_type;
ptp->rx_filter = config.rx_filter;
rc = qede_ptp_cfg_filters(edev);
if (rc)
return rc;
config.rx_filter = ptp->rx_filter;
return copy_to_user(ifr->ifr_data, &config,
sizeof(config)) ? -EFAULT : 0;
return 0;
}
int qede_ptp_get_ts_info(struct qede_dev *edev, struct kernel_ethtool_ts_info *info)
+5 -1
View File
@@ -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);