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