}
 
 static struct mlxsw_afa_mirror *
-mlxsw_afa_mirror_create(struct mlxsw_afa_block *block,
-                       u8 local_in_port, u8 local_out_port,
-                       bool ingress)
+mlxsw_afa_mirror_create(struct mlxsw_afa_block *block, u8 local_in_port,
+                       const struct net_device *out_dev, bool ingress)
 {
        struct mlxsw_afa_mirror *mirror;
        int err;
                return ERR_PTR(-ENOMEM);
 
        err = block->afa->ops->mirror_add(block->afa->ops_priv,
-                                         local_in_port, local_out_port,
+                                         local_in_port, out_dev,
                                          ingress, &mirror->span_id);
        if (err)
                goto err_mirror_add;
 }
 
 int
-mlxsw_afa_block_append_mirror(struct mlxsw_afa_block *block,
-                             u8 local_in_port, u8 local_out_port, bool ingress)
+mlxsw_afa_block_append_mirror(struct mlxsw_afa_block *block, u8 local_in_port,
+                             const struct net_device *out_dev, bool ingress)
 {
        struct mlxsw_afa_mirror *mirror;
        int err;
 
-       mirror = mlxsw_afa_mirror_create(block, local_in_port, local_out_port,
+       mirror = mlxsw_afa_mirror_create(block, local_in_port, out_dev,
                                         ingress);
        if (IS_ERR(mirror))
                return PTR_ERR(mirror);
 
 #define _MLXSW_CORE_ACL_FLEX_ACTIONS_H
 
 #include <linux/types.h>
+#include <linux/netdevice.h>
 
 struct mlxsw_afa;
 struct mlxsw_afa_block;
        void (*kvdl_fwd_entry_del)(void *priv, u32 kvdl_index);
        int (*counter_index_get)(void *priv, unsigned int *p_counter_index);
        void (*counter_index_put)(void *priv, unsigned int counter_index);
-       int (*mirror_add)(void *priv, u8 locol_in_port, u8 local_out_port,
+       int (*mirror_add)(void *priv, u8 local_in_port,
+                         const struct net_device *out_dev,
                          bool ingress, int *p_span_id);
        void (*mirror_del)(void *priv, u8 local_in_port, int span_id,
                           bool ingress);
 int mlxsw_afa_block_append_trap_and_forward(struct mlxsw_afa_block *block,
                                            u16 trap_id);
 int mlxsw_afa_block_append_mirror(struct mlxsw_afa_block *block,
-                                 u8 local_in_port, u8 local_out_port,
+                                 u8 local_in_port,
+                                 const struct net_device *out_dev,
                                  bool ingress);
 int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block,
                               u8 local_port, bool in_port);
 
                                      bool ingress)
 {
        enum mlxsw_sp_span_type span_type;
-       struct mlxsw_sp_port *to_port;
        struct net_device *to_dev;
 
        to_dev = tcf_mirred_dev(a);
                netdev_err(mlxsw_sp_port->dev, "Cannot mirror to a non-spectrum port");
                return -EOPNOTSUPP;
        }
-       to_port = netdev_priv(to_dev);
 
        mirror->ingress = ingress;
        span_type = ingress ? MLXSW_SP_SPAN_INGRESS : MLXSW_SP_SPAN_EGRESS;
-       return mlxsw_sp_span_mirror_add(mlxsw_sp_port, to_port, span_type,
+       return mlxsw_sp_span_mirror_add(mlxsw_sp_port, to_dev, span_type,
                                        true, &mirror->span_id);
 }
 
                                    unsigned long event, void *ptr)
 {
        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
+       struct mlxsw_sp_span_entry *span_entry;
        struct mlxsw_sp *mlxsw_sp;
        int err = 0;
 
        mlxsw_sp = container_of(nb, struct mlxsw_sp, netdevice_nb);
+       if (event == NETDEV_UNREGISTER) {
+               span_entry = mlxsw_sp_span_entry_find_by_port(mlxsw_sp, dev);
+               if (span_entry)
+                       mlxsw_sp_span_entry_invalidate(mlxsw_sp, span_entry);
+       }
+
        if (mlxsw_sp_netdev_is_ipip_ol(mlxsw_sp, dev))
                err = mlxsw_sp_netdevice_ipip_ol_event(mlxsw_sp, dev,
                                                       event, ptr);
 
 
        return mlxsw_afa_block_append_mirror(rulei->act_block,
                                             in_port->local_port,
-                                            out_port->local_port,
+                                            out_dev,
                                             binding->ingress);
 }
 
 
 }
 
 static int
