net: atlantic: ptp gpio adjustments
Clock adjustment data should be passed to FW as well, otherwise in some cases a drift was observed when using GPIO features. Signed-off-by: Egor Pomozov <epomozov@marvell.com> Signed-off-by: Igor Russkikh <irusskikh@marvell.com> Signed-off-by: Dmitry Bogdanov <dbogdanov@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e7b5f97e65
commit
f08a464c27
|
@ -337,6 +337,8 @@ struct aq_fw_ops {
|
||||||
|
|
||||||
void (*enable_ptp)(struct aq_hw_s *self, int enable);
|
void (*enable_ptp)(struct aq_hw_s *self, int enable);
|
||||||
|
|
||||||
|
void (*adjust_ptp)(struct aq_hw_s *self, uint64_t adj);
|
||||||
|
|
||||||
int (*set_eee_rate)(struct aq_hw_s *self, u32 speed);
|
int (*set_eee_rate)(struct aq_hw_s *self, u32 speed);
|
||||||
|
|
||||||
int (*get_eee_rate)(struct aq_hw_s *self, u32 *rate,
|
int (*get_eee_rate)(struct aq_hw_s *self, u32 *rate,
|
||||||
|
|
|
@ -1162,6 +1162,8 @@ static int hw_atl_b0_adj_sys_clock(struct aq_hw_s *self, s64 delta)
|
||||||
{
|
{
|
||||||
self->ptp_clk_offset += delta;
|
self->ptp_clk_offset += delta;
|
||||||
|
|
||||||
|
self->aq_fw_ops->adjust_ptp(self, self->ptp_clk_offset);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1212,7 +1214,7 @@ static int hw_atl_b0_gpio_pulse(struct aq_hw_s *self, u32 index,
|
||||||
fwreq.ptp_gpio_ctrl.index = index;
|
fwreq.ptp_gpio_ctrl.index = index;
|
||||||
fwreq.ptp_gpio_ctrl.period = period;
|
fwreq.ptp_gpio_ctrl.period = period;
|
||||||
/* Apply time offset */
|
/* Apply time offset */
|
||||||
fwreq.ptp_gpio_ctrl.start = start - self->ptp_clk_offset;
|
fwreq.ptp_gpio_ctrl.start = start;
|
||||||
|
|
||||||
size = sizeof(fwreq.msg_id) + sizeof(fwreq.ptp_gpio_ctrl);
|
size = sizeof(fwreq.msg_id) + sizeof(fwreq.ptp_gpio_ctrl);
|
||||||
return self->aq_fw_ops->send_fw_request(self, &fwreq, size);
|
return self->aq_fw_ops->send_fw_request(self, &fwreq, size);
|
||||||
|
|
|
@ -30,6 +30,9 @@
|
||||||
#define HW_ATL_FW3X_EXT_CONTROL_ADDR 0x378
|
#define HW_ATL_FW3X_EXT_CONTROL_ADDR 0x378
|
||||||
#define HW_ATL_FW3X_EXT_STATE_ADDR 0x37c
|
#define HW_ATL_FW3X_EXT_STATE_ADDR 0x37c
|
||||||
|
|
||||||
|
#define HW_ATL_FW3X_PTP_ADJ_LSW_ADDR 0x50a0
|
||||||
|
#define HW_ATL_FW3X_PTP_ADJ_MSW_ADDR 0x50a4
|
||||||
|
|
||||||
#define HW_ATL_FW2X_CAP_PAUSE BIT(CAPS_HI_PAUSE)
|
#define HW_ATL_FW2X_CAP_PAUSE BIT(CAPS_HI_PAUSE)
|
||||||
#define HW_ATL_FW2X_CAP_ASYM_PAUSE BIT(CAPS_HI_ASYMMETRIC_PAUSE)
|
#define HW_ATL_FW2X_CAP_ASYM_PAUSE BIT(CAPS_HI_ASYMMETRIC_PAUSE)
|
||||||
#define HW_ATL_FW2X_CAP_SLEEP_PROXY BIT(CAPS_HI_SLEEP_PROXY)
|
#define HW_ATL_FW2X_CAP_SLEEP_PROXY BIT(CAPS_HI_SLEEP_PROXY)
|
||||||
|
@ -475,6 +478,14 @@ static void aq_fw3x_enable_ptp(struct aq_hw_s *self, int enable)
|
||||||
aq_hw_write_reg(self, HW_ATL_FW3X_EXT_CONTROL_ADDR, ptp_opts);
|
aq_hw_write_reg(self, HW_ATL_FW3X_EXT_CONTROL_ADDR, ptp_opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void aq_fw3x_adjust_ptp(struct aq_hw_s *self, uint64_t adj)
|
||||||
|
{
|
||||||
|
aq_hw_write_reg(self, HW_ATL_FW3X_PTP_ADJ_LSW_ADDR,
|
||||||
|
(adj >> 0) & 0xffffffff);
|
||||||
|
aq_hw_write_reg(self, HW_ATL_FW3X_PTP_ADJ_MSW_ADDR,
|
||||||
|
(adj >> 32) & 0xffffffff);
|
||||||
|
}
|
||||||
|
|
||||||
static int aq_fw2x_led_control(struct aq_hw_s *self, u32 mode)
|
static int aq_fw2x_led_control(struct aq_hw_s *self, u32 mode)
|
||||||
{
|
{
|
||||||
if (self->fw_ver_actual < HW_ATL_FW_VER_LED)
|
if (self->fw_ver_actual < HW_ATL_FW_VER_LED)
|
||||||
|
@ -633,4 +644,5 @@ const struct aq_fw_ops aq_fw_2x_ops = {
|
||||||
.enable_ptp = aq_fw3x_enable_ptp,
|
.enable_ptp = aq_fw3x_enable_ptp,
|
||||||
.led_control = aq_fw2x_led_control,
|
.led_control = aq_fw2x_led_control,
|
||||||
.set_phyloopback = aq_fw2x_set_phyloopback,
|
.set_phyloopback = aq_fw2x_set_phyloopback,
|
||||||
|
.adjust_ptp = aq_fw3x_adjust_ptp,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue