Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net/hsr: Operstate handling cleanup.

Signed-off-by: Arvid Brodin <arvid.brodin@alten.se>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Arvid Brodin and committed by
David S. Miller
e9aae56e abff7162

+30 -22
+28 -9
net/hsr/hsr_device.c
··· 46 46 } 47 47 } 48 48 49 - void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1, 50 - struct net_device *slave2) 49 + static void hsr_set_operstate(struct net_device *hsr_dev, bool has_carrier) 51 50 { 52 51 if (!is_admin_up(hsr_dev)) { 53 52 __hsr_set_operstate(hsr_dev, IF_OPER_DOWN); 54 53 return; 55 54 } 56 55 57 - if (is_slave_up(slave1) || is_slave_up(slave2)) 56 + if (has_carrier) 58 57 __hsr_set_operstate(hsr_dev, IF_OPER_UP); 59 58 else 60 59 __hsr_set_operstate(hsr_dev, IF_OPER_LOWERLAYERDOWN); 61 60 } 62 61 63 - void hsr_set_carrier(struct net_device *hsr_dev, struct net_device *slave1, 64 - struct net_device *slave2) 62 + static bool hsr_check_carrier(struct hsr_priv *hsr) 65 63 { 66 - if (is_slave_up(slave1) || is_slave_up(slave2)) 67 - netif_carrier_on(hsr_dev); 64 + bool has_carrier; 65 + 66 + has_carrier = (is_slave_up(hsr->slave[0]) || is_slave_up(hsr->slave[1])); 67 + 68 + if (has_carrier) 69 + netif_carrier_on(hsr->dev); 68 70 else 69 - netif_carrier_off(hsr_dev); 71 + netif_carrier_off(hsr->dev); 72 + 73 + return has_carrier; 70 74 } 71 75 72 76 73 - void hsr_check_announce(struct net_device *hsr_dev, int old_operstate) 77 + static void hsr_check_announce(struct net_device *hsr_dev, 78 + unsigned char old_operstate) 74 79 { 75 80 struct hsr_priv *hsr; 76 81 ··· 92 87 if ((hsr_dev->operstate != IF_OPER_UP) && (old_operstate == IF_OPER_UP)) 93 88 /* Went down */ 94 89 del_timer(&hsr->announce_timer); 90 + } 91 + 92 + void hsr_check_carrier_and_operstate(struct hsr_priv *hsr) 93 + { 94 + unsigned char old_operstate; 95 + bool has_carrier; 96 + 97 + /* netif_stacked_transfer_operstate() cannot be used here since 98 + * it doesn't set IF_OPER_LOWERLAYERDOWN (?) 99 + */ 100 + old_operstate = hsr->dev->operstate; 101 + has_carrier = hsr_check_carrier(hsr); 102 + hsr_set_operstate(hsr->dev, has_carrier); 103 + hsr_check_announce(hsr->dev, old_operstate); 95 104 } 96 105 97 106
+1 -5
net/hsr/hsr_device.h
··· 18 18 void hsr_dev_setup(struct net_device *dev); 19 19 int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], 20 20 unsigned char multicast_spec); 21 - void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1, 22 - struct net_device *slave2); 23 - void hsr_set_carrier(struct net_device *hsr_dev, struct net_device *slave1, 24 - struct net_device *slave2); 25 - void hsr_check_announce(struct net_device *hsr_dev, int old_operstate); 21 + void hsr_check_carrier_and_operstate(struct hsr_priv *hsr); 26 22 bool is_hsr_master(struct net_device *dev); 27 23 int hsr_get_max_mtu(struct hsr_priv *hsr); 28 24
+1 -8
net/hsr/hsr_main.c
··· 91 91 { 92 92 struct net_device *slave, *other_slave; 93 93 struct hsr_priv *hsr; 94 - int old_operstate; 95 94 int mtu_max; 96 95 int res; 97 96 struct net_device *dev; ··· 114 115 case NETDEV_UP: /* Administrative state DOWN */ 115 116 case NETDEV_DOWN: /* Administrative state UP */ 116 117 case NETDEV_CHANGE: /* Link (carrier) state changes */ 117 - old_operstate = hsr->dev->operstate; 118 - hsr_set_carrier(hsr->dev, slave, other_slave); 119 - /* netif_stacked_transfer_operstate() cannot be used here since 120 - * it doesn't set IF_OPER_LOWERLAYERDOWN (?) 121 - */ 122 - hsr_set_operstate(hsr->dev, slave, other_slave); 123 - hsr_check_announce(hsr->dev, old_operstate); 118 + hsr_check_carrier_and_operstate(hsr); 124 119 break; 125 120 case NETDEV_CHANGEADDR: 126 121