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:
committed by
Jakub Kicinski
parent
889e6af877
commit
89ae72f21b
@@ -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 = {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user