diff options
author | Arvid Brodin <arvid.brodin@alten.se> | 2014-07-04 17:36:40 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-07-08 14:35:30 -0400 |
commit | e9aae56ea43ef4a32527b9d86c1f6b5eebfbd223 (patch) | |
tree | 9d98af0ddd4feed4266745d7a2b5fcc45445e65c /net/hsr | |
parent | abff7162765cd66ab109c97fd433ef1f39299120 (diff) |
net/hsr: Operstate handling cleanup.
Signed-off-by: Arvid Brodin <arvid.brodin@alten.se>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/hsr')
-rw-r--r-- | net/hsr/hsr_device.c | 37 | ||||
-rw-r--r-- | net/hsr/hsr_device.h | 6 | ||||
-rw-r--r-- | net/hsr/hsr_main.c | 9 |
3 files changed, 30 insertions, 22 deletions
diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c index f224067153e4..8936b3c2bb84 100644 --- a/net/hsr/hsr_device.c +++ b/net/hsr/hsr_device.c | |||
@@ -46,31 +46,36 @@ static void __hsr_set_operstate(struct net_device *dev, int transition) | |||
46 | } | 46 | } |
47 | } | 47 | } |
48 | 48 | ||
49 | void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1, | 49 | static void hsr_set_operstate(struct net_device *hsr_dev, bool has_carrier) |
50 | struct net_device *slave2) | ||
51 | { | 50 | { |
52 | if (!is_admin_up(hsr_dev)) { | 51 | if (!is_admin_up(hsr_dev)) { |
53 | __hsr_set_operstate(hsr_dev, IF_OPER_DOWN); | 52 | __hsr_set_operstate(hsr_dev, IF_OPER_DOWN); |
54 | return; | 53 | return; |
55 | } | 54 | } |
56 | 55 | ||
57 | if (is_slave_up(slave1) || is_slave_up(slave2)) | 56 | if (has_carrier) |
58 | __hsr_set_operstate(hsr_dev, IF_OPER_UP); | 57 | __hsr_set_operstate(hsr_dev, IF_OPER_UP); |
59 | else | 58 | else |
60 | __hsr_set_operstate(hsr_dev, IF_OPER_LOWERLAYERDOWN); | 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, | 62 | static bool hsr_check_carrier(struct hsr_priv *hsr) |
64 | struct net_device *slave2) | ||
65 | { | 63 | { |
66 | if (is_slave_up(slave1) || is_slave_up(slave2)) | 64 | bool has_carrier; |
67 | netif_carrier_on(hsr_dev); | 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 | else | 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 | struct hsr_priv *hsr; | 80 | struct hsr_priv *hsr; |
76 | 81 | ||
@@ -89,6 +94,20 @@ void hsr_check_announce(struct net_device *hsr_dev, int old_operstate) | |||
89 | del_timer(&hsr->announce_timer); | 94 | del_timer(&hsr->announce_timer); |
90 | } | 95 | } |
91 | 96 | ||
97 | void hsr_check_carrier_and_operstate(struct hsr_priv *hsr) | ||
98 | { | ||
99 | unsigned char old_operstate; | ||
100 | bool has_carrier; | ||
101 | |||
102 | /* netif_stacked_transfer_operstate() cannot be used here since | ||
103 | * it doesn't set IF_OPER_LOWERLAYERDOWN (?) | ||
104 | */ | ||
105 | old_operstate = hsr->dev->operstate; | ||
106 | has_carrier = hsr_check_carrier(hsr); | ||
107 | hsr_set_operstate(hsr->dev, has_carrier); | ||
108 | hsr_check_announce(hsr->dev, old_operstate); | ||
109 | } | ||
110 | |||
92 | 111 | ||
93 | int hsr_get_max_mtu(struct hsr_priv *hsr) | 112 | int hsr_get_max_mtu(struct hsr_priv *hsr) |
94 | { | 113 | { |
diff --git a/net/hsr/hsr_device.h b/net/hsr/hsr_device.h index feb744f90f3d..108a5d59d2a6 100644 --- a/net/hsr/hsr_device.h +++ b/net/hsr/hsr_device.h | |||
@@ -18,11 +18,7 @@ | |||
18 | void hsr_dev_setup(struct net_device *dev); | 18 | void hsr_dev_setup(struct net_device *dev); |
19 | int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], | 19 | int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], |
20 | unsigned char multicast_spec); | 20 | unsigned char multicast_spec); |
21 | void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1, | 21 | void hsr_check_carrier_and_operstate(struct hsr_priv *hsr); |
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); | ||
26 | bool is_hsr_master(struct net_device *dev); | 22 | bool is_hsr_master(struct net_device *dev); |
27 | int hsr_get_max_mtu(struct hsr_priv *hsr); | 23 | int hsr_get_max_mtu(struct hsr_priv *hsr); |
28 | 24 | ||
diff --git a/net/hsr/hsr_main.c b/net/hsr/hsr_main.c index 5f9cd7fdbd93..431b528c2447 100644 --- a/net/hsr/hsr_main.c +++ b/net/hsr/hsr_main.c | |||
@@ -91,7 +91,6 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event, | |||
91 | { | 91 | { |
92 | struct net_device *slave, *other_slave; | 92 | struct net_device *slave, *other_slave; |
93 | struct hsr_priv *hsr; | 93 | struct hsr_priv *hsr; |
94 | int old_operstate; | ||
95 | int mtu_max; | 94 | int mtu_max; |
96 | int res; | 95 | int res; |
97 | struct net_device *dev; | 96 | struct net_device *dev; |
@@ -115,13 +114,7 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event, | |||
115 | case NETDEV_UP: /* Administrative state DOWN */ | 114 | case NETDEV_UP: /* Administrative state DOWN */ |
116 | case NETDEV_DOWN: /* Administrative state UP */ | 115 | case NETDEV_DOWN: /* Administrative state UP */ |
117 | case NETDEV_CHANGE: /* Link (carrier) state changes */ | 116 | case NETDEV_CHANGE: /* Link (carrier) state changes */ |
118 | old_operstate = hsr->dev->operstate; | 117 | hsr_check_carrier_and_operstate(hsr); |
119 | hsr_set_carrier(hsr->dev, slave, other_slave); | ||
120 | /* netif_stacked_transfer_operstate() cannot be used here since | ||
121 | * it doesn't set IF_OPER_LOWERLAYERDOWN (?) | ||
122 | */ | ||
123 | hsr_set_operstate(hsr->dev, slave, other_slave); | ||
124 | hsr_check_announce(hsr->dev, old_operstate); | ||
125 | break; | 118 | break; |
126 | case NETDEV_CHANGEADDR: | 119 | case NETDEV_CHANGEADDR: |
127 | 120 | ||