mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
net: hns3: add hwtstamp_get/hwtstamp_set ops
And .ndo_hwtstamp_get()/.ndo_hwtstamp_set() callbacks to HNS3 framework to support HW timestamp configuration via netlink and adopt hns3pf to use .ndo_hwtstamp_get()/.ndo_hwtstamp_set() callbacks. Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Reviewed-by: Jijie Shao <shaojijie@huawei.com> Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev> Link: https://patch.msgid.link/20251023220457.3201122-7-vadim.fedorenko@linux.dev Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
87e1b590f7
commit
329021eeae
@@ -804,6 +804,11 @@ struct hnae3_ae_ops {
|
||||
int (*dbg_get_read_func)(struct hnae3_handle *handle,
|
||||
enum hnae3_dbg_cmd cmd,
|
||||
read_func *func);
|
||||
int (*hwtstamp_get)(struct hnae3_handle *handle,
|
||||
struct kernel_hwtstamp_config *config);
|
||||
int (*hwtstamp_set)(struct hnae3_handle *handle,
|
||||
struct kernel_hwtstamp_config *config,
|
||||
struct netlink_ext_ack *extack);
|
||||
};
|
||||
|
||||
struct hnae3_dcb_ops {
|
||||
|
||||
@@ -2419,6 +2419,35 @@ static int hns3_nic_do_ioctl(struct net_device *netdev,
|
||||
return h->ae_algo->ops->do_ioctl(h, ifr, cmd);
|
||||
}
|
||||
|
||||
static int hns3_nic_hwtstamp_get(struct net_device *netdev,
|
||||
struct kernel_hwtstamp_config *config)
|
||||
{
|
||||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
|
||||
if (!netif_running(netdev))
|
||||
return -EINVAL;
|
||||
|
||||
if (!h->ae_algo->ops->hwtstamp_get)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return h->ae_algo->ops->hwtstamp_get(h, config);
|
||||
}
|
||||
|
||||
static int hns3_nic_hwtstamp_set(struct net_device *netdev,
|
||||
struct kernel_hwtstamp_config *config,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
|
||||
if (!netif_running(netdev))
|
||||
return -EINVAL;
|
||||
|
||||
if (!h->ae_algo->ops->hwtstamp_set)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return h->ae_algo->ops->hwtstamp_set(h, config, extack);
|
||||
}
|
||||
|
||||
static int hns3_nic_set_features(struct net_device *netdev,
|
||||
netdev_features_t features)
|
||||
{
|
||||
@@ -3048,6 +3077,8 @@ static const struct net_device_ops hns3_nic_netdev_ops = {
|
||||
.ndo_set_vf_rate = hns3_nic_set_vf_rate,
|
||||
.ndo_set_vf_mac = hns3_nic_set_vf_mac,
|
||||
.ndo_select_queue = hns3_nic_select_queue,
|
||||
.ndo_hwtstamp_get = hns3_nic_hwtstamp_get,
|
||||
.ndo_hwtstamp_set = hns3_nic_hwtstamp_set,
|
||||
};
|
||||
|
||||
bool hns3_is_phys_func(struct pci_dev *pdev)
|
||||
|
||||
@@ -9445,15 +9445,8 @@ static int hclge_do_ioctl(struct hnae3_handle *handle, struct ifreq *ifr,
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCGHWTSTAMP:
|
||||
return hclge_ptp_get_cfg(hdev, ifr);
|
||||
case SIOCSHWTSTAMP:
|
||||
return hclge_ptp_set_cfg(hdev, ifr);
|
||||
default:
|
||||
if (!hdev->hw.mac.phydev)
|
||||
return hclge_mii_ioctl(hdev, ifr, cmd);
|
||||
}
|
||||
if (!hdev->hw.mac.phydev)
|
||||
return hclge_mii_ioctl(hdev, ifr, cmd);
|
||||
|
||||
return phy_mii_ioctl(hdev->hw.mac.phydev, ifr, cmd);
|
||||
}
|
||||
@@ -12901,6 +12894,8 @@ static const struct hnae3_ae_ops hclge_ops = {
|
||||
.get_dscp_prio = hclge_get_dscp_prio,
|
||||
.get_wol = hclge_get_wol,
|
||||
.set_wol = hclge_set_wol,
|
||||
.hwtstamp_get = hclge_ptp_get_cfg,
|
||||
.hwtstamp_set = hclge_ptp_set_cfg,
|
||||
};
|
||||
|
||||
static struct hnae3_ae_algo ae_algo = {
|
||||
|
||||
@@ -204,13 +204,17 @@ static int hclge_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hclge_ptp_get_cfg(struct hclge_dev *hdev, struct ifreq *ifr)
|
||||
int hclge_ptp_get_cfg(struct hnae3_handle *handle,
|
||||
struct kernel_hwtstamp_config *config)
|
||||
{
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
|
||||
if (!test_bit(HCLGE_STATE_PTP_EN, &hdev->state))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return copy_to_user(ifr->ifr_data, &hdev->ptp->ts_cfg,
|
||||
sizeof(struct hwtstamp_config)) ? -EFAULT : 0;
|
||||
*config = hdev->ptp->ts_cfg;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hclge_ptp_int_en(struct hclge_dev *hdev, bool en)
|
||||
@@ -269,7 +273,7 @@ static int hclge_ptp_cfg(struct hclge_dev *hdev, u32 cfg)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int hclge_ptp_set_tx_mode(struct hwtstamp_config *cfg,
|
||||
static int hclge_ptp_set_tx_mode(struct kernel_hwtstamp_config *cfg,
|
||||
unsigned long *flags, u32 *ptp_cfg)
|
||||
{
|
||||
switch (cfg->tx_type) {
|
||||
@@ -287,7 +291,7 @@ static int hclge_ptp_set_tx_mode(struct hwtstamp_config *cfg,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hclge_ptp_set_rx_mode(struct hwtstamp_config *cfg,
|
||||
static int hclge_ptp_set_rx_mode(struct kernel_hwtstamp_config *cfg,
|
||||
unsigned long *flags, u32 *ptp_cfg)
|
||||
{
|
||||
int rx_filter = cfg->rx_filter;
|
||||
@@ -332,7 +336,7 @@ static int hclge_ptp_set_rx_mode(struct hwtstamp_config *cfg,
|
||||
}
|
||||
|
||||
static int hclge_ptp_set_ts_mode(struct hclge_dev *hdev,
|
||||
struct hwtstamp_config *cfg)
|
||||
struct kernel_hwtstamp_config *cfg)
|
||||
{
|
||||
unsigned long flags = hdev->ptp->flags;
|
||||
u32 ptp_cfg = 0;
|
||||
@@ -359,9 +363,12 @@ static int hclge_ptp_set_ts_mode(struct hclge_dev *hdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hclge_ptp_set_cfg(struct hclge_dev *hdev, struct ifreq *ifr)
|
||||
int hclge_ptp_set_cfg(struct hnae3_handle *handle,
|
||||
struct kernel_hwtstamp_config *config,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct hwtstamp_config cfg;
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
int ret;
|
||||
|
||||
if (!test_bit(HCLGE_STATE_PTP_EN, &hdev->state)) {
|
||||
@@ -369,16 +376,13 @@ int hclge_ptp_set_cfg(struct hclge_dev *hdev, struct ifreq *ifr)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
|
||||
return -EFAULT;
|
||||
|
||||
ret = hclge_ptp_set_ts_mode(hdev, &cfg);
|
||||
ret = hclge_ptp_set_ts_mode(hdev, config);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
hdev->ptp->ts_cfg = cfg;
|
||||
hdev->ptp->ts_cfg = *config;
|
||||
|
||||
return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hclge_ptp_get_ts_info(struct hnae3_handle *handle,
|
||||
|
||||
@@ -62,7 +62,7 @@ struct hclge_ptp {
|
||||
unsigned long flags;
|
||||
void __iomem *io_base;
|
||||
struct ptp_clock_info info;
|
||||
struct hwtstamp_config ts_cfg;
|
||||
struct kernel_hwtstamp_config ts_cfg;
|
||||
spinlock_t lock; /* protects ptp registers */
|
||||
u32 ptp_cfg;
|
||||
u32 last_tx_seqid;
|
||||
@@ -133,8 +133,11 @@ bool hclge_ptp_set_tx_info(struct hnae3_handle *handle, struct sk_buff *skb);
|
||||
void hclge_ptp_clean_tx_hwts(struct hclge_dev *hdev);
|
||||
void hclge_ptp_get_rx_hwts(struct hnae3_handle *handle, struct sk_buff *skb,
|
||||
u32 nsec, u32 sec);
|
||||
int hclge_ptp_get_cfg(struct hclge_dev *hdev, struct ifreq *ifr);
|
||||
int hclge_ptp_set_cfg(struct hclge_dev *hdev, struct ifreq *ifr);
|
||||
int hclge_ptp_get_cfg(struct hnae3_handle *handle,
|
||||
struct kernel_hwtstamp_config *config);
|
||||
int hclge_ptp_set_cfg(struct hnae3_handle *handle,
|
||||
struct kernel_hwtstamp_config *config,
|
||||
struct netlink_ext_ack *extack);
|
||||
int hclge_ptp_init(struct hclge_dev *hdev);
|
||||
void hclge_ptp_uninit(struct hclge_dev *hdev);
|
||||
int hclge_ptp_get_ts_info(struct hnae3_handle *handle,
|
||||
|
||||
Reference in New Issue
Block a user