-mlxsw_sp_act_mirror_add(void *priv, u8 local_in_port, u8 local_out_port,
+mlxsw_sp_act_mirror_add(void *priv, u8 local_in_port,
+                       const struct net_device *out_dev,
                        bool ingress, int *p_span_id)
 {
-       struct mlxsw_sp_port *in_port, *out_port;
+       struct mlxsw_sp_port *in_port;
        struct mlxsw_sp *mlxsw_sp = priv;
        enum mlxsw_sp_span_type type;
 
        type = ingress ? MLXSW_SP_SPAN_INGRESS : MLXSW_SP_SPAN_EGRESS;
-       out_port = mlxsw_sp->ports[local_out_port];
        in_port = mlxsw_sp->ports[local_in_port];
 
-       return mlxsw_sp_span_mirror_add(in_port, out_port, type,
+       return mlxsw_sp_span_mirror_add(in_port, out_dev, type,
                                        false, p_span_id);
 }
 
 
 mlxsw_sp_span_entry_deconfigure(struct mlxsw_sp *mlxsw_sp,
                                struct mlxsw_sp_span_entry *span_entry)
 {
-       u8 local_port = span_entry->local_port;
+       struct mlxsw_sp_port *to_port = netdev_priv(span_entry->to_dev);
+       u8 local_port = to_port->local_port;
        char mpat_pl[MLXSW_REG_MPAT_LEN];
        int pa_id = span_entry->id;
 
 }
 
 static struct mlxsw_sp_span_entry *
-mlxsw_sp_span_entry_create(struct mlxsw_sp_port *port)
+mlxsw_sp_span_entry_create(struct mlxsw_sp *mlxsw_sp,
+                          const struct net_device *to_dev)
 {
+       struct mlxsw_sp_port *to_port = netdev_priv(to_dev);
        struct mlxsw_sp_span_entry *span_entry = NULL;
-       struct mlxsw_sp *mlxsw_sp = port->mlxsw_sp;
-       u8 local_port = port->local_port;
+       u8 local_port = to_port->local_port;
        int i;
 
        /* find a free entry to use */
                return NULL;
 
        span_entry->ref_count = 1;
-       span_entry->local_port = local_port;
+       span_entry->to_dev = to_dev;
        return span_entry;
 }
 
 static void mlxsw_sp_span_entry_destroy(struct mlxsw_sp *mlxsw_sp,
                                        struct mlxsw_sp_span_entry *span_entry)
 {
-       mlxsw_sp_span_entry_deconfigure(mlxsw_sp, span_entry);
+       if (span_entry->to_dev)
+               mlxsw_sp_span_entry_deconfigure(mlxsw_sp, span_entry);
 }
 
 struct mlxsw_sp_span_entry *
-mlxsw_sp_span_entry_find_by_port(struct mlxsw_sp *mlxsw_sp, u8 local_port)
+mlxsw_sp_span_entry_find_by_port(struct mlxsw_sp *mlxsw_sp,
+                                const struct net_device *to_dev)
 {
        int i;
 
        for (i = 0; i < mlxsw_sp->span.entries_count; i++) {
                struct mlxsw_sp_span_entry *curr = &mlxsw_sp->span.entries[i];
 
-               if (curr->ref_count && curr->local_port == local_port)
+               if (curr->ref_count && curr->to_dev == to_dev)
                        return curr;
        }
        return NULL;
 }
 
+void mlxsw_sp_span_entry_invalidate(struct mlxsw_sp *mlxsw_sp,
+                                   struct mlxsw_sp_span_entry *span_entry)
+{
+       mlxsw_sp_span_entry_deconfigure(mlxsw_sp, span_entry);
+       span_entry->to_dev = NULL;
+}
+
 static struct mlxsw_sp_span_entry *
 mlxsw_sp_span_entry_find_by_id(struct mlxsw_sp *mlxsw_sp, int span_id)
 {
 }
 
 static struct mlxsw_sp_span_entry *
-mlxsw_sp_span_entry_get(struct mlxsw_sp_port *port)
+mlxsw_sp_span_entry_get(struct mlxsw_sp *mlxsw_sp,
+                       const struct net_device *to_dev)
 {
        struct mlxsw_sp_span_entry *span_entry;
 
-       span_entry = mlxsw_sp_span_entry_find_by_port(port->mlxsw_sp,
-                                                     port->local_port);
+       span_entry = mlxsw_sp_span_entry_find_by_port(mlxsw_sp, to_dev);
        if (span_entry) {
                /* Already exists, just take a reference */
                span_entry->ref_count++;
                return span_entry;
        }
 
-       return mlxsw_sp_span_entry_create(port);
+       return mlxsw_sp_span_entry_create(mlxsw_sp, to_dev);
 }
 
 static int mlxsw_sp_span_entry_put(struct mlxsw_sp *mlxsw_sp,
 }
 
 int mlxsw_sp_span_mirror_add(struct mlxsw_sp_port *from,
-                            struct mlxsw_sp_port *to,
+                            const struct net_device *to_dev,
                             enum mlxsw_sp_span_type type, bool bind,
                             int *p_span_id)
 {
        struct mlxsw_sp_span_entry *span_entry;
        int err;
 
-       span_entry = mlxsw_sp_span_entry_get(to);
+       span_entry = mlxsw_sp_span_entry_get(mlxsw_sp, to_dev);
        if (!span_entry)
                return -ENOENT;
 
 
 };
 
 struct mlxsw_sp_span_entry {
-       u8 local_port;
+       const struct net_device *to_dev;
        struct list_head bound_ports_list;
        int ref_count;
        int id;
 void mlxsw_sp_span_fini(struct mlxsw_sp *mlxsw_sp);
 
 int mlxsw_sp_span_mirror_add(struct mlxsw_sp_port *from,
-                            struct mlxsw_sp_port *to,
+                            const struct net_device *to_dev,
                             enum mlxsw_sp_span_type type,
                             bool bind, int *p_span_id);
 void mlxsw_sp_span_mirror_del(struct mlxsw_sp_port *from, int span_id,
                              enum mlxsw_sp_span_type type, bool bind);
 struct mlxsw_sp_span_entry *
-mlxsw_sp_span_entry_find_by_port(struct mlxsw_sp *mlxsw_sp, u8 local_port);
+mlxsw_sp_span_entry_find_by_port(struct mlxsw_sp *mlxsw_sp,
+                                const struct net_device *to_dev);
+
+void mlxsw_sp_span_entry_invalidate(struct mlxsw_sp *mlxsw_sp,
+                                   struct mlxsw_sp_span_entry *span_entry);
 
 int mlxsw_sp_span_port_mtu_update(struct mlxsw_sp_port *port, u16 mtu);