struct mlxsw_sp *mlxsw_sp;
 };
 
+struct mlxsw_sp_ptp_ops {
+       struct mlxsw_sp_ptp_clock *
+               (*clock_init)(struct mlxsw_sp *mlxsw_sp, struct device *dev);
+       void (*clock_fini)(struct mlxsw_sp_ptp_clock *clock);
+
+       /* Notify a driver that a packet that might be PTP was received. Driver
+        * is responsible for freeing the passed-in SKB.
+        */
+       void (*receive)(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
+                       u8 local_port);
+};
+
 static int mlxsw_sp_component_query(struct mlxfw_dev *mlxfw_dev,
                                    u16 component_index, u32 *p_max_size,
                                    u8 *p_align_bits, u16 *p_max_write_size)
        }
 }
 
-static void mlxsw_sp_rx_listener_no_mark_func(struct sk_buff *skb,
-                                             u8 local_port, void *priv)
+void mlxsw_sp_rx_listener_no_mark_func(struct sk_buff *skb,
+                                      u8 local_port, void *priv)
 {
        struct mlxsw_sp *mlxsw_sp = priv;
        struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp->ports[local_port];
        consume_skb(skb);
 }
 
+static void mlxsw_sp_rx_listener_ptp(struct sk_buff *skb, u8 local_port,
+                                    void *priv)
+{
+       struct mlxsw_sp *mlxsw_sp = priv;
+
+       mlxsw_sp->ptp_ops->receive(mlxsw_sp, skb, local_port);
+}
+
 #define MLXSW_SP_RXL_NO_MARK(_trap_id, _action, _trap_group, _is_ctrl) \
        MLXSW_RXL(mlxsw_sp_rx_listener_no_mark_func, _trap_id, _action, \
                  _is_ctrl, SP_##_trap_group, DISCARD)
        /* L2 traps */
        MLXSW_SP_RXL_NO_MARK(STP, TRAP_TO_CPU, STP, true),
        MLXSW_SP_RXL_NO_MARK(LACP, TRAP_TO_CPU, LACP, true),
-       MLXSW_SP_RXL_NO_MARK(LLDP, TRAP_TO_CPU, LLDP, true),
+       MLXSW_RXL(mlxsw_sp_rx_listener_ptp, LLDP, TRAP_TO_CPU,
+                 false, SP_LLDP, DISCARD),
        MLXSW_SP_RXL_MARK(DHCP, MIRROR_TO_CPU, DHCP, false),
        MLXSW_SP_RXL_MARK(IGMP_QUERY, MIRROR_TO_CPU, IGMP, false),
        MLXSW_SP_RXL_NO_MARK(IGMP_V1_REPORT, TRAP_TO_CPU, IGMP, false),
        /* NVE traps */
        MLXSW_SP_RXL_MARK(NVE_ENCAP_ARP, TRAP_TO_CPU, ARP, false),
        MLXSW_SP_RXL_NO_MARK(NVE_DECAP_ARP, TRAP_TO_CPU, ARP, false),
+       /* PTP traps */
+       MLXSW_RXL(mlxsw_sp_rx_listener_ptp, PTP0, TRAP_TO_CPU,
+                 false, SP_PTP0, DISCARD),
+       MLXSW_SP_RXL_NO_MARK(PTP1, TRAP_TO_CPU, PTP1, false),
 };
 
 static const struct mlxsw_listener mlxsw_sp1_listener[] = {
                        rate = 1024;
                        burst_size = 7;
                        break;
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_PTP0:
+                       rate = 24 * 1024;
+                       burst_size = 12;
+                       break;
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_PTP1:
+                       rate = 19 * 1024;
+                       burst_size = 12;
+                       break;
                default:
                        continue;
                }
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_LLDP:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_OSPF:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_PIM:
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_PTP0:
                        priority = 5;
                        tc = 5;
                        break;
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_ARP:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_IPV6_ND:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_RPF:
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_PTP1:
                        priority = 2;
                        tc = 2;
                        break;
        return mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
 }
 
-struct mlxsw_sp_ptp_ops {
-       struct mlxsw_sp_ptp_clock *
-               (*clock_init)(struct mlxsw_sp *mlxsw_sp, struct device *dev);
-       void (*clock_fini)(struct mlxsw_sp_ptp_clock *clock);
-};
-
 static const struct mlxsw_sp_ptp_ops mlxsw_sp1_ptp_ops = {
        .clock_init     = mlxsw_sp1_ptp_clock_init,
        .clock_fini     = mlxsw_sp1_ptp_clock_fini,
+       .receive        = mlxsw_sp1_ptp_receive,
 };
 
 static const struct mlxsw_sp_ptp_ops mlxsw_sp2_ptp_ops = {
        .clock_init     = mlxsw_sp2_ptp_clock_init,
        .clock_fini     = mlxsw_sp2_ptp_clock_fini,
+       .receive        = mlxsw_sp2_ptp_receive,
 };
 
 static int mlxsw_sp_netdevice_event(struct notifier_block *unused,