|
|
|
@@ -677,11 +677,6 @@ static int mv88e6xxx_phy_ppu_write(struct mv88e6xxx_chip *chip, int addr,
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip)
|
|
|
|
|
{
|
|
|
|
|
return chip->info->family == MV88E6XXX_FAMILY_6065;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool mv88e6xxx_6095_family(struct mv88e6xxx_chip *chip)
|
|
|
|
|
{
|
|
|
|
|
return chip->info->family == MV88E6XXX_FAMILY_6095;
|
|
|
|
@@ -2438,6 +2433,72 @@ static int mv88e6xxx_serdes_power_on(struct mv88e6xxx_chip *chip)
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int mv88e6xxx_setup_port_dsa(struct mv88e6xxx_chip *chip, int port,
|
|
|
|
|
int upstream_port)
|
|
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
err = chip->info->ops->port_set_frame_mode(
|
|
|
|
|
chip, port, MV88E6XXX_FRAME_MODE_DSA);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
return chip->info->ops->port_set_egress_unknowns(
|
|
|
|
|
chip, port, port == upstream_port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int mv88e6xxx_setup_port_cpu(struct mv88e6xxx_chip *chip, int port)
|
|
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
switch (chip->info->tag_protocol) {
|
|
|
|
|
case DSA_TAG_PROTO_EDSA:
|
|
|
|
|
err = chip->info->ops->port_set_frame_mode(
|
|
|
|
|
chip, port, MV88E6XXX_FRAME_MODE_ETHERTYPE);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
err = mv88e6xxx_port_set_egress_mode(
|
|
|
|
|
chip, port, PORT_CONTROL_EGRESS_ADD_TAG);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
if (chip->info->ops->port_set_ether_type)
|
|
|
|
|
err = chip->info->ops->port_set_ether_type(
|
|
|
|
|
chip, port, ETH_P_EDSA);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case DSA_TAG_PROTO_DSA:
|
|
|
|
|
err = chip->info->ops->port_set_frame_mode(
|
|
|
|
|
chip, port, MV88E6XXX_FRAME_MODE_DSA);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
err = mv88e6xxx_port_set_egress_mode(
|
|
|
|
|
chip, port, PORT_CONTROL_EGRESS_UNMODIFIED);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
return chip->info->ops->port_set_egress_unknowns(chip, port, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int mv88e6xxx_setup_port_normal(struct mv88e6xxx_chip *chip, int port)
|
|
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
err = chip->info->ops->port_set_frame_mode(
|
|
|
|
|
chip, port, MV88E6XXX_FRAME_MODE_NORMAL);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
return chip->info->ops->port_set_egress_unknowns(chip, port, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
|
|
|
|
|
{
|
|
|
|
|
struct dsa_switch *ds = chip->ds;
|
|
|
|
@@ -2473,44 +2534,23 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
|
|
|
|
|
* If this is the upstream port for this switch, enable
|
|
|
|
|
* forwarding of unknown unicasts and multicasts.
|
|
|
|
|
*/
|
|
|
|
|
reg = 0;
|
|
|
|
|
if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
|
|
|
|
|
mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
|
|
|
|
|
mv88e6xxx_6095_family(chip) || mv88e6xxx_6065_family(chip) ||
|
|
|
|
|
mv88e6xxx_6185_family(chip) || mv88e6xxx_6320_family(chip))
|
|
|
|
|
reg = PORT_CONTROL_IGMP_MLD_SNOOP |
|
|
|
|
|
reg = PORT_CONTROL_IGMP_MLD_SNOOP |
|
|
|
|
|
PORT_CONTROL_USE_TAG | PORT_CONTROL_USE_IP |
|
|
|
|
|
PORT_CONTROL_STATE_FORWARDING;
|
|
|
|
|
if (dsa_is_cpu_port(ds, port)) {
|
|
|
|
|
if (chip->info->tag_protocol == DSA_TAG_PROTO_EDSA)
|
|
|
|
|
reg |= PORT_CONTROL_FRAME_ETHER_TYPE_DSA |
|
|
|
|
|
PORT_CONTROL_FORWARD_UNKNOWN_MC;
|
|
|
|
|
else
|
|
|
|
|
reg |= PORT_CONTROL_DSA_TAG;
|
|
|
|
|
reg |= PORT_CONTROL_EGRESS_ADD_TAG |
|
|
|
|
|
PORT_CONTROL_FORWARD_UNKNOWN;
|
|
|
|
|
}
|
|
|
|
|
if (dsa_is_dsa_port(ds, port)) {
|
|
|
|
|
if (mv88e6xxx_6095_family(chip) ||
|
|
|
|
|
mv88e6xxx_6185_family(chip))
|
|
|
|
|
reg |= PORT_CONTROL_DSA_TAG;
|
|
|
|
|
if (mv88e6xxx_6352_family(chip) ||
|
|
|
|
|
mv88e6xxx_6351_family(chip) ||
|
|
|
|
|
mv88e6xxx_6165_family(chip) ||
|
|
|
|
|
mv88e6xxx_6097_family(chip) ||
|
|
|
|
|
mv88e6xxx_6320_family(chip)) {
|
|
|
|
|
reg |= PORT_CONTROL_FRAME_MODE_DSA;
|
|
|
|
|
}
|
|
|
|
|
err = mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
if (port == dsa_upstream_port(ds))
|
|
|
|
|
reg |= PORT_CONTROL_FORWARD_UNKNOWN |
|
|
|
|
|
PORT_CONTROL_FORWARD_UNKNOWN_MC;
|
|
|
|
|
}
|
|
|
|
|
if (reg) {
|
|
|
|
|
err = mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
if (dsa_is_cpu_port(ds, port)) {
|
|
|
|
|
err = mv88e6xxx_setup_port_cpu(chip, port);
|
|
|
|
|
} else if (dsa_is_dsa_port(ds, port)) {
|
|
|
|
|
err = mv88e6xxx_setup_port_dsa(chip, port,
|
|
|
|
|
dsa_upstream_port(ds));
|
|
|
|
|
} else {
|
|
|
|
|
err = mv88e6xxx_setup_port_normal(chip, port);
|
|
|
|
|
}
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
/* If this port is connected to a SerDes, make sure the SerDes is not
|
|
|
|
|
* powered down.
|
|
|
|
@@ -2607,16 +2647,6 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
|
|
|
|
|
0x0000);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
/* Port Ethertype: use the Ethertype DSA Ethertype
|
|
|
|
|
* value.
|
|
|
|
|
*/
|
|
|
|
|
if (chip->info->tag_protocol == DSA_TAG_PROTO_EDSA) {
|
|
|
|
|
err = mv88e6xxx_port_write(chip, port, PORT_ETH_TYPE,
|
|
|
|
|
ETH_P_EDSA);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (chip->info->ops->port_tag_remap) {
|
|
|
|
@@ -3182,6 +3212,9 @@ static const struct mv88e6xxx_ops mv88e6085_ops = {
|
|
|
|
|
.port_set_duplex = mv88e6xxx_port_set_duplex,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6xxx_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3198,6 +3231,8 @@ static const struct mv88e6xxx_ops mv88e6095_ops = {
|
|
|
|
|
.port_set_link = mv88e6xxx_port_set_link,
|
|
|
|
|
.port_set_duplex = mv88e6xxx_port_set_duplex,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_set_frame_mode = mv88e6085_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6085_port_set_egress_unknowns,
|
|
|
|
|
.stats_snapshot = mv88e6xxx_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3213,6 +3248,9 @@ static const struct mv88e6xxx_ops mv88e6097_ops = {
|
|
|
|
|
.port_set_duplex = mv88e6xxx_port_set_duplex,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6xxx_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3229,6 +3267,8 @@ static const struct mv88e6xxx_ops mv88e6123_ops = {
|
|
|
|
|
.port_set_link = mv88e6xxx_port_set_link,
|
|
|
|
|
.port_set_duplex = mv88e6xxx_port_set_duplex,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_set_frame_mode = mv88e6085_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6085_port_set_egress_unknowns,
|
|
|
|
|
.stats_snapshot = mv88e6xxx_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3246,6 +3286,9 @@ static const struct mv88e6xxx_ops mv88e6131_ops = {
|
|
|
|
|
.port_set_duplex = mv88e6xxx_port_set_duplex,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6xxx_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3263,6 +3306,9 @@ static const struct mv88e6xxx_ops mv88e6161_ops = {
|
|
|
|
|
.port_set_duplex = mv88e6xxx_port_set_duplex,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6xxx_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3297,6 +3343,9 @@ static const struct mv88e6xxx_ops mv88e6171_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6320_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3317,6 +3366,9 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6352_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6320_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3335,6 +3387,9 @@ static const struct mv88e6xxx_ops mv88e6175_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6320_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3355,6 +3410,9 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6352_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6320_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3371,6 +3429,8 @@ static const struct mv88e6xxx_ops mv88e6185_ops = {
|
|
|
|
|
.port_set_link = mv88e6xxx_port_set_link,
|
|
|
|
|
.port_set_duplex = mv88e6xxx_port_set_duplex,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_set_frame_mode = mv88e6085_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6085_port_set_egress_unknowns,
|
|
|
|
|
.stats_snapshot = mv88e6xxx_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3389,6 +3449,9 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6390_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6390_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6390_g1_stats_snapshot,
|
|
|
|
|
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
|
|
|
|
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
|
|
|
@@ -3408,6 +3471,9 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6390x_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6390_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6390_g1_stats_snapshot,
|
|
|
|
|
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
|
|
|
|
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
|
|
|
@@ -3427,6 +3493,9 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6390_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6390_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6390_g1_stats_snapshot,
|
|
|
|
|
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
|
|
|
|
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
|
|
|
@@ -3448,6 +3517,9 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6352_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6320_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3466,6 +3538,9 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6390_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6390_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6390_g1_stats_snapshot,
|
|
|
|
|
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
|
|
|
|
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
|
|
|
@@ -3486,6 +3561,9 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
|
|
|
|
|
.port_set_duplex = mv88e6xxx_port_set_duplex,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6320_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6320_stats_get_strings,
|
|
|
|
@@ -3505,6 +3583,9 @@ static const struct mv88e6xxx_ops mv88e6321_ops = {
|
|
|
|
|
.port_set_duplex = mv88e6xxx_port_set_duplex,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6320_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6320_stats_get_strings,
|
|
|
|
@@ -3523,6 +3604,9 @@ static const struct mv88e6xxx_ops mv88e6350_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6320_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3541,6 +3625,9 @@ static const struct mv88e6xxx_ops mv88e6351_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6185_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6320_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3561,6 +3648,9 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6352_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6095_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6320_g1_stats_snapshot,
|
|
|
|
|
.stats_get_sset_count = mv88e6095_stats_get_sset_count,
|
|
|
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
|
|
@@ -3579,6 +3669,9 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6390_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6390_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6390_g1_stats_snapshot,
|
|
|
|
|
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
|
|
|
|
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
|
|
|
@@ -3598,6 +3691,9 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6390x_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6390_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6390_g1_stats_snapshot,
|
|
|
|
|
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
|
|
|
|
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
|
|
|
@@ -3617,6 +3713,9 @@ static const struct mv88e6xxx_ops mv88e6391_ops = {
|
|
|
|
|
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
|
|
|
|
|
.port_set_speed = mv88e6390_port_set_speed,
|
|
|
|
|
.port_tag_remap = mv88e6390_port_tag_remap,
|
|
|
|
|
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
|
|
|
|
|
.port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
|
|
|
|
|
.port_set_ether_type = mv88e6351_port_set_ether_type,
|
|
|
|
|
.stats_snapshot = mv88e6390_g1_stats_snapshot,
|
|
|
|
|
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
|
|
|
|
|
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
|
|
|
|
@@ -3626,6 +3725,22 @@ static const struct mv88e6xxx_ops mv88e6391_ops = {
|
|
|
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static int mv88e6xxx_verify_madatory_ops(struct mv88e6xxx_chip *chip,
|
|
|
|
|
const struct mv88e6xxx_ops *ops)
|
|
|
|
|
{
|
|
|
|
|
if (!ops->port_set_frame_mode) {
|
|
|
|
|
dev_err(chip->dev, "Missing port_set_frame_mode");
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ops->port_set_egress_unknowns) {
|
|
|
|
|
dev_err(chip->dev, "Missing port_set_egress_mode");
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const struct mv88e6xxx_info mv88e6xxx_table[] = {
|
|
|
|
|
[MV88E6085] = {
|
|
|
|
|
.prod_num = PORT_SWITCH_ID_PROD_NUM_6085,
|
|
|
|
@@ -4268,6 +4383,10 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev)
|
|
|
|
|
|
|
|
|
|
chip->info = compat_info;
|
|
|
|
|
|
|
|
|
|
err = mv88e6xxx_verify_madatory_ops(chip, chip->info->ops);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
err = mv88e6xxx_smi_init(chip, mdiodev->bus, mdiodev->addr);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|