mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
net: dsa: mv88e6xxx: introduce invalid_port_mask in mv88e6xxx_info
With this it is possible to mark certain chip ports as invalid. This is required for example for the MV88E6220 (which is in general a MV88E6250 with 7 ports) but the ports 2-4 are not routed to pins. If a user configures an invalid port, an error is returned. Signed-off-by: Hubert Feurstein <h.feurstein@gmail.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
83c5ee315f
commit
c857486a4b
2 changed files with 19 additions and 0 deletions
|
@ -2485,6 +2485,14 @@ static int mv88e6xxx_setup(struct dsa_switch *ds)
|
|||
|
||||
/* Setup Switch Port Registers */
|
||||
for (i = 0; i < mv88e6xxx_num_ports(chip); i++) {
|
||||
/* Prevent the use of an invalid port. */
|
||||
if (mv88e6xxx_is_invalid_port(chip, i) &&
|
||||
!dsa_is_unused_port(ds, i)) {
|
||||
dev_err(chip->dev, "port %d is invalid\n", i);
|
||||
err = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (dsa_is_unused_port(ds, i)) {
|
||||
err = mv88e6xxx_port_set_state(chip, i,
|
||||
BR_STATE_DISABLED);
|
||||
|
@ -4286,6 +4294,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
|
|||
*/
|
||||
.num_ports = 7,
|
||||
.num_internal_phys = 2,
|
||||
.invalid_port_mask = BIT(2) | BIT(3) | BIT(4),
|
||||
.max_vid = 4095,
|
||||
.port_base_addr = 0x08,
|
||||
.phy_base_addr = 0x00,
|
||||
|
|
|
@ -106,6 +106,11 @@ struct mv88e6xxx_info {
|
|||
unsigned int g2_irqs;
|
||||
bool pvt;
|
||||
|
||||
/* Mark certain ports as invalid. This is required for example for the
|
||||
* MV88E6220 (which is in general a MV88E6250 with 7 ports) but the
|
||||
* ports 2-4 are not routet to pins.
|
||||
*/
|
||||
unsigned int invalid_port_mask;
|
||||
/* Multi-chip Addressing Mode.
|
||||
* Some chips respond to only 2 registers of its own SMI device address
|
||||
* when it is non-zero, and use indirect access to internal registers.
|
||||
|
@ -571,6 +576,11 @@ static inline unsigned int mv88e6xxx_num_gpio(struct mv88e6xxx_chip *chip)
|
|||
return chip->info->num_gpio;
|
||||
}
|
||||
|
||||
static inline bool mv88e6xxx_is_invalid_port(struct mv88e6xxx_chip *chip, int port)
|
||||
{
|
||||
return (chip->info->invalid_port_mask & BIT(port)) != 0;
|
||||
}
|
||||
|
||||
int mv88e6xxx_read(struct mv88e6xxx_chip *chip, int addr, int reg, u16 *val);
|
||||
int mv88e6xxx_write(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val);
|
||||
int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg,
|
||||
|
|
Loading…
Reference in a new issue