aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/macsec.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/macsec.c')
-rw-r--r--drivers/net/macsec.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index d13e6e15d7b5..dbd590a8177f 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -3047,22 +3047,29 @@ static void macsec_del_dev(struct macsec_dev *macsec)
3047 } 3047 }
3048} 3048}
3049 3049
3050static void macsec_common_dellink(struct net_device *dev, struct list_head *head)
3051{
3052 struct macsec_dev *macsec = macsec_priv(dev);
3053
3054 unregister_netdevice_queue(dev, head);
3055 list_del_rcu(&macsec->secys);
3056 macsec_del_dev(macsec);
3057
3058 macsec_generation++;
3059}
3060
3050static void macsec_dellink(struct net_device *dev, struct list_head *head) 3061static void macsec_dellink(struct net_device *dev, struct list_head *head)
3051{ 3062{
3052 struct macsec_dev *macsec = macsec_priv(dev); 3063 struct macsec_dev *macsec = macsec_priv(dev);
3053 struct net_device *real_dev = macsec->real_dev; 3064 struct net_device *real_dev = macsec->real_dev;
3054 struct macsec_rxh_data *rxd = macsec_data_rtnl(real_dev); 3065 struct macsec_rxh_data *rxd = macsec_data_rtnl(real_dev);
3055 3066
3056 macsec_generation++; 3067 macsec_common_dellink(dev, head);
3057 3068
3058 unregister_netdevice_queue(dev, head);
3059 list_del_rcu(&macsec->secys);
3060 if (list_empty(&rxd->secys)) { 3069 if (list_empty(&rxd->secys)) {
3061 netdev_rx_handler_unregister(real_dev); 3070 netdev_rx_handler_unregister(real_dev);
3062 kfree(rxd); 3071 kfree(rxd);
3063 } 3072 }
3064
3065 macsec_del_dev(macsec);
3066} 3073}
3067 3074
3068static int register_macsec_dev(struct net_device *real_dev, 3075static int register_macsec_dev(struct net_device *real_dev,
@@ -3382,8 +3389,12 @@ static int macsec_notify(struct notifier_block *this, unsigned long event,
3382 3389
3383 rxd = macsec_data_rtnl(real_dev); 3390 rxd = macsec_data_rtnl(real_dev);
3384 list_for_each_entry_safe(m, n, &rxd->secys, secys) { 3391 list_for_each_entry_safe(m, n, &rxd->secys, secys) {
3385 macsec_dellink(m->secy.netdev, &head); 3392 macsec_common_dellink(m->secy.netdev, &head);
3386 } 3393 }
3394
3395 netdev_rx_handler_unregister(real_dev);
3396 kfree(rxd);
3397
3387 unregister_netdevice_many(&head); 3398 unregister_netdevice_many(&head);
3388 break; 3399 break;
3389 } 3400 }