From patchwork Tue Dec 14 22:43:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676827 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D918BC433F5 for ; Tue, 14 Dec 2021 22:44:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234478AbhLNWo0 (ORCPT ); Tue, 14 Dec 2021 17:44:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34418 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234406AbhLNWoZ (ORCPT ); Tue, 14 Dec 2021 17:44:25 -0500 Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com [IPv6:2a00:1450:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A728FC061574; Tue, 14 Dec 2021 14:44:24 -0800 (PST) Received: by mail-ed1-x535.google.com with SMTP id g14so67336847edb.8; Tue, 14 Dec 2021 14:44:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SIfarseuazWNvAMizZs44/rl8z9XqJc6Pl24mqqhG8E=; b=lTk6V4dKPQevR5z7tN5XYTqk+EJyT6Ta3+S7NZNdT+4vzu502HMNQwcHaT8rcokHvX QgFtW/Cf4KnSfa5r95gcUNLDlM8UyYD0Hi0xD1NQ0mZRjmWRHaci4oJ3wUDhEIuPrbFq GZMJONjViWJaXOhJpS+7J2inNjbM+qKde2uAktuCzZ9BiF25SPmPVm2tzL8V2UeLODiN VAHTqUJtilaJ6wpS6d0uTkclOPn8K4oU0WaWuVU94y1BPVJPB/3yDifUUEIwvoJlKteT WiO8JbnwNY/NEmROQtw3kswckyT1exurZn6Kx/egqs59J199L6T70q97elI8lirLTSy0 1CNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SIfarseuazWNvAMizZs44/rl8z9XqJc6Pl24mqqhG8E=; b=FWDZE4MYAMkGcHU9edRkRfBGYc3m+uI6rWQ9l6kJ9i3MzclE2RxaH1/aw27zmRiZYY TMsei72xs6LlUUFJXAWChC4t95LKlw5C6i9BUxW/BQ0s3HBsgdpm5MSaoybEUYt12B0D z/jPk3/XbMeK1XxaS3fBz0v+gNgTbEF2wQO1tXerORrxU3CmEr0O6Pfh5jxbNVCvy1jG LeXAMKn1z0FNPTRf0AMKsXf2A3vj4ZkpjLkh5eUPYFAqd91E2IVqs7PG0cxhZLHWZqHg rt3feOBU4dx3vv8sdPuixQDgcrVhmxYa4jrNmdodM8HzrMcAwGRKavjgesLvsdyuf3W6 ElXA== X-Gm-Message-State: AOAM530pOcQ1hiHGl0mUhg80X2zXTQjnlOrYBciqTDNMSUTz0+DA14Ql HOmO2meAS2GkRFO0TS15hto= X-Google-Smtp-Source: ABdhPJyWZSJL9n9Ftf29R+xfWAiA8bSKrrrOxzhNRQ2SGaI0JSm7hau/3cT63NeEPDMRRNkhT4mXoA== X-Received: by 2002:a17:906:5f94:: with SMTP id a20mr8925079eju.256.1639521863092; Tue, 14 Dec 2021 14:44:23 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:22 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Vladimir Oltean , Ansuel Smith Subject: [net-next PATCH RFC v6 01/16] net: dsa: provide switch operations for tracking the master state Date: Tue, 14 Dec 2021 23:43:54 +0100 Message-Id: <20211214224409.5770-2-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC From: Vladimir Oltean Certain drivers may need to send management traffic to the switch for things like register access, FDB dump, etc, to accelerate what their slow bus (SPI, I2C, MDIO) can already do. Ethernet is faster (especially in bulk transactions) but is also more unreliable, since the user may decide to bring the DSA master down (or not bring it up), therefore severing the link between the host and the attached switch. Drivers needing Ethernet-based register access already should have fallback logic to the slow bus if the Ethernet method fails, but that fallback may be based on a timeout, and the I/O to the switch may slow down to a halt if the master is down, because every Ethernet packet will have to time out. The driver also doesn't have the option to turn off Ethernet-based I/O momentarily, because it wouldn't know when to turn it back on. Which is where this change comes in. By tracking NETDEV_CHANGE, NETDEV_UP and NETDEV_GOING_DOWN events on the DSA master, we should know the exact interval of time during which this interface is reliably available for traffic. Provide this information to switches so they can use it as they wish. An helper is added dsa_port_master_is_operational() to check if a master port is operational. Signed-off-by: Vladimir Oltean Signed-off-by: Ansuel Smith --- include/net/dsa.h | 17 +++++++++++++++++ net/dsa/dsa2.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ net/dsa/dsa_priv.h | 13 +++++++++++++ net/dsa/slave.c | 32 ++++++++++++++++++++++++++++++++ net/dsa/switch.c | 15 +++++++++++++++ 5 files changed, 123 insertions(+) diff --git a/include/net/dsa.h b/include/net/dsa.h index f16959444ae1..70a1f21e4473 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -292,6 +292,10 @@ struct dsa_port { struct list_head fdbs; struct list_head mdbs; + /* Master state bits, valid only on CPU ports */ + u8 master_admin_up:1, + master_oper_up:1; + bool setup; }; @@ -458,6 +462,12 @@ static inline bool dsa_port_is_unused(struct dsa_port *dp) return dp->type == DSA_PORT_TYPE_UNUSED; } +static inline bool dsa_port_master_is_operational(struct dsa_port *dp) +{ + return dsa_port_is_cpu(dp) && dp->master_admin_up && + dp->master_oper_up; +} + static inline bool dsa_is_unused_port(struct dsa_switch *ds, int p) { return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_UNUSED; @@ -1016,6 +1026,13 @@ struct dsa_switch_ops { int (*tag_8021q_vlan_add)(struct dsa_switch *ds, int port, u16 vid, u16 flags); int (*tag_8021q_vlan_del)(struct dsa_switch *ds, int port, u16 vid); + + /* + * DSA master tracking operations + */ + void (*master_state_change)(struct dsa_switch *ds, + const struct net_device *master, + bool operational); }; #define DSA_DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes) \ diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index c18b22c0bf55..eb466e92069c 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -1244,6 +1244,52 @@ int dsa_tree_change_tag_proto(struct dsa_switch_tree *dst, return err; } +static void dsa_tree_master_state_change(struct dsa_switch_tree *dst, + struct net_device *master) +{ + struct dsa_notifier_master_state_info info; + struct dsa_port *cpu_dp = master->dsa_ptr; + + info.master = master; + info.operational = dsa_port_master_is_operational(cpu_dp); + + dsa_tree_notify(dst, DSA_NOTIFIER_MASTER_STATE_CHANGE, &info); +} + +void dsa_tree_master_admin_state_change(struct dsa_switch_tree *dst, + struct net_device *master, + bool up) +{ + struct dsa_port *cpu_dp = master->dsa_ptr; + bool notify = false; + + if ((dsa_port_master_is_operational(cpu_dp)) != + (up && cpu_dp->master_oper_up)) + notify = true; + + cpu_dp->master_admin_up = up; + + if (notify) + dsa_tree_master_state_change(dst, master); +} + +void dsa_tree_master_oper_state_change(struct dsa_switch_tree *dst, + struct net_device *master, + bool up) +{ + struct dsa_port *cpu_dp = master->dsa_ptr; + bool notify = false; + + if ((dsa_port_master_is_operational(cpu_dp)) != + (cpu_dp->master_admin_up && up)) + notify = true; + + cpu_dp->master_oper_up = up; + + if (notify) + dsa_tree_master_state_change(dst, master); +} + static struct dsa_port *dsa_port_touch(struct dsa_switch *ds, int index) { struct dsa_switch_tree *dst = ds->dst; diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index edfaae7b5967..1566064ccfe2 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -45,6 +45,7 @@ enum { DSA_NOTIFIER_MRP_DEL_RING_ROLE, DSA_NOTIFIER_TAG_8021Q_VLAN_ADD, DSA_NOTIFIER_TAG_8021Q_VLAN_DEL, + DSA_NOTIFIER_MASTER_STATE_CHANGE, }; /* DSA_NOTIFIER_AGEING_TIME */ @@ -128,6 +129,12 @@ struct dsa_notifier_tag_8021q_vlan_info { u16 vid; }; +/* DSA_NOTIFIER_MASTER_STATE_CHANGE */ +struct dsa_notifier_master_state_info { + const struct net_device *master; + bool operational; +}; + struct dsa_switchdev_event_work { struct dsa_switch *ds; int port; @@ -508,6 +515,12 @@ int dsa_tree_change_tag_proto(struct dsa_switch_tree *dst, struct net_device *master, const struct dsa_device_ops *tag_ops, const struct dsa_device_ops *old_tag_ops); +void dsa_tree_master_admin_state_change(struct dsa_switch_tree *dst, + struct net_device *master, + bool up); +void dsa_tree_master_oper_state_change(struct dsa_switch_tree *dst, + struct net_device *master, + bool up); unsigned int dsa_bridge_num_get(const struct net_device *bridge_dev, int max); void dsa_bridge_num_put(const struct net_device *bridge_dev, unsigned int bridge_num); diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 88f7b8686dac..9dfcfc5dae0a 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -2348,6 +2348,36 @@ static int dsa_slave_netdevice_event(struct notifier_block *nb, err = dsa_port_lag_change(dp, info->lower_state_info); return notifier_from_errno(err); } + case NETDEV_CHANGE: + case NETDEV_UP: { + /* Track state of master port. + * DSA driver may require the master port (and indirectly + * the tagger) to be available for some special operation. + */ + if (netdev_uses_dsa(dev)) { + struct dsa_port *cpu_dp = dev->dsa_ptr; + struct dsa_switch_tree *dst = cpu_dp->ds->dst; + + /* Track when the master port is UP */ + dsa_tree_master_oper_state_change(dst, dev, + netif_oper_up(dev)); + + /* Track when the master port is ready and can accept + * packet. + * NETDEV_UP event is not enough to flag a port as ready. + * We also have to wait for linkwatch_do_dev to dev_activate + * and emit a NETDEV_CHANGE event. + * We check if a master port is ready by checking if the dev + * have a qdisc assigned and is not noop. + */ + dsa_tree_master_admin_state_change(dst, dev, + !qdisc_tx_is_noop(dev)); + + return NOTIFY_OK; + } + + return NOTIFY_DONE; + } case NETDEV_GOING_DOWN: { struct dsa_port *dp, *cpu_dp; struct dsa_switch_tree *dst; @@ -2359,6 +2389,8 @@ static int dsa_slave_netdevice_event(struct notifier_block *nb, cpu_dp = dev->dsa_ptr; dst = cpu_dp->ds->dst; + dsa_tree_master_admin_state_change(dst, dev, false); + list_for_each_entry(dp, &dst->ports, list) { if (!dsa_port_is_user(dp)) continue; diff --git a/net/dsa/switch.c b/net/dsa/switch.c index 393f2d8a860a..726bb5ca1183 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -753,6 +753,18 @@ dsa_switch_mrp_del_ring_role(struct dsa_switch *ds, return 0; } +static int +dsa_switch_master_state_change(struct dsa_switch *ds, + struct dsa_notifier_master_state_info *info) +{ + if (!ds->ops->master_state_change) + return 0; + + ds->ops->master_state_change(ds, info->master, info->operational); + + return 0; +} + static int dsa_switch_event(struct notifier_block *nb, unsigned long event, void *info) { @@ -844,6 +856,9 @@ static int dsa_switch_event(struct notifier_block *nb, case DSA_NOTIFIER_TAG_8021Q_VLAN_DEL: err = dsa_switch_tag_8021q_vlan_del(ds, info); break; + case DSA_NOTIFIER_MASTER_STATE_CHANGE: + err = dsa_switch_master_state_change(ds, info); + break; default: err = -EOPNOTSUPP; break; From patchwork Tue Dec 14 22:43:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676829 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8AC0DC433F5 for ; Tue, 14 Dec 2021 22:44:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234905AbhLNWoc (ORCPT ); Tue, 14 Dec 2021 17:44:32 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34422 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234409AbhLNWo0 (ORCPT ); Tue, 14 Dec 2021 17:44:26 -0500 Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7A515C06173E; Tue, 14 Dec 2021 14:44:25 -0800 (PST) Received: by mail-ed1-x52c.google.com with SMTP id g14so67336935edb.8; Tue, 14 Dec 2021 14:44:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=z3KHK1Qz252qPTPlwp2DQrEAnJLSvMy6tiK8HNT5asM=; b=GAVepJe227LxLM5oXIuIRLfwXlPVdThaJ7TcsAPQ/QwkIgWkB5Fs1jtJH13c1J4NpV pk4LnEOg2s4/5jXWnu9PkOx/NOgQMcjTDMhRFhwyOal+4EcYV2pAW7glX/JCOletmLhK LtANwxZ4dnm4TwdiViRlJa8g+xuKBbN5e4VYCHY3AgL59+pyoyLJLXREIgPWkjLJWRWf yePEfKORopq4r+nghLsQZCmPedHI4hSHlV1iezVJv8bmrshUUsLy2xFdCOA6VRiGRLdF pgjLq6XFnwZnZc+BCuxhpoxmihVhWZAOAJqSdiYDjx/Vsnhr0StfDnutb2pB1J5WMkyk jkOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=z3KHK1Qz252qPTPlwp2DQrEAnJLSvMy6tiK8HNT5asM=; b=MNkZD7m2ZrUjHtomu7y9ik2xBptoUanL8GF+ypSXmZDFVfUZeyWP4w9LXPRiMYusHt +1r7NKIbT1ZPcke25aJEgPJjy+ue1kPNBHEJ//tXu5SRMXbze8kbPdzMA8EvVmpKBZZm 3IH9ejER6xabyohKsVe3oDuWFcw1WEvAUpZ0eh1Rkm6gGIyWakAmoCoVvluNtvbd6bKQ rimLB7f066nfelGfqDurgTCP0fx6W2bbYlxr1y4i9hZOSHDMxf0m19f1ohIy/EkDK6nm UXjCHDmDN2270Hpb/lpwBRfw7oirnsOPdFzqeWCbfkqITSpNYdlDrxSKdcViOjFpHmp8 T+WQ== X-Gm-Message-State: AOAM531DqSTTKTzGaSMKICXKbLp0SYq9MoSlSO4DDHZJCaciExZI1KzL 7DL/B7onT4xbrGr864OtuIk= X-Google-Smtp-Source: ABdhPJzS4rFHI7ssECUdms17TgUsjNbk/86eOoVLlAK5clQBp+kgchFZIJMq/nE77kDmkrzKW7zEkA== X-Received: by 2002:a05:6402:27cd:: with SMTP id c13mr11767451ede.236.1639521863944; Tue, 14 Dec 2021 14:44:23 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:23 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Vladimir Oltean Subject: [net-next PATCH RFC v6 02/16] net: dsa: stop updating master MTU from master.c Date: Tue, 14 Dec 2021 23:43:55 +0100 Message-Id: <20211214224409.5770-3-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC From: Vladimir Oltean The dev_set_mtu() call from dsa_master_setup() has been effectively superseded by the dsa_slave_change_mtu(slave_dev, ETH_DATA_LEN) that is done from dsa_slave_create() for each user port. This function also updates the master MTU according to the largest user port MTU from the tree. Therefore, updating the master MTU through a separate code path isn't needed. Signed-off-by: Vladimir Oltean Reviewed-by: Florian Fainelli --- net/dsa/master.c | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/net/dsa/master.c b/net/dsa/master.c index e8e19857621b..f4efb244f91d 100644 --- a/net/dsa/master.c +++ b/net/dsa/master.c @@ -330,28 +330,13 @@ static const struct attribute_group dsa_group = { .attrs = dsa_slave_attrs, }; -static void dsa_master_reset_mtu(struct net_device *dev) -{ - int err; - - rtnl_lock(); - err = dev_set_mtu(dev, ETH_DATA_LEN); - if (err) - netdev_dbg(dev, - "Unable to reset MTU to exclude DSA overheads\n"); - rtnl_unlock(); -} - static struct lock_class_key dsa_master_addr_list_lock_key; int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp) { - const struct dsa_device_ops *tag_ops = cpu_dp->tag_ops; struct dsa_switch *ds = cpu_dp->ds; struct device_link *consumer_link; - int mtu, ret; - - mtu = ETH_DATA_LEN + dsa_tag_protocol_overhead(tag_ops); + int ret; /* The DSA master must use SET_NETDEV_DEV for this to work. */ consumer_link = device_link_add(ds->dev, dev->dev.parent, @@ -361,13 +346,6 @@ int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp) "Failed to create a device link to DSA switch %s\n", dev_name(ds->dev)); - rtnl_lock(); - ret = dev_set_mtu(dev, mtu); - rtnl_unlock(); - if (ret) - netdev_warn(dev, "error %d setting MTU to %d to include DSA overhead\n", - ret, mtu); - /* If we use a tagging format that doesn't have an ethertype * field, make sure that all packets from this point on get * sent to the tag format's receive function. @@ -405,7 +383,6 @@ void dsa_master_teardown(struct net_device *dev) sysfs_remove_group(&dev->dev.kobj, &dsa_group); dsa_netdev_ops_set(dev, NULL); dsa_master_ethtool_teardown(dev); - dsa_master_reset_mtu(dev); dsa_master_set_promiscuity(dev, -1); dev->dsa_ptr = NULL; From patchwork Tue Dec 14 22:43:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676831 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EEF9BC433F5 for ; Tue, 14 Dec 2021 22:44:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234950AbhLNWod (ORCPT ); Tue, 14 Dec 2021 17:44:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34430 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234496AbhLNWo1 (ORCPT ); Tue, 14 Dec 2021 17:44:27 -0500 Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 780DAC061574; Tue, 14 Dec 2021 14:44:26 -0800 (PST) Received: by mail-ed1-x52c.google.com with SMTP id o20so68607849eds.10; Tue, 14 Dec 2021 14:44:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qQRzAmXXLzovHTeQ0OGq4HgeHs5rmFO6afBOjf35icI=; b=nJeIQ20p8bSxqr2yVM3xPQCFIeQ0Q5p/3jPbAfd53xkhQi3R/5I+HyqBAfJ6BI43SY 1SWsjKLZ0nuUJYHxCnb8OAHiLVHUgPEcVjXb8I8YVt2yM6dSGY1FvwDvhPftOFWJuWIy 1X/tO40vYqcdvUdXCl3YNb/3qQTz8fM0MJu0plBzuL5GCVbj9FHVGTwv/wqnHPZao9eV wRpK3CxioneSn87cgh7llN8ztCILxwJTlhGWZ7gBiR/VuY1GBqfpvf8HwMqOfktal4w8 T5I78StvWxKtwp3FWzgFzrfS8/IPrCYuJB7iysVvSN0EPHVl1m9eN9IWBCodUdFf6F01 vYOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qQRzAmXXLzovHTeQ0OGq4HgeHs5rmFO6afBOjf35icI=; b=BRoxIluBPY7xv35HKkOweeyQ6I3sTjcCr0x7cSw5XVY3e7Lj2ixyOm9EDhWbFn/f4P GFiN6pF8J8O71Taz3efdWbgH55FWp33l0q7JE16KsecDbnkdCS2sr15wbqOJH4KmtvPy g+bg8q1c5K3JfC8vTagurjMUnlou6ApbieJRCBpc5hZ43BbFdUGS84uELIQDBFEx3SVS wkvDwEV/8vLjMk0/A1n5iwwETy1+kw85szjRNMXHqjl7Fkj4wf1gAL+X3RmfBZiPRjHP 2LX1v/ryetxeD/WB8pzJNeP7vIQN/KMwr8JVxhwovTUS7PLNCzYAo4RHl5ow9L7vtroS hlKA== X-Gm-Message-State: AOAM532lrlcCO9eS1AZAZjvzLcNunKhNjeYqjL21omK2fmGmbXgjMk8G /57oTKPAfKqMTNwAgiWYE68= X-Google-Smtp-Source: ABdhPJzJWLUptNwalC7jeDt7WVMCSLjRP1yoKH/CrVg4T+SmeAo1yV2HpT17gspGljfq4uZBc1wzCQ== X-Received: by 2002:a17:906:8a62:: with SMTP id hy2mr8523141ejc.347.1639521864862; Tue, 14 Dec 2021 14:44:24 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:24 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Vladimir Oltean , Ansuel Smith Subject: [net-next PATCH RFC v6 03/16] net: dsa: hold rtnl_mutex when calling dsa_master_{setup,teardown} Date: Tue, 14 Dec 2021 23:43:56 +0100 Message-Id: <20211214224409.5770-4-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC From: Vladimir Oltean DSA needs to simulate master tracking events when a binding is first with a DSA master established and torn down, in order to give drivers the simplifying guarantee that ->master_state_change calls are made only when the master's readiness state to pass traffic changes. master_state_change() provide a operational bool that DSA driver can use to understand if DSA master is operational or not. To avoid races, we need to block the reception of NETDEV_UP/NETDEV_CHANGE/NETDEV_GOING_DOWN events in the netdev notifier chain while we are changing the master's dev->dsa_ptr (this changes what netdev_uses_dsa(dev) reports). The dsa_master_setup() and dsa_master_teardown() functions optionally require the rtnl_mutex to be held, if the tagger needs the master to be promiscuous, these functions call dev_set_promiscuity(). Move the rtnl_lock() from that function and make it top-level. Signed-off-by: Vladimir Oltean Signed-off-by: Ansuel Smith Reviewed-by: Florian Fainelli --- net/dsa/dsa2.c | 8 ++++++++ net/dsa/master.c | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index eb466e92069c..e8b56c84a417 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -1038,6 +1038,8 @@ static int dsa_tree_setup_master(struct dsa_switch_tree *dst) struct dsa_port *dp; int err; + rtnl_lock(); + list_for_each_entry(dp, &dst->ports, list) { if (dsa_port_is_cpu(dp)) { err = dsa_master_setup(dp->master, dp); @@ -1046,6 +1048,8 @@ static int dsa_tree_setup_master(struct dsa_switch_tree *dst) } } + rtnl_unlock(); + return 0; } @@ -1053,9 +1057,13 @@ static void dsa_tree_teardown_master(struct dsa_switch_tree *dst) { struct dsa_port *dp; + rtnl_lock(); + list_for_each_entry(dp, &dst->ports, list) if (dsa_port_is_cpu(dp)) dsa_master_teardown(dp->master); + + rtnl_unlock(); } static int dsa_tree_setup_lags(struct dsa_switch_tree *dst) diff --git a/net/dsa/master.c b/net/dsa/master.c index f4efb244f91d..2199104ca7df 100644 --- a/net/dsa/master.c +++ b/net/dsa/master.c @@ -267,9 +267,9 @@ static void dsa_master_set_promiscuity(struct net_device *dev, int inc) if (!ops->promisc_on_master) return; - rtnl_lock(); + ASSERT_RTNL(); + dev_set_promiscuity(dev, inc); - rtnl_unlock(); } static ssize_t tagging_show(struct device *d, struct device_attribute *attr, From patchwork Tue Dec 14 22:43:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676833 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 20008C433FE for ; Tue, 14 Dec 2021 22:44:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234923AbhLNWof (ORCPT ); Tue, 14 Dec 2021 17:44:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34432 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234557AbhLNWo1 (ORCPT ); Tue, 14 Dec 2021 17:44:27 -0500 Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com [IPv6:2a00:1450:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5D1B6C06173F; Tue, 14 Dec 2021 14:44:27 -0800 (PST) Received: by mail-ed1-x535.google.com with SMTP id z7so7059857edc.11; Tue, 14 Dec 2021 14:44:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dfo2Z28c0nUHb7GY/2itHROe1c/3b/U6k/gdflVih/g=; b=eQJhItNfKrQiPUeX1ELNgLGAHHcXIkd114eTAA2bzzIVrfxjWOV7xiLy+wgHp7ey+n kz35SXhVLXxR9RChbzoH2PlxwDZmzYmOTjhz3i2Q6RBXdda4WH1F90TNdxTOEsjTcPDe ptS3O+MAdNz12bNYGD+ZSl4PUPDDC6MbdZZfYAboqKjj3WsgyvgSDJvK3/RWV3MgJTR+ YkHUFsVnvDGW8poIqTcqnXhRQiVKIAP3WfyuRQUZClMyKmeD80XznK2ZdAGy++8sKvy2 z6LV7xfsvevsNzD5bf3foFd+qQnlbQHjDU+B4UFpIzpDkK7BIJ2OOPGRngiGNvDWB28K 0bAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dfo2Z28c0nUHb7GY/2itHROe1c/3b/U6k/gdflVih/g=; b=FGmVitYP3T/X932LeanV7QUaNj5b3Nvf+ytrhHsMYutYpZkBS6nx1au4oOXgzSDT2y 4PbbziA5tfViMLgIs8ml+WGupLN8GPFVJfyxrTsZ6rBED0swvk+AwxIB+kKQtd0O8gCb Ej0AV4YDqL45o4UIlTVqCDXR6KLpMg7WBOBj1Q3NxfTR7MBb3PuZOFKRcUIyVpNOCBDb uM/BPlV/qLjBoESz+Tt+YIop8VQoaXMeaARHWKxMMbBL4mdIALRF0h6uL8glgiHJm2nm 4U1Q5n2PFYb8r0x/RY0FhRVauVODs2j6KXO+MZ0MvrLXlQbhd0BfceNVMB1jBKCXWo0z cb9g== X-Gm-Message-State: AOAM532ipOgAWV5MeopaPZAXX/xPvrCqZ29W37KlSrLurDOOjMTnYYqa uY/cazImBFowoGaO+SxQnEkF2x7WEGeLTQ== X-Google-Smtp-Source: ABdhPJzrM6giJ5DgBtTgxUZO/Q1O6vFwIsDhEofqQ2aehe8zE/OVSjmZ7e5N1vLsiUXzqdR7zRrsiA== X-Received: by 2002:a17:906:6c96:: with SMTP id s22mr3096ejr.756.1639521865603; Tue, 14 Dec 2021 14:44:25 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:25 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Vladimir Oltean , Ansuel Smith Subject: [net-next PATCH RFC v6 04/16] net: dsa: replay master state events in dsa_tree_{setup,teardown}_master Date: Tue, 14 Dec 2021 23:43:57 +0100 Message-Id: <20211214224409.5770-5-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC From: Vladimir Oltean In order for switch driver to be able to make simple and reliable use of the master tracking operations, they must also be notified of the initial state of the DSA master, not just of the changes. This is because they might enable certain features only during the time when they know that the DSA master is up and running. Therefore, this change explicitly checks the state of the DSA master under the same rtnl_mutex as we were holding during the dsa_master_setup() and dsa_master_teardown() call. The idea being that if the DSA master became operational in between the moment in which it became a DSA master (dsa_master_setup set dev->dsa_ptr) and the moment when we checked for the master being up, there is a chance that we would emit a ->master_state_change() call with no actual state change. We need to avoid that by serializing the concurrent netdevice event with us. If the netdevice event started before, we force it to finish before we begin, because we take rtnl_lock before making netdev_uses_dsa() return true. So we also handle that early event and do nothing on it. Similarly, if the dev_open() attempt is concurrent with us, it will attempt to take the rtnl_mutex, but we're holding it. We'll see that the master flag IFF_UP isn't set, then when we release the rtnl_mutex we'll process the NETDEV_UP notifier. Signed-off-by: Vladimir Oltean Signed-off-by: Ansuel Smith --- net/dsa/dsa2.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index e8b56c84a417..4ab6d1df2b19 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -1042,9 +1042,18 @@ static int dsa_tree_setup_master(struct dsa_switch_tree *dst) list_for_each_entry(dp, &dst->ports, list) { if (dsa_port_is_cpu(dp)) { - err = dsa_master_setup(dp->master, dp); + struct net_device *master = dp->master; + bool admin_up = (master->flags & IFF_UP) && + !qdisc_tx_is_noop(master); + + err = dsa_master_setup(master, dp); if (err) return err; + + /* Replay master state event */ + dsa_tree_master_admin_state_change(dst, master, admin_up); + dsa_tree_master_oper_state_change(dst, master, + netif_oper_up(master)); } } @@ -1059,9 +1068,19 @@ static void dsa_tree_teardown_master(struct dsa_switch_tree *dst) rtnl_lock(); - list_for_each_entry(dp, &dst->ports, list) - if (dsa_port_is_cpu(dp)) - dsa_master_teardown(dp->master); + list_for_each_entry(dp, &dst->ports, list) { + if (dsa_port_is_cpu(dp)) { + struct net_device *master = dp->master; + + /* Synthesizing an "admin down" state is sufficient for + * the switches to get a notification if the master is + * currently up and running. + */ + dsa_tree_master_admin_state_change(dst, master, false); + + dsa_master_teardown(master); + } + } rtnl_unlock(); } From patchwork Tue Dec 14 22:43:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676835 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BC6A0C4332F for ; Tue, 14 Dec 2021 22:44:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235000AbhLNWog (ORCPT ); Tue, 14 Dec 2021 17:44:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34442 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234573AbhLNWo2 (ORCPT ); Tue, 14 Dec 2021 17:44:28 -0500 Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5084CC061747; Tue, 14 Dec 2021 14:44:28 -0800 (PST) Received: by mail-ed1-x52e.google.com with SMTP id z9so13310385edb.5; Tue, 14 Dec 2021 14:44:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FPHCW224dbQX+hfHQkJaGaEhoEvlqsOfdITuUUKo/eY=; b=iQonsgNdyXWXKzPgB6sLOQvOktwGJFwXKqY+7JNW96plQoL4G7lFr33gEUyX+Joa1W keB7iCvbaztjl25PJMdAB5OkfpF/RPIrfLhQwf6nvpZQqVFYQDB9EGj8hNy1Wt1vvJjj vs8hFJd63mkx+6FXpHBNqJfzfYvxwmeBt6dA6scXiWEKiTn5vk8JVr5iBuWNWpwuUO6a WHbWdA8yNvaywkzTqqBThVbVsk72bqzHqfVLeqjIrhgKDMsaat0WlRHGC/hLId5ZufvM nDPl7foYLBjWIikKv1U9KBsr4Yj8fT1nT8DJvBRgyUbtnhXyTwf94UMITblUbnaTKcCV eJLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FPHCW224dbQX+hfHQkJaGaEhoEvlqsOfdITuUUKo/eY=; b=MlIuSyeG7PSd1bv4Lh9jOGXIQCUuutSv6lKxdy2Vo++/RQIQ9rNYaOju3+vS2R+d+Z FXKGyEwmLkOTdCx4u40bT0jbz73V3WuGWBCqcuZarQO7C1/WxGwH7ji1t26nnzqZCC5j b3GTk19kru4iZFtdGBvaazzUH1HjnuLo2/HGmNn+RILw19LRjoAzvEy5siE68oEPyXrc JVLwO4DzyMVXs/h7w1hjFSsxLJ+sJzeo5wOcfKABvwERnlXbO3vZFwOPjIUa+G3fAsWx MNDhEpmGF/XJIpLWkujyLgdG2zy+0NGBskZQ84Gz+6I/t+jikrUKPJMIvP/e8VdVrUOD D3pA== X-Gm-Message-State: AOAM53174VFSfpzinKnsHyBy7Bl98Y22cNKunUFEU6K5IycGC+eHFAUk ywp2bk1tGKR+b7gX21vYZU4TGY7+4c/VpA== X-Google-Smtp-Source: ABdhPJy6MZXSsX1TWSxYSH8AZSFlF65IrsrCZUIp9UGo7ZyLb5P7nnWKAIw1oWOcImxV8CdJBE95PQ== X-Received: by 2002:a17:907:2da3:: with SMTP id gt35mr8979972ejc.314.1639521866713; Tue, 14 Dec 2021 14:44:26 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:26 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 05/16] net: dsa: tag_qca: convert to FIELD macro Date: Tue, 14 Dec 2021 23:43:58 +0100 Message-Id: <20211214224409.5770-6-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Convert driver to FIELD macro to drop redundant define. Signed-off-by: Ansuel Smith --- net/dsa/tag_qca.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/net/dsa/tag_qca.c b/net/dsa/tag_qca.c index 1ea9401b8ace..55fa6b96b4eb 100644 --- a/net/dsa/tag_qca.c +++ b/net/dsa/tag_qca.c @@ -4,29 +4,24 @@ */ #include +#include #include "dsa_priv.h" #define QCA_HDR_LEN 2 #define QCA_HDR_VERSION 0x2 -#define QCA_HDR_RECV_VERSION_MASK GENMASK(15, 14) -#define QCA_HDR_RECV_VERSION_S 14 -#define QCA_HDR_RECV_PRIORITY_MASK GENMASK(13, 11) -#define QCA_HDR_RECV_PRIORITY_S 11 -#define QCA_HDR_RECV_TYPE_MASK GENMASK(10, 6) -#define QCA_HDR_RECV_TYPE_S 6 +#define QCA_HDR_RECV_VERSION GENMASK(15, 14) +#define QCA_HDR_RECV_PRIORITY GENMASK(13, 11) +#define QCA_HDR_RECV_TYPE GENMASK(10, 6) #define QCA_HDR_RECV_FRAME_IS_TAGGED BIT(3) -#define QCA_HDR_RECV_SOURCE_PORT_MASK GENMASK(2, 0) - -#define QCA_HDR_XMIT_VERSION_MASK GENMASK(15, 14) -#define QCA_HDR_XMIT_VERSION_S 14 -#define QCA_HDR_XMIT_PRIORITY_MASK GENMASK(13, 11) -#define QCA_HDR_XMIT_PRIORITY_S 11 -#define QCA_HDR_XMIT_CONTROL_MASK GENMASK(10, 8) -#define QCA_HDR_XMIT_CONTROL_S 8 +#define QCA_HDR_RECV_SOURCE_PORT GENMASK(2, 0) + +#define QCA_HDR_XMIT_VERSION GENMASK(15, 14) +#define QCA_HDR_XMIT_PRIORITY GENMASK(13, 11) +#define QCA_HDR_XMIT_CONTROL GENMASK(10, 8) #define QCA_HDR_XMIT_FROM_CPU BIT(7) -#define QCA_HDR_XMIT_DP_BIT_MASK GENMASK(6, 0) +#define QCA_HDR_XMIT_DP_BIT GENMASK(6, 0) static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev) { @@ -40,8 +35,9 @@ static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev) phdr = dsa_etype_header_pos_tx(skb); /* Set the version field, and set destination port information */ - hdr = QCA_HDR_VERSION << QCA_HDR_XMIT_VERSION_S | - QCA_HDR_XMIT_FROM_CPU | BIT(dp->index); + hdr = FIELD_PREP(QCA_HDR_XMIT_VERSION, QCA_HDR_VERSION); + hdr |= QCA_HDR_XMIT_FROM_CPU; + hdr |= FIELD_PREP(QCA_HDR_XMIT_DP_BIT, BIT(dp->index)); *phdr = htons(hdr); @@ -62,7 +58,7 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev) hdr = ntohs(*phdr); /* Make sure the version is correct */ - ver = (hdr & QCA_HDR_RECV_VERSION_MASK) >> QCA_HDR_RECV_VERSION_S; + ver = FIELD_GET(QCA_HDR_RECV_VERSION, hdr); if (unlikely(ver != QCA_HDR_VERSION)) return NULL; @@ -71,7 +67,7 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev) dsa_strip_etype_header(skb, QCA_HDR_LEN); /* Get source port information */ - port = (hdr & QCA_HDR_RECV_SOURCE_PORT_MASK); + port = FIELD_GET(QCA_HDR_RECV_SOURCE_PORT, hdr); skb->dev = dsa_master_find_slave(dev, 0, port); if (!skb->dev) From patchwork Tue Dec 14 22:43:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676857 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 47DAEC433FE for ; Tue, 14 Dec 2021 22:45:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235145AbhLNWpS (ORCPT ); Tue, 14 Dec 2021 17:45:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34446 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234614AbhLNWoa (ORCPT ); Tue, 14 Dec 2021 17:44:30 -0500 Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0ED2DC061748; Tue, 14 Dec 2021 14:44:29 -0800 (PST) Received: by mail-ed1-x52c.google.com with SMTP id z5so68865493edd.3; Tue, 14 Dec 2021 14:44:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UQqyudjWUYakbtmLPfiby0mM1HOmbin85GmwvIa72zk=; b=jOtXT8pOgjjZ1SYCvdjrC+zahO95rpsJ7DLwTjnTjQdSdeTgkBFrxvx6+E58LAwS7c seI3fMV3jOdE1ZnSw/5BjjZvDlQ9DcnBYYRooB2QWwtQrDdi0Xd2GZU2eCALVPf2C5Jh 9IJsyrBbQA2ceujXVEGNIAKjCrWgnUbP6d7mphkacjBE5+EvDdbracvLgtSUOvDqn6fG ziyOsDYBDY1T64VoT9ilJLgunhhlGfpNVnsB7zAmMFBQoHxN9D3NnXCidVAsjpkSIquP ZJasGV7oLz7OeCEq2PoxXDAi48EiJHArF8PCH66NFRzdzfHs6Upet3NP7izaIAbwMGZf cO6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UQqyudjWUYakbtmLPfiby0mM1HOmbin85GmwvIa72zk=; b=jgHzeq17hPza3Jb4fTLOb5ONptDYojF9xbCvFpYpohnzOOSUxTTpDdLfZFj30AwslT 9Rkt8OhR/ky5X0c/B34VdnP1kTxp7mB16ArYP+cp2BgIDgl6BRS5Xn1KM0Lr6T4ptKAr YIhwIzmU26VeXNO0E3HHukjrdRncUjaSY1qbjIriR0ruVr2nFVnYDinbz1WQ6gYE/Xel f4S1qT4oVmAuNBtn9Zh33Cl7+1JZx+cuaWESKnthkuRrnhTJDBnNjUf0QYeUPwNxJgWs UsZH0AtbzJd8oO0kARxYn/gFAKVrh6Ft67e8+wD67avcadsqnsWYpDB/gDwWQEmdSVlK QzvQ== X-Gm-Message-State: AOAM531Gzi6rqAmzn27K78RT8vOq1FpsyJ2tMhA0/YeUNCTb5igLlshJ aDcp5qDLy8o4NIvqgBAKxss= X-Google-Smtp-Source: ABdhPJz9B0JTzyPkVFz5W/MUgjAdUHsZEhpxRy+/q11XHA4B+gNl5KQHph+LpNxNJdfa9PIvhizBAg== X-Received: by 2002:a17:906:4793:: with SMTP id cw19mr8375935ejc.387.1639521867541; Tue, 14 Dec 2021 14:44:27 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:27 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 06/16] net: dsa: tag_qca: move define to include linux/dsa Date: Tue, 14 Dec 2021 23:43:59 +0100 Message-Id: <20211214224409.5770-7-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Move tag_qca define to include dir linux/dsa as the qca8k require access to the tagger define to support in-band mdio read/write using ethernet packet. Signed-off-by: Ansuel Smith --- include/linux/dsa/tag_qca.h | 21 +++++++++++++++++++++ net/dsa/tag_qca.c | 16 +--------------- 2 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 include/linux/dsa/tag_qca.h diff --git a/include/linux/dsa/tag_qca.h b/include/linux/dsa/tag_qca.h new file mode 100644 index 000000000000..c02d2d39ff4a --- /dev/null +++ b/include/linux/dsa/tag_qca.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __TAG_QCA_H +#define __TAG_QCA_H + +#define QCA_HDR_LEN 2 +#define QCA_HDR_VERSION 0x2 + +#define QCA_HDR_RECV_VERSION GENMASK(15, 14) +#define QCA_HDR_RECV_PRIORITY GENMASK(13, 11) +#define QCA_HDR_RECV_TYPE GENMASK(10, 6) +#define QCA_HDR_RECV_FRAME_IS_TAGGED BIT(3) +#define QCA_HDR_RECV_SOURCE_PORT GENMASK(2, 0) + +#define QCA_HDR_XMIT_VERSION GENMASK(15, 14) +#define QCA_HDR_XMIT_PRIORITY GENMASK(13, 11) +#define QCA_HDR_XMIT_CONTROL GENMASK(10, 8) +#define QCA_HDR_XMIT_FROM_CPU BIT(7) +#define QCA_HDR_XMIT_DP_BIT GENMASK(6, 0) + +#endif /* __TAG_QCA_H */ diff --git a/net/dsa/tag_qca.c b/net/dsa/tag_qca.c index 55fa6b96b4eb..34e565e00ece 100644 --- a/net/dsa/tag_qca.c +++ b/net/dsa/tag_qca.c @@ -5,24 +5,10 @@ #include #include +#include #include "dsa_priv.h" -#define QCA_HDR_LEN 2 -#define QCA_HDR_VERSION 0x2 - -#define QCA_HDR_RECV_VERSION GENMASK(15, 14) -#define QCA_HDR_RECV_PRIORITY GENMASK(13, 11) -#define QCA_HDR_RECV_TYPE GENMASK(10, 6) -#define QCA_HDR_RECV_FRAME_IS_TAGGED BIT(3) -#define QCA_HDR_RECV_SOURCE_PORT GENMASK(2, 0) - -#define QCA_HDR_XMIT_VERSION GENMASK(15, 14) -#define QCA_HDR_XMIT_PRIORITY GENMASK(13, 11) -#define QCA_HDR_XMIT_CONTROL GENMASK(10, 8) -#define QCA_HDR_XMIT_FROM_CPU BIT(7) -#define QCA_HDR_XMIT_DP_BIT GENMASK(6, 0) - static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev) { struct dsa_port *dp = dsa_slave_to_port(dev); From patchwork Tue Dec 14 22:44:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676855 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9B209C4332F for ; Tue, 14 Dec 2021 22:45:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237921AbhLNWpR (ORCPT ); Tue, 14 Dec 2021 17:45:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34448 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234699AbhLNWoa (ORCPT ); Tue, 14 Dec 2021 17:44:30 -0500 Received: from mail-ed1-x529.google.com (mail-ed1-x529.google.com [IPv6:2a00:1450:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F0F05C061751; Tue, 14 Dec 2021 14:44:29 -0800 (PST) Received: by mail-ed1-x529.google.com with SMTP id r25so67605423edq.7; Tue, 14 Dec 2021 14:44:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4eIBpE5JL23eJLpbXYARtkXjBt7PEvR6KJPTH926Cjw=; b=J3NW0fXEvwaOGalEbfYRPGBDlh/q9Ft4mz6qKSwbZfBdeTLgA4rQt/XNgLMA9arWyM EIR9+THF13Hi7yL/7b849jRoksuCw9Pu7dfwnQSw6V7KLPRG8SIH6N6Lu7Af77LNoKdi H7xmxCrDCru6btHnlVE4fK0dCf8Ao/4VMAJt2hPCDUpZIpWjz2la7FSwyPaoOiqMj6FM JBZGwWSGF/mc9zzJZEvPyh24sQ41DAbdBa0EaTs52JZUNKg1ynN2V1ujwF3kWpt0aldW 1SVxb0/MM4pbRRh0tfMDz93Y201BFZVYvC+KzkUuO5DhCrZVLeLpUj9rDNKyal0ukdGQ dw8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4eIBpE5JL23eJLpbXYARtkXjBt7PEvR6KJPTH926Cjw=; b=o3uxs1tJsAtW0lU37qwtiio7AlvFHLnmLs2cqrI0kraPBC3n3TdvwTJIgSbb3QpuoL K6LSjr6VffTybtgzjLkjPjYuHt81ZMx+nwOq36mv6DkSzp2ab1SiHqCsmOy7ygVYxY7N 6Bwq4ydY5KzHhAuYAHA0eJhZGZ205ZsXXcYF0b0CC37zfWbKTW4eDU+XzrbfgKMpfYlv ND/6QvTS/kim8bapDuhqPPo/49BUJEGKAjlGUY1s9bKOGJxxIcoMyGr4ojWbF1kB01bm zpillDcHn35P82V2kOM2FdA76NEaBnwegAKHI/8LBhBggqws0iGmJfWG20f7YFKMQULC n5gQ== X-Gm-Message-State: AOAM532OJrZIEhEK6OUWGU3Ci1k2YVN86FKZV/TB+Rylwedl/Hc11u0r 6SvB4F1c5KSrYQ/6g+Vwgow= X-Google-Smtp-Source: ABdhPJwJy0OMf7FFRno7tU0NOOPYFzgEH3CxD6kQjCBzW5vLUJOv7vo5pcXt/kis7rfIb9FuxyesXg== X-Received: by 2002:a17:906:fcbb:: with SMTP id qw27mr8386819ejb.320.1639521868424; Tue, 14 Dec 2021 14:44:28 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:28 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 07/16] net: dsa: tag_qca: enable promisc_on_master flag Date: Tue, 14 Dec 2021 23:44:00 +0100 Message-Id: <20211214224409.5770-8-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Ethernet MDIO packets are non-standard and DSA master expects the first 6 octets to be the MAC DA. To address these kind of packet, enable promisc_on_master flag for the tagger. Signed-off-by: Ansuel Smith Reviewed-by: Vladimir Oltean --- net/dsa/tag_qca.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/dsa/tag_qca.c b/net/dsa/tag_qca.c index 34e565e00ece..f8df49d5956f 100644 --- a/net/dsa/tag_qca.c +++ b/net/dsa/tag_qca.c @@ -68,6 +68,7 @@ static const struct dsa_device_ops qca_netdev_ops = { .xmit = qca_tag_xmit, .rcv = qca_tag_rcv, .needed_headroom = QCA_HDR_LEN, + .promisc_on_master = true, }; MODULE_LICENSE("GPL"); From patchwork Tue Dec 14 22:44:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676851 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A3980C433F5 for ; Tue, 14 Dec 2021 22:45:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235113AbhLNWpO (ORCPT ); Tue, 14 Dec 2021 17:45:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34456 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234333AbhLNWob (ORCPT ); Tue, 14 Dec 2021 17:44:31 -0500 Received: from mail-ed1-x534.google.com (mail-ed1-x534.google.com [IPv6:2a00:1450:4864:20::534]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C9E4FC06173E; Tue, 14 Dec 2021 14:44:30 -0800 (PST) Received: by mail-ed1-x534.google.com with SMTP id g14so67337504edb.8; Tue, 14 Dec 2021 14:44:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=x5ytspfYRqVU3RtWAvC1Q4PzIaOo9sudFVOwJXe4gcg=; b=EtdwBl5SPttEJc8XxFn/3XItEPjM9mmvT1EJxLmjShUGvo+C4yPsJlO9K0ES1iZj7n 8OOaygmUHKBPrayut+9LJ3KyZRFhz3L+6lqiraLRvuIYCX7sCSv+IRYC/CZ69lD0dtTp 4Rua0wUH1DQtnmMf/ID054uxxSevgE8mZXriruFI0XMVlyyF4j3NEKS764g+gL0vFK30 v7Gw2oyJhn3dr01n0aZ+M2JIIMSH2GdS4Sal+k9zBOw9yRXcUSIgowbNeJ+cCq4J0LVB HPAHKitXoPIdaZhuzN0ZasPZQMajF5Ib7x20U2ufFkSb0kelA0WUGVsWNdA8odhOSj2I 7Qog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=x5ytspfYRqVU3RtWAvC1Q4PzIaOo9sudFVOwJXe4gcg=; b=f00U2shcwqLrGIISKVyGaesgqmX8k0nOyf67tx2oyqmPopSTOe+XJlyu9VmanMGG+7 a6QoND2Dy/cYxUJle2Fnr+Ln1ez3oVjALiHVaM3B0+0ffhXv3d14UlnJzPNCgrLOuchF EH9mu4g20TWzZWvgC0PBmZHgt3Av/as9azs8YQxdn1Q1AybQFTKPlhSTswoq1dVbRZvJ TcBLPdXVUwBs3W5aJCnD4zk7c7ZfTgBi85VEfZu+s7SNo8vBo8FbsnljojF35bW0N6AG XNL1vkGo7gNgXkCsaJGHczeITVgNiedjPI+qMhKKO1BBkNPugpwYea894wgO6V4DuEhS MjKA== X-Gm-Message-State: AOAM533f2bYeCblCfPQtD8gxLvhyxQowS9yKBMazZCr5YWzb5kz9dMtY 9T208RuOQmJFh/fmj+/bUnZZN1/UtGqc+g== X-Google-Smtp-Source: ABdhPJyXdtlRjuP9hasI2Jr2L1Qeh0dQzjOGAQtLsfM0M7EFGb6GyhcPVMGmwmw41HjZThdvGXPRrA== X-Received: by 2002:a17:906:3ed0:: with SMTP id d16mr680304ejj.636.1639521869272; Tue, 14 Dec 2021 14:44:29 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:29 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 08/16] net: dsa: tag_qca: add define for handling mdio Ethernet packet Date: Tue, 14 Dec 2021 23:44:01 +0100 Message-Id: <20211214224409.5770-9-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Add all the required define to prepare support for mdio read/write in Ethernet packet. Any packet of this type has to be dropped as the only use of these special packet is receive ack for an mdio write request or receive data for an mdio read request. A struct is used that emulates the Ethernet header but is used for a different purpose. Signed-off-by: Ansuel Smith --- include/linux/dsa/tag_qca.h | 41 +++++++++++++++++++++++++++++++++++++ net/dsa/tag_qca.c | 13 +++++++++--- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/include/linux/dsa/tag_qca.h b/include/linux/dsa/tag_qca.h index c02d2d39ff4a..21cd0db5acc2 100644 --- a/include/linux/dsa/tag_qca.h +++ b/include/linux/dsa/tag_qca.h @@ -12,10 +12,51 @@ #define QCA_HDR_RECV_FRAME_IS_TAGGED BIT(3) #define QCA_HDR_RECV_SOURCE_PORT GENMASK(2, 0) +/* Packet type for recv */ +#define QCA_HDR_RECV_TYPE_NORMAL 0x0 +#define QCA_HDR_RECV_TYPE_MIB 0x1 +#define QCA_HDR_RECV_TYPE_RW_REG_ACK 0x2 + #define QCA_HDR_XMIT_VERSION GENMASK(15, 14) #define QCA_HDR_XMIT_PRIORITY GENMASK(13, 11) #define QCA_HDR_XMIT_CONTROL GENMASK(10, 8) #define QCA_HDR_XMIT_FROM_CPU BIT(7) #define QCA_HDR_XMIT_DP_BIT GENMASK(6, 0) +/* Packet type for xmit */ +#define QCA_HDR_XMIT_TYPE_NORMAL 0x0 +#define QCA_HDR_XMIT_TYPE_RW_REG 0x1 + +#define MDIO_CHECK_CODE_VAL 0x5 + +/* Specific define for in-band MDIO read/write with Ethernet packet */ +#define QCA_HDR_MDIO_SEQ_LEN 4 /* 4 byte for the seq */ +#define QCA_HDR_MDIO_COMMAND_LEN 4 /* 4 byte for the command */ +#define QCA_HDR_MDIO_DATA1_LEN 4 /* First 4 byte for the mdio data */ +#define QCA_HDR_MDIO_HEADER_LEN (QCA_HDR_MDIO_SEQ_LEN + \ + QCA_HDR_MDIO_COMMAND_LEN + \ + QCA_HDR_MDIO_DATA1_LEN) + +#define QCA_HDR_MDIO_DATA2_LEN 12 /* Other 12 byte for the mdio data */ +#define QCA_HDR_MDIO_PADDING_LEN 34 /* Padding to reach the min Ethernet packet */ + +#define QCA_HDR_MDIO_PKG_LEN (QCA_HDR_MDIO_HEADER_LEN + \ + QCA_HDR_LEN + \ + QCA_HDR_MDIO_DATA2_LEN + \ + QCA_HDR_MDIO_PADDING_LEN) + +#define QCA_HDR_MDIO_SEQ_NUM GENMASK(31, 0) /* 63, 32 */ +#define QCA_HDR_MDIO_CHECK_CODE GENMASK(31, 29) /* 31, 29 */ +#define QCA_HDR_MDIO_CMD BIT(28) /* 28 */ +#define QCA_HDR_MDIO_LENGTH GENMASK(23, 20) /* 23, 20 */ +#define QCA_HDR_MDIO_ADDR GENMASK(18, 0) /* 18, 0 */ + +/* Special struct emulating a Ethernet header */ +struct mdio_ethhdr { + u32 command; /* command bit 31:0 */ + u32 seq; /* seq 63:32 */ + u32 mdio_data; /* first 4byte mdio */ + __be16 hdr; /* qca hdr */ +} __packed; + #endif /* __TAG_QCA_H */ diff --git a/net/dsa/tag_qca.c b/net/dsa/tag_qca.c index f8df49d5956f..d30249b5205d 100644 --- a/net/dsa/tag_qca.c +++ b/net/dsa/tag_qca.c @@ -32,10 +32,10 @@ static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev) static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev) { - u8 ver; - u16 hdr; - int port; + u16 hdr, pk_type; __be16 *phdr; + int port; + u8 ver; if (unlikely(!pskb_may_pull(skb, QCA_HDR_LEN))) return NULL; @@ -48,6 +48,13 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev) if (unlikely(ver != QCA_HDR_VERSION)) return NULL; + /* Get pk type */ + pk_type = FIELD_GET(QCA_HDR_RECV_TYPE, hdr); + + /* Ethernet MDIO read/write packet */ + if (pk_type == QCA_HDR_RECV_TYPE_RW_REG_ACK) + return NULL; + /* Remove QCA tag and recalculate checksum */ skb_pull_rcsum(skb, QCA_HDR_LEN); dsa_strip_etype_header(skb, QCA_HDR_LEN); From patchwork Tue Dec 14 22:44:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676853 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 09E61C433EF for ; Tue, 14 Dec 2021 22:45:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234850AbhLNWpQ (ORCPT ); Tue, 14 Dec 2021 17:45:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34458 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234880AbhLNWoc (ORCPT ); Tue, 14 Dec 2021 17:44:32 -0500 Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [IPv6:2a00:1450:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AEF11C061574; Tue, 14 Dec 2021 14:44:31 -0800 (PST) Received: by mail-ed1-x52a.google.com with SMTP id z5so68865779edd.3; Tue, 14 Dec 2021 14:44:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=8gvGz4h9p5VDfr3y+9UFYfPgO2UTc2LnpHD+Ji3lAzY=; b=fBr+QgSA2rnBZokDvwjBtlyEV62HwHRNWMCKHmtAOJQnUVkIOafDuMSQ6DdHwNgmV9 52vv92Ez0seXg/EOPM4Me80ieh88OwYr9AOwtlq6w8AhCPv2MFiwxhJjZTljjX8Vvd6A DpltWkXCtbdTnMr+pdSmmkjoi5Mj5r/eeaY+eyKI526gk+8hR92dMwGaBCYKe9/tuiG9 Ws6U5R4iHjqXUUM363VtdEeyaCsZ+fkxGdNxntdWBmV4nVgjg6KeeL/wIKqrzxz9sDgM wfOnpwgGYa/a6OTq0Fc35ZZ8P2/yPyoWkem2ovmFuP5MYcdEwJWMcX49hsrQ5MtnlRQF jdDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8gvGz4h9p5VDfr3y+9UFYfPgO2UTc2LnpHD+Ji3lAzY=; b=Pew15kei/5/h5CDwuWUJ6Fr87P74AyjjDh5OgEgznCOuBiFNmEfNE8w5l3UK+Ldcq9 grxxhXsWo6dDLvoEt5g91isvVKTyE/cRNbkTSN8KoB9Y969g3PJGTW24j7M66hKFd+sA 6JTfpE0gv84DL6TzJa1zv0baAG1KVgky/ljmBSCykzPTGonbE6VP2UsVL85xJfo54Fa/ 5k0dNRgPqDwarqMpcekrfuMgwHrT3+R05RpieUnrrCl1Xh7RTGXDR+Sp+NFufwADMLZ2 xVkOEREiA5k1pl62SDzyTRGcXGROcD0Ki5XngWudKMa7wtLzqZHYFQVe3qMZTwI7BNe3 JmPA== X-Gm-Message-State: AOAM532w9iNwS29Xw8zDNk3KC8RYwBaa0V5JLEaxOdSclUj0NjYqxIer s45KC/0BT/v7KdsElHSNNpw= X-Google-Smtp-Source: ABdhPJzpeqcbnz9GY1Ih7rJM7iEIxfjSO+ZA9I9XBpPoY6FnacAw+8CeSZNa+uUV85sdNjRa8fmlAQ== X-Received: by 2002:a05:6402:1d50:: with SMTP id dz16mr11257319edb.385.1639521870110; Tue, 14 Dec 2021 14:44:30 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:29 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 09/16] net: dsa: tag_qca: add define for handling MIB packet Date: Tue, 14 Dec 2021 23:44:02 +0100 Message-Id: <20211214224409.5770-10-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Add struct to correctly parse a mib Ethernet packet. Signed-off-by: Ansuel Smith --- include/linux/dsa/tag_qca.h | 10 ++++++++++ net/dsa/tag_qca.c | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/include/linux/dsa/tag_qca.h b/include/linux/dsa/tag_qca.h index 21cd0db5acc2..cd6275bac103 100644 --- a/include/linux/dsa/tag_qca.h +++ b/include/linux/dsa/tag_qca.h @@ -59,4 +59,14 @@ struct mdio_ethhdr { __be16 hdr; /* qca hdr */ } __packed; +enum mdio_cmd { + MDIO_WRITE = 0x0, + MDIO_READ +}; + +struct mib_ethhdr { + u32 data[3]; /* first 3 mib counter */ + __be16 hdr; /* qca hdr */ +} __packed; + #endif /* __TAG_QCA_H */ diff --git a/net/dsa/tag_qca.c b/net/dsa/tag_qca.c index d30249b5205d..f5547d357647 100644 --- a/net/dsa/tag_qca.c +++ b/net/dsa/tag_qca.c @@ -55,6 +55,10 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev) if (pk_type == QCA_HDR_RECV_TYPE_RW_REG_ACK) return NULL; + /* Ethernet MIB counter packet */ + if (pk_type == QCA_HDR_RECV_TYPE_MIB) + return NULL; + /* Remove QCA tag and recalculate checksum */ skb_pull_rcsum(skb, QCA_HDR_LEN); dsa_strip_etype_header(skb, QCA_HDR_LEN); From patchwork Tue Dec 14 22:44:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676841 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B1F4CC433F5 for ; Tue, 14 Dec 2021 22:44:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235139AbhLNWoo (ORCPT ); Tue, 14 Dec 2021 17:44:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34472 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234943AbhLNWod (ORCPT ); Tue, 14 Dec 2021 17:44:33 -0500 Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com [IPv6:2a00:1450:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 85E8BC061759; Tue, 14 Dec 2021 14:44:32 -0800 (PST) Received: by mail-ed1-x535.google.com with SMTP id x15so69151386edv.1; Tue, 14 Dec 2021 14:44:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GwHqgjel+4o9jEPKFMNRrXsb7H4k5y695Z60FXM2aPM=; b=GkmAiEJMU5gi4MZhyRcBXQUAWr6vTWYOE+rre27Lxj1AfqM4CmqgyCPcRjtItP3w45 nWaCcSXCAMYBOwowSAa3esyNUZXM3tBpDjtckZaaFDAIxhG9/eI2gNT5BseKSKGbjWLi ON51skTyT2XGIdl2YJb+A7wjObPIpZluQnC/qjKtCruMxHHLJXIDkjf1Ge4eWXqoUApQ SomPuV2QyqDk04F3LHD7WXcazSmim+NVGDIzt8N+lRjp4IrUGu9UUckJK5G4yoW7zz6O fcoPeKpwbYyEmn3W0GR+nVZ7Gxlg90Kj6h6jhezlLtmDJEHPx5PkpFgkpYeBbyg7r6El bhZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GwHqgjel+4o9jEPKFMNRrXsb7H4k5y695Z60FXM2aPM=; b=Ex0hCByKAxq9FZx+6dAPlsM1JJTDR06alJ5hEp7t6U/3MzThlk/SYzf1MGNsHQQWei rISmtofzrSC+GMQ6N87yoHnzOukQehdOe0qtdshPqbZnVEwW70sU+u1AzGU0ACVXZXgg heEUnSgQ4YfnL6MTemAoegxYsTq5U9jX7BhGwGXKK7JqgO1dxUcwwrK9Mk1WEEXvZmiJ o6mkrV2xrSaF9NZWvcbiVHhkBsfOkF7LzKPJyeTNvHGzHKHvc0hWIMJAglzQMBzPExF9 kFEojblCQfdbryam5iPf+DR0e2GCln4Tz17PFD8cgm/uA/gfLQRswS8tbBvryxq+8014 XdJw== X-Gm-Message-State: AOAM531plg9cwCZAZCfW1NJ0LQkDu5u7iZt8uNcyv4aM4sTDgdbI/FCd k77HKUHkHkzrNs51AaZEcoM= X-Google-Smtp-Source: ABdhPJyIi0T9g4+/VIf1+N+wpV1vAZ46m7sf44D1bF8SdGVt5RYdpufCKkSmkPVI9JFIksgP75E+Iw== X-Received: by 2002:aa7:c915:: with SMTP id b21mr11341245edt.195.1639521871028; Tue, 14 Dec 2021 14:44:31 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:30 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 10/16] net: dsa: tag_qca: add support for handling mdio Ethernet and MIB packet Date: Tue, 14 Dec 2021 23:44:03 +0100 Message-Id: <20211214224409.5770-11-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Add connect/disconnect helper to assign private struct to the cpu port dsa priv. Add support for Ethernet mdio packet and MIB packet if the dsa driver provide an handler to correctly parse and elaborate the data. Signed-off-by: Ansuel Smith --- include/linux/dsa/tag_qca.h | 7 +++++++ net/dsa/tag_qca.c | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/include/linux/dsa/tag_qca.h b/include/linux/dsa/tag_qca.h index cd6275bac103..203e72dad9bb 100644 --- a/include/linux/dsa/tag_qca.h +++ b/include/linux/dsa/tag_qca.h @@ -69,4 +69,11 @@ struct mib_ethhdr { __be16 hdr; /* qca hdr */ } __packed; +struct tag_qca_priv { + void (*rw_reg_ack_handler)(struct dsa_port *dp, + struct sk_buff *skb); + void (*mib_autocast_handler)(struct dsa_port *dp, + struct sk_buff *skb); +}; + #endif /* __TAG_QCA_H */ diff --git a/net/dsa/tag_qca.c b/net/dsa/tag_qca.c index f5547d357647..59e04157f53b 100644 --- a/net/dsa/tag_qca.c +++ b/net/dsa/tag_qca.c @@ -32,11 +32,15 @@ static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev) static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev) { + struct dsa_port *dp = dev->dsa_ptr; + struct tag_qca_priv *priv; u16 hdr, pk_type; __be16 *phdr; int port; u8 ver; + priv = dp->ds->tagger_data; + if (unlikely(!pskb_may_pull(skb, QCA_HDR_LEN))) return NULL; @@ -52,12 +56,18 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev) pk_type = FIELD_GET(QCA_HDR_RECV_TYPE, hdr); /* Ethernet MDIO read/write packet */ - if (pk_type == QCA_HDR_RECV_TYPE_RW_REG_ACK) + if (pk_type == QCA_HDR_RECV_TYPE_RW_REG_ACK) { + if (priv->rw_reg_ack_handler) + priv->rw_reg_ack_handler(dp, skb); return NULL; + } /* Ethernet MIB counter packet */ - if (pk_type == QCA_HDR_RECV_TYPE_MIB) + if (pk_type == QCA_HDR_RECV_TYPE_MIB) { + if (priv->mib_autocast_handler) + priv->mib_autocast_handler(dp, skb); return NULL; + } /* Remove QCA tag and recalculate checksum */ skb_pull_rcsum(skb, QCA_HDR_LEN); @@ -73,9 +83,30 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev) return skb; } +static int qca_tag_connect(struct dsa_switch *ds) +{ + struct tag_qca_priv *priv; + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + ds->tagger_data = priv; + + return 0; +} + +static void qca_tag_disconnect(struct dsa_switch *ds) +{ + kfree(ds->tagger_data); + ds->tagger_data = NULL; +} + static const struct dsa_device_ops qca_netdev_ops = { .name = "qca", .proto = DSA_TAG_PROTO_QCA, + .connect = qca_tag_connect, + .disconnect = qca_tag_disconnect, .xmit = qca_tag_xmit, .rcv = qca_tag_rcv, .needed_headroom = QCA_HDR_LEN, From patchwork Tue Dec 14 22:44:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676837 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B194DC433F5 for ; Tue, 14 Dec 2021 22:44:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234938AbhLNWol (ORCPT ); Tue, 14 Dec 2021 17:44:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34478 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234951AbhLNWoe (ORCPT ); Tue, 14 Dec 2021 17:44:34 -0500 Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 66A97C06175B; Tue, 14 Dec 2021 14:44:33 -0800 (PST) Received: by mail-ed1-x52d.google.com with SMTP id z5so68865956edd.3; Tue, 14 Dec 2021 14:44:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TUPes/3MtaxDn8kCbGlju4ZLauNKEJ7jIp98yMyyHDo=; b=Qod2HXambTP7Jzfg3EuoLio6ayZeZH0ljF5+RBiSJEKhmsqpDReVM9L4KyGag0rAbp QQcFpq3FTQ+v9Ft0IQgofXbz9LJ/tOlVPzLtFMZRAw4oXqHT/hOI+UhI2mEO1tz/Ny7S 1z4aRmnPIhIlahuNVvAjwz7Nr6Gcxk5GLknt3pNxxF00aPyTkA8TfxWItixj0HBj9aBj zc4caxr+hh0zCSs73ExhiU3Rx3utIjuKO42DQXJnNSjhc5ZMtewHzQpkfsdcUM3083aI gv2TQyHqBER0DtlPcCGuNyz5mcSNTdvznoJs1e2xD2kAzGLoTn81ytACnswOuswcqK96 rGIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TUPes/3MtaxDn8kCbGlju4ZLauNKEJ7jIp98yMyyHDo=; b=xksi+tsM27mKiKg5NV76o0keaAJza926al72fuToTygGX9Uc4u+1ZnvO2RpPYK8pSS xbciN3ipzmQXbpGO+WjenEQfvnwmIgpKfbxeXiiAvOp110vl9zyx8x4R/drHzN+bVQKx tFB9KTVdG2w0lmowJQ//KgzqyYibDCkhAqKB9u9M85+nYqVONiECmEtNg2aRzjKE7rs+ WJDYKo6MymIK0BfTGvCHmYXvnO3elUsqH1C+AM01cTmsye/Fz0iLw6vZT2X6kyPi5LA+ rnTExsrgIci6HchVfLH7z4BanRS+7ymohwvKeRWr9S0ttjyLxlmvnXILES17fBUFEM2O 1ibg== X-Gm-Message-State: AOAM530LnpAOY0hgXHJGdNn8XsSJop/qzY7l1QZSOFjXUptqaw+ZPHJm ZCahVNgZpTRzwOl8WV/GFvs= X-Google-Smtp-Source: ABdhPJx2g+lD3MVRoyUkom5JHmgoMfziRfnwxGCdZrPgOopgDW87T2i+L3yNGdAv2CKijtM5HfsOOg== X-Received: by 2002:a50:eacb:: with SMTP id u11mr11525380edp.290.1639521871887; Tue, 14 Dec 2021 14:44:31 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:31 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 11/16] net: dsa: qca8k: add tracking state of master port Date: Tue, 14 Dec 2021 23:44:04 +0100 Message-Id: <20211214224409.5770-12-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC MDIO/MIB Ethernet require the master port and the tagger availabale to correctly work. Use the new api master_state_change to track when master is operational or not and set a bool in qca8k_priv. We cache the first cached master available and we check if other cpu port are operational when the cached one goes down. This cached master will later be used by mdio read/write and mib request to correctly use the working function. qca8k implementation for MDIO/MIB Ethernet is bad. CPU port0 is the only one that answers with the ack packet or sends MIB Ethernet packets. For this reason the master_state_change ignore CPU port6 and checkes only CPU port0 if it's operational and enables this mode. Signed-off-by: Ansuel Smith --- drivers/net/dsa/qca8k.c | 18 ++++++++++++++++++ drivers/net/dsa/qca8k.h | 1 + 2 files changed, 19 insertions(+) diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c index 039694518788..f317f527dd6d 100644 --- a/drivers/net/dsa/qca8k.c +++ b/drivers/net/dsa/qca8k.c @@ -2383,6 +2383,23 @@ qca8k_port_lag_leave(struct dsa_switch *ds, int port, return qca8k_lag_refresh_portmap(ds, port, lag, true); } +static void +qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, + bool operational) +{ + struct dsa_port *dp = master->dsa_ptr; + struct qca8k_priv *priv = ds->priv; + + /* Ethernet MIB/MDIO is only supported for CPU port 0 */ + if (dp->index != 0) + return; + + if (operational) + priv->master = master; + else + priv->master = NULL; +} + static const struct dsa_switch_ops qca8k_switch_ops = { .get_tag_protocol = qca8k_get_tag_protocol, .setup = qca8k_setup, @@ -2418,6 +2435,7 @@ static const struct dsa_switch_ops qca8k_switch_ops = { .get_phy_flags = qca8k_get_phy_flags, .port_lag_join = qca8k_port_lag_join, .port_lag_leave = qca8k_port_lag_leave, + .master_state_change = qca8k_master_change, }; static int qca8k_read_switch_id(struct qca8k_priv *priv) diff --git a/drivers/net/dsa/qca8k.h b/drivers/net/dsa/qca8k.h index ab4a417b25a9..6edd6adc3063 100644 --- a/drivers/net/dsa/qca8k.h +++ b/drivers/net/dsa/qca8k.h @@ -353,6 +353,7 @@ struct qca8k_priv { struct dsa_switch_ops ops; struct gpio_desc *reset_gpio; unsigned int port_mtu[QCA8K_NUM_PORTS]; + const struct net_device *master; /* Track if mdio/mib Ethernet is available */ }; struct qca8k_mib_desc { From patchwork Tue Dec 14 22:44:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676839 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AA8C9C433FE for ; Tue, 14 Dec 2021 22:44:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237949AbhLNWon (ORCPT ); Tue, 14 Dec 2021 17:44:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34446 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234957AbhLNWoe (ORCPT ); Tue, 14 Dec 2021 17:44:34 -0500 Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [IPv6:2a00:1450:4864:20::52b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4F597C061401; Tue, 14 Dec 2021 14:44:34 -0800 (PST) Received: by mail-ed1-x52b.google.com with SMTP id b7so8965716edd.6; Tue, 14 Dec 2021 14:44:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vJbJi1ThV7bAHbvegZ0HHH0c+JkZByFP3chmDOiUsak=; b=Ayewu5lrjg4ofGZhVXxwKkieutSyNtVTYAXxLbcHc9UB9AcoaQLUweYQhTDkM2z4DQ ezNSUcp+qWl2Xu3Ty6GSH2HiRdnVfnfeslBeleNe8Kow/lf1K30myYhReLUbmy+kAygM 7CLyVoxiRDNTWtiykows4EtH4SxZYKwIx7SOVSQQIChRzKmSQCUtmunJOdqJqOUMDqo9 DWGwRNCBg4GiYGrO5Xv6JKLC1clbhI9zaDw6uVsiyKVQ97LFuCXjVpe2vtJlrvgSiXtW 6UzHbMh9UNqUOXRo5zFvnQbKItPf/4ibmh980NevwS7Ncd742ElNeoOTOziqbpZlx1SK FhjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vJbJi1ThV7bAHbvegZ0HHH0c+JkZByFP3chmDOiUsak=; b=oXsvezjs4Kd94stQDmAva/LWJj/RnqdJm/oxKCr01fczIwCWCVG0Bk4h6gmRXAxUhH beIhpPT0hyDF9fy887Ia8F6G0QL8Opj1D9CLBEDHjuGTS5v88pzT+JTylVcCs9d1bkFA sNdxL3Bg4xMJ+aguTY6TCfeE4DPvPxjOfREBsITrvtO00zNBVEWQhpPAqbkrcr/LtOZb 8wcn2dT39GomqRw+bCn7huYLu5tu8YQFsT94Y0PoufxLj8ANrOuXto7cuKeDA+kjBVQt Wq0C5gPZqny4uedfpiq4t349RjoyyFped5t1YWXWihRPBbO297ffrkKgBjGlUy3p8Xf2 riZw== X-Gm-Message-State: AOAM532J8/vR5PoZgik5lf6ZSm6m0j3jxmD4i39gD0JYhPqwhd/JV1bv qZUY3K4SGJpB0PKYg7no33E= X-Google-Smtp-Source: ABdhPJzpHUhPaCGOOBpkikC8YF14bHJ5EY2TIlqY/AGVEl8nwkZsJjltBMb3fXCM2WNb/mqsSpA7+w== X-Received: by 2002:a17:907:1614:: with SMTP id hb20mr8809340ejc.299.1639521872724; Tue, 14 Dec 2021 14:44:32 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:32 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 12/16] net: dsa: qca8k: add support for mdio read/write in Ethernet packet Date: Tue, 14 Dec 2021 23:44:05 +0100 Message-Id: <20211214224409.5770-13-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Add qca8k side support for mdio read/write in Ethernet packet. qca8k supports some specially crafted Ethernet packet that can be used for mdio read/write instead of the legacy method uart/internal mdio. This add support for the qca8k side to craft the packet and enqueue it. Each port and the qca8k_priv have a special struct to put data in it. The completion API is used to wait for the packet to be received back with the requested data. The various steps are: 1. Craft the special packet with the qca hdr set to mdio read/write mode. 2. Set the lock in the dedicated mdio struct. 3. Reinit the completion. 4. Enqueue the packet. 5. Wait the packet to be received. 6. Use the data set by the tagger to complete the mdio operation. If the completion timeouts or the ack value is not true, the legacy mdio way is used. It has to be considered that in the initial setup mdio is still used and mdio is still used until DSA is ready to accept and tag packet. tag_proto_connect() is used to fill the required handler for the tagger to correctly parse and elaborate the special Ethernet mdio packet. Locking is added to qca8k_master_change() to make sure no mdio Ethernet are in progress. Signed-off-by: Ansuel Smith --- drivers/net/dsa/qca8k.c | 192 ++++++++++++++++++++++++++++++++++++++++ drivers/net/dsa/qca8k.h | 13 +++ 2 files changed, 205 insertions(+) diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c index f317f527dd6d..b35ba26a0696 100644 --- a/drivers/net/dsa/qca8k.c +++ b/drivers/net/dsa/qca8k.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "qca8k.h" @@ -170,6 +171,158 @@ qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) return regmap_update_bits(priv->regmap, reg, mask, write_val); } +static void qca8k_rw_reg_ack_handler(struct dsa_port *dp, struct sk_buff *skb) +{ + struct qca8k_mdio_hdr_data *mdio_hdr_data; + struct qca8k_priv *priv = dp->ds->priv; + struct mdio_ethhdr *mdio_ethhdr; + u8 len, cmd; + + mdio_ethhdr = (struct mdio_ethhdr *)skb_mac_header(skb); + mdio_hdr_data = &priv->mdio_hdr_data; + + cmd = FIELD_GET(QCA_HDR_MDIO_CMD, mdio_ethhdr->command); + len = FIELD_GET(QCA_HDR_MDIO_LENGTH, mdio_ethhdr->command); + + /* Make sure the seq match the requested packet */ + if (mdio_ethhdr->seq == mdio_hdr_data->seq) + mdio_hdr_data->ack = true; + + if (cmd == MDIO_READ) { + mdio_hdr_data->data[0] = mdio_ethhdr->mdio_data; + + /* Get the rest of the 12 byte of data */ + if (len > QCA_HDR_MDIO_DATA1_LEN) + memcpy(mdio_hdr_data->data + 1, skb->data, + QCA_HDR_MDIO_DATA2_LEN); + } + + complete(&mdio_hdr_data->rw_done); +} + +static struct sk_buff *qca8k_alloc_mdio_header(enum mdio_cmd cmd, u32 reg, u32 *val, + int seq_num, int priority) +{ + struct mdio_ethhdr *mdio_ethhdr; + struct sk_buff *skb; + u16 hdr; + + skb = dev_alloc_skb(QCA_HDR_MDIO_PKG_LEN); + + skb_reset_mac_header(skb); + skb_set_network_header(skb, skb->len); + + mdio_ethhdr = skb_push(skb, QCA_HDR_MDIO_HEADER_LEN + QCA_HDR_LEN); + + hdr = FIELD_PREP(QCA_HDR_XMIT_VERSION, QCA_HDR_VERSION); + hdr |= FIELD_PREP(QCA_HDR_XMIT_PRIORITY, priority); + hdr |= QCA_HDR_XMIT_FROM_CPU; + hdr |= FIELD_PREP(QCA_HDR_XMIT_DP_BIT, BIT(0)); + hdr |= FIELD_PREP(QCA_HDR_XMIT_CONTROL, QCA_HDR_XMIT_TYPE_RW_REG); + + mdio_ethhdr->seq = FIELD_PREP(QCA_HDR_MDIO_SEQ_NUM, seq_num); + + mdio_ethhdr->command = FIELD_PREP(QCA_HDR_MDIO_ADDR, reg); + mdio_ethhdr->command |= FIELD_PREP(QCA_HDR_MDIO_LENGTH, 4); + mdio_ethhdr->command |= FIELD_PREP(QCA_HDR_MDIO_CMD, cmd); + mdio_ethhdr->command |= FIELD_PREP(QCA_HDR_MDIO_CHECK_CODE, MDIO_CHECK_CODE_VAL); + + if (cmd == MDIO_WRITE) + mdio_ethhdr->mdio_data = *val; + + mdio_ethhdr->hdr = htons(hdr); + + skb_put_zero(skb, QCA_HDR_MDIO_DATA2_LEN); + skb_put_zero(skb, QCA_HDR_MDIO_PADDING_LEN); + + return skb; +} + +static int qca8k_read_eth(struct qca8k_priv *priv, u32 reg, u32 *val) +{ + struct qca8k_mdio_hdr_data *mdio_hdr_data = &priv->mdio_hdr_data; + struct sk_buff *skb; + bool ack; + int ret; + + skb = qca8k_alloc_mdio_header(MDIO_READ, reg, NULL, 200, QCA8K_ETHERNET_MDIO_PRIORITY); + skb->dev = (struct net_device *)priv->master; + + mutex_lock(&mdio_hdr_data->mutex); + + reinit_completion(&mdio_hdr_data->rw_done); + mdio_hdr_data->seq = 200; + mdio_hdr_data->ack = false; + + dev_queue_xmit(skb); + + ret = wait_for_completion_timeout(&mdio_hdr_data->rw_done, + msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); + + *val = mdio_hdr_data->data[0]; + ack = mdio_hdr_data->ack; + + mutex_unlock(&mdio_hdr_data->mutex); + + if (ret <= 0) + return -ETIMEDOUT; + + if (!ack) + return -EINVAL; + + return 0; +} + +static int qca8k_write_eth(struct qca8k_priv *priv, u32 reg, u32 val) +{ + struct qca8k_mdio_hdr_data *mdio_hdr_data = &priv->mdio_hdr_data; + struct sk_buff *skb; + bool ack; + int ret; + + skb = qca8k_alloc_mdio_header(MDIO_WRITE, reg, &val, 200, QCA8K_ETHERNET_MDIO_PRIORITY); + skb->dev = (struct net_device *)priv->master; + + mutex_lock(&mdio_hdr_data->mutex); + + reinit_completion(&mdio_hdr_data->rw_done); + mdio_hdr_data->ack = false; + mdio_hdr_data->seq = 200; + + dev_queue_xmit(skb); + + ret = wait_for_completion_timeout(&mdio_hdr_data->rw_done, + msecs_to_jiffies(QCA8K_ETHERNET_TIMEOUT)); + + ack = mdio_hdr_data->ack; + + mutex_unlock(&mdio_hdr_data->mutex); + + if (ret <= 0) + return -ETIMEDOUT; + + if (!ack) + return -EINVAL; + + return 0; +} + +static int +qca8k_regmap_update_bits_eth(struct qca8k_priv *priv, u32 reg, u32 mask, u32 write_val) +{ + u32 val = 0; + int ret; + + ret = qca8k_read_eth(priv, reg, &val); + if (ret) + return ret; + + val &= ~mask; + val |= write_val; + + return qca8k_write_eth(priv, reg, val); +} + static int qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) { @@ -178,6 +331,9 @@ qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) u16 r1, r2, page; int ret; + if (priv->master && !qca8k_read_eth(priv, reg, val)) + return 0; + qca8k_split_addr(reg, &r1, &r2, &page); mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); @@ -201,6 +357,9 @@ qca8k_regmap_write(void *ctx, uint32_t reg, uint32_t val) u16 r1, r2, page; int ret; + if (priv->master && !qca8k_write_eth(priv, reg, val)) + return 0; + qca8k_split_addr(reg, &r1, &r2, &page); mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); @@ -225,6 +384,10 @@ qca8k_regmap_update_bits(void *ctx, uint32_t reg, uint32_t mask, uint32_t write_ u32 val; int ret; + if (priv->master && + !qca8k_regmap_update_bits_eth(priv, reg, mask, write_val)) + return 0; + qca8k_split_addr(reg, &r1, &r2, &page); mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); @@ -2394,10 +2557,38 @@ qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, if (dp->index != 0) return; + mutex_lock(&priv->mdio_hdr_data.mutex); + if (operational) priv->master = master; else priv->master = NULL; + + mutex_unlock(&priv->mdio_hdr_data.mutex); +} + +static int qca8k_connect_tag_protocol(struct dsa_switch *ds, + enum dsa_tag_protocol proto) +{ + struct qca8k_priv *qca8k_priv = ds->priv; + + switch (proto) { + case DSA_TAG_PROTO_QCA: + struct tag_qca_priv *priv; + + priv = ds->tagger_data; + + mutex_init(&qca8k_priv->mdio_hdr_data.mutex); + init_completion(&qca8k_priv->mdio_hdr_data.rw_done); + + priv->rw_reg_ack_handler = qca8k_rw_reg_ack_handler; + + break; + default: + return -EOPNOTSUPP; + } + + return 0; } static const struct dsa_switch_ops qca8k_switch_ops = { @@ -2436,6 +2627,7 @@ static const struct dsa_switch_ops qca8k_switch_ops = { .port_lag_join = qca8k_port_lag_join, .port_lag_leave = qca8k_port_lag_leave, .master_state_change = qca8k_master_change, + .connect_tag_protocol = qca8k_connect_tag_protocol, }; static int qca8k_read_switch_id(struct qca8k_priv *priv) diff --git a/drivers/net/dsa/qca8k.h b/drivers/net/dsa/qca8k.h index 6edd6adc3063..dbe8c74c9793 100644 --- a/drivers/net/dsa/qca8k.h +++ b/drivers/net/dsa/qca8k.h @@ -11,6 +11,10 @@ #include #include #include +#include + +#define QCA8K_ETHERNET_MDIO_PRIORITY 7 +#define QCA8K_ETHERNET_TIMEOUT 100 #define QCA8K_NUM_PORTS 7 #define QCA8K_NUM_CPU_PORTS 2 @@ -328,6 +332,14 @@ enum { QCA8K_CPU_PORT6, }; +struct qca8k_mdio_hdr_data { + struct completion rw_done; + struct mutex mutex; /* Enforce one mdio read/write at time */ + bool ack; + u32 seq; + u32 data[4]; +}; + struct qca8k_ports_config { bool sgmii_rx_clk_falling_edge; bool sgmii_tx_clk_falling_edge; @@ -354,6 +366,7 @@ struct qca8k_priv { struct gpio_desc *reset_gpio; unsigned int port_mtu[QCA8K_NUM_PORTS]; const struct net_device *master; /* Track if mdio/mib Ethernet is available */ + struct qca8k_mdio_hdr_data mdio_hdr_data; }; struct qca8k_mib_desc { From patchwork Tue Dec 14 22:44:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676847 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6F4EEC433FE for ; Tue, 14 Dec 2021 22:45:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238096AbhLNWpE (ORCPT ); Tue, 14 Dec 2021 17:45:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34456 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234496AbhLNWof (ORCPT ); Tue, 14 Dec 2021 17:44:35 -0500 Received: from mail-ed1-x536.google.com (mail-ed1-x536.google.com [IPv6:2a00:1450:4864:20::536]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 39FD2C06173E; Tue, 14 Dec 2021 14:44:35 -0800 (PST) Received: by mail-ed1-x536.google.com with SMTP id g14so67337992edb.8; Tue, 14 Dec 2021 14:44:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JeAi0SZFbE9hfwA4m3ax/iVDjREfzAlmtjN25vO1oZY=; b=N0ia3f/RS5V5QelIErJMO3SJQGVSfgACX8XrHHEvtmv2xUfMB2MPwoRCnJYtxTL4bV zzWxYSMA1no7B+gEPBpKoDap6G4j+5GlsRKg0xFdHbWcNivJxmlZR29/dgvQKjTdGtvi iVLHrCoICPKN24HVYiyXc+Lj73RXFHTRErZPdunoJ9clqYowUV7QcVkb3+8Bq7sNWiOI PzvgKJNOW/OahHkWwXzHvBeBQoGoORS7wgKab8doQ8wdOQu4lpqsRpmSCszC7NIw7FwL yGITwGY+SJ9su4oBZItVlrxxTR9ekhcUowCOGwy6vq2MGxNPfIrBPpLFbMBdhZvWQi/o uP+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JeAi0SZFbE9hfwA4m3ax/iVDjREfzAlmtjN25vO1oZY=; b=QOBQehIPEfiSffCUfUPt6bvNbIoRDlVLWj3oqgm7gGC3LsWgkXCScatJEDpRUnUfqB idrqU7Fe+SAdskoTlquAxcOFFaN5rkJ1fnqRkGeoHKMPKeB7gikaxlHnRc67/1gAzVCA uYjIrSoZHHaFQY2ZFTOCPjMzvQZLdavgMBTXMVIhrpXBcfhixnaQ3xzvrkkLvSL4u3z5 exg0nOqRo/0IwF9/tOgm9anz2kMAvwZa00KB9l/LiALzTubO15JiUjnN4Tsi7lW4SKi3 MszpDtIzeK1qBWvOjMBSCzn5DgMRL5WcsZyS/+LmyeR6kbKwgf/Ta0IYOEeJVoc76ri+ 8o3A== X-Gm-Message-State: AOAM531WdMjFlM9IPPZXwpZUqrrF/NyTgmTB1m62na9QdQn4jHo+Iryw weRyQCFOXdeGOcvv4KRGnh1L5t6VHlVNCw== X-Google-Smtp-Source: ABdhPJyWV43DgHW9u5yJ9m6xYY6IOcniQZ6sNe1hsqCRMy3VpiGIEnNVohl+e/CyfWtC3KvaBDRXUg== X-Received: by 2002:aa7:cb81:: with SMTP id r1mr11359619edt.352.1639521873596; Tue, 14 Dec 2021 14:44:33 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:33 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 13/16] net: dsa: qca8k: add support for mib autocast in Ethernet packet Date: Tue, 14 Dec 2021 23:44:06 +0100 Message-Id: <20211214224409.5770-14-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC The switch can autocast MIB counter using Ethernet packet. Add support for this and provide a handler for the tagger. The switch will send packet with MIB counter for each port, the switch will use completion API to wait for the correct packet to be received and will complete the task only when each packet is received. Although the handler will drop all the other packet, we still have to consume each MIB packet to complete the request. This is done to prevent mixed data with concurrent ethtool request. connect_tag_protocol() is used to add the handler to the tag_qca tagger, master_state_change() use the MIB lock to make sure no MIB Ethernet is in progress. Signed-off-by: Ansuel Smith --- drivers/net/dsa/qca8k.c | 106 +++++++++++++++++++++++++++++++++++++++- drivers/net/dsa/qca8k.h | 17 ++++++- 2 files changed, 121 insertions(+), 2 deletions(-) diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c index b35ba26a0696..15f265c6ef02 100644 --- a/drivers/net/dsa/qca8k.c +++ b/drivers/net/dsa/qca8k.c @@ -795,7 +795,10 @@ qca8k_mib_init(struct qca8k_priv *priv) int ret; mutex_lock(&priv->reg_mutex); - ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_FLUSH | QCA8K_MIB_BUSY); + ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, + QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, + FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) | + QCA8K_MIB_BUSY); if (ret) goto exit; @@ -1866,6 +1869,97 @@ qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) ETH_GSTRING_LEN); } +static void qca8k_mib_autocast_handler(struct dsa_port *dp, struct sk_buff *skb) +{ + const struct qca8k_match_data *match_data; + struct qca8k_mib_hdr_data *mib_hdr_data; + struct qca8k_priv *priv = dp->ds->priv; + const struct qca8k_mib_desc *mib; + struct mib_ethhdr *mib_ethhdr; + int i, mib_len, offset = 0; + u64 *data; + u8 port; + + mib_ethhdr = (struct mib_ethhdr *)skb_mac_header(skb); + mib_hdr_data = &priv->mib_hdr_data; + + /* The switch autocast every port. Ignore other packet and + * parse only the requested one. + */ + port = FIELD_GET(QCA_HDR_RECV_SOURCE_PORT, ntohs(mib_ethhdr->hdr)); + if (port != mib_hdr_data->req_port) + goto exit; + + match_data = device_get_match_data(priv->dev); + data = mib_hdr_data->data; + + for (i = 0; i < match_data->mib_count; i++) { + mib = &ar8327_mib[i]; + + /* First 3 mib are present in the skb head */ + if (i < 3) { + data[i] = mib_ethhdr->data[i]; + continue; + } + + mib_len = sizeof(uint32_t); + + /* Some mib are 64 bit wide */ + if (mib->size == 2) + mib_len = sizeof(uint64_t); + + /* Copy the mib value from packet to the */ + memcpy(data + i, skb->data + offset, mib_len); + + /* Set the offset for the next mib */ + offset += mib_len; + } + +exit: + /* Complete on receiving all the mib packet */ + if (refcount_dec_and_test(&mib_hdr_data->port_parsed)) + complete(&mib_hdr_data->rw_done); +} + +static int +qca8k_get_ethtool_stats_eth(struct dsa_switch *ds, int port, u64 *data) +{ + struct dsa_port *dp = dsa_to_port(ds, port); + struct qca8k_mib_hdr_data *mib_hdr_data; + struct qca8k_priv *priv = ds->priv; + int ret; + + mib_hdr_data = &priv->mib_hdr_data; + + mutex_lock(&mib_hdr_data->mutex); + + reinit_completion(&mib_hdr_data->rw_done); + + mib_hdr_data->req_port = dp->index; + mib_hdr_data->data = data; + refcount_set(&mib_hdr_data->port_parsed, QCA8K_NUM_PORTS); + + mutex_lock(&priv->reg_mutex); + + /* Send mib autocast request */ + ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB, + QCA8K_MIB_FUNC | QCA8K_MIB_BUSY, + FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_CAST) | + QCA8K_MIB_BUSY); + + mutex_unlock(&priv->reg_mutex); + + if (ret) + goto exit; + + ret = wait_for_completion_timeout(&mib_hdr_data->rw_done, QCA8K_ETHERNET_TIMEOUT); + +exit: + mutex_unlock(&mib_hdr_data->mutex); + + return ret; +} + static void qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data) @@ -1877,6 +1971,10 @@ qca8k_get_ethtool_stats(struct dsa_switch *ds, int port, u32 hi = 0; int ret; + if (priv->master && + qca8k_get_ethtool_stats_eth(ds, port, data) > 0) + return; + match_data = of_device_get_match_data(priv->dev); for (i = 0; i < match_data->mib_count; i++) { @@ -2558,6 +2656,7 @@ qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, return; mutex_lock(&priv->mdio_hdr_data.mutex); + mutex_lock(&priv->mib_hdr_data.mutex); if (operational) priv->master = master; @@ -2565,6 +2664,7 @@ qca8k_master_change(struct dsa_switch *ds, const struct net_device *master, priv->master = NULL; mutex_unlock(&priv->mdio_hdr_data.mutex); + mutex_unlock(&priv->mib_hdr_data.mutex); } static int qca8k_connect_tag_protocol(struct dsa_switch *ds, @@ -2581,7 +2681,11 @@ static int qca8k_connect_tag_protocol(struct dsa_switch *ds, mutex_init(&qca8k_priv->mdio_hdr_data.mutex); init_completion(&qca8k_priv->mdio_hdr_data.rw_done); + mutex_init(&qca8k_priv->mib_hdr_data.mutex); + init_completion(&qca8k_priv->mib_hdr_data.rw_done); + priv->rw_reg_ack_handler = qca8k_rw_reg_ack_handler; + priv->mib_autocast_handler = qca8k_mib_autocast_handler; break; default: diff --git a/drivers/net/dsa/qca8k.h b/drivers/net/dsa/qca8k.h index dbe8c74c9793..4aca07db0192 100644 --- a/drivers/net/dsa/qca8k.h +++ b/drivers/net/dsa/qca8k.h @@ -67,7 +67,7 @@ #define QCA8K_REG_MODULE_EN 0x030 #define QCA8K_MODULE_EN_MIB BIT(0) #define QCA8K_REG_MIB 0x034 -#define QCA8K_MIB_FLUSH BIT(24) +#define QCA8K_MIB_FUNC GENMASK(26, 24) #define QCA8K_MIB_CPU_KEEP BIT(20) #define QCA8K_MIB_BUSY BIT(17) #define QCA8K_MDIO_MASTER_CTRL 0x3c @@ -317,6 +317,12 @@ enum qca8k_vlan_cmd { QCA8K_VLAN_READ = 6, }; +enum qca8k_mid_cmd { + QCA8K_MIB_FLUSH = 1, + QCA8K_MIB_FLUSH_PORT = 2, + QCA8K_MIB_CAST = 3, +}; + struct ar8xxx_port_status { int enabled; }; @@ -340,6 +346,14 @@ struct qca8k_mdio_hdr_data { u32 data[4]; }; +struct qca8k_mib_hdr_data { + struct completion rw_done; + struct mutex mutex; /* Process one command at time */ + refcount_t port_parsed; /* Counter to track parsed port */ + u8 req_port; + u64 *data; /* pointer to ethtool data */ +}; + struct qca8k_ports_config { bool sgmii_rx_clk_falling_edge; bool sgmii_tx_clk_falling_edge; @@ -367,6 +381,7 @@ struct qca8k_priv { unsigned int port_mtu[QCA8K_NUM_PORTS]; const struct net_device *master; /* Track if mdio/mib Ethernet is available */ struct qca8k_mdio_hdr_data mdio_hdr_data; + struct qca8k_mib_hdr_data mib_hdr_data; }; struct qca8k_mib_desc { From patchwork Tue Dec 14 22:44:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676849 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2EFF2C433EF for ; Tue, 14 Dec 2021 22:45:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237956AbhLNWpC (ORCPT ); Tue, 14 Dec 2021 17:45:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34486 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234991AbhLNWog (ORCPT ); Tue, 14 Dec 2021 17:44:36 -0500 Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com [IPv6:2a00:1450:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 00D7FC061747; Tue, 14 Dec 2021 14:44:36 -0800 (PST) Received: by mail-ed1-x535.google.com with SMTP id t5so68003631edd.0; Tue, 14 Dec 2021 14:44:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=S512LTgy5xGLeOLFRV+SrFz9c3b/WhxCle94KC/wZ9M=; b=HyW/OHJsxQ5yKVN9JD2uu9uVDtDJbp5C0DPkdTQNmfE3GomX9BqHQgq2kDiAOQWCUn tae4MZFbmoU6MKegVzbpxvlium/kvjCgP4Nz//3LNM08ljTmC42MrB9fgBaR9gALrciP GwFKl/V1arj1hJSusCgWkM1eoIdaM9JoE4HTpCM2WLvG17xUqWo3cspypDOCF7aOqZDm nZwfiJzi/SuyI4yiCTllzoEra9dhCbdoyguOglzIwBfQ5vku94AI67PHQRJVJTas1ISd erkU4dlN5gYiQ2bWuFrwfJx/Il33RcoR9edAxHcFs07VC1mViPaNitzzp2wQJT+lczrx /NcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=S512LTgy5xGLeOLFRV+SrFz9c3b/WhxCle94KC/wZ9M=; b=CEwAbkWphhODffGdqIM/RC4fGPEEjJQ35cev2Ydmsy4ZbizE8i4+mytKSXB8RHXkQe kHCgXytuE/bK4eyTFpWdzYvePxT0FUyViK+FhwWYdy/J+6vTN5q2sKJg6QiVRWhp1vk7 Z99rdOoWH4tFvANCBuAeZbArYDhNfeWua2HdBqe+ehFC3vCnq53aDINk3CLwqYbzvIrj UhDc+HBqzSS0pfmDKArVNhaVcyn+aVDcx7u+alwSNI7P3bzhyxmXDmg5mGWoTxYgTOn3 g/b0KnKwayzSMPGTqT8goERDKV/e3EA8EoYrvDCCixKoAy+QSLtgd4kb2ky2VhkNZy3z ASCg== X-Gm-Message-State: AOAM5305xHbktQiH8F9L1Y2mb5vF9o4B+3eEg57OtE+SlycHFrLXhyOF dxbIjiWKlFNdCQ7w+TfToLE= X-Google-Smtp-Source: ABdhPJxVkfVuIzDzDBAJIfoFjlAkmKty9ooWUCchPb4tj0faiEqkdBUfiMzezneTcRnr/ostfnhpow== X-Received: by 2002:aa7:cd9a:: with SMTP id x26mr11362174edv.159.1639521874438; Tue, 14 Dec 2021 14:44:34 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:34 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 14/16] net: dsa: qca8k: add support for phy read/write with mdio Ethernet Date: Tue, 14 Dec 2021 23:44:07 +0100 Message-Id: <20211214224409.5770-15-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Use mdio Ethernet also for phy read/write if availabale. Use a different seq number to make sure we receive the correct packet. On any error, we fallback to the legacy mdio read/write. Signed-off-by: Ansuel Smith --- drivers/net/dsa/qca8k.c | 177 ++++++++++++++++++++++++++++++++++++++++ drivers/net/dsa/qca8k.h | 1 + 2 files changed, 178 insertions(+) diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c index 15f265c6ef02..b08db31933e0 100644 --- a/drivers/net/dsa/qca8k.c +++ b/drivers/net/dsa/qca8k.c @@ -832,6 +832,152 @@ qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) regmap_clear_bits(priv->regmap, QCA8K_REG_PORT_STATUS(port), mask); } +static int +qca8k_mdio_eth_busy_wait(struct qca8k_mdio_hdr_data *phy_hdr_data, + struct sk_buff *read_skb, u32 *val) +{ + struct sk_buff *skb = skb_copy(read_skb, GFP_KERNEL); + bool ack; + int ret; + + reinit_completion(&phy_hdr_data->rw_done); + phy_hdr_data->seq = 400; + phy_hdr_data->ack = false; + + dev_queue_xmit(skb); + + ret = wait_for_completion_timeout(&phy_hdr_data->rw_done, + QCA8K_ETHERNET_TIMEOUT); + + ack = phy_hdr_data->ack; + + if (ret <= 0) + return -ETIMEDOUT; + + if (!ack) + return -EINVAL; + + *val = phy_hdr_data->data[0]; + + return 0; +} + +static int +qca8k_mdio_eth_command(struct qca8k_priv *priv, bool read, int phy, + int regnum, u16 data) +{ + struct sk_buff *write_skb, *clear_skb, *read_skb; + const struct net_device *dev = priv->master; + struct qca8k_mdio_hdr_data *phy_hdr_data; + u32 write_val, clear_val = 0, val; + int seq_num = 400; + int ret, ret1; + bool ack; + + if (regnum >= QCA8K_MDIO_MASTER_MAX_REG) + return -EINVAL; + + phy_hdr_data = &priv->mdio_hdr_data; + + write_val = QCA8K_MDIO_MASTER_BUSY | QCA8K_MDIO_MASTER_EN | + QCA8K_MDIO_MASTER_PHY_ADDR(phy) | + QCA8K_MDIO_MASTER_REG_ADDR(regnum); + + if (read) { + write_val |= QCA8K_MDIO_MASTER_READ; + } else { + write_val |= QCA8K_MDIO_MASTER_WRITE; + write_val |= QCA8K_MDIO_MASTER_DATA(data); + } + + /* Prealloc all the needed skb before the lock */ + write_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, + &write_val, seq_num, QCA8K_ETHERNET_PHY_PRIORITY); + write_skb->dev = (struct net_device *)dev; + clear_skb = qca8k_alloc_mdio_header(MDIO_WRITE, QCA8K_MDIO_MASTER_CTRL, + &clear_val, seq_num, QCA8K_ETHERNET_PHY_PRIORITY); + clear_skb->dev = (struct net_device *)dev; + read_skb = qca8k_alloc_mdio_header(MDIO_READ, QCA8K_MDIO_MASTER_CTRL, + &clear_val, seq_num, QCA8K_ETHERNET_PHY_PRIORITY); + read_skb->dev = (struct net_device *)dev; + + /* Actually start the request: + * 1. Send mdio master packet + * 2. Busy Wait for mdio master command + * 3. Get the data if we are reading + * 4. Reset the mdio master (even with error) + */ + mutex_lock(&phy_hdr_data->mutex); + + reinit_completion(&phy_hdr_data->rw_done); + phy_hdr_data->ack = false; + phy_hdr_data->seq = seq_num; + + dev_queue_xmit(write_skb); + + ret = wait_for_completion_timeout(&phy_hdr_data->rw_done, + QCA8K_ETHERNET_TIMEOUT); + + ack = phy_hdr_data->ack; + + if (ret <= 0) { + ret = -ETIMEDOUT; + goto exit; + } + + if (!ack) { + ret = -EINVAL; + goto exit; + } + + ret = read_poll_timeout(qca8k_mdio_eth_busy_wait, ret1, + !(val & QCA8K_MDIO_MASTER_BUSY), 0, + QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC, false, + phy_hdr_data, read_skb, &val); + + if (ret < 0 && ret1 < 0) { + ret = ret1; + goto exit; + } + + if (read) { + reinit_completion(&phy_hdr_data->rw_done); + phy_hdr_data->ack = false; + + dev_queue_xmit(read_skb); + + ret = wait_for_completion_timeout(&phy_hdr_data->rw_done, + QCA8K_ETHERNET_TIMEOUT); + + ack = phy_hdr_data->ack; + + if (ret <= 0) { + ret = -ETIMEDOUT; + goto exit; + } + + if (!ack) { + ret = -EINVAL; + goto exit; + } + + ret = phy_hdr_data->data[0] & QCA8K_MDIO_MASTER_DATA_MASK; + } + +exit: + reinit_completion(&phy_hdr_data->rw_done); + phy_hdr_data->ack = false; + + dev_queue_xmit(clear_skb); + + wait_for_completion_timeout(&phy_hdr_data->rw_done, + QCA8K_ETHERNET_TIMEOUT); + + mutex_unlock(&phy_hdr_data->mutex); + + return ret; +} + static u32 qca8k_port_to_phy(int port) { @@ -954,6 +1100,14 @@ qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 da { struct qca8k_priv *priv = slave_bus->priv; struct mii_bus *bus = priv->bus; + int ret; + + /* Use mdio Ethernet when available, fallback to legacy one on error */ + if (priv->master) { + ret = qca8k_mdio_eth_command(priv, false, phy, regnum, data); + if (!ret) + return 0; + } return qca8k_mdio_write(bus, phy, regnum, data); } @@ -963,6 +1117,14 @@ qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) { struct qca8k_priv *priv = slave_bus->priv; struct mii_bus *bus = priv->bus; + int ret; + + /* Use mdio Ethernet when available, fallback to legacy one on error */ + if (priv->master) { + ret = qca8k_mdio_eth_command(priv, true, phy, regnum, 0); + if (ret >= 0) + return ret; + } return qca8k_mdio_read(bus, phy, regnum); } @@ -971,6 +1133,7 @@ static int qca8k_phy_write(struct dsa_switch *ds, int port, int regnum, u16 data) { struct qca8k_priv *priv = ds->priv; + int ret; /* Check if the legacy mapping should be used and the * port is not correctly mapped to the right PHY in the @@ -979,6 +1142,13 @@ qca8k_phy_write(struct dsa_switch *ds, int port, int regnum, u16 data) if (priv->legacy_phy_port_mapping) port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; + /* Use mdio Ethernet when available, fallback to legacy one on error */ + if (priv->master) { + ret = qca8k_mdio_eth_command(priv, true, port, regnum, 0); + if (!ret) + return ret; + } + return qca8k_mdio_write(priv->bus, port, regnum, data); } @@ -995,6 +1165,13 @@ qca8k_phy_read(struct dsa_switch *ds, int port, int regnum) if (priv->legacy_phy_port_mapping) port = qca8k_port_to_phy(port) % PHY_MAX_ADDR; + /* Use mdio Ethernet when available, fallback to legacy one on error */ + if (priv->master) { + ret = qca8k_mdio_eth_command(priv, true, port, regnum, 0); + if (ret >= 0) + return ret; + } + ret = qca8k_mdio_read(priv->bus, port, regnum); if (ret < 0) diff --git a/drivers/net/dsa/qca8k.h b/drivers/net/dsa/qca8k.h index 4aca07db0192..203220efa5c0 100644 --- a/drivers/net/dsa/qca8k.h +++ b/drivers/net/dsa/qca8k.h @@ -14,6 +14,7 @@ #include #define QCA8K_ETHERNET_MDIO_PRIORITY 7 +#define QCA8K_ETHERNET_PHY_PRIORITY 6 #define QCA8K_ETHERNET_TIMEOUT 100 #define QCA8K_NUM_PORTS 7 From patchwork Tue Dec 14 22:44:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676845 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5723CC433FE for ; Tue, 14 Dec 2021 22:45:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235085AbhLNWpA (ORCPT ); Tue, 14 Dec 2021 17:45:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34500 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235009AbhLNWoh (ORCPT ); Tue, 14 Dec 2021 17:44:37 -0500 Received: from mail-ed1-x531.google.com (mail-ed1-x531.google.com [IPv6:2a00:1450:4864:20::531]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D9437C061751; Tue, 14 Dec 2021 14:44:36 -0800 (PST) Received: by mail-ed1-x531.google.com with SMTP id g14so67338218edb.8; Tue, 14 Dec 2021 14:44:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=oUw4mW/BxKaZqTAv0lZ2+BSrZvP2t5Caxi/8uYqZfRI=; b=d9KpLcwM4RMVElbCgMccUhDxI5+B/tHyNsPf+5BbIFn4AZxO3RQc4Jo0qbHsQWKdW1 2URhDGJkQKWBVkbfaHbbj+c6mwahnAZPgjZkhEnBurrg8UG5YYT4x/yPvwGdrWLaeKC6 FraHXrJoUfvu53MjbcqJ7d6zfHb43HLXngUPNEaS63Hx/bBisDU9zzFEYnD1TorXGlz+ D8cKWDpMWAqj513LHFnxW5avcBAupcFPqxSOGThqMsjgdngwyzRt+3/CtbBO4p0sYhbO uRU18772dm1DgV6SMWTGNFEjgIOobryoMoRAwjIl2Ub1Ano1f9ratR6OeOf/rGuxd4FY qKGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=oUw4mW/BxKaZqTAv0lZ2+BSrZvP2t5Caxi/8uYqZfRI=; b=BTcYAgV6Bv8rLSL6X+fwV23VGGF804TSolZyuJLxIu13j1vkC0Pqc8JaRgtQqEQZbm YT7wruyA2yQdX3V61ml81HT75+64O+e5G/8VmLBN6kNPMHggpocQX9wt2BapXYVZgyFc xuzUBiaRIhIbGg3UpD4GcpNlTAGBCa1ZDOyTFOU0xlJRKKzM8HxdEs+CN2I/hpSmRiPY ZwwQtXhgV6SdbMqi6SU2GBatyaPuESNdvyGOG125ar7P7CmX3T9KFboX2EQd9CFYL/Xm zQuhpV5i1kGF0SQqTON9p3j7xKk/EZ0uI0dOZ9TxVqJk4jvBdfIOOjXp/sQaCp56HjiG efGg== X-Gm-Message-State: AOAM530Y9D/w2C17DgXHqboa4LDGYLfJtz2oKmy5p3Vp3lb8QqN6eBP7 mHZTRIOOfVTw6lJRkYbS0Qo= X-Google-Smtp-Source: ABdhPJzbQ2tnLcbxNkZ4T7qWMo5WVd8I1CYABQO8J93JGaL735/IxHGGVfPQZavUogqSl+3zdTWMVQ== X-Received: by 2002:a17:906:3bd7:: with SMTP id v23mr65441ejf.395.1639521875316; Tue, 14 Dec 2021 14:44:35 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:35 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 15/16] net: dsa: qca8k: move page cache to driver priv Date: Tue, 14 Dec 2021 23:44:08 +0100 Message-Id: <20211214224409.5770-16-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC There can be multiple qca8k switch on the same system. Move the static qca8k_current_page to qca8k_priv and make it specific for each switch. Signed-off-by: Ansuel Smith --- drivers/net/dsa/qca8k.c | 47 +++++++++++++++++++++++------------------ drivers/net/dsa/qca8k.h | 9 ++++++++ 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c index b08db31933e0..4254cb12c7f7 100644 --- a/drivers/net/dsa/qca8k.c +++ b/drivers/net/dsa/qca8k.c @@ -75,12 +75,6 @@ static const struct qca8k_mib_desc ar8327_mib[] = { MIB_DESC(1, 0xac, "TXUnicast"), }; -/* The 32bit switch registers are accessed indirectly. To achieve this we need - * to set the page of the register. Track the last page that was set to reduce - * mdio writes - */ -static u16 qca8k_current_page = 0xffff; - static void qca8k_split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) { @@ -134,11 +128,11 @@ qca8k_mii_write32(struct mii_bus *bus, int phy_id, u32 regnum, u32 val) } static int -qca8k_set_page(struct mii_bus *bus, u16 page) +qca8k_set_page(struct mii_bus *bus, u16 page, u16 *cached_page) { int ret; - if (page == qca8k_current_page) + if (page == *cached_page) return 0; ret = bus->write(bus, 0x18, 0, page); @@ -148,7 +142,7 @@ qca8k_set_page(struct mii_bus *bus, u16 page) return ret; } - qca8k_current_page = page; + *cached_page = page; usleep_range(1000, 2000); return 0; } @@ -327,6 +321,7 @@ static int qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) { struct qca8k_priv *priv = (struct qca8k_priv *)ctx; + struct qca8k_mdio_cache *mdio_cache; struct mii_bus *bus = priv->bus; u16 r1, r2, page; int ret; @@ -334,11 +329,13 @@ qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val) if (priv->master && !qca8k_read_eth(priv, reg, val)) return 0; + mdio_cache = &priv->mdio_cache; + qca8k_split_addr(reg, &r1, &r2, &page); mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - ret = qca8k_set_page(bus, page); + ret = qca8k_set_page(bus, page, &mdio_cache->page); if (ret < 0) goto exit; @@ -353,6 +350,7 @@ static int qca8k_regmap_write(void *ctx, uint32_t reg, uint32_t val) { struct qca8k_priv *priv = (struct qca8k_priv *)ctx; + struct qca8k_mdio_cache *mdio_cache; struct mii_bus *bus = priv->bus; u16 r1, r2, page; int ret; @@ -360,11 +358,13 @@ qca8k_regmap_write(void *ctx, uint32_t reg, uint32_t val) if (priv->master && !qca8k_write_eth(priv, reg, val)) return 0; + mdio_cache = &priv->mdio_cache; + qca8k_split_addr(reg, &r1, &r2, &page); mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - ret = qca8k_set_page(bus, page); + ret = qca8k_set_page(bus, page, &mdio_cache->page); if (ret < 0) goto exit; @@ -379,6 +379,7 @@ static int qca8k_regmap_update_bits(void *ctx, uint32_t reg, uint32_t mask, uint32_t write_val) { struct qca8k_priv *priv = (struct qca8k_priv *)ctx; + struct qca8k_mdio_cache *mdio_cache; struct mii_bus *bus = priv->bus; u16 r1, r2, page; u32 val; @@ -388,11 +389,13 @@ qca8k_regmap_update_bits(void *ctx, uint32_t reg, uint32_t mask, uint32_t write_ !qca8k_regmap_update_bits_eth(priv, reg, mask, write_val)) return 0; + mdio_cache = &priv->mdio_cache; + qca8k_split_addr(reg, &r1, &r2, &page); mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - ret = qca8k_set_page(bus, page); + ret = qca8k_set_page(bus, page, &mdio_cache->page); if (ret < 0) goto exit; @@ -1016,7 +1019,8 @@ qca8k_mdio_busy_wait(struct mii_bus *bus, u32 reg, u32 mask) } static int -qca8k_mdio_write(struct mii_bus *bus, int phy, int regnum, u16 data) +qca8k_mdio_write(struct mii_bus *bus, struct qca8k_mdio_cache *cache, + int phy, int regnum, u16 data) { u16 r1, r2, page; u32 val; @@ -1034,7 +1038,7 @@ qca8k_mdio_write(struct mii_bus *bus, int phy, int regnum, u16 data) mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - ret = qca8k_set_page(bus, page); + ret = qca8k_set_page(bus, page, &cache->page); if (ret) goto exit; @@ -1053,7 +1057,8 @@ qca8k_mdio_write(struct mii_bus *bus, int phy, int regnum, u16 data) } static int -qca8k_mdio_read(struct mii_bus *bus, int phy, int regnum) +qca8k_mdio_read(struct mii_bus *bus, struct qca8k_mdio_cache *cache, + int phy, int regnum) { u16 r1, r2, page; u32 val; @@ -1070,7 +1075,7 @@ qca8k_mdio_read(struct mii_bus *bus, int phy, int regnum) mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); - ret = qca8k_set_page(bus, page); + ret = qca8k_set_page(bus, page, &cache->page); if (ret) goto exit; @@ -1109,7 +1114,7 @@ qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 da return 0; } - return qca8k_mdio_write(bus, phy, regnum, data); + return qca8k_mdio_write(bus, &priv->mdio_cache, phy, regnum, data); } static int @@ -1126,7 +1131,7 @@ qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) return ret; } - return qca8k_mdio_read(bus, phy, regnum); + return qca8k_mdio_read(bus, &priv->mdio_cache, phy, regnum); } static int @@ -1149,7 +1154,7 @@ qca8k_phy_write(struct dsa_switch *ds, int port, int regnum, u16 data) return ret; } - return qca8k_mdio_write(priv->bus, port, regnum, data); + return qca8k_mdio_write(priv->bus, &priv->mdio_cache, port, regnum, data); } static int @@ -1172,7 +1177,7 @@ qca8k_phy_read(struct dsa_switch *ds, int port, int regnum) return ret; } - ret = qca8k_mdio_read(priv->bus, port, regnum); + ret = qca8k_mdio_read(priv->bus, &priv->mdio_cache, port, regnum); if (ret < 0) return 0xffff; @@ -2979,6 +2984,8 @@ qca8k_sw_probe(struct mdio_device *mdiodev) return PTR_ERR(priv->regmap); } + priv->mdio_cache.page = 0xffff; + /* Check the detected switch id */ ret = qca8k_read_switch_id(priv); if (ret) diff --git a/drivers/net/dsa/qca8k.h b/drivers/net/dsa/qca8k.h index 203220efa5c0..c4800ee06c34 100644 --- a/drivers/net/dsa/qca8k.h +++ b/drivers/net/dsa/qca8k.h @@ -363,6 +363,14 @@ struct qca8k_ports_config { u8 rgmii_tx_delay[QCA8K_NUM_CPU_PORTS]; /* 0: CPU port0, 1: CPU port6 */ }; +struct qca8k_mdio_cache { +/* The 32bit switch registers are accessed indirectly. To achieve this we need + * to set the page of the register. Track the last page that was set to reduce + * mdio writes + */ + u16 page; +}; + struct qca8k_priv { u8 switch_id; u8 switch_revision; @@ -383,6 +391,7 @@ struct qca8k_priv { const struct net_device *master; /* Track if mdio/mib Ethernet is available */ struct qca8k_mdio_hdr_data mdio_hdr_data; struct qca8k_mib_hdr_data mib_hdr_data; + struct qca8k_mdio_cache mdio_cache; }; struct qca8k_mib_desc { From patchwork Tue Dec 14 22:44:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Marangi X-Patchwork-Id: 12676843 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3D0A8C433EF for ; Tue, 14 Dec 2021 22:45:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235084AbhLNWo7 (ORCPT ); Tue, 14 Dec 2021 17:44:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34466 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235053AbhLNWoi (ORCPT ); Tue, 14 Dec 2021 17:44:38 -0500 Received: from mail-ed1-x529.google.com (mail-ed1-x529.google.com [IPv6:2a00:1450:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D8ADEC06175C; Tue, 14 Dec 2021 14:44:37 -0800 (PST) Received: by mail-ed1-x529.google.com with SMTP id r11so67453559edd.9; Tue, 14 Dec 2021 14:44:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GZlXwUXdxSgcWUi7ykyPehodBfkBH2pJGAGjNTWEjdg=; b=bTFN1jFLeBurgpyHeCfkxWEo2rC1L/P7CVzXbj+6o9wyTWg/rbZbGF9y3ffa3nDefo UeHmdUHFKe1iRCeeNPnSiyEuLOX92NrJyRCwWXGkc5F4VMh1HZQy9r/+iHbneJ4HqDxW G5brrDnGX1Juku29ybOwlc7eO4RrkdOyvtjajKA+FhC8Wp//a0YeQHa+78xrXWJHLFmA 6biwTT7rd0hXuQeyjzAlDVlitH0/5j8EqPhVHgJaOu+vuof1lMnllWxxIsOueJ013Gzm DC2czsHrb48au+J9Qo05gj0O3x231SWiTvmNq0Xc370ra62A8thfJbUk76nSFm0xu2L1 ucLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GZlXwUXdxSgcWUi7ykyPehodBfkBH2pJGAGjNTWEjdg=; b=fJmeZEbFdvDdq5tl34T6mVN3kRUgo18VBOrE/ETl11NxkOmNbVu8xbMeSxudC2/1Ub 5nSc3mXB/UHGUGk19XgiUTQJrk1HLVxcaNKBoNxt219pKUxcxvk2CrekWmhcoaccnOfY xKu+Ilp7ih0NBi2JXans3rCLv0CwFosIiz71Thke78J9+/5w41j9VFYcpCKT9ZGT4pb/ yKtkckjBywDVYLxkh6LAYoNpVQ/7ftg53Oua7Up+uElzrWf37+KLKA40wi5p4o7dkjQx 2ND5fWxA1b9RJRPl7r313Xj0EyEyCkYMYeSspQrvytGL+yeqeOF2q8aJn4BS4mc1MdgZ gh3g== X-Gm-Message-State: AOAM533aYSEKNHR0yYefB33zgW+BGGTwfXMCcG78iou92j9xjRs0XtVg XTp7c+/5t7kVTZRbN5gnS2Y= X-Google-Smtp-Source: ABdhPJyM8efrVBbJNIljCDJ+iagoAARPDn4YNMQ6ooEMpyDYYn02MhZBXvN1FQuqFoiOKNEVot6/Mg== X-Received: by 2002:a17:907:86a1:: with SMTP id qa33mr8626997ejc.142.1639521876196; Tue, 14 Dec 2021 14:44:36 -0800 (PST) Received: from localhost.localdomain (93-42-71-246.ip85.fastwebnet.it. [93.42.71.246]) by smtp.googlemail.com with ESMTPSA id b19sm39008ejl.152.2021.12.14.14.44.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Dec 2021 14:44:35 -0800 (PST) From: Ansuel Smith To: Andrew Lunn , Vivien Didelot , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Ansuel Smith Subject: [net-next PATCH RFC v6 16/16] net: dsa: qca8k: cache lo and hi for mdio write Date: Tue, 14 Dec 2021 23:44:09 +0100 Message-Id: <20211214224409.5770-17-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211214224409.5770-1-ansuelsmth@gmail.com> References: <20211214224409.5770-1-ansuelsmth@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC From Documentation, we can cache lo and hi the same way we do with the page. This massively reduce the mdio write as 3/4 of the time as we only require to write the lo or hi part for a mdio write. Signed-off-by: Ansuel Smith --- drivers/net/dsa/qca8k.c | 60 ++++++++++++++++++++++++++++++++--------- drivers/net/dsa/qca8k.h | 5 ++++ 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c index 4254cb12c7f7..cc8fac188389 100644 --- a/drivers/net/dsa/qca8k.c +++ b/drivers/net/dsa/qca8k.c @@ -88,6 +88,42 @@ qca8k_split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) *page = regaddr & 0x3ff; } +static int +qca8k_set_lo(struct mii_bus *bus, int phy_id, u32 regnum, + u16 lo, u16 *cached_lo) +{ + int ret; + + if (lo == *cached_lo) + return 0; + + ret = bus->write(bus, phy_id, regnum, lo); + if (ret < 0) + dev_err_ratelimited(&bus->dev, + "failed to write qca8k 32bit lo register\n"); + + *cached_lo = lo; + return 0; +} + +static int +qca8k_set_hi(struct mii_bus *bus, int phy_id, u32 regnum, + u16 hi, u16 *cached_hi) +{ + int ret; + + if (hi == *cached_hi) + return 0; + + ret = bus->write(bus, phy_id, regnum, hi); + if (ret < 0) + dev_err_ratelimited(&bus->dev, + "failed to write qca8k 32bit hi register\n"); + + *cached_hi = hi; + return 0; +} + static int qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) { @@ -111,7 +147,8 @@ qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val) } static void -qca8k_mii_write32(struct mii_bus *bus, int phy_id, u32 regnum, u32 val) +qca8k_mii_write32(struct mii_bus *bus, struct qca8k_mdio_cache *cache, + int phy_id, u32 regnum, u32 val) { u16 lo, hi; int ret; @@ -119,12 +156,9 @@ qca8k_mii_write32(struct mii_bus *bus, int phy_id, u32 regnum, u32 val) lo = val & 0xffff; hi = (u16)(val >> 16); - ret = bus->write(bus, phy_id, regnum, lo); + ret = qca8k_set_lo(bus, phy_id, regnum, lo, &cache->lo); if (ret >= 0) - ret = bus->write(bus, phy_id, regnum + 1, hi); - if (ret < 0) - dev_err_ratelimited(&bus->dev, - "failed to write qca8k 32bit register\n"); + ret = qca8k_set_hi(bus, phy_id, regnum + 1, hi, &cache->hi); } static int @@ -368,7 +402,7 @@ qca8k_regmap_write(void *ctx, uint32_t reg, uint32_t val) if (ret < 0) goto exit; - qca8k_mii_write32(bus, 0x10 | r2, r1, val); + qca8k_mii_write32(bus, mdio_cache, 0x10 | r2, r1, val); exit: mutex_unlock(&bus->mdio_lock); @@ -405,7 +439,7 @@ qca8k_regmap_update_bits(void *ctx, uint32_t reg, uint32_t mask, uint32_t write_ val &= ~mask; val |= write_val; - qca8k_mii_write32(bus, 0x10 | r2, r1, val); + qca8k_mii_write32(bus, mdio_cache, 0x10 | r2, r1, val); exit: mutex_unlock(&bus->mdio_lock); @@ -1042,14 +1076,14 @@ qca8k_mdio_write(struct mii_bus *bus, struct qca8k_mdio_cache *cache, if (ret) goto exit; - qca8k_mii_write32(bus, 0x10 | r2, r1, val); + qca8k_mii_write32(bus, cache, 0x10 | r2, r1, val); ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, QCA8K_MDIO_MASTER_BUSY); exit: /* even if the busy_wait timeouts try to clear the MASTER_EN */ - qca8k_mii_write32(bus, 0x10 | r2, r1, 0); + qca8k_mii_write32(bus, cache, 0x10 | r2, r1, 0); mutex_unlock(&bus->mdio_lock); @@ -1079,7 +1113,7 @@ qca8k_mdio_read(struct mii_bus *bus, struct qca8k_mdio_cache *cache, if (ret) goto exit; - qca8k_mii_write32(bus, 0x10 | r2, r1, val); + qca8k_mii_write32(bus, cache, 0x10 | r2, r1, val); ret = qca8k_mdio_busy_wait(bus, QCA8K_MDIO_MASTER_CTRL, QCA8K_MDIO_MASTER_BUSY); @@ -1090,7 +1124,7 @@ qca8k_mdio_read(struct mii_bus *bus, struct qca8k_mdio_cache *cache, exit: /* even if the busy_wait timeouts try to clear the MASTER_EN */ - qca8k_mii_write32(bus, 0x10 | r2, r1, 0); + qca8k_mii_write32(bus, cache, 0x10 | r2, r1, 0); mutex_unlock(&bus->mdio_lock); @@ -2985,6 +3019,8 @@ qca8k_sw_probe(struct mdio_device *mdiodev) } priv->mdio_cache.page = 0xffff; + priv->mdio_cache.lo = 0xffff; + priv->mdio_cache.hi = 0xffff; /* Check the detected switch id */ ret = qca8k_read_switch_id(priv); diff --git a/drivers/net/dsa/qca8k.h b/drivers/net/dsa/qca8k.h index c4800ee06c34..79cd35f48730 100644 --- a/drivers/net/dsa/qca8k.h +++ b/drivers/net/dsa/qca8k.h @@ -369,6 +369,11 @@ struct qca8k_mdio_cache { * mdio writes */ u16 page; +/* lo and hi can also be cached and from Documentation we can skip one + * extra mdio write if lo or hi is didn't change. + */ + u16 lo; + u16 hi; }; struct qca8k_priv {