Commit 889e6af8 authored by Vadim Fedorenko's avatar Vadim Fedorenko Committed by Jakub Kicinski
Browse files

bnx2x: convert to use ndo_hwtstamp callbacks



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: default avatarKory Maincent <kory.maincent@bootlin.com>
Signed-off-by: default avatarVadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://patch.msgid.link/20251116094610.3932005-2-vadim.fedorenko@linux.dev


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent ef3b682a
Loading
Loading
Loading
Loading
+48 −22
Original line number Diff line number Diff line
@@ -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,15 +12816,10 @@ 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);
}
}

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 */