Commit e2bd9c76 authored by Jacob Keller's avatar Jacob Keller Committed by David S. Miller

ptp: convert remaining drivers to adjfine interface

Convert all remaining drivers that still use .adjfreq to the newer .adjfine
implementation. These drivers are not straightforward, as they use
non-standard methods of programming their hardware. They are all converted
to use scaled_ppm_to_ppb to get the parts per billion value that their
logic depends on.
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Cc: Ariel Elior <aelior@marvell.com>
Cc: Sudarsana Kalluru <skalluru@marvell.com>
Cc: Manish Chopra <manishc@marvell.com>
Cc: Derek Chickles <dchickles@marvell.com>
Cc: Satanand Burla <sburla@marvell.com>
Cc: Felix Manlunas <fmanlunas@marvell.com>
Cc: Raju Rangoju <rajur@chelsio.com>
Cc: Joakim Zhang <qiangqing.zhang@nxp.com>
Cc: Edward Cree <ecree.xilinx@gmail.com>
Cc: Martin Habets <habetsm.xilinx@gmail.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a29c132f
...@@ -13671,19 +13671,20 @@ static int bnx2x_send_update_drift_ramrod(struct bnx2x *bp, int drift_dir, ...@@ -13671,19 +13671,20 @@ static int bnx2x_send_update_drift_ramrod(struct bnx2x *bp, int drift_dir,
return bnx2x_func_state_change(bp, &func_params); return bnx2x_func_state_change(bp, &func_params);
} }
static int bnx2x_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) static int bnx2x_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
{ {
struct bnx2x *bp = container_of(ptp, struct bnx2x, ptp_clock_info); struct bnx2x *bp = container_of(ptp, struct bnx2x, ptp_clock_info);
int rc; int rc;
int drift_dir = 1; int drift_dir = 1;
int val, period, period1, period2, dif, dif1, dif2; int val, period, period1, period2, dif, dif1, dif2;
int best_dif = BNX2X_MAX_PHC_DRIFT, best_period = 0, best_val = 0; int best_dif = BNX2X_MAX_PHC_DRIFT, best_period = 0, best_val = 0;
s32 ppb = scaled_ppm_to_ppb(scaled_ppm);
DP(BNX2X_MSG_PTP, "PTP adjfreq called, ppb = %d\n", ppb); DP(BNX2X_MSG_PTP, "PTP adjfine called, ppb = %d\n", ppb);
if (!netif_running(bp->dev)) { if (!netif_running(bp->dev)) {
DP(BNX2X_MSG_PTP, DP(BNX2X_MSG_PTP,
"PTP adjfreq called while the interface is down\n"); "PTP adjfine called while the interface is down\n");
return -ENETDOWN; return -ENETDOWN;
} }
...@@ -13818,7 +13819,7 @@ void bnx2x_register_phc(struct bnx2x *bp) ...@@ -13818,7 +13819,7 @@ void bnx2x_register_phc(struct bnx2x *bp)
bp->ptp_clock_info.n_ext_ts = 0; bp->ptp_clock_info.n_ext_ts = 0;
bp->ptp_clock_info.n_per_out = 0; bp->ptp_clock_info.n_per_out = 0;
bp->ptp_clock_info.pps = 0; bp->ptp_clock_info.pps = 0;
bp->ptp_clock_info.adjfreq = bnx2x_ptp_adjfreq; bp->ptp_clock_info.adjfine = bnx2x_ptp_adjfine;
bp->ptp_clock_info.adjtime = bnx2x_ptp_adjtime; bp->ptp_clock_info.adjtime = bnx2x_ptp_adjtime;
bp->ptp_clock_info.gettime64 = bnx2x_ptp_gettime; bp->ptp_clock_info.gettime64 = bnx2x_ptp_gettime;
bp->ptp_clock_info.settime64 = bnx2x_ptp_settime; bp->ptp_clock_info.settime64 = bnx2x_ptp_settime;
......
...@@ -1512,14 +1512,17 @@ static void free_netsgbuf_with_resp(void *buf) ...@@ -1512,14 +1512,17 @@ static void free_netsgbuf_with_resp(void *buf)
} }
/** /**
* liquidio_ptp_adjfreq - Adjust ptp frequency * liquidio_ptp_adjfine - Adjust ptp frequency
* @ptp: PTP clock info * @ptp: PTP clock info
* @ppb: how much to adjust by, in parts-per-billion * @scaled_ppm: how much to adjust by, in scaled parts-per-million
*
* Scaled parts per million is ppm with a 16-bit binary fractional field.
*/ */
static int liquidio_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) static int liquidio_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
{ {
struct lio *lio = container_of(ptp, struct lio, ptp_info); struct lio *lio = container_of(ptp, struct lio, ptp_info);
struct octeon_device *oct = (struct octeon_device *)lio->oct_dev; struct octeon_device *oct = (struct octeon_device *)lio->oct_dev;
s32 ppb = scaled_ppm_to_ppb(scaled_ppm);
u64 comp, delta; u64 comp, delta;
unsigned long flags; unsigned long flags;
bool neg_adj = false; bool neg_adj = false;
...@@ -1643,7 +1646,7 @@ static void oct_ptp_open(struct net_device *netdev) ...@@ -1643,7 +1646,7 @@ static void oct_ptp_open(struct net_device *netdev)
lio->ptp_info.n_ext_ts = 0; lio->ptp_info.n_ext_ts = 0;
lio->ptp_info.n_per_out = 0; lio->ptp_info.n_per_out = 0;
lio->ptp_info.pps = 0; lio->ptp_info.pps = 0;
lio->ptp_info.adjfreq = liquidio_ptp_adjfreq; lio->ptp_info.adjfine = liquidio_ptp_adjfine;
lio->ptp_info.adjtime = liquidio_ptp_adjtime; lio->ptp_info.adjtime = liquidio_ptp_adjtime;
lio->ptp_info.gettime64 = liquidio_ptp_gettime; lio->ptp_info.gettime64 = liquidio_ptp_gettime;
lio->ptp_info.settime64 = liquidio_ptp_settime; lio->ptp_info.settime64 = liquidio_ptp_settime;
......
...@@ -194,17 +194,20 @@ int cxgb4_ptp_redirect_rx_packet(struct adapter *adapter, struct port_info *pi) ...@@ -194,17 +194,20 @@ int cxgb4_ptp_redirect_rx_packet(struct adapter *adapter, struct port_info *pi)
} }
/** /**
* cxgb4_ptp_adjfreq - Adjust frequency of PHC cycle counter * cxgb4_ptp_adjfine - Adjust frequency of PHC cycle counter
* @ptp: ptp clock structure * @ptp: ptp clock structure
* @ppb: Desired frequency change in parts per billion * @scaled_ppm: Desired frequency in scaled parts per billion
* *
* Adjust the frequency of the PHC cycle counter by the indicated ppb from * Adjust the frequency of the PHC cycle counter by the indicated amount from
* the base frequency. * the base frequency.
*
* Scaled parts per million is ppm with a 16-bit binary fractional field.
*/ */
static int cxgb4_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) static int cxgb4_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
{ {
struct adapter *adapter = (struct adapter *)container_of(ptp, struct adapter *adapter = (struct adapter *)container_of(ptp,
struct adapter, ptp_clock_info); struct adapter, ptp_clock_info);
s32 ppb = scaled_ppm_to_ppb(scaled_ppm);
struct fw_ptp_cmd c; struct fw_ptp_cmd c;
int err; int err;
...@@ -404,7 +407,7 @@ static const struct ptp_clock_info cxgb4_ptp_clock_info = { ...@@ -404,7 +407,7 @@ static const struct ptp_clock_info cxgb4_ptp_clock_info = {
.n_ext_ts = 0, .n_ext_ts = 0,
.n_per_out = 0, .n_per_out = 0,
.pps = 0, .pps = 0,
.adjfreq = cxgb4_ptp_adjfreq, .adjfine = cxgb4_ptp_adjfine,
.adjtime = cxgb4_ptp_adjtime, .adjtime = cxgb4_ptp_adjtime,
.gettime64 = cxgb4_ptp_gettime, .gettime64 = cxgb4_ptp_gettime,
.settime64 = cxgb4_ptp_settime, .settime64 = cxgb4_ptp_settime,
......
...@@ -338,18 +338,21 @@ void fec_ptp_start_cyclecounter(struct net_device *ndev) ...@@ -338,18 +338,21 @@ void fec_ptp_start_cyclecounter(struct net_device *ndev)
} }
/** /**
* fec_ptp_adjfreq - adjust ptp cycle frequency * fec_ptp_adjfine - adjust ptp cycle frequency
* @ptp: the ptp clock structure * @ptp: the ptp clock structure
* @ppb: parts per billion adjustment from base * @scaled_ppm: scaled parts per million adjustment from base
* *
* Adjust the frequency of the ptp cycle counter by the * Adjust the frequency of the ptp cycle counter by the
* indicated ppb from the base frequency. * indicated amount from the base frequency.
*
* Scaled parts per million is ppm with a 16-bit binary fractional field.
* *
* Because ENET hardware frequency adjust is complex, * Because ENET hardware frequency adjust is complex,
* using software method to do that. * using software method to do that.
*/ */
static int fec_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) static int fec_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
{ {
s32 ppb = scaled_ppm_to_ppb(scaled_ppm);
unsigned long flags; unsigned long flags;
int neg_adj = 0; int neg_adj = 0;
u32 i, tmp; u32 i, tmp;
...@@ -742,7 +745,7 @@ void fec_ptp_init(struct platform_device *pdev, int irq_idx) ...@@ -742,7 +745,7 @@ void fec_ptp_init(struct platform_device *pdev, int irq_idx)
fep->ptp_caps.n_per_out = 1; fep->ptp_caps.n_per_out = 1;
fep->ptp_caps.n_pins = 0; fep->ptp_caps.n_pins = 0;
fep->ptp_caps.pps = 1; fep->ptp_caps.pps = 1;
fep->ptp_caps.adjfreq = fec_ptp_adjfreq; fep->ptp_caps.adjfine = fec_ptp_adjfine;
fep->ptp_caps.adjtime = fec_ptp_adjtime; fep->ptp_caps.adjtime = fec_ptp_adjtime;
fep->ptp_caps.gettime64 = fec_ptp_gettime; fep->ptp_caps.gettime64 = fec_ptp_gettime;
fep->ptp_caps.settime64 = fec_ptp_settime; fep->ptp_caps.settime64 = fec_ptp_settime;
......
...@@ -28,16 +28,19 @@ struct qede_ptp { ...@@ -28,16 +28,19 @@ struct qede_ptp {
}; };
/** /**
* qede_ptp_adjfreq() - Adjust the frequency of the PTP cycle counter. * qede_ptp_adjfine() - Adjust the frequency of the PTP cycle counter.
* *
* @info: The PTP clock info structure. * @info: The PTP clock info structure.
* @ppb: Parts per billion adjustment from base. * @scaled_ppm: Scaled parts per million adjustment from base.
*
* Scaled parts per million is ppm with a 16-bit binary fractional field.
* *
* Return: Zero on success, negative errno otherwise. * Return: Zero on success, negative errno otherwise.
*/ */
static int qede_ptp_adjfreq(struct ptp_clock_info *info, s32 ppb) static int qede_ptp_adjfine(struct ptp_clock_info *info, long scaled_ppm)
{ {
struct qede_ptp *ptp = container_of(info, struct qede_ptp, clock_info); struct qede_ptp *ptp = container_of(info, struct qede_ptp, clock_info);
s32 ppb = scaled_ppm_to_ppb(scaled_ppm);
struct qede_dev *edev = ptp->edev; struct qede_dev *edev = ptp->edev;
int rc; int rc;
...@@ -47,7 +50,7 @@ static int qede_ptp_adjfreq(struct ptp_clock_info *info, s32 ppb) ...@@ -47,7 +50,7 @@ static int qede_ptp_adjfreq(struct ptp_clock_info *info, s32 ppb)
rc = ptp->ops->adjfreq(edev->cdev, ppb); rc = ptp->ops->adjfreq(edev->cdev, ppb);
spin_unlock_bh(&ptp->lock); spin_unlock_bh(&ptp->lock);
} else { } else {
DP_ERR(edev, "PTP adjfreq called while interface is down\n"); DP_ERR(edev, "PTP adjfine called while interface is down\n");
rc = -EFAULT; rc = -EFAULT;
} }
__qede_unlock(edev); __qede_unlock(edev);
...@@ -462,7 +465,7 @@ int qede_ptp_enable(struct qede_dev *edev) ...@@ -462,7 +465,7 @@ int qede_ptp_enable(struct qede_dev *edev)
ptp->clock_info.n_ext_ts = 0; ptp->clock_info.n_ext_ts = 0;
ptp->clock_info.n_per_out = 0; ptp->clock_info.n_per_out = 0;
ptp->clock_info.pps = 0; ptp->clock_info.pps = 0;
ptp->clock_info.adjfreq = qede_ptp_adjfreq; ptp->clock_info.adjfine = qede_ptp_adjfine;
ptp->clock_info.adjtime = qede_ptp_adjtime; ptp->clock_info.adjtime = qede_ptp_adjtime;
ptp->clock_info.gettime64 = qede_ptp_gettime; ptp->clock_info.gettime64 = qede_ptp_gettime;
ptp->clock_info.settime64 = qede_ptp_settime; ptp->clock_info.settime64 = qede_ptp_settime;
......
...@@ -351,7 +351,7 @@ struct efx_ptp_data { ...@@ -351,7 +351,7 @@ struct efx_ptp_data {
void (*xmit_skb)(struct efx_nic *efx, struct sk_buff *skb); void (*xmit_skb)(struct efx_nic *efx, struct sk_buff *skb);
}; };
static int efx_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta); static int efx_phc_adjfine(struct ptp_clock_info *ptp, long scaled_ppm);
static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta); static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta);
static int efx_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts); static int efx_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts);
static int efx_phc_settime(struct ptp_clock_info *ptp, static int efx_phc_settime(struct ptp_clock_info *ptp,
...@@ -1508,7 +1508,7 @@ static const struct ptp_clock_info efx_phc_clock_info = { ...@@ -1508,7 +1508,7 @@ static const struct ptp_clock_info efx_phc_clock_info = {
.n_per_out = 0, .n_per_out = 0,
.n_pins = 0, .n_pins = 0,
.pps = 1, .pps = 1,
.adjfreq = efx_phc_adjfreq, .adjfine = efx_phc_adjfine,
.adjtime = efx_phc_adjtime, .adjtime = efx_phc_adjtime,
.gettime64 = efx_phc_gettime, .gettime64 = efx_phc_gettime,
.settime64 = efx_phc_settime, .settime64 = efx_phc_settime,
...@@ -2137,11 +2137,12 @@ void __efx_rx_skb_attach_timestamp(struct efx_channel *channel, ...@@ -2137,11 +2137,12 @@ void __efx_rx_skb_attach_timestamp(struct efx_channel *channel,
ptp->ts_corrections.general_rx); ptp->ts_corrections.general_rx);
} }
static int efx_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta) static int efx_phc_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
{ {
struct efx_ptp_data *ptp_data = container_of(ptp, struct efx_ptp_data *ptp_data = container_of(ptp,
struct efx_ptp_data, struct efx_ptp_data,
phc_clock_info); phc_clock_info);
s32 delta = scaled_ppm_to_ppb(scaled_ppm);
struct efx_nic *efx = ptp_data->efx; struct efx_nic *efx = ptp_data->efx;
MCDI_DECLARE_BUF(inadj, MC_CMD_PTP_IN_ADJUST_LEN); MCDI_DECLARE_BUF(inadj, MC_CMD_PTP_IN_ADJUST_LEN);
s64 adjustment_ns; s64 adjustment_ns;
......
...@@ -347,7 +347,7 @@ struct efx_ptp_data { ...@@ -347,7 +347,7 @@ struct efx_ptp_data {
void (*xmit_skb)(struct efx_nic *efx, struct sk_buff *skb); void (*xmit_skb)(struct efx_nic *efx, struct sk_buff *skb);
}; };
static int efx_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta); static int efx_phc_adjfine(struct ptp_clock_info *ptp, long scaled_ppm);
static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta); static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta);
static int efx_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts); static int efx_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts);
static int efx_phc_settime(struct ptp_clock_info *ptp, static int efx_phc_settime(struct ptp_clock_info *ptp,
...@@ -1429,7 +1429,7 @@ static const struct ptp_clock_info efx_phc_clock_info = { ...@@ -1429,7 +1429,7 @@ static const struct ptp_clock_info efx_phc_clock_info = {
.n_per_out = 0, .n_per_out = 0,
.n_pins = 0, .n_pins = 0,
.pps = 1, .pps = 1,
.adjfreq = efx_phc_adjfreq, .adjfine = efx_phc_adjfine,
.adjtime = efx_phc_adjtime, .adjtime = efx_phc_adjtime,
.gettime64 = efx_phc_gettime, .gettime64 = efx_phc_gettime,
.settime64 = efx_phc_settime, .settime64 = efx_phc_settime,
...@@ -2044,11 +2044,12 @@ void __efx_siena_rx_skb_attach_timestamp(struct efx_channel *channel, ...@@ -2044,11 +2044,12 @@ void __efx_siena_rx_skb_attach_timestamp(struct efx_channel *channel,
ptp->ts_corrections.general_rx); ptp->ts_corrections.general_rx);
} }
static int efx_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta) static int efx_phc_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
{ {
struct efx_ptp_data *ptp_data = container_of(ptp, struct efx_ptp_data *ptp_data = container_of(ptp,
struct efx_ptp_data, struct efx_ptp_data,
phc_clock_info); phc_clock_info);
s32 delta = scaled_ppm_to_ppb(scaled_ppm);
struct efx_nic *efx = ptp_data->efx; struct efx_nic *efx = ptp_data->efx;
MCDI_DECLARE_BUF(inadj, MC_CMD_PTP_IN_ADJUST_LEN); MCDI_DECLARE_BUF(inadj, MC_CMD_PTP_IN_ADJUST_LEN);
s64 adjustment_ns; s64 adjustment_ns;
......
...@@ -391,9 +391,10 @@ static irqreturn_t am65_cpts_interrupt(int irq, void *dev_id) ...@@ -391,9 +391,10 @@ static irqreturn_t am65_cpts_interrupt(int irq, void *dev_id)
} }
/* PTP clock operations */ /* PTP clock operations */
static int am65_cpts_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) static int am65_cpts_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
{ {
struct am65_cpts *cpts = container_of(ptp, struct am65_cpts, ptp_info); struct am65_cpts *cpts = container_of(ptp, struct am65_cpts, ptp_info);
s32 ppb = scaled_ppm_to_ppb(scaled_ppm);
int neg_adj = 0; int neg_adj = 0;
u64 adj_period; u64 adj_period;
u32 val; u32 val;
...@@ -625,7 +626,7 @@ static long am65_cpts_ts_work(struct ptp_clock_info *ptp); ...@@ -625,7 +626,7 @@ static long am65_cpts_ts_work(struct ptp_clock_info *ptp);
static struct ptp_clock_info am65_ptp_info = { static struct ptp_clock_info am65_ptp_info = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "CTPS timer", .name = "CTPS timer",
.adjfreq = am65_cpts_ptp_adjfreq, .adjfine = am65_cpts_ptp_adjfine,
.adjtime = am65_cpts_ptp_adjtime, .adjtime = am65_cpts_ptp_adjtime,
.gettimex64 = am65_cpts_ptp_gettimex, .gettimex64 = am65_cpts_ptp_gettimex,
.settime64 = am65_cpts_ptp_settime, .settime64 = am65_cpts_ptp_settime,
......
...@@ -134,8 +134,9 @@ static s64 dte_read_nco_with_ovf(struct ptp_dte *ptp_dte) ...@@ -134,8 +134,9 @@ static s64 dte_read_nco_with_ovf(struct ptp_dte *ptp_dte)
return ns; return ns;
} }
static int ptp_dte_adjfreq(struct ptp_clock_info *ptp, s32 ppb) static int ptp_dte_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
{ {
s32 ppb = scaled_ppm_to_ppb(scaled_ppm);
u32 nco_incr; u32 nco_incr;
unsigned long flags; unsigned long flags;
struct ptp_dte *ptp_dte = container_of(ptp, struct ptp_dte, caps); struct ptp_dte *ptp_dte = container_of(ptp, struct ptp_dte, caps);
...@@ -219,7 +220,7 @@ static const struct ptp_clock_info ptp_dte_caps = { ...@@ -219,7 +220,7 @@ static const struct ptp_clock_info ptp_dte_caps = {
.n_ext_ts = 0, .n_ext_ts = 0,
.n_pins = 0, .n_pins = 0,
.pps = 0, .pps = 0,
.adjfreq = ptp_dte_adjfreq, .adjfine = ptp_dte_adjfine,
.adjtime = ptp_dte_adjtime, .adjtime = ptp_dte_adjtime,
.gettime64 = ptp_dte_gettime, .gettime64 = ptp_dte_gettime,
.settime64 = ptp_dte_settime, .settime64 = ptp_dte_settime,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment