From patchwork Fri Dec 14 16:48:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Frank Wunderlich X-Patchwork-Id: 1013632 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=public-files.de Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Gc416jSyz9s4s for ; Sat, 15 Dec 2018 03:50:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729895AbeLNQuY (ORCPT ); Fri, 14 Dec 2018 11:50:24 -0500 Received: from mout.gmx.net ([212.227.15.18]:44455 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729551AbeLNQuY (ORCPT ); Fri, 14 Dec 2018 11:50:24 -0500 Received: from localhost.localdomain ([91.14.94.237]) by mail.gmx.com (mrgmx002 [212.227.17.190]) with ESMTPSA (Nemesis) id 0LiDnn-1hAUvr2Chf-00nMYy; Fri, 14 Dec 2018 17:49:12 +0100 From: Frank Wunderlich To: Matthias Brugger , netdev@vger.kernel.org, Sean Wang , Andrew Lunn , linux-mediatek@lists.infradead.org Cc: Frank Wunderlich Subject: [PATCH 2/8] net: dsa: add helper functions Date: Fri, 14 Dec 2018 17:48:41 +0100 Message-Id: <20181214164847.4851-3-frank-w@public-files.de> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181214164847.4851-1-frank-w@public-files.de> References: <20181214164847.4851-1-frank-w@public-files.de> X-Provags-ID: V03:K1:8Y/ysQdttt6vSxa2xsYkPMW3601sKcRiBd9NtuKZEK+iwZfpbBd F3uz3d40RnfxDRhC7wFHBONNxLPk0H2YByh9cGbgfrpyP9MBgDXyQW+m4HRMHOtHW+s0Ppj b4O0wDafSK0GkkMg9ZN4SbmFaj1FE9aEkjHhvy075X/b/xhGbCAMpBcV8sENXVgqdtW2LdL 8LiGkRwdmudQm93KeKmAw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:8+OtX6gulfg=:FrnDYBRqk3gqmVd/sng5ow o09uGT+dlh1AO+W35asgGluREoFtoqK7o46hy8l8sMC/ef6bj6R0lvRpMG/bQVxWNbmlMtwBl RYZOe1l6WKs9SoFEymccRweX6vsPXxlfoUThypvIameGeJ+kyp6y0SzL6JNOb8zdmZwalg7Mh NwIbcMWhXuOLCtqPsfyvtfeXr8uWEFbzmHcyyx6N0z/LUQ7uSwYnpHecg4ChK+qCcA9IPnYO8 4Fc8oiV6DtdmJ/vWXsgHaldQryjzg2Busel4TahZDEVtomxatoQSBKUTDx51jHYWlTFcdNmg1 fED+XQNPNusk+csqpnHf2dzg/AYN7Ow5ol2HY9ed0l4rURpEB3AvwsOaLi28nsGcvc/R4/0hq tNkncK0mZHyA32T7IPSRkm77il6FwwyRE9NZ7hI2LfRjMAOKjskxrawef31vWrCzJygtmuUhy Tuiu6/yOT0JWQ0zTqcMtTEfcSJjhNsNpy5zxkQgVmT4/WK2HZD+nrMV7JINHOT6lksanrFL8i /DyH5Z3DdmnVPFGvEBQFUPRxFXRkWQhsin5yHkXLrvIaJArwZ5qTZkoduN7oFlFpwcEaHiMuK tM2KtNuMFoRkiwLT5VYhP1Qizcx7d6gB7G0tzh8MV/dJ7iR6aBFTvjBg/Ar+NhgE3JRud6qJX DA+0okYwzr5dG5xTT1Xjmbc+GYLDXCUkc8+dY1D50AMRcAEwHmtUAuwbjofD00jkh4LTfTXkG T2vfT9QbCcph2nuqVoZloRHA+UlO1cA7LSwf4ncUitcoXu9xjamaq+B9SocRoNQkOvQy5JMUU lbYEheRch7GRVvzcvTZ9rZI1lIGVcA4e+bMGghYQdbMYiTCYtsBEzwOERPyRaooJt9cJnd1pt +uwX7VHKs8m27VOX+kP3bOpLB7L7Kx8i3lg9EesDKNKdaYzEvPJUCNkC7WbAzo Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org for using mutliple cpu-Ports 3 additional functions are defined to read dts-option (dsa_user_parse) and check if current port is a upstream-port (dsa_port_upstream_port, dsa_is_upstream_port) based on https://github.com/openwrt/openwrt/blob/master/target/linux/mediatek/patches-4.14/0033-dsa-multi-cpu.patch Signed-off-by: Frank Wunderlich --- include/net/dsa.h | 18 ++++++++++++++++++ net/dsa/dsa2.c | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/net/dsa.h b/include/net/dsa.h index 3efa81e08993..612942ac56de 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -319,6 +319,12 @@ static inline unsigned int dsa_towards_port(struct dsa_switch *ds, int device, return ds->rtable[device]; } + +static inline bool dsa_is_upstream_port(struct dsa_switch *ds, int p) +{ + return dsa_is_cpu_port(ds, p) || dsa_is_dsa_port(ds, p); +} + /* Return the local port used to reach the dedicated CPU port */ static inline unsigned int dsa_upstream_port(struct dsa_switch *ds, int port) { @@ -331,6 +337,18 @@ static inline unsigned int dsa_upstream_port(struct dsa_switch *ds, int port) return dsa_towards_port(ds, cpu_dp->ds->index, cpu_dp->index); } +static inline u8 dsa_port_upstream_port(struct dsa_switch *ds, int port) +{ + /* + * If this port has a specific upstream cpu port, use it, + * otherwise use the switch default. + */ + if (ds->ports[port].upstream) + return ds->ports[port].upstream; + else + return dsa_upstream_port(ds, port); +} + typedef int dsa_fdb_dump_cb_t(const unsigned char *addr, u16 vid, bool is_static, void *data); struct dsa_switch_ops { diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index a1917025e155..b7c6da2f1f08 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -255,6 +255,24 @@ static void dsa_tree_teardown_default_cpu(struct dsa_switch_tree *dst) dst->cpu_dp = NULL; } +static int dsa_user_parse(struct dsa_port *port, u32 index, + struct dsa_switch *ds) +{ + struct device_node *cpu_port; + const unsigned int *cpu_port_reg; + int cpu_port_index; + + cpu_port = of_parse_phandle(port->dn, "default_cpu", 0); + if (cpu_port) { + cpu_port_reg = of_get_property(cpu_port, "reg", NULL); + if (!cpu_port_reg) + return -EINVAL; + cpu_port_index = be32_to_cpup(cpu_port_reg); + ds->ports[index].upstream = cpu_port_index; + } + return 0; +} + static int dsa_port_setup(struct dsa_port *dp) { struct dsa_switch *ds = dp->ds;