aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/dsa
diff options
context:
space:
mode:
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>2016-07-18 20:45:33 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-19 22:42:01 -0400
commit47395ed28056a7ac7fbd9e7ff06bbbd66d01e256 (patch)
tree514bde7f19e0c5e165a3159d296300b4788d1581 /drivers/net/dsa
parent5154041fa717fd8e4ef8c8144c6eaba9392bdaec (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.c43
-rw-r--r--drivers/net/dsa/mv88e6xxx/mv88e6xxx.h16
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
3197static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip) 3197static 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 | \