aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorScott Feldman <sfeldma@gmail.com>2015-02-25 23:15:38 -0500
committerDavid S. Miller <davem@davemloft.net>2015-02-26 11:21:57 -0500
commite47172ab7e4176883077b454286bbd5b87b5f488 (patch)
tree8f323487c0f38547ad0231afdcb1e633994bcd31 /drivers/net/ethernet
parent4a6bb6d35980ebbf0d130c516c929ab5e60231f9 (diff)
rocker: put port in FORWADING state after leaving bridge
Cleanup the port forwarding state transitions for the cases when the port joins or leaves a bridge, or is brought admin UP or DOWN. When port is bridged, we can rely on bridge driver putting port in correct state using STP callback into port driver, regardless if bridge is enabled for STP or not. When port is not bridged, we can reuse some of the STP code to enabled or disable forwarding depending on UP or DOWN. Tested by trying all the transitions from bridge/not bridge, and UP/DOWN, and verifying port is in the correct forwarding state after each transition. Signed-off-by: Scott Feldman <sfeldma@gmail.com> Acked-by: Jiri Pirko <jiri@resnulli.us> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r--drivers/net/ethernet/rocker/rocker.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/drivers/net/ethernet/rocker/rocker.c b/drivers/net/ethernet/rocker/rocker.c
index db3e36401712..e5a15a4c4e8f 100644
--- a/drivers/net/ethernet/rocker/rocker.c
+++ b/drivers/net/ethernet/rocker/rocker.c
@@ -3324,6 +3324,26 @@ static int rocker_port_stp_update(struct rocker_port *rocker_port, u8 state)
3324 return rocker_port_fwding(rocker_port); 3324 return rocker_port_fwding(rocker_port);
3325} 3325}
3326 3326
3327static int rocker_port_fwd_enable(struct rocker_port *rocker_port)
3328{
3329 if (rocker_port_is_bridged(rocker_port))
3330 /* bridge STP will enable port */
3331 return 0;
3332
3333 /* port is not bridged, so simulate going to FORWARDING state */
3334 return rocker_port_stp_update(rocker_port, BR_STATE_FORWARDING);
3335}
3336
3337static int rocker_port_fwd_disable(struct rocker_port *rocker_port)
3338{
3339 if (rocker_port_is_bridged(rocker_port))
3340 /* bridge STP will disable port */
3341 return 0;
3342
3343 /* port is not bridged, so simulate going to DISABLED state */
3344 return rocker_port_stp_update(rocker_port, BR_STATE_DISABLED);
3345}
3346
3327static struct rocker_internal_vlan_tbl_entry * 3347static struct rocker_internal_vlan_tbl_entry *
3328rocker_internal_vlan_tbl_find(struct rocker *rocker, int ifindex) 3348rocker_internal_vlan_tbl_find(struct rocker *rocker, int ifindex)
3329{ 3349{
@@ -3416,8 +3436,6 @@ not_found:
3416static int rocker_port_open(struct net_device *dev) 3436static int rocker_port_open(struct net_device *dev)
3417{ 3437{
3418 struct rocker_port *rocker_port = netdev_priv(dev); 3438 struct rocker_port *rocker_port = netdev_priv(dev);
3419 u8 stp_state = rocker_port_is_bridged(rocker_port) ?
3420 BR_STATE_BLOCKING : BR_STATE_FORWARDING;
3421 int err; 3439 int err;
3422 3440
3423 err = rocker_port_dma_rings_init(rocker_port); 3441 err = rocker_port_dma_rings_init(rocker_port);
@@ -3440,9 +3458,9 @@ static int rocker_port_open(struct net_device *dev)
3440 goto err_request_rx_irq; 3458 goto err_request_rx_irq;
3441 } 3459 }
3442 3460
3443 err = rocker_port_stp_update(rocker_port, stp_state); 3461 err = rocker_port_fwd_enable(rocker_port);
3444 if (err) 3462 if (err)
3445 goto err_stp_update; 3463 goto err_fwd_enable;
3446 3464
3447 napi_enable(&rocker_port->napi_tx); 3465 napi_enable(&rocker_port->napi_tx);
3448 napi_enable(&rocker_port->napi_rx); 3466 napi_enable(&rocker_port->napi_rx);
@@ -3450,7 +3468,7 @@ static int rocker_port_open(struct net_device *dev)
3450 netif_start_queue(dev); 3468 netif_start_queue(dev);
3451 return 0; 3469 return 0;
3452 3470
3453err_stp_update: 3471err_fwd_enable:
3454 free_irq(rocker_msix_rx_vector(rocker_port), rocker_port); 3472 free_irq(rocker_msix_rx_vector(rocker_port), rocker_port);
3455err_request_rx_irq: 3473err_request_rx_irq:
3456 free_irq(rocker_msix_tx_vector(rocker_port), rocker_port); 3474 free_irq(rocker_msix_tx_vector(rocker_port), rocker_port);
@@ -3467,7 +3485,7 @@ static int rocker_port_stop(struct net_device *dev)
3467 rocker_port_set_enable(rocker_port, false); 3485 rocker_port_set_enable(rocker_port, false);
3468 napi_disable(&rocker_port->napi_rx); 3486 napi_disable(&rocker_port->napi_rx);
3469 napi_disable(&rocker_port->napi_tx); 3487 napi_disable(&rocker_port->napi_tx);
3470 rocker_port_stp_update(rocker_port, BR_STATE_DISABLED); 3488 rocker_port_fwd_disable(rocker_port);
3471 free_irq(rocker_msix_rx_vector(rocker_port), rocker_port); 3489 free_irq(rocker_msix_rx_vector(rocker_port), rocker_port);
3472 free_irq(rocker_msix_tx_vector(rocker_port), rocker_port); 3490 free_irq(rocker_msix_tx_vector(rocker_port), rocker_port);
3473 rocker_port_dma_rings_fini(rocker_port); 3491 rocker_port_dma_rings_fini(rocker_port);
@@ -4456,9 +4474,7 @@ static int rocker_port_bridge_join(struct rocker_port *rocker_port,
4456 rocker_port->internal_vlan_id = 4474 rocker_port->internal_vlan_id =
4457 rocker_port_internal_vlan_id_get(rocker_port, 4475 rocker_port_internal_vlan_id_get(rocker_port,
4458 bridge->ifindex); 4476 bridge->ifindex);
4459 err = rocker_port_vlan(rocker_port, 0, 0); 4477 return rocker_port_vlan(rocker_port, 0, 0);
4460
4461 return err;
4462} 4478}
4463 4479
4464static int rocker_port_bridge_leave(struct rocker_port *rocker_port) 4480static int rocker_port_bridge_leave(struct rocker_port *rocker_port)
@@ -4478,6 +4494,11 @@ static int rocker_port_bridge_leave(struct rocker_port *rocker_port)
4478 rocker_port_internal_vlan_id_get(rocker_port, 4494 rocker_port_internal_vlan_id_get(rocker_port,
4479 rocker_port->dev->ifindex); 4495 rocker_port->dev->ifindex);
4480 err = rocker_port_vlan(rocker_port, 0, 0); 4496 err = rocker_port_vlan(rocker_port, 0, 0);
4497 if (err)
4498 return err;
4499
4500 if (rocker_port->dev->flags & IFF_UP)
4501 err = rocker_port_fwd_enable(rocker_port);
4481 4502
4482 return err; 4503 return err;
4483} 4504}