aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/dsa
diff options
context:
space:
mode:
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>2016-07-18 20:45:32 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-19 22:42:00 -0400
commit5154041fa717fd8e4ef8c8144c6eaba9392bdaec (patch)
tree0dd9508bdbcb0489ed733d72952f25767b045312 /drivers/net/dsa
parentf22ab64123da18b96bf8b3d0801c802c73797a9f (diff)
net: dsa: mv88e6xxx: extract trunk mapping
The Trunk Mask and Trunk Mapping registers are two Global 2 indirect accesses to trunking configuration. Add helpers for these tables and simplify the Global 2 setup. 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.c68
-rw-r--r--drivers/net/dsa/mv88e6xxx/mv88e6xxx.h1
2 files changed, 48 insertions, 21 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 9b2525a5d958..d18e5c8ad12f 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -3151,6 +3151,49 @@ static int mv88e6xxx_g2_set_device_mapping(struct mv88e6xxx_chip *chip)
3151 return err; 3151 return err;
3152} 3152}
3153 3153
3154static int mv88e6xxx_g2_trunk_mask_write(struct mv88e6xxx_chip *chip, int num,
3155 bool hask, u16 mask)
3156{
3157 const u16 port_mask = BIT(chip->info->num_ports) - 1;
3158 u16 val = (num << 12) | (mask & port_mask);
3159
3160 if (hask)
3161 val |= GLOBAL2_TRUNK_MASK_HASK;
3162
3163 return mv88e6xxx_update(chip, REG_GLOBAL2, GLOBAL2_TRUNK_MASK, val);
3164}
3165
3166static int mv88e6xxx_g2_trunk_mapping_write(struct mv88e6xxx_chip *chip, int id,
3167 u16 map)
3168{
3169 const u16 port_mask = BIT(chip->info->num_ports) - 1;
3170 u16 val = (id << 11) | (map & port_mask);
3171
3172 return mv88e6xxx_update(chip, REG_GLOBAL2, GLOBAL2_TRUNK_MAPPING, val);
3173}
3174
3175static int mv88e6xxx_g2_clear_trunk(struct mv88e6xxx_chip *chip)
3176{
3177 const u16 port_mask = BIT(chip->info->num_ports) - 1;
3178 int i, err;
3179
3180 /* Clear all eight possible Trunk Mask vectors */
3181 for (i = 0; i < 8; ++i) {
3182 err = mv88e6xxx_g2_trunk_mask_write(chip, i, false, port_mask);
3183 if (err)
3184 return err;
3185 }
3186
3187 /* Clear all sixteen possible Trunk ID routing vectors */
3188 for (i = 0; i < 16; ++i) {
3189 err = mv88e6xxx_g2_trunk_mapping_write(chip, i, 0);
3190 if (err)
3191 return err;
3192 }
3193
3194 return 0;
3195}
3196
3154static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip) 3197static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
3155{ 3198{
3156 int err; 3199 int err;
@@ -3180,27 +3223,10 @@ static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
3180 if (err) 3223 if (err)
3181 return err; 3224 return err;
3182 3225
3183 /* Clear all trunk masks. */ 3226 /* Clear all trunk masks and mapping. */
3184 for (i = 0; i < 8; i++) { 3227 err = mv88e6xxx_g2_clear_trunk(chip);
3185 err = _mv88e6xxx_reg_write(chip, REG_GLOBAL2, 3228 if (err)
3186 GLOBAL2_TRUNK_MASK, 3229 return err;
3187 0x8000 |
3188 (i << GLOBAL2_TRUNK_MASK_NUM_SHIFT) |
3189 ((1 << chip->info->num_ports) - 1));
3190 if (err)
3191 return err;
3192 }
3193
3194 /* Clear all trunk mappings. */
3195 for (i = 0; i < 16; i++) {
3196 err = _mv88e6xxx_reg_write(
3197 chip, REG_GLOBAL2,
3198 GLOBAL2_TRUNK_MAPPING,
3199 GLOBAL2_TRUNK_MAPPING_UPDATE |
3200 (i << GLOBAL2_TRUNK_MAPPING_ID_SHIFT));
3201 if (err)
3202 return err;
3203 }
3204 3230
3205 if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) || 3231 if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
3206 mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) || 3232 mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
diff --git a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h
index 390dac5ee983..876d9ea764dd 100644
--- a/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h
+++ b/drivers/net/dsa/mv88e6xxx/mv88e6xxx.h
@@ -294,6 +294,7 @@
294#define GLOBAL2_TRUNK_MASK 0x07 294#define GLOBAL2_TRUNK_MASK 0x07
295#define GLOBAL2_TRUNK_MASK_UPDATE BIT(15) 295#define GLOBAL2_TRUNK_MASK_UPDATE BIT(15)
296#define GLOBAL2_TRUNK_MASK_NUM_SHIFT 12 296#define GLOBAL2_TRUNK_MASK_NUM_SHIFT 12
297#define GLOBAL2_TRUNK_MASK_HASK BIT(11)
297#define GLOBAL2_TRUNK_MAPPING 0x08 298#define GLOBAL2_TRUNK_MAPPING 0x08
298#define GLOBAL2_TRUNK_MAPPING_UPDATE BIT(15) 299#define GLOBAL2_TRUNK_MAPPING_UPDATE BIT(15)
299#define GLOBAL2_TRUNK_MAPPING_ID_SHIFT 11 300#define GLOBAL2_TRUNK_MAPPING_ID_SHIFT 11