| From 67ca04147efac6cac3f7490c61c817a84daada57 Mon Sep 17 00:00:00 2001 |
| From: Yangbo Lu <yangbo.lu@nxp.com> |
| Date: Thu, 28 Nov 2019 14:42:44 +0800 |
| Subject: [PATCH] LF-368 net: mscc: ocelot: add VCAP IS2 rule to trap PTP |
| Ethernet frames |
| |
| All the PTP messages over Ethernet have etype 0x88f7 on them. |
| Use etype as the key to trap PTP messages. |
| |
| Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
| --- |
| drivers/net/ethernet/mscc/ocelot.c | 23 +++++++++++++++++++++++ |
| 1 file changed, 23 insertions(+) |
| |
| --- a/drivers/net/ethernet/mscc/ocelot.c |
| +++ b/drivers/net/ethernet/mscc/ocelot.c |
| @@ -2337,6 +2337,20 @@ void ocelot_set_cpu_port(struct ocelot * |
| } |
| EXPORT_SYMBOL(ocelot_set_cpu_port); |
| |
| +/* Entry for PTP over Ethernet (etype 0x88f7) |
| + * Action: trap to CPU port |
| + */ |
| +static struct ocelot_ace_rule ptp_rule = { |
| + .prio = 1, |
| + .type = OCELOT_ACE_TYPE_ETYPE, |
| + .dmac_mc = OCELOT_VCAP_BIT_1, |
| + .action = OCELOT_ACL_ACTION_TRAP, |
| + .frame.etype.etype.value[0] = 0x88, |
| + .frame.etype.etype.value[1] = 0xf7, |
| + .frame.etype.etype.mask[0] = 0xff, |
| + .frame.etype.etype.mask[1] = 0xff, |
| +}; |
| + |
| int ocelot_init(struct ocelot *ocelot) |
| { |
| char queue_name[32]; |
| @@ -2478,6 +2492,13 @@ int ocelot_init(struct ocelot *ocelot) |
| "Timestamp initialization failed\n"); |
| return ret; |
| } |
| + |
| + /* Available on all ingress port except CPU port */ |
| + ptp_rule.ocelot = ocelot; |
| + ptp_rule.ingress_port_mask = |
| + GENMASK(ocelot->num_phys_ports - 1, 0); |
| + ptp_rule.ingress_port_mask &= ~BIT(ocelot->cpu); |
| + ocelot_ace_rule_offload_add(&ptp_rule); |
| } |
| |
| return 0; |
| @@ -2492,6 +2513,8 @@ void ocelot_deinit(struct ocelot *ocelot |
| cancel_delayed_work(&ocelot->stats_work); |
| destroy_workqueue(ocelot->stats_queue); |
| mutex_destroy(&ocelot->stats_lock); |
| + if (ocelot->ptp) |
| + ocelot_ace_rule_offload_del(&ptp_rule); |
| ocelot_ace_deinit(); |
| if (ocelot->ptp_clock) |
| ptp_clock_unregister(ocelot->ptp_clock); |