Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/808388/?format=api
{ "id": 808388, "url": "http://patchwork.ozlabs.org/api/patches/808388/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170831183746.2109-3-vivien.didelot@savoirfairelinux.com/", "project": { "id": 7, "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api", "name": "Linux network development", "link_name": "netdev", "list_id": "netdev.vger.kernel.org", "list_email": "netdev@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170831183746.2109-3-vivien.didelot@savoirfairelinux.com>", "list_archive_url": null, "date": "2017-08-31T18:37:44", "name": "[net-next,2/4] net: dsa: move master ethtool ops in dsa_master", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": true, "hash": "7f425ca3ea260f9be54e11239bf29fb0b3ebf399", "submitter": { "id": 15889, "url": "http://patchwork.ozlabs.org/api/people/15889/?format=api", "name": "Vivien Didelot", "email": "vivien.didelot@savoirfairelinux.com" }, "delegate": { "id": 34, "url": "http://patchwork.ozlabs.org/api/users/34/?format=api", "username": "davem", "first_name": "David", "last_name": "Miller", "email": "davem@davemloft.net" }, "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/20170831183746.2109-3-vivien.didelot@savoirfairelinux.com/mbox/", "series": [ { "id": 892, "url": "http://patchwork.ozlabs.org/api/series/892/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=892", "date": "2017-08-31T18:37:46", "name": "net: dsa: add master interface", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/892/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/808388/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/808388/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<netdev-owner@vger.kernel.org>", "X-Original-To": "patchwork-incoming@ozlabs.org", "Delivered-To": "patchwork-incoming@ozlabs.org", "Authentication-Results": "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xjrqJ1dtpz9s7g\n\tfor <patchwork-incoming@ozlabs.org>;\n\tFri, 1 Sep 2017 04:43:24 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751833AbdHaSnW (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tThu, 31 Aug 2017 14:43:22 -0400", "from mail.savoirfairelinux.com ([208.88.110.44]:36904 \"EHLO\n\tmail.savoirfairelinux.com\" rhost-flags-OK-OK-OK-OK) by\n\tvger.kernel.org with ESMTP id S1751607AbdHaSm0 (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Thu, 31 Aug 2017 14:42:26 -0400", "from localhost (localhost [127.0.0.1])\n\tby mail.savoirfairelinux.com (Postfix) with ESMTP id 1574C9C19EF;\n\tThu, 31 Aug 2017 14:42:26 -0400 (EDT)", "from mail.savoirfairelinux.com ([127.0.0.1])\n\tby localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavisd-new,\n\tport 10032)\n\twith ESMTP id 7scETijEAZBm; Thu, 31 Aug 2017 14:42:25 -0400 (EDT)", "from localhost (localhost [127.0.0.1])\n\tby mail.savoirfairelinux.com (Postfix) with ESMTP id 0A49D9C1A35;\n\tThu, 31 Aug 2017 14:42:25 -0400 (EDT)", "from mail.savoirfairelinux.com ([127.0.0.1])\n\tby localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavisd-new,\n\tport 10026)\n\twith ESMTP id BqG4BMfaa3YS; Thu, 31 Aug 2017 14:42:24 -0400 (EDT)", "from weeman.mtl.sfl (unknown [192.168.49.192])\n\tby mail.savoirfairelinux.com (Postfix) with ESMTPSA id C8C009C19EF;\n\tThu, 31 Aug 2017 14:42:24 -0400 (EDT)" ], "X-Virus-Scanned": "amavisd-new at mail.savoirfairelinux.com", "From": "Vivien Didelot <vivien.didelot@savoirfairelinux.com>", "To": "netdev@vger.kernel.org", "Cc": "linux-kernel@vger.kernel.org, kernel@savoirfairelinux.com,\n\t\"David S. Miller\" <davem@davemloft.net>,\n\tFlorian Fainelli <f.fainelli@gmail.com>, Andrew Lunn <andrew@lunn.ch>,\n\tVivien Didelot <vivien.didelot@savoirfairelinux.com>", "Subject": "[PATCH net-next 2/4] net: dsa: move master ethtool ops in dsa_master", "Date": "Thu, 31 Aug 2017 14:37:44 -0400", "Message-Id": "<20170831183746.2109-3-vivien.didelot@savoirfairelinux.com>", "X-Mailer": "git-send-email 2.14.1", "In-Reply-To": "<20170831183746.2109-1-vivien.didelot@savoirfairelinux.com>", "References": "<20170831183746.2109-1-vivien.didelot@savoirfairelinux.com>", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.org" }, "content": "The copy of the master netdev ethtool_ops is currently stored in the\ndsa_port structure, but it is specific to the DSA master (CPU) port.\n\nMove it in the new dsa_master structure. While modifying the ethtool\nfunctions to take this structure as argument, move them in a new\nmaster.c DSA core file.\n\nAlso the ethtool ops were the only remaining users for\nmaster->port->netdev thus remove this assignment now.\n\nSigned-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>\n---\n include/net/dsa.h | 9 ++---\n net/dsa/dsa.c | 28 --------------\n net/dsa/dsa2.c | 4 +-\n net/dsa/dsa_priv.h | 5 +--\n net/dsa/legacy.c | 4 +-\n net/dsa/master.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++-\n net/dsa/slave.c | 80 ----------------------------------------\n 7 files changed, 114 insertions(+), 121 deletions(-)", "diff": "diff --git a/include/net/dsa.h b/include/net/dsa.h\nindex 217e36cfc69f..f4a5afc4255b 100644\n--- a/include/net/dsa.h\n+++ b/include/net/dsa.h\n@@ -176,6 +176,10 @@ struct dsa_mall_tc_entry {\n struct dsa_master {\n \tstruct dsa_port *port;\n \tstruct net_device *netdev;\n+\n+\t/* Original copy of the master netdev ethtool_ops */\n+\tconst struct ethtool_ops *orig_ethtool_ops;\n+\tstruct ethtool_ops ethtool_ops;\n };\n \n struct dsa_port {\n@@ -189,11 +193,6 @@ struct dsa_port {\n \tu8\t\t\tstp_state;\n \tstruct net_device\t*bridge_dev;\n \tstruct devlink_port\tdevlink_port;\n-\t/*\n-\t * Original copy of the master netdev ethtool_ops\n-\t */\n-\tstruct ethtool_ops\tethtool_ops;\n-\tconst struct ethtool_ops *orig_ethtool_ops;\n };\n \n struct dsa_switch {\ndiff --git a/net/dsa/dsa.c b/net/dsa/dsa.c\nindex 03c58b0eb082..81c852e32821 100644\n--- a/net/dsa/dsa.c\n+++ b/net/dsa/dsa.c\n@@ -112,34 +112,6 @@ const struct dsa_device_ops *dsa_resolve_tag_protocol(int tag_protocol)\n \treturn ops;\n }\n \n-int dsa_cpu_port_ethtool_setup(struct dsa_port *cpu_dp)\n-{\n-\tstruct dsa_switch *ds = cpu_dp->ds;\n-\tstruct net_device *master;\n-\tstruct ethtool_ops *cpu_ops;\n-\n-\tmaster = cpu_dp->netdev;\n-\n-\tcpu_ops = devm_kzalloc(ds->dev, sizeof(*cpu_ops), GFP_KERNEL);\n-\tif (!cpu_ops)\n-\t\treturn -ENOMEM;\n-\n-\tmemcpy(&cpu_dp->ethtool_ops, master->ethtool_ops,\n-\t sizeof(struct ethtool_ops));\n-\tcpu_dp->orig_ethtool_ops = master->ethtool_ops;\n-\tmemcpy(cpu_ops, &cpu_dp->ethtool_ops,\n-\t sizeof(struct ethtool_ops));\n-\tdsa_cpu_port_ethtool_init(cpu_ops);\n-\tmaster->ethtool_ops = cpu_ops;\n-\n-\treturn 0;\n-}\n-\n-void dsa_cpu_port_ethtool_restore(struct dsa_port *cpu_dp)\n-{\n-\tcpu_dp->netdev->ethtool_ops = cpu_dp->orig_ethtool_ops;\n-}\n-\n void dsa_cpu_dsa_destroy(struct dsa_port *port)\n {\n \tstruct device_node *port_dn = port->dn;\ndiff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c\nindex 4c4381b7aafb..d60f681b96cc 100644\n--- a/net/dsa/dsa2.c\n+++ b/net/dsa/dsa2.c\n@@ -434,7 +434,7 @@ static int dsa_dst_apply(struct dsa_switch_tree *dst)\n \t}\n \n \tif (dst->master) {\n-\t\terr = dsa_cpu_port_ethtool_setup(dst->master->port);\n+\t\terr = dsa_master_ethtool_setup(dst->master);\n \t\tif (err)\n \t\t\treturn err;\n \t}\n@@ -475,7 +475,7 @@ static void dsa_dst_unapply(struct dsa_switch_tree *dst)\n \t}\n \n \tif (dst->master) {\n-\t\tdsa_cpu_port_ethtool_restore(dst->master->port);\n+\t\tdsa_master_ethtool_restore(dst->master);\n \t\tdst->master = NULL;\n \t}\n \ndiff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h\nindex 70f576b3d6fb..4fa14b4305b9 100644\n--- a/net/dsa/dsa_priv.h\n+++ b/net/dsa/dsa_priv.h\n@@ -97,8 +97,6 @@ struct dsa_slave_priv {\n int dsa_cpu_dsa_setup(struct dsa_port *port);\n void dsa_cpu_dsa_destroy(struct dsa_port *dport);\n const struct dsa_device_ops *dsa_resolve_tag_protocol(int tag_protocol);\n-int dsa_cpu_port_ethtool_setup(struct dsa_port *cpu_dp);\n-void dsa_cpu_port_ethtool_restore(struct dsa_port *cpu_dp);\n bool dsa_schedule_work(struct work_struct *work);\n \n /* legacy.c */\n@@ -115,6 +113,8 @@ int dsa_legacy_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],\n /* master.c */\n struct dsa_master *dsa_master_create(struct dsa_port *port,\n \t\t\t\t struct net_device *netdev);\n+int dsa_master_ethtool_setup(struct dsa_master *master);\n+void dsa_master_ethtool_restore(struct dsa_master *master);\n \n /* port.c */\n int dsa_port_set_state(struct dsa_port *dp, u8 state,\n@@ -143,7 +143,6 @@ int dsa_port_vlan_del(struct dsa_port *dp,\n /* slave.c */\n extern const struct dsa_device_ops notag_netdev_ops;\n void dsa_slave_mii_bus_init(struct dsa_switch *ds);\n-void dsa_cpu_port_ethtool_init(struct ethtool_ops *ops);\n int dsa_slave_create(struct dsa_port *port, const char *name);\n void dsa_slave_destroy(struct net_device *slave_dev);\n int dsa_slave_suspend(struct net_device *slave_dev);\ndiff --git a/net/dsa/legacy.c b/net/dsa/legacy.c\nindex 7a21415d2a81..acd81c488bf4 100644\n--- a/net/dsa/legacy.c\n+++ b/net/dsa/legacy.c\n@@ -209,7 +209,7 @@ static int dsa_switch_setup_one(struct dsa_switch *ds,\n \t\tnetdev_err(master, \"[%d] : can't configure CPU and DSA ports\\n\",\n \t\t\t index);\n \n-\tret = dsa_cpu_port_ethtool_setup(ds->dst->master->port);\n+\tret = dsa_master_ethtool_setup(ds->dst->master);\n \tif (ret)\n \t\treturn ret;\n \n@@ -689,7 +689,7 @@ static void dsa_remove_dst(struct dsa_switch_tree *dst)\n \t\t\tdsa_switch_destroy(ds);\n \t}\n \n-\tdsa_cpu_port_ethtool_restore(dst->master->port);\n+\tdsa_master_ethtool_restore(dst->master);\n \n \tdev_put(dst->master->netdev);\n }\ndiff --git a/net/dsa/master.c b/net/dsa/master.c\nindex 294b82b9c114..9ecce3e7c8df 100644\n--- a/net/dsa/master.c\n+++ b/net/dsa/master.c\n@@ -12,6 +12,110 @@\n \n #include \"dsa_priv.h\"\n \n+static void dsa_master_get_ethtool_stats(struct net_device *dev,\n+\t\t\t\t\t struct ethtool_stats *stats,\n+\t\t\t\t\t uint64_t *data)\n+{\n+\tstruct dsa_switch_tree *dst = dev->dsa_ptr;\n+\tstruct dsa_master *master = dst->master;\n+\tstruct dsa_port *port = master->port;\n+\tstruct dsa_switch *ds = port->ds;\n+\tint count = 0;\n+\n+\tif (master->ethtool_ops.get_sset_count) {\n+\t\tcount = master->ethtool_ops.get_sset_count(dev, ETH_SS_STATS);\n+\t\tmaster->ethtool_ops.get_ethtool_stats(dev, stats, data);\n+\t}\n+\n+\tif (ds->ops->get_ethtool_stats)\n+\t\tds->ops->get_ethtool_stats(ds, port->index, data + count);\n+}\n+\n+static int dsa_master_get_sset_count(struct net_device *dev, int sset)\n+{\n+\tstruct dsa_switch_tree *dst = dev->dsa_ptr;\n+\tstruct dsa_master *master = dst->master;\n+\tstruct dsa_port *port = master->port;\n+\tstruct dsa_switch *ds = port->ds;\n+\tint count = 0;\n+\n+\tif (master->ethtool_ops.get_sset_count)\n+\t\tcount += master->ethtool_ops.get_sset_count(dev, sset);\n+\n+\tif (sset == ETH_SS_STATS && ds->ops->get_sset_count)\n+\t\tcount += ds->ops->get_sset_count(ds);\n+\n+\treturn count;\n+}\n+\n+static void dsa_master_get_strings(struct net_device *dev, uint32_t stringset,\n+\t\t\t\t uint8_t *data)\n+{\n+\tstruct dsa_switch_tree *dst = dev->dsa_ptr;\n+\tstruct dsa_master *master = dst->master;\n+\tstruct dsa_port *port = master->port;\n+\tstruct dsa_switch *ds = port->ds;\n+\tint len = ETH_GSTRING_LEN;\n+\tint mcount = 0, count;\n+\tunsigned int i;\n+\tuint8_t pfx[4];\n+\tuint8_t *ndata;\n+\n+\tsnprintf(pfx, sizeof(pfx), \"p%.2d\", port->index);\n+\t/* We do not want to be NULL-terminated, since this is a prefix */\n+\tpfx[sizeof(pfx) - 1] = '_';\n+\n+\tif (master->ethtool_ops.get_sset_count) {\n+\t\tmcount = master->ethtool_ops.get_sset_count(dev, ETH_SS_STATS);\n+\t\tmaster->ethtool_ops.get_strings(dev, stringset, data);\n+\t}\n+\n+\tif (stringset == ETH_SS_STATS && ds->ops->get_strings) {\n+\t\tndata = data + mcount * len;\n+\t\t/* This function copies ETH_GSTRINGS_LEN bytes, we will mangle\n+\t\t * the output after to prepend our CPU port prefix we\n+\t\t * constructed earlier\n+\t\t */\n+\t\tds->ops->get_strings(ds, port->index, ndata);\n+\t\tcount = ds->ops->get_sset_count(ds);\n+\t\tfor (i = 0; i < count; i++) {\n+\t\t\tmemmove(ndata + (i * len + sizeof(pfx)),\n+\t\t\t\tndata + i * len, len - sizeof(pfx));\n+\t\t\tmemcpy(ndata + i * len, pfx, sizeof(pfx));\n+\t\t}\n+\t}\n+}\n+\n+int dsa_master_ethtool_setup(struct dsa_master *master)\n+{\n+\tstruct device *dev = master->port->ds->dev;\n+\tstruct net_device *netdev = master->netdev;\n+\tstruct ethtool_ops *ops;\n+\n+\tops = devm_kzalloc(dev, sizeof(*ops), GFP_KERNEL);\n+\tif (!ops)\n+\t\treturn -ENOMEM;\n+\n+\t/* Back up the original master netdev ethtool_ops */\n+\tmaster->orig_ethtool_ops = netdev->ethtool_ops;\n+\tmemcpy(&master->ethtool_ops, master->orig_ethtool_ops, sizeof(*ops));\n+\tmemcpy(ops, &master->ethtool_ops, sizeof(*ops));\n+\n+\t/* Change the master netdev ethtool_ops */\n+\tops->get_sset_count = dsa_master_get_sset_count;\n+\tops->get_ethtool_stats = dsa_master_get_ethtool_stats;\n+\tops->get_strings = dsa_master_get_strings;\n+\tnetdev->ethtool_ops = ops;\n+\n+\treturn 0;\n+}\n+\n+void dsa_master_ethtool_restore(struct dsa_master *master)\n+{\n+\tmaster->netdev->ethtool_ops = master->orig_ethtool_ops;\n+\tmaster->orig_ethtool_ops = NULL;\n+}\n+\n struct dsa_master *dsa_master_create(struct dsa_port *port,\n \t\t\t\t struct net_device *netdev)\n {\n@@ -24,7 +128,6 @@ struct dsa_master *dsa_master_create(struct dsa_port *port,\n \n \tmaster->port = port;\n \tmaster->netdev = netdev;\n-\tmaster->port->netdev = netdev;\n \n \treturn master;\n }\ndiff --git a/net/dsa/slave.c b/net/dsa/slave.c\nindex 6d47eca47a0c..99f9e48a6cee 100644\n--- a/net/dsa/slave.c\n+++ b/net/dsa/slave.c\n@@ -567,79 +567,6 @@ static void dsa_slave_get_strings(struct net_device *dev,\n \t}\n }\n \n-static void dsa_cpu_port_get_ethtool_stats(struct net_device *dev,\n-\t\t\t\t\t struct ethtool_stats *stats,\n-\t\t\t\t\t uint64_t *data)\n-{\n-\tstruct dsa_switch_tree *dst = dev->dsa_ptr;\n-\tstruct dsa_port *cpu_dp = dsa_get_cpu_port(dst);\n-\tstruct dsa_switch *ds = cpu_dp->ds;\n-\ts8 cpu_port = cpu_dp->index;\n-\tint count = 0;\n-\n-\tif (cpu_dp->ethtool_ops.get_sset_count) {\n-\t\tcount = cpu_dp->ethtool_ops.get_sset_count(dev, ETH_SS_STATS);\n-\t\tcpu_dp->ethtool_ops.get_ethtool_stats(dev, stats, data);\n-\t}\n-\n-\tif (ds->ops->get_ethtool_stats)\n-\t\tds->ops->get_ethtool_stats(ds, cpu_port, data + count);\n-}\n-\n-static int dsa_cpu_port_get_sset_count(struct net_device *dev, int sset)\n-{\n-\tstruct dsa_switch_tree *dst = dev->dsa_ptr;\n-\tstruct dsa_port *cpu_dp = dsa_get_cpu_port(dst);\n-\tstruct dsa_switch *ds = cpu_dp->ds;\n-\tint count = 0;\n-\n-\tif (cpu_dp->ethtool_ops.get_sset_count)\n-\t\tcount += cpu_dp->ethtool_ops.get_sset_count(dev, sset);\n-\n-\tif (sset == ETH_SS_STATS && ds->ops->get_sset_count)\n-\t\tcount += ds->ops->get_sset_count(ds);\n-\n-\treturn count;\n-}\n-\n-static void dsa_cpu_port_get_strings(struct net_device *dev,\n-\t\t\t\t uint32_t stringset, uint8_t *data)\n-{\n-\tstruct dsa_switch_tree *dst = dev->dsa_ptr;\n-\tstruct dsa_port *cpu_dp = dsa_get_cpu_port(dst);\n-\tstruct dsa_switch *ds = cpu_dp->ds;\n-\ts8 cpu_port = cpu_dp->index;\n-\tint len = ETH_GSTRING_LEN;\n-\tint mcount = 0, count;\n-\tunsigned int i;\n-\tuint8_t pfx[4];\n-\tuint8_t *ndata;\n-\n-\tsnprintf(pfx, sizeof(pfx), \"p%.2d\", cpu_port);\n-\t/* We do not want to be NULL-terminated, since this is a prefix */\n-\tpfx[sizeof(pfx) - 1] = '_';\n-\n-\tif (cpu_dp->ethtool_ops.get_sset_count) {\n-\t\tmcount = cpu_dp->ethtool_ops.get_sset_count(dev, ETH_SS_STATS);\n-\t\tcpu_dp->ethtool_ops.get_strings(dev, stringset, data);\n-\t}\n-\n-\tif (stringset == ETH_SS_STATS && ds->ops->get_strings) {\n-\t\tndata = data + mcount * len;\n-\t\t/* This function copies ETH_GSTRINGS_LEN bytes, we will mangle\n-\t\t * the output after to prepend our CPU port prefix we\n-\t\t * constructed earlier\n-\t\t */\n-\t\tds->ops->get_strings(ds, cpu_port, ndata);\n-\t\tcount = ds->ops->get_sset_count(ds);\n-\t\tfor (i = 0; i < count; i++) {\n-\t\t\tmemmove(ndata + (i * len + sizeof(pfx)),\n-\t\t\t\tndata + i * len, len - sizeof(pfx));\n-\t\t\tmemcpy(ndata + i * len, pfx, sizeof(pfx));\n-\t\t}\n-\t}\n-}\n-\n static void dsa_slave_get_ethtool_stats(struct net_device *dev,\n \t\t\t\t\tstruct ethtool_stats *stats,\n \t\t\t\t\tuint64_t *data)\n@@ -976,13 +903,6 @@ static void dsa_slave_get_stats64(struct net_device *dev,\n \t}\n }\n \n-void dsa_cpu_port_ethtool_init(struct ethtool_ops *ops)\n-{\n-\tops->get_sset_count = dsa_cpu_port_get_sset_count;\n-\tops->get_ethtool_stats = dsa_cpu_port_get_ethtool_stats;\n-\tops->get_strings = dsa_cpu_port_get_strings;\n-}\n-\n static int dsa_slave_get_rxnfc(struct net_device *dev,\n \t\t\t struct ethtool_rxnfc *nfc, u32 *rule_locs)\n {\n", "prefixes": [ "net-next", "2/4" ] }