aboutsummaryrefslogtreecommitdiffstats
path: root/net/hsr
diff options
context:
space:
mode:
authorArvid Brodin <arvid.brodin@alten.se>2014-07-04 17:36:40 -0400
committerDavid S. Miller <davem@davemloft.net>2014-07-08 14:35:30 -0400
commite9aae56ea43ef4a32527b9d86c1f6b5eebfbd223 (patch)
tree9d98af0ddd4feed4266745d7a2b5fcc45445e65c /net/hsr
parentabff7162765cd66ab109c97fd433ef1f39299120 (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.c37
-rw-r--r--net/hsr/hsr_device.h6
-rw-r--r--net/hsr/hsr_main.c9
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
49void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1, 49static 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
63void hsr_set_carrier(struct net_device *hsr_dev, struct net_device *slave1, 62static 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
73void hsr_check_announce(struct net_device *hsr_dev, int old_operstate) 77static 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
97void 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
93int hsr_get_max_mtu(struct hsr_priv *hsr) 112int 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 @@
18void hsr_dev_setup(struct net_device *dev); 18void hsr_dev_setup(struct net_device *dev);
19int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], 19int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
20 unsigned char multicast_spec); 20 unsigned char multicast_spec);
21void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1, 21void hsr_check_carrier_and_operstate(struct hsr_priv *hsr);
22 struct net_device *slave2);
23void hsr_set_carrier(struct net_device *hsr_dev, struct net_device *slave1,
24 struct net_device *slave2);
25void hsr_check_announce(struct net_device *hsr_dev, int old_operstate);
26bool is_hsr_master(struct net_device *dev); 22bool is_hsr_master(struct net_device *dev);
27int hsr_get_max_mtu(struct hsr_priv *hsr); 23int 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