diff options
author | Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 2016-07-18 20:45:36 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-19 22:42:01 -0400 |
commit | 9bda889faed61c2b2f7c2356b6a9e577c9812cf0 (patch) | |
tree | 7dc26f7d701c314357366760df9a85bddb90d560 /drivers/net/dsa | |
parent | 63ed880dea23ddbe4a98c8f7c13ea5ad42635987 (diff) |
net: dsa: mv88e6xxx: add cap for Priority Override
Add flags and helpers to describe the presence of Priority Override
Table (POT) related registers and simplify the setup of Global 2.
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 | 36 | ||||
-rw-r--r-- | drivers/net/dsa/mv88e6xxx/mv88e6xxx.h | 7 |
2 files changed, 33 insertions, 10 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index f346ad7f16a6..34227929e388 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c | |||
@@ -3172,6 +3172,28 @@ static int mv88e6xxx_g2_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr) | |||
3172 | return err; | 3172 | return err; |
3173 | } | 3173 | } |
3174 | 3174 | ||
3175 | static int mv88e6xxx_g2_pot_write(struct mv88e6xxx_chip *chip, int pointer, | ||
3176 | u8 data) | ||
3177 | { | ||
3178 | u16 val = (pointer << 8) | (data & 0x7); | ||
3179 | |||
3180 | return mv88e6xxx_update(chip, REG_GLOBAL2, GLOBAL2_PRIO_OVERRIDE, val); | ||
3181 | } | ||
3182 | |||
3183 | static int mv88e6xxx_g2_clear_pot(struct mv88e6xxx_chip *chip) | ||
3184 | { | ||
3185 | int i, err; | ||
3186 | |||
3187 | /* Clear all sixteen possible Priority Override entries */ | ||
3188 | for (i = 0; i < 16; i++) { | ||
3189 | err = mv88e6xxx_g2_pot_write(chip, i, 0); | ||
3190 | if (err) | ||
3191 | break; | ||
3192 | } | ||
3193 | |||
3194 | return err; | ||
3195 | } | ||
3196 | |||
3175 | static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip) | 3197 | static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip) |
3176 | { | 3198 | { |
3177 | u16 reg; | 3199 | u16 reg; |
@@ -3229,17 +3251,11 @@ static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip) | |||
3229 | return err; | 3251 | return err; |
3230 | } | 3252 | } |
3231 | 3253 | ||
3232 | if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) || | 3254 | if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_POT)) { |
3233 | mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) || | ||
3234 | mv88e6xxx_6320_family(chip)) { | ||
3235 | /* Clear the priority override table. */ | 3255 | /* Clear the priority override table. */ |
3236 | for (i = 0; i < 16; i++) { | 3256 | err = mv88e6xxx_g2_clear_pot(chip); |
3237 | err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, | 3257 | if (err) |
3238 | GLOBAL2_PRIO_OVERRIDE, | 3258 | return err; |
3239 | 0x8000 | (i << 8)); | ||
3240 | if (err) | ||
3241 | return err; | ||
3242 | } | ||
3243 | } | 3259 | } |
3244 | 3260 | ||
3245 | if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) || | 3261 | if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) || |
diff --git a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h index 4e0365090b86..06b11fbf35a5 100644 --- a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h +++ b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h | |||
@@ -396,6 +396,7 @@ enum mv88e6xxx_cap { | |||
396 | MV88E6XXX_CAP_G2_PVT_ADDR, /* (0x0b) Cross Chip Port VLAN Addr */ | 396 | MV88E6XXX_CAP_G2_PVT_ADDR, /* (0x0b) Cross Chip Port VLAN Addr */ |
397 | MV88E6XXX_CAP_G2_PVT_DATA, /* (0x0c) Cross Chip Port VLAN Data */ | 397 | MV88E6XXX_CAP_G2_PVT_DATA, /* (0x0c) Cross Chip Port VLAN Data */ |
398 | MV88E6XXX_CAP_G2_SWITCH_MAC, /* (0x0d) Switch MAC/WoL/WoF */ | 398 | MV88E6XXX_CAP_G2_SWITCH_MAC, /* (0x0d) Switch MAC/WoL/WoF */ |
399 | MV88E6XXX_CAP_G2_POT, /* (0x0f) Priority Override Table */ | ||
399 | 400 | ||
400 | /* Multi-chip Addressing Mode. | 401 | /* Multi-chip Addressing Mode. |
401 | * Some chips require an indirect SMI access when their SMI device | 402 | * Some chips require an indirect SMI access when their SMI device |
@@ -442,6 +443,7 @@ enum mv88e6xxx_cap { | |||
442 | #define MV88E6XXX_FLAG_G2_PVT_ADDR BIT(MV88E6XXX_CAP_G2_PVT_ADDR) | 443 | #define MV88E6XXX_FLAG_G2_PVT_ADDR BIT(MV88E6XXX_CAP_G2_PVT_ADDR) |
443 | #define MV88E6XXX_FLAG_G2_PVT_DATA BIT(MV88E6XXX_CAP_G2_PVT_DATA) | 444 | #define MV88E6XXX_FLAG_G2_PVT_DATA BIT(MV88E6XXX_CAP_G2_PVT_DATA) |
444 | #define MV88E6XXX_FLAG_G2_SWITCH_MAC BIT(MV88E6XXX_CAP_G2_SWITCH_MAC) | 445 | #define MV88E6XXX_FLAG_G2_SWITCH_MAC BIT(MV88E6XXX_CAP_G2_SWITCH_MAC) |
446 | #define MV88E6XXX_FLAG_G2_POT BIT(MV88E6XXX_CAP_G2_POT) | ||
445 | #define MV88E6XXX_FLAG_MULTI_CHIP BIT(MV88E6XXX_CAP_MULTI_CHIP) | 447 | #define MV88E6XXX_FLAG_MULTI_CHIP BIT(MV88E6XXX_CAP_MULTI_CHIP) |
446 | #define MV88E6XXX_FLAG_PPU BIT(MV88E6XXX_CAP_PPU) | 448 | #define MV88E6XXX_FLAG_PPU BIT(MV88E6XXX_CAP_PPU) |
447 | #define MV88E6XXX_FLAG_PPU_ACTIVE BIT(MV88E6XXX_CAP_PPU_ACTIVE) | 449 | #define MV88E6XXX_FLAG_PPU_ACTIVE BIT(MV88E6XXX_CAP_PPU_ACTIVE) |
@@ -467,6 +469,7 @@ enum mv88e6xxx_cap { | |||
467 | (MV88E6XXX_FLAG_GLOBAL2 | \ | 469 | (MV88E6XXX_FLAG_GLOBAL2 | \ |
468 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ | 470 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ |
469 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | 471 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ |
472 | MV88E6XXX_FLAG_G2_POT | \ | ||
470 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 473 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
471 | MV88E6XXX_FLAG_PPU | \ | 474 | MV88E6XXX_FLAG_PPU | \ |
472 | MV88E6XXX_FLAG_STU | \ | 475 | MV88E6XXX_FLAG_STU | \ |
@@ -478,6 +481,7 @@ enum mv88e6xxx_cap { | |||
478 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ | 481 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ |
479 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | 482 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ |
480 | MV88E6XXX_FLAG_G2_SWITCH_MAC | \ | 483 | MV88E6XXX_FLAG_G2_SWITCH_MAC | \ |
484 | MV88E6XXX_FLAG_G2_POT | \ | ||
481 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 485 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
482 | MV88E6XXX_FLAG_STU | \ | 486 | MV88E6XXX_FLAG_STU | \ |
483 | MV88E6XXX_FLAG_TEMP | \ | 487 | MV88E6XXX_FLAG_TEMP | \ |
@@ -498,6 +502,7 @@ enum mv88e6xxx_cap { | |||
498 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ | 502 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ |
499 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | 503 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ |
500 | MV88E6XXX_FLAG_G2_SWITCH_MAC | \ | 504 | MV88E6XXX_FLAG_G2_SWITCH_MAC | \ |
505 | MV88E6XXX_FLAG_G2_POT | \ | ||
501 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 506 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
502 | MV88E6XXX_FLAG_PPU_ACTIVE | \ | 507 | MV88E6XXX_FLAG_PPU_ACTIVE | \ |
503 | MV88E6XXX_FLAG_SMI_PHY | \ | 508 | MV88E6XXX_FLAG_SMI_PHY | \ |
@@ -511,6 +516,7 @@ enum mv88e6xxx_cap { | |||
511 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ | 516 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ |
512 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | 517 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ |
513 | MV88E6XXX_FLAG_G2_SWITCH_MAC | \ | 518 | MV88E6XXX_FLAG_G2_SWITCH_MAC | \ |
519 | MV88E6XXX_FLAG_G2_POT | \ | ||
514 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 520 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
515 | MV88E6XXX_FLAG_PPU_ACTIVE | \ | 521 | MV88E6XXX_FLAG_PPU_ACTIVE | \ |
516 | MV88E6XXX_FLAG_SMI_PHY | \ | 522 | MV88E6XXX_FLAG_SMI_PHY | \ |
@@ -526,6 +532,7 @@ enum mv88e6xxx_cap { | |||
526 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ | 532 | MV88E6XXX_FLAG_G2_MGMT_EN_2X | \ |
527 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ | 533 | MV88E6XXX_FLAG_G2_MGMT_EN_0X | \ |
528 | MV88E6XXX_FLAG_G2_SWITCH_MAC | \ | 534 | MV88E6XXX_FLAG_G2_SWITCH_MAC | \ |
535 | MV88E6XXX_FLAG_G2_POT | \ | ||
529 | MV88E6XXX_FLAG_MULTI_CHIP | \ | 536 | MV88E6XXX_FLAG_MULTI_CHIP | \ |
530 | MV88E6XXX_FLAG_PPU_ACTIVE | \ | 537 | MV88E6XXX_FLAG_PPU_ACTIVE | \ |
531 | MV88E6XXX_FLAG_SMI_PHY | \ | 538 | MV88E6XXX_FLAG_SMI_PHY | \ |