net: dsa: Pass a port to get_tag_protocol()
A number of drivers want to check whether the configured CPU port is a possible configuration for enabling tagging, pass down the CPU port number so they verify that. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ee9d3429c0
commit
5ed4e3eb02
@ -541,7 +541,8 @@ EXPORT_SYMBOL(b53_disable_port);
|
||||
|
||||
void b53_brcm_hdr_setup(struct dsa_switch *ds, int port)
|
||||
{
|
||||
bool tag_en = !!(ds->ops->get_tag_protocol(ds) == DSA_TAG_PROTO_BRCM);
|
||||
bool tag_en = !!(ds->ops->get_tag_protocol(ds, port) ==
|
||||
DSA_TAG_PROTO_BRCM);
|
||||
struct b53_device *dev = ds->priv;
|
||||
u8 hdr_ctl, val;
|
||||
u16 reg;
|
||||
@ -1478,38 +1479,31 @@ void b53_br_fast_age(struct dsa_switch *ds, int port)
|
||||
}
|
||||
EXPORT_SYMBOL(b53_br_fast_age);
|
||||
|
||||
static bool b53_can_enable_brcm_tags(struct dsa_switch *ds)
|
||||
static bool b53_can_enable_brcm_tags(struct dsa_switch *ds, int port)
|
||||
{
|
||||
unsigned int brcm_tag_mask;
|
||||
unsigned int i;
|
||||
|
||||
/* Broadcom switches will accept enabling Broadcom tags on the
|
||||
* following ports: 5, 7 and 8, any other port is not supported
|
||||
*/
|
||||
brcm_tag_mask = BIT(B53_CPU_PORT_25) | BIT(7) | BIT(B53_CPU_PORT);
|
||||
|
||||
for (i = 0; i < ds->num_ports; i++) {
|
||||
if (dsa_is_cpu_port(ds, i)) {
|
||||
if (!(BIT(i) & brcm_tag_mask)) {
|
||||
dev_warn(ds->dev,
|
||||
"Port %d is not Broadcom tag capable\n",
|
||||
i);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
switch (port) {
|
||||
case B53_CPU_PORT_25:
|
||||
case 7:
|
||||
case B53_CPU_PORT:
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
dev_warn(ds->dev, "Port %d is not Broadcom tag capable\n", port);
|
||||
return false;
|
||||
}
|
||||
|
||||
static enum dsa_tag_protocol b53_get_tag_protocol(struct dsa_switch *ds)
|
||||
static enum dsa_tag_protocol b53_get_tag_protocol(struct dsa_switch *ds,
|
||||
int port)
|
||||
{
|
||||
struct b53_device *dev = ds->priv;
|
||||
|
||||
/* Older models support a different tag format that we do not
|
||||
* support in net/dsa/tag_brcm.c yet.
|
||||
*/
|
||||
if (is5325(dev) || is5365(dev) || !b53_can_enable_brcm_tags(ds))
|
||||
if (is5325(dev) || is5365(dev) || !b53_can_enable_brcm_tags(ds, port))
|
||||
return DSA_TAG_PROTO_NONE;
|
||||
else
|
||||
return DSA_TAG_PROTO_BRCM;
|
||||
|
@ -35,7 +35,8 @@
|
||||
#include "b53/b53_priv.h"
|
||||
#include "b53/b53_regs.h"
|
||||
|
||||
static enum dsa_tag_protocol bcm_sf2_sw_get_tag_protocol(struct dsa_switch *ds)
|
||||
static enum dsa_tag_protocol bcm_sf2_sw_get_tag_protocol(struct dsa_switch *ds,
|
||||
int port)
|
||||
{
|
||||
return DSA_TAG_PROTO_BRCM;
|
||||
}
|
||||
|
@ -64,7 +64,8 @@ struct dsa_loop_priv {
|
||||
|
||||
static struct phy_device *phydevs[PHY_MAX_ADDR];
|
||||
|
||||
static enum dsa_tag_protocol dsa_loop_get_protocol(struct dsa_switch *ds)
|
||||
static enum dsa_tag_protocol dsa_loop_get_protocol(struct dsa_switch *ds,
|
||||
int port)
|
||||
{
|
||||
dev_dbg(ds->dev, "%s\n", __func__);
|
||||
|
||||
|
@ -894,7 +894,8 @@ static int lan9303_check_device(struct lan9303 *chip)
|
||||
|
||||
/* ---------------------------- DSA -----------------------------------*/
|
||||
|
||||
static enum dsa_tag_protocol lan9303_get_tag_protocol(struct dsa_switch *ds)
|
||||
static enum dsa_tag_protocol lan9303_get_tag_protocol(struct dsa_switch *ds,
|
||||
int port)
|
||||
{
|
||||
return DSA_TAG_PROTO_LAN9303;
|
||||
}
|
||||
|
@ -394,7 +394,8 @@ static int ksz_setup(struct dsa_switch *ds)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static enum dsa_tag_protocol ksz_get_tag_protocol(struct dsa_switch *ds)
|
||||
static enum dsa_tag_protocol ksz_get_tag_protocol(struct dsa_switch *ds,
|
||||
int port)
|
||||
{
|
||||
return DSA_TAG_PROTO_KSZ;
|
||||
}
|
||||
|
@ -907,11 +907,11 @@ err:
|
||||
}
|
||||
|
||||
static enum dsa_tag_protocol
|
||||
mtk_get_tag_protocol(struct dsa_switch *ds)
|
||||
mtk_get_tag_protocol(struct dsa_switch *ds, int port)
|
||||
{
|
||||
struct mt7530_priv *priv = ds->priv;
|
||||
|
||||
if (!dsa_is_cpu_port(ds, MT7530_CPU_PORT)) {
|
||||
if (port != MT7530_CPU_PORT) {
|
||||
dev_warn(priv->dev,
|
||||
"port not matched with tagging CPU port\n");
|
||||
return DSA_TAG_PROTO_NONE;
|
||||
|
@ -70,7 +70,8 @@ static const char *mv88e6060_get_name(struct mii_bus *bus, int sw_addr)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static enum dsa_tag_protocol mv88e6060_get_tag_protocol(struct dsa_switch *ds)
|
||||
static enum dsa_tag_protocol mv88e6060_get_tag_protocol(struct dsa_switch *ds,
|
||||
int port)
|
||||
{
|
||||
return DSA_TAG_PROTO_TRAILER;
|
||||
}
|
||||
|
@ -3731,7 +3731,8 @@ static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static enum dsa_tag_protocol mv88e6xxx_get_tag_protocol(struct dsa_switch *ds)
|
||||
static enum dsa_tag_protocol mv88e6xxx_get_tag_protocol(struct dsa_switch *ds,
|
||||
int port)
|
||||
{
|
||||
struct mv88e6xxx_chip *chip = ds->priv;
|
||||
|
||||
|
@ -823,7 +823,7 @@ qca8k_port_fdb_dump(struct dsa_switch *ds, int port,
|
||||
}
|
||||
|
||||
static enum dsa_tag_protocol
|
||||
qca8k_get_tag_protocol(struct dsa_switch *ds)
|
||||
qca8k_get_tag_protocol(struct dsa_switch *ds, int port)
|
||||
{
|
||||
return DSA_TAG_PROTO_QCA;
|
||||
}
|
||||
|
@ -321,7 +321,8 @@ struct dsa_switch_ops {
|
||||
struct device *host_dev, int sw_addr,
|
||||
void **priv);
|
||||
|
||||
enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds);
|
||||
enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds,
|
||||
int port);
|
||||
|
||||
int (*setup)(struct dsa_switch *ds);
|
||||
u32 (*get_phy_flags)(struct dsa_switch *ds, int port);
|
||||
|
@ -539,7 +539,7 @@ static int dsa_port_parse_cpu(struct dsa_port *dp, struct net_device *master)
|
||||
const struct dsa_device_ops *tag_ops;
|
||||
enum dsa_tag_protocol tag_protocol;
|
||||
|
||||
tag_protocol = ds->ops->get_tag_protocol(ds);
|
||||
tag_protocol = ds->ops->get_tag_protocol(ds, dp->index);
|
||||
tag_ops = dsa_resolve_tag_protocol(tag_protocol);
|
||||
if (IS_ERR(tag_ops)) {
|
||||
dev_warn(ds->dev, "No tagger for this switch\n");
|
||||
|
@ -151,7 +151,7 @@ static int dsa_switch_setup_one(struct dsa_switch *ds,
|
||||
const struct dsa_device_ops *tag_ops;
|
||||
enum dsa_tag_protocol tag_protocol;
|
||||
|
||||
tag_protocol = ops->get_tag_protocol(ds);
|
||||
tag_protocol = ops->get_tag_protocol(ds, dst->cpu_dp->index);
|
||||
tag_ops = dsa_resolve_tag_protocol(tag_protocol);
|
||||
if (IS_ERR(tag_ops))
|
||||
return PTR_ERR(tag_ops);
|
||||
|
Loading…
Reference in New Issue
Block a user