Release 4.14 net/dsa/dsa.c
/*
* net/dsa/dsa.c - Hardware switch handling
* Copyright (c) 2008-2009 Marvell Semiconductor
* Copyright (c) 2013 Florian Fainelli <florian@openwrt.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#include <linux/device.h>
#include <linux/list.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_mdio.h>
#include <linux/of_platform.h>
#include <linux/of_net.h>
#include <linux/of_gpio.h>
#include <linux/netdevice.h>
#include <linux/sysfs.h>
#include <linux/phy_fixed.h>
#include <linux/gpio/consumer.h>
#include <linux/etherdevice.h>
#include "dsa_priv.h"
static struct sk_buff *dsa_slave_notag_xmit(struct sk_buff *skb,
struct net_device *dev)
{
/* Just return the original SKB */
return skb;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andrew Lunn | 22 | 100.00% | 1 | 100.00% |
Total | 22 | 100.00% | 1 | 100.00% |
static const struct dsa_device_ops none_ops = {
.xmit = dsa_slave_notag_xmit,
.rcv = NULL,
};
const struct dsa_device_ops *dsa_device_ops[DSA_TAG_LAST] = {
#ifdef CONFIG_NET_DSA_TAG_BRCM
[DSA_TAG_PROTO_BRCM] = &brcm_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_DSA
[DSA_TAG_PROTO_DSA] = &dsa_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_EDSA
[DSA_TAG_PROTO_EDSA] = &edsa_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_KSZ
[DSA_TAG_PROTO_KSZ] = &ksz_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_LAN9303
[DSA_TAG_PROTO_LAN9303] = &lan9303_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_MTK
[DSA_TAG_PROTO_MTK] = &mtk_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_QCA
[DSA_TAG_PROTO_QCA] = &qca_netdev_ops,
#endif
#ifdef CONFIG_NET_DSA_TAG_TRAILER
[DSA_TAG_PROTO_TRAILER] = &trailer_netdev_ops,
#endif
[DSA_TAG_PROTO_NONE] = &none_ops,
};
int dsa_cpu_dsa_setup(struct dsa_port *port)
{
struct device_node *port_dn = port->dn;
struct dsa_switch *ds = port->ds;
struct phy_device *phydev;
int ret, mode;
if (of_phy_is_fixed_link(port_dn)) {
ret = of_phy_register_fixed_link(port_dn);
if (ret) {
dev_err(ds->dev, "failed to register fixed PHY\n");
return ret;
}
phydev = of_phy_find_device(port_dn);
mode = of_get_phy_mode(port_dn);
if (mode < 0)
mode = PHY_INTERFACE_MODE_NA;
phydev->interface = mode;
genphy_config_init(phydev);
genphy_read_status(phydev);
if (ds->ops->adjust_link)
ds->ops->adjust_link(ds, port->index, phydev);
put_device(&phydev->mdio.dev);
}
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andrew Lunn | 113 | 76.35% | 3 | 42.86% |
Vivien Didelot | 16 | 10.81% | 2 | 28.57% |
Johan Hovold | 10 | 6.76% | 1 | 14.29% |
Florian Fainelli | 9 | 6.08% | 1 | 14.29% |
Total | 148 | 100.00% | 7 | 100.00% |
const struct dsa_device_ops *dsa_resolve_tag_protocol(int tag_protocol)
{
const struct dsa_device_ops *ops;
if (tag_protocol >= DSA_TAG_LAST)
return ERR_PTR(-EINVAL);
ops = dsa_device_ops[tag_protocol];
if (!ops)
return ERR_PTR(-ENOPROTOOPT);
return ops;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andrew Lunn | 33 | 63.46% | 2 | 66.67% |
Vivien Didelot | 19 | 36.54% | 1 | 33.33% |
Total | 52 | 100.00% | 3 | 100.00% |
int dsa_cpu_port_ethtool_setup(struct dsa_port *cpu_dp)
{
struct dsa_switch *ds = cpu_dp->ds;
struct net_device *master;
struct ethtool_ops *cpu_ops;
master = cpu_dp->netdev;
cpu_ops = devm_kzalloc(ds->dev, sizeof(*cpu_ops), GFP_KERNEL);
if (!cpu_ops)
return -ENOMEM;
memcpy(&cpu_dp->ethtool_ops, master->ethtool_ops,
sizeof(struct ethtool_ops));
cpu_dp->orig_ethtool_ops = master->ethtool_ops;
memcpy(cpu_ops, &cpu_dp->ethtool_ops,
sizeof(struct ethtool_ops));
dsa_cpu_port_ethtool_init(cpu_ops);
master->ethtool_ops = cpu_ops;
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Florian Fainelli | 117 | 100.00% | 4 | 100.00% |
Total | 117 | 100.00% | 4 | 100.00% |
void dsa_cpu_port_ethtool_restore(struct dsa_port *cpu_dp)
{
cpu_dp->netdev->ethtool_ops = cpu_dp->orig_ethtool_ops;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Florian Fainelli | 20 | 100.00% | 4 | 100.00% |
Total | 20 | 100.00% | 4 | 100.00% |
void dsa_cpu_dsa_destroy(struct dsa_port *port)
{
struct device_node *port_dn = port->dn;
if (of_phy_is_fixed_link(port_dn))
of_phy_deregister_fixed_link(port_dn);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Vivien Didelot | 21 | 67.74% | 1 | 33.33% |
Lennert Buytenhek | 10 | 32.26% | 2 | 66.67% |
Total | 31 | 100.00% | 3 | 100.00% |
static int dev_is_class(struct device *dev, void *class)
{
if (dev->class != NULL && !strcmp(dev->class->name, class))
return 1;
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Vivien Didelot | 27 | 65.85% | 1 | 33.33% |
Lennert Buytenhek | 14 | 34.15% | 2 | 66.67% |
Total | 41 | 100.00% | 3 | 100.00% |
static struct device *dev_find_class(struct device *parent, char *class)
{
if (dev_is_class(parent, class)) {
get_device(parent);
return parent;
}
return device_find_child(parent, class, dev_is_class);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Vivien Didelot | 33 | 71.74% | 2 | 40.00% |
Lennert Buytenhek | 12 | 26.09% | 2 | 40.00% |
Florian Fainelli | 1 | 2.17% | 1 | 20.00% |
Total | 46 | 100.00% | 5 | 100.00% |
struct net_device *dsa_dev_to_net_device(struct device *dev)
{
struct device *d;
d = dev_find_class(dev, "net");
if (d != NULL) {
struct net_device *nd;
nd = to_net_dev(d);
dev_hold(nd);
put_device(d);
return nd;
}
return NULL;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Vivien Didelot | 29 | 46.77% | 1 | 14.29% |
Florian Fainelli | 25 | 40.32% | 2 | 28.57% |
Lennert Buytenhek | 4 | 6.45% | 2 | 28.57% |
Neil Armstrong | 4 | 6.45% | 2 | 28.57% |
Total | 62 | 100.00% | 7 | 100.00% |
EXPORT_SYMBOL_GPL(dsa_dev_to_net_device);
static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
struct packet_type *pt, struct net_device *unused)
{
struct dsa_switch_tree *dst = dev->dsa_ptr;
struct sk_buff *nskb = NULL;
struct pcpu_sw_netstats *s;
struct dsa_slave_priv *p;
if (unlikely(dst == NULL)) {
kfree_skb(skb);
return 0;
}
skb = skb_unshare(skb, GFP_ATOMIC);
if (!skb)
return 0;
nskb = dst->rcv(skb, dev, pt);
if (!nskb) {
kfree_skb(skb);
return 0;
}
skb = nskb;
p = netdev_priv(skb->dev);
skb_push(skb, ETH_HLEN);
skb->pkt_type = PACKET_HOST;
skb->protocol = eth_type_trans(skb, skb->dev);
s = this_cpu_ptr(p->stats64);
u64_stats_update_begin(&s->syncp);
s->rx_packets++;
s->rx_bytes += skb->len;
u64_stats_update_end(&s->syncp);
netif_receive_skb(skb);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Florian Fainelli | 200 | 99.50% | 5 | 83.33% |
Florian Westphal | 1 | 0.50% | 1 | 16.67% |
Total | 201 | 100.00% | 6 | 100.00% |
#ifdef CONFIG_PM_SLEEP
static bool dsa_is_port_initialized(struct dsa_switch *ds, int p)
{
return ds->enabled_port_mask & (1 << p) && ds->ports[p].netdev;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Vivien Didelot | 34 | 100.00% | 1 | 100.00% |
Total | 34 | 100.00% | 1 | 100.00% |
int dsa_switch_suspend(struct dsa_switch *ds)
{
int i, ret = 0;
/* Suspend slave network devices */
for (i = 0; i < ds->num_ports; i++) {
if (!dsa_is_port_initialized(ds, i))
continue;
ret = dsa_slave_suspend(ds->ports[i].netdev);
if (ret)
return ret;
}
if (ds->ops->suspend)
ret = ds->ops->suspend(ds);
return ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Florian Fainelli | 89 | 100.00% | 1 | 100.00% |
Total | 89 | 100.00% | 1 | 100.00% |
EXPORT_SYMBOL_GPL(dsa_switch_suspend);
int dsa_switch_resume(struct dsa_switch *ds)
{
int i, ret = 0;
if (ds->ops->resume)
ret = ds->ops->resume(ds);
if (ret)
return ret;
/* Resume slave network devices */
for (i = 0; i < ds->num_ports; i++) {
if (!dsa_is_port_initialized(ds, i))
continue;
ret = dsa_slave_resume(ds->ports[i].netdev);
if (ret)
return ret;
}
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Florian Fainelli | 96 | 100.00% | 1 | 100.00% |
Total | 96 | 100.00% | 1 | 100.00% |
EXPORT_SYMBOL_GPL(dsa_switch_resume);
#endif
static struct packet_type dsa_pack_type __read_mostly = {
.type = cpu_to_be16(ETH_P_XDSA),
.func = dsa_switch_rcv,
};
static struct workqueue_struct *dsa_owq;
bool dsa_schedule_work(struct work_struct *work)
{
return queue_work(dsa_owq, work);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Arkadi Sharshevsky | 18 | 100.00% | 1 | 100.00% |
Total | 18 | 100.00% | 1 | 100.00% |
static int __init dsa_init_module(void)
{
int rc;
dsa_owq = alloc_ordered_workqueue("dsa_ordered",
WQ_MEM_RECLAIM);
if (!dsa_owq)
return -ENOMEM;
rc = dsa_slave_register_notifier();
if (rc)
return rc;
rc = dsa_legacy_register();
if (rc)
return rc;
dev_add_pack(&dsa_pack_type);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Ben Hutchings | 20 | 31.75% | 1 | 14.29% |
Arkadi Sharshevsky | 18 | 28.57% | 1 | 14.29% |
Vivien Didelot | 13 | 20.63% | 2 | 28.57% |
Lennert Buytenhek | 10 | 15.87% | 1 | 14.29% |
Florian Fainelli | 2 | 3.17% | 2 | 28.57% |
Total | 63 | 100.00% | 7 | 100.00% |
module_init(dsa_init_module);
static void __exit dsa_cleanup_module(void)
{
dsa_slave_unregister_notifier();
dev_remove_pack(&dsa_pack_type);
dsa_legacy_unregister();
destroy_workqueue(dsa_owq);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Lennert Buytenhek | 10 | 38.46% | 1 | 14.29% |
Arkadi Sharshevsky | 5 | 19.23% | 1 | 14.29% |
Ben Hutchings | 5 | 19.23% | 1 | 14.29% |
Vivien Didelot | 4 | 15.38% | 2 | 28.57% |
Florian Fainelli | 2 | 7.69% | 2 | 28.57% |
Total | 26 | 100.00% | 7 | 100.00% |
module_exit(dsa_cleanup_module);
MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>");
MODULE_DESCRIPTION("Driver for Distributed Switch Architecture switch chips");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:dsa");
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Florian Fainelli | 613 | 46.30% | 17 | 35.42% |
Andrew Lunn | 267 | 20.17% | 7 | 14.58% |
Vivien Didelot | 201 | 15.18% | 6 | 12.50% |
Lennert Buytenhek | 98 | 7.40% | 2 | 4.17% |
Arkadi Sharshevsky | 47 | 3.55% | 1 | 2.08% |
Ben Hutchings | 25 | 1.89% | 1 | 2.08% |
Woojung Huh | 12 | 0.91% | 1 | 2.08% |
Johan Hovold | 10 | 0.76% | 1 | 2.08% |
Juergen Beisert (or Jourgen Borleis) | 9 | 0.68% | 1 | 2.08% |
John Crispin | 9 | 0.68% | 1 | 2.08% |
Sean Wang | 9 | 0.68% | 1 | 2.08% |
Neil Armstrong | 7 | 0.53% | 3 | 6.25% |
Guenter Roeck | 6 | 0.45% | 1 | 2.08% |
Arnd Bergmann | 3 | 0.23% | 1 | 2.08% |
Tejun Heo | 3 | 0.23% | 1 | 2.08% |
Paul Gortmaker | 3 | 0.23% | 1 | 2.08% |
Rusty Russell | 1 | 0.08% | 1 | 2.08% |
Florian Westphal | 1 | 0.08% | 1 | 2.08% |
Total | 1324 | 100.00% | 48 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.