Commit c8b09808 authored by Andrew Lunn's avatar Andrew Lunn Committed by David S. Miller

net: dsa: Add a ports structure and use it in the switch structure

There are going to be more per-port members added to the switch
structure. So add a port structure and move the netdev into it.
Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Reviewed-by: default avatarVivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 149cafd7
...@@ -804,7 +804,7 @@ static int bcm_sf2_sw_fdb_dump(struct dsa_switch *ds, int port, ...@@ -804,7 +804,7 @@ static int bcm_sf2_sw_fdb_dump(struct dsa_switch *ds, int port,
int (*cb)(struct switchdev_obj *obj)) int (*cb)(struct switchdev_obj *obj))
{ {
struct bcm_sf2_priv *priv = ds_to_priv(ds); struct bcm_sf2_priv *priv = ds_to_priv(ds);
struct net_device *dev = ds->ports[port]; struct net_device *dev = ds->ports[port].netdev;
struct bcm_sf2_arl_entry results[2]; struct bcm_sf2_arl_entry results[2];
unsigned int count = 0; unsigned int count = 0;
int ret; int ret;
...@@ -1248,7 +1248,7 @@ static void bcm_sf2_sw_fixed_link_update(struct dsa_switch *ds, int port, ...@@ -1248,7 +1248,7 @@ static void bcm_sf2_sw_fixed_link_update(struct dsa_switch *ds, int port,
* state machine and make it go in PHY_FORCING state instead. * state machine and make it go in PHY_FORCING state instead.
*/ */
if (!status->link) if (!status->link)
netif_carrier_off(ds->ports[port]); netif_carrier_off(ds->ports[port].netdev);
status->duplex = 1; status->duplex = 1;
} else { } else {
status->link = 1; status->link = 1;
......
...@@ -1327,7 +1327,7 @@ static int _mv88e6xxx_port_state(struct mv88e6xxx_priv_state *ps, int port, ...@@ -1327,7 +1327,7 @@ static int _mv88e6xxx_port_state(struct mv88e6xxx_priv_state *ps, int port,
if (ret) if (ret)
return ret; return ret;
netdev_dbg(ds->ports[port], "PortState %s (was %s)\n", netdev_dbg(ds->ports[port].netdev, "PortState %s (was %s)\n",
mv88e6xxx_port_state_names[state], mv88e6xxx_port_state_names[state],
mv88e6xxx_port_state_names[oldstate]); mv88e6xxx_port_state_names[oldstate]);
} }
...@@ -1405,7 +1405,8 @@ static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port, ...@@ -1405,7 +1405,8 @@ static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port,
mutex_unlock(&ps->smi_mutex); mutex_unlock(&ps->smi_mutex);
if (err) if (err)
netdev_err(ds->ports[port], "failed to update state to %s\n", netdev_err(ds->ports[port].netdev,
"failed to update state to %s\n",
mv88e6xxx_port_state_names[stp_state]); mv88e6xxx_port_state_names[stp_state]);
} }
...@@ -1431,8 +1432,8 @@ static int _mv88e6xxx_port_pvid(struct mv88e6xxx_priv_state *ps, int port, ...@@ -1431,8 +1432,8 @@ static int _mv88e6xxx_port_pvid(struct mv88e6xxx_priv_state *ps, int port,
if (ret < 0) if (ret < 0)
return ret; return ret;
netdev_dbg(ds->ports[port], "DefaultVID %d (was %d)\n", *new, netdev_dbg(ds->ports[port].netdev,
pvid); "DefaultVID %d (was %d)\n", *new, pvid);
} }
if (old) if (old)
...@@ -1847,7 +1848,8 @@ static int _mv88e6xxx_port_fid(struct mv88e6xxx_priv_state *ps, int port, ...@@ -1847,7 +1848,8 @@ static int _mv88e6xxx_port_fid(struct mv88e6xxx_priv_state *ps, int port,
if (ret < 0) if (ret < 0)
return ret; return ret;
netdev_dbg(ds->ports[port], "FID %d (was %d)\n", *new, fid); netdev_dbg(ds->ports[port].netdev,
"FID %d (was %d)\n", *new, fid);
} }
if (old) if (old)
...@@ -2028,7 +2030,7 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port, ...@@ -2028,7 +2030,7 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
ps->ports[port].bridge_dev) ps->ports[port].bridge_dev)
break; /* same bridge, check next VLAN */ break; /* same bridge, check next VLAN */
netdev_warn(ds->ports[port], netdev_warn(ds->ports[port].netdev,
"hardware VLAN %d already used by %s\n", "hardware VLAN %d already used by %s\n",
vlan.vid, vlan.vid,
netdev_name(ps->ports[i].bridge_dev)); netdev_name(ps->ports[i].bridge_dev));
...@@ -2078,7 +2080,7 @@ static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port, ...@@ -2078,7 +2080,7 @@ static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
if (ret < 0) if (ret < 0)
goto unlock; goto unlock;
netdev_dbg(ds->ports[port], "802.1Q Mode %s (was %s)\n", netdev_dbg(ds->ports[port].netdev, "802.1Q Mode %s (was %s)\n",
mv88e6xxx_port_8021q_mode_names[new], mv88e6xxx_port_8021q_mode_names[new],
mv88e6xxx_port_8021q_mode_names[old]); mv88e6xxx_port_8021q_mode_names[old]);
} }
...@@ -2147,11 +2149,12 @@ static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port, ...@@ -2147,11 +2149,12 @@ static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid)
if (_mv88e6xxx_port_vlan_add(ps, port, vid, untagged)) if (_mv88e6xxx_port_vlan_add(ps, port, vid, untagged))
netdev_err(ds->ports[port], "failed to add VLAN %d%c\n", netdev_err(ds->ports[port].netdev,
"failed to add VLAN %d%c\n",
vid, untagged ? 'u' : 't'); vid, untagged ? 'u' : 't');
if (pvid && _mv88e6xxx_port_pvid_set(ps, port, vlan->vid_end)) if (pvid && _mv88e6xxx_port_pvid_set(ps, port, vlan->vid_end))
netdev_err(ds->ports[port], "failed to set PVID %d\n", netdev_err(ds->ports[port].netdev, "failed to set PVID %d\n",
vlan->vid_end); vlan->vid_end);
mutex_unlock(&ps->smi_mutex); mutex_unlock(&ps->smi_mutex);
...@@ -2336,7 +2339,8 @@ static void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port, ...@@ -2336,7 +2339,8 @@ static void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
mutex_lock(&ps->smi_mutex); mutex_lock(&ps->smi_mutex);
if (_mv88e6xxx_port_fdb_load(ps, port, fdb->addr, fdb->vid, state)) if (_mv88e6xxx_port_fdb_load(ps, port, fdb->addr, fdb->vid, state))
netdev_err(ds->ports[port], "failed to load MAC address\n"); netdev_err(ds->ports[port].netdev,
"failed to load MAC address\n");
mutex_unlock(&ps->smi_mutex); mutex_unlock(&ps->smi_mutex);
} }
...@@ -2537,7 +2541,8 @@ static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port) ...@@ -2537,7 +2541,8 @@ static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
for (i = 0; i < ps->info->num_ports; ++i) for (i = 0; i < ps->info->num_ports; ++i)
if (i == port || ps->ports[i].bridge_dev == bridge) if (i == port || ps->ports[i].bridge_dev == bridge)
if (_mv88e6xxx_port_based_vlan_map(ps, i)) if (_mv88e6xxx_port_based_vlan_map(ps, i))
netdev_warn(ds->ports[i], "failed to remap\n"); netdev_warn(ds->ports[i].netdev,
"failed to remap\n");
mutex_unlock(&ps->smi_mutex); mutex_unlock(&ps->smi_mutex);
} }
......
...@@ -119,6 +119,10 @@ struct dsa_switch_tree { ...@@ -119,6 +119,10 @@ struct dsa_switch_tree {
struct dsa_switch *ds[DSA_MAX_SWITCHES]; struct dsa_switch *ds[DSA_MAX_SWITCHES];
}; };
struct dsa_port {
struct net_device *netdev;
};
struct dsa_switch { struct dsa_switch {
struct device *dev; struct device *dev;
...@@ -158,8 +162,8 @@ struct dsa_switch { ...@@ -158,8 +162,8 @@ struct dsa_switch {
u32 dsa_port_mask; u32 dsa_port_mask;
u32 enabled_port_mask; u32 enabled_port_mask;
u32 phys_mii_mask; u32 phys_mii_mask;
struct dsa_port ports[DSA_MAX_PORTS];
struct mii_bus *slave_mii_bus; struct mii_bus *slave_mii_bus;
struct net_device *ports[DSA_MAX_PORTS];
}; };
static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p) static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
...@@ -174,7 +178,7 @@ static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p) ...@@ -174,7 +178,7 @@ static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)
static inline bool dsa_is_port_initialized(struct dsa_switch *ds, int p) static inline bool dsa_is_port_initialized(struct dsa_switch *ds, int p)
{ {
return ds->enabled_port_mask & (1 << p) && ds->ports[p]; return ds->enabled_port_mask & (1 << p) && ds->ports[p].netdev;
} }
static inline u8 dsa_upstream_port(struct dsa_switch *ds) static inline u8 dsa_upstream_port(struct dsa_switch *ds)
......
...@@ -437,10 +437,10 @@ static void dsa_switch_destroy(struct dsa_switch *ds) ...@@ -437,10 +437,10 @@ static void dsa_switch_destroy(struct dsa_switch *ds)
if (!(ds->enabled_port_mask & (1 << port))) if (!(ds->enabled_port_mask & (1 << port)))
continue; continue;
if (!ds->ports[port]) if (!ds->ports[port].netdev)
continue; continue;
dsa_slave_destroy(ds->ports[port]); dsa_slave_destroy(ds->ports[port].netdev);
} }
/* Remove any fixed link PHYs */ /* Remove any fixed link PHYs */
...@@ -469,7 +469,7 @@ static int dsa_switch_suspend(struct dsa_switch *ds) ...@@ -469,7 +469,7 @@ static int dsa_switch_suspend(struct dsa_switch *ds)
if (!dsa_is_port_initialized(ds, i)) if (!dsa_is_port_initialized(ds, i))
continue; continue;
ret = dsa_slave_suspend(ds->ports[i]); ret = dsa_slave_suspend(ds->ports[i].netdev);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -495,7 +495,7 @@ static int dsa_switch_resume(struct dsa_switch *ds) ...@@ -495,7 +495,7 @@ static int dsa_switch_resume(struct dsa_switch *ds)
if (!dsa_is_port_initialized(ds, i)) if (!dsa_is_port_initialized(ds, i))
continue; continue;
ret = dsa_slave_resume(ds->ports[i]); ret = dsa_slave_resume(ds->ports[i].netdev);
if (ret) if (ret)
return ret; return ret;
} }
......
...@@ -1183,12 +1183,12 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent, ...@@ -1183,12 +1183,12 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
p->old_link = -1; p->old_link = -1;
p->old_duplex = -1; p->old_duplex = -1;
ds->ports[port] = slave_dev; ds->ports[port].netdev = slave_dev;
ret = register_netdev(slave_dev); ret = register_netdev(slave_dev);
if (ret) { if (ret) {
netdev_err(master, "error %d registering interface %s\n", netdev_err(master, "error %d registering interface %s\n",
ret, slave_dev->name); ret, slave_dev->name);
ds->ports[port] = NULL; ds->ports[port].netdev = NULL;
free_netdev(slave_dev); free_netdev(slave_dev);
return ret; return ret;
} }
......
...@@ -127,7 +127,7 @@ static int brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -127,7 +127,7 @@ static int brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
source_port = brcm_tag[3] & BRCM_EG_PID_MASK; source_port = brcm_tag[3] & BRCM_EG_PID_MASK;
/* Validate port against switch setup, either the port is totally */ /* Validate port against switch setup, either the port is totally */
if (source_port >= DSA_MAX_PORTS || ds->ports[source_port] == NULL) if (source_port >= DSA_MAX_PORTS || !ds->ports[source_port].netdev)
goto out_drop; goto out_drop;
/* Remove Broadcom tag and update checksum */ /* Remove Broadcom tag and update checksum */
...@@ -140,7 +140,7 @@ static int brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -140,7 +140,7 @@ static int brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
skb_push(skb, ETH_HLEN); skb_push(skb, ETH_HLEN);
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
skb->dev = ds->ports[source_port]; skb->dev = ds->ports[source_port].netdev;
skb->protocol = eth_type_trans(skb, skb->dev); skb->protocol = eth_type_trans(skb, skb->dev);
skb->dev->stats.rx_packets++; skb->dev->stats.rx_packets++;
......
...@@ -114,7 +114,7 @@ static int dsa_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -114,7 +114,7 @@ static int dsa_rcv(struct sk_buff *skb, struct net_device *dev,
if (!ds) if (!ds)
goto out_drop; goto out_drop;
if (source_port >= DSA_MAX_PORTS || ds->ports[source_port] == NULL) if (source_port >= DSA_MAX_PORTS || !ds->ports[source_port].netdev)
goto out_drop; goto out_drop;
/* /*
...@@ -163,7 +163,7 @@ static int dsa_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -163,7 +163,7 @@ static int dsa_rcv(struct sk_buff *skb, struct net_device *dev,
2 * ETH_ALEN); 2 * ETH_ALEN);
} }
skb->dev = ds->ports[source_port]; skb->dev = ds->ports[source_port].netdev;
skb_push(skb, ETH_HLEN); skb_push(skb, ETH_HLEN);
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
skb->protocol = eth_type_trans(skb, skb->dev); skb->protocol = eth_type_trans(skb, skb->dev);
......
...@@ -127,7 +127,7 @@ static int edsa_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -127,7 +127,7 @@ static int edsa_rcv(struct sk_buff *skb, struct net_device *dev,
if (!ds) if (!ds)
goto out_drop; goto out_drop;
if (source_port >= DSA_MAX_PORTS || ds->ports[source_port] == NULL) if (source_port >= DSA_MAX_PORTS || !ds->ports[source_port].netdev)
goto out_drop; goto out_drop;
/* /*
...@@ -182,7 +182,7 @@ static int edsa_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -182,7 +182,7 @@ static int edsa_rcv(struct sk_buff *skb, struct net_device *dev,
2 * ETH_ALEN); 2 * ETH_ALEN);
} }
skb->dev = ds->ports[source_port]; skb->dev = ds->ports[source_port].netdev;
skb_push(skb, ETH_HLEN); skb_push(skb, ETH_HLEN);
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
skb->protocol = eth_type_trans(skb, skb->dev); skb->protocol = eth_type_trans(skb, skb->dev);
......
...@@ -82,12 +82,12 @@ static int trailer_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -82,12 +82,12 @@ static int trailer_rcv(struct sk_buff *skb, struct net_device *dev,
goto out_drop; goto out_drop;
source_port = trailer[1] & 7; source_port = trailer[1] & 7;
if (source_port >= DSA_MAX_PORTS || ds->ports[source_port] == NULL) if (source_port >= DSA_MAX_PORTS || !ds->ports[source_port].netdev)
goto out_drop; goto out_drop;
pskb_trim_rcsum(skb, skb->len - 4); pskb_trim_rcsum(skb, skb->len - 4);
skb->dev = ds->ports[source_port]; skb->dev = ds->ports[source_port].netdev;
skb_push(skb, ETH_HLEN); skb_push(skb, ETH_HLEN);
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
skb->protocol = eth_type_trans(skb, skb->dev); skb->protocol = eth_type_trans(skb, skb->dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment