diff options
Diffstat (limited to 'net/bridge/br_device.c')
-rw-r--r-- | net/bridge/br_device.c | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index e4401a531afb..63f0455c0bc3 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c | |||
@@ -187,8 +187,7 @@ static int br_set_mac_address(struct net_device *dev, void *p) | |||
187 | 187 | ||
188 | spin_lock_bh(&br->lock); | 188 | spin_lock_bh(&br->lock); |
189 | if (!ether_addr_equal(dev->dev_addr, addr->sa_data)) { | 189 | if (!ether_addr_equal(dev->dev_addr, addr->sa_data)) { |
190 | memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); | 190 | /* Mac address will be changed in br_stp_change_bridge_id(). */ |
191 | br_fdb_change_mac_address(br, addr->sa_data); | ||
192 | br_stp_change_bridge_id(br, addr->sa_data); | 191 | br_stp_change_bridge_id(br, addr->sa_data); |
193 | } | 192 | } |
194 | spin_unlock_bh(&br->lock); | 193 | spin_unlock_bh(&br->lock); |
@@ -226,6 +225,33 @@ static void br_netpoll_cleanup(struct net_device *dev) | |||
226 | br_netpoll_disable(p); | 225 | br_netpoll_disable(p); |
227 | } | 226 | } |
228 | 227 | ||
228 | static int __br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp) | ||
229 | { | ||
230 | struct netpoll *np; | ||
231 | int err; | ||
232 | |||
233 | np = kzalloc(sizeof(*p->np), gfp); | ||
234 | if (!np) | ||
235 | return -ENOMEM; | ||
236 | |||
237 | err = __netpoll_setup(np, p->dev, gfp); | ||
238 | if (err) { | ||
239 | kfree(np); | ||
240 | return err; | ||
241 | } | ||
242 | |||
243 | p->np = np; | ||
244 | return err; | ||
245 | } | ||
246 | |||
247 | int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp) | ||
248 | { | ||
249 | if (!p->br->dev->npinfo) | ||
250 | return 0; | ||
251 | |||
252 | return __br_netpoll_enable(p, gfp); | ||
253 | } | ||
254 | |||
229 | static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni, | 255 | static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni, |
230 | gfp_t gfp) | 256 | gfp_t gfp) |
231 | { | 257 | { |
@@ -236,7 +262,7 @@ static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni, | |||
236 | list_for_each_entry(p, &br->port_list, list) { | 262 | list_for_each_entry(p, &br->port_list, list) { |
237 | if (!p->dev) | 263 | if (!p->dev) |
238 | continue; | 264 | continue; |
239 | err = br_netpoll_enable(p, gfp); | 265 | err = __br_netpoll_enable(p, gfp); |
240 | if (err) | 266 | if (err) |
241 | goto fail; | 267 | goto fail; |
242 | } | 268 | } |
@@ -249,28 +275,6 @@ fail: | |||
249 | goto out; | 275 | goto out; |
250 | } | 276 | } |
251 | 277 | ||
252 | int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp) | ||
253 | { | ||
254 | struct netpoll *np; | ||
255 | int err; | ||
256 | |||
257 | if (!p->br->dev->npinfo) | ||
258 | return 0; | ||
259 | |||
260 | np = kzalloc(sizeof(*p->np), gfp); | ||
261 | if (!np) | ||
262 | return -ENOMEM; | ||
263 | |||
264 | err = __netpoll_setup(np, p->dev, gfp); | ||
265 | if (err) { | ||
266 | kfree(np); | ||
267 | return err; | ||
268 | } | ||
269 | |||
270 | p->np = np; | ||
271 | return err; | ||
272 | } | ||
273 | |||
274 | void br_netpoll_disable(struct net_bridge_port *p) | 278 | void br_netpoll_disable(struct net_bridge_port *p) |
275 | { | 279 | { |
276 | struct netpoll *np = p->np; | 280 | struct netpoll *np = p->np; |