]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bnx2x: convert to use ndo_hwtstamp callbacks
authorVadim Fedorenko <vadim.fedorenko@linux.dev>
Sun, 16 Nov 2025 09:46:09 +0000 (09:46 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 18 Nov 2025 03:30:12 +0000 (19:30 -0800)
The driver implemented SIOCSHWTSTAMP ioctl command only, but at the same
time it has configuration stored in a private structure. Implement both
ndo_hwtstamp_set and ndo_hwtstamp_get callback using stored info.
ndo_hwtstamp_set callback implements a check for unsupported 1-step
timestamping. The same check is removed from bnx2x_configure_ptp_filters
function as it's not needed anymore. Another call site of
bnx2x_configure_ptp_filters has hwtstamp_ioctl_called guard.

Reviewed-by: Kory Maincent <kory.maincent@bootlin.com>
Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://patch.msgid.link/20251116094610.3932005-2-vadim.fedorenko@linux.dev
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c

index f0f05d7315ac48211de7089a55c789613269fb6b..aca4267babc87d65062a2797b7dbad59503a2b57 100644 (file)
@@ -308,8 +308,11 @@ static int bnx2x_set_storm_rx_mode(struct bnx2x *bp);
 /****************************************************************************
 * General service functions
 ****************************************************************************/
-
-static int bnx2x_hwtstamp_ioctl(struct bnx2x *bp, struct ifreq *ifr);
+static int bnx2x_hwtstamp_set(struct net_device *dev,
+                             struct kernel_hwtstamp_config *config,
+                             struct netlink_ext_ack *extack);
+static int bnx2x_hwtstamp_get(struct net_device *dev,
+                             struct kernel_hwtstamp_config *config);
 
 static void __storm_memset_dma_mapping(struct bnx2x *bp,
                                       u32 addr, dma_addr_t mapping)
@@ -12813,14 +12816,9 @@ static int bnx2x_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
        if (!netif_running(dev))
                return -EAGAIN;
 
-       switch (cmd) {
-       case SIOCSHWTSTAMP:
-               return bnx2x_hwtstamp_ioctl(bp, ifr);
-       default:
-               DP(NETIF_MSG_LINK, "ioctl: phy id 0x%x, reg 0x%x, val_in 0x%x\n",
-                  mdio->phy_id, mdio->reg_num, mdio->val_in);
-               return mdio_mii_ioctl(&bp->mdio, mdio, cmd);
-       }
+       DP(NETIF_MSG_LINK, "ioctl: phy id 0x%x, reg 0x%x, val_in 0x%x\n",
+          mdio->phy_id, mdio->reg_num, mdio->val_in);
+       return mdio_mii_ioctl(&bp->mdio, mdio, cmd);
 }
 
 static int bnx2x_validate_addr(struct net_device *dev)
@@ -13036,6 +13034,8 @@ static const struct net_device_ops bnx2x_netdev_ops = {
        .ndo_get_phys_port_id   = bnx2x_get_phys_port_id,
        .ndo_set_vf_link_state  = bnx2x_set_vf_link_state,
        .ndo_features_check     = bnx2x_features_check,
+       .ndo_hwtstamp_get       = bnx2x_hwtstamp_get,
+       .ndo_hwtstamp_set       = bnx2x_hwtstamp_set,
 };
 
 static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev,
@@ -15350,31 +15350,57 @@ int bnx2x_configure_ptp_filters(struct bnx2x *bp)
        return 0;
 }
 
-static int bnx2x_hwtstamp_ioctl(struct bnx2x *bp, struct ifreq *ifr)
+static int bnx2x_hwtstamp_set(struct net_device *dev,
+                             struct kernel_hwtstamp_config *config,
+                             struct netlink_ext_ack *extack)
 {
-       struct hwtstamp_config config;
+       struct bnx2x *bp = netdev_priv(dev);
        int rc;
 
-       DP(BNX2X_MSG_PTP, "HWTSTAMP IOCTL called\n");
+       DP(BNX2X_MSG_PTP, "HWTSTAMP SET called\n");
 
-       if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
-               return -EFAULT;
+       if (!netif_running(dev)) {
+               NL_SET_ERR_MSG_MOD(extack, "Device is down");
+               return -EAGAIN;
+       }
 
        DP(BNX2X_MSG_PTP, "Requested tx_type: %d, requested rx_filters = %d\n",
-          config.tx_type, config.rx_filter);
+          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;
+       }
 
        bp->hwtstamp_ioctl_called = true;
-       bp->tx_type = config.tx_type;
-       bp->rx_filter = config.rx_filter;
+       bp->tx_type = config->tx_type;
+       bp->rx_filter = config->rx_filter;
 
        rc = bnx2x_configure_ptp_filters(bp);
-       if (rc)
+       if (rc) {
+               NL_SET_ERR_MSG_MOD(extack, "HW configuration failure");
                return rc;
+       }
+
+       config->rx_filter = bp->rx_filter;
+
+       return 0;
+}
+
+static int bnx2x_hwtstamp_get(struct net_device *dev,
+                             struct kernel_hwtstamp_config *config)
+{
+       struct bnx2x *bp = netdev_priv(dev);
 
-       config.rx_filter = bp->rx_filter;
+       config->rx_filter = bp->rx_filter;
+       config->tx_type = bp->tx_type;
 
-       return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
-               -EFAULT : 0;
+       return 0;
 }
 
 /* Configures HW for PTP */