diff options
author | Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 2016-07-18 20:45:32 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-19 22:42:00 -0400 |
commit | 5154041fa717fd8e4ef8c8144c6eaba9392bdaec (patch) | |
tree | 0dd9508bdbcb0489ed733d72952f25767b045312 /drivers/net/dsa | |
parent | f22ab64123da18b96bf8b3d0801c802c73797a9f (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.c | 68 | ||||
-rw-r--r-- | drivers/net/dsa/mv88e6xxx/mv88e6xxx.h | 1 |
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 | ||
3154 | static 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 | |||
3166 | static 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 | |||
3175 | static 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 | |||
3154 | static int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip) | 3197 | static 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 |