mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 06:04:23 +08:00
net: dsa: mv88e6xxx: move device mapping setup
Move the Device Mapping setup out of the specific Global 2 code, into the top level device setup function. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b28f872dc4
commit
c7f047b6c7
@ -1026,6 +1026,29 @@ static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port,
|
||||
dev_err(ds->dev, "p%d: failed to update state\n", port);
|
||||
}
|
||||
|
||||
static int mv88e6xxx_devmap_setup(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
int target, port;
|
||||
int err;
|
||||
|
||||
if (!chip->info->global2_addr)
|
||||
return 0;
|
||||
|
||||
/* Initialize the routing port to the 32 possible target devices */
|
||||
for (target = 0; target < 32; target++) {
|
||||
port = 0x1f;
|
||||
if (target < DSA_MAX_SWITCHES)
|
||||
if (chip->ds->rtable[target] != DSA_RTABLE_NONE)
|
||||
port = chip->ds->rtable[target];
|
||||
|
||||
err = mv88e6xxx_g2_device_mapping_write(chip, target, port);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6xxx_trunk_setup(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
/* Clear all trunk masks and mapping */
|
||||
@ -2252,6 +2275,10 @@ static int mv88e6xxx_setup(struct dsa_switch *ds)
|
||||
if (err)
|
||||
goto unlock;
|
||||
|
||||
err = mv88e6xxx_devmap_setup(chip);
|
||||
if (err)
|
||||
goto unlock;
|
||||
|
||||
/* Setup PTP Hardware Clock and timestamping */
|
||||
if (chip->info->ptp_support) {
|
||||
err = mv88e6xxx_ptp_setup(chip);
|
||||
|
@ -119,37 +119,17 @@ int mv88e6352_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip)
|
||||
|
||||
/* Offset 0x06: Device Mapping Table register */
|
||||
|
||||
static int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip,
|
||||
int target, int port)
|
||||
int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip, int target,
|
||||
int port)
|
||||
{
|
||||
u16 val = (target << 8) | (port & 0xf);
|
||||
u16 val = (target << 8) | (port & 0x1f);
|
||||
/* Modern chips use 5 bits to define a device mapping port,
|
||||
* but bit 4 is reserved on older chips, so it is safe to use.
|
||||
*/
|
||||
|
||||
return mv88e6xxx_g2_update(chip, MV88E6XXX_G2_DEVICE_MAPPING, val);
|
||||
}
|
||||
|
||||
static int mv88e6xxx_g2_set_device_mapping(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
int target, port;
|
||||
int err;
|
||||
|
||||
/* Initialize the routing port to the 32 possible target devices */
|
||||
for (target = 0; target < 32; ++target) {
|
||||
port = 0xf;
|
||||
|
||||
if (target < DSA_MAX_SWITCHES) {
|
||||
port = chip->ds->rtable[target];
|
||||
if (port == DSA_RTABLE_NONE)
|
||||
port = 0xf;
|
||||
}
|
||||
|
||||
err = mv88e6xxx_g2_device_mapping_write(chip, target, port);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Offset 0x07: Trunk Mask Table register */
|
||||
|
||||
static int mv88e6xxx_g2_trunk_mask_write(struct mv88e6xxx_chip *chip, int num,
|
||||
@ -1154,10 +1134,5 @@ int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Program the DSA routing table. */
|
||||
err = mv88e6xxx_g2_set_device_mapping(chip);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -60,7 +60,8 @@
|
||||
#define MV88E6XXX_G2_DEVICE_MAPPING 0x06
|
||||
#define MV88E6XXX_G2_DEVICE_MAPPING_UPDATE 0x8000
|
||||
#define MV88E6XXX_G2_DEVICE_MAPPING_DEV_MASK 0x1f00
|
||||
#define MV88E6XXX_G2_DEVICE_MAPPING_PORT_MASK 0x000f
|
||||
#define MV88E6352_G2_DEVICE_MAPPING_PORT_MASK 0x000f
|
||||
#define MV88E6390_G2_DEVICE_MAPPING_PORT_MASK 0x001f
|
||||
|
||||
/* Offset 0x07: Trunk Mask Table Register */
|
||||
#define MV88E6XXX_G2_TRUNK_MASK 0x07
|
||||
@ -329,6 +330,9 @@ int mv88e6xxx_g2_pot_clear(struct mv88e6xxx_chip *chip);
|
||||
|
||||
int mv88e6xxx_g2_trunk_clear(struct mv88e6xxx_chip *chip);
|
||||
|
||||
int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip, int target,
|
||||
int port);
|
||||
|
||||
extern const struct mv88e6xxx_irq_ops mv88e6097_watchdog_ops;
|
||||
extern const struct mv88e6xxx_irq_ops mv88e6390_watchdog_ops;
|
||||
|
||||
@ -502,6 +506,12 @@ static inline int mv88e6xxx_g2_trunk_clear(struct mv88e6xxx_chip *chip)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip,
|
||||
int target, int port)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NET_DSA_MV88E6XXX_GLOBAL2 */
|
||||
|
||||
#endif /* _MV88E6XXX_GLOBAL2_H */
|
||||
|
Loading…
Reference in New Issue
Block a user