diff options
author | Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 2016-07-18 20:45:33 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-19 22:42:01 -0400 |
commit | 47395ed28056a7ac7fbd9e7ff06bbbd66d01e256 (patch) | |
tree | 514bde7f19e0c5e165a3159d296300b4788d1581 /drivers/net/dsa | |
parent | 5154041fa717fd8e4ef8c8144c6eaba9392bdaec (diff) |
net: dsa: mv88e6xxx: add cap for MGMT Enables bits
Some switches provide a Rsvd2CPU mechanism used to choose which of the
16 reserved multicast destination addresses matching 01:80:c2:00:00:0x
should be considered as MGMT and thus forwarded to the CPU port.
Other switches extend this mechanism to also configure as MGMT the
additional 16 reserved multicast addresses matching 01:80:c2:00:00:2x.
This mechanism is exposed via two registers in Global 2, and an Rsvd2CPU
enable bit in the management register.
Newer chip (such as 88E6390) has replaced these registers with a new
indirect MGMT mechanism in Global 1.
The patch adds two MV88E6XXX_FLAG_G2_MGMT_EN_{0,2}X flags to describe
the presence of these Global 2 registers. If 88E6390 support is added, a
MV88E6XXX_FLAG_G1_MGMT_CTRL flag will be needed to setup Rsvd2CPU.
Note: all switches still support in parallel the ATU Load operation with
an MGMT Entry State to forward such frames in a less convenient way.
Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/dsa')
-rw-r--r-- | drivers/net/dsa/mv88e6xxx/chip.c | 43 | ||||
-rw-r--r-- | drivers/net/dsa/mv88e6xxx/mv88e6xxx.h | 16 |
2 files changed, 41 insertions, 18 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index d18e5c8ad12f..cf98884fc92e 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c | |||
@@ -3196,25 +3196,40 @@ static int mv88e6xxx_g2_clear_trunk(struct mv88e6xxx_chip *chip) | |||
3196 | 3196 | ||
3197 | static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip) | 3197 | static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip) |
3198 | { | 3198 | { |
3199 | u16 reg; | ||
3199 | int err; | 3200 | int err; |
3200 | int i; | 3201 | int i; |
3201 | 3202 | ||
3202 | /* Send all frames with destination addresses matching | 3203 | if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_2X)) { |
3203 | * 01:80:c2:00:00:0x to the CPU port. | 3204 | /* Consider the frames with reserved multicast destination |
3204 | */ | 3205 | * addresses matching 01:80:c2:00:00:2x as MGMT. |
3205 | err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_MGMT_EN_0X, | 3206 | */ |
3206 | 0xffff); | 3207 | err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_MGMT_EN_2X, |
3207 | if (err) | 3208 | 0xffff); |
3208 | return err; | 3209 | if (err) |
3210 | return err; | ||
3211 | } | ||
3212 | |||
3213 | if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_0X)) { | ||
3214 | /* Consider the frames with reserved multicast destination | ||
3215 | * addresses matching 01:80:c2:00:00:0x as MGMT. | ||
3216 | */ | ||
3217 | err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_MGMT_EN_0X, | ||
3218 | 0xffff); | ||
3219 | if (err) | ||
3220 | return err; | ||
3221 | } | ||
3209 | 3222 | ||
3210 | /* Ignore removed tag data on doubly tagged packets, disable | 3223 | /* Ignore removed tag data on doubly tagged packets, disable |
3211 | * flow control messages, force flow control priority to the | 3224 | * flow control messages, force flow control priority to the |
3212 | * highest, and send all special multicast frames to the CPU | 3225 | * highest, and send all special multicast frames to the CPU |
3213 | * port at the highest priority. | 3226 | * port at the highest priority. |
3214 | */ | 3227 | */ |
3215 | err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, GLOBAL2_SWITCH_MGMT, | 3228 | reg = GLOBAL2_SWITCH_MGMT_FORCE_FLOW_CTRL_PRI | (0x7 << 4); |
3216 | 0x7 | GLOBAL2_SWITCH_MGMT_RSVD2CPU | 0x70 | | 3229 | if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_0X) || |
3217 | GLOBAL2_SWITCH_MGMT_FORCE_FLOW_CTRL_PRI); | 3230 | mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_MGMT_EN_2X)) |
3231 | reg |= GLOBAL2_SWITCH_MGMT_RSVD2CPU | 0x7; | ||
3232 | err = mv88e6xxx_write(chip, REG_GLOBAL2, GLOBAL2_SWITCH_MGMT, reg); | ||
3218 | if (err) | 3233 | if (err) |
3219 | return err; | 3234 | return err; |
3220 | 3235 | ||
@@ -3231,14 +3246,6 @@ static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip) | |||
3231 | if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) || | 3246 | if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) || |
3232 | mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) || | 3247 | mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) || |
3233 | mv88e6xxx_6320_family(chip)) { | 3248 | mv88e6xxx_6320_family(chip)) { |
3234 | /* Send all frames with destination addresses matching | ||
3235 | * 01:80:c2:00:00:2x to the CPU port. | ||
3236 | */ | ||
3237 | err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, | ||
3238 | GLOBAL2_MGMT_EN_2X, 0xffff); | ||
3239 | if (err) | ||
3240 | return err; | ||
3241 | |||
3242 | /* Initialise cross-chip port VLAN table to reset | 3249 | /* Initialise cross-chip port VLAN table to reset |
3243 | * defaults. | 3250 | * defaults. |
3244 | */ | 3251 | */ |
diff --git a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h index 876d9ea764dd..d13b0b55d629 100644 --- a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h +++ b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h | |||
@@ -388,6 +388,8 @@ enum mv88e6xxx_cap { | |||
388 | * The device contains a second set of global 16-bit registers. | 388 | * The device contains a second set of global 16-bit registers. |
389 | */ | 389 | */ |
390 | MV88E6XXX_CAP_GLOBAL2, | 390 | MV88E6XXX_CAP_GLOBAL2, |
391 | MV88E6XXX_CAP_G2_MGMT_EN_2X, /* (0x02) MGMT Enable Register 2x */ | ||
392 | MV88E6XXX_CAP_G2_MGMT_EN_0X, /* (0x03) MGMT Enable Register 0x */ | ||
391 | 393 | ||
392 | /* Multi-chip Addressing Mode. | 394 | /* Multi-chip Addressing Mode. |
393 | * Some chips require an indirect SMI access when their SMI device | 395 | * Some chips require an indirect SMI access when their SMI device |
@@ -436,6 +438,8 @@ enum mv88e6xxx_cap { | |||
436 | #define MV88E6XXX_FLAG_EEE BIT(MV88E6XXX_CAP_EEE) | 438 | #define MV88E6XXX_FLAG_EEE BIT(MV88E6XXX_CAP_EEE) |
437 | #define MV88E6XXX_FLAG_EEPROM BIT(MV88E6XXX_CAP_EEPROM) | 439 | #define MV88E6XXX_FLAG_EEPROM BIT(MV88E6XXX_CAP_EEPROM) |
438 | #define MV88E6XXX_FLAG_GLOBAL2 BIT(MV88E6XXX_CAP_GLOBAL2) | 440 | #define MV88E6XXX_FLAG_GLOBAL2 BIT(MV88E6XXX_CAP_GLOBAL2) |
441 | #define MV88E6XXX_FLAG_G2_MGMT_EN_2X BIT(MV88E6XXX_CAP_G2_MGMT_EN_2X) | ||
442 | #define MV88E6XXX_FLAG_G2_MGMT_EN_0X BIT(MV88E6XXX_CAP_G2_MGMT_EN_0X) | ||
439 | #define MV88E6XXX_FLAG_MULTI_CHIP BIT(MV88E6XXX_CAP_MULTI_CHIP) | 443 | #define MV88E6XXX_FLAG_MULTI_CHIP BIT(MV88E6XXX_CAP_MULTI_CHIP) |
440 | #define MV88E6XXX_FLAG_PPU BIT(MV88E6XXX_CAP_PPU) | 444 | #define MV88E6XXX_FLAG_PPU BIT(MV88E6XXX_CAP_PPU) |
441 | #define MV88E6XXX_FLAG_PPU_ACTIVE BIT(MV88E6XXX_CAP_PPU_ACTIVE) | 445 | #define MV88E6XXX_FLAG_PPU_ACTIVE BIT(MV88E6XXX_CAP_PPU_ACTIVE) |
@@ -448,12 +452,15 @@ enum mv88e6xxx_cap { | |||
448 | 452 | ||
449 | #define MV88E6XXX_FLAGS_FAMILY_6095 \ | 453 | #define MV88E6XXX_FLAGS_FAMILY_6095 \ |
450 | (MV88E6XXX_FLAG_GLOBAL2 | \ | 454 | (MV88E6XXX_FLAG_GLOBAL2 | \ |
455 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | ||
451 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 456 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
452 | MV88E6XXX_FLAG_PPU | \ | 457 | MV88E6XXX_FLAG_PPU | \ |
453 | MV88E6XXX_FLAG_VTU) | 458 | MV88E6XXX_FLAG_VTU) |
454 | 459 | ||
455 | #define MV88E6XXX_FLAGS_FAMILY_6097 \ | 460 | #define MV88E6XXX_FLAGS_FAMILY_6097 \ |
456 | (MV88E6XXX_FLAG_GLOBAL2 | \ | 461 | (MV88E6XXX_FLAG_GLOBAL2 | \ |
462 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ | ||
463 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | ||
457 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 464 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
458 | MV88E6XXX_FLAG_PPU | \ | 465 | MV88E6XXX_FLAG_PPU | \ |
459 | MV88E6XXX_FLAG_STU | \ | 466 | MV88E6XXX_FLAG_STU | \ |
@@ -461,6 +468,8 @@ enum mv88e6xxx_cap { | |||
461 | 468 | ||
462 | #define MV88E6XXX_FLAGS_FAMILY_6165 \ | 469 | #define MV88E6XXX_FLAGS_FAMILY_6165 \ |
463 | (MV88E6XXX_FLAG_GLOBAL2 | \ | 470 | (MV88E6XXX_FLAG_GLOBAL2 | \ |
471 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ | ||
472 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | ||
464 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 473 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
465 | MV88E6XXX_FLAG_STU | \ | 474 | MV88E6XXX_FLAG_STU | \ |
466 | MV88E6XXX_FLAG_SWITCH_MAC | \ | 475 | MV88E6XXX_FLAG_SWITCH_MAC | \ |
@@ -469,6 +478,7 @@ enum mv88e6xxx_cap { | |||
469 | 478 | ||
470 | #define MV88E6XXX_FLAGS_FAMILY_6185 \ | 479 | #define MV88E6XXX_FLAGS_FAMILY_6185 \ |
471 | (MV88E6XXX_FLAG_GLOBAL2 | \ | 480 | (MV88E6XXX_FLAG_GLOBAL2 | \ |
481 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | ||
472 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 482 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
473 | MV88E6XXX_FLAG_PPU | \ | 483 | MV88E6XXX_FLAG_PPU | \ |
474 | MV88E6XXX_FLAG_VTU) | 484 | MV88E6XXX_FLAG_VTU) |
@@ -477,6 +487,8 @@ enum mv88e6xxx_cap { | |||
477 | (MV88E6XXX_FLAG_EEE | \ | 487 | (MV88E6XXX_FLAG_EEE | \ |
478 | MV88E6XXX_FLAG_EEPROM | \ | 488 | MV88E6XXX_FLAG_EEPROM | \ |
479 | MV88E6XXX_FLAG_GLOBAL2 | \ | 489 | MV88E6XXX_FLAG_GLOBAL2 | \ |
490 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ | ||
491 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | ||
480 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 492 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
481 | MV88E6XXX_FLAG_PPU_ACTIVE | \ | 493 | MV88E6XXX_FLAG_PPU_ACTIVE | \ |
482 | MV88E6XXX_FLAG_SMI_PHY | \ | 494 | MV88E6XXX_FLAG_SMI_PHY | \ |
@@ -487,6 +499,8 @@ enum mv88e6xxx_cap { | |||
487 | 499 | ||
488 | #define MV88E6XXX_FLAGS_FAMILY_6351 \ | 500 | #define MV88E6XXX_FLAGS_FAMILY_6351 \ |
489 | (MV88E6XXX_FLAG_GLOBAL2 | \ | 501 | (MV88E6XXX_FLAG_GLOBAL2 | \ |
502 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ | ||
503 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | ||
490 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 504 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
491 | MV88E6XXX_FLAG_PPU_ACTIVE | \ | 505 | MV88E6XXX_FLAG_PPU_ACTIVE | \ |
492 | MV88E6XXX_FLAG_SMI_PHY | \ | 506 | MV88E6XXX_FLAG_SMI_PHY | \ |
@@ -499,6 +513,8 @@ enum mv88e6xxx_cap { | |||
499 | (MV88E6XXX_FLAG_EEE | \ | 513 | (MV88E6XXX_FLAG_EEE | \ |
500 | MV88E6XXX_FLAG_EEPROM | \ | 514 | MV88E6XXX_FLAG_EEPROM | \ |
501 | MV88E6XXX_FLAG_GLOBAL2 | \ | 515 | MV88E6XXX_FLAG_GLOBAL2 | \ |
516 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ | ||
517 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | ||
502 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 518 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
503 | MV88E6XXX_FLAG_PPU_ACTIVE | \ | 519 | MV88E6XXX_FLAG_PPU_ACTIVE | \ |
504 | MV88E6XXX_FLAG_SMI_PHY | \ | 520 | MV88E6XXX_FLAG_SMI_PHY | \ |