aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding
diff options
context:
space:
mode:
authorJianhua Xie <Jianhua.Xie@freescale.com>2014-11-19 03:48:58 -0500
committerDavid S. Miller <davem@davemloft.net>2014-11-19 19:10:16 -0500
commitcb8dda90c28e2a13a007ef675a25db6a79991630 (patch)
tree120f279fb6d84f807dcfeb3fb7b829e14cf1e590 /drivers/net/bonding
parentdaaf427c6ab392bedcd018e326b2ffa1e1110cd6 (diff)
bonding: change AD_LINK_SPEED_BITMASK to enum to suport more speed
Port Key was determined as 16 bits according to the link speed, duplex and user key (which is yet not supported). In the old speed field, 5 bits are for speed [1|10|100|1000|10000]Mbps as below: -------------------------------------------------------------- Port key :| User key | Speed | Duplex| -------------------------------------------------------------- 16 6 1 0 This patch keeps the old layout, but changes AD_LINK_SPEED_BITMASK from bit type to an enum type. In this way, the speed field can expand speed type from 5 to 32. CC: Jay Vosburgh <j.vosburgh@gmail.com> CC: Veaceslav Falico <vfalico@gmail.com> CC: Andy Gospodarek <andy@greyhouse.net> CC: David S. Miller <davem@davemloft.net> Signed-off-by: Jianhua Xie <jianhua.xie@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r--drivers/net/bonding/bond_3ad.c66
1 files changed, 34 insertions, 32 deletions
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
index 0a32143af12b..6bc27d9a8670 100644
--- a/drivers/net/bonding/bond_3ad.c
+++ b/drivers/net/bonding/bond_3ad.c
@@ -79,15 +79,17 @@
79 * -------------------------------------------------------------- 79 * --------------------------------------------------------------
80 * 16 6 1 0 80 * 16 6 1 0
81 */ 81 */
82#define AD_DUPLEX_KEY_BITS 0x1 82#define AD_DUPLEX_KEY_MASKS 0x1
83#define AD_SPEED_KEY_BITS 0x3E 83#define AD_SPEED_KEY_MASKS 0x3E
84#define AD_USER_KEY_BITS 0xFFC0 84#define AD_USER_KEY_MASKS 0xFFC0
85 85
86#define AD_LINK_SPEED_BITMASK_1MBPS 0x1 86enum ad_link_speed_type {
87#define AD_LINK_SPEED_BITMASK_10MBPS 0x2 87 AD_LINK_SPEED_1MBPS = 1,
88#define AD_LINK_SPEED_BITMASK_100MBPS 0x4 88 AD_LINK_SPEED_10MBPS,
89#define AD_LINK_SPEED_BITMASK_1000MBPS 0x8 89 AD_LINK_SPEED_100MBPS,
90#define AD_LINK_SPEED_BITMASK_10000MBPS 0x10 90 AD_LINK_SPEED_1000MBPS,
91 AD_LINK_SPEED_10000MBPS
92};
91 93
92/* compare MAC addresses */ 94/* compare MAC addresses */
93#define MAC_ADDRESS_EQUAL(A, B) \ 95#define MAC_ADDRESS_EQUAL(A, B) \
@@ -240,12 +242,12 @@ static inline int __check_agg_selection_timer(struct port *port)
240 * __get_link_speed - get a port's speed 242 * __get_link_speed - get a port's speed
241 * @port: the port we're looking at 243 * @port: the port we're looking at
242 * 244 *
243 * Return @port's speed in 802.3ad bitmask format. i.e. one of: 245 * Return @port's speed in 802.3ad enum format. i.e. one of:
244 * 0, 246 * 0,
245 * %AD_LINK_SPEED_BITMASK_10MBPS, 247 * %AD_LINK_SPEED_10MBPS,
246 * %AD_LINK_SPEED_BITMASK_100MBPS, 248 * %AD_LINK_SPEED_100MBPS,
247 * %AD_LINK_SPEED_BITMASK_1000MBPS, 249 * %AD_LINK_SPEED_1000MBPS,
248 * %AD_LINK_SPEED_BITMASK_10000MBPS 250 * %AD_LINK_SPEED_10000MBPS
249 */ 251 */
250static u16 __get_link_speed(struct port *port) 252static u16 __get_link_speed(struct port *port)
251{ 253{
@@ -262,19 +264,19 @@ static u16 __get_link_speed(struct port *port)
262 else { 264 else {
263 switch (slave->speed) { 265 switch (slave->speed) {
264 case SPEED_10: 266 case SPEED_10:
265 speed = AD_LINK_SPEED_BITMASK_10MBPS; 267 speed = AD_LINK_SPEED_10MBPS;
266 break; 268 break;
267 269
268 case SPEED_100: 270 case SPEED_100:
269 speed = AD_LINK_SPEED_BITMASK_100MBPS; 271 speed = AD_LINK_SPEED_100MBPS;
270 break; 272 break;
271 273
272 case SPEED_1000: 274 case SPEED_1000:
273 speed = AD_LINK_SPEED_BITMASK_1000MBPS; 275 speed = AD_LINK_SPEED_1000MBPS;
274 break; 276 break;
275 277
276 case SPEED_10000: 278 case SPEED_10000:
277 speed = AD_LINK_SPEED_BITMASK_10000MBPS; 279 speed = AD_LINK_SPEED_10000MBPS;
278 break; 280 break;
279 281
280 default: 282 default:
@@ -625,19 +627,19 @@ static u32 __get_agg_bandwidth(struct aggregator *aggregator)
625 627
626 if (aggregator->num_of_ports) { 628 if (aggregator->num_of_ports) {
627 switch (__get_link_speed(aggregator->lag_ports)) { 629 switch (__get_link_speed(aggregator->lag_ports)) {
628 case AD_LINK_SPEED_BITMASK_1MBPS: 630 case AD_LINK_SPEED_1MBPS:
629 bandwidth = aggregator->num_of_ports; 631 bandwidth = aggregator->num_of_ports;
630 break; 632 break;
631 case AD_LINK_SPEED_BITMASK_10MBPS: 633 case AD_LINK_SPEED_10MBPS:
632 bandwidth = aggregator->num_of_ports * 10; 634 bandwidth = aggregator->num_of_ports * 10;
633 break; 635 break;
634 case AD_LINK_SPEED_BITMASK_100MBPS: 636 case AD_LINK_SPEED_100MBPS:
635 bandwidth = aggregator->num_of_ports * 100; 637 bandwidth = aggregator->num_of_ports * 100;
636 break; 638 break;
637 case AD_LINK_SPEED_BITMASK_1000MBPS: 639 case AD_LINK_SPEED_1000MBPS:
638 bandwidth = aggregator->num_of_ports * 1000; 640 bandwidth = aggregator->num_of_ports * 1000;
639 break; 641 break;
640 case AD_LINK_SPEED_BITMASK_10000MBPS: 642 case AD_LINK_SPEED_10000MBPS:
641 bandwidth = aggregator->num_of_ports * 10000; 643 bandwidth = aggregator->num_of_ports * 10000;
642 break; 644 break;
643 default: 645 default:
@@ -1011,7 +1013,7 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
1011 port->sm_rx_state); 1013 port->sm_rx_state);
1012 switch (port->sm_rx_state) { 1014 switch (port->sm_rx_state) {
1013 case AD_RX_INITIALIZE: 1015 case AD_RX_INITIALIZE:
1014 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_BITS)) 1016 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS))
1015 port->sm_vars &= ~AD_PORT_LACP_ENABLED; 1017 port->sm_vars &= ~AD_PORT_LACP_ENABLED;
1016 else 1018 else
1017 port->sm_vars |= AD_PORT_LACP_ENABLED; 1019 port->sm_vars |= AD_PORT_LACP_ENABLED;
@@ -1318,7 +1320,7 @@ static void ad_port_selection_logic(struct port *port, bool *update_slave_arr)
1318 /* update the new aggregator's parameters 1320 /* update the new aggregator's parameters
1319 * if port was responsed from the end-user 1321 * if port was responsed from the end-user
1320 */ 1322 */
1321 if (port->actor_oper_port_key & AD_DUPLEX_KEY_BITS) 1323 if (port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS)
1322 /* if port is full duplex */ 1324 /* if port is full duplex */
1323 port->aggregator->is_individual = false; 1325 port->aggregator->is_individual = false;
1324 else 1326 else
@@ -1846,7 +1848,7 @@ void bond_3ad_bind_slave(struct slave *slave)
1846 /* if the port is not full duplex, then the port should be not 1848 /* if the port is not full duplex, then the port should be not
1847 * lacp Enabled 1849 * lacp Enabled
1848 */ 1850 */
1849 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_BITS)) 1851 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS))
1850 port->sm_vars &= ~AD_PORT_LACP_ENABLED; 1852 port->sm_vars &= ~AD_PORT_LACP_ENABLED;
1851 /* actor system is the bond's system */ 1853 /* actor system is the bond's system */
1852 port->actor_system = BOND_AD_INFO(bond).system.sys_mac_addr; 1854 port->actor_system = BOND_AD_INFO(bond).system.sys_mac_addr;
@@ -2214,7 +2216,7 @@ void bond_3ad_adapter_speed_changed(struct slave *slave)
2214 2216
2215 spin_lock_bh(&slave->bond->mode_lock); 2217 spin_lock_bh(&slave->bond->mode_lock);
2216 2218
2217 port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS; 2219 port->actor_admin_port_key &= ~AD_SPEED_KEY_MASKS;
2218 port->actor_oper_port_key = port->actor_admin_port_key |= 2220 port->actor_oper_port_key = port->actor_admin_port_key |=
2219 (__get_link_speed(port) << 1); 2221 (__get_link_speed(port) << 1);
2220 netdev_dbg(slave->bond->dev, "Port %d changed speed\n", port->actor_port_number); 2222 netdev_dbg(slave->bond->dev, "Port %d changed speed\n", port->actor_port_number);
@@ -2247,7 +2249,7 @@ void bond_3ad_adapter_duplex_changed(struct slave *slave)
2247 2249
2248 spin_lock_bh(&slave->bond->mode_lock); 2250 spin_lock_bh(&slave->bond->mode_lock);
2249 2251
2250 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS; 2252 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_MASKS;
2251 port->actor_oper_port_key = port->actor_admin_port_key |= 2253 port->actor_oper_port_key = port->actor_admin_port_key |=
2252 __get_duplex(port); 2254 __get_duplex(port);
2253 netdev_dbg(slave->bond->dev, "Port %d changed duplex\n", port->actor_port_number); 2255 netdev_dbg(slave->bond->dev, "Port %d changed duplex\n", port->actor_port_number);
@@ -2289,18 +2291,18 @@ void bond_3ad_handle_link_change(struct slave *slave, char link)
2289 */ 2291 */
2290 if (link == BOND_LINK_UP) { 2292 if (link == BOND_LINK_UP) {
2291 port->is_enabled = true; 2293 port->is_enabled = true;
2292 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS; 2294 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_MASKS;
2293 port->actor_oper_port_key = port->actor_admin_port_key |= 2295 port->actor_oper_port_key = port->actor_admin_port_key |=
2294 __get_duplex(port); 2296 __get_duplex(port);
2295 port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS; 2297 port->actor_admin_port_key &= ~AD_SPEED_KEY_MASKS;
2296 port->actor_oper_port_key = port->actor_admin_port_key |= 2298 port->actor_oper_port_key = port->actor_admin_port_key |=
2297 (__get_link_speed(port) << 1); 2299 (__get_link_speed(port) << 1);
2298 } else { 2300 } else {
2299 /* link has failed */ 2301 /* link has failed */
2300 port->is_enabled = false; 2302 port->is_enabled = false;
2301 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS; 2303 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_MASKS;
2302 port->actor_oper_port_key = (port->actor_admin_port_key &= 2304 port->actor_oper_port_key = (port->actor_admin_port_key &=
2303 ~AD_SPEED_KEY_BITS); 2305 ~AD_SPEED_KEY_MASKS);
2304 } 2306 }
2305 netdev_dbg(slave->bond->dev, "Port %d changed link status to %s\n", 2307 netdev_dbg(slave->bond->dev, "Port %d changed link status to %s\n",
2306 port->actor_port_number, 2308 port->actor_port_number